OSDN Git Service

2009-12-04 David Daney <ddaney@caviumnetworks.com>
[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
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 "real.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);
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 = TREE_CHAIN (arg))
1345     {
1346       rtx 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 possible.  Only
1379          do this when:
1380          (a) a mode promotion has occurred;
1381          (b) the mode of the register is the same as the mode of
1382              the argument as it is passed; and
1383          (c) the signedness does not change across any of the promotions; and
1384          (d) when no language-level promotions (which we cannot guarantee
1385              will have been done by an external caller) are necessary,
1386              unless we know that this function is only ever called from
1387              the current compilation unit -- all of whose call sites will
1388              do the mode1 --> mode2 promotion.  */
1389       if (mode1 != mode3
1390           && mode3 == mode4
1391           && uns1 == uns3
1392           && (mode1 == mode2 || strictly_local))
1393         {
1394           /* Record that the value was promoted from mode1 to mode3,
1395              so that any sign extension at the head of the current
1396              function may be eliminated.  */
1397           rtx x;
1398           x = gen_rtx_CLOBBER (mode1, const0_rtx);
1399           x = gen_rtx_fmt_e ((uns3 ? ZERO_EXTEND : SIGN_EXTEND), mode3, x);
1400           record_value_for_reg (reg, first, x);
1401         }
1402     }
1403 }
1404
1405 /* Called via note_stores.  If X is a pseudo that is narrower than
1406    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
1407
1408    If we are setting only a portion of X and we can't figure out what
1409    portion, assume all bits will be used since we don't know what will
1410    be happening.
1411
1412    Similarly, set how many bits of X are known to be copies of the sign bit
1413    at all locations in the function.  This is the smallest number implied
1414    by any set of X.  */
1415
1416 static void
1417 set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
1418 {
1419   rtx insn = (rtx) data;
1420   unsigned int num;
1421
1422   if (REG_P (x)
1423       && REGNO (x) >= FIRST_PSEUDO_REGISTER
1424       /* If this register is undefined at the start of the file, we can't
1425          say what its contents were.  */
1426       && ! REGNO_REG_SET_P
1427            (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x))
1428       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
1429     {
1430       reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
1431
1432       if (set == 0 || GET_CODE (set) == CLOBBER)
1433         {
1434           rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1435           rsp->sign_bit_copies = 1;
1436           return;
1437         }
1438
1439       /* If this register is being initialized using itself, and the
1440          register is uninitialized in this basic block, and there are
1441          no LOG_LINKS which set the register, then part of the
1442          register is uninitialized.  In that case we can't assume
1443          anything about the number of nonzero bits.
1444
1445          ??? We could do better if we checked this in
1446          reg_{nonzero_bits,num_sign_bit_copies}_for_combine.  Then we
1447          could avoid making assumptions about the insn which initially
1448          sets the register, while still using the information in other
1449          insns.  We would have to be careful to check every insn
1450          involved in the combination.  */
1451
1452       if (insn
1453           && reg_referenced_p (x, PATTERN (insn))
1454           && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)),
1455                                REGNO (x)))
1456         {
1457           rtx link;
1458
1459           for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
1460             {
1461               if (dead_or_set_p (XEXP (link, 0), x))
1462                 break;
1463             }
1464           if (!link)
1465             {
1466               rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1467               rsp->sign_bit_copies = 1;
1468               return;
1469             }
1470         }
1471
1472       /* If this is a complex assignment, see if we can convert it into a
1473          simple assignment.  */
1474       set = expand_field_assignment (set);
1475
1476       /* If this is a simple assignment, or we have a paradoxical SUBREG,
1477          set what we know about X.  */
1478
1479       if (SET_DEST (set) == x
1480           || (GET_CODE (SET_DEST (set)) == SUBREG
1481               && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
1482                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
1483               && SUBREG_REG (SET_DEST (set)) == x))
1484         {
1485           rtx src = SET_SRC (set);
1486
1487 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
1488           /* If X is narrower than a word and SRC is a non-negative
1489              constant that would appear negative in the mode of X,
1490              sign-extend it for use in reg_stat[].nonzero_bits because some
1491              machines (maybe most) will actually do the sign-extension
1492              and this is the conservative approach.
1493
1494              ??? For 2.5, try to tighten up the MD files in this regard
1495              instead of this kludge.  */
1496
1497           if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
1498               && CONST_INT_P (src)
1499               && INTVAL (src) > 0
1500               && 0 != (INTVAL (src)
1501                        & ((HOST_WIDE_INT) 1
1502                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
1503             src = GEN_INT (INTVAL (src)
1504                            | ((HOST_WIDE_INT) (-1)
1505                               << GET_MODE_BITSIZE (GET_MODE (x))));
1506 #endif
1507
1508           /* Don't call nonzero_bits if it cannot change anything.  */
1509           if (rsp->nonzero_bits != ~(unsigned HOST_WIDE_INT) 0)
1510             rsp->nonzero_bits |= nonzero_bits (src, nonzero_bits_mode);
1511           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1512           if (rsp->sign_bit_copies == 0
1513               || rsp->sign_bit_copies > num)
1514             rsp->sign_bit_copies = num;
1515         }
1516       else
1517         {
1518           rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1519           rsp->sign_bit_copies = 1;
1520         }
1521     }
1522 }
1523 \f
1524 /* See if INSN can be combined into I3.  PRED and SUCC are optionally
1525    insns that were previously combined into I3 or that will be combined
1526    into the merger of INSN and I3.
1527
1528    Return 0 if the combination is not allowed for any reason.
1529
1530    If the combination is allowed, *PDEST will be set to the single
1531    destination of INSN and *PSRC to the single source, and this function
1532    will return 1.  */
1533
1534 static int
1535 can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
1536                rtx *pdest, rtx *psrc)
1537 {
1538   int i;
1539   const_rtx set = 0;
1540   rtx src, dest;
1541   rtx p;
1542 #ifdef AUTO_INC_DEC
1543   rtx link;
1544 #endif
1545   int all_adjacent = (succ ? (next_active_insn (insn) == succ
1546                               && next_active_insn (succ) == i3)
1547                       : next_active_insn (insn) == i3);
1548
1549   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1550      or a PARALLEL consisting of such a SET and CLOBBERs.
1551
1552      If INSN has CLOBBER parallel parts, ignore them for our processing.
1553      By definition, these happen during the execution of the insn.  When it
1554      is merged with another insn, all bets are off.  If they are, in fact,
1555      needed and aren't also supplied in I3, they may be added by
1556      recog_for_combine.  Otherwise, it won't match.
1557
1558      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1559      note.
1560
1561      Get the source and destination of INSN.  If more than one, can't
1562      combine.  */
1563
1564   if (GET_CODE (PATTERN (insn)) == SET)
1565     set = PATTERN (insn);
1566   else if (GET_CODE (PATTERN (insn)) == PARALLEL
1567            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1568     {
1569       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1570         {
1571           rtx elt = XVECEXP (PATTERN (insn), 0, i);
1572
1573           switch (GET_CODE (elt))
1574             {
1575             /* This is important to combine floating point insns
1576                for the SH4 port.  */
1577             case USE:
1578               /* Combining an isolated USE doesn't make sense.
1579                  We depend here on combinable_i3pat to reject them.  */
1580               /* The code below this loop only verifies that the inputs of
1581                  the SET in INSN do not change.  We call reg_set_between_p
1582                  to verify that the REG in the USE does not change between
1583                  I3 and INSN.
1584                  If the USE in INSN was for a pseudo register, the matching
1585                  insn pattern will likely match any register; combining this
1586                  with any other USE would only be safe if we knew that the
1587                  used registers have identical values, or if there was
1588                  something to tell them apart, e.g. different modes.  For
1589                  now, we forgo such complicated tests and simply disallow
1590                  combining of USES of pseudo registers with any other USE.  */
1591               if (REG_P (XEXP (elt, 0))
1592                   && GET_CODE (PATTERN (i3)) == PARALLEL)
1593                 {
1594                   rtx i3pat = PATTERN (i3);
1595                   int i = XVECLEN (i3pat, 0) - 1;
1596                   unsigned int regno = REGNO (XEXP (elt, 0));
1597
1598                   do
1599                     {
1600                       rtx i3elt = XVECEXP (i3pat, 0, i);
1601
1602                       if (GET_CODE (i3elt) == USE
1603                           && REG_P (XEXP (i3elt, 0))
1604                           && (REGNO (XEXP (i3elt, 0)) == regno
1605                               ? reg_set_between_p (XEXP (elt, 0),
1606                                                    PREV_INSN (insn), i3)
1607                               : regno >= FIRST_PSEUDO_REGISTER))
1608                         return 0;
1609                     }
1610                   while (--i >= 0);
1611                 }
1612               break;
1613
1614               /* We can ignore CLOBBERs.  */
1615             case CLOBBER:
1616               break;
1617
1618             case SET:
1619               /* Ignore SETs whose result isn't used but not those that
1620                  have side-effects.  */
1621               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1622                   && insn_nothrow_p (insn)
1623                   && !side_effects_p (elt))
1624                 break;
1625
1626               /* If we have already found a SET, this is a second one and
1627                  so we cannot combine with this insn.  */
1628               if (set)
1629                 return 0;
1630
1631               set = elt;
1632               break;
1633
1634             default:
1635               /* Anything else means we can't combine.  */
1636               return 0;
1637             }
1638         }
1639
1640       if (set == 0
1641           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1642              so don't do anything with it.  */
1643           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1644         return 0;
1645     }
1646   else
1647     return 0;
1648
1649   if (set == 0)
1650     return 0;
1651
1652   set = expand_field_assignment (set);
1653   src = SET_SRC (set), dest = SET_DEST (set);
1654
1655   /* Don't eliminate a store in the stack pointer.  */
1656   if (dest == stack_pointer_rtx
1657       /* Don't combine with an insn that sets a register to itself if it has
1658          a REG_EQUAL note.  This may be part of a LIBCALL sequence.  */
1659       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1660       /* Can't merge an ASM_OPERANDS.  */
1661       || GET_CODE (src) == ASM_OPERANDS
1662       /* Can't merge a function call.  */
1663       || GET_CODE (src) == CALL
1664       /* Don't eliminate a function call argument.  */
1665       || (CALL_P (i3)
1666           && (find_reg_fusage (i3, USE, dest)
1667               || (REG_P (dest)
1668                   && REGNO (dest) < FIRST_PSEUDO_REGISTER
1669                   && global_regs[REGNO (dest)])))
1670       /* Don't substitute into an incremented register.  */
1671       || FIND_REG_INC_NOTE (i3, dest)
1672       || (succ && FIND_REG_INC_NOTE (succ, dest))
1673       /* Don't substitute into a non-local goto, this confuses CFG.  */
1674       || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1675       /* Make sure that DEST is not used after SUCC but before I3.  */
1676       || (succ && ! all_adjacent
1677           && reg_used_between_p (dest, succ, i3))
1678       /* Make sure that the value that is to be substituted for the register
1679          does not use any registers whose values alter in between.  However,
1680          If the insns are adjacent, a use can't cross a set even though we
1681          think it might (this can happen for a sequence of insns each setting
1682          the same destination; last_set of that register might point to
1683          a NOTE).  If INSN has a REG_EQUIV note, the register is always
1684          equivalent to the memory so the substitution is valid even if there
1685          are intervening stores.  Also, don't move a volatile asm or
1686          UNSPEC_VOLATILE across any other insns.  */
1687       || (! all_adjacent
1688           && (((!MEM_P (src)
1689                 || ! find_reg_note (insn, REG_EQUIV, src))
1690                && use_crosses_set_p (src, DF_INSN_LUID (insn)))
1691               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1692               || GET_CODE (src) == UNSPEC_VOLATILE))
1693       /* Don't combine across a CALL_INSN, because that would possibly
1694          change whether the life span of some REGs crosses calls or not,
1695          and it is a pain to update that information.
1696          Exception: if source is a constant, moving it later can't hurt.
1697          Accept that as a special case.  */
1698       || (DF_INSN_LUID (insn) < last_call_luid && ! CONSTANT_P (src)))
1699     return 0;
1700
1701   /* DEST must either be a REG or CC0.  */
1702   if (REG_P (dest))
1703     {
1704       /* If register alignment is being enforced for multi-word items in all
1705          cases except for parameters, it is possible to have a register copy
1706          insn referencing a hard register that is not allowed to contain the
1707          mode being copied and which would not be valid as an operand of most
1708          insns.  Eliminate this problem by not combining with such an insn.
1709
1710          Also, on some machines we don't want to extend the life of a hard
1711          register.  */
1712
1713       if (REG_P (src)
1714           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1715                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1716               /* Don't extend the life of a hard register unless it is
1717                  user variable (if we have few registers) or it can't
1718                  fit into the desired register (meaning something special
1719                  is going on).
1720                  Also avoid substituting a return register into I3, because
1721                  reload can't handle a conflict with constraints of other
1722                  inputs.  */
1723               || (REGNO (src) < FIRST_PSEUDO_REGISTER
1724                   && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1725         return 0;
1726     }
1727   else if (GET_CODE (dest) != CC0)
1728     return 0;
1729
1730
1731   if (GET_CODE (PATTERN (i3)) == PARALLEL)
1732     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1733       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
1734         {
1735           /* Don't substitute for a register intended as a clobberable
1736              operand.  */
1737           rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
1738           if (rtx_equal_p (reg, dest))
1739             return 0;
1740
1741           /* If the clobber represents an earlyclobber operand, we must not
1742              substitute an expression containing the clobbered register.
1743              As we do not analyze the constraint strings here, we have to
1744              make the conservative assumption.  However, if the register is
1745              a fixed hard reg, the clobber cannot represent any operand;
1746              we leave it up to the machine description to either accept or
1747              reject use-and-clobber patterns.  */
1748           if (!REG_P (reg)
1749               || REGNO (reg) >= FIRST_PSEUDO_REGISTER
1750               || !fixed_regs[REGNO (reg)])
1751             if (reg_overlap_mentioned_p (reg, src))
1752               return 0;
1753         }
1754
1755   /* If INSN contains anything volatile, or is an `asm' (whether volatile
1756      or not), reject, unless nothing volatile comes between it and I3 */
1757
1758   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1759     {
1760       /* Make sure succ doesn't contain a volatile reference.  */
1761       if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1762         return 0;
1763
1764       for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1765         if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
1766           return 0;
1767     }
1768
1769   /* If INSN is an asm, and DEST is a hard register, reject, since it has
1770      to be an explicit register variable, and was chosen for a reason.  */
1771
1772   if (GET_CODE (src) == ASM_OPERANDS
1773       && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1774     return 0;
1775
1776   /* If there are any volatile insns between INSN and I3, reject, because
1777      they might affect machine state.  */
1778
1779   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1780     if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
1781       return 0;
1782
1783   /* If INSN contains an autoincrement or autodecrement, make sure that
1784      register is not used between there and I3, and not already used in
1785      I3 either.  Neither must it be used in PRED or SUCC, if they exist.
1786      Also insist that I3 not be a jump; if it were one
1787      and the incremented register were spilled, we would lose.  */
1788
1789 #ifdef AUTO_INC_DEC
1790   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1791     if (REG_NOTE_KIND (link) == REG_INC
1792         && (JUMP_P (i3)
1793             || reg_used_between_p (XEXP (link, 0), insn, i3)
1794             || (pred != NULL_RTX
1795                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
1796             || (succ != NULL_RTX
1797                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
1798             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1799       return 0;
1800 #endif
1801
1802 #ifdef HAVE_cc0
1803   /* Don't combine an insn that follows a CC0-setting insn.
1804      An insn that uses CC0 must not be separated from the one that sets it.
1805      We do, however, allow I2 to follow a CC0-setting insn if that insn
1806      is passed as I1; in that case it will be deleted also.
1807      We also allow combining in this case if all the insns are adjacent
1808      because that would leave the two CC0 insns adjacent as well.
1809      It would be more logical to test whether CC0 occurs inside I1 or I2,
1810      but that would be much slower, and this ought to be equivalent.  */
1811
1812   p = prev_nonnote_insn (insn);
1813   if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
1814       && ! all_adjacent)
1815     return 0;
1816 #endif
1817
1818   /* If we get here, we have passed all the tests and the combination is
1819      to be allowed.  */
1820
1821   *pdest = dest;
1822   *psrc = src;
1823
1824   return 1;
1825 }
1826 \f
1827 /* LOC is the location within I3 that contains its pattern or the component
1828    of a PARALLEL of the pattern.  We validate that it is valid for combining.
1829
1830    One problem is if I3 modifies its output, as opposed to replacing it
1831    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1832    so would produce an insn that is not equivalent to the original insns.
1833
1834    Consider:
1835
1836          (set (reg:DI 101) (reg:DI 100))
1837          (set (subreg:SI (reg:DI 101) 0) <foo>)
1838
1839    This is NOT equivalent to:
1840
1841          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1842                     (set (reg:DI 101) (reg:DI 100))])
1843
1844    Not only does this modify 100 (in which case it might still be valid
1845    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
1846
1847    We can also run into a problem if I2 sets a register that I1
1848    uses and I1 gets directly substituted into I3 (not via I2).  In that
1849    case, we would be getting the wrong value of I2DEST into I3, so we
1850    must reject the combination.  This case occurs when I2 and I1 both
1851    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1852    If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
1853    of a SET must prevent combination from occurring.
1854
1855    Before doing the above check, we first try to expand a field assignment
1856    into a set of logical operations.
1857
1858    If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
1859    we place a register that is both set and used within I3.  If more than one
1860    such register is detected, we fail.
1861
1862    Return 1 if the combination is valid, zero otherwise.  */
1863
1864 static int
1865 combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest,
1866                   int i1_not_in_src, rtx *pi3dest_killed)
1867 {
1868   rtx x = *loc;
1869
1870   if (GET_CODE (x) == SET)
1871     {
1872       rtx set = x ;
1873       rtx dest = SET_DEST (set);
1874       rtx src = SET_SRC (set);
1875       rtx inner_dest = dest;
1876       rtx subdest;
1877
1878       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1879              || GET_CODE (inner_dest) == SUBREG
1880              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1881         inner_dest = XEXP (inner_dest, 0);
1882
1883       /* Check for the case where I3 modifies its output, as discussed
1884          above.  We don't want to prevent pseudos from being combined
1885          into the address of a MEM, so only prevent the combination if
1886          i1 or i2 set the same MEM.  */
1887       if ((inner_dest != dest &&
1888            (!MEM_P (inner_dest)
1889             || rtx_equal_p (i2dest, inner_dest)
1890             || (i1dest && rtx_equal_p (i1dest, inner_dest)))
1891            && (reg_overlap_mentioned_p (i2dest, inner_dest)
1892                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1893
1894           /* This is the same test done in can_combine_p except we can't test
1895              all_adjacent; we don't have to, since this instruction will stay
1896              in place, thus we are not considering increasing the lifetime of
1897              INNER_DEST.
1898
1899              Also, if this insn sets a function argument, combining it with
1900              something that might need a spill could clobber a previous
1901              function argument; the all_adjacent test in can_combine_p also
1902              checks this; here, we do a more specific test for this case.  */
1903
1904           || (REG_P (inner_dest)
1905               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1906               && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
1907                                         GET_MODE (inner_dest))))
1908           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1909         return 0;
1910
1911       /* If DEST is used in I3, it is being killed in this insn, so
1912          record that for later.  We have to consider paradoxical
1913          subregs here, since they kill the whole register, but we
1914          ignore partial subregs, STRICT_LOW_PART, etc.
1915          Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1916          STACK_POINTER_REGNUM, since these are always considered to be
1917          live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
1918       subdest = dest;
1919       if (GET_CODE (subdest) == SUBREG
1920           && (GET_MODE_SIZE (GET_MODE (subdest))
1921               >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (subdest)))))
1922         subdest = SUBREG_REG (subdest);
1923       if (pi3dest_killed
1924           && REG_P (subdest)
1925           && reg_referenced_p (subdest, PATTERN (i3))
1926           && REGNO (subdest) != FRAME_POINTER_REGNUM
1927 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1928           && REGNO (subdest) != HARD_FRAME_POINTER_REGNUM
1929 #endif
1930 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1931           && (REGNO (subdest) != ARG_POINTER_REGNUM
1932               || ! fixed_regs [REGNO (subdest)])
1933 #endif
1934           && REGNO (subdest) != STACK_POINTER_REGNUM)
1935         {
1936           if (*pi3dest_killed)
1937             return 0;
1938
1939           *pi3dest_killed = subdest;
1940         }
1941     }
1942
1943   else if (GET_CODE (x) == PARALLEL)
1944     {
1945       int i;
1946
1947       for (i = 0; i < XVECLEN (x, 0); i++)
1948         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1949                                 i1_not_in_src, pi3dest_killed))
1950           return 0;
1951     }
1952
1953   return 1;
1954 }
1955 \f
1956 /* Return 1 if X is an arithmetic expression that contains a multiplication
1957    and division.  We don't count multiplications by powers of two here.  */
1958
1959 static int
1960 contains_muldiv (rtx x)
1961 {
1962   switch (GET_CODE (x))
1963     {
1964     case MOD:  case DIV:  case UMOD:  case UDIV:
1965       return 1;
1966
1967     case MULT:
1968       return ! (CONST_INT_P (XEXP (x, 1))
1969                 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0);
1970     default:
1971       if (BINARY_P (x))
1972         return contains_muldiv (XEXP (x, 0))
1973             || contains_muldiv (XEXP (x, 1));
1974
1975       if (UNARY_P (x))
1976         return contains_muldiv (XEXP (x, 0));
1977
1978       return 0;
1979     }
1980 }
1981 \f
1982 /* Determine whether INSN can be used in a combination.  Return nonzero if
1983    not.  This is used in try_combine to detect early some cases where we
1984    can't perform combinations.  */
1985
1986 static int
1987 cant_combine_insn_p (rtx insn)
1988 {
1989   rtx set;
1990   rtx src, dest;
1991
1992   /* If this isn't really an insn, we can't do anything.
1993      This can occur when flow deletes an insn that it has merged into an
1994      auto-increment address.  */
1995   if (! INSN_P (insn))
1996     return 1;
1997
1998   /* Never combine loads and stores involving hard regs that are likely
1999      to be spilled.  The register allocator can usually handle such
2000      reg-reg moves by tying.  If we allow the combiner to make
2001      substitutions of likely-spilled regs, reload might die.
2002      As an exception, we allow combinations involving fixed regs; these are
2003      not available to the register allocator so there's no risk involved.  */
2004
2005   set = single_set (insn);
2006   if (! set)
2007     return 0;
2008   src = SET_SRC (set);
2009   dest = SET_DEST (set);
2010   if (GET_CODE (src) == SUBREG)
2011     src = SUBREG_REG (src);
2012   if (GET_CODE (dest) == SUBREG)
2013     dest = SUBREG_REG (dest);
2014   if (REG_P (src) && REG_P (dest)
2015       && ((REGNO (src) < FIRST_PSEUDO_REGISTER
2016            && ! fixed_regs[REGNO (src)]
2017            && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (src))))
2018           || (REGNO (dest) < FIRST_PSEUDO_REGISTER
2019               && ! fixed_regs[REGNO (dest)]
2020               && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (dest))))))
2021     return 1;
2022
2023   return 0;
2024 }
2025
2026 struct likely_spilled_retval_info
2027 {
2028   unsigned regno, nregs;
2029   unsigned mask;
2030 };
2031
2032 /* Called via note_stores by likely_spilled_retval_p.  Remove from info->mask
2033    hard registers that are known to be written to / clobbered in full.  */
2034 static void
2035 likely_spilled_retval_1 (rtx x, const_rtx set, void *data)
2036 {
2037   struct likely_spilled_retval_info *const info =
2038     (struct likely_spilled_retval_info *) data;
2039   unsigned regno, nregs;
2040   unsigned new_mask;
2041
2042   if (!REG_P (XEXP (set, 0)))
2043     return;
2044   regno = REGNO (x);
2045   if (regno >= info->regno + info->nregs)
2046     return;
2047   nregs = hard_regno_nregs[regno][GET_MODE (x)];
2048   if (regno + nregs <= info->regno)
2049     return;
2050   new_mask = (2U << (nregs - 1)) - 1;
2051   if (regno < info->regno)
2052     new_mask >>= info->regno - regno;
2053   else
2054     new_mask <<= regno - info->regno;
2055   info->mask &= ~new_mask;
2056 }
2057
2058 /* Return nonzero iff part of the return value is live during INSN, and
2059    it is likely spilled.  This can happen when more than one insn is needed
2060    to copy the return value, e.g. when we consider to combine into the
2061    second copy insn for a complex value.  */
2062
2063 static int
2064 likely_spilled_retval_p (rtx insn)
2065 {
2066   rtx use = BB_END (this_basic_block);
2067   rtx reg, p;
2068   unsigned regno, nregs;
2069   /* We assume here that no machine mode needs more than
2070      32 hard registers when the value overlaps with a register
2071      for which FUNCTION_VALUE_REGNO_P is true.  */
2072   unsigned mask;
2073   struct likely_spilled_retval_info info;
2074
2075   if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
2076     return 0;
2077   reg = XEXP (PATTERN (use), 0);
2078   if (!REG_P (reg) || !FUNCTION_VALUE_REGNO_P (REGNO (reg)))
2079     return 0;
2080   regno = REGNO (reg);
2081   nregs = hard_regno_nregs[regno][GET_MODE (reg)];
2082   if (nregs == 1)
2083     return 0;
2084   mask = (2U << (nregs - 1)) - 1;
2085
2086   /* Disregard parts of the return value that are set later.  */
2087   info.regno = regno;
2088   info.nregs = nregs;
2089   info.mask = mask;
2090   for (p = PREV_INSN (use); info.mask && p != insn; p = PREV_INSN (p))
2091     if (INSN_P (p))
2092       note_stores (PATTERN (p), likely_spilled_retval_1, &info);
2093   mask = info.mask;
2094
2095   /* Check if any of the (probably) live return value registers is
2096      likely spilled.  */
2097   nregs --;
2098   do
2099     {
2100       if ((mask & 1 << nregs)
2101           && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno + nregs)))
2102         return 1;
2103     } while (nregs--);
2104   return 0;
2105 }
2106
2107 /* Adjust INSN after we made a change to its destination.
2108
2109    Changing the destination can invalidate notes that say something about
2110    the results of the insn and a LOG_LINK pointing to the insn.  */
2111
2112 static void
2113 adjust_for_new_dest (rtx insn)
2114 {
2115   /* For notes, be conservative and simply remove them.  */
2116   remove_reg_equal_equiv_notes (insn);
2117
2118   /* The new insn will have a destination that was previously the destination
2119      of an insn just above it.  Call distribute_links to make a LOG_LINK from
2120      the next use of that destination.  */
2121   distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
2122
2123   df_insn_rescan (insn);
2124 }
2125
2126 /* Return TRUE if combine can reuse reg X in mode MODE.
2127    ADDED_SETS is nonzero if the original set is still required.  */
2128 static bool
2129 can_change_dest_mode (rtx x, int added_sets, enum machine_mode mode)
2130 {
2131   unsigned int regno;
2132
2133   if (!REG_P(x))
2134     return false;
2135
2136   regno = REGNO (x);
2137   /* Allow hard registers if the new mode is legal, and occupies no more
2138      registers than the old mode.  */
2139   if (regno < FIRST_PSEUDO_REGISTER)
2140     return (HARD_REGNO_MODE_OK (regno, mode)
2141             && (hard_regno_nregs[regno][GET_MODE (x)]
2142                 >= hard_regno_nregs[regno][mode]));
2143
2144   /* Or a pseudo that is only used once.  */
2145   return (REG_N_SETS (regno) == 1 && !added_sets
2146           && !REG_USERVAR_P (x));
2147 }
2148
2149
2150 /* Check whether X, the destination of a set, refers to part of
2151    the register specified by REG.  */
2152
2153 static bool
2154 reg_subword_p (rtx x, rtx reg)
2155 {
2156   /* Check that reg is an integer mode register.  */
2157   if (!REG_P (reg) || GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
2158     return false;
2159
2160   if (GET_CODE (x) == STRICT_LOW_PART
2161       || GET_CODE (x) == ZERO_EXTRACT)
2162     x = XEXP (x, 0);
2163
2164   return GET_CODE (x) == SUBREG
2165          && SUBREG_REG (x) == reg
2166          && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT;
2167 }
2168
2169 #ifdef AUTO_INC_DEC
2170 /* Replace auto-increment addressing modes with explicit operations to
2171    access the same addresses without modifying the corresponding
2172    registers.  If AFTER holds, SRC is meant to be reused after the
2173    side effect, otherwise it is to be reused before that.  */
2174
2175 static rtx
2176 cleanup_auto_inc_dec (rtx src, bool after, enum machine_mode mem_mode)
2177 {
2178   rtx x = src;
2179   const RTX_CODE code = GET_CODE (x);
2180   int i;
2181   const char *fmt;
2182
2183   switch (code)
2184     {
2185     case REG:
2186     case CONST_INT:
2187     case CONST_DOUBLE:
2188     case CONST_FIXED:
2189     case CONST_VECTOR:
2190     case SYMBOL_REF:
2191     case CODE_LABEL:
2192     case PC:
2193     case CC0:
2194     case SCRATCH:
2195       /* SCRATCH must be shared because they represent distinct values.  */
2196       return x;
2197     case CLOBBER:
2198       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2199         return x;
2200       break;
2201
2202     case CONST:
2203       if (shared_const_p (x))
2204         return x;
2205       break;
2206
2207     case MEM:
2208       mem_mode = GET_MODE (x);
2209       break;
2210
2211     case PRE_INC:
2212     case PRE_DEC:
2213     case POST_INC:
2214     case POST_DEC:
2215       gcc_assert (mem_mode != VOIDmode && mem_mode != BLKmode);
2216       if (after == (code == PRE_INC || code == PRE_DEC))
2217         x = cleanup_auto_inc_dec (XEXP (x, 0), after, mem_mode);
2218       else
2219         x = gen_rtx_PLUS (GET_MODE (x),
2220                           cleanup_auto_inc_dec (XEXP (x, 0), after, mem_mode),
2221                           GEN_INT ((code == PRE_INC || code == POST_INC)
2222                                    ? GET_MODE_SIZE (mem_mode)
2223                                    : -GET_MODE_SIZE (mem_mode)));
2224       return x;
2225
2226     case PRE_MODIFY:
2227     case POST_MODIFY:
2228       if (after == (code == PRE_MODIFY))
2229         x = XEXP (x, 0);
2230       else
2231         x = XEXP (x, 1);
2232       return cleanup_auto_inc_dec (x, after, mem_mode);
2233
2234     default:
2235       break;
2236     }
2237
2238   /* Copy the various flags, fields, and other information.  We assume
2239      that all fields need copying, and then clear the fields that should
2240      not be copied.  That is the sensible default behavior, and forces
2241      us to explicitly document why we are *not* copying a flag.  */
2242   x = shallow_copy_rtx (x);
2243
2244   /* We do not copy the USED flag, which is used as a mark bit during
2245      walks over the RTL.  */
2246   RTX_FLAG (x, used) = 0;
2247
2248   /* We do not copy FRAME_RELATED for INSNs.  */
2249   if (INSN_P (x))
2250     RTX_FLAG (x, frame_related) = 0;
2251
2252   fmt = GET_RTX_FORMAT (code);
2253   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2254     if (fmt[i] == 'e')
2255       XEXP (x, i) = cleanup_auto_inc_dec (XEXP (x, i), after, mem_mode);
2256     else if (fmt[i] == 'E' || fmt[i] == 'V')
2257       {
2258         int j;
2259         XVEC (x, i) = rtvec_alloc (XVECLEN (x, i));
2260         for (j = 0; j < XVECLEN (x, i); j++)
2261           XVECEXP (x, i, j)
2262             = cleanup_auto_inc_dec (XVECEXP (src, i, j), after, mem_mode);
2263       }
2264
2265   return x;
2266 }
2267
2268 /* Auxiliary data structure for propagate_for_debug_stmt.  */
2269
2270 struct rtx_subst_pair
2271 {
2272   rtx to;
2273   bool adjusted;
2274   bool after;
2275 };
2276
2277 /* DATA points to an rtx_subst_pair.  Return the value that should be
2278    substituted.  */
2279
2280 static rtx
2281 propagate_for_debug_subst (rtx from ATTRIBUTE_UNUSED, void *data)
2282 {
2283   struct rtx_subst_pair *pair = (struct rtx_subst_pair *)data;
2284
2285   if (!pair->adjusted)
2286     {
2287       pair->adjusted = true;
2288       pair->to = cleanup_auto_inc_dec (pair->to, pair->after, VOIDmode);
2289       return pair->to;
2290     }
2291   return copy_rtx (pair->to);
2292 }
2293 #endif
2294
2295 /* Replace occurrences of DEST with SRC in DEBUG_INSNs between INSN
2296    and LAST.  If MOVE holds, debug insns must also be moved past
2297    LAST.  */
2298
2299 static void
2300 propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src, bool move)
2301 {
2302   rtx next, move_pos = move ? last : NULL_RTX, loc;
2303
2304 #ifdef AUTO_INC_DEC
2305   struct rtx_subst_pair p;
2306   p.to = src;
2307   p.adjusted = false;
2308   p.after = move;
2309 #endif
2310
2311   next = NEXT_INSN (insn);
2312   while (next != last)
2313     {
2314       insn = next;
2315       next = NEXT_INSN (insn);
2316       if (DEBUG_INSN_P (insn))
2317         {
2318 #ifdef AUTO_INC_DEC
2319           loc = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
2320                                          dest, propagate_for_debug_subst, &p);
2321 #else
2322           loc = simplify_replace_rtx (INSN_VAR_LOCATION_LOC (insn), dest, src);
2323 #endif
2324           if (loc == INSN_VAR_LOCATION_LOC (insn))
2325             continue;
2326           INSN_VAR_LOCATION_LOC (insn) = loc;
2327           if (move_pos)
2328             {
2329               remove_insn (insn);
2330               PREV_INSN (insn) = NEXT_INSN (insn) = NULL_RTX;
2331               move_pos = emit_debug_insn_after (insn, move_pos);
2332             }
2333           else
2334             df_insn_rescan (insn);
2335         }
2336     }
2337 }
2338
2339 /* Delete the unconditional jump INSN and adjust the CFG correspondingly.
2340    Note that the INSN should be deleted *after* removing dead edges, so
2341    that the kept edge is the fallthrough edge for a (set (pc) (pc))
2342    but not for a (set (pc) (label_ref FOO)).  */
2343
2344 static void
2345 update_cfg_for_uncondjump (rtx insn)
2346 {
2347   basic_block bb = BLOCK_FOR_INSN (insn);
2348   bool at_end = (BB_END (bb) == insn);
2349
2350   if (at_end)
2351     purge_dead_edges (bb);
2352
2353   delete_insn (insn);
2354   if (at_end && EDGE_COUNT (bb->succs) == 1)
2355     single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2356 }
2357
2358
2359 /* Try to combine the insns I1 and I2 into I3.
2360    Here I1 and I2 appear earlier than I3.
2361    I1 can be zero; then we combine just I2 into I3.
2362
2363    If we are combining three insns and the resulting insn is not recognized,
2364    try splitting it into two insns.  If that happens, I2 and I3 are retained
2365    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
2366    are pseudo-deleted.
2367
2368    Return 0 if the combination does not work.  Then nothing is changed.
2369    If we did the combination, return the insn at which combine should
2370    resume scanning.
2371
2372    Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
2373    new direct jump instruction.  */
2374
2375 static rtx
2376 try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
2377 {
2378   /* New patterns for I3 and I2, respectively.  */
2379   rtx newpat, newi2pat = 0;
2380   rtvec newpat_vec_with_clobbers = 0;
2381   int substed_i2 = 0, substed_i1 = 0;
2382   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
2383   int added_sets_1, added_sets_2;
2384   /* Total number of SETs to put into I3.  */
2385   int total_sets;
2386   /* Nonzero if I2's body now appears in I3.  */
2387   int i2_is_used;
2388   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
2389   int insn_code_number, i2_code_number = 0, other_code_number = 0;
2390   /* Contains I3 if the destination of I3 is used in its source, which means
2391      that the old life of I3 is being killed.  If that usage is placed into
2392      I2 and not in I3, a REG_DEAD note must be made.  */
2393   rtx i3dest_killed = 0;
2394   /* SET_DEST and SET_SRC of I2 and I1.  */
2395   rtx i2dest = 0, i2src = 0, i1dest = 0, i1src = 0;
2396   /* Set if I2DEST was reused as a scratch register.  */
2397   bool i2scratch = false;
2398   /* PATTERN (I1) and PATTERN (I2), or a copy of it in certain cases.  */
2399   rtx i1pat = 0, i2pat = 0;
2400   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
2401   int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
2402   int i2dest_killed = 0, i1dest_killed = 0;
2403   int i1_feeds_i3 = 0;
2404   /* Notes that must be added to REG_NOTES in I3 and I2.  */
2405   rtx new_i3_notes, new_i2_notes;
2406   /* Notes that we substituted I3 into I2 instead of the normal case.  */
2407   int i3_subst_into_i2 = 0;
2408   /* Notes that I1, I2 or I3 is a MULT operation.  */
2409   int have_mult = 0;
2410   int swap_i2i3 = 0;
2411   int changed_i3_dest = 0;
2412
2413   int maxreg;
2414   rtx temp;
2415   rtx link;
2416   rtx other_pat = 0;
2417   rtx new_other_notes;
2418   int i;
2419
2420   /* Exit early if one of the insns involved can't be used for
2421      combinations.  */
2422   if (cant_combine_insn_p (i3)
2423       || cant_combine_insn_p (i2)
2424       || (i1 && cant_combine_insn_p (i1))
2425       || likely_spilled_retval_p (i3))
2426     return 0;
2427
2428   combine_attempts++;
2429   undobuf.other_insn = 0;
2430
2431   /* Reset the hard register usage information.  */
2432   CLEAR_HARD_REG_SET (newpat_used_regs);
2433
2434   if (dump_file && (dump_flags & TDF_DETAILS))
2435     {
2436       if (i1)
2437         fprintf (dump_file, "\nTrying %d, %d -> %d:\n",
2438                  INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2439       else
2440         fprintf (dump_file, "\nTrying %d -> %d:\n",
2441                  INSN_UID (i2), INSN_UID (i3));
2442     }
2443
2444   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
2445      code below, set I1 to be the earlier of the two insns.  */
2446   if (i1 && DF_INSN_LUID (i1) > DF_INSN_LUID (i2))
2447     temp = i1, i1 = i2, i2 = temp;
2448
2449   added_links_insn = 0;
2450
2451   /* First check for one important special-case that the code below will
2452      not handle.  Namely, the case where I1 is zero, I2 is a PARALLEL
2453      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
2454      we may be able to replace that destination with the destination of I3.
2455      This occurs in the common code where we compute both a quotient and
2456      remainder into a structure, in which case we want to do the computation
2457      directly into the structure to avoid register-register copies.
2458
2459      Note that this case handles both multiple sets in I2 and also
2460      cases where I2 has a number of CLOBBER or PARALLELs.
2461
2462      We make very conservative checks below and only try to handle the
2463      most common cases of this.  For example, we only handle the case
2464      where I2 and I3 are adjacent to avoid making difficult register
2465      usage tests.  */
2466
2467   if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
2468       && REG_P (SET_SRC (PATTERN (i3)))
2469       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
2470       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
2471       && GET_CODE (PATTERN (i2)) == PARALLEL
2472       && ! side_effects_p (SET_DEST (PATTERN (i3)))
2473       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
2474          below would need to check what is inside (and reg_overlap_mentioned_p
2475          doesn't support those codes anyway).  Don't allow those destinations;
2476          the resulting insn isn't likely to be recognized anyway.  */
2477       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
2478       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
2479       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
2480                                     SET_DEST (PATTERN (i3)))
2481       && next_active_insn (i2) == i3)
2482     {
2483       rtx p2 = PATTERN (i2);
2484
2485       /* Make sure that the destination of I3,
2486          which we are going to substitute into one output of I2,
2487          is not used within another output of I2.  We must avoid making this:
2488          (parallel [(set (mem (reg 69)) ...)
2489                     (set (reg 69) ...)])
2490          which is not well-defined as to order of actions.
2491          (Besides, reload can't handle output reloads for this.)
2492
2493          The problem can also happen if the dest of I3 is a memory ref,
2494          if another dest in I2 is an indirect memory ref.  */
2495       for (i = 0; i < XVECLEN (p2, 0); i++)
2496         if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2497              || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2498             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
2499                                         SET_DEST (XVECEXP (p2, 0, i))))
2500           break;
2501
2502       if (i == XVECLEN (p2, 0))
2503         for (i = 0; i < XVECLEN (p2, 0); i++)
2504           if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2505                || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2506               && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
2507             {
2508               combine_merges++;
2509
2510               subst_insn = i3;
2511               subst_low_luid = DF_INSN_LUID (i2);
2512
2513               added_sets_2 = added_sets_1 = 0;
2514               i2src = SET_DEST (PATTERN (i3));
2515               i2dest = SET_SRC (PATTERN (i3));
2516               i2dest_killed = dead_or_set_p (i2, i2dest);
2517
2518               /* Replace the dest in I2 with our dest and make the resulting
2519                  insn the new pattern for I3.  Then skip to where we
2520                  validate the pattern.  Everything was set up above.  */
2521               SUBST (SET_DEST (XVECEXP (p2, 0, i)),
2522                      SET_DEST (PATTERN (i3)));
2523
2524               newpat = p2;
2525               i3_subst_into_i2 = 1;
2526               goto validate_replacement;
2527             }
2528     }
2529
2530   /* If I2 is setting a pseudo to a constant and I3 is setting some
2531      sub-part of it to another constant, merge them by making a new
2532      constant.  */
2533   if (i1 == 0
2534       && (temp = single_set (i2)) != 0
2535       && (CONST_INT_P (SET_SRC (temp))
2536           || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
2537       && GET_CODE (PATTERN (i3)) == SET
2538       && (CONST_INT_P (SET_SRC (PATTERN (i3)))
2539           || GET_CODE (SET_SRC (PATTERN (i3))) == CONST_DOUBLE)
2540       && reg_subword_p (SET_DEST (PATTERN (i3)), SET_DEST (temp)))
2541     {
2542       rtx dest = SET_DEST (PATTERN (i3));
2543       int offset = -1;
2544       int width = 0;
2545
2546       if (GET_CODE (dest) == ZERO_EXTRACT)
2547         {
2548           if (CONST_INT_P (XEXP (dest, 1))
2549               && CONST_INT_P (XEXP (dest, 2)))
2550             {
2551               width = INTVAL (XEXP (dest, 1));
2552               offset = INTVAL (XEXP (dest, 2));
2553               dest = XEXP (dest, 0);
2554               if (BITS_BIG_ENDIAN)
2555                 offset = GET_MODE_BITSIZE (GET_MODE (dest)) - width - offset;
2556             }
2557         }
2558       else
2559         {
2560           if (GET_CODE (dest) == STRICT_LOW_PART)
2561             dest = XEXP (dest, 0);
2562           width = GET_MODE_BITSIZE (GET_MODE (dest));
2563           offset = 0;
2564         }
2565
2566       if (offset >= 0)
2567         {
2568           /* If this is the low part, we're done.  */
2569           if (subreg_lowpart_p (dest))
2570             ;
2571           /* Handle the case where inner is twice the size of outer.  */
2572           else if (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp)))
2573                    == 2 * GET_MODE_BITSIZE (GET_MODE (dest)))
2574             offset += GET_MODE_BITSIZE (GET_MODE (dest));
2575           /* Otherwise give up for now.  */
2576           else
2577             offset = -1;
2578         }
2579
2580       if (offset >= 0
2581           && (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp)))
2582               <= HOST_BITS_PER_WIDE_INT * 2))
2583         {
2584           HOST_WIDE_INT mhi, ohi, ihi;
2585           HOST_WIDE_INT mlo, olo, ilo;
2586           rtx inner = SET_SRC (PATTERN (i3));
2587           rtx outer = SET_SRC (temp);
2588
2589           if (CONST_INT_P (outer))
2590             {
2591               olo = INTVAL (outer);
2592               ohi = olo < 0 ? -1 : 0;
2593             }
2594           else
2595             {
2596               olo = CONST_DOUBLE_LOW (outer);
2597               ohi = CONST_DOUBLE_HIGH (outer);
2598             }
2599
2600           if (CONST_INT_P (inner))
2601             {
2602               ilo = INTVAL (inner);
2603               ihi = ilo < 0 ? -1 : 0;
2604             }
2605           else
2606             {
2607               ilo = CONST_DOUBLE_LOW (inner);
2608               ihi = CONST_DOUBLE_HIGH (inner);
2609             }
2610
2611           if (width < HOST_BITS_PER_WIDE_INT)
2612             {
2613               mlo = ((unsigned HOST_WIDE_INT) 1 << width) - 1;
2614               mhi = 0;
2615             }
2616           else if (width < HOST_BITS_PER_WIDE_INT * 2)
2617             {
2618               mhi = ((unsigned HOST_WIDE_INT) 1
2619                      << (width - HOST_BITS_PER_WIDE_INT)) - 1;
2620               mlo = -1;
2621             }
2622           else
2623             {
2624               mlo = -1;
2625               mhi = -1;
2626             }
2627
2628           ilo &= mlo;
2629           ihi &= mhi;
2630
2631           if (offset >= HOST_BITS_PER_WIDE_INT)
2632             {
2633               mhi = mlo << (offset - HOST_BITS_PER_WIDE_INT);
2634               mlo = 0;
2635               ihi = ilo << (offset - HOST_BITS_PER_WIDE_INT);
2636               ilo = 0;
2637             }
2638           else if (offset > 0)
2639             {
2640               mhi = (mhi << offset) | ((unsigned HOST_WIDE_INT) mlo
2641                                        >> (HOST_BITS_PER_WIDE_INT - offset));
2642               mlo = mlo << offset;
2643               ihi = (ihi << offset) | ((unsigned HOST_WIDE_INT) ilo
2644                                        >> (HOST_BITS_PER_WIDE_INT - offset));
2645               ilo = ilo << offset;
2646             }
2647
2648           olo = (olo & ~mlo) | ilo;
2649           ohi = (ohi & ~mhi) | ihi;
2650
2651           combine_merges++;
2652           subst_insn = i3;
2653           subst_low_luid = DF_INSN_LUID (i2);
2654           added_sets_2 = added_sets_1 = 0;
2655           i2dest = SET_DEST (temp);
2656           i2dest_killed = dead_or_set_p (i2, i2dest);
2657
2658           SUBST (SET_SRC (temp),
2659                  immed_double_const (olo, ohi, GET_MODE (SET_DEST (temp))));
2660
2661           newpat = PATTERN (i2);
2662           goto validate_replacement;
2663         }
2664     }
2665
2666 #ifndef HAVE_cc0
2667   /* If we have no I1 and I2 looks like:
2668         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
2669                    (set Y OP)])
2670      make up a dummy I1 that is
2671         (set Y OP)
2672      and change I2 to be
2673         (set (reg:CC X) (compare:CC Y (const_int 0)))
2674
2675      (We can ignore any trailing CLOBBERs.)
2676
2677      This undoes a previous combination and allows us to match a branch-and-
2678      decrement insn.  */
2679
2680   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
2681       && XVECLEN (PATTERN (i2), 0) >= 2
2682       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
2683       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
2684           == MODE_CC)
2685       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
2686       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
2687       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
2688       && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)))
2689       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
2690                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
2691     {
2692       for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
2693         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
2694           break;
2695
2696       if (i == 1)
2697         {
2698           /* We make I1 with the same INSN_UID as I2.  This gives it
2699              the same DF_INSN_LUID for value tracking.  Our fake I1 will
2700              never appear in the insn stream so giving it the same INSN_UID
2701              as I2 will not cause a problem.  */
2702
2703           i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
2704                              BLOCK_FOR_INSN (i2), INSN_LOCATOR (i2),
2705                              XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX);
2706
2707           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
2708           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
2709                  SET_DEST (PATTERN (i1)));
2710         }
2711     }
2712 #endif
2713
2714   /* Verify that I2 and I1 are valid for combining.  */
2715   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
2716       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
2717     {
2718       undo_all ();
2719       return 0;
2720     }
2721
2722   /* Record whether I2DEST is used in I2SRC and similarly for the other
2723      cases.  Knowing this will help in register status updating below.  */
2724   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
2725   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
2726   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
2727   i2dest_killed = dead_or_set_p (i2, i2dest);
2728   i1dest_killed = i1 && dead_or_set_p (i1, i1dest);
2729
2730   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
2731      in I2SRC.  */
2732   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
2733
2734   /* Ensure that I3's pattern can be the destination of combines.  */
2735   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
2736                           i1 && i2dest_in_i1src && i1_feeds_i3,
2737                           &i3dest_killed))
2738     {
2739       undo_all ();
2740       return 0;
2741     }
2742
2743   /* See if any of the insns is a MULT operation.  Unless one is, we will
2744      reject a combination that is, since it must be slower.  Be conservative
2745      here.  */
2746   if (GET_CODE (i2src) == MULT
2747       || (i1 != 0 && GET_CODE (i1src) == MULT)
2748       || (GET_CODE (PATTERN (i3)) == SET
2749           && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
2750     have_mult = 1;
2751
2752   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
2753      We used to do this EXCEPT in one case: I3 has a post-inc in an
2754      output operand.  However, that exception can give rise to insns like
2755         mov r3,(r3)+
2756      which is a famous insn on the PDP-11 where the value of r3 used as the
2757      source was model-dependent.  Avoid this sort of thing.  */
2758
2759 #if 0
2760   if (!(GET_CODE (PATTERN (i3)) == SET
2761         && REG_P (SET_SRC (PATTERN (i3)))
2762         && MEM_P (SET_DEST (PATTERN (i3)))
2763         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
2764             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
2765     /* It's not the exception.  */
2766 #endif
2767 #ifdef AUTO_INC_DEC
2768     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
2769       if (REG_NOTE_KIND (link) == REG_INC
2770           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
2771               || (i1 != 0
2772                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
2773         {
2774           undo_all ();
2775           return 0;
2776         }
2777 #endif
2778
2779   /* See if the SETs in I1 or I2 need to be kept around in the merged
2780      instruction: whenever the value set there is still needed past I3.
2781      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
2782
2783      For the SET in I1, we have two cases:  If I1 and I2 independently
2784      feed into I3, the set in I1 needs to be kept around if I1DEST dies
2785      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
2786      in I1 needs to be kept around unless I1DEST dies or is set in either
2787      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
2788      I1DEST.  If so, we know I1 feeds into I2.  */
2789
2790   added_sets_2 = ! dead_or_set_p (i3, i2dest);
2791
2792   added_sets_1
2793     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
2794                : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
2795
2796   /* If the set in I2 needs to be kept around, we must make a copy of
2797      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
2798      PATTERN (I2), we are only substituting for the original I1DEST, not into
2799      an already-substituted copy.  This also prevents making self-referential
2800      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
2801      I2DEST.  */
2802
2803   if (added_sets_2)
2804     {
2805       if (GET_CODE (PATTERN (i2)) == PARALLEL)
2806         i2pat = gen_rtx_SET (VOIDmode, i2dest, copy_rtx (i2src));
2807       else
2808         i2pat = copy_rtx (PATTERN (i2));
2809     }
2810
2811   if (added_sets_1)
2812     {
2813       if (GET_CODE (PATTERN (i1)) == PARALLEL)
2814         i1pat = gen_rtx_SET (VOIDmode, i1dest, copy_rtx (i1src));
2815       else
2816         i1pat = copy_rtx (PATTERN (i1));
2817     }
2818
2819   combine_merges++;
2820
2821   /* Substitute in the latest insn for the regs set by the earlier ones.  */
2822
2823   maxreg = max_reg_num ();
2824
2825   subst_insn = i3;
2826
2827 #ifndef HAVE_cc0
2828   /* Many machines that don't use CC0 have insns that can both perform an
2829      arithmetic operation and set the condition code.  These operations will
2830      be represented as a PARALLEL with the first element of the vector
2831      being a COMPARE of an arithmetic operation with the constant zero.
2832      The second element of the vector will set some pseudo to the result
2833      of the same arithmetic operation.  If we simplify the COMPARE, we won't
2834      match such a pattern and so will generate an extra insn.   Here we test
2835      for this case, where both the comparison and the operation result are
2836      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
2837      I2SRC.  Later we will make the PARALLEL that contains I2.  */
2838
2839   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
2840       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
2841       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
2842       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
2843     {
2844 #ifdef SELECT_CC_MODE
2845       rtx *cc_use;
2846       enum machine_mode compare_mode;
2847 #endif
2848
2849       newpat = PATTERN (i3);
2850       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
2851
2852       i2_is_used = 1;
2853
2854 #ifdef SELECT_CC_MODE
2855       /* See if a COMPARE with the operand we substituted in should be done
2856          with the mode that is currently being used.  If not, do the same
2857          processing we do in `subst' for a SET; namely, if the destination
2858          is used only once, try to replace it with a register of the proper
2859          mode and also replace the COMPARE.  */
2860       if (undobuf.other_insn == 0
2861           && (cc_use = find_single_use (SET_DEST (newpat), i3,
2862                                         &undobuf.other_insn))
2863           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
2864                                               i2src, const0_rtx))
2865               != GET_MODE (SET_DEST (newpat))))
2866         {
2867           if (can_change_dest_mode(SET_DEST (newpat), added_sets_2,
2868                                    compare_mode))
2869             {
2870               unsigned int regno = REGNO (SET_DEST (newpat));
2871               rtx new_dest;
2872
2873               if (regno < FIRST_PSEUDO_REGISTER)
2874                 new_dest = gen_rtx_REG (compare_mode, regno);
2875               else
2876                 {
2877                   SUBST_MODE (regno_reg_rtx[regno], compare_mode);
2878                   new_dest = regno_reg_rtx[regno];
2879                 }
2880
2881               SUBST (SET_DEST (newpat), new_dest);
2882               SUBST (XEXP (*cc_use, 0), new_dest);
2883               SUBST (SET_SRC (newpat),
2884                      gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
2885             }
2886           else
2887             undobuf.other_insn = 0;
2888         }
2889 #endif
2890     }
2891   else
2892 #endif
2893     {
2894       /* It is possible that the source of I2 or I1 may be performing
2895          an unneeded operation, such as a ZERO_EXTEND of something
2896          that is known to have the high part zero.  Handle that case
2897          by letting subst look at the innermost one of them.
2898
2899          Another way to do this would be to have a function that tries
2900          to simplify a single insn instead of merging two or more
2901          insns.  We don't do this because of the potential of infinite
2902          loops and because of the potential extra memory required.
2903          However, doing it the way we are is a bit of a kludge and
2904          doesn't catch all cases.
2905
2906          But only do this if -fexpensive-optimizations since it slows
2907          things down and doesn't usually win.
2908
2909          This is not done in the COMPARE case above because the
2910          unmodified I2PAT is used in the PARALLEL and so a pattern
2911          with a modified I2SRC would not match.  */
2912
2913       if (flag_expensive_optimizations)
2914         {
2915           /* Pass pc_rtx so no substitutions are done, just
2916              simplifications.  */
2917           if (i1)
2918             {
2919               subst_low_luid = DF_INSN_LUID (i1);
2920               i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
2921             }
2922           else
2923             {
2924               subst_low_luid = DF_INSN_LUID (i2);
2925               i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
2926             }
2927         }
2928
2929       n_occurrences = 0;                /* `subst' counts here */
2930
2931       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
2932          need to make a unique copy of I2SRC each time we substitute it
2933          to avoid self-referential rtl.  */
2934
2935       subst_low_luid = DF_INSN_LUID (i2);
2936       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
2937                       ! i1_feeds_i3 && i1dest_in_i1src);
2938       substed_i2 = 1;
2939
2940       /* Record whether i2's body now appears within i3's body.  */
2941       i2_is_used = n_occurrences;
2942     }
2943
2944   /* If we already got a failure, don't try to do more.  Otherwise,
2945      try to substitute in I1 if we have it.  */
2946
2947   if (i1 && GET_CODE (newpat) != CLOBBER)
2948     {
2949       /* Check that an autoincrement side-effect on I1 has not been lost.
2950          This happens if I1DEST is mentioned in I2 and dies there, and
2951          has disappeared from the new pattern.  */
2952       if ((FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2953            && !i1_feeds_i3
2954            && dead_or_set_p (i2, i1dest)
2955            && !reg_overlap_mentioned_p (i1dest, newpat))
2956           /* Before we can do this substitution, we must redo the test done
2957              above (see detailed comments there) that ensures  that I1DEST
2958              isn't mentioned in any SETs in NEWPAT that are field assignments.  */
2959           || !combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, 0, 0))
2960         {
2961           undo_all ();
2962           return 0;
2963         }
2964
2965       n_occurrences = 0;
2966       subst_low_luid = DF_INSN_LUID (i1);
2967       newpat = subst (newpat, i1dest, i1src, 0, 0);
2968       substed_i1 = 1;
2969     }
2970
2971   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
2972      to count all the ways that I2SRC and I1SRC can be used.  */
2973   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
2974        && i2_is_used + added_sets_2 > 1)
2975       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2976           && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
2977               > 1))
2978       /* Fail if we tried to make a new register.  */
2979       || max_reg_num () != maxreg
2980       /* Fail if we couldn't do something and have a CLOBBER.  */
2981       || GET_CODE (newpat) == CLOBBER
2982       /* Fail if this new pattern is a MULT and we didn't have one before
2983          at the outer level.  */
2984       || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
2985           && ! have_mult))
2986     {
2987       undo_all ();
2988       return 0;
2989     }
2990
2991   /* If the actions of the earlier insns must be kept
2992      in addition to substituting them into the latest one,
2993      we must make a new PARALLEL for the latest insn
2994      to hold additional the SETs.  */
2995
2996   if (added_sets_1 || added_sets_2)
2997     {
2998       combine_extras++;
2999
3000       if (GET_CODE (newpat) == PARALLEL)
3001         {
3002           rtvec old = XVEC (newpat, 0);
3003           total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
3004           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3005           memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
3006                   sizeof (old->elem[0]) * old->num_elem);
3007         }
3008       else
3009         {
3010           rtx old = newpat;
3011           total_sets = 1 + added_sets_1 + added_sets_2;
3012           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3013           XVECEXP (newpat, 0, 0) = old;
3014         }
3015
3016       if (added_sets_1)
3017         XVECEXP (newpat, 0, --total_sets) = i1pat;
3018
3019       if (added_sets_2)
3020         {
3021           /* If there is no I1, use I2's body as is.  We used to also not do
3022              the subst call below if I2 was substituted into I3,
3023              but that could lose a simplification.  */
3024           if (i1 == 0)
3025             XVECEXP (newpat, 0, --total_sets) = i2pat;
3026           else
3027             /* See comment where i2pat is assigned.  */
3028             XVECEXP (newpat, 0, --total_sets)
3029               = subst (i2pat, i1dest, i1src, 0, 0);
3030         }
3031     }
3032
3033   /* We come here when we are replacing a destination in I2 with the
3034      destination of I3.  */
3035  validate_replacement:
3036
3037   /* Note which hard regs this insn has as inputs.  */
3038   mark_used_regs_combine (newpat);
3039
3040   /* If recog_for_combine fails, it strips existing clobbers.  If we'll
3041      consider splitting this pattern, we might need these clobbers.  */
3042   if (i1 && GET_CODE (newpat) == PARALLEL
3043       && GET_CODE (XVECEXP (newpat, 0, XVECLEN (newpat, 0) - 1)) == CLOBBER)
3044     {
3045       int len = XVECLEN (newpat, 0);
3046
3047       newpat_vec_with_clobbers = rtvec_alloc (len);
3048       for (i = 0; i < len; i++)
3049         RTVEC_ELT (newpat_vec_with_clobbers, i) = XVECEXP (newpat, 0, i);
3050     }
3051
3052   /* Is the result of combination a valid instruction?  */
3053   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3054
3055   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
3056      the second SET's destination is a register that is unused and isn't
3057      marked as an instruction that might trap in an EH region.  In that case,
3058      we just need the first SET.   This can occur when simplifying a divmod
3059      insn.  We *must* test for this case here because the code below that
3060      splits two independent SETs doesn't handle this case correctly when it
3061      updates the register status.
3062
3063      It's pointless doing this if we originally had two sets, one from
3064      i3, and one from i2.  Combining then splitting the parallel results
3065      in the original i2 again plus an invalid insn (which we delete).
3066      The net effect is only to move instructions around, which makes
3067      debug info less accurate.
3068
3069      Also check the case where the first SET's destination is unused.
3070      That would not cause incorrect code, but does cause an unneeded
3071      insn to remain.  */
3072
3073   if (insn_code_number < 0
3074       && !(added_sets_2 && i1 == 0)
3075       && GET_CODE (newpat) == PARALLEL
3076       && XVECLEN (newpat, 0) == 2
3077       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3078       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3079       && asm_noperands (newpat) < 0)
3080     {
3081       rtx set0 = XVECEXP (newpat, 0, 0);
3082       rtx set1 = XVECEXP (newpat, 0, 1);
3083
3084       if (((REG_P (SET_DEST (set1))
3085             && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
3086            || (GET_CODE (SET_DEST (set1)) == SUBREG
3087                && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
3088           && insn_nothrow_p (i3)
3089           && !side_effects_p (SET_SRC (set1)))
3090         {
3091           newpat = set0;
3092           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3093         }
3094
3095       else if (((REG_P (SET_DEST (set0))
3096                  && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
3097                 || (GET_CODE (SET_DEST (set0)) == SUBREG
3098                     && find_reg_note (i3, REG_UNUSED,
3099                                       SUBREG_REG (SET_DEST (set0)))))
3100                && insn_nothrow_p (i3)
3101                && !side_effects_p (SET_SRC (set0)))
3102         {
3103           newpat = set1;
3104           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3105
3106           if (insn_code_number >= 0)
3107             changed_i3_dest = 1;
3108         }
3109     }
3110
3111   /* If we were combining three insns and the result is a simple SET
3112      with no ASM_OPERANDS that wasn't recognized, try to split it into two
3113      insns.  There are two ways to do this.  It can be split using a
3114      machine-specific method (like when you have an addition of a large
3115      constant) or by combine in the function find_split_point.  */
3116
3117   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
3118       && asm_noperands (newpat) < 0)
3119     {
3120       rtx parallel, m_split, *split;
3121
3122       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
3123          use I2DEST as a scratch register will help.  In the latter case,
3124          convert I2DEST to the mode of the source of NEWPAT if we can.  */
3125
3126       m_split = combine_split_insns (newpat, i3);
3127
3128       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
3129          inputs of NEWPAT.  */
3130
3131       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
3132          possible to try that as a scratch reg.  This would require adding
3133          more code to make it work though.  */
3134
3135       if (m_split == 0 && ! reg_overlap_mentioned_p (i2dest, newpat))
3136         {
3137           enum machine_mode new_mode = GET_MODE (SET_DEST (newpat));
3138
3139           /* First try to split using the original register as a
3140              scratch register.  */
3141           parallel = gen_rtx_PARALLEL (VOIDmode,
3142                                        gen_rtvec (2, newpat,
3143                                                   gen_rtx_CLOBBER (VOIDmode,
3144                                                                    i2dest)));
3145           m_split = combine_split_insns (parallel, i3);
3146
3147           /* If that didn't work, try changing the mode of I2DEST if
3148              we can.  */
3149           if (m_split == 0
3150               && new_mode != GET_MODE (i2dest)
3151               && new_mode != VOIDmode
3152               && can_change_dest_mode (i2dest, added_sets_2, new_mode))
3153             {
3154               enum machine_mode old_mode = GET_MODE (i2dest);
3155               rtx ni2dest;
3156
3157               if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3158                 ni2dest = gen_rtx_REG (new_mode, REGNO (i2dest));
3159               else
3160                 {
3161                   SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], new_mode);
3162                   ni2dest = regno_reg_rtx[REGNO (i2dest)];
3163                 }
3164
3165               parallel = (gen_rtx_PARALLEL
3166                           (VOIDmode,
3167                            gen_rtvec (2, newpat,
3168                                       gen_rtx_CLOBBER (VOIDmode,
3169                                                        ni2dest))));
3170               m_split = combine_split_insns (parallel, i3);
3171
3172               if (m_split == 0
3173                   && REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
3174                 {
3175                   struct undo *buf;
3176
3177                   adjust_reg_mode (regno_reg_rtx[REGNO (i2dest)], old_mode);
3178                   buf = undobuf.undos;
3179                   undobuf.undos = buf->next;
3180                   buf->next = undobuf.frees;
3181                   undobuf.frees = buf;
3182                 }
3183             }
3184
3185           i2scratch = m_split != 0;
3186         }
3187
3188       /* If recog_for_combine has discarded clobbers, try to use them
3189          again for the split.  */
3190       if (m_split == 0 && newpat_vec_with_clobbers)
3191         {
3192           parallel = gen_rtx_PARALLEL (VOIDmode, newpat_vec_with_clobbers);
3193           m_split = combine_split_insns (parallel, i3);
3194         }
3195
3196       if (m_split && NEXT_INSN (m_split) == NULL_RTX)
3197         {
3198           m_split = PATTERN (m_split);
3199           insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
3200           if (insn_code_number >= 0)
3201             newpat = m_split;
3202         }
3203       else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX
3204                && (next_real_insn (i2) == i3
3205                    || ! use_crosses_set_p (PATTERN (m_split), DF_INSN_LUID (i2))))
3206         {
3207           rtx i2set, i3set;
3208           rtx newi3pat = PATTERN (NEXT_INSN (m_split));
3209           newi2pat = PATTERN (m_split);
3210
3211           i3set = single_set (NEXT_INSN (m_split));
3212           i2set = single_set (m_split);
3213
3214           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3215
3216           /* If I2 or I3 has multiple SETs, we won't know how to track
3217              register status, so don't use these insns.  If I2's destination
3218              is used between I2 and I3, we also can't use these insns.  */
3219
3220           if (i2_code_number >= 0 && i2set && i3set
3221               && (next_real_insn (i2) == i3
3222                   || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
3223             insn_code_number = recog_for_combine (&newi3pat, i3,
3224                                                   &new_i3_notes);
3225           if (insn_code_number >= 0)
3226             newpat = newi3pat;
3227
3228           /* It is possible that both insns now set the destination of I3.
3229              If so, we must show an extra use of it.  */
3230
3231           if (insn_code_number >= 0)
3232             {
3233               rtx new_i3_dest = SET_DEST (i3set);
3234               rtx new_i2_dest = SET_DEST (i2set);
3235
3236               while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
3237                      || GET_CODE (new_i3_dest) == STRICT_LOW_PART
3238                      || GET_CODE (new_i3_dest) == SUBREG)
3239                 new_i3_dest = XEXP (new_i3_dest, 0);
3240
3241               while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
3242                      || GET_CODE (new_i2_dest) == STRICT_LOW_PART
3243                      || GET_CODE (new_i2_dest) == SUBREG)
3244                 new_i2_dest = XEXP (new_i2_dest, 0);
3245
3246               if (REG_P (new_i3_dest)
3247                   && REG_P (new_i2_dest)
3248                   && REGNO (new_i3_dest) == REGNO (new_i2_dest))
3249                 INC_REG_N_SETS (REGNO (new_i2_dest), 1);
3250             }
3251         }
3252
3253       /* If we can split it and use I2DEST, go ahead and see if that
3254          helps things be recognized.  Verify that none of the registers
3255          are set between I2 and I3.  */
3256       if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
3257 #ifdef HAVE_cc0
3258           && REG_P (i2dest)
3259 #endif
3260           /* We need I2DEST in the proper mode.  If it is a hard register
3261              or the only use of a pseudo, we can change its mode.
3262              Make sure we don't change a hard register to have a mode that
3263              isn't valid for it, or change the number of registers.  */
3264           && (GET_MODE (*split) == GET_MODE (i2dest)
3265               || GET_MODE (*split) == VOIDmode
3266               || can_change_dest_mode (i2dest, added_sets_2,
3267                                        GET_MODE (*split)))
3268           && (next_real_insn (i2) == i3
3269               || ! use_crosses_set_p (*split, DF_INSN_LUID (i2)))
3270           /* We can't overwrite I2DEST if its value is still used by
3271              NEWPAT.  */
3272           && ! reg_referenced_p (i2dest, newpat))
3273         {
3274           rtx newdest = i2dest;
3275           enum rtx_code split_code = GET_CODE (*split);
3276           enum machine_mode split_mode = GET_MODE (*split);
3277           bool subst_done = false;
3278           newi2pat = NULL_RTX;
3279
3280           i2scratch = true;
3281
3282           /* Get NEWDEST as a register in the proper mode.  We have already
3283              validated that we can do this.  */
3284           if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
3285             {
3286               if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3287                 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
3288               else
3289                 {
3290                   SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], split_mode);
3291                   newdest = regno_reg_rtx[REGNO (i2dest)];
3292                 }
3293             }
3294
3295           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
3296              an ASHIFT.  This can occur if it was inside a PLUS and hence
3297              appeared to be a memory address.  This is a kludge.  */
3298           if (split_code == MULT
3299               && CONST_INT_P (XEXP (*split, 1))
3300               && INTVAL (XEXP (*split, 1)) > 0
3301               && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
3302             {
3303               SUBST (*split, gen_rtx_ASHIFT (split_mode,
3304                                              XEXP (*split, 0), GEN_INT (i)));
3305               /* Update split_code because we may not have a multiply
3306                  anymore.  */
3307               split_code = GET_CODE (*split);
3308             }
3309
3310 #ifdef INSN_SCHEDULING
3311           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
3312              be written as a ZERO_EXTEND.  */
3313           if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
3314             {
3315 #ifdef LOAD_EXTEND_OP
3316               /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
3317                  what it really is.  */
3318               if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (*split)))
3319                   == SIGN_EXTEND)
3320                 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
3321                                                     SUBREG_REG (*split)));
3322               else
3323 #endif
3324                 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
3325                                                     SUBREG_REG (*split)));
3326             }
3327 #endif
3328
3329           /* Attempt to split binary operators using arithmetic identities.  */
3330           if (BINARY_P (SET_SRC (newpat))
3331               && split_mode == GET_MODE (SET_SRC (newpat))
3332               && ! side_effects_p (SET_SRC (newpat)))
3333             {
3334               rtx setsrc = SET_SRC (newpat);
3335               enum machine_mode mode = GET_MODE (setsrc);
3336               enum rtx_code code = GET_CODE (setsrc);
3337               rtx src_op0 = XEXP (setsrc, 0);
3338               rtx src_op1 = XEXP (setsrc, 1);
3339
3340               /* Split "X = Y op Y" as "Z = Y; X = Z op Z".  */
3341               if (rtx_equal_p (src_op0, src_op1))
3342                 {
3343                   newi2pat = gen_rtx_SET (VOIDmode, newdest, src_op0);
3344                   SUBST (XEXP (setsrc, 0), newdest);
3345                   SUBST (XEXP (setsrc, 1), newdest);
3346                   subst_done = true;
3347                 }
3348               /* Split "((P op Q) op R) op S" where op is PLUS or MULT.  */
3349               else if ((code == PLUS || code == MULT)
3350                        && GET_CODE (src_op0) == code
3351                        && GET_CODE (XEXP (src_op0, 0)) == code
3352                        && (INTEGRAL_MODE_P (mode)
3353                            || (FLOAT_MODE_P (mode)
3354                                && flag_unsafe_math_optimizations)))
3355                 {
3356                   rtx p = XEXP (XEXP (src_op0, 0), 0);
3357                   rtx q = XEXP (XEXP (src_op0, 0), 1);
3358                   rtx r = XEXP (src_op0, 1);
3359                   rtx s = src_op1;
3360
3361                   /* Split both "((X op Y) op X) op Y" and
3362                      "((X op Y) op Y) op X" as "T op T" where T is
3363                      "X op Y".  */
3364                   if ((rtx_equal_p (p,r) && rtx_equal_p (q,s))
3365                        || (rtx_equal_p (p,s) && rtx_equal_p (q,r)))
3366                     {
3367                       newi2pat = gen_rtx_SET (VOIDmode, newdest,
3368                                               XEXP (src_op0, 0));
3369                       SUBST (XEXP (setsrc, 0), newdest);
3370                       SUBST (XEXP (setsrc, 1), newdest);
3371                       subst_done = true;
3372                     }
3373                   /* Split "((X op X) op Y) op Y)" as "T op T" where
3374                      T is "X op Y".  */
3375                   else if (rtx_equal_p (p,q) && rtx_equal_p (r,s))
3376                     {
3377                       rtx tmp = simplify_gen_binary (code, mode, p, r);
3378                       newi2pat = gen_rtx_SET (VOIDmode, newdest, tmp);
3379                       SUBST (XEXP (setsrc, 0), newdest);
3380                       SUBST (XEXP (setsrc, 1), newdest);
3381                       subst_done = true;
3382                     }
3383                 }
3384             }
3385
3386           if (!subst_done)
3387             {
3388               newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
3389               SUBST (*split, newdest);
3390             }
3391
3392           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3393
3394           /* recog_for_combine might have added CLOBBERs to newi2pat.
3395              Make sure NEWPAT does not depend on the clobbered regs.  */
3396           if (GET_CODE (newi2pat) == PARALLEL)
3397             for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3398               if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3399                 {
3400                   rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3401                   if (reg_overlap_mentioned_p (reg, newpat))
3402                     {
3403                       undo_all ();
3404                       return 0;
3405                     }
3406                 }
3407
3408           /* If the split point was a MULT and we didn't have one before,
3409              don't use one now.  */
3410           if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
3411             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3412         }
3413     }
3414
3415   /* Check for a case where we loaded from memory in a narrow mode and
3416      then sign extended it, but we need both registers.  In that case,
3417      we have a PARALLEL with both loads from the same memory location.
3418      We can split this into a load from memory followed by a register-register
3419      copy.  This saves at least one insn, more if register allocation can
3420      eliminate the copy.
3421
3422      We cannot do this if the destination of the first assignment is a
3423      condition code register or cc0.  We eliminate this case by making sure
3424      the SET_DEST and SET_SRC have the same mode.
3425
3426      We cannot do this if the destination of the second assignment is
3427      a register that we have already assumed is zero-extended.  Similarly
3428      for a SUBREG of such a register.  */
3429
3430   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3431            && GET_CODE (newpat) == PARALLEL
3432            && XVECLEN (newpat, 0) == 2
3433            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3434            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
3435            && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
3436                == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
3437            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3438            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3439                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
3440            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3441                                    DF_INSN_LUID (i2))
3442            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3443            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3444            && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
3445                  (REG_P (temp)
3446                   && VEC_index (reg_stat_type, reg_stat,
3447                                 REGNO (temp))->nonzero_bits != 0
3448                   && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
3449                   && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
3450                   && (VEC_index (reg_stat_type, reg_stat,
3451                                  REGNO (temp))->nonzero_bits
3452                       != GET_MODE_MASK (word_mode))))
3453            && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
3454                  && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
3455                      (REG_P (temp)
3456                       && VEC_index (reg_stat_type, reg_stat,
3457                                     REGNO (temp))->nonzero_bits != 0
3458                       && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
3459                       && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
3460                       && (VEC_index (reg_stat_type, reg_stat,
3461                                      REGNO (temp))->nonzero_bits
3462                           != GET_MODE_MASK (word_mode)))))
3463            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3464                                          SET_SRC (XVECEXP (newpat, 0, 1)))
3465            && ! find_reg_note (i3, REG_UNUSED,
3466                                SET_DEST (XVECEXP (newpat, 0, 0))))
3467     {
3468       rtx ni2dest;
3469
3470       newi2pat = XVECEXP (newpat, 0, 0);
3471       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
3472       newpat = XVECEXP (newpat, 0, 1);
3473       SUBST (SET_SRC (newpat),
3474              gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
3475       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3476
3477       if (i2_code_number >= 0)
3478         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3479
3480       if (insn_code_number >= 0)
3481         swap_i2i3 = 1;
3482     }
3483
3484   /* Similarly, check for a case where we have a PARALLEL of two independent
3485      SETs but we started with three insns.  In this case, we can do the sets
3486      as two separate insns.  This case occurs when some SET allows two
3487      other insns to combine, but the destination of that SET is still live.  */
3488
3489   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3490            && GET_CODE (newpat) == PARALLEL
3491            && XVECLEN (newpat, 0) == 2
3492            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3493            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
3494            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
3495            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3496            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3497            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3498            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3499                                    DF_INSN_LUID (i2))
3500            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3501                                   XVECEXP (newpat, 0, 0))
3502            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
3503                                   XVECEXP (newpat, 0, 1))
3504            && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
3505                  && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1))))
3506 #ifdef HAVE_cc0
3507            /* We cannot split the parallel into two sets if both sets
3508               reference cc0.  */
3509            && ! (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0))
3510                  && reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 1)))
3511 #endif
3512            )
3513     {
3514       /* Normally, it doesn't matter which of the two is done first,
3515          but it does if one references cc0.  In that case, it has to
3516          be first.  */
3517 #ifdef HAVE_cc0
3518       if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
3519         {
3520           newi2pat = XVECEXP (newpat, 0, 0);
3521           newpat = XVECEXP (newpat, 0, 1);
3522         }
3523       else
3524 #endif
3525         {
3526           newi2pat = XVECEXP (newpat, 0, 1);
3527           newpat = XVECEXP (newpat, 0, 0);
3528         }
3529
3530       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3531
3532       if (i2_code_number >= 0)
3533         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3534     }
3535
3536   /* If it still isn't recognized, fail and change things back the way they
3537      were.  */
3538   if ((insn_code_number < 0
3539        /* Is the result a reasonable ASM_OPERANDS?  */
3540        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
3541     {
3542       undo_all ();
3543       return 0;
3544     }
3545
3546   /* If we had to change another insn, make sure it is valid also.  */
3547   if (undobuf.other_insn)
3548     {
3549       CLEAR_HARD_REG_SET (newpat_used_regs);
3550
3551       other_pat = PATTERN (undobuf.other_insn);
3552       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
3553                                              &new_other_notes);
3554
3555       if (other_code_number < 0 && ! check_asm_operands (other_pat))
3556         {
3557           undo_all ();
3558           return 0;
3559         }
3560     }
3561
3562 #ifdef HAVE_cc0
3563   /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
3564      they are adjacent to each other or not.  */
3565   {
3566     rtx p = prev_nonnote_insn (i3);
3567     if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
3568         && sets_cc0_p (newi2pat))
3569       {
3570         undo_all ();
3571         return 0;
3572       }
3573   }
3574 #endif
3575
3576   /* Only allow this combination if insn_rtx_costs reports that the
3577      replacement instructions are cheaper than the originals.  */
3578   if (!combine_validate_cost (i1, i2, i3, newpat, newi2pat, other_pat))
3579     {
3580       undo_all ();
3581       return 0;
3582     }
3583
3584   if (MAY_HAVE_DEBUG_INSNS)
3585     {
3586       struct undo *undo;
3587
3588       for (undo = undobuf.undos; undo; undo = undo->next)
3589         if (undo->kind == UNDO_MODE)
3590           {
3591             rtx reg = *undo->where.r;
3592             enum machine_mode new_mode = GET_MODE (reg);
3593             enum machine_mode old_mode = undo->old_contents.m;
3594
3595             /* Temporarily revert mode back.  */
3596             adjust_reg_mode (reg, old_mode);
3597
3598             if (reg == i2dest && i2scratch)
3599               {
3600                 /* If we used i2dest as a scratch register with a
3601                    different mode, substitute it for the original
3602                    i2src while its original mode is temporarily
3603                    restored, and then clear i2scratch so that we don't
3604                    do it again later.  */
3605                 propagate_for_debug (i2, i3, reg, i2src, false);
3606                 i2scratch = false;
3607                 /* Put back the new mode.  */
3608                 adjust_reg_mode (reg, new_mode);
3609               }
3610             else
3611               {
3612                 rtx tempreg = gen_raw_REG (old_mode, REGNO (reg));
3613                 rtx first, last;
3614
3615                 if (reg == i2dest)
3616                   {
3617                     first = i2;
3618                     last = i3;
3619                   }
3620                 else
3621                   {
3622                     first = i3;
3623                     last = undobuf.other_insn;
3624                     gcc_assert (last);
3625                   }
3626
3627                 /* We're dealing with a reg that changed mode but not
3628                    meaning, so we want to turn it into a subreg for
3629                    the new mode.  However, because of REG sharing and
3630                    because its mode had already changed, we have to do
3631                    it in two steps.  First, replace any debug uses of
3632                    reg, with its original mode temporarily restored,
3633                    with this copy we have created; then, replace the
3634                    copy with the SUBREG of the original shared reg,
3635                    once again changed to the new mode.  */
3636                 propagate_for_debug (first, last, reg, tempreg, false);
3637                 adjust_reg_mode (reg, new_mode);
3638                 propagate_for_debug (first, last, tempreg,
3639                                      lowpart_subreg (old_mode, reg, new_mode),
3640                                      false);
3641               }
3642           }
3643     }
3644
3645   /* If we will be able to accept this, we have made a
3646      change to the destination of I3.  This requires us to
3647      do a few adjustments.  */
3648
3649   if (changed_i3_dest)
3650     {
3651       PATTERN (i3) = newpat;
3652       adjust_for_new_dest (i3);
3653     }
3654
3655   /* We now know that we can do this combination.  Merge the insns and
3656      update the status of registers and LOG_LINKS.  */
3657
3658   if (undobuf.other_insn)
3659     {
3660       rtx note, next;
3661
3662       PATTERN (undobuf.other_insn) = other_pat;
3663
3664       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
3665          are still valid.  Then add any non-duplicate notes added by
3666          recog_for_combine.  */
3667       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
3668         {
3669           next = XEXP (note, 1);
3670
3671           if (REG_NOTE_KIND (note) == REG_UNUSED
3672               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
3673             remove_note (undobuf.other_insn, note);
3674         }
3675
3676       distribute_notes (new_other_notes, undobuf.other_insn,
3677                         undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
3678     }
3679
3680   if (swap_i2i3)
3681     {
3682       rtx insn;
3683       rtx link;
3684       rtx ni2dest;
3685
3686       /* I3 now uses what used to be its destination and which is now
3687          I2's destination.  This requires us to do a few adjustments.  */
3688       PATTERN (i3) = newpat;
3689       adjust_for_new_dest (i3);
3690
3691       /* We need a LOG_LINK from I3 to I2.  But we used to have one,
3692          so we still will.
3693
3694          However, some later insn might be using I2's dest and have
3695          a LOG_LINK pointing at I3.  We must remove this link.
3696          The simplest way to remove the link is to point it at I1,
3697          which we know will be a NOTE.  */
3698
3699       /* newi2pat is usually a SET here; however, recog_for_combine might
3700          have added some clobbers.  */
3701       if (GET_CODE (newi2pat) == PARALLEL)
3702         ni2dest = SET_DEST (XVECEXP (newi2pat, 0, 0));
3703       else
3704         ni2dest = SET_DEST (newi2pat);
3705
3706       for (insn = NEXT_INSN (i3);
3707            insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
3708                     || insn != BB_HEAD (this_basic_block->next_bb));
3709            insn = NEXT_INSN (insn))
3710         {
3711           if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
3712             {
3713               for (link = LOG_LINKS (insn); link;
3714                    link = XEXP (link, 1))
3715                 if (XEXP (link, 0) == i3)
3716                   XEXP (link, 0) = i1;
3717
3718               break;
3719             }
3720         }
3721     }
3722
3723   {
3724     rtx i3notes, i2notes, i1notes = 0;
3725     rtx i3links, i2links, i1links = 0;
3726     rtx midnotes = 0;
3727     unsigned int regno;
3728     /* Compute which registers we expect to eliminate.  newi2pat may be setting
3729        either i3dest or i2dest, so we must check it.  Also, i1dest may be the
3730        same as i3dest, in which case newi2pat may be setting i1dest.  */
3731     rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
3732                    || i2dest_in_i2src || i2dest_in_i1src
3733                    || !i2dest_killed
3734                    ? 0 : i2dest);
3735     rtx elim_i1 = (i1 == 0 || i1dest_in_i1src
3736                    || (newi2pat && reg_set_p (i1dest, newi2pat))
3737                    || !i1dest_killed
3738                    ? 0 : i1dest);
3739
3740     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
3741        clear them.  */
3742     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
3743     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
3744     if (i1)
3745       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
3746
3747     /* Ensure that we do not have something that should not be shared but
3748        occurs multiple times in the new insns.  Check this by first
3749        resetting all the `used' flags and then copying anything is shared.  */
3750
3751     reset_used_flags (i3notes);
3752     reset_used_flags (i2notes);
3753     reset_used_flags (i1notes);
3754     reset_used_flags (newpat);
3755     reset_used_flags (newi2pat);
3756     if (undobuf.other_insn)
3757       reset_used_flags (PATTERN (undobuf.other_insn));
3758
3759     i3notes = copy_rtx_if_shared (i3notes);
3760     i2notes = copy_rtx_if_shared (i2notes);
3761     i1notes = copy_rtx_if_shared (i1notes);
3762     newpat = copy_rtx_if_shared (newpat);
3763     newi2pat = copy_rtx_if_shared (newi2pat);
3764     if (undobuf.other_insn)
3765       reset_used_flags (PATTERN (undobuf.other_insn));
3766
3767     INSN_CODE (i3) = insn_code_number;
3768     PATTERN (i3) = newpat;
3769
3770     if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
3771       {
3772         rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
3773
3774         reset_used_flags (call_usage);
3775         call_usage = copy_rtx (call_usage);
3776
3777         if (substed_i2)
3778           replace_rtx (call_usage, i2dest, i2src);
3779
3780         if (substed_i1)
3781           replace_rtx (call_usage, i1dest, i1src);
3782
3783         CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
3784       }
3785
3786     if (undobuf.other_insn)
3787       INSN_CODE (undobuf.other_insn) = other_code_number;
3788
3789     /* We had one special case above where I2 had more than one set and
3790        we replaced a destination of one of those sets with the destination
3791        of I3.  In that case, we have to update LOG_LINKS of insns later
3792        in this basic block.  Note that this (expensive) case is rare.
3793
3794        Also, in this case, we must pretend that all REG_NOTEs for I2
3795        actually came from I3, so that REG_UNUSED notes from I2 will be
3796        properly handled.  */
3797
3798     if (i3_subst_into_i2)
3799       {
3800         for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
3801           if ((GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == SET
3802                || GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == CLOBBER)
3803               && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
3804               && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
3805               && ! find_reg_note (i2, REG_UNUSED,
3806                                   SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
3807             for (temp = NEXT_INSN (i2);
3808                  temp && (this_basic_block->next_bb == EXIT_BLOCK_PTR
3809                           || BB_HEAD (this_basic_block) != temp);
3810                  temp = NEXT_INSN (temp))
3811               if (temp != i3 && INSN_P (temp))
3812                 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
3813                   if (XEXP (link, 0) == i2)
3814                     XEXP (link, 0) = i3;
3815
3816         if (i3notes)
3817           {
3818             rtx link = i3notes;
3819             while (XEXP (link, 1))
3820               link = XEXP (link, 1);
3821             XEXP (link, 1) = i2notes;
3822           }
3823         else
3824           i3notes = i2notes;
3825         i2notes = 0;
3826       }
3827
3828     LOG_LINKS (i3) = 0;
3829     REG_NOTES (i3) = 0;
3830     LOG_LINKS (i2) = 0;
3831     REG_NOTES (i2) = 0;
3832
3833     if (newi2pat)
3834       {
3835         if (MAY_HAVE_DEBUG_INSNS && i2scratch)
3836           propagate_for_debug (i2, i3, i2dest, i2src, false);
3837         INSN_CODE (i2) = i2_code_number;
3838         PATTERN (i2) = newi2pat;
3839       }
3840     else
3841       {
3842         if (MAY_HAVE_DEBUG_INSNS && i2src)
3843           propagate_for_debug (i2, i3, i2dest, i2src, i3_subst_into_i2);
3844         SET_INSN_DELETED (i2);
3845       }
3846
3847     if (i1)
3848       {
3849         LOG_LINKS (i1) = 0;
3850         REG_NOTES (i1) = 0;
3851         if (MAY_HAVE_DEBUG_INSNS)
3852           propagate_for_debug (i1, i3, i1dest, i1src, false);
3853         SET_INSN_DELETED (i1);
3854       }
3855
3856     /* Get death notes for everything that is now used in either I3 or
3857        I2 and used to die in a previous insn.  If we built two new
3858        patterns, move from I1 to I2 then I2 to I3 so that we get the
3859        proper movement on registers that I2 modifies.  */
3860
3861     if (newi2pat)
3862       {
3863         move_deaths (newi2pat, NULL_RTX, DF_INSN_LUID (i1), i2, &midnotes);
3864         move_deaths (newpat, newi2pat, DF_INSN_LUID (i1), i3, &midnotes);
3865       }
3866     else
3867       move_deaths (newpat, NULL_RTX, i1 ? DF_INSN_LUID (i1) : DF_INSN_LUID (i2),
3868                    i3, &midnotes);
3869
3870     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
3871     if (i3notes)
3872       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
3873                         elim_i2, elim_i1);
3874     if (i2notes)
3875       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
3876                         elim_i2, elim_i1);
3877     if (i1notes)
3878       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
3879                         elim_i2, elim_i1);
3880     if (midnotes)
3881       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3882                         elim_i2, elim_i1);
3883
3884     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
3885        know these are REG_UNUSED and want them to go to the desired insn,
3886        so we always pass it as i3.  */
3887
3888     if (newi2pat && new_i2_notes)
3889       distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3890
3891     if (new_i3_notes)
3892       distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
3893
3894     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
3895        put a REG_DEAD note for it somewhere.  If NEWI2PAT exists and sets
3896        I3DEST, the death must be somewhere before I2, not I3.  If we passed I3
3897        in that case, it might delete I2.  Similarly for I2 and I1.
3898        Show an additional death due to the REG_DEAD note we make here.  If
3899        we discard it in distribute_notes, we will decrement it again.  */
3900
3901     if (i3dest_killed)
3902       {
3903         if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
3904           distribute_notes (alloc_reg_note (REG_DEAD, i3dest_killed,
3905                                             NULL_RTX),
3906                             NULL_RTX, i2, NULL_RTX, elim_i2, elim_i1);
3907         else
3908           distribute_notes (alloc_reg_note (REG_DEAD, i3dest_killed,
3909                                             NULL_RTX),
3910                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3911                             elim_i2, elim_i1);
3912       }
3913
3914     if (i2dest_in_i2src)
3915       {
3916         if (newi2pat && reg_set_p (i2dest, newi2pat))
3917           distribute_notes (alloc_reg_note (REG_DEAD, i2dest, NULL_RTX),
3918                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3919         else
3920           distribute_notes (alloc_reg_note (REG_DEAD, i2dest, NULL_RTX),
3921                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3922                             NULL_RTX, NULL_RTX);
3923       }
3924
3925     if (i1dest_in_i1src)
3926       {
3927         if (newi2pat && reg_set_p (i1dest, newi2pat))
3928           distribute_notes (alloc_reg_note (REG_DEAD, i1dest, NULL_RTX),
3929                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3930         else
3931           distribute_notes (alloc_reg_note (REG_DEAD, i1dest, NULL_RTX),
3932                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3933                             NULL_RTX, NULL_RTX);
3934       }
3935
3936     distribute_links (i3links);
3937     distribute_links (i2links);
3938     distribute_links (i1links);
3939
3940     if (REG_P (i2dest))
3941       {
3942         rtx link;
3943         rtx i2_insn = 0, i2_val = 0, set;
3944
3945         /* The insn that used to set this register doesn't exist, and
3946            this life of the register may not exist either.  See if one of
3947            I3's links points to an insn that sets I2DEST.  If it does,
3948            that is now the last known value for I2DEST. If we don't update
3949            this and I2 set the register to a value that depended on its old
3950            contents, we will get confused.  If this insn is used, thing
3951            will be set correctly in combine_instructions.  */
3952
3953         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
3954           if ((set = single_set (XEXP (link, 0))) != 0
3955               && rtx_equal_p (i2dest, SET_DEST (set)))
3956             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
3957
3958         record_value_for_reg (i2dest, i2_insn, i2_val);
3959
3960         /* If the reg formerly set in I2 died only once and that was in I3,
3961            zero its use count so it won't make `reload' do any work.  */
3962         if (! added_sets_2
3963             && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
3964             && ! i2dest_in_i2src)
3965           {
3966             regno = REGNO (i2dest);
3967             INC_REG_N_SETS (regno, -1);
3968           }
3969       }
3970
3971     if (i1 && REG_P (i1dest))
3972       {
3973         rtx link;
3974         rtx i1_insn = 0, i1_val = 0, set;
3975
3976         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
3977           if ((set = single_set (XEXP (link, 0))) != 0
3978               && rtx_equal_p (i1dest, SET_DEST (set)))
3979             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
3980
3981         record_value_for_reg (i1dest, i1_insn, i1_val);
3982
3983         regno = REGNO (i1dest);
3984         if (! added_sets_1 && ! i1dest_in_i1src)
3985           INC_REG_N_SETS (regno, -1);
3986       }
3987
3988     /* Update reg_stat[].nonzero_bits et al for any changes that may have
3989        been made to this insn.  The order of
3990        set_nonzero_bits_and_sign_copies() is important.  Because newi2pat
3991        can affect nonzero_bits of newpat */
3992     if (newi2pat)
3993       note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
3994     note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
3995   }
3996
3997   if (undobuf.other_insn != NULL_RTX)
3998     {
3999       if (dump_file)
4000         {
4001           fprintf (dump_file, "modifying other_insn ");
4002           dump_insn_slim (dump_file, undobuf.other_insn);
4003         }
4004       df_insn_rescan (undobuf.other_insn);
4005     }
4006
4007   if (i1 && !(NOTE_P(i1) && (NOTE_KIND (i1) == NOTE_INSN_DELETED)))
4008     {
4009       if (dump_file)
4010         {
4011           fprintf (dump_file, "modifying insn i1 ");
4012           dump_insn_slim (dump_file, i1);
4013         }
4014       df_insn_rescan (i1);
4015     }
4016
4017   if (i2 && !(NOTE_P(i2) && (NOTE_KIND (i2) == NOTE_INSN_DELETED)))
4018     {
4019       if (dump_file)
4020         {
4021           fprintf (dump_file, "modifying insn i2 ");
4022           dump_insn_slim (dump_file, i2);
4023         }
4024       df_insn_rescan (i2);
4025     }
4026
4027   if (i3 && !(NOTE_P(i3) && (NOTE_KIND (i3) == NOTE_INSN_DELETED)))
4028     {
4029       if (dump_file)
4030         {
4031           fprintf (dump_file, "modifying insn i3 ");
4032           dump_insn_slim (dump_file, i3);
4033         }
4034       df_insn_rescan (i3);
4035     }
4036
4037   /* Set new_direct_jump_p if a new return or simple jump instruction
4038      has been created.  Adjust the CFG accordingly.  */
4039
4040   if (returnjump_p (i3) || any_uncondjump_p (i3))
4041     {
4042       *new_direct_jump_p = 1;
4043       mark_jump_label (PATTERN (i3), i3, 0);
4044       update_cfg_for_uncondjump (i3);
4045     }
4046
4047   if (undobuf.other_insn != NULL_RTX
4048       && (returnjump_p (undobuf.other_insn)
4049           || any_uncondjump_p (undobuf.other_insn)))
4050     {
4051       *new_direct_jump_p = 1;
4052       update_cfg_for_uncondjump (undobuf.other_insn);
4053     }
4054
4055   /* A noop might also need cleaning up of CFG, if it comes from the
4056      simplification of a jump.  */
4057   if (GET_CODE (newpat) == SET
4058       && SET_SRC (newpat) == pc_rtx
4059       && SET_DEST (newpat) == pc_rtx)
4060     {
4061       *new_direct_jump_p = 1;
4062       update_cfg_for_uncondjump (i3);
4063     }
4064
4065   combine_successes++;
4066   undo_commit ();
4067
4068   if (added_links_insn
4069       && (newi2pat == 0 || DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i2))
4070       && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i3))
4071     return added_links_insn;
4072   else
4073     return newi2pat ? i2 : i3;
4074 }
4075 \f
4076 /* Undo all the modifications recorded in undobuf.  */
4077
4078 static void
4079 undo_all (void)
4080 {
4081   struct undo *undo, *next;
4082
4083   for (undo = undobuf.undos; undo; undo = next)
4084     {
4085       next = undo->next;
4086       switch (undo->kind)
4087         {
4088         case UNDO_RTX:
4089           *undo->where.r = undo->old_contents.r;
4090           break;
4091         case UNDO_INT:
4092           *undo->where.i = undo->old_contents.i;
4093           break;
4094         case UNDO_MODE:
4095           adjust_reg_mode (*undo->where.r, undo->old_contents.m);
4096           break;
4097         default:
4098           gcc_unreachable ();
4099         }
4100
4101       undo->next = undobuf.frees;
4102       undobuf.frees = undo;
4103     }
4104
4105   undobuf.undos = 0;
4106 }
4107
4108 /* We've committed to accepting the changes we made.  Move all
4109    of the undos to the free list.  */
4110
4111 static void
4112 undo_commit (void)
4113 {
4114   struct undo *undo, *next;
4115
4116   for (undo = undobuf.undos; undo; undo = next)
4117     {
4118       next = undo->next;
4119       undo->next = undobuf.frees;
4120       undobuf.frees = undo;
4121     }
4122   undobuf.undos = 0;
4123 }
4124 \f
4125 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
4126    where we have an arithmetic expression and return that point.  LOC will
4127    be inside INSN.
4128
4129    try_combine will call this function to see if an insn can be split into
4130    two insns.  */
4131
4132 static rtx *
4133 find_split_point (rtx *loc, rtx insn)
4134 {
4135   rtx x = *loc;
4136   enum rtx_code code = GET_CODE (x);
4137   rtx *split;
4138   unsigned HOST_WIDE_INT len = 0;
4139   HOST_WIDE_INT pos = 0;
4140   int unsignedp = 0;
4141   rtx inner = NULL_RTX;
4142
4143   /* First special-case some codes.  */
4144   switch (code)
4145     {
4146     case SUBREG:
4147 #ifdef INSN_SCHEDULING
4148       /* If we are making a paradoxical SUBREG invalid, it becomes a split
4149          point.  */
4150       if (MEM_P (SUBREG_REG (x)))
4151         return loc;
4152 #endif
4153       return find_split_point (&SUBREG_REG (x), insn);
4154
4155     case MEM:
4156 #ifdef HAVE_lo_sum
4157       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
4158          using LO_SUM and HIGH.  */
4159       if (GET_CODE (XEXP (x, 0)) == CONST
4160           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
4161         {
4162           enum machine_mode address_mode
4163             = targetm.addr_space.address_mode (MEM_ADDR_SPACE (x));
4164
4165           SUBST (XEXP (x, 0),
4166                  gen_rtx_LO_SUM (address_mode,
4167                                  gen_rtx_HIGH (address_mode, XEXP (x, 0)),
4168                                  XEXP (x, 0)));
4169           return &XEXP (XEXP (x, 0), 0);
4170         }
4171 #endif
4172
4173       /* If we have a PLUS whose second operand is a constant and the
4174          address is not valid, perhaps will can split it up using
4175          the machine-specific way to split large constants.  We use
4176          the first pseudo-reg (one of the virtual regs) as a placeholder;
4177          it will not remain in the result.  */
4178       if (GET_CODE (XEXP (x, 0)) == PLUS
4179           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
4180           && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4181                                             MEM_ADDR_SPACE (x)))
4182         {
4183           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
4184           rtx seq = combine_split_insns (gen_rtx_SET (VOIDmode, reg,
4185                                                       XEXP (x, 0)),
4186                                          subst_insn);
4187
4188           /* This should have produced two insns, each of which sets our
4189              placeholder.  If the source of the second is a valid address,
4190              we can make put both sources together and make a split point
4191              in the middle.  */
4192
4193           if (seq
4194               && NEXT_INSN (seq) != NULL_RTX
4195               && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
4196               && NONJUMP_INSN_P (seq)
4197               && GET_CODE (PATTERN (seq)) == SET
4198               && SET_DEST (PATTERN (seq)) == reg
4199               && ! reg_mentioned_p (reg,
4200                                     SET_SRC (PATTERN (seq)))
4201               && NONJUMP_INSN_P (NEXT_INSN (seq))
4202               && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
4203               && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
4204               && memory_address_addr_space_p
4205                    (GET_MODE (x), SET_SRC (PATTERN (NEXT_INSN (seq))),
4206                     MEM_ADDR_SPACE (x)))
4207             {
4208               rtx src1 = SET_SRC (PATTERN (seq));
4209               rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
4210
4211               /* Replace the placeholder in SRC2 with SRC1.  If we can
4212                  find where in SRC2 it was placed, that can become our
4213                  split point and we can replace this address with SRC2.
4214                  Just try two obvious places.  */
4215
4216               src2 = replace_rtx (src2, reg, src1);
4217               split = 0;
4218               if (XEXP (src2, 0) == src1)
4219                 split = &XEXP (src2, 0);
4220               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
4221                        && XEXP (XEXP (src2, 0), 0) == src1)
4222                 split = &XEXP (XEXP (src2, 0), 0);
4223
4224               if (split)
4225                 {
4226                   SUBST (XEXP (x, 0), src2);
4227                   return split;
4228                 }
4229             }
4230
4231           /* If that didn't work, perhaps the first operand is complex and
4232              needs to be computed separately, so make a split point there.
4233              This will occur on machines that just support REG + CONST
4234              and have a constant moved through some previous computation.  */
4235
4236           else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
4237                    && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4238                          && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4239             return &XEXP (XEXP (x, 0), 0);
4240         }
4241
4242       /* If we have a PLUS whose first operand is complex, try computing it
4243          separately by making a split there.  */
4244       if (GET_CODE (XEXP (x, 0)) == PLUS
4245           && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4246                                             MEM_ADDR_SPACE (x))
4247           && ! OBJECT_P (XEXP (XEXP (x, 0), 0))
4248           && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4249                 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4250         return &XEXP (XEXP (x, 0), 0);
4251       break;
4252
4253     case SET:
4254 #ifdef HAVE_cc0
4255       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
4256          ZERO_EXTRACT, the most likely reason why this doesn't match is that
4257          we need to put the operand into a register.  So split at that
4258          point.  */
4259
4260       if (SET_DEST (x) == cc0_rtx
4261           && GET_CODE (SET_SRC (x)) != COMPARE
4262           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
4263           && !OBJECT_P (SET_SRC (x))
4264           && ! (GET_CODE (SET_SRC (x)) == SUBREG
4265                 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
4266         return &SET_SRC (x);
4267 #endif
4268
4269       /* See if we can split SET_SRC as it stands.  */
4270       split = find_split_point (&SET_SRC (x), insn);
4271       if (split && split != &SET_SRC (x))
4272         return split;
4273
4274       /* See if we can split SET_DEST as it stands.  */
4275       split = find_split_point (&SET_DEST (x), insn);
4276       if (split && split != &SET_DEST (x))
4277         return split;
4278
4279       /* See if this is a bitfield assignment with everything constant.  If
4280          so, this is an IOR of an AND, so split it into that.  */
4281       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
4282           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
4283               <= HOST_BITS_PER_WIDE_INT)
4284           && CONST_INT_P (XEXP (SET_DEST (x), 1))
4285           && CONST_INT_P (XEXP (SET_DEST (x), 2))
4286           && CONST_INT_P (SET_SRC (x))
4287           && ((INTVAL (XEXP (SET_DEST (x), 1))
4288                + INTVAL (XEXP (SET_DEST (x), 2)))
4289               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
4290           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
4291         {
4292           HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
4293           unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
4294           unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
4295           rtx dest = XEXP (SET_DEST (x), 0);
4296           enum machine_mode mode = GET_MODE (dest);
4297           unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
4298           rtx or_mask;
4299
4300           if (BITS_BIG_ENDIAN)
4301             pos = GET_MODE_BITSIZE (mode) - len - pos;
4302
4303           or_mask = gen_int_mode (src << pos, mode);
4304           if (src == mask)
4305             SUBST (SET_SRC (x),
4306                    simplify_gen_binary (IOR, mode, dest, or_mask));
4307           else
4308             {
4309               rtx negmask = gen_int_mode (~(mask << pos), mode);
4310               SUBST (SET_SRC (x),
4311                      simplify_gen_binary (IOR, mode,
4312                                           simplify_gen_binary (AND, mode,
4313                                                                dest, negmask),
4314                                           or_mask));
4315             }
4316
4317           SUBST (SET_DEST (x), dest);
4318
4319           split = find_split_point (&SET_SRC (x), insn);
4320           if (split && split != &SET_SRC (x))
4321             return split;
4322         }
4323
4324       /* Otherwise, see if this is an operation that we can split into two.
4325          If so, try to split that.  */
4326       code = GET_CODE (SET_SRC (x));
4327
4328       switch (code)
4329         {
4330         case AND:
4331           /* If we are AND'ing with a large constant that is only a single
4332              bit and the result is only being used in a context where we
4333              need to know if it is zero or nonzero, replace it with a bit
4334              extraction.  This will avoid the large constant, which might
4335              have taken more than one insn to make.  If the constant were
4336              not a valid argument to the AND but took only one insn to make,
4337              this is no worse, but if it took more than one insn, it will
4338              be better.  */
4339
4340           if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4341               && REG_P (XEXP (SET_SRC (x), 0))
4342               && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
4343               && REG_P (SET_DEST (x))
4344               && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
4345               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
4346               && XEXP (*split, 0) == SET_DEST (x)
4347               && XEXP (*split, 1) == const0_rtx)
4348             {
4349               rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
4350                                                 XEXP (SET_SRC (x), 0),
4351                                                 pos, NULL_RTX, 1, 1, 0, 0);
4352               if (extraction != 0)
4353                 {
4354                   SUBST (SET_SRC (x), extraction);
4355                   return find_split_point (loc, insn);
4356                 }
4357             }
4358           break;
4359
4360         case NE:
4361           /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
4362              is known to be on, this can be converted into a NEG of a shift.  */
4363           if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
4364               && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
4365               && 1 <= (pos = exact_log2
4366                        (nonzero_bits (XEXP (SET_SRC (x), 0),
4367                                       GET_MODE (XEXP (SET_SRC (x), 0))))))
4368             {
4369               enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
4370
4371               SUBST (SET_SRC (x),
4372                      gen_rtx_NEG (mode,
4373                                   gen_rtx_LSHIFTRT (mode,
4374                                                     XEXP (SET_SRC (x), 0),
4375                                                     GEN_INT (pos))));
4376
4377               split = find_split_point (&SET_SRC (x), insn);
4378               if (split && split != &SET_SRC (x))
4379                 return split;
4380             }
4381           break;
4382
4383         case SIGN_EXTEND:
4384           inner = XEXP (SET_SRC (x), 0);
4385
4386           /* We can't optimize if either mode is a partial integer
4387              mode as we don't know how many bits are significant
4388              in those modes.  */
4389           if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
4390               || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
4391             break;
4392
4393           pos = 0;
4394           len = GET_MODE_BITSIZE (GET_MODE (inner));
4395           unsignedp = 0;
4396           break;
4397
4398         case SIGN_EXTRACT:
4399         case ZERO_EXTRACT:
4400           if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4401               && CONST_INT_P (XEXP (SET_SRC (x), 2)))
4402             {
4403               inner = XEXP (SET_SRC (x), 0);
4404               len = INTVAL (XEXP (SET_SRC (x), 1));
4405               pos = INTVAL (XEXP (SET_SRC (x), 2));
4406
4407               if (BITS_BIG_ENDIAN)
4408                 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
4409               unsignedp = (code == ZERO_EXTRACT);
4410             }
4411           break;
4412
4413         default:
4414           break;
4415         }
4416
4417       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
4418         {
4419           enum machine_mode mode = GET_MODE (SET_SRC (x));
4420
4421           /* For unsigned, we have a choice of a shift followed by an
4422              AND or two shifts.  Use two shifts for field sizes where the
4423              constant might be too large.  We assume here that we can
4424              always at least get 8-bit constants in an AND insn, which is
4425              true for every current RISC.  */
4426
4427           if (unsignedp && len <= 8)
4428             {
4429               SUBST (SET_SRC (x),
4430                      gen_rtx_AND (mode,
4431                                   gen_rtx_LSHIFTRT
4432                                   (mode, gen_lowpart (mode, inner),
4433                                    GEN_INT (pos)),
4434                                   GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
4435
4436               split = find_split_point (&SET_SRC (x), insn);
4437               if (split && split != &SET_SRC (x))
4438                 return split;
4439             }
4440           else
4441             {
4442               SUBST (SET_SRC (x),
4443                      gen_rtx_fmt_ee
4444                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
4445                       gen_rtx_ASHIFT (mode,
4446                                       gen_lowpart (mode, inner),
4447                                       GEN_INT (GET_MODE_BITSIZE (mode)
4448                                                - len - pos)),
4449                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
4450
4451               split = find_split_point (&SET_SRC (x), insn);
4452               if (split && split != &SET_SRC (x))
4453                 return split;
4454             }
4455         }
4456
4457       /* See if this is a simple operation with a constant as the second
4458          operand.  It might be that this constant is out of range and hence
4459          could be used as a split point.  */
4460       if (BINARY_P (SET_SRC (x))
4461           && CONSTANT_P (XEXP (SET_SRC (x), 1))
4462           && (OBJECT_P (XEXP (SET_SRC (x), 0))
4463               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
4464                   && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
4465         return &XEXP (SET_SRC (x), 1);
4466
4467       /* Finally, see if this is a simple operation with its first operand
4468          not in a register.  The operation might require this operand in a
4469          register, so return it as a split point.  We can always do this
4470          because if the first operand were another operation, we would have
4471          already found it as a split point.  */
4472       if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
4473           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
4474         return &XEXP (SET_SRC (x), 0);
4475
4476       return 0;
4477
4478     case AND:
4479     case IOR:
4480       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
4481          it is better to write this as (not (ior A B)) so we can split it.
4482          Similarly for IOR.  */
4483       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
4484         {
4485           SUBST (*loc,
4486                  gen_rtx_NOT (GET_MODE (x),
4487                               gen_rtx_fmt_ee (code == IOR ? AND : IOR,
4488                                               GET_MODE (x),
4489                                               XEXP (XEXP (x, 0), 0),
4490                                               XEXP (XEXP (x, 1), 0))));
4491           return find_split_point (loc, insn);
4492         }
4493
4494       /* Many RISC machines have a large set of logical insns.  If the
4495          second operand is a NOT, put it first so we will try to split the
4496          other operand first.  */
4497       if (GET_CODE (XEXP (x, 1)) == NOT)
4498         {
4499           rtx tem = XEXP (x, 0);
4500           SUBST (XEXP (x, 0), XEXP (x, 1));
4501           SUBST (XEXP (x, 1), tem);
4502         }
4503       break;
4504
4505     default:
4506       break;
4507     }
4508
4509   /* Otherwise, select our actions depending on our rtx class.  */
4510   switch (GET_RTX_CLASS (code))
4511     {
4512     case RTX_BITFIELD_OPS:              /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
4513     case RTX_TERNARY:
4514       split = find_split_point (&XEXP (x, 2), insn);
4515       if (split)
4516         return split;
4517       /* ... fall through ...  */
4518     case RTX_BIN_ARITH:
4519     case RTX_COMM_ARITH:
4520     case RTX_COMPARE:
4521     case RTX_COMM_COMPARE:
4522       split = find_split_point (&XEXP (x, 1), insn);
4523       if (split)
4524         return split;
4525       /* ... fall through ...  */
4526     case RTX_UNARY:
4527       /* Some machines have (and (shift ...) ...) insns.  If X is not
4528          an AND, but XEXP (X, 0) is, use it as our split point.  */
4529       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
4530         return &XEXP (x, 0);
4531
4532       split = find_split_point (&XEXP (x, 0), insn);
4533       if (split)
4534         return split;
4535       return loc;
4536
4537     default:
4538       /* Otherwise, we don't have a split point.  */
4539       return 0;
4540     }
4541 }
4542 \f
4543 /* Throughout X, replace FROM with TO, and return the result.
4544    The result is TO if X is FROM;
4545    otherwise the result is X, but its contents may have been modified.
4546    If they were modified, a record was made in undobuf so that
4547    undo_all will (among other things) return X to its original state.
4548
4549    If the number of changes necessary is too much to record to undo,
4550    the excess changes are not made, so the result is invalid.
4551    The changes already made can still be undone.
4552    undobuf.num_undo is incremented for such changes, so by testing that
4553    the caller can tell whether the result is valid.
4554
4555    `n_occurrences' is incremented each time FROM is replaced.
4556
4557    IN_DEST is nonzero if we are processing the SET_DEST of a SET.
4558
4559    UNIQUE_COPY is nonzero if each substitution must be unique.  We do this
4560    by copying if `n_occurrences' is nonzero.  */
4561
4562 static rtx
4563 subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
4564 {
4565   enum rtx_code code = GET_CODE (x);
4566   enum machine_mode op0_mode = VOIDmode;
4567   const char *fmt;
4568   int len, i;
4569   rtx new_rtx;
4570
4571 /* Two expressions are equal if they are identical copies of a shared
4572    RTX or if they are both registers with the same register number
4573    and mode.  */
4574
4575 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
4576   ((X) == (Y)                                           \
4577    || (REG_P (X) && REG_P (Y)   \
4578        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
4579
4580   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
4581     {
4582       n_occurrences++;
4583       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
4584     }
4585
4586   /* If X and FROM are the same register but different modes, they
4587      will not have been seen as equal above.  However, the log links code
4588      will make a LOG_LINKS entry for that case.  If we do nothing, we
4589      will try to rerecognize our original insn and, when it succeeds,
4590      we will delete the feeding insn, which is incorrect.
4591
4592      So force this insn not to match in this (rare) case.  */
4593   if (! in_dest && code == REG && REG_P (from)
4594       && reg_overlap_mentioned_p (x, from))
4595     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
4596
4597   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
4598      of which may contain things that can be combined.  */
4599   if (code != MEM && code != LO_SUM && OBJECT_P (x))
4600     return x;
4601
4602   /* It is possible to have a subexpression appear twice in the insn.
4603      Suppose that FROM is a register that appears within TO.
4604      Then, after that subexpression has been scanned once by `subst',
4605      the second time it is scanned, TO may be found.  If we were
4606      to scan TO here, we would find FROM within it and create a
4607      self-referent rtl structure which is completely wrong.  */
4608   if (COMBINE_RTX_EQUAL_P (x, to))
4609     return to;
4610
4611   /* Parallel asm_operands need special attention because all of the
4612      inputs are shared across the arms.  Furthermore, unsharing the
4613      rtl results in recognition failures.  Failure to handle this case
4614      specially can result in circular rtl.
4615
4616      Solve this by doing a normal pass across the first entry of the
4617      parallel, and only processing the SET_DESTs of the subsequent
4618      entries.  Ug.  */
4619
4620   if (code == PARALLEL
4621       && GET_CODE (XVECEXP (x, 0, 0)) == SET
4622       && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
4623     {
4624       new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
4625
4626       /* If this substitution failed, this whole thing fails.  */
4627       if (GET_CODE (new_rtx) == CLOBBER
4628           && XEXP (new_rtx, 0) == const0_rtx)
4629         return new_rtx;
4630
4631       SUBST (XVECEXP (x, 0, 0), new_rtx);
4632
4633       for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
4634         {
4635           rtx dest = SET_DEST (XVECEXP (x, 0, i));
4636
4637           if (!REG_P (dest)
4638               && GET_CODE (dest) != CC0
4639               && GET_CODE (dest) != PC)
4640             {
4641               new_rtx = subst (dest, from, to, 0, unique_copy);
4642
4643               /* If this substitution failed, this whole thing fails.  */
4644               if (GET_CODE (new_rtx) == CLOBBER
4645                   && XEXP (new_rtx, 0) == const0_rtx)
4646                 return new_rtx;
4647
4648               SUBST (SET_DEST (XVECEXP (x, 0, i)), new_rtx);
4649             }
4650         }
4651     }
4652   else
4653     {
4654       len = GET_RTX_LENGTH (code);
4655       fmt = GET_RTX_FORMAT (code);
4656
4657       /* We don't need to process a SET_DEST that is a register, CC0,
4658          or PC, so set up to skip this common case.  All other cases
4659          where we want to suppress replacing something inside a
4660          SET_SRC are handled via the IN_DEST operand.  */
4661       if (code == SET
4662           && (REG_P (SET_DEST (x))
4663               || GET_CODE (SET_DEST (x)) == CC0
4664               || GET_CODE (SET_DEST (x)) == PC))
4665         fmt = "ie";
4666
4667       /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
4668          constant.  */
4669       if (fmt[0] == 'e')
4670         op0_mode = GET_MODE (XEXP (x, 0));
4671
4672       for (i = 0; i < len; i++)
4673         {
4674           if (fmt[i] == 'E')
4675             {
4676               int j;
4677               for (j = XVECLEN (x, i) - 1; j >= 0; j--)
4678                 {
4679                   if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
4680                     {
4681                       new_rtx = (unique_copy && n_occurrences
4682                              ? copy_rtx (to) : to);
4683                       n_occurrences++;
4684                     }
4685                   else
4686                     {
4687                       new_rtx = subst (XVECEXP (x, i, j), from, to, 0,
4688                                    unique_copy);
4689
4690                       /* If this substitution failed, this whole thing
4691                          fails.  */
4692                       if (GET_CODE (new_rtx) == CLOBBER
4693                           && XEXP (new_rtx, 0) == const0_rtx)
4694                         return new_rtx;
4695                     }
4696
4697                   SUBST (XVECEXP (x, i, j), new_rtx);
4698                 }
4699             }
4700           else if (fmt[i] == 'e')
4701             {
4702               /* If this is a register being set, ignore it.  */
4703               new_rtx = XEXP (x, i);
4704               if (in_dest
4705                   && i == 0
4706                   && (((code == SUBREG || code == ZERO_EXTRACT)
4707                        && REG_P (new_rtx))
4708                       || code == STRICT_LOW_PART))
4709                 ;
4710
4711               else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
4712                 {
4713                   /* In general, don't install a subreg involving two
4714                      modes not tieable.  It can worsen register
4715                      allocation, and can even make invalid reload
4716                      insns, since the reg inside may need to be copied
4717                      from in the outside mode, and that may be invalid
4718                      if it is an fp reg copied in integer mode.
4719
4720                      We allow two exceptions to this: It is valid if
4721                      it is inside another SUBREG and the mode of that
4722                      SUBREG and the mode of the inside of TO is
4723                      tieable and it is valid if X is a SET that copies
4724                      FROM to CC0.  */
4725
4726                   if (GET_CODE (to) == SUBREG
4727                       && ! MODES_TIEABLE_P (GET_MODE (to),
4728                                             GET_MODE (SUBREG_REG (to)))
4729                       && ! (code == SUBREG
4730                             && MODES_TIEABLE_P (GET_MODE (x),
4731                                                 GET_MODE (SUBREG_REG (to))))
4732 #ifdef HAVE_cc0
4733                       && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
4734 #endif
4735                       )
4736                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
4737
4738 #ifdef CANNOT_CHANGE_MODE_CLASS
4739                   if (code == SUBREG
4740                       && REG_P (to)
4741                       && REGNO (to) < FIRST_PSEUDO_REGISTER
4742                       && REG_CANNOT_CHANGE_MODE_P (REGNO (to),
4743                                                    GET_MODE (to),
4744                                                    GET_MODE (x)))
4745                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
4746 #endif
4747
4748                   new_rtx = (unique_copy && n_occurrences ? copy_rtx (to) : to);
4749                   n_occurrences++;
4750                 }
4751               else
4752                 /* If we are in a SET_DEST, suppress most cases unless we
4753                    have gone inside a MEM, in which case we want to
4754                    simplify the address.  We assume here that things that
4755                    are actually part of the destination have their inner
4756                    parts in the first expression.  This is true for SUBREG,
4757                    STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
4758                    things aside from REG and MEM that should appear in a
4759                    SET_DEST.  */
4760                 new_rtx = subst (XEXP (x, i), from, to,
4761                              (((in_dest
4762                                 && (code == SUBREG || code == STRICT_LOW_PART
4763                                     || code == ZERO_EXTRACT))
4764                                || code == SET)
4765                               && i == 0), unique_copy);
4766
4767               /* If we found that we will have to reject this combination,
4768                  indicate that by returning the CLOBBER ourselves, rather than
4769                  an expression containing it.  This will speed things up as
4770                  well as prevent accidents where two CLOBBERs are considered
4771                  to be equal, thus producing an incorrect simplification.  */
4772
4773               if (GET_CODE (new_rtx) == CLOBBER && XEXP (new_rtx, 0) == const0_rtx)
4774                 return new_rtx;
4775
4776               if (GET_CODE (x) == SUBREG
4777                   && (CONST_INT_P (new_rtx)
4778                       || GET_CODE (new_rtx) == CONST_DOUBLE))
4779                 {
4780                   enum machine_mode mode = GET_MODE (x);
4781
4782                   x = simplify_subreg (GET_MODE (x), new_rtx,
4783                                        GET_MODE (SUBREG_REG (x)),
4784                                        SUBREG_BYTE (x));
4785                   if (! x)
4786                     x = gen_rtx_CLOBBER (mode, const0_rtx);
4787                 }
4788               else if (CONST_INT_P (new_rtx)
4789                        && GET_CODE (x) == ZERO_EXTEND)
4790                 {
4791                   x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
4792                                                 new_rtx, GET_MODE (XEXP (x, 0)));
4793                   gcc_assert (x);
4794                 }
4795               else
4796                 SUBST (XEXP (x, i), new_rtx);
4797             }
4798         }
4799     }
4800
4801   /* Check if we are loading something from the constant pool via float
4802      extension; in this case we would undo compress_float_constant
4803      optimization and degenerate constant load to an immediate value.  */
4804   if (GET_CODE (x) == FLOAT_EXTEND
4805       && MEM_P (XEXP (x, 0))
4806       && MEM_READONLY_P (XEXP (x, 0)))
4807     {
4808       rtx tmp = avoid_constant_pool_reference (x);
4809       if (x != tmp)
4810         return x;
4811     }
4812
4813   /* Try to simplify X.  If the simplification changed the code, it is likely
4814      that further simplification will help, so loop, but limit the number
4815      of repetitions that will be performed.  */
4816
4817   for (i = 0; i < 4; i++)
4818     {
4819       /* If X is sufficiently simple, don't bother trying to do anything
4820          with it.  */
4821       if (code != CONST_INT && code != REG && code != CLOBBER)
4822         x = combine_simplify_rtx (x, op0_mode, in_dest);
4823
4824       if (GET_CODE (x) == code)
4825         break;
4826
4827       code = GET_CODE (x);
4828
4829       /* We no longer know the original mode of operand 0 since we
4830          have changed the form of X)  */
4831       op0_mode = VOIDmode;
4832     }
4833
4834   return x;
4835 }
4836 \f
4837 /* Simplify X, a piece of RTL.  We just operate on the expression at the
4838    outer level; call `subst' to simplify recursively.  Return the new
4839    expression.
4840
4841    OP0_MODE is the original mode of XEXP (x, 0).  IN_DEST is nonzero
4842    if we are inside a SET_DEST.  */
4843
4844 static rtx
4845 combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
4846 {
4847   enum rtx_code code = GET_CODE (x);
4848   enum machine_mode mode = GET_MODE (x);
4849   rtx temp;
4850   int i;
4851
4852   /* If this is a commutative operation, put a constant last and a complex
4853      expression first.  We don't need to do this for comparisons here.  */
4854   if (COMMUTATIVE_ARITH_P (x)
4855       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
4856     {
4857       temp = XEXP (x, 0);
4858       SUBST (XEXP (x, 0), XEXP (x, 1));
4859       SUBST (XEXP (x, 1), temp);
4860     }
4861
4862   /* If this is a simple operation applied to an IF_THEN_ELSE, try
4863      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
4864      things.  Check for cases where both arms are testing the same
4865      condition.
4866
4867      Don't do anything if all operands are very simple.  */
4868
4869   if ((BINARY_P (x)
4870        && ((!OBJECT_P (XEXP (x, 0))
4871             && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4872                   && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
4873            || (!OBJECT_P (XEXP (x, 1))
4874                && ! (GET_CODE (XEXP (x, 1)) == SUBREG
4875                      && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
4876       || (UNARY_P (x)
4877           && (!OBJECT_P (XEXP (x, 0))
4878                && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4879                      && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
4880     {
4881       rtx cond, true_rtx, false_rtx;
4882
4883       cond = if_then_else_cond (x, &true_rtx, &false_rtx);
4884       if (cond != 0
4885           /* If everything is a comparison, what we have is highly unlikely
4886              to be simpler, so don't use it.  */
4887           && ! (COMPARISON_P (x)
4888                 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
4889         {
4890           rtx cop1 = const0_rtx;
4891           enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
4892
4893           if (cond_code == NE && COMPARISON_P (cond))
4894             return x;
4895
4896           /* Simplify the alternative arms; this may collapse the true and
4897              false arms to store-flag values.  Be careful to use copy_rtx
4898              here since true_rtx or false_rtx might share RTL with x as a
4899              result of the if_then_else_cond call above.  */
4900           true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0);
4901           false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0);
4902
4903           /* If true_rtx and false_rtx are not general_operands, an if_then_else
4904              is unlikely to be simpler.  */
4905           if (general_operand (true_rtx, VOIDmode)
4906               && general_operand (false_rtx, VOIDmode))
4907             {
4908               enum rtx_code reversed;
4909
4910               /* Restarting if we generate a store-flag expression will cause
4911                  us to loop.  Just drop through in this case.  */
4912
4913               /* If the result values are STORE_FLAG_VALUE and zero, we can
4914                  just make the comparison operation.  */
4915               if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
4916                 x = simplify_gen_relational (cond_code, mode, VOIDmode,
4917                                              cond, cop1);
4918               else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
4919                        && ((reversed = reversed_comparison_code_parts
4920                                         (cond_code, cond, cop1, NULL))
4921                            != UNKNOWN))
4922                 x = simplify_gen_relational (reversed, mode, VOIDmode,
4923                                              cond, cop1);
4924
4925               /* Likewise, we can make the negate of a comparison operation
4926                  if the result values are - STORE_FLAG_VALUE and zero.  */
4927               else if (CONST_INT_P (true_rtx)
4928                        && INTVAL (true_rtx) == - STORE_FLAG_VALUE
4929                        && false_rtx == const0_rtx)
4930                 x = simplify_gen_unary (NEG, mode,
4931                                         simplify_gen_relational (cond_code,
4932                                                                  mode, VOIDmode,
4933                                                                  cond, cop1),
4934                                         mode);
4935               else if (CONST_INT_P (false_rtx)
4936                        && INTVAL (false_rtx) == - STORE_FLAG_VALUE
4937                        && true_rtx == const0_rtx
4938                        && ((reversed = reversed_comparison_code_parts
4939                                         (cond_code, cond, cop1, NULL))
4940                            != UNKNOWN))
4941                 x = simplify_gen_unary (NEG, mode,
4942                                         simplify_gen_relational (reversed,
4943                                                                  mode, VOIDmode,
4944                                                                  cond, cop1),
4945                                         mode);
4946               else
4947                 return gen_rtx_IF_THEN_ELSE (mode,
4948                                              simplify_gen_relational (cond_code,
4949                                                                       mode,
4950                                                                       VOIDmode,
4951                                                                       cond,
4952                                                                       cop1),
4953                                              true_rtx, false_rtx);
4954
4955               code = GET_CODE (x);
4956               op0_mode = VOIDmode;
4957             }
4958         }
4959     }
4960
4961   /* Try to fold this expression in case we have constants that weren't
4962      present before.  */
4963   temp = 0;
4964   switch (GET_RTX_CLASS (code))
4965     {
4966     case RTX_UNARY:
4967       if (op0_mode == VOIDmode)
4968         op0_mode = GET_MODE (XEXP (x, 0));
4969       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
4970       break;
4971     case RTX_COMPARE:
4972     case RTX_COMM_COMPARE:
4973       {
4974         enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
4975         if (cmp_mode == VOIDmode)
4976           {
4977             cmp_mode = GET_MODE (XEXP (x, 1));
4978             if (cmp_mode == VOIDmode)
4979               cmp_mode = op0_mode;
4980           }
4981         temp = simplify_relational_operation (code, mode, cmp_mode,
4982                                               XEXP (x, 0), XEXP (x, 1));
4983       }
4984       break;
4985     case RTX_COMM_ARITH:
4986     case RTX_BIN_ARITH:
4987       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
4988       break;
4989     case RTX_BITFIELD_OPS:
4990     case RTX_TERNARY:
4991       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
4992                                          XEXP (x, 1), XEXP (x, 2));
4993       break;
4994     default:
4995       break;
4996     }
4997
4998   if (temp)
4999     {
5000       x = temp;
5001       code = GET_CODE (temp);
5002       op0_mode = VOIDmode;
5003       mode = GET_MODE (temp);
5004     }
5005
5006   /* First see if we can apply the inverse distributive law.  */
5007   if (code == PLUS || code == MINUS
5008       || code == AND || code == IOR || code == XOR)
5009     {
5010       x = apply_distributive_law (x);
5011       code = GET_CODE (x);
5012       op0_mode = VOIDmode;
5013     }
5014
5015   /* If CODE is an associative operation not otherwise handled, see if we
5016      can associate some operands.  This can win if they are constants or
5017      if they are logically related (i.e. (a & b) & a).  */
5018   if ((code == PLUS || code == MINUS || code == MULT || code == DIV
5019        || code == AND || code == IOR || code == XOR
5020        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
5021       && ((INTEGRAL_MODE_P (mode) && code != DIV)
5022           || (flag_associative_math && FLOAT_MODE_P (mode))))
5023     {
5024       if (GET_CODE (XEXP (x, 0)) == code)
5025         {
5026           rtx other = XEXP (XEXP (x, 0), 0);
5027           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
5028           rtx inner_op1 = XEXP (x, 1);
5029           rtx inner;
5030
5031           /* Make sure we pass the constant operand if any as the second
5032              one if this is a commutative operation.  */
5033           if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
5034             {
5035               rtx tem = inner_op0;
5036               inner_op0 = inner_op1;
5037               inner_op1 = tem;
5038             }
5039           inner = simplify_binary_operation (code == MINUS ? PLUS
5040                                              : code == DIV ? MULT
5041                                              : code,
5042                                              mode, inner_op0, inner_op1);
5043
5044           /* For commutative operations, try the other pair if that one
5045              didn't simplify.  */
5046           if (inner == 0 && COMMUTATIVE_ARITH_P (x))
5047             {
5048               other = XEXP (XEXP (x, 0), 1);
5049               inner = simplify_binary_operation (code, mode,
5050                                                  XEXP (XEXP (x, 0), 0),
5051                                                  XEXP (x, 1));
5052             }
5053
5054           if (inner)
5055             return simplify_gen_binary (code, mode, other, inner);
5056         }
5057     }
5058
5059   /* A little bit of algebraic simplification here.  */
5060   switch (code)
5061     {
5062     case MEM:
5063       /* Ensure that our address has any ASHIFTs converted to MULT in case
5064          address-recognizing predicates are called later.  */
5065       temp = make_compound_operation (XEXP (x, 0), MEM);
5066       SUBST (XEXP (x, 0), temp);
5067       break;
5068
5069     case SUBREG:
5070       if (op0_mode == VOIDmode)
5071         op0_mode = GET_MODE (SUBREG_REG (x));
5072
5073       /* See if this can be moved to simplify_subreg.  */
5074       if (CONSTANT_P (SUBREG_REG (x))
5075           && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
5076              /* Don't call gen_lowpart if the inner mode
5077                 is VOIDmode and we cannot simplify it, as SUBREG without
5078                 inner mode is invalid.  */
5079           && (GET_MODE (SUBREG_REG (x)) != VOIDmode
5080               || gen_lowpart_common (mode, SUBREG_REG (x))))
5081         return gen_lowpart (mode, SUBREG_REG (x));
5082
5083       if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
5084         break;
5085       {
5086         rtx temp;
5087         temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
5088                                 SUBREG_BYTE (x));
5089         if (temp)
5090           return temp;
5091       }
5092
5093       /* Don't change the mode of the MEM if that would change the meaning
5094          of the address.  */
5095       if (MEM_P (SUBREG_REG (x))
5096           && (MEM_VOLATILE_P (SUBREG_REG (x))
5097               || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
5098         return gen_rtx_CLOBBER (mode, const0_rtx);
5099
5100       /* Note that we cannot do any narrowing for non-constants since
5101          we might have been counting on using the fact that some bits were
5102          zero.  We now do this in the SET.  */
5103
5104       break;
5105
5106     case NEG:
5107       temp = expand_compound_operation (XEXP (x, 0));
5108
5109       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
5110          replaced by (lshiftrt X C).  This will convert
5111          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
5112
5113       if (GET_CODE (temp) == ASHIFTRT
5114           && CONST_INT_P (XEXP (temp, 1))
5115           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
5116         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (temp, 0),
5117                                      INTVAL (XEXP (temp, 1)));
5118
5119       /* If X has only a single bit that might be nonzero, say, bit I, convert
5120          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
5121          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
5122          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
5123          or a SUBREG of one since we'd be making the expression more
5124          complex if it was just a register.  */
5125
5126       if (!REG_P (temp)
5127           && ! (GET_CODE (temp) == SUBREG
5128                 && REG_P (SUBREG_REG (temp)))
5129           && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
5130         {
5131           rtx temp1 = simplify_shift_const
5132             (NULL_RTX, ASHIFTRT, mode,
5133              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
5134                                    GET_MODE_BITSIZE (mode) - 1 - i),
5135              GET_MODE_BITSIZE (mode) - 1 - i);
5136
5137           /* If all we did was surround TEMP with the two shifts, we
5138              haven't improved anything, so don't use it.  Otherwise,
5139              we are better off with TEMP1.  */
5140           if (GET_CODE (temp1) != ASHIFTRT
5141               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
5142               || XEXP (XEXP (temp1, 0), 0) != temp)
5143             return temp1;
5144         }
5145       break;
5146
5147     case TRUNCATE:
5148       /* We can't handle truncation to a partial integer mode here
5149          because we don't know the real bitsize of the partial
5150          integer mode.  */
5151       if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
5152         break;
5153
5154       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
5155         SUBST (XEXP (x, 0),
5156                force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
5157                               GET_MODE_MASK (mode), 0));
5158
5159       /* We can truncate a constant value and return it.  */
5160       if (CONST_INT_P (XEXP (x, 0)))
5161         return gen_int_mode (INTVAL (XEXP (x, 0)), mode);
5162
5163       /* Similarly to what we do in simplify-rtx.c, a truncate of a register
5164          whose value is a comparison can be replaced with a subreg if
5165          STORE_FLAG_VALUE permits.  */
5166       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5167           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
5168           && (temp = get_last_value (XEXP (x, 0)))
5169           && COMPARISON_P (temp))
5170         return gen_lowpart (mode, XEXP (x, 0));
5171       break;
5172
5173     case CONST:
5174       /* (const (const X)) can become (const X).  Do it this way rather than
5175          returning the inner CONST since CONST can be shared with a
5176          REG_EQUAL note.  */
5177       if (GET_CODE (XEXP (x, 0)) == CONST)
5178         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
5179       break;
5180
5181 #ifdef HAVE_lo_sum
5182     case LO_SUM:
5183       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
5184          can add in an offset.  find_split_point will split this address up
5185          again if it doesn't match.  */
5186       if (GET_CODE (XEXP (x, 0)) == HIGH
5187           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
5188         return XEXP (x, 1);
5189       break;
5190 #endif
5191
5192     case PLUS:
5193       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
5194          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
5195          bit-field and can be replaced by either a sign_extend or a
5196          sign_extract.  The `and' may be a zero_extend and the two
5197          <c>, -<c> constants may be reversed.  */
5198       if (GET_CODE (XEXP (x, 0)) == XOR
5199           && CONST_INT_P (XEXP (x, 1))
5200           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
5201           && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
5202           && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
5203               || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
5204           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5205           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
5206                && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
5207                && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
5208                    == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
5209               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
5210                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
5211                       == (unsigned int) i + 1))))
5212         return simplify_shift_const
5213           (NULL_RTX, ASHIFTRT, mode,
5214            simplify_shift_const (NULL_RTX, ASHIFT, mode,
5215                                  XEXP (XEXP (XEXP (x, 0), 0), 0),
5216                                  GET_MODE_BITSIZE (mode) - (i + 1)),
5217            GET_MODE_BITSIZE (mode) - (i + 1));
5218
5219       /* If only the low-order bit of X is possibly nonzero, (plus x -1)
5220          can become (ashiftrt (ashift (xor x 1) C) C) where C is
5221          the bitsize of the mode - 1.  This allows simplification of
5222          "a = (b & 8) == 0;"  */
5223       if (XEXP (x, 1) == constm1_rtx
5224           && !REG_P (XEXP (x, 0))
5225           && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5226                 && REG_P (SUBREG_REG (XEXP (x, 0))))
5227           && nonzero_bits (XEXP (x, 0), mode) == 1)
5228         return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
5229            simplify_shift_const (NULL_RTX, ASHIFT, mode,
5230                                  gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
5231                                  GET_MODE_BITSIZE (mode) - 1),
5232            GET_MODE_BITSIZE (mode) - 1);
5233
5234       /* If we are adding two things that have no bits in common, convert
5235          the addition into an IOR.  This will often be further simplified,
5236          for example in cases like ((a & 1) + (a & 2)), which can
5237          become a & 3.  */
5238
5239       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5240           && (nonzero_bits (XEXP (x, 0), mode)
5241               & nonzero_bits (XEXP (x, 1), mode)) == 0)
5242         {
5243           /* Try to simplify the expression further.  */
5244           rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
5245           temp = combine_simplify_rtx (tor, mode, in_dest);
5246
5247           /* If we could, great.  If not, do not go ahead with the IOR
5248              replacement, since PLUS appears in many special purpose
5249              address arithmetic instructions.  */
5250           if (GET_CODE (temp) != CLOBBER && temp != tor)
5251             return temp;
5252         }
5253       break;
5254
5255     case MINUS:
5256       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
5257          (and <foo> (const_int pow2-1))  */
5258       if (GET_CODE (XEXP (x, 1)) == AND
5259           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
5260           && exact_log2 (-INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
5261           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
5262         return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
5263                                        -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
5264       break;
5265
5266     case MULT:
5267       /* If we have (mult (plus A B) C), apply the distributive law and then
5268          the inverse distributive law to see if things simplify.  This
5269          occurs mostly in addresses, often when unrolling loops.  */
5270
5271       if (GET_CODE (XEXP (x, 0)) == PLUS)
5272         {
5273           rtx result = distribute_and_simplify_rtx (x, 0);
5274           if (result)
5275             return result;
5276         }
5277
5278       /* Try simplify a*(b/c) as (a*b)/c.  */
5279       if (FLOAT_MODE_P (mode) && flag_associative_math
5280           && GET_CODE (XEXP (x, 0)) == DIV)
5281         {
5282           rtx tem = simplify_binary_operation (MULT, mode,
5283                                                XEXP (XEXP (x, 0), 0),
5284                                                XEXP (x, 1));
5285           if (tem)
5286             return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
5287         }
5288       break;
5289
5290     case UDIV:
5291       /* If this is a divide by a power of two, treat it as a shift if
5292          its first operand is a shift.  */
5293       if (CONST_INT_P (XEXP (x, 1))
5294           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
5295           && (GET_CODE (XEXP (x, 0)) == ASHIFT
5296               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
5297               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
5298               || GET_CODE (XEXP (x, 0)) == ROTATE
5299               || GET_CODE (XEXP (x, 0)) == ROTATERT))
5300         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
5301       break;
5302
5303     case EQ:  case NE:
5304     case GT:  case GTU:  case GE:  case GEU:
5305     case LT:  case LTU:  case LE:  case LEU:
5306     case UNEQ:  case LTGT:
5307     case UNGT:  case UNGE:
5308     case UNLT:  case UNLE:
5309     case UNORDERED: case ORDERED:
5310       /* If the first operand is a condition code, we can't do anything
5311          with it.  */
5312       if (GET_CODE (XEXP (x, 0)) == COMPARE
5313           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
5314               && ! CC0_P (XEXP (x, 0))))
5315         {
5316           rtx op0 = XEXP (x, 0);
5317           rtx op1 = XEXP (x, 1);
5318           enum rtx_code new_code;
5319
5320           if (GET_CODE (op0) == COMPARE)
5321             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
5322
5323           /* Simplify our comparison, if possible.  */
5324           new_code = simplify_comparison (code, &op0, &op1);
5325
5326           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
5327              if only the low-order bit is possibly nonzero in X (such as when
5328              X is a ZERO_EXTRACT of one bit).  Similarly, we can convert EQ to
5329              (xor X 1) or (minus 1 X); we use the former.  Finally, if X is
5330              known to be either 0 or -1, NE becomes a NEG and EQ becomes
5331              (plus X 1).
5332
5333              Remove any ZERO_EXTRACT we made when thinking this was a
5334              comparison.  It may now be simpler to use, e.g., an AND.  If a
5335              ZERO_EXTRACT is indeed appropriate, it will be placed back by
5336              the call to make_compound_operation in the SET case.  */
5337
5338           if (STORE_FLAG_VALUE == 1
5339               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5340               && op1 == const0_rtx
5341               && mode == GET_MODE (op0)
5342               && nonzero_bits (op0, mode) == 1)
5343             return gen_lowpart (mode,
5344                                 expand_compound_operation (op0));
5345
5346           else if (STORE_FLAG_VALUE == 1
5347                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5348                    && op1 == const0_rtx
5349                    && mode == GET_MODE (op0)
5350                    && (num_sign_bit_copies (op0, mode)
5351                        == GET_MODE_BITSIZE (mode)))
5352             {
5353               op0 = expand_compound_operation (op0);
5354               return simplify_gen_unary (NEG, mode,
5355                                          gen_lowpart (mode, op0),
5356                                          mode);
5357             }
5358
5359           else if (STORE_FLAG_VALUE == 1
5360                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5361                    && op1 == const0_rtx
5362                    && mode == GET_MODE (op0)
5363                    && nonzero_bits (op0, mode) == 1)
5364             {
5365               op0 = expand_compound_operation (op0);
5366               return simplify_gen_binary (XOR, mode,
5367                                           gen_lowpart (mode, op0),
5368                                           const1_rtx);
5369             }
5370
5371           else if (STORE_FLAG_VALUE == 1
5372                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5373                    && op1 == const0_rtx
5374                    && mode == GET_MODE (op0)
5375                    && (num_sign_bit_copies (op0, mode)
5376                        == GET_MODE_BITSIZE (mode)))
5377             {
5378               op0 = expand_compound_operation (op0);
5379               return plus_constant (gen_lowpart (mode, op0), 1);
5380             }
5381
5382           /* If STORE_FLAG_VALUE is -1, we have cases similar to
5383              those above.  */
5384           if (STORE_FLAG_VALUE == -1
5385               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5386               && op1 == const0_rtx
5387               && (num_sign_bit_copies (op0, mode)
5388                   == GET_MODE_BITSIZE (mode)))
5389             return gen_lowpart (mode,
5390                                 expand_compound_operation (op0));
5391
5392           else if (STORE_FLAG_VALUE == -1
5393                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5394                    && op1 == const0_rtx
5395                    && mode == GET_MODE (op0)
5396                    && nonzero_bits (op0, mode) == 1)
5397             {
5398               op0 = expand_compound_operation (op0);
5399               return simplify_gen_unary (NEG, mode,
5400                                          gen_lowpart (mode, op0),
5401                                          mode);
5402             }
5403
5404           else if (STORE_FLAG_VALUE == -1
5405                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5406                    && op1 == const0_rtx
5407                    && mode == GET_MODE (op0)
5408                    && (num_sign_bit_copies (op0, mode)
5409                        == GET_MODE_BITSIZE (mode)))
5410             {
5411               op0 = expand_compound_operation (op0);
5412               return simplify_gen_unary (NOT, mode,
5413                                          gen_lowpart (mode, op0),
5414                                          mode);
5415             }
5416
5417           /* If X is 0/1, (eq X 0) is X-1.  */
5418           else if (STORE_FLAG_VALUE == -1
5419                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5420                    && op1 == const0_rtx
5421                    && mode == GET_MODE (op0)
5422                    && nonzero_bits (op0, mode) == 1)
5423             {
5424               op0 = expand_compound_operation (op0);
5425               return plus_constant (gen_lowpart (mode, op0), -1);
5426             }
5427
5428           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
5429              one bit that might be nonzero, we can convert (ne x 0) to
5430              (ashift x c) where C puts the bit in the sign bit.  Remove any
5431              AND with STORE_FLAG_VALUE when we are done, since we are only
5432              going to test the sign bit.  */
5433           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5434               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5435               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5436                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5437               && op1 == const0_rtx
5438               && mode == GET_MODE (op0)
5439               && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
5440             {
5441               x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
5442                                         expand_compound_operation (op0),
5443                                         GET_MODE_BITSIZE (mode) - 1 - i);
5444               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
5445                 return XEXP (x, 0);
5446               else
5447                 return x;
5448             }
5449
5450           /* If the code changed, return a whole new comparison.  */
5451           if (new_code != code)
5452             return gen_rtx_fmt_ee (new_code, mode, op0, op1);
5453
5454           /* Otherwise, keep this operation, but maybe change its operands.
5455              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
5456           SUBST (XEXP (x, 0), op0);
5457           SUBST (XEXP (x, 1), op1);
5458         }
5459       break;
5460
5461     case IF_THEN_ELSE:
5462       return simplify_if_then_else (x);
5463
5464     case ZERO_EXTRACT:
5465     case SIGN_EXTRACT:
5466     case ZERO_EXTEND:
5467     case SIGN_EXTEND:
5468       /* If we are processing SET_DEST, we are done.  */
5469       if (in_dest)
5470         return x;
5471
5472       return expand_compound_operation (x);
5473
5474     case SET:
5475       return simplify_set (x);
5476
5477     case AND:
5478     case IOR:
5479       return simplify_logical (x);
5480
5481     case ASHIFT:
5482     case LSHIFTRT:
5483     case ASHIFTRT:
5484     case ROTATE:
5485     case ROTATERT:
5486       /* If this is a shift by a constant amount, simplify it.  */
5487       if (CONST_INT_P (XEXP (x, 1)))
5488         return simplify_shift_const (x, code, mode, XEXP (x, 0),
5489                                      INTVAL (XEXP (x, 1)));
5490
5491       else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
5492         SUBST (XEXP (x, 1),
5493                force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
5494                               ((HOST_WIDE_INT) 1
5495                                << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
5496                               - 1,
5497                               0));
5498       break;
5499
5500     default:
5501       break;
5502     }
5503
5504   return x;
5505 }
5506 \f
5507 /* Simplify X, an IF_THEN_ELSE expression.  Return the new expression.  */
5508
5509 static rtx
5510 simplify_if_then_else (rtx x)
5511 {
5512   enum machine_mode mode = GET_MODE (x);
5513   rtx cond = XEXP (x, 0);
5514   rtx true_rtx = XEXP (x, 1);
5515   rtx false_rtx = XEXP (x, 2);
5516   enum rtx_code true_code = GET_CODE (cond);
5517   int comparison_p = COMPARISON_P (cond);
5518   rtx temp;
5519   int i;
5520   enum rtx_code false_code;
5521   rtx reversed;
5522
5523   /* Simplify storing of the truth value.  */
5524   if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
5525     return simplify_gen_relational (true_code, mode, VOIDmode,
5526                                     XEXP (cond, 0), XEXP (cond, 1));
5527
5528   /* Also when the truth value has to be reversed.  */
5529   if (comparison_p
5530       && true_rtx == const0_rtx && false_rtx == const_true_rtx
5531       && (reversed = reversed_comparison (cond, mode)))
5532     return reversed;
5533
5534   /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
5535      in it is being compared against certain values.  Get the true and false
5536      comparisons and see if that says anything about the value of each arm.  */
5537
5538   if (comparison_p
5539       && ((false_code = reversed_comparison_code (cond, NULL))
5540           != UNKNOWN)
5541       && REG_P (XEXP (cond, 0)))
5542     {
5543       HOST_WIDE_INT nzb;
5544       rtx from = XEXP (cond, 0);
5545       rtx true_val = XEXP (cond, 1);
5546       rtx false_val = true_val;
5547       int swapped = 0;
5548
5549       /* If FALSE_CODE is EQ, swap the codes and arms.  */
5550
5551       if (false_code == EQ)
5552         {
5553           swapped = 1, true_code = EQ, false_code = NE;
5554           temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5555         }
5556
5557       /* If we are comparing against zero and the expression being tested has
5558          only a single bit that might be nonzero, that is its value when it is
5559          not equal to zero.  Similarly if it is known to be -1 or 0.  */
5560
5561       if (true_code == EQ && true_val == const0_rtx
5562           && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
5563         {
5564           false_code = EQ;
5565           false_val = GEN_INT (trunc_int_for_mode (nzb, GET_MODE (from)));
5566         }
5567       else if (true_code == EQ && true_val == const0_rtx
5568                && (num_sign_bit_copies (from, GET_MODE (from))
5569                    == GET_MODE_BITSIZE (GET_MODE (from))))
5570         {
5571           false_code = EQ;
5572           false_val = constm1_rtx;
5573         }
5574
5575       /* Now simplify an arm if we know the value of the register in the
5576          branch and it is used in the arm.  Be careful due to the potential
5577          of locally-shared RTL.  */
5578
5579       if (reg_mentioned_p (from, true_rtx))
5580         true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
5581                                       from, true_val),
5582                       pc_rtx, pc_rtx, 0, 0);
5583       if (reg_mentioned_p (from, false_rtx))
5584         false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
5585                                    from, false_val),
5586                        pc_rtx, pc_rtx, 0, 0);
5587
5588       SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
5589       SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
5590
5591       true_rtx = XEXP (x, 1);
5592       false_rtx = XEXP (x, 2);
5593       true_code = GET_CODE (cond);
5594     }
5595
5596   /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
5597      reversed, do so to avoid needing two sets of patterns for
5598      subtract-and-branch insns.  Similarly if we have a constant in the true
5599      arm, the false arm is the same as the first operand of the comparison, or
5600      the false arm is more complicated than the true arm.  */
5601
5602   if (comparison_p
5603       && reversed_comparison_code (cond, NULL) != UNKNOWN
5604       && (true_rtx == pc_rtx
5605           || (CONSTANT_P (true_rtx)
5606               && !CONST_INT_P (false_rtx) && false_rtx != pc_rtx)
5607           || true_rtx == const0_rtx
5608           || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
5609           || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
5610               && !OBJECT_P (false_rtx))
5611           || reg_mentioned_p (true_rtx, false_rtx)
5612           || rtx_equal_p (false_rtx, XEXP (cond, 0))))
5613     {
5614       true_code = reversed_comparison_code (cond, NULL);
5615       SUBST (XEXP (x, 0), reversed_comparison (cond, GET_MODE (cond)));
5616       SUBST (XEXP (x, 1), false_rtx);
5617       SUBST (XEXP (x, 2), true_rtx);
5618
5619       temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5620       cond = XEXP (x, 0);
5621
5622       /* It is possible that the conditional has been simplified out.  */
5623       true_code = GET_CODE (cond);
5624       comparison_p = COMPARISON_P (cond);
5625     }
5626
5627   /* If the two arms are identical, we don't need the comparison.  */
5628
5629   if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
5630     return true_rtx;
5631
5632   /* Convert a == b ? b : a to "a".  */
5633   if (true_code == EQ && ! side_effects_p (cond)
5634       && !HONOR_NANS (mode)
5635       && rtx_equal_p (XEXP (cond, 0), false_rtx)
5636       && rtx_equal_p (XEXP (cond, 1), true_rtx))
5637     return false_rtx;
5638   else if (true_code == NE && ! side_effects_p (cond)
5639            && !HONOR_NANS (mode)
5640            && rtx_equal_p (XEXP (cond, 0), true_rtx)
5641            && rtx_equal_p (XEXP (cond, 1), false_rtx))
5642     return true_rtx;
5643
5644   /* Look for cases where we have (abs x) or (neg (abs X)).  */
5645
5646   if (GET_MODE_CLASS (mode) == MODE_INT
5647       && comparison_p
5648       && XEXP (cond, 1) == const0_rtx
5649       && GET_CODE (false_rtx) == NEG
5650       && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
5651       && rtx_equal_p (true_rtx, XEXP (cond, 0))
5652       && ! side_effects_p (true_rtx))
5653     switch (true_code)
5654       {
5655       case GT:
5656       case GE:
5657         return simplify_gen_unary (ABS, mode, true_rtx, mode);
5658       case LT:
5659       case LE:
5660         return
5661           simplify_gen_unary (NEG, mode,
5662                               simplify_gen_unary (ABS, mode, true_rtx, mode),
5663                               mode);
5664       default:
5665         break;
5666       }
5667
5668   /* Look for MIN or MAX.  */
5669
5670   if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
5671       && comparison_p
5672       && rtx_equal_p (XEXP (cond, 0), true_rtx)
5673       && rtx_equal_p (XEXP (cond, 1), false_rtx)
5674       && ! side_effects_p (cond))
5675     switch (true_code)
5676       {
5677       case GE:
5678       case GT:
5679         return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
5680       case LE:
5681       case LT:
5682         return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
5683       case GEU:
5684       case GTU:
5685         return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
5686       case LEU:
5687       case LTU:
5688         return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
5689       default:
5690         break;
5691       }
5692
5693   /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
5694      second operand is zero, this can be done as (OP Z (mult COND C2)) where
5695      C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
5696      SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
5697      We can do this kind of thing in some cases when STORE_FLAG_VALUE is
5698      neither 1 or -1, but it isn't worth checking for.  */
5699
5700   if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
5701       && comparison_p
5702       && GET_MODE_CLASS (mode) == MODE_INT
5703       && ! side_effects_p (x))
5704     {
5705       rtx t = make_compound_operation (true_rtx, SET);
5706       rtx f = make_compound_operation (false_rtx, SET);
5707       rtx cond_op0 = XEXP (cond, 0);
5708       rtx cond_op1 = XEXP (cond, 1);
5709       enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
5710       enum machine_mode m = mode;
5711       rtx z = 0, c1 = NULL_RTX;
5712
5713       if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
5714            || GET_CODE (t) == IOR || GET_CODE (t) == XOR
5715            || GET_CODE (t) == ASHIFT
5716            || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
5717           && rtx_equal_p (XEXP (t, 0), f))
5718         c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
5719
5720       /* If an identity-zero op is commutative, check whether there
5721          would be a match if we swapped the operands.  */
5722       else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
5723                 || GET_CODE (t) == XOR)
5724                && rtx_equal_p (XEXP (t, 1), f))
5725         c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
5726       else if (GET_CODE (t) == SIGN_EXTEND
5727                && (GET_CODE (XEXP (t, 0)) == PLUS
5728                    || GET_CODE (XEXP (t, 0)) == MINUS
5729                    || GET_CODE (XEXP (t, 0)) == IOR
5730                    || GET_CODE (XEXP (t, 0)) == XOR
5731                    || GET_CODE (XEXP (t, 0)) == ASHIFT
5732                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5733                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5734                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5735                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5736                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5737                && (num_sign_bit_copies (f, GET_MODE (f))
5738                    > (unsigned int)
5739                      (GET_MODE_BITSIZE (mode)
5740                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
5741         {
5742           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5743           extend_op = SIGN_EXTEND;
5744           m = GET_MODE (XEXP (t, 0));
5745         }
5746       else if (GET_CODE (t) == SIGN_EXTEND
5747                && (GET_CODE (XEXP (t, 0)) == PLUS
5748                    || GET_CODE (XEXP (t, 0)) == IOR
5749                    || GET_CODE (XEXP (t, 0)) == XOR)
5750                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5751                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5752                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5753                && (num_sign_bit_copies (f, GET_MODE (f))
5754                    > (unsigned int)
5755                      (GET_MODE_BITSIZE (mode)
5756                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
5757         {
5758           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5759           extend_op = SIGN_EXTEND;
5760           m = GET_MODE (XEXP (t, 0));
5761         }
5762       else if (GET_CODE (t) == ZERO_EXTEND
5763                && (GET_CODE (XEXP (t, 0)) == PLUS
5764                    || GET_CODE (XEXP (t, 0)) == MINUS
5765                    || GET_CODE (XEXP (t, 0)) == IOR
5766                    || GET_CODE (XEXP (t, 0)) == XOR
5767                    || GET_CODE (XEXP (t, 0)) == ASHIFT
5768                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5769                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5770                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5771                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5772                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5773                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5774                && ((nonzero_bits (f, GET_MODE (f))
5775                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
5776                    == 0))
5777         {
5778           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5779           extend_op = ZERO_EXTEND;
5780           m = GET_MODE (XEXP (t, 0));
5781         }
5782       else if (GET_CODE (t) == ZERO_EXTEND
5783                && (GET_CODE (XEXP (t, 0)) == PLUS
5784                    || GET_CODE (XEXP (t, 0)) == IOR
5785                    || GET_CODE (XEXP (t, 0)) == XOR)
5786                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5787                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5788                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5789                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5790                && ((nonzero_bits (f, GET_MODE (f))
5791                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
5792                    == 0))
5793         {
5794           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5795           extend_op = ZERO_EXTEND;
5796           m = GET_MODE (XEXP (t, 0));
5797         }
5798
5799       if (z)
5800         {
5801           temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
5802                                                  cond_op0, cond_op1),
5803                         pc_rtx, pc_rtx, 0, 0);
5804           temp = simplify_gen_binary (MULT, m, temp,
5805                                       simplify_gen_binary (MULT, m, c1,
5806                                                            const_true_rtx));
5807           temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
5808           temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
5809
5810           if (extend_op != UNKNOWN)
5811             temp = simplify_gen_unary (extend_op, mode, temp, m);
5812
5813           return temp;
5814         }
5815     }
5816
5817   /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
5818      1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
5819      negation of a single bit, we can convert this operation to a shift.  We
5820      can actually do this more generally, but it doesn't seem worth it.  */
5821
5822   if (true_code == NE && XEXP (cond, 1) == const0_rtx
5823       && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
5824       && ((1 == nonzero_bits (XEXP (cond, 0), mode)
5825            && (i = exact_log2 (INTVAL (true_rtx))) >= 0)
5826           || ((num_sign_bit_copies (XEXP (cond, 0), mode)
5827                == GET_MODE_BITSIZE (mode))
5828               && (i = exact_log2 (-INTVAL (true_rtx))) >= 0)))
5829     return
5830       simplify_shift_const (NULL_RTX, ASHIFT, mode,
5831                             gen_lowpart (mode, XEXP (cond, 0)), i);
5832
5833   /* (IF_THEN_ELSE (NE REG 0) (0) (8)) is REG for nonzero_bits (REG) == 8.  */
5834   if (true_code == NE && XEXP (cond, 1) == const0_rtx
5835       && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
5836       && GET_MODE (XEXP (cond, 0)) == mode
5837       && (INTVAL (true_rtx) & GET_MODE_MASK (mode))
5838           == nonzero_bits (XEXP (cond, 0), mode)
5839       && (i = exact_log2 (INTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
5840     return XEXP (cond, 0);
5841
5842   return x;
5843 }
5844 \f
5845 /* Simplify X, a SET expression.  Return the new expression.  */
5846
5847 static rtx
5848 simplify_set (rtx x)
5849 {
5850   rtx src = SET_SRC (x);
5851   rtx dest = SET_DEST (x);
5852   enum machine_mode mode
5853     = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
5854   rtx other_insn;
5855   rtx *cc_use;
5856
5857   /* (set (pc) (return)) gets written as (return).  */
5858   if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
5859     return src;
5860
5861   /* Now that we know for sure which bits of SRC we are using, see if we can
5862      simplify the expression for the object knowing that we only need the
5863      low-order bits.  */
5864
5865   if (GET_MODE_CLASS (mode) == MODE_INT
5866       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
5867     {
5868       src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, 0);
5869       SUBST (SET_SRC (x), src);
5870     }
5871
5872   /* If we are setting CC0 or if the source is a COMPARE, look for the use of
5873      the comparison result and try to simplify it unless we already have used
5874      undobuf.other_insn.  */
5875   if ((GET_MODE_CLASS (mode) == MODE_CC
5876        || GET_CODE (src) == COMPARE
5877        || CC0_P (dest))
5878       && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
5879       && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
5880       && COMPARISON_P (*cc_use)
5881       && rtx_equal_p (XEXP (*cc_use, 0), dest))
5882     {
5883       enum rtx_code old_code = GET_CODE (*cc_use);
5884       enum rtx_code new_code;
5885       rtx op0, op1, tmp;
5886       int other_changed = 0;
5887       enum machine_mode compare_mode = GET_MODE (dest);
5888
5889       if (GET_CODE (src) == COMPARE)
5890         op0 = XEXP (src, 0), op1 = XEXP (src, 1);
5891       else
5892         op0 = src, op1 = CONST0_RTX (GET_MODE (src));
5893
5894       tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
5895                                            op0, op1);
5896       if (!tmp)
5897         new_code = old_code;
5898       else if (!CONSTANT_P (tmp))
5899         {
5900           new_code = GET_CODE (tmp);
5901           op0 = XEXP (tmp, 0);
5902           op1 = XEXP (tmp, 1);
5903         }
5904       else
5905         {
5906           rtx pat = PATTERN (other_insn);
5907           undobuf.other_insn = other_insn;
5908           SUBST (*cc_use, tmp);
5909
5910           /* Attempt to simplify CC user.  */
5911           if (GET_CODE (pat) == SET)
5912             {
5913               rtx new_rtx = simplify_rtx (SET_SRC (pat));
5914               if (new_rtx != NULL_RTX)
5915                 SUBST (SET_SRC (pat), new_rtx);
5916             }
5917
5918           /* Convert X into a no-op move.  */
5919           SUBST (SET_DEST (x), pc_rtx);
5920           SUBST (SET_SRC (x), pc_rtx);
5921           return x;
5922         }
5923
5924       /* Simplify our comparison, if possible.  */
5925       new_code = simplify_comparison (new_code, &op0, &op1);
5926
5927 #ifdef SELECT_CC_MODE
5928       /* If this machine has CC modes other than CCmode, check to see if we
5929          need to use a different CC mode here.  */
5930       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
5931         compare_mode = GET_MODE (op0);
5932       else
5933         compare_mode = SELECT_CC_MODE (new_code, op0, op1);
5934
5935 #ifndef HAVE_cc0
5936       /* If the mode changed, we have to change SET_DEST, the mode in the
5937          compare, and the mode in the place SET_DEST is used.  If SET_DEST is
5938          a hard register, just build new versions with the proper mode.  If it
5939          is a pseudo, we lose unless it is only time we set the pseudo, in
5940          which case we can safely change its mode.  */
5941       if (compare_mode != GET_MODE (dest))
5942         {
5943           if (can_change_dest_mode (dest, 0, compare_mode))
5944             {
5945               unsigned int regno = REGNO (dest);
5946               rtx new_dest;
5947
5948               if (regno < FIRST_PSEUDO_REGISTER)
5949                 new_dest = gen_rtx_REG (compare_mode, regno);
5950               else
5951                 {
5952                   SUBST_MODE (regno_reg_rtx[regno], compare_mode);
5953                   new_dest = regno_reg_rtx[regno];
5954                 }
5955
5956               SUBST (SET_DEST (x), new_dest);
5957               SUBST (XEXP (*cc_use, 0), new_dest);
5958               other_changed = 1;
5959
5960               dest = new_dest;
5961             }
5962         }
5963 #endif  /* cc0 */
5964 #endif  /* SELECT_CC_MODE */
5965
5966       /* If the code changed, we have to build a new comparison in
5967          undobuf.other_insn.  */
5968       if (new_code != old_code)
5969         {
5970           int other_changed_previously = other_changed;
5971           unsigned HOST_WIDE_INT mask;
5972           rtx old_cc_use = *cc_use;
5973
5974           SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
5975                                           dest, const0_rtx));
5976           other_changed = 1;
5977
5978           /* If the only change we made was to change an EQ into an NE or
5979              vice versa, OP0 has only one bit that might be nonzero, and OP1
5980              is zero, check if changing the user of the condition code will
5981              produce a valid insn.  If it won't, we can keep the original code
5982              in that insn by surrounding our operation with an XOR.  */
5983
5984           if (((old_code == NE && new_code == EQ)
5985                || (old_code == EQ && new_code == NE))
5986               && ! other_changed_previously && op1 == const0_rtx
5987               && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
5988               && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
5989             {
5990               rtx pat = PATTERN (other_insn), note = 0;
5991
5992               if ((recog_for_combine (&pat, other_insn, &note) < 0
5993                    && ! check_asm_operands (pat)))
5994                 {
5995                   *cc_use = old_cc_use;
5996                   other_changed = 0;
5997
5998                   op0 = simplify_gen_binary (XOR, GET_MODE (op0),
5999                                              op0, GEN_INT (mask));
6000                 }
6001             }
6002         }
6003
6004       if (other_changed)
6005         undobuf.other_insn = other_insn;
6006
6007       /* Otherwise, if we didn't previously have a COMPARE in the
6008          correct mode, we need one.  */
6009       if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
6010         {
6011           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
6012           src = SET_SRC (x);
6013         }
6014       else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
6015         {
6016           SUBST (SET_SRC (x), op0);
6017           src = SET_SRC (x);
6018         }
6019       /* Otherwise, update the COMPARE if needed.  */
6020       else if (XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
6021         {
6022           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
6023           src = SET_SRC (x);
6024         }
6025     }
6026   else
6027     {
6028       /* Get SET_SRC in a form where we have placed back any
6029          compound expressions.  Then do the checks below.  */
6030       src = make_compound_operation (src, SET);
6031       SUBST (SET_SRC (x), src);
6032     }
6033
6034   /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
6035      and X being a REG or (subreg (reg)), we may be able to convert this to
6036      (set (subreg:m2 x) (op)).
6037
6038      We can always do this if M1 is narrower than M2 because that means that
6039      we only care about the low bits of the result.
6040
6041      However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
6042      perform a narrower operation than requested since the high-order bits will
6043      be undefined.  On machine where it is defined, this transformation is safe
6044      as long as M1 and M2 have the same number of words.  */
6045
6046   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6047       && !OBJECT_P (SUBREG_REG (src))
6048       && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
6049            / UNITS_PER_WORD)
6050           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
6051                + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
6052 #ifndef WORD_REGISTER_OPERATIONS
6053       && (GET_MODE_SIZE (GET_MODE (src))
6054         < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
6055 #endif
6056 #ifdef CANNOT_CHANGE_MODE_CLASS
6057       && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
6058             && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
6059                                          GET_MODE (SUBREG_REG (src)),
6060                                          GET_MODE (src)))
6061 #endif
6062       && (REG_P (dest)
6063           || (GET_CODE (dest) == SUBREG
6064               && REG_P (SUBREG_REG (dest)))))
6065     {
6066       SUBST (SET_DEST (x),
6067              gen_lowpart (GET_MODE (SUBREG_REG (src)),
6068                                       dest));
6069       SUBST (SET_SRC (x), SUBREG_REG (src));
6070
6071       src = SET_SRC (x), dest = SET_DEST (x);
6072     }
6073
6074 #ifdef HAVE_cc0
6075   /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
6076      in SRC.  */
6077   if (dest == cc0_rtx
6078       && GET_CODE (src) == SUBREG
6079       && subreg_lowpart_p (src)
6080       && (GET_MODE_BITSIZE (GET_MODE (src))
6081           < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
6082     {
6083       rtx inner = SUBREG_REG (src);
6084       enum machine_mode inner_mode = GET_MODE (inner);
6085
6086       /* Here we make sure that we don't have a sign bit on.  */
6087       if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
6088           && (nonzero_bits (inner, inner_mode)
6089               < ((unsigned HOST_WIDE_INT) 1
6090                  << (GET_MODE_BITSIZE (GET_MODE (src)) - 1))))
6091         {
6092           SUBST (SET_SRC (x), inner);
6093           src = SET_SRC (x);
6094         }
6095     }
6096 #endif
6097
6098 #ifdef LOAD_EXTEND_OP
6099   /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
6100      would require a paradoxical subreg.  Replace the subreg with a
6101      zero_extend to avoid the reload that would otherwise be required.  */
6102
6103   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6104       && INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (src)))
6105       && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != UNKNOWN
6106       && SUBREG_BYTE (src) == 0
6107       && (GET_MODE_SIZE (GET_MODE (src))
6108           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
6109       && MEM_P (SUBREG_REG (src)))
6110     {
6111       SUBST (SET_SRC (x),
6112              gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
6113                             GET_MODE (src), SUBREG_REG (src)));
6114
6115       src = SET_SRC (x);
6116     }
6117 #endif
6118
6119   /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
6120      are comparing an item known to be 0 or -1 against 0, use a logical
6121      operation instead. Check for one of the arms being an IOR of the other
6122      arm with some value.  We compute three terms to be IOR'ed together.  In
6123      practice, at most two will be nonzero.  Then we do the IOR's.  */
6124
6125   if (GET_CODE (dest) != PC
6126       && GET_CODE (src) == IF_THEN_ELSE
6127       && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
6128       && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
6129       && XEXP (XEXP (src, 0), 1) == const0_rtx
6130       && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
6131 #ifdef HAVE_conditional_move
6132       && ! can_conditionally_move_p (GET_MODE (src))
6133 #endif
6134       && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
6135                                GET_MODE (XEXP (XEXP (src, 0), 0)))
6136           == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
6137       && ! side_effects_p (src))
6138     {
6139       rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
6140                       ? XEXP (src, 1) : XEXP (src, 2));
6141       rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
6142                    ? XEXP (src, 2) : XEXP (src, 1));
6143       rtx term1 = const0_rtx, term2, term3;
6144
6145       if (GET_CODE (true_rtx) == IOR
6146           && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
6147         term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
6148       else if (GET_CODE (true_rtx) == IOR
6149                && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
6150         term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
6151       else if (GET_CODE (false_rtx) == IOR
6152                && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
6153         term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
6154       else if (GET_CODE (false_rtx) == IOR
6155                && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
6156         term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
6157
6158       term2 = simplify_gen_binary (AND, GET_MODE (src),
6159                                    XEXP (XEXP (src, 0), 0), true_rtx);
6160       term3 = simplify_gen_binary (AND, GET_MODE (src),
6161                                    simplify_gen_unary (NOT, GET_MODE (src),
6162                                                        XEXP (XEXP (src, 0), 0),
6163                                                        GET_MODE (src)),
6164                                    false_rtx);
6165
6166       SUBST (SET_SRC (x),
6167              simplify_gen_binary (IOR, GET_MODE (src),
6168                                   simplify_gen_binary (IOR, GET_MODE (src),
6169                                                        term1, term2),
6170                                   term3));
6171
6172       src = SET_SRC (x);
6173     }
6174
6175   /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
6176      whole thing fail.  */
6177   if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
6178     return src;
6179   else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
6180     return dest;
6181   else
6182     /* Convert this into a field assignment operation, if possible.  */
6183     return make_field_assignment (x);
6184 }
6185 \f
6186 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
6187    result.  */
6188
6189 static rtx
6190 simplify_logical (rtx x)
6191 {
6192   enum machine_mode mode = GET_MODE (x);
6193   rtx op0 = XEXP (x, 0);
6194   rtx op1 = XEXP (x, 1);
6195
6196   switch (GET_CODE (x))
6197     {
6198     case AND:
6199       /* We can call simplify_and_const_int only if we don't lose
6200          any (sign) bits when converting INTVAL (op1) to
6201          "unsigned HOST_WIDE_INT".  */
6202       if (CONST_INT_P (op1)
6203           && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
6204               || INTVAL (op1) > 0))
6205         {
6206           x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
6207           if (GET_CODE (x) != AND)
6208             return x;
6209
6210           op0 = XEXP (x, 0);
6211           op1 = XEXP (x, 1);
6212         }
6213
6214       /* If we have any of (and (ior A B) C) or (and (xor A B) C),
6215          apply the distributive law and then the inverse distributive
6216          law to see if things simplify.  */
6217       if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
6218         {
6219           rtx result = distribute_and_simplify_rtx (x, 0);
6220           if (result)
6221             return result;
6222         }
6223       if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
6224         {
6225           rtx result = distribute_and_simplify_rtx (x, 1);
6226           if (result)
6227             return result;
6228         }
6229       break;
6230
6231     case IOR:
6232       /* If we have (ior (and A B) C), apply the distributive law and then
6233          the inverse distributive law to see if things simplify.  */
6234
6235       if (GET_CODE (op0) == AND)
6236         {
6237           rtx result = distribute_and_simplify_rtx (x, 0);
6238           if (result)
6239             return result;
6240         }
6241
6242       if (GET_CODE (op1) == AND)
6243         {
6244           rtx result = distribute_and_simplify_rtx (x, 1);
6245           if (result)
6246             return result;
6247         }
6248       break;
6249
6250     default:
6251       gcc_unreachable ();
6252     }
6253
6254   return x;
6255 }
6256 \f
6257 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
6258    operations" because they can be replaced with two more basic operations.
6259    ZERO_EXTEND is also considered "compound" because it can be replaced with
6260    an AND operation, which is simpler, though only one operation.
6261
6262    The function expand_compound_operation is called with an rtx expression
6263    and will convert it to the appropriate shifts and AND operations,
6264    simplifying at each stage.
6265
6266    The function make_compound_operation is called to convert an expression
6267    consisting of shifts and ANDs into the equivalent compound expression.
6268    It is the inverse of this function, loosely speaking.  */
6269
6270 static rtx
6271 expand_compound_operation (rtx x)
6272 {
6273   unsigned HOST_WIDE_INT pos = 0, len;
6274   int unsignedp = 0;
6275   unsigned int modewidth;
6276   rtx tem;
6277
6278   switch (GET_CODE (x))
6279     {
6280     case ZERO_EXTEND:
6281       unsignedp = 1;
6282     case SIGN_EXTEND:
6283       /* We can't necessarily use a const_int for a multiword mode;
6284          it depends on implicitly extending the value.
6285          Since we don't know the right way to extend it,
6286          we can't tell whether the implicit way is right.
6287
6288          Even for a mode that is no wider than a const_int,
6289          we can't win, because we need to sign extend one of its bits through
6290          the rest of it, and we don't know which bit.  */
6291       if (CONST_INT_P (XEXP (x, 0)))
6292         return x;
6293
6294       /* Return if (subreg:MODE FROM 0) is not a safe replacement for
6295          (zero_extend:MODE FROM) or (sign_extend:MODE FROM).  It is for any MEM
6296          because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
6297          reloaded. If not for that, MEM's would very rarely be safe.
6298
6299          Reject MODEs bigger than a word, because we might not be able
6300          to reference a two-register group starting with an arbitrary register
6301          (and currently gen_lowpart might crash for a SUBREG).  */
6302
6303       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
6304         return x;
6305
6306       /* Reject MODEs that aren't scalar integers because turning vector
6307          or complex modes into shifts causes problems.  */
6308
6309       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6310         return x;
6311
6312       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
6313       /* If the inner object has VOIDmode (the only way this can happen
6314          is if it is an ASM_OPERANDS), we can't do anything since we don't
6315          know how much masking to do.  */
6316       if (len == 0)
6317         return x;
6318
6319       break;
6320
6321     case ZERO_EXTRACT:
6322       unsignedp = 1;
6323
6324       /* ... fall through ...  */
6325
6326     case SIGN_EXTRACT:
6327       /* If the operand is a CLOBBER, just return it.  */
6328       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
6329         return XEXP (x, 0);
6330
6331       if (!CONST_INT_P (XEXP (x, 1))
6332           || !CONST_INT_P (XEXP (x, 2))
6333           || GET_MODE (XEXP (x, 0)) == VOIDmode)
6334         return x;
6335
6336       /* Reject MODEs that aren't scalar integers because turning vector
6337          or complex modes into shifts causes problems.  */
6338
6339       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6340         return x;
6341
6342       len = INTVAL (XEXP (x, 1));
6343       pos = INTVAL (XEXP (x, 2));
6344
6345       /* This should stay within the object being extracted, fail otherwise.  */
6346       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
6347         return x;
6348
6349       if (BITS_BIG_ENDIAN)
6350         pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
6351
6352       break;
6353
6354     default:
6355       return x;
6356     }
6357   /* Convert sign extension to zero extension, if we know that the high
6358      bit is not set, as this is easier to optimize.  It will be converted
6359      back to cheaper alternative in make_extraction.  */
6360   if (GET_CODE (x) == SIGN_EXTEND
6361       && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6362           && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
6363                 & ~(((unsigned HOST_WIDE_INT)
6364                       GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
6365                      >> 1))
6366                == 0)))
6367     {
6368       rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
6369       rtx temp2 = expand_compound_operation (temp);
6370
6371       /* Make sure this is a profitable operation.  */
6372       if (rtx_cost (x, SET, optimize_this_for_speed_p)
6373           > rtx_cost (temp2, SET, optimize_this_for_speed_p))
6374        return temp2;
6375       else if (rtx_cost (x, SET, optimize_this_for_speed_p)
6376                > rtx_cost (temp, SET, optimize_this_for_speed_p))
6377        return temp;
6378       else
6379        return x;
6380     }
6381
6382   /* We can optimize some special cases of ZERO_EXTEND.  */
6383   if (GET_CODE (x) == ZERO_EXTEND)
6384     {
6385       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
6386          know that the last value didn't have any inappropriate bits
6387          set.  */
6388       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6389           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6390           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6391           && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
6392               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6393         return XEXP (XEXP (x, 0), 0);
6394
6395       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
6396       if (GET_CODE (XEXP (x, 0)) == SUBREG
6397           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6398           && subreg_lowpart_p (XEXP (x, 0))
6399           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6400           && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
6401               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6402         return SUBREG_REG (XEXP (x, 0));
6403
6404       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
6405          is a comparison and STORE_FLAG_VALUE permits.  This is like
6406          the first case, but it works even when GET_MODE (x) is larger
6407          than HOST_WIDE_INT.  */
6408       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6409           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6410           && COMPARISON_P (XEXP (XEXP (x, 0), 0))
6411           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6412               <= HOST_BITS_PER_WIDE_INT)
6413           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
6414               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6415         return XEXP (XEXP (x, 0), 0);
6416
6417       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
6418       if (GET_CODE (XEXP (x, 0)) == SUBREG
6419           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6420           && subreg_lowpart_p (XEXP (x, 0))
6421           && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
6422           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6423               <= HOST_BITS_PER_WIDE_INT)
6424           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
6425               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6426         return SUBREG_REG (XEXP (x, 0));
6427
6428     }
6429
6430   /* If we reach here, we want to return a pair of shifts.  The inner
6431      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
6432      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
6433      logical depending on the value of UNSIGNEDP.
6434
6435      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
6436      converted into an AND of a shift.
6437
6438      We must check for the case where the left shift would have a negative
6439      count.  This can happen in a case like (x >> 31) & 255 on machines
6440      that can't shift by a constant.  On those machines, we would first
6441      combine the shift with the AND to produce a variable-position
6442      extraction.  Then the constant of 31 would be substituted in to produce
6443      a such a position.  */
6444
6445   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
6446   if (modewidth + len >= pos)
6447     {
6448       enum machine_mode mode = GET_MODE (x);
6449       tem = gen_lowpart (mode, XEXP (x, 0));
6450       if (!tem || GET_CODE (tem) == CLOBBER)
6451         return x;
6452       tem = simplify_shift_const (NULL_RTX, ASHIFT, mode,
6453                                   tem, modewidth - pos - len);
6454       tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
6455                                   mode, tem, modewidth - len);
6456     }
6457   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
6458     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
6459                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
6460                                                         GET_MODE (x),
6461                                                         XEXP (x, 0), pos),
6462                                   ((HOST_WIDE_INT) 1 << len) - 1);
6463   else
6464     /* Any other cases we can't handle.  */
6465     return x;
6466
6467   /* If we couldn't do this for some reason, return the original
6468      expression.  */
6469   if (GET_CODE (tem) == CLOBBER)
6470     return x;
6471
6472   return tem;
6473 }
6474 \f
6475 /* X is a SET which contains an assignment of one object into
6476    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
6477    or certain SUBREGS). If possible, convert it into a series of
6478    logical operations.
6479
6480    We half-heartedly support variable positions, but do not at all
6481    support variable lengths.  */
6482
6483 static const_rtx
6484 expand_field_assignment (const_rtx x)
6485 {
6486   rtx inner;
6487   rtx pos;                      /* Always counts from low bit.  */
6488   int len;
6489   rtx mask, cleared, masked;
6490   enum machine_mode compute_mode;
6491
6492   /* Loop until we find something we can't simplify.  */
6493   while (1)
6494     {
6495       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
6496           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
6497         {
6498           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
6499           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
6500           pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
6501         }
6502       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
6503                && CONST_INT_P (XEXP (SET_DEST (x), 1)))
6504         {
6505           inner = XEXP (SET_DEST (x), 0);
6506           len = INTVAL (XEXP (SET_DEST (x), 1));
6507           pos = XEXP (SET_DEST (x), 2);
6508
6509           /* A constant position should stay within the width of INNER.  */
6510           if (CONST_INT_P (pos)
6511               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
6512             break;
6513
6514           if (BITS_BIG_ENDIAN)
6515             {
6516               if (CONST_INT_P (pos))
6517                 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
6518                                - INTVAL (pos));
6519               else if (GET_CODE (pos) == MINUS
6520                        && CONST_INT_P (XEXP (pos, 1))
6521                        && (INTVAL (XEXP (pos, 1))
6522                            == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
6523                 /* If position is ADJUST - X, new position is X.  */
6524                 pos = XEXP (pos, 0);
6525               else
6526                 pos = simplify_gen_binary (MINUS, GET_MODE (pos),
6527                                            GEN_INT (GET_MODE_BITSIZE (
6528                                                     GET_MODE (inner))
6529                                                     - len),
6530                                            pos);
6531             }
6532         }
6533
6534       /* A SUBREG between two modes that occupy the same numbers of words
6535          can be done by moving the SUBREG to the source.  */
6536       else if (GET_CODE (SET_DEST (x)) == SUBREG
6537                /* We need SUBREGs to compute nonzero_bits properly.  */
6538                && nonzero_sign_valid
6539                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
6540                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
6541                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
6542                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
6543         {
6544           x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
6545                            gen_lowpart
6546                            (GET_MODE (SUBREG_REG (SET_DEST (x))),
6547                             SET_SRC (x)));
6548           continue;
6549         }
6550       else
6551         break;
6552
6553       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6554         inner = SUBREG_REG (inner);
6555
6556       compute_mode = GET_MODE (inner);
6557
6558       /* Don't attempt bitwise arithmetic on non scalar integer modes.  */
6559       if (! SCALAR_INT_MODE_P (compute_mode))
6560         {
6561           enum machine_mode imode;
6562
6563           /* Don't do anything for vector or complex integral types.  */
6564           if (! FLOAT_MODE_P (compute_mode))
6565             break;
6566
6567           /* Try to find an integral mode to pun with.  */
6568           imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
6569           if (imode == BLKmode)
6570             break;
6571
6572           compute_mode = imode;
6573           inner = gen_lowpart (imode, inner);
6574         }
6575
6576       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
6577       if (len >= HOST_BITS_PER_WIDE_INT)
6578         break;
6579
6580       /* Now compute the equivalent expression.  Make a copy of INNER
6581          for the SET_DEST in case it is a MEM into which we will substitute;
6582          we don't want shared RTL in that case.  */
6583       mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
6584       cleared = simplify_gen_binary (AND, compute_mode,
6585                                      simplify_gen_unary (NOT, compute_mode,
6586                                        simplify_gen_binary (ASHIFT,
6587                                                             compute_mode,
6588                                                             mask, pos),
6589                                        compute_mode),
6590                                      inner);
6591       masked = simplify_gen_binary (ASHIFT, compute_mode,
6592                                     simplify_gen_binary (
6593                                       AND, compute_mode,
6594                                       gen_lowpart (compute_mode, SET_SRC (x)),
6595                                       mask),
6596                                     pos);
6597
6598       x = gen_rtx_SET (VOIDmode, copy_rtx (inner),
6599                        simplify_gen_binary (IOR, compute_mode,
6600                                             cleared, masked));
6601     }
6602
6603   return x;
6604 }
6605 \f
6606 /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
6607    it is an RTX that represents a variable starting position; otherwise,
6608    POS is the (constant) starting bit position (counted from the LSB).
6609
6610    UNSIGNEDP is nonzero for an unsigned reference and zero for a
6611    signed reference.
6612
6613    IN_DEST is nonzero if this is a reference in the destination of a
6614    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If nonzero,
6615    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
6616    be used.
6617
6618    IN_COMPARE is nonzero if we are in a COMPARE.  This means that a
6619    ZERO_EXTRACT should be built even for bits starting at bit 0.
6620
6621    MODE is the desired mode of the result (if IN_DEST == 0).
6622
6623    The result is an RTX for the extraction or NULL_RTX if the target
6624    can't handle it.  */
6625
6626 static rtx
6627 make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
6628                  rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
6629                  int in_dest, int in_compare)
6630 {
6631   /* This mode describes the size of the storage area
6632      to fetch the overall value from.  Within that, we
6633      ignore the POS lowest bits, etc.  */
6634   enum machine_mode is_mode = GET_MODE (inner);
6635   enum machine_mode inner_mode;
6636   enum machine_mode wanted_inner_mode;
6637   enum machine_mode wanted_inner_reg_mode = word_mode;
6638   enum machine_mode pos_mode = word_mode;
6639   enum machine_mode extraction_mode = word_mode;
6640   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
6641   rtx new_rtx = 0;
6642   rtx orig_pos_rtx = pos_rtx;
6643   HOST_WIDE_INT orig_pos;
6644
6645   if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6646     {
6647       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
6648          consider just the QI as the memory to extract from.
6649          The subreg adds or removes high bits; its mode is
6650          irrelevant to the meaning of this extraction,
6651          since POS and LEN count from the lsb.  */
6652       if (MEM_P (SUBREG_REG (inner)))
6653         is_mode = GET_MODE (SUBREG_REG (inner));
6654       inner = SUBREG_REG (inner);
6655     }
6656   else if (GET_CODE (inner) == ASHIFT
6657            && CONST_INT_P (XEXP (inner, 1))
6658            && pos_rtx == 0 && pos == 0
6659            && len > (unsigned HOST_WIDE_INT) INTVAL (XEXP (inner, 1)))
6660     {
6661       /* We're extracting the least significant bits of an rtx
6662          (ashift X (const_int C)), where LEN > C.  Extract the
6663          least significant (LEN - C) bits of X, giving an rtx
6664          whose mode is MODE, then shift it left C times.  */
6665       new_rtx = make_extraction (mode, XEXP (inner, 0),
6666                              0, 0, len - INTVAL (XEXP (inner, 1)),
6667                              unsignedp, in_dest, in_compare);
6668       if (new_rtx != 0)
6669         return gen_rtx_ASHIFT (mode, new_rtx, XEXP (inner, 1));
6670     }
6671
6672   inner_mode = GET_MODE (inner);
6673
6674   if (pos_rtx && CONST_INT_P (pos_rtx))
6675     pos = INTVAL (pos_rtx), pos_rtx = 0;
6676
6677   /* See if this can be done without an extraction.  We never can if the
6678      width of the field is not the same as that of some integer mode. For
6679      registers, we can only avoid the extraction if the position is at the
6680      low-order bit and this is either not in the destination or we have the
6681      appropriate STRICT_LOW_PART operation available.
6682
6683      For MEM, we can avoid an extract if the field starts on an appropriate
6684      boundary and we can change the mode of the memory reference.  */
6685
6686   if (tmode != BLKmode
6687       && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
6688            && !MEM_P (inner)
6689            && (inner_mode == tmode
6690                || !REG_P (inner)
6691                || TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode),
6692                                          GET_MODE_BITSIZE (inner_mode))
6693                || reg_truncated_to_mode (tmode, inner))
6694            && (! in_dest
6695                || (REG_P (inner)
6696                    && have_insn_for (STRICT_LOW_PART, tmode))))
6697           || (MEM_P (inner) && pos_rtx == 0
6698               && (pos
6699                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
6700                      : BITS_PER_UNIT)) == 0
6701               /* We can't do this if we are widening INNER_MODE (it
6702                  may not be aligned, for one thing).  */
6703               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
6704               && (inner_mode == tmode
6705                   || (! mode_dependent_address_p (XEXP (inner, 0))
6706                       && ! MEM_VOLATILE_P (inner))))))
6707     {
6708       /* If INNER is a MEM, make a new MEM that encompasses just the desired
6709          field.  If the original and current mode are the same, we need not
6710          adjust the offset.  Otherwise, we do if bytes big endian.
6711
6712          If INNER is not a MEM, get a piece consisting of just the field
6713          of interest (in this case POS % BITS_PER_WORD must be 0).  */
6714
6715       if (MEM_P (inner))
6716         {
6717           HOST_WIDE_INT offset;
6718
6719           /* POS counts from lsb, but make OFFSET count in memory order.  */
6720           if (BYTES_BIG_ENDIAN)
6721             offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
6722           else
6723             offset = pos / BITS_PER_UNIT;
6724
6725           new_rtx = adjust_address_nv (inner, tmode, offset);
6726         }
6727       else if (REG_P (inner))
6728         {
6729           if (tmode != inner_mode)
6730             {
6731               /* We can't call gen_lowpart in a DEST since we
6732                  always want a SUBREG (see below) and it would sometimes
6733                  return a new hard register.  */
6734               if (pos || in_dest)
6735                 {
6736                   HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
6737
6738                   if (WORDS_BIG_ENDIAN
6739                       && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
6740                     final_word = ((GET_MODE_SIZE (inner_mode)
6741                                    - GET_MODE_SIZE (tmode))
6742                                   / UNITS_PER_WORD) - final_word;
6743
6744                   final_word *= UNITS_PER_WORD;
6745                   if (BYTES_BIG_ENDIAN &&
6746                       GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
6747                     final_word += (GET_MODE_SIZE (inner_mode)
6748                                    - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
6749
6750                   /* Avoid creating invalid subregs, for example when
6751                      simplifying (x>>32)&255.  */
6752                   if (!validate_subreg (tmode, inner_mode, inner, final_word))
6753                     return NULL_RTX;
6754
6755                   new_rtx = gen_rtx_SUBREG (tmode, inner, final_word);
6756                 }
6757               else
6758                 new_rtx = gen_lowpart (tmode, inner);
6759             }
6760           else
6761             new_rtx = inner;
6762         }
6763       else
6764         new_rtx = force_to_mode (inner, tmode,
6765                              len >= HOST_BITS_PER_WIDE_INT
6766                              ? ~(unsigned HOST_WIDE_INT) 0
6767                              : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
6768                              0);
6769
6770       /* If this extraction is going into the destination of a SET,
6771          make a STRICT_LOW_PART unless we made a MEM.  */
6772
6773       if (in_dest)
6774         return (MEM_P (new_rtx) ? new_rtx
6775                 : (GET_CODE (new_rtx) != SUBREG
6776                    ? gen_rtx_CLOBBER (tmode, const0_rtx)
6777                    : gen_rtx_STRICT_LOW_PART (VOIDmode, new_rtx)));
6778
6779       if (mode == tmode)
6780         return new_rtx;
6781
6782       if (CONST_INT_P (new_rtx))
6783         return gen_int_mode (INTVAL (new_rtx), mode);
6784
6785       /* If we know that no extraneous bits are set, and that the high
6786          bit is not set, convert the extraction to the cheaper of
6787          sign and zero extension, that are equivalent in these cases.  */
6788       if (flag_expensive_optimizations
6789           && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
6790               && ((nonzero_bits (new_rtx, tmode)
6791                    & ~(((unsigned HOST_WIDE_INT)
6792                         GET_MODE_MASK (tmode))
6793                        >> 1))
6794                   == 0)))
6795         {
6796           rtx temp = gen_rtx_ZERO_EXTEND (mode, new_rtx);
6797           rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new_rtx);
6798
6799           /* Prefer ZERO_EXTENSION, since it gives more information to
6800              backends.  */
6801           if (rtx_cost (temp, SET, optimize_this_for_speed_p)
6802               <= rtx_cost (temp1, SET, optimize_this_for_speed_p))
6803             return temp;
6804           return temp1;
6805         }
6806
6807       /* Otherwise, sign- or zero-extend unless we already are in the
6808          proper mode.  */
6809
6810       return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
6811                              mode, new_rtx));
6812     }
6813
6814   /* Unless this is a COMPARE or we have a funny memory reference,
6815      don't do anything with zero-extending field extracts starting at
6816      the low-order bit since they are simple AND operations.  */
6817   if (pos_rtx == 0 && pos == 0 && ! in_dest
6818       && ! in_compare && unsignedp)
6819     return 0;
6820
6821   /* Unless INNER is not MEM, reject this if we would be spanning bytes or
6822      if the position is not a constant and the length is not 1.  In all
6823      other cases, we would only be going outside our object in cases when
6824      an original shift would have been undefined.  */
6825   if (MEM_P (inner)
6826       && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
6827           || (pos_rtx != 0 && len != 1)))
6828     return 0;
6829
6830   /* Get the mode to use should INNER not be a MEM, the mode for the position,
6831      and the mode for the result.  */
6832   if (in_dest && mode_for_extraction (EP_insv, -1) != MAX_MACHINE_MODE)
6833     {
6834       wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
6835       pos_mode = mode_for_extraction (EP_insv, 2);
6836       extraction_mode = mode_for_extraction (EP_insv, 3);
6837     }
6838
6839   if (! in_dest && unsignedp
6840       && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
6841     {
6842       wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
6843       pos_mode = mode_for_extraction (EP_extzv, 3);
6844       extraction_mode = mode_for_extraction (EP_extzv, 0);
6845     }
6846
6847   if (! in_dest && ! unsignedp
6848       && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
6849     {
6850       wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
6851       pos_mode = mode_for_extraction (EP_extv, 3);
6852       extraction_mode = mode_for_extraction (EP_extv, 0);
6853     }
6854
6855   /* Never narrow an object, since that might not be safe.  */
6856
6857   if (mode != VOIDmode
6858       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
6859     extraction_mode = mode;
6860
6861   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
6862       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6863     pos_mode = GET_MODE (pos_rtx);
6864
6865   /* If this is not from memory, the desired mode is the preferred mode
6866      for an extraction pattern's first input operand, or word_mode if there
6867      is none.  */
6868   if (!MEM_P (inner))
6869     wanted_inner_mode = wanted_inner_reg_mode;
6870   else
6871     {
6872       /* Be careful not to go beyond the extracted object and maintain the
6873          natural alignment of the memory.  */
6874       wanted_inner_mode = smallest_mode_for_size (len, MODE_INT);
6875       while (pos % GET_MODE_BITSIZE (wanted_inner_mode) + len
6876              > GET_MODE_BITSIZE (wanted_inner_mode))
6877         {
6878           wanted_inner_mode = GET_MODE_WIDER_MODE (wanted_inner_mode);
6879           gcc_assert (wanted_inner_mode != VOIDmode);
6880         }
6881
6882       /* If we have to change the mode of memory and cannot, the desired mode
6883          is EXTRACTION_MODE.  */
6884       if (inner_mode != wanted_inner_mode
6885           && (mode_dependent_address_p (XEXP (inner, 0))
6886               || MEM_VOLATILE_P (inner)
6887               || pos_rtx))
6888         wanted_inner_mode = extraction_mode;
6889     }
6890
6891   orig_pos = pos;
6892
6893   if (BITS_BIG_ENDIAN)
6894     {
6895       /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
6896          BITS_BIG_ENDIAN style.  If position is constant, compute new
6897          position.  Otherwise, build subtraction.
6898          Note that POS is relative to the mode of the original argument.
6899          If it's a MEM we need to recompute POS relative to that.
6900          However, if we're extracting from (or inserting into) a register,
6901          we want to recompute POS relative to wanted_inner_mode.  */
6902       int width = (MEM_P (inner)
6903                    ? GET_MODE_BITSIZE (is_mode)
6904                    : GET_MODE_BITSIZE (wanted_inner_mode));
6905
6906       if (pos_rtx == 0)
6907         pos = width - len - pos;
6908       else
6909         pos_rtx
6910           = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
6911       /* POS may be less than 0 now, but we check for that below.
6912          Note that it can only be less than 0 if !MEM_P (inner).  */
6913     }
6914
6915   /* If INNER has a wider mode, and this is a constant extraction, try to
6916      make it smaller and adjust the byte to point to the byte containing
6917      the value.  */
6918   if (wanted_inner_mode != VOIDmode
6919       && inner_mode != wanted_inner_mode
6920       && ! pos_rtx
6921       && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
6922       && MEM_P (inner)
6923       && ! mode_dependent_address_p (XEXP (inner, 0))
6924       && ! MEM_VOLATILE_P (inner))
6925     {
6926       int offset = 0;
6927
6928       /* The computations below will be correct if the machine is big
6929          endian in both bits and bytes or little endian in bits and bytes.
6930          If it is mixed, we must adjust.  */
6931
6932       /* If bytes are big endian and we had a paradoxical SUBREG, we must
6933          adjust OFFSET to compensate.  */
6934       if (BYTES_BIG_ENDIAN
6935           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
6936         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
6937
6938       /* We can now move to the desired byte.  */
6939       offset += (pos / GET_MODE_BITSIZE (wanted_inner_mode))
6940                 * GET_MODE_SIZE (wanted_inner_mode);
6941       pos %= GET_MODE_BITSIZE (wanted_inner_mode);
6942
6943       if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
6944           && is_mode != wanted_inner_mode)
6945         offset = (GET_MODE_SIZE (is_mode)
6946                   - GET_MODE_SIZE (wanted_inner_mode) - offset);
6947
6948       inner = adjust_address_nv (inner, wanted_inner_mode, offset);
6949     }
6950
6951   /* If INNER is not memory, get it into the proper mode.  If we are changing
6952      its mode, POS must be a constant and smaller than the size of the new
6953      mode.  */
6954   else if (!MEM_P (inner))
6955     {
6956       /* On the LHS, don't create paradoxical subregs implicitely truncating
6957          the register unless TRULY_NOOP_TRUNCATION.  */
6958       if (in_dest
6959           && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (inner)),
6960                                      GET_MODE_BITSIZE (wanted_inner_mode)))
6961         return NULL_RTX;
6962
6963       if (GET_MODE (inner) != wanted_inner_mode
6964           && (pos_rtx != 0
6965               || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
6966         return NULL_RTX;
6967
6968       if (orig_pos < 0)
6969         return NULL_RTX;
6970
6971       inner = force_to_mode (inner, wanted_inner_mode,
6972                              pos_rtx
6973                              || len + orig_pos >= HOST_BITS_PER_WIDE_INT
6974                              ? ~(unsigned HOST_WIDE_INT) 0
6975                              : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
6976                                 << orig_pos),
6977                              0);
6978     }
6979
6980   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
6981      have to zero extend.  Otherwise, we can just use a SUBREG.  */
6982   if (pos_rtx != 0
6983       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
6984     {
6985       rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
6986
6987       /* If we know that no extraneous bits are set, and that the high
6988          bit is not set, convert extraction to cheaper one - either
6989          SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
6990          cases.  */
6991       if (flag_expensive_optimizations
6992           && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
6993               && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
6994                    & ~(((unsigned HOST_WIDE_INT)
6995                         GET_MODE_MASK (GET_MODE (pos_rtx)))
6996                        >> 1))
6997                   == 0)))
6998         {
6999           rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
7000
7001           /* Prefer ZERO_EXTENSION, since it gives more information to
7002              backends.  */
7003           if (rtx_cost (temp1, SET, optimize_this_for_speed_p)
7004               < rtx_cost (temp, SET, optimize_this_for_speed_p))
7005             temp = temp1;
7006         }
7007       pos_rtx = temp;
7008     }
7009   else if (pos_rtx != 0
7010            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
7011     pos_rtx = gen_lowpart (pos_mode, pos_rtx);
7012
7013   /* Make POS_RTX unless we already have it and it is correct.  If we don't
7014      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
7015      be a CONST_INT.  */
7016   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
7017     pos_rtx = orig_pos_rtx;
7018
7019   else if (pos_rtx == 0)
7020     pos_rtx = GEN_INT (pos);
7021
7022   /* Make the required operation.  See if we can use existing rtx.  */
7023   new_rtx = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
7024                          extraction_mode, inner, GEN_INT (len), pos_rtx);
7025   if (! in_dest)
7026     new_rtx = gen_lowpart (mode, new_rtx);
7027
7028   return new_rtx;
7029 }
7030 \f
7031 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
7032    with any other operations in X.  Return X without that shift if so.  */
7033
7034 static rtx
7035 extract_left_shift (rtx x, int count)
7036 {
7037   enum rtx_code code = GET_CODE (x);
7038   enum machine_mode mode = GET_MODE (x);
7039   rtx tem;
7040
7041   switch (code)
7042     {
7043     case ASHIFT:
7044       /* This is the shift itself.  If it is wide enough, we will return
7045          either the value being shifted if the shift count is equal to
7046          COUNT or a shift for the difference.  */
7047       if (CONST_INT_P (XEXP (x, 1))
7048           && INTVAL (XEXP (x, 1)) >= count)
7049         return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
7050                                      INTVAL (XEXP (x, 1)) - count);
7051       break;
7052
7053     case NEG:  case NOT:
7054       if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7055         return simplify_gen_unary (code, mode, tem, mode);
7056
7057       break;
7058
7059     case PLUS:  case IOR:  case XOR:  case AND:
7060       /* If we can safely shift this constant and we find the inner shift,
7061          make a new operation.  */
7062       if (CONST_INT_P (XEXP (x, 1))
7063           && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
7064           && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7065         return simplify_gen_binary (code, mode, tem,
7066                                     GEN_INT (INTVAL (XEXP (x, 1)) >> count));
7067
7068       break;
7069
7070     default:
7071       break;
7072     }
7073
7074   return 0;
7075 }
7076 \f
7077 /* Look at the expression rooted at X.  Look for expressions
7078    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
7079    Form these expressions.
7080
7081    Return the new rtx, usually just X.
7082
7083    Also, for machines like the VAX that don't have logical shift insns,
7084    try to convert logical to arithmetic shift operations in cases where
7085    they are equivalent.  This undoes the canonicalizations to logical
7086    shifts done elsewhere.
7087
7088    We try, as much as possible, to re-use rtl expressions to save memory.
7089
7090    IN_CODE says what kind of expression we are processing.  Normally, it is
7091    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
7092    being kludges), it is MEM.  When processing the arguments of a comparison
7093    or a COMPARE against zero, it is COMPARE.  */
7094
7095 static rtx
7096 make_compound_operation (rtx x, enum rtx_code in_code)
7097 {
7098   enum rtx_code code = GET_CODE (x);
7099   enum machine_mode mode = GET_MODE (x);
7100   int mode_width = GET_MODE_BITSIZE (mode);
7101   rtx rhs, lhs;
7102   enum rtx_code next_code;
7103   int i, j;
7104   rtx new_rtx = 0;
7105   rtx tem;
7106   const char *fmt;
7107
7108   /* Select the code to be used in recursive calls.  Once we are inside an
7109      address, we stay there.  If we have a comparison, set to COMPARE,
7110      but once inside, go back to our default of SET.  */
7111
7112   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
7113                : ((code == COMPARE || COMPARISON_P (x))
7114                   && XEXP (x, 1) == const0_rtx) ? COMPARE
7115                : in_code == COMPARE ? SET : in_code);
7116
7117   /* Process depending on the code of this operation.  If NEW is set
7118      nonzero, it will be returned.  */
7119
7120   switch (code)
7121     {
7122     case ASHIFT:
7123       /* Convert shifts by constants into multiplications if inside
7124          an address.  */
7125       if (in_code == MEM && CONST_INT_P (XEXP (x, 1))
7126           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7127           && INTVAL (XEXP (x, 1)) >= 0)
7128         {
7129           new_rtx = make_compound_operation (XEXP (x, 0), next_code);
7130           new_rtx = gen_rtx_MULT (mode, new_rtx,
7131                               GEN_INT ((HOST_WIDE_INT) 1
7132                                        << INTVAL (XEXP (x, 1))));
7133         }
7134       break;
7135
7136     case AND:
7137       /* If the second operand is not a constant, we can't do anything
7138          with it.  */
7139       if (!CONST_INT_P (XEXP (x, 1)))
7140         break;
7141
7142       /* If the constant is a power of two minus one and the first operand
7143          is a logical right shift, make an extraction.  */
7144       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7145           && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
7146         {
7147           new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7148           new_rtx = make_extraction (mode, new_rtx, 0, XEXP (XEXP (x, 0), 1), i, 1,
7149                                  0, in_code == COMPARE);
7150         }
7151
7152       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
7153       else if (GET_CODE (XEXP (x, 0)) == SUBREG
7154                && subreg_lowpart_p (XEXP (x, 0))
7155                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
7156                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
7157         {
7158           new_rtx = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
7159                                          next_code);
7160           new_rtx = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new_rtx, 0,
7161                                  XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
7162                                  0, in_code == COMPARE);
7163         }
7164       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
7165       else if ((GET_CODE (XEXP (x, 0)) == XOR
7166                 || GET_CODE (XEXP (x, 0)) == IOR)
7167                && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
7168                && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
7169                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
7170         {
7171           /* Apply the distributive law, and then try to make extractions.  */
7172           new_rtx = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
7173                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
7174                                              XEXP (x, 1)),
7175                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
7176                                              XEXP (x, 1)));
7177           new_rtx = make_compound_operation (new_rtx, in_code);
7178         }
7179
7180       /* If we are have (and (rotate X C) M) and C is larger than the number
7181          of bits in M, this is an extraction.  */
7182
7183       else if (GET_CODE (XEXP (x, 0)) == ROTATE
7184                && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7185                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
7186                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
7187         {
7188           new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7189           new_rtx = make_extraction (mode, new_rtx,
7190                                  (GET_MODE_BITSIZE (mode)
7191                                   - INTVAL (XEXP (XEXP (x, 0), 1))),
7192                                  NULL_RTX, i, 1, 0, in_code == COMPARE);
7193         }
7194
7195       /* On machines without logical shifts, if the operand of the AND is
7196          a logical shift and our mask turns off all the propagated sign
7197          bits, we can replace the logical shift with an arithmetic shift.  */
7198       else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7199                && !have_insn_for (LSHIFTRT, mode)
7200                && have_insn_for (ASHIFTRT, mode)
7201                && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7202                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7203                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7204                && mode_width <= HOST_BITS_PER_WIDE_INT)
7205         {
7206           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
7207
7208           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
7209           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
7210             SUBST (XEXP (x, 0),
7211                    gen_rtx_ASHIFTRT (mode,
7212                                      make_compound_operation
7213                                      (XEXP (XEXP (x, 0), 0), next_code),
7214                                      XEXP (XEXP (x, 0), 1)));
7215         }
7216
7217       /* If the constant is one less than a power of two, this might be
7218          representable by an extraction even if no shift is present.
7219          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
7220          we are in a COMPARE.  */
7221       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
7222         new_rtx = make_extraction (mode,
7223                                make_compound_operation (XEXP (x, 0),
7224                                                         next_code),
7225                                0, NULL_RTX, i, 1, 0, in_code == COMPARE);
7226
7227       /* If we are in a comparison and this is an AND with a power of two,
7228          convert this into the appropriate bit extract.  */
7229       else if (in_code == COMPARE
7230                && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
7231         new_rtx = make_extraction (mode,
7232                                make_compound_operation (XEXP (x, 0),
7233                                                         next_code),
7234                                i, NULL_RTX, 1, 1, 0, 1);
7235
7236       break;
7237
7238     case LSHIFTRT:
7239       /* If the sign bit is known to be zero, replace this with an
7240          arithmetic shift.  */
7241       if (have_insn_for (ASHIFTRT, mode)
7242           && ! have_insn_for (LSHIFTRT, mode)
7243           && mode_width <= HOST_BITS_PER_WIDE_INT
7244           && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
7245         {
7246           new_rtx = gen_rtx_ASHIFTRT (mode,
7247                                   make_compound_operation (XEXP (x, 0),
7248                                                            next_code),
7249                                   XEXP (x, 1));
7250           break;
7251         }
7252
7253       /* ... fall through ...  */
7254
7255     case ASHIFTRT:
7256       lhs = XEXP (x, 0);
7257       rhs = XEXP (x, 1);
7258
7259       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
7260          this is a SIGN_EXTRACT.  */
7261       if (CONST_INT_P (rhs)
7262           && GET_CODE (lhs) == ASHIFT
7263           && CONST_INT_P (XEXP (lhs, 1))
7264           && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))
7265           && INTVAL (rhs) < mode_width)
7266         {
7267           new_rtx = make_compound_operation (XEXP (lhs, 0), next_code);
7268           new_rtx = make_extraction (mode, new_rtx,
7269                                  INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
7270                                  NULL_RTX, mode_width - INTVAL (rhs),
7271                                  code == LSHIFTRT, 0, in_code == COMPARE);
7272           break;
7273         }
7274
7275       /* See if we have operations between an ASHIFTRT and an ASHIFT.
7276          If so, try to merge the shifts into a SIGN_EXTEND.  We could
7277          also do this for some cases of SIGN_EXTRACT, but it doesn't
7278          seem worth the effort; the case checked for occurs on Alpha.  */
7279
7280       if (!OBJECT_P (lhs)
7281           && ! (GET_CODE (lhs) == SUBREG
7282                 && (OBJECT_P (SUBREG_REG (lhs))))
7283           && CONST_INT_P (rhs)
7284           && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
7285           && INTVAL (rhs) < mode_width
7286           && (new_rtx = extract_left_shift (lhs, INTVAL (rhs))) != 0)
7287         new_rtx = make_extraction (mode, make_compound_operation (new_rtx, next_code),
7288                                0, NULL_RTX, mode_width - INTVAL (rhs),
7289                                code == LSHIFTRT, 0, in_code == COMPARE);
7290
7291       break;
7292
7293     case SUBREG:
7294       /* Call ourselves recursively on the inner expression.  If we are
7295          narrowing the object and it has a different RTL code from
7296          what it originally did, do this SUBREG as a force_to_mode.  */
7297
7298       tem = make_compound_operation (SUBREG_REG (x), in_code);
7299
7300       {
7301         rtx simplified;
7302         simplified = simplify_subreg (GET_MODE (x), tem, GET_MODE (tem),
7303                                       SUBREG_BYTE (x));
7304
7305         if (simplified)
7306           tem = simplified;
7307
7308         if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
7309             && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
7310             && subreg_lowpart_p (x))
7311           {
7312             rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
7313                                        0);
7314
7315             /* If we have something other than a SUBREG, we might have
7316                done an expansion, so rerun ourselves.  */
7317             if (GET_CODE (newer) != SUBREG)
7318               newer = make_compound_operation (newer, in_code);
7319
7320             /* force_to_mode can expand compounds.  If it just re-expanded the
7321                compound use gen_lowpart instead to convert to the desired
7322                mode.  */
7323             if (rtx_equal_p (newer, x))
7324               return gen_lowpart (GET_MODE (x), tem);
7325
7326             return newer;
7327           }
7328
7329         if (simplified)
7330           return tem;
7331       }
7332       break;
7333
7334     default:
7335       break;
7336     }
7337
7338   if (new_rtx)
7339     {
7340       x = gen_lowpart (mode, new_rtx);
7341       code = GET_CODE (x);
7342     }
7343
7344   /* Now recursively process each operand of this operation.  */
7345   fmt = GET_RTX_FORMAT (code);
7346   for (i = 0; i < GET_RTX_LENGTH (code); i++)
7347     if (fmt[i] == 'e')
7348       {
7349         new_rtx = make_compound_operation (XEXP (x, i), next_code);
7350         SUBST (XEXP (x, i), new_rtx);
7351       }
7352     else if (fmt[i] == 'E')
7353       for (j = 0; j < XVECLEN (x, i); j++)
7354         {
7355           new_rtx = make_compound_operation (XVECEXP (x, i, j), next_code);
7356           SUBST (XVECEXP (x, i, j), new_rtx);
7357         }
7358
7359   /* If this is a commutative operation, the changes to the operands
7360      may have made it noncanonical.  */
7361   if (COMMUTATIVE_ARITH_P (x)
7362       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
7363     {
7364       tem = XEXP (x, 0);
7365       SUBST (XEXP (x, 0), XEXP (x, 1));
7366       SUBST (XEXP (x, 1), tem);
7367     }
7368
7369   return x;
7370 }
7371 \f
7372 /* Given M see if it is a value that would select a field of bits
7373    within an item, but not the entire word.  Return -1 if not.
7374    Otherwise, return the starting position of the field, where 0 is the
7375    low-order bit.
7376
7377    *PLEN is set to the length of the field.  */
7378
7379 static int
7380 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
7381 {
7382   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
7383   int pos = exact_log2 (m & -m);
7384   int len = 0;
7385
7386   if (pos >= 0)
7387     /* Now shift off the low-order zero bits and see if we have a
7388        power of two minus 1.  */
7389     len = exact_log2 ((m >> pos) + 1);
7390
7391   if (len <= 0)
7392     pos = -1;
7393
7394   *plen = len;
7395   return pos;
7396 }
7397 \f
7398 /* If X refers to a register that equals REG in value, replace these
7399    references with REG.  */
7400 static rtx
7401 canon_reg_for_combine (rtx x, rtx reg)
7402 {
7403   rtx op0, op1, op2;
7404   const char *fmt;
7405   int i;
7406   bool copied;
7407
7408   enum rtx_code code = GET_CODE (x);
7409   switch (GET_RTX_CLASS (code))
7410     {
7411     case RTX_UNARY:
7412       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7413       if (op0 != XEXP (x, 0))
7414         return simplify_gen_unary (GET_CODE (x), GET_MODE (x), op0,
7415                                    GET_MODE (reg));
7416       break;
7417
7418     case RTX_BIN_ARITH:
7419     case RTX_COMM_ARITH:
7420       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7421       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7422       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7423         return simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
7424       break;
7425
7426     case RTX_COMPARE:
7427     case RTX_COMM_COMPARE:
7428       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7429       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7430       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7431         return simplify_gen_relational (GET_CODE (x), GET_MODE (x),
7432                                         GET_MODE (op0), op0, op1);
7433       break;
7434
7435     case RTX_TERNARY:
7436     case RTX_BITFIELD_OPS:
7437       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7438       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7439       op2 = canon_reg_for_combine (XEXP (x, 2), reg);
7440       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1) || op2 != XEXP (x, 2))
7441         return simplify_gen_ternary (GET_CODE (x), GET_MODE (x),
7442                                      GET_MODE (op0), op0, op1, op2);
7443
7444     case RTX_OBJ:
7445       if (REG_P (x))
7446         {
7447           if (rtx_equal_p (get_last_value (reg), x)
7448               || rtx_equal_p (reg, get_last_value (x)))
7449             return reg;
7450           else
7451             break;
7452         }
7453
7454       /* fall through */
7455
7456     default:
7457       fmt = GET_RTX_FORMAT (code);
7458       copied = false;
7459       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7460         if (fmt[i] == 'e')
7461           {
7462             rtx op = canon_reg_for_combine (XEXP (x, i), reg);
7463             if (op != XEXP (x, i))
7464               {
7465                 if (!copied)
7466                   {
7467                     copied = true;
7468                     x = copy_rtx (x);
7469                   }
7470                 XEXP (x, i) = op;
7471               }
7472           }
7473         else if (fmt[i] == 'E')
7474           {
7475             int j;
7476             for (j = 0; j < XVECLEN (x, i); j++)
7477               {
7478                 rtx op = canon_reg_for_combine (XVECEXP (x, i, j), reg);
7479                 if (op != XVECEXP (x, i, j))
7480                   {
7481                     if (!copied)
7482                       {
7483                         copied = true;
7484                         x = copy_rtx (x);
7485                       }
7486                     XVECEXP (x, i, j) = op;
7487                   }
7488               }
7489           }
7490
7491       break;
7492     }
7493
7494   return x;
7495 }
7496
7497 /* Return X converted to MODE.  If the value is already truncated to
7498    MODE we can just return a subreg even though in the general case we
7499    would need an explicit truncation.  */
7500
7501 static rtx
7502 gen_lowpart_or_truncate (enum machine_mode mode, rtx x)
7503 {
7504   if (!CONST_INT_P (x)
7505       && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x))
7506       && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
7507                                  GET_MODE_BITSIZE (GET_MODE (x)))
7508       && !(REG_P (x) && reg_truncated_to_mode (mode, x)))
7509     {
7510       /* Bit-cast X into an integer mode.  */
7511       if (!SCALAR_INT_MODE_P (GET_MODE (x)))
7512         x = gen_lowpart (int_mode_for_mode (GET_MODE (x)), x);
7513       x = simplify_gen_unary (TRUNCATE, int_mode_for_mode (mode),
7514                               x, GET_MODE (x));
7515     }
7516
7517   return gen_lowpart (mode, x);
7518 }
7519
7520 /* See if X can be simplified knowing that we will only refer to it in
7521    MODE and will only refer to those bits that are nonzero in MASK.
7522    If other bits are being computed or if masking operations are done
7523    that select a superset of the bits in MASK, they can sometimes be
7524    ignored.
7525
7526    Return a possibly simplified expression, but always convert X to
7527    MODE.  If X is a CONST_INT, AND the CONST_INT with MASK.
7528
7529    If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
7530    are all off in X.  This is used when X will be complemented, by either
7531    NOT, NEG, or XOR.  */
7532
7533 static rtx
7534 force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
7535                int just_select)
7536 {
7537   enum rtx_code code = GET_CODE (x);
7538   int next_select = just_select || code == XOR || code == NOT || code == NEG;
7539   enum machine_mode op_mode;
7540   unsigned HOST_WIDE_INT fuller_mask, nonzero;
7541   rtx op0, op1, temp;
7542
7543   /* If this is a CALL or ASM_OPERANDS, don't do anything.  Some of the
7544      code below will do the wrong thing since the mode of such an
7545      expression is VOIDmode.
7546
7547      Also do nothing if X is a CLOBBER; this can happen if X was
7548      the return value from a call to gen_lowpart.  */
7549   if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
7550     return x;
7551
7552   /* We want to perform the operation is its present mode unless we know
7553      that the operation is valid in MODE, in which case we do the operation
7554      in MODE.  */
7555   op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
7556               && have_insn_for (code, mode))
7557              ? mode : GET_MODE (x));
7558
7559   /* It is not valid to do a right-shift in a narrower mode
7560      than the one it came in with.  */
7561   if ((code == LSHIFTRT || code == ASHIFTRT)
7562       && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
7563     op_mode = GET_MODE (x);
7564
7565   /* Truncate MASK to fit OP_MODE.  */
7566   if (op_mode)
7567     mask &= GET_MODE_MASK (op_mode);
7568
7569   /* When we have an arithmetic operation, or a shift whose count we
7570      do not know, we need to assume that all bits up to the highest-order
7571      bit in MASK will be needed.  This is how we form such a mask.  */
7572   if (mask & ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
7573     fuller_mask = ~(unsigned HOST_WIDE_INT) 0;
7574   else
7575     fuller_mask = (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
7576                    - 1);
7577
7578   /* Determine what bits of X are guaranteed to be (non)zero.  */
7579   nonzero = nonzero_bits (x, mode);
7580
7581   /* If none of the bits in X are needed, return a zero.  */
7582   if (!just_select && (nonzero & mask) == 0 && !side_effects_p (x))
7583     x = const0_rtx;
7584
7585   /* If X is a CONST_INT, return a new one.  Do this here since the
7586      test below will fail.  */
7587   if (CONST_INT_P (x))
7588     {
7589       if (SCALAR_INT_MODE_P (mode))
7590         return gen_int_mode (INTVAL (x) & mask, mode);
7591       else
7592         {
7593           x = GEN_INT (INTVAL (x) & mask);
7594           return gen_lowpart_common (mode, x);
7595         }
7596     }
7597
7598   /* If X is narrower than MODE and we want all the bits in X's mode, just
7599      get X in the proper mode.  */
7600   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
7601       && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
7602     return gen_lowpart (mode, x);
7603
7604   /* We can ignore the effect of a SUBREG if it narrows the mode or
7605      if the constant masks to zero all the bits the mode doesn't have.  */
7606   if (GET_CODE (x) == SUBREG
7607       && subreg_lowpart_p (x)
7608       && ((GET_MODE_SIZE (GET_MODE (x))
7609            < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
7610           || (0 == (mask
7611                     & GET_MODE_MASK (GET_MODE (x))
7612                     & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
7613     return force_to_mode (SUBREG_REG (x), mode, mask, next_select);
7614
7615   /* The arithmetic simplifications here only work for scalar integer modes.  */
7616   if (!SCALAR_INT_MODE_P (mode) || !SCALAR_INT_MODE_P (GET_MODE (x)))
7617     return gen_lowpart_or_truncate (mode, x);
7618
7619   switch (code)
7620     {
7621     case CLOBBER:
7622       /* If X is a (clobber (const_int)), return it since we know we are
7623          generating something that won't match.  */
7624       return x;
7625
7626     case SIGN_EXTEND:
7627     case ZERO_EXTEND:
7628     case ZERO_EXTRACT:
7629     case SIGN_EXTRACT:
7630       x = expand_compound_operation (x);
7631       if (GET_CODE (x) != code)
7632         return force_to_mode (x, mode, mask, next_select);
7633       break;
7634
7635     case TRUNCATE:
7636       /* Similarly for a truncate.  */
7637       return force_to_mode (XEXP (x, 0), mode, mask, next_select);
7638
7639     case AND:
7640       /* If this is an AND with a constant, convert it into an AND
7641          whose constant is the AND of that constant with MASK.  If it
7642          remains an AND of MASK, delete it since it is redundant.  */
7643
7644       if (CONST_INT_P (XEXP (x, 1)))
7645         {
7646           x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
7647                                       mask & INTVAL (XEXP (x, 1)));
7648
7649           /* If X is still an AND, see if it is an AND with a mask that
7650              is just some low-order bits.  If so, and it is MASK, we don't
7651              need it.  */
7652
7653           if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
7654               && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
7655                   == mask))
7656             x = XEXP (x, 0);
7657
7658           /* If it remains an AND, try making another AND with the bits
7659              in the mode mask that aren't in MASK turned on.  If the
7660              constant in the AND is wide enough, this might make a
7661              cheaper constant.  */
7662
7663           if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
7664               && GET_MODE_MASK (GET_MODE (x)) != mask
7665               && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
7666             {
7667               HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
7668                                     | (GET_MODE_MASK (GET_MODE (x)) & ~mask));
7669               int width = GET_MODE_BITSIZE (GET_MODE (x));
7670               rtx y;
7671
7672               /* If MODE is narrower than HOST_WIDE_INT and CVAL is a negative
7673                  number, sign extend it.  */
7674               if (width > 0 && width < HOST_BITS_PER_WIDE_INT
7675                   && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7676                 cval |= (HOST_WIDE_INT) -1 << width;
7677
7678               y = simplify_gen_binary (AND, GET_MODE (x),
7679                                        XEXP (x, 0), GEN_INT (cval));
7680               if (rtx_cost (y, SET, optimize_this_for_speed_p)
7681                   < rtx_cost (x, SET, optimize_this_for_speed_p))
7682                 x = y;
7683             }
7684
7685           break;
7686         }
7687
7688       goto binop;
7689
7690     case PLUS:
7691       /* In (and (plus FOO C1) M), if M is a mask that just turns off
7692          low-order bits (as in an alignment operation) and FOO is already
7693          aligned to that boundary, mask C1 to that boundary as well.
7694          This may eliminate that PLUS and, later, the AND.  */
7695
7696       {
7697         unsigned int width = GET_MODE_BITSIZE (mode);
7698         unsigned HOST_WIDE_INT smask = mask;
7699
7700         /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
7701            number, sign extend it.  */
7702
7703         if (width < HOST_BITS_PER_WIDE_INT
7704             && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7705           smask |= (HOST_WIDE_INT) -1 << width;
7706
7707         if (CONST_INT_P (XEXP (x, 1))
7708             && exact_log2 (- smask) >= 0
7709             && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
7710             && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
7711           return force_to_mode (plus_constant (XEXP (x, 0),
7712                                                (INTVAL (XEXP (x, 1)) & smask)),
7713                                 mode, smask, next_select);
7714       }
7715
7716       /* ... fall through ...  */
7717
7718     case MULT:
7719       /* For PLUS, MINUS and MULT, we need any bits less significant than the
7720          most significant bit in MASK since carries from those bits will
7721          affect the bits we are interested in.  */
7722       mask = fuller_mask;
7723       goto binop;
7724
7725     case MINUS:
7726       /* If X is (minus C Y) where C's least set bit is larger than any bit
7727          in the mask, then we may replace with (neg Y).  */
7728       if (CONST_INT_P (XEXP (x, 0))
7729           && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
7730                                         & -INTVAL (XEXP (x, 0))))
7731               > mask))
7732         {
7733           x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
7734                                   GET_MODE (x));
7735           return force_to_mode (x, mode, mask, next_select);
7736         }
7737
7738       /* Similarly, if C contains every bit in the fuller_mask, then we may
7739          replace with (not Y).  */
7740       if (CONST_INT_P (XEXP (x, 0))
7741           && ((INTVAL (XEXP (x, 0)) | (HOST_WIDE_INT) fuller_mask)
7742               == INTVAL (XEXP (x, 0))))
7743         {
7744           x = simplify_gen_unary (NOT, GET_MODE (x),
7745                                   XEXP (x, 1), GET_MODE (x));
7746           return force_to_mode (x, mode, mask, next_select);
7747         }
7748
7749       mask = fuller_mask;
7750       goto binop;
7751
7752     case IOR:
7753     case XOR:
7754       /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
7755          LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
7756          operation which may be a bitfield extraction.  Ensure that the
7757          constant we form is not wider than the mode of X.  */
7758
7759       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7760           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7761           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7762           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7763           && CONST_INT_P (XEXP (x, 1))
7764           && ((INTVAL (XEXP (XEXP (x, 0), 1))
7765                + floor_log2 (INTVAL (XEXP (x, 1))))
7766               < GET_MODE_BITSIZE (GET_MODE (x)))
7767           && (INTVAL (XEXP (x, 1))
7768               & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
7769         {
7770           temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
7771                           << INTVAL (XEXP (XEXP (x, 0), 1)));
7772           temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
7773                                       XEXP (XEXP (x, 0), 0), temp);
7774           x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
7775                                    XEXP (XEXP (x, 0), 1));
7776           return force_to_mode (x, mode, mask, next_select);
7777         }
7778
7779     binop:
7780       /* For most binary operations, just propagate into the operation and
7781          change the mode if we have an operation of that mode.  */
7782
7783       op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
7784       op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
7785
7786       /* If we ended up truncating both operands, truncate the result of the
7787          operation instead.  */
7788       if (GET_CODE (op0) == TRUNCATE
7789           && GET_CODE (op1) == TRUNCATE)
7790         {
7791           op0 = XEXP (op0, 0);
7792           op1 = XEXP (op1, 0);
7793         }
7794
7795       op0 = gen_lowpart_or_truncate (op_mode, op0);
7796       op1 = gen_lowpart_or_truncate (op_mode, op1);
7797
7798       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7799         x = simplify_gen_binary (code, op_mode, op0, op1);
7800       break;
7801
7802     case ASHIFT:
7803       /* For left shifts, do the same, but just for the first operand.
7804          However, we cannot do anything with shifts where we cannot
7805          guarantee that the counts are smaller than the size of the mode
7806          because such a count will have a different meaning in a
7807          wider mode.  */
7808
7809       if (! (CONST_INT_P (XEXP (x, 1))
7810              && INTVAL (XEXP (x, 1)) >= 0
7811              && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
7812           && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
7813                 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
7814                     < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
7815         break;
7816
7817       /* If the shift count is a constant and we can do arithmetic in
7818          the mode of the shift, refine which bits we need.  Otherwise, use the
7819          conservative form of the mask.  */
7820       if (CONST_INT_P (XEXP (x, 1))
7821           && INTVAL (XEXP (x, 1)) >= 0
7822           && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
7823           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7824         mask >>= INTVAL (XEXP (x, 1));
7825       else
7826         mask = fuller_mask;
7827
7828       op0 = gen_lowpart_or_truncate (op_mode,
7829                                      force_to_mode (XEXP (x, 0), op_mode,
7830                                                     mask, next_select));
7831
7832       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7833         x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
7834       break;
7835
7836     case LSHIFTRT:
7837       /* Here we can only do something if the shift count is a constant,
7838          this shift constant is valid for the host, and we can do arithmetic
7839          in OP_MODE.  */
7840
7841       if (CONST_INT_P (XEXP (x, 1))
7842           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7843           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7844         {
7845           rtx inner = XEXP (x, 0);
7846           unsigned HOST_WIDE_INT inner_mask;
7847
7848           /* Select the mask of the bits we need for the shift operand.  */
7849           inner_mask = mask << INTVAL (XEXP (x, 1));
7850
7851           /* We can only change the mode of the shift if we can do arithmetic
7852              in the mode of the shift and INNER_MASK is no wider than the
7853              width of X's mode.  */
7854           if ((inner_mask & ~GET_MODE_MASK (GET_MODE (x))) != 0)
7855             op_mode = GET_MODE (x);
7856
7857           inner = force_to_mode (inner, op_mode, inner_mask, next_select);
7858
7859           if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
7860             x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
7861         }
7862
7863       /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
7864          shift and AND produces only copies of the sign bit (C2 is one less
7865          than a power of two), we can do this with just a shift.  */
7866
7867       if (GET_CODE (x) == LSHIFTRT
7868           && CONST_INT_P (XEXP (x, 1))
7869           /* The shift puts one of the sign bit copies in the least significant
7870              bit.  */
7871           && ((INTVAL (XEXP (x, 1))
7872                + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
7873               >= GET_MODE_BITSIZE (GET_MODE (x)))
7874           && exact_log2 (mask + 1) >= 0
7875           /* Number of bits left after the shift must be more than the mask
7876              needs.  */
7877           && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
7878               <= GET_MODE_BITSIZE (GET_MODE (x)))
7879           /* Must be more sign bit copies than the mask needs.  */
7880           && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
7881               >= exact_log2 (mask + 1)))
7882         x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7883                                  GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
7884                                           - exact_log2 (mask + 1)));
7885
7886       goto shiftrt;
7887
7888     case ASHIFTRT:
7889       /* If we are just looking for the sign bit, we don't need this shift at
7890          all, even if it has a variable count.  */
7891       if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
7892           && (mask == ((unsigned HOST_WIDE_INT) 1
7893                        << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
7894         return force_to_mode (XEXP (x, 0), mode, mask, next_select);
7895
7896       /* If this is a shift by a constant, get a mask that contains those bits
7897          that are not copies of the sign bit.  We then have two cases:  If
7898          MASK only includes those bits, this can be a logical shift, which may
7899          allow simplifications.  If MASK is a single-bit field not within
7900          those bits, we are requesting a copy of the sign bit and hence can
7901          shift the sign bit to the appropriate location.  */
7902
7903       if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0
7904           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7905         {
7906           int i;
7907
7908           /* If the considered data is wider than HOST_WIDE_INT, we can't
7909              represent a mask for all its bits in a single scalar.
7910              But we only care about the lower bits, so calculate these.  */
7911
7912           if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
7913             {
7914               nonzero = ~(HOST_WIDE_INT) 0;
7915
7916               /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7917                  is the number of bits a full-width mask would have set.
7918                  We need only shift if these are fewer than nonzero can
7919                  hold.  If not, we must keep all bits set in nonzero.  */
7920
7921               if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7922                   < HOST_BITS_PER_WIDE_INT)
7923                 nonzero >>= INTVAL (XEXP (x, 1))
7924                             + HOST_BITS_PER_WIDE_INT
7925                             - GET_MODE_BITSIZE (GET_MODE (x)) ;
7926             }
7927           else
7928             {
7929               nonzero = GET_MODE_MASK (GET_MODE (x));
7930               nonzero >>= INTVAL (XEXP (x, 1));
7931             }
7932
7933           if ((mask & ~nonzero) == 0)
7934             {
7935               x = simplify_shift_const (NULL_RTX, LSHIFTRT, GET_MODE (x),
7936                                         XEXP (x, 0), INTVAL (XEXP (x, 1)));
7937               if (GET_CODE (x) != ASHIFTRT)
7938                 return force_to_mode (x, mode, mask, next_select);
7939             }
7940
7941           else if ((i = exact_log2 (mask)) >= 0)
7942             {
7943               x = simplify_shift_const
7944                   (NULL_RTX, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7945                    GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
7946
7947               if (GET_CODE (x) != ASHIFTRT)
7948                 return force_to_mode (x, mode, mask, next_select);
7949             }
7950         }
7951
7952       /* If MASK is 1, convert this to an LSHIFTRT.  This can be done
7953          even if the shift count isn't a constant.  */
7954       if (mask == 1)
7955         x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
7956                                  XEXP (x, 0), XEXP (x, 1));
7957
7958     shiftrt:
7959
7960       /* If this is a zero- or sign-extension operation that just affects bits
7961          we don't care about, remove it.  Be sure the call above returned
7962          something that is still a shift.  */
7963
7964       if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
7965           && CONST_INT_P (XEXP (x, 1))
7966           && INTVAL (XEXP (x, 1)) >= 0
7967           && (INTVAL (XEXP (x, 1))
7968               <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
7969           && GET_CODE (XEXP (x, 0)) == ASHIFT
7970           && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
7971         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
7972                               next_select);
7973
7974       break;
7975
7976     case ROTATE:
7977     case ROTATERT:
7978       /* If the shift count is constant and we can do computations
7979          in the mode of X, compute where the bits we care about are.
7980          Otherwise, we can't do anything.  Don't change the mode of
7981          the shift or propagate MODE into the shift, though.  */
7982       if (CONST_INT_P (XEXP (x, 1))
7983           && INTVAL (XEXP (x, 1)) >= 0)
7984         {
7985           temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
7986                                             GET_MODE (x), GEN_INT (mask),
7987                                             XEXP (x, 1));
7988           if (temp && CONST_INT_P (temp))
7989             SUBST (XEXP (x, 0),
7990                    force_to_mode (XEXP (x, 0), GET_MODE (x),
7991                                   INTVAL (temp), next_select));
7992         }
7993       break;
7994
7995     case NEG:
7996       /* If we just want the low-order bit, the NEG isn't needed since it
7997          won't change the low-order bit.  */
7998       if (mask == 1)
7999         return force_to_mode (XEXP (x, 0), mode, mask, just_select);
8000
8001       /* We need any bits less significant than the most significant bit in
8002          MASK since carries from those bits will affect the bits we are
8003          interested in.  */
8004       mask = fuller_mask;
8005       goto unop;
8006
8007     case NOT:
8008       /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
8009          same as the XOR case above.  Ensure that the constant we form is not
8010          wider than the mode of X.  */
8011
8012       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8013           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8014           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8015           && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
8016               < GET_MODE_BITSIZE (GET_MODE (x)))
8017           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
8018         {
8019           temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
8020                                GET_MODE (x));
8021           temp = simplify_gen_binary (XOR, GET_MODE (x),
8022                                       XEXP (XEXP (x, 0), 0), temp);
8023           x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8024                                    temp, XEXP (XEXP (x, 0), 1));
8025
8026           return force_to_mode (x, mode, mask, next_select);
8027         }
8028
8029       /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
8030          use the full mask inside the NOT.  */
8031       mask = fuller_mask;
8032
8033     unop:
8034       op0 = gen_lowpart_or_truncate (op_mode,
8035                                      force_to_mode (XEXP (x, 0), mode, mask,
8036                                                     next_select));
8037       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
8038         x = simplify_gen_unary (code, op_mode, op0, op_mode);
8039       break;
8040
8041     case NE:
8042       /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
8043          in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
8044          which is equal to STORE_FLAG_VALUE.  */
8045       if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
8046           && GET_MODE (XEXP (x, 0)) == mode
8047           && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
8048           && (nonzero_bits (XEXP (x, 0), mode)
8049               == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
8050         return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8051
8052       break;
8053
8054     case IF_THEN_ELSE:
8055       /* We have no way of knowing if the IF_THEN_ELSE can itself be
8056          written in a narrower mode.  We play it safe and do not do so.  */
8057
8058       SUBST (XEXP (x, 1),
8059              gen_lowpart_or_truncate (GET_MODE (x),
8060                                       force_to_mode (XEXP (x, 1), mode,
8061                                                      mask, next_select)));
8062       SUBST (XEXP (x, 2),
8063              gen_lowpart_or_truncate (GET_MODE (x),
8064                                       force_to_mode (XEXP (x, 2), mode,
8065                                                      mask, next_select)));
8066       break;
8067
8068     default:
8069       break;
8070     }
8071
8072   /* Ensure we return a value of the proper mode.  */
8073   return gen_lowpart_or_truncate (mode, x);
8074 }
8075 \f
8076 /* Return nonzero if X is an expression that has one of two values depending on
8077    whether some other value is zero or nonzero.  In that case, we return the
8078    value that is being tested, *PTRUE is set to the value if the rtx being
8079    returned has a nonzero value, and *PFALSE is set to the other alternative.
8080
8081    If we return zero, we set *PTRUE and *PFALSE to X.  */
8082
8083 static rtx
8084 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
8085 {
8086   enum machine_mode mode = GET_MODE (x);
8087   enum rtx_code code = GET_CODE (x);
8088   rtx cond0, cond1, true0, true1, false0, false1;
8089   unsigned HOST_WIDE_INT nz;
8090
8091   /* If we are comparing a value against zero, we are done.  */
8092   if ((code == NE || code == EQ)
8093       && XEXP (x, 1) == const0_rtx)
8094     {
8095       *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
8096       *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
8097       return XEXP (x, 0);
8098     }
8099
8100   /* If this is a unary operation whose operand has one of two values, apply
8101      our opcode to compute those values.  */
8102   else if (UNARY_P (x)
8103            && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
8104     {
8105       *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
8106       *pfalse = simplify_gen_unary (code, mode, false0,
8107                                     GET_MODE (XEXP (x, 0)));
8108       return cond0;
8109     }
8110
8111   /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
8112      make can't possibly match and would suppress other optimizations.  */
8113   else if (code == COMPARE)
8114     ;
8115
8116   /* If this is a binary operation, see if either side has only one of two
8117      values.  If either one does or if both do and they are conditional on
8118      the same value, compute the new true and false values.  */
8119   else if (BINARY_P (x))
8120     {
8121       cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
8122       cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
8123
8124       if ((cond0 != 0 || cond1 != 0)
8125           && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
8126         {
8127           /* If if_then_else_cond returned zero, then true/false are the
8128              same rtl.  We must copy one of them to prevent invalid rtl
8129              sharing.  */
8130           if (cond0 == 0)
8131             true0 = copy_rtx (true0);
8132           else if (cond1 == 0)
8133             true1 = copy_rtx (true1);
8134
8135           if (COMPARISON_P (x))
8136             {
8137               *ptrue = simplify_gen_relational (code, mode, VOIDmode,
8138                                                 true0, true1);
8139               *pfalse = simplify_gen_relational (code, mode, VOIDmode,
8140                                                  false0, false1);
8141              }
8142           else
8143             {
8144               *ptrue = simplify_gen_binary (code, mode, true0, true1);
8145               *pfalse = simplify_gen_binary (code, mode, false0, false1);
8146             }
8147
8148           return cond0 ? cond0 : cond1;
8149         }
8150
8151       /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
8152          operands is zero when the other is nonzero, and vice-versa,
8153          and STORE_FLAG_VALUE is 1 or -1.  */
8154
8155       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8156           && (code == PLUS || code == IOR || code == XOR || code == MINUS
8157               || code == UMAX)
8158           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
8159         {
8160           rtx op0 = XEXP (XEXP (x, 0), 1);
8161           rtx op1 = XEXP (XEXP (x, 1), 1);
8162
8163           cond0 = XEXP (XEXP (x, 0), 0);
8164           cond1 = XEXP (XEXP (x, 1), 0);
8165
8166           if (COMPARISON_P (cond0)
8167               && COMPARISON_P (cond1)
8168               && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
8169                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
8170                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
8171                   || ((swap_condition (GET_CODE (cond0))
8172                        == reversed_comparison_code (cond1, NULL))
8173                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
8174                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
8175               && ! side_effects_p (x))
8176             {
8177               *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
8178               *pfalse = simplify_gen_binary (MULT, mode,
8179                                              (code == MINUS
8180                                               ? simplify_gen_unary (NEG, mode,
8181                                                                     op1, mode)
8182                                               : op1),
8183                                               const_true_rtx);
8184               return cond0;
8185             }
8186         }
8187
8188       /* Similarly for MULT, AND and UMIN, except that for these the result
8189          is always zero.  */
8190       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8191           && (code == MULT || code == AND || code == UMIN)
8192           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
8193         {
8194           cond0 = XEXP (XEXP (x, 0), 0);
8195           cond1 = XEXP (XEXP (x, 1), 0);
8196
8197           if (COMPARISON_P (cond0)
8198               && COMPARISON_P (cond1)
8199               && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
8200                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
8201                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
8202                   || ((swap_condition (GET_CODE (cond0))
8203                        == reversed_comparison_code (cond1, NULL))
8204                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
8205                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
8206               && ! side_effects_p (x))
8207             {
8208               *ptrue = *pfalse = const0_rtx;
8209               return cond0;
8210             }
8211         }
8212     }
8213
8214   else if (code == IF_THEN_ELSE)
8215     {
8216       /* If we have IF_THEN_ELSE already, extract the condition and
8217          canonicalize it if it is NE or EQ.  */
8218       cond0 = XEXP (x, 0);
8219       *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
8220       if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
8221         return XEXP (cond0, 0);
8222       else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
8223         {
8224           *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
8225           return XEXP (cond0, 0);
8226         }
8227       else
8228         return cond0;
8229     }
8230
8231   /* If X is a SUBREG, we can narrow both the true and false values
8232      if the inner expression, if there is a condition.  */
8233   else if (code == SUBREG
8234            && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
8235                                                &true0, &false0)))
8236     {
8237       true0 = simplify_gen_subreg (mode, true0,
8238                                    GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
8239       false0 = simplify_gen_subreg (mode, false0,
8240                                     GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
8241       if (true0 && false0)
8242         {
8243           *ptrue = true0;
8244           *pfalse = false0;
8245           return cond0;
8246         }
8247     }
8248
8249   /* If X is a constant, this isn't special and will cause confusions
8250      if we treat it as such.  Likewise if it is equivalent to a constant.  */
8251   else if (CONSTANT_P (x)
8252            || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
8253     ;
8254
8255   /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
8256      will be least confusing to the rest of the compiler.  */
8257   else if (mode == BImode)
8258     {
8259       *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
8260       return x;
8261     }
8262
8263   /* If X is known to be either 0 or -1, those are the true and
8264      false values when testing X.  */
8265   else if (x == constm1_rtx || x == const0_rtx
8266            || (mode != VOIDmode
8267                && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
8268     {
8269       *ptrue = constm1_rtx, *pfalse = const0_rtx;
8270       return x;
8271     }
8272
8273   /* Likewise for 0 or a single bit.  */
8274   else if (SCALAR_INT_MODE_P (mode)
8275            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8276            && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
8277     {
8278       *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
8279       return x;
8280     }
8281
8282   /* Otherwise fail; show no condition with true and false values the same.  */
8283   *ptrue = *pfalse = x;
8284   return 0;
8285 }
8286 \f
8287 /* Return the value of expression X given the fact that condition COND
8288    is known to be true when applied to REG as its first operand and VAL
8289    as its second.  X is known to not be shared and so can be modified in
8290    place.
8291
8292    We only handle the simplest cases, and specifically those cases that
8293    arise with IF_THEN_ELSE expressions.  */
8294
8295 static rtx
8296 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
8297 {
8298   enum rtx_code code = GET_CODE (x);
8299   rtx temp;
8300   const char *fmt;
8301   int i, j;
8302
8303   if (side_effects_p (x))
8304     return x;
8305
8306   /* If either operand of the condition is a floating point value,
8307      then we have to avoid collapsing an EQ comparison.  */
8308   if (cond == EQ
8309       && rtx_equal_p (x, reg)
8310       && ! FLOAT_MODE_P (GET_MODE (x))
8311       && ! FLOAT_MODE_P (GET_MODE (val)))
8312     return val;
8313
8314   if (cond == UNEQ && rtx_equal_p (x, reg))
8315     return val;
8316
8317   /* If X is (abs REG) and we know something about REG's relationship
8318      with zero, we may be able to simplify this.  */
8319
8320   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
8321     switch (cond)
8322       {
8323       case GE:  case GT:  case EQ:
8324         return XEXP (x, 0);
8325       case LT:  case LE:
8326         return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
8327                                    XEXP (x, 0),
8328                                    GET_MODE (XEXP (x, 0)));
8329       default:
8330         break;
8331       }
8332
8333   /* The only other cases we handle are MIN, MAX, and comparisons if the
8334      operands are the same as REG and VAL.  */
8335
8336   else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
8337     {
8338       if (rtx_equal_p (XEXP (x, 0), val))
8339         cond = swap_condition (cond), temp = val, val = reg, reg = temp;
8340
8341       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
8342         {
8343           if (COMPARISON_P (x))
8344             {
8345               if (comparison_dominates_p (cond, code))
8346                 return const_true_rtx;
8347
8348               code = reversed_comparison_code (x, NULL);
8349               if (code != UNKNOWN
8350                   && comparison_dominates_p (cond, code))
8351                 return const0_rtx;
8352               else
8353                 return x;
8354             }
8355           else if (code == SMAX || code == SMIN
8356                    || code == UMIN || code == UMAX)
8357             {
8358               int unsignedp = (code == UMIN || code == UMAX);
8359
8360               /* Do not reverse the condition when it is NE or EQ.
8361                  This is because we cannot conclude anything about
8362                  the value of 'SMAX (x, y)' when x is not equal to y,
8363                  but we can when x equals y.  */
8364               if ((code == SMAX || code == UMAX)
8365                   && ! (cond == EQ || cond == NE))
8366                 cond = reverse_condition (cond);
8367
8368               switch (cond)
8369                 {
8370                 case GE:   case GT:
8371                   return unsignedp ? x : XEXP (x, 1);
8372                 case LE:   case LT:
8373                   return unsignedp ? x : XEXP (x, 0);
8374                 case GEU:  case GTU:
8375                   return unsignedp ? XEXP (x, 1) : x;
8376                 case LEU:  case LTU:
8377                   return unsignedp ? XEXP (x, 0) : x;
8378                 default:
8379                   break;
8380                 }
8381             }
8382         }
8383     }
8384   else if (code == SUBREG)
8385     {
8386       enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
8387       rtx new_rtx, r = known_cond (SUBREG_REG (x), cond, reg, val);
8388
8389       if (SUBREG_REG (x) != r)
8390         {
8391           /* We must simplify subreg here, before we lose track of the
8392              original inner_mode.  */
8393           new_rtx = simplify_subreg (GET_MODE (x), r,
8394                                  inner_mode, SUBREG_BYTE (x));
8395           if (new_rtx)
8396             return new_rtx;
8397           else
8398             SUBST (SUBREG_REG (x), r);
8399         }
8400
8401       return x;
8402     }
8403   /* We don't have to handle SIGN_EXTEND here, because even in the
8404      case of replacing something with a modeless CONST_INT, a
8405      CONST_INT is already (supposed to be) a valid sign extension for
8406      its narrower mode, which implies it's already properly
8407      sign-extended for the wider mode.  Now, for ZERO_EXTEND, the
8408      story is different.  */
8409   else if (code == ZERO_EXTEND)
8410     {
8411       enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
8412       rtx new_rtx, r = known_cond (XEXP (x, 0), cond, reg, val);
8413
8414       if (XEXP (x, 0) != r)
8415         {
8416           /* We must simplify the zero_extend here, before we lose
8417              track of the original inner_mode.  */
8418           new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
8419                                           r, inner_mode);
8420           if (new_rtx)
8421             return new_rtx;
8422           else
8423             SUBST (XEXP (x, 0), r);
8424         }
8425
8426       return x;
8427     }
8428
8429   fmt = GET_RTX_FORMAT (code);
8430   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8431     {
8432       if (fmt[i] == 'e')
8433         SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
8434       else if (fmt[i] == 'E')
8435         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8436           SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
8437                                                 cond, reg, val));
8438     }
8439
8440   return x;
8441 }
8442 \f
8443 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
8444    assignment as a field assignment.  */
8445
8446 static int
8447 rtx_equal_for_field_assignment_p (rtx x, rtx y)
8448 {
8449   if (x == y || rtx_equal_p (x, y))
8450     return 1;
8451
8452   if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
8453     return 0;
8454
8455   /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
8456      Note that all SUBREGs of MEM are paradoxical; otherwise they
8457      would have been rewritten.  */
8458   if (MEM_P (x) && GET_CODE (y) == SUBREG
8459       && MEM_P (SUBREG_REG (y))
8460       && rtx_equal_p (SUBREG_REG (y),
8461                       gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
8462     return 1;
8463
8464   if (MEM_P (y) && GET_CODE (x) == SUBREG
8465       && MEM_P (SUBREG_REG (x))
8466       && rtx_equal_p (SUBREG_REG (x),
8467                       gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
8468     return 1;
8469
8470   /* We used to see if get_last_value of X and Y were the same but that's
8471      not correct.  In one direction, we'll cause the assignment to have
8472      the wrong destination and in the case, we'll import a register into this
8473      insn that might have already have been dead.   So fail if none of the
8474      above cases are true.  */
8475   return 0;
8476 }
8477 \f
8478 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
8479    Return that assignment if so.
8480
8481    We only handle the most common cases.  */
8482
8483 static rtx
8484 make_field_assignment (rtx x)
8485 {
8486   rtx dest = SET_DEST (x);
8487   rtx src = SET_SRC (x);
8488   rtx assign;
8489   rtx rhs, lhs;
8490   HOST_WIDE_INT c1;
8491   HOST_WIDE_INT pos;
8492   unsigned HOST_WIDE_INT len;
8493   rtx other;
8494   enum machine_mode mode;
8495
8496   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
8497      a clear of a one-bit field.  We will have changed it to
8498      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
8499      for a SUBREG.  */
8500
8501   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
8502       && CONST_INT_P (XEXP (XEXP (src, 0), 0))
8503       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
8504       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8505     {
8506       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8507                                 1, 1, 1, 0);
8508       if (assign != 0)
8509         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8510       return x;
8511     }
8512
8513   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
8514       && subreg_lowpart_p (XEXP (src, 0))
8515       && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
8516           < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
8517       && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
8518       && CONST_INT_P (XEXP (SUBREG_REG (XEXP (src, 0)), 0))
8519       && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
8520       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8521     {
8522       assign = make_extraction (VOIDmode, dest, 0,
8523                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
8524                                 1, 1, 1, 0);
8525       if (assign != 0)
8526         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8527       return x;
8528     }
8529
8530   /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
8531      one-bit field.  */
8532   if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
8533       && XEXP (XEXP (src, 0), 0) == const1_rtx
8534       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8535     {
8536       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8537                                 1, 1, 1, 0);
8538       if (assign != 0)
8539         return gen_rtx_SET (VOIDmode, assign, const1_rtx);
8540       return x;
8541     }
8542
8543   /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
8544      SRC is an AND with all bits of that field set, then we can discard
8545      the AND.  */
8546   if (GET_CODE (dest) == ZERO_EXTRACT
8547       && CONST_INT_P (XEXP (dest, 1))
8548       && GET_CODE (src) == AND
8549       && CONST_INT_P (XEXP (src, 1)))
8550     {
8551       HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
8552       unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
8553       unsigned HOST_WIDE_INT ze_mask;
8554
8555       if (width >= HOST_BITS_PER_WIDE_INT)
8556         ze_mask = -1;
8557       else
8558         ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
8559
8560       /* Complete overlap.  We can remove the source AND.  */
8561       if ((and_mask & ze_mask) == ze_mask)
8562         return gen_rtx_SET (VOIDmode, dest, XEXP (src, 0));
8563
8564       /* Partial overlap.  We can reduce the source AND.  */
8565       if ((and_mask & ze_mask) != and_mask)
8566         {
8567           mode = GET_MODE (src);
8568           src = gen_rtx_AND (mode, XEXP (src, 0),
8569                              gen_int_mode (and_mask & ze_mask, mode));
8570           return gen_rtx_SET (VOIDmode, dest, src);
8571         }
8572     }
8573
8574   /* The other case we handle is assignments into a constant-position
8575      field.  They look like (ior/xor (and DEST C1) OTHER).  If C1 represents
8576      a mask that has all one bits except for a group of zero bits and
8577      OTHER is known to have zeros where C1 has ones, this is such an
8578      assignment.  Compute the position and length from C1.  Shift OTHER
8579      to the appropriate position, force it to the required mode, and
8580      make the extraction.  Check for the AND in both operands.  */
8581
8582   if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
8583     return x;
8584
8585   rhs = expand_compound_operation (XEXP (src, 0));
8586   lhs = expand_compound_operation (XEXP (src, 1));
8587
8588   if (GET_CODE (rhs) == AND
8589       && CONST_INT_P (XEXP (rhs, 1))
8590       && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
8591     c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
8592   else if (GET_CODE (lhs) == AND
8593            && CONST_INT_P (XEXP (lhs, 1))
8594            && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
8595     c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
8596   else
8597     return x;
8598
8599   pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
8600   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
8601       || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
8602       || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
8603     return x;
8604
8605   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
8606   if (assign == 0)
8607     return x;
8608
8609   /* The mode to use for the source is the mode of the assignment, or of
8610      what is inside a possible STRICT_LOW_PART.  */
8611   mode = (GET_CODE (assign) == STRICT_LOW_PART
8612           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
8613
8614   /* Shift OTHER right POS places and make it the source, restricting it
8615      to the proper length and mode.  */
8616
8617   src = canon_reg_for_combine (simplify_shift_const (NULL_RTX, LSHIFTRT,
8618                                                      GET_MODE (src),
8619                                                      other, pos),
8620                                dest);
8621   src = force_to_mode (src, mode,
8622                        GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
8623                        ? ~(unsigned HOST_WIDE_INT) 0
8624                        : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
8625                        0);
8626
8627   /* If SRC is masked by an AND that does not make a difference in
8628      the value being stored, strip it.  */
8629   if (GET_CODE (assign) == ZERO_EXTRACT
8630       && CONST_INT_P (XEXP (assign, 1))
8631       && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
8632       && GET_CODE (src) == AND
8633       && CONST_INT_P (XEXP (src, 1))
8634       && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (src, 1))
8635           == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1))
8636     src = XEXP (src, 0);
8637
8638   return gen_rtx_SET (VOIDmode, assign, src);
8639 }
8640 \f
8641 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
8642    if so.  */
8643
8644 static rtx
8645 apply_distributive_law (rtx x)
8646 {
8647   enum rtx_code code = GET_CODE (x);
8648   enum rtx_code inner_code;
8649   rtx lhs, rhs, other;
8650   rtx tem;
8651
8652   /* Distributivity is not true for floating point as it can change the
8653      value.  So we don't do it unless -funsafe-math-optimizations.  */
8654   if (FLOAT_MODE_P (GET_MODE (x))
8655       && ! flag_unsafe_math_optimizations)
8656     return x;
8657
8658   /* The outer operation can only be one of the following:  */
8659   if (code != IOR && code != AND && code != XOR
8660       && code != PLUS && code != MINUS)
8661     return x;
8662
8663   lhs = XEXP (x, 0);
8664   rhs = XEXP (x, 1);
8665
8666   /* If either operand is a primitive we can't do anything, so get out
8667      fast.  */
8668   if (OBJECT_P (lhs) || OBJECT_P (rhs))
8669     return x;
8670
8671   lhs = expand_compound_operation (lhs);
8672   rhs = expand_compound_operation (rhs);
8673   inner_code = GET_CODE (lhs);
8674   if (inner_code != GET_CODE (rhs))
8675     return x;
8676
8677   /* See if the inner and outer operations distribute.  */
8678   switch (inner_code)
8679     {
8680     case LSHIFTRT:
8681     case ASHIFTRT:
8682     case AND:
8683     case IOR:
8684       /* These all distribute except over PLUS.  */
8685       if (code == PLUS || code == MINUS)
8686         return x;
8687       break;
8688
8689     case MULT:
8690       if (code != PLUS && code != MINUS)
8691         return x;
8692       break;
8693
8694     case ASHIFT:
8695       /* This is also a multiply, so it distributes over everything.  */
8696       break;
8697
8698     case SUBREG:
8699       /* Non-paradoxical SUBREGs distributes over all operations,
8700          provided the inner modes and byte offsets are the same, this
8701          is an extraction of a low-order part, we don't convert an fp
8702          operation to int or vice versa, this is not a vector mode,
8703          and we would not be converting a single-word operation into a
8704          multi-word operation.  The latter test is not required, but
8705          it prevents generating unneeded multi-word operations.  Some
8706          of the previous tests are redundant given the latter test,
8707          but are retained because they are required for correctness.
8708
8709          We produce the result slightly differently in this case.  */
8710
8711       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
8712           || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
8713           || ! subreg_lowpart_p (lhs)
8714           || (GET_MODE_CLASS (GET_MODE (lhs))
8715               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
8716           || (GET_MODE_SIZE (GET_MODE (lhs))
8717               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
8718           || VECTOR_MODE_P (GET_MODE (lhs))
8719           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD
8720           /* Result might need to be truncated.  Don't change mode if
8721              explicit truncation is needed.  */
8722           || !TRULY_NOOP_TRUNCATION
8723                (GET_MODE_BITSIZE (GET_MODE (x)),
8724                 GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (lhs)))))
8725         return x;
8726
8727       tem = simplify_gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
8728                                  SUBREG_REG (lhs), SUBREG_REG (rhs));
8729       return gen_lowpart (GET_MODE (x), tem);
8730
8731     default:
8732       return x;
8733     }
8734
8735   /* Set LHS and RHS to the inner operands (A and B in the example
8736      above) and set OTHER to the common operand (C in the example).
8737      There is only one way to do this unless the inner operation is
8738      commutative.  */
8739   if (COMMUTATIVE_ARITH_P (lhs)
8740       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
8741     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
8742   else if (COMMUTATIVE_ARITH_P (lhs)
8743            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
8744     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
8745   else if (COMMUTATIVE_ARITH_P (lhs)
8746            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
8747     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
8748   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
8749     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
8750   else
8751     return x;
8752
8753   /* Form the new inner operation, seeing if it simplifies first.  */
8754   tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
8755
8756   /* There is one exception to the general way of distributing:
8757      (a | c) ^ (b | c) -> (a ^ b) & ~c  */
8758   if (code == XOR && inner_code == IOR)
8759     {
8760       inner_code = AND;
8761       other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
8762     }
8763
8764   /* We may be able to continuing distributing the result, so call
8765      ourselves recursively on the inner operation before forming the
8766      outer operation, which we return.  */
8767   return simplify_gen_binary (inner_code, GET_MODE (x),
8768                               apply_distributive_law (tem), other);
8769 }
8770
8771 /* See if X is of the form (* (+ A B) C), and if so convert to
8772    (+ (* A C) (* B C)) and try to simplify.
8773
8774    Most of the time, this results in no change.  However, if some of
8775    the operands are the same or inverses of each other, simplifications
8776    will result.
8777
8778    For example, (and (ior A B) (not B)) can occur as the result of
8779    expanding a bit field assignment.  When we apply the distributive
8780    law to this, we get (ior (and (A (not B))) (and (B (not B)))),
8781    which then simplifies to (and (A (not B))).
8782
8783    Note that no checks happen on the validity of applying the inverse
8784    distributive law.  This is pointless since we can do it in the
8785    few places where this routine is called.
8786
8787    N is the index of the term that is decomposed (the arithmetic operation,
8788    i.e. (+ A B) in the first example above).  !N is the index of the term that
8789    is distributed, i.e. of C in the first example above.  */
8790 static rtx
8791 distribute_and_simplify_rtx (rtx x, int n)
8792 {
8793   enum machine_mode mode;
8794   enum rtx_code outer_code, inner_code;
8795   rtx decomposed, distributed, inner_op0, inner_op1, new_op0, new_op1, tmp;
8796
8797   /* Distributivity is not true for floating point as it can change the
8798      value.  So we don't do it unless -funsafe-math-optimizations.  */
8799   if (FLOAT_MODE_P (GET_MODE (x))
8800       && ! flag_unsafe_math_optimizations)
8801     return NULL_RTX;
8802
8803   decomposed = XEXP (x, n);
8804   if (!ARITHMETIC_P (decomposed))
8805     return NULL_RTX;
8806
8807   mode = GET_MODE (x);
8808   outer_code = GET_CODE (x);
8809   distributed = XEXP (x, !n);
8810
8811   inner_code = GET_CODE (decomposed);
8812   inner_op0 = XEXP (decomposed, 0);
8813   inner_op1 = XEXP (decomposed, 1);
8814
8815   /* Special case (and (xor B C) (not A)), which is equivalent to
8816      (xor (ior A B) (ior A C))  */
8817   if (outer_code == AND && inner_code == XOR && GET_CODE (distributed) == NOT)
8818     {
8819       distributed = XEXP (distributed, 0);
8820       outer_code = IOR;
8821     }
8822
8823   if (n == 0)
8824     {
8825       /* Distribute the second term.  */
8826       new_op0 = simplify_gen_binary (outer_code, mode, inner_op0, distributed);
8827       new_op1 = simplify_gen_binary (outer_code, mode, inner_op1, distributed);
8828     }
8829   else
8830     {
8831       /* Distribute the first term.  */
8832       new_op0 = simplify_gen_binary (outer_code, mode, distributed, inner_op0);
8833       new_op1 = simplify_gen_binary (outer_code, mode, distributed, inner_op1);
8834     }
8835
8836   tmp = apply_distributive_law (simplify_gen_binary (inner_code, mode,
8837                                                      new_op0, new_op1));
8838   if (GET_CODE (tmp) != outer_code
8839       && rtx_cost (tmp, SET, optimize_this_for_speed_p)
8840          < rtx_cost (x, SET, optimize_this_for_speed_p))
8841     return tmp;
8842
8843   return NULL_RTX;
8844 }
8845 \f
8846 /* Simplify a logical `and' of VAROP with the constant CONSTOP, to be done
8847    in MODE.  Return an equivalent form, if different from (and VAROP
8848    (const_int CONSTOP)).  Otherwise, return NULL_RTX.  */
8849
8850 static rtx
8851 simplify_and_const_int_1 (enum machine_mode mode, rtx varop,
8852                           unsigned HOST_WIDE_INT constop)
8853 {
8854   unsigned HOST_WIDE_INT nonzero;
8855   unsigned HOST_WIDE_INT orig_constop;
8856   rtx orig_varop;
8857   int i;
8858
8859   orig_varop = varop;
8860   orig_constop = constop;
8861   if (GET_CODE (varop) == CLOBBER)
8862     return NULL_RTX;
8863
8864   /* Simplify VAROP knowing that we will be only looking at some of the
8865      bits in it.
8866
8867      Note by passing in CONSTOP, we guarantee that the bits not set in
8868      CONSTOP are not significant and will never be examined.  We must
8869      ensure that is the case by explicitly masking out those bits
8870      before returning.  */
8871   varop = force_to_mode (varop, mode, constop, 0);
8872
8873   /* If VAROP is a CLOBBER, we will fail so return it.  */
8874   if (GET_CODE (varop) == CLOBBER)
8875     return varop;
8876
8877   /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
8878      to VAROP and return the new constant.  */
8879   if (CONST_INT_P (varop))
8880     return gen_int_mode (INTVAL (varop) & constop, mode);
8881
8882   /* See what bits may be nonzero in VAROP.  Unlike the general case of
8883      a call to nonzero_bits, here we don't care about bits outside
8884      MODE.  */
8885
8886   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
8887
8888   /* Turn off all bits in the constant that are known to already be zero.
8889      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
8890      which is tested below.  */
8891
8892   constop &= nonzero;
8893
8894   /* If we don't have any bits left, return zero.  */
8895   if (constop == 0)
8896     return const0_rtx;
8897
8898   /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
8899      a power of two, we can replace this with an ASHIFT.  */
8900   if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
8901       && (i = exact_log2 (constop)) >= 0)
8902     return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
8903
8904   /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
8905      or XOR, then try to apply the distributive law.  This may eliminate
8906      operations if either branch can be simplified because of the AND.
8907      It may also make some cases more complex, but those cases probably
8908      won't match a pattern either with or without this.  */
8909
8910   if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
8911     return
8912       gen_lowpart
8913         (mode,
8914          apply_distributive_law
8915          (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
8916                                simplify_and_const_int (NULL_RTX,
8917                                                        GET_MODE (varop),
8918                                                        XEXP (varop, 0),
8919                                                        constop),
8920                                simplify_and_const_int (NULL_RTX,
8921                                                        GET_MODE (varop),
8922                                                        XEXP (varop, 1),
8923                                                        constop))));
8924
8925   /* If VAROP is PLUS, and the constant is a mask of low bits, distribute
8926      the AND and see if one of the operands simplifies to zero.  If so, we
8927      may eliminate it.  */
8928
8929   if (GET_CODE (varop) == PLUS
8930       && exact_log2 (constop + 1) >= 0)
8931     {
8932       rtx o0, o1;
8933
8934       o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
8935       o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
8936       if (o0 == const0_rtx)
8937         return o1;
8938       if (o1 == const0_rtx)
8939         return o0;
8940     }
8941
8942   /* Make a SUBREG if necessary.  If we can't make it, fail.  */
8943   varop = gen_lowpart (mode, varop);
8944   if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
8945     return NULL_RTX;
8946
8947   /* If we are only masking insignificant bits, return VAROP.  */
8948   if (constop == nonzero)
8949     return varop;
8950
8951   if (varop == orig_varop && constop == orig_constop)
8952     return NULL_RTX;
8953
8954   /* Otherwise, return an AND.  */
8955   return simplify_gen_binary (AND, mode, varop, gen_int_mode (constop, mode));
8956 }
8957
8958
8959 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
8960    in MODE.
8961
8962    Return an equivalent form, if different from X.  Otherwise, return X.  If
8963    X is zero, we are to always construct the equivalent form.  */
8964
8965 static rtx
8966 simplify_and_const_int (rtx x, enum machine_mode mode, rtx varop,
8967                         unsigned HOST_WIDE_INT constop)
8968 {
8969   rtx tem = simplify_and_const_int_1 (mode, varop, constop);
8970   if (tem)
8971     return tem;
8972
8973   if (!x)
8974     x = simplify_gen_binary (AND, GET_MODE (varop), varop,
8975                              gen_int_mode (constop, mode));
8976   if (GET_MODE (x) != mode)
8977     x = gen_lowpart (mode, x);
8978   return x;
8979 }
8980 \f
8981 /* Given a REG, X, compute which bits in X can be nonzero.
8982    We don't care about bits outside of those defined in MODE.
8983
8984    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
8985    a shift, AND, or zero_extract, we can do better.  */
8986
8987 static rtx
8988 reg_nonzero_bits_for_combine (const_rtx x, enum machine_mode mode,
8989                               const_rtx known_x ATTRIBUTE_UNUSED,
8990                               enum machine_mode known_mode ATTRIBUTE_UNUSED,
8991                               unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
8992                               unsigned HOST_WIDE_INT *nonzero)
8993 {
8994   rtx tem;
8995   reg_stat_type *rsp;
8996
8997   /* If X is a register whose nonzero bits value is current, use it.
8998      Otherwise, if X is a register whose value we can find, use that
8999      value.  Otherwise, use the previously-computed global nonzero bits
9000      for this register.  */
9001
9002   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
9003   if (rsp->last_set_value != 0
9004       && (rsp->last_set_mode == mode
9005           || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
9006               && GET_MODE_CLASS (mode) == MODE_INT))
9007       && ((rsp->last_set_label >= label_tick_ebb_start
9008            && rsp->last_set_label < label_tick)
9009           || (rsp->last_set_label == label_tick
9010               && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
9011           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
9012               && REG_N_SETS (REGNO (x)) == 1
9013               && !REGNO_REG_SET_P
9014                   (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x)))))
9015     {
9016       *nonzero &= rsp->last_set_nonzero_bits;
9017       return NULL;
9018     }
9019
9020   tem = get_last_value (x);
9021
9022   if (tem)
9023     {
9024 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
9025       /* If X is narrower than MODE and TEM is a non-negative
9026          constant that would appear negative in the mode of X,
9027          sign-extend it for use in reg_nonzero_bits because some
9028          machines (maybe most) will actually do the sign-extension
9029          and this is the conservative approach.
9030
9031          ??? For 2.5, try to tighten up the MD files in this regard
9032          instead of this kludge.  */
9033
9034       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode)
9035           && CONST_INT_P (tem)
9036           && INTVAL (tem) > 0
9037           && 0 != (INTVAL (tem)
9038                    & ((HOST_WIDE_INT) 1
9039                       << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
9040         tem = GEN_INT (INTVAL (tem)
9041                        | ((HOST_WIDE_INT) (-1)
9042                           << GET_MODE_BITSIZE (GET_MODE (x))));
9043 #endif
9044       return tem;
9045     }
9046   else if (nonzero_sign_valid && rsp->nonzero_bits)
9047     {
9048       unsigned HOST_WIDE_INT mask = rsp->nonzero_bits;
9049
9050       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode))
9051         /* We don't know anything about the upper bits.  */
9052         mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
9053       *nonzero &= mask;
9054     }
9055
9056   return NULL;
9057 }
9058
9059 /* Return the number of bits at the high-order end of X that are known to
9060    be equal to the sign bit.  X will be used in mode MODE; if MODE is
9061    VOIDmode, X will be used in its own mode.  The returned value  will always
9062    be between 1 and the number of bits in MODE.  */
9063
9064 static rtx
9065 reg_num_sign_bit_copies_for_combine (const_rtx x, enum machine_mode mode,
9066                                      const_rtx known_x ATTRIBUTE_UNUSED,
9067                                      enum machine_mode known_mode
9068                                      ATTRIBUTE_UNUSED,
9069                                      unsigned int known_ret ATTRIBUTE_UNUSED,
9070                                      unsigned int *result)
9071 {
9072   rtx tem;
9073   reg_stat_type *rsp;
9074
9075   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
9076   if (rsp->last_set_value != 0
9077       && rsp->last_set_mode == mode
9078       && ((rsp->last_set_label >= label_tick_ebb_start
9079            && rsp->last_set_label < label_tick)
9080           || (rsp->last_set_label == label_tick
9081               && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
9082           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
9083               && REG_N_SETS (REGNO (x)) == 1
9084               && !REGNO_REG_SET_P
9085                   (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x)))))
9086     {
9087       *result = rsp->last_set_sign_bit_copies;
9088       return NULL;
9089     }
9090
9091   tem = get_last_value (x);
9092   if (tem != 0)
9093     return tem;
9094
9095   if (nonzero_sign_valid && rsp->sign_bit_copies != 0
9096       && GET_MODE_BITSIZE (GET_MODE (x)) == GET_MODE_BITSIZE (mode))
9097     *result = rsp->sign_bit_copies;
9098
9099   return NULL;
9100 }
9101 \f
9102 /* Return the number of "extended" bits there are in X, when interpreted
9103    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
9104    unsigned quantities, this is the number of high-order zero bits.
9105    For signed quantities, this is the number of copies of the sign bit
9106    minus 1.  In both case, this function returns the number of "spare"
9107    bits.  For example, if two quantities for which this function returns
9108    at least 1 are added, the addition is known not to overflow.
9109
9110    This function will always return 0 unless called during combine, which
9111    implies that it must be called from a define_split.  */
9112
9113 unsigned int
9114 extended_count (const_rtx x, enum machine_mode mode, int unsignedp)
9115 {
9116   if (nonzero_sign_valid == 0)
9117     return 0;
9118
9119   return (unsignedp
9120           ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9121              ? (unsigned int) (GET_MODE_BITSIZE (mode) - 1
9122                                - floor_log2 (nonzero_bits (x, mode)))
9123              : 0)
9124           : num_sign_bit_copies (x, mode) - 1);
9125 }
9126 \f
9127 /* This function is called from `simplify_shift_const' to merge two
9128    outer operations.  Specifically, we have already found that we need
9129    to perform operation *POP0 with constant *PCONST0 at the outermost
9130    position.  We would now like to also perform OP1 with constant CONST1
9131    (with *POP0 being done last).
9132
9133    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
9134    the resulting operation.  *PCOMP_P is set to 1 if we would need to
9135    complement the innermost operand, otherwise it is unchanged.
9136
9137    MODE is the mode in which the operation will be done.  No bits outside
9138    the width of this mode matter.  It is assumed that the width of this mode
9139    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
9140
9141    If *POP0 or OP1 are UNKNOWN, it means no operation is required.  Only NEG, PLUS,
9142    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
9143    result is simply *PCONST0.
9144
9145    If the resulting operation cannot be expressed as one operation, we
9146    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
9147
9148 static int
9149 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)
9150 {
9151   enum rtx_code op0 = *pop0;
9152   HOST_WIDE_INT const0 = *pconst0;
9153
9154   const0 &= GET_MODE_MASK (mode);
9155   const1 &= GET_MODE_MASK (mode);
9156
9157   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
9158   if (op0 == AND)
9159     const1 &= const0;
9160
9161   /* If OP0 or OP1 is UNKNOWN, this is easy.  Similarly if they are the same or
9162      if OP0 is SET.  */
9163
9164   if (op1 == UNKNOWN || op0 == SET)
9165     return 1;
9166
9167   else if (op0 == UNKNOWN)
9168     op0 = op1, const0 = const1;
9169
9170   else if (op0 == op1)
9171     {
9172       switch (op0)
9173         {
9174         case AND:
9175           const0 &= const1;
9176           break;
9177         case IOR:
9178           const0 |= const1;
9179           break;
9180         case XOR:
9181           const0 ^= const1;
9182           break;
9183         case PLUS:
9184           const0 += const1;
9185           break;
9186         case NEG:
9187           op0 = UNKNOWN;
9188           break;
9189         default:
9190           break;
9191         }
9192     }
9193
9194   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
9195   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
9196     return 0;
9197
9198   /* If the two constants aren't the same, we can't do anything.  The
9199      remaining six cases can all be done.  */
9200   else if (const0 != const1)
9201     return 0;
9202
9203   else
9204     switch (op0)
9205       {
9206       case IOR:
9207         if (op1 == AND)
9208           /* (a & b) | b == b */
9209           op0 = SET;
9210         else /* op1 == XOR */
9211           /* (a ^ b) | b == a | b */
9212           {;}
9213         break;
9214
9215       case XOR:
9216         if (op1 == AND)
9217           /* (a & b) ^ b == (~a) & b */
9218           op0 = AND, *pcomp_p = 1;
9219         else /* op1 == IOR */
9220           /* (a | b) ^ b == a & ~b */
9221           op0 = AND, const0 = ~const0;
9222         break;
9223
9224       case AND:
9225         if (op1 == IOR)
9226           /* (a | b) & b == b */
9227         op0 = SET;
9228         else /* op1 == XOR */
9229           /* (a ^ b) & b) == (~a) & b */
9230           *pcomp_p = 1;
9231         break;
9232       default:
9233         break;
9234       }
9235
9236   /* Check for NO-OP cases.  */
9237   const0 &= GET_MODE_MASK (mode);
9238   if (const0 == 0
9239       && (op0 == IOR || op0 == XOR || op0 == PLUS))
9240     op0 = UNKNOWN;
9241   else if (const0 == 0 && op0 == AND)
9242     op0 = SET;
9243   else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
9244            && op0 == AND)
9245     op0 = UNKNOWN;
9246
9247   *pop0 = op0;
9248
9249   /* ??? Slightly redundant with the above mask, but not entirely.
9250      Moving this above means we'd have to sign-extend the mode mask
9251      for the final test.  */
9252   if (op0 != UNKNOWN && op0 != NEG)
9253     *pconst0 = trunc_int_for_mode (const0, mode);
9254
9255   return 1;
9256 }
9257 \f
9258 /* A helper to simplify_shift_const_1 to determine the mode we can perform
9259    the shift in.  The original shift operation CODE is performed on OP in
9260    ORIG_MODE.  Return the wider mode MODE if we can perform the operation
9261    in that mode.  Return ORIG_MODE otherwise.  We can also assume that the
9262    result of the shift is subject to operation OUTER_CODE with operand
9263    OUTER_CONST.  */
9264
9265 static enum machine_mode
9266 try_widen_shift_mode (enum rtx_code code, rtx op, int count,
9267                       enum machine_mode orig_mode, enum machine_mode mode,
9268                       enum rtx_code outer_code, HOST_WIDE_INT outer_const)
9269 {
9270   if (orig_mode == mode)
9271     return mode;
9272   gcc_assert (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (orig_mode));
9273
9274   /* In general we can't perform in wider mode for right shift and rotate.  */
9275   switch (code)
9276     {
9277     case ASHIFTRT:
9278       /* We can still widen if the bits brought in from the left are identical
9279          to the sign bit of ORIG_MODE.  */
9280       if (num_sign_bit_copies (op, mode)
9281           > (unsigned) (GET_MODE_BITSIZE (mode)
9282                         - GET_MODE_BITSIZE (orig_mode)))
9283         return mode;
9284       return orig_mode;
9285
9286     case LSHIFTRT:
9287       /* Similarly here but with zero bits.  */
9288       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9289           && (nonzero_bits (op, mode) & ~GET_MODE_MASK (orig_mode)) == 0)
9290         return mode;
9291
9292       /* We can also widen if the bits brought in will be masked off.  This
9293          operation is performed in ORIG_MODE.  */
9294       if (outer_code == AND)
9295         {
9296           int care_bits = low_bitmask_len (orig_mode, outer_const);
9297
9298           if (care_bits >= 0
9299               && GET_MODE_BITSIZE (orig_mode) - care_bits >= count)
9300             return mode;
9301         }
9302       /* fall through */
9303
9304     case ROTATE:
9305       return orig_mode;
9306
9307     case ROTATERT:
9308       gcc_unreachable ();
9309
9310     default:
9311       return mode;
9312     }
9313 }
9314
9315 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
9316    The result of the shift is RESULT_MODE.  Return NULL_RTX if we cannot
9317    simplify it.  Otherwise, return a simplified value.
9318
9319    The shift is normally computed in the widest mode we find in VAROP, as
9320    long as it isn't a different number of words than RESULT_MODE.  Exceptions
9321    are ASHIFTRT and ROTATE, which are always done in their original mode.  */
9322
9323 static rtx
9324 simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode,
9325                         rtx varop, int orig_count)
9326 {
9327   enum rtx_code orig_code = code;
9328   rtx orig_varop = varop;
9329   int count;
9330   enum machine_mode mode = result_mode;
9331   enum machine_mode shift_mode, tmode;
9332   unsigned int mode_words
9333     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
9334   /* We form (outer_op (code varop count) (outer_const)).  */
9335   enum rtx_code outer_op = UNKNOWN;
9336   HOST_WIDE_INT outer_const = 0;
9337   int complement_p = 0;
9338   rtx new_rtx, x;
9339
9340   /* Make sure and truncate the "natural" shift on the way in.  We don't
9341      want to do this inside the loop as it makes it more difficult to
9342      combine shifts.  */
9343   if (SHIFT_COUNT_TRUNCATED)
9344     orig_count &= GET_MODE_BITSIZE (mode) - 1;
9345
9346   /* If we were given an invalid count, don't do anything except exactly
9347      what was requested.  */
9348
9349   if (orig_count < 0 || orig_count >= (int) GET_MODE_BITSIZE (mode))
9350     return NULL_RTX;
9351
9352   count = orig_count;
9353
9354   /* Unless one of the branches of the `if' in this loop does a `continue',
9355      we will `break' the loop after the `if'.  */
9356
9357   while (count != 0)
9358     {
9359       /* If we have an operand of (clobber (const_int 0)), fail.  */
9360       if (GET_CODE (varop) == CLOBBER)
9361         return NULL_RTX;
9362
9363       /* Convert ROTATERT to ROTATE.  */
9364       if (code == ROTATERT)
9365         {
9366           unsigned int bitsize = GET_MODE_BITSIZE (result_mode);;
9367           code = ROTATE;
9368           if (VECTOR_MODE_P (result_mode))
9369             count = bitsize / GET_MODE_NUNITS (result_mode) - count;
9370           else
9371             count = bitsize - count;
9372         }
9373
9374       shift_mode = try_widen_shift_mode (code, varop, count, result_mode,
9375                                          mode, outer_op, outer_const);
9376
9377       /* Handle cases where the count is greater than the size of the mode
9378          minus 1.  For ASHIFT, use the size minus one as the count (this can
9379          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
9380          take the count modulo the size.  For other shifts, the result is
9381          zero.
9382
9383          Since these shifts are being produced by the compiler by combining
9384          multiple operations, each of which are defined, we know what the
9385          result is supposed to be.  */
9386
9387       if (count > (GET_MODE_BITSIZE (shift_mode) - 1))
9388         {
9389           if (code == ASHIFTRT)
9390             count = GET_MODE_BITSIZE (shift_mode) - 1;
9391           else if (code == ROTATE || code == ROTATERT)
9392             count %= GET_MODE_BITSIZE (shift_mode);
9393           else
9394             {
9395               /* We can't simply return zero because there may be an
9396                  outer op.  */
9397               varop = const0_rtx;
9398               count = 0;
9399               break;
9400             }
9401         }
9402
9403       /* If we discovered we had to complement VAROP, leave.  Making a NOT
9404          here would cause an infinite loop.  */
9405       if (complement_p)
9406         break;
9407
9408       /* An arithmetic right shift of a quantity known to be -1 or 0
9409          is a no-op.  */
9410       if (code == ASHIFTRT
9411           && (num_sign_bit_copies (varop, shift_mode)
9412               == GET_MODE_BITSIZE (shift_mode)))
9413         {
9414           count = 0;
9415           break;
9416         }
9417
9418       /* If we are doing an arithmetic right shift and discarding all but
9419          the sign bit copies, this is equivalent to doing a shift by the
9420          bitsize minus one.  Convert it into that shift because it will often
9421          allow other simplifications.  */
9422
9423       if (code == ASHIFTRT
9424           && (count + num_sign_bit_copies (varop, shift_mode)
9425               >= GET_MODE_BITSIZE (shift_mode)))
9426         count = GET_MODE_BITSIZE (shift_mode) - 1;
9427
9428       /* We simplify the tests below and elsewhere by converting
9429          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
9430          `make_compound_operation' will convert it to an ASHIFTRT for
9431          those machines (such as VAX) that don't have an LSHIFTRT.  */
9432       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9433           && code == ASHIFTRT
9434           && ((nonzero_bits (varop, shift_mode)
9435                & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
9436               == 0))
9437         code = LSHIFTRT;
9438
9439       if (((code == LSHIFTRT
9440             && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9441             && !(nonzero_bits (varop, shift_mode) >> count))
9442            || (code == ASHIFT
9443                && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9444                && !((nonzero_bits (varop, shift_mode) << count)
9445                     & GET_MODE_MASK (shift_mode))))
9446           && !side_effects_p (varop))
9447         varop = const0_rtx;
9448
9449       switch (GET_CODE (varop))
9450         {
9451         case SIGN_EXTEND:
9452         case ZERO_EXTEND:
9453         case SIGN_EXTRACT:
9454         case ZERO_EXTRACT:
9455           new_rtx = expand_compound_operation (varop);
9456           if (new_rtx != varop)
9457             {
9458               varop = new_rtx;
9459               continue;
9460             }
9461           break;
9462
9463         case MEM:
9464           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
9465              minus the width of a smaller mode, we can do this with a
9466              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
9467           if ((code == ASHIFTRT || code == LSHIFTRT)
9468               && ! mode_dependent_address_p (XEXP (varop, 0))
9469               && ! MEM_VOLATILE_P (varop)
9470               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9471                                          MODE_INT, 1)) != BLKmode)
9472             {
9473               new_rtx = adjust_address_nv (varop, tmode,
9474                                        BYTES_BIG_ENDIAN ? 0
9475                                        : count / BITS_PER_UNIT);
9476
9477               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9478                                      : ZERO_EXTEND, mode, new_rtx);
9479               count = 0;
9480               continue;
9481             }
9482           break;
9483
9484         case SUBREG:
9485           /* If VAROP is a SUBREG, strip it as long as the inner operand has
9486              the same number of words as what we've seen so far.  Then store
9487              the widest mode in MODE.  */
9488           if (subreg_lowpart_p (varop)
9489               && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9490                   > GET_MODE_SIZE (GET_MODE (varop)))
9491               && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9492                                   + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
9493                  == mode_words)
9494             {
9495               varop = SUBREG_REG (varop);
9496               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
9497                 mode = GET_MODE (varop);
9498               continue;
9499             }
9500           break;
9501
9502         case MULT:
9503           /* Some machines use MULT instead of ASHIFT because MULT
9504              is cheaper.  But it is still better on those machines to
9505              merge two shifts into one.  */
9506           if (CONST_INT_P (XEXP (varop, 1))
9507               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9508             {
9509               varop
9510                 = simplify_gen_binary (ASHIFT, GET_MODE (varop),
9511                                        XEXP (varop, 0),
9512                                        GEN_INT (exact_log2 (
9513                                                 INTVAL (XEXP (varop, 1)))));
9514               continue;
9515             }
9516           break;
9517
9518         case UDIV:
9519           /* Similar, for when divides are cheaper.  */
9520           if (CONST_INT_P (XEXP (varop, 1))
9521               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9522             {
9523               varop
9524                 = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
9525                                        XEXP (varop, 0),
9526                                        GEN_INT (exact_log2 (
9527                                                 INTVAL (XEXP (varop, 1)))));
9528               continue;
9529             }
9530           break;
9531
9532         case ASHIFTRT:
9533           /* If we are extracting just the sign bit of an arithmetic
9534              right shift, that shift is not needed.  However, the sign
9535              bit of a wider mode may be different from what would be
9536              interpreted as the sign bit in a narrower mode, so, if
9537              the result is narrower, don't discard the shift.  */
9538           if (code == LSHIFTRT
9539               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9540               && (GET_MODE_BITSIZE (result_mode)
9541                   >= GET_MODE_BITSIZE (GET_MODE (varop))))
9542             {
9543               varop = XEXP (varop, 0);
9544               continue;
9545             }
9546
9547           /* ... fall through ...  */
9548
9549         case LSHIFTRT:
9550         case ASHIFT:
9551         case ROTATE:
9552           /* Here we have two nested shifts.  The result is usually the
9553              AND of a new shift with a mask.  We compute the result below.  */
9554           if (CONST_INT_P (XEXP (varop, 1))
9555               && INTVAL (XEXP (varop, 1)) >= 0
9556               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
9557               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9558               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9559               && !VECTOR_MODE_P (result_mode))
9560             {
9561               enum rtx_code first_code = GET_CODE (varop);
9562               unsigned int first_count = INTVAL (XEXP (varop, 1));
9563               unsigned HOST_WIDE_INT mask;
9564               rtx mask_rtx;
9565
9566               /* We have one common special case.  We can't do any merging if
9567                  the inner code is an ASHIFTRT of a smaller mode.  However, if
9568                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
9569                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
9570                  we can convert it to
9571                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
9572                  This simplifies certain SIGN_EXTEND operations.  */
9573               if (code == ASHIFT && first_code == ASHIFTRT
9574                   && count == (GET_MODE_BITSIZE (result_mode)
9575                                - GET_MODE_BITSIZE (GET_MODE (varop))))
9576                 {
9577                   /* C3 has the low-order C1 bits zero.  */
9578
9579                   mask = (GET_MODE_MASK (mode)
9580                           & ~(((HOST_WIDE_INT) 1 << first_count) - 1));
9581
9582                   varop = simplify_and_const_int (NULL_RTX, result_mode,
9583                                                   XEXP (varop, 0), mask);
9584                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
9585                                                 varop, count);
9586                   count = first_count;
9587                   code = ASHIFTRT;
9588                   continue;
9589                 }
9590
9591               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
9592                  than C1 high-order bits equal to the sign bit, we can convert
9593                  this to either an ASHIFT or an ASHIFTRT depending on the
9594                  two counts.
9595
9596                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
9597
9598               if (code == ASHIFTRT && first_code == ASHIFT
9599                   && GET_MODE (varop) == shift_mode
9600                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
9601                       > first_count))
9602                 {
9603                   varop = XEXP (varop, 0);
9604                   count -= first_count;
9605                   if (count < 0)
9606                     {
9607                       count = -count;
9608                       code = ASHIFT;
9609                     }
9610
9611                   continue;
9612                 }
9613
9614               /* There are some cases we can't do.  If CODE is ASHIFTRT,
9615                  we can only do this if FIRST_CODE is also ASHIFTRT.
9616
9617                  We can't do the case when CODE is ROTATE and FIRST_CODE is
9618                  ASHIFTRT.
9619
9620                  If the mode of this shift is not the mode of the outer shift,
9621                  we can't do this if either shift is a right shift or ROTATE.
9622
9623                  Finally, we can't do any of these if the mode is too wide
9624                  unless the codes are the same.
9625
9626                  Handle the case where the shift codes are the same
9627                  first.  */
9628
9629               if (code == first_code)
9630                 {
9631                   if (GET_MODE (varop) != result_mode
9632                       && (code == ASHIFTRT || code == LSHIFTRT
9633                           || code == ROTATE))
9634                     break;
9635
9636                   count += first_count;
9637                   varop = XEXP (varop, 0);
9638                   continue;
9639                 }
9640
9641               if (code == ASHIFTRT
9642                   || (code == ROTATE && first_code == ASHIFTRT)
9643                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
9644                   || (GET_MODE (varop) != result_mode
9645                       && (first_code == ASHIFTRT || first_code == LSHIFTRT
9646                           || first_code == ROTATE
9647                           || code == ROTATE)))
9648                 break;
9649
9650               /* To compute the mask to apply after the shift, shift the
9651                  nonzero bits of the inner shift the same way the
9652                  outer shift will.  */
9653
9654               mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
9655
9656               mask_rtx
9657                 = simplify_const_binary_operation (code, result_mode, mask_rtx,
9658                                                    GEN_INT (count));
9659
9660               /* Give up if we can't compute an outer operation to use.  */
9661               if (mask_rtx == 0
9662                   || !CONST_INT_P (mask_rtx)
9663                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
9664                                         INTVAL (mask_rtx),
9665                                         result_mode, &complement_p))
9666                 break;
9667
9668               /* If the shifts are in the same direction, we add the
9669                  counts.  Otherwise, we subtract them.  */
9670               if ((code == ASHIFTRT || code == LSHIFTRT)
9671                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
9672                 count += first_count;
9673               else
9674                 count -= first_count;
9675
9676               /* If COUNT is positive, the new shift is usually CODE,
9677                  except for the two exceptions below, in which case it is
9678                  FIRST_CODE.  If the count is negative, FIRST_CODE should
9679                  always be used  */
9680               if (count > 0
9681                   && ((first_code == ROTATE && code == ASHIFT)
9682                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
9683                 code = first_code;
9684               else if (count < 0)
9685                 code = first_code, count = -count;
9686
9687               varop = XEXP (varop, 0);
9688               continue;
9689             }
9690
9691           /* If we have (A << B << C) for any shift, we can convert this to
9692              (A << C << B).  This wins if A is a constant.  Only try this if
9693              B is not a constant.  */
9694
9695           else if (GET_CODE (varop) == code
9696                    && CONST_INT_P (XEXP (varop, 0))
9697                    && !CONST_INT_P (XEXP (varop, 1)))
9698             {
9699               rtx new_rtx = simplify_const_binary_operation (code, mode,
9700                                                          XEXP (varop, 0),
9701                                                          GEN_INT (count));
9702               varop = gen_rtx_fmt_ee (code, mode, new_rtx, XEXP (varop, 1));
9703               count = 0;
9704               continue;
9705             }
9706           break;
9707
9708         case NOT:
9709           if (VECTOR_MODE_P (mode))
9710             break;
9711
9712           /* Make this fit the case below.  */
9713           varop = gen_rtx_XOR (mode, XEXP (varop, 0),
9714                                GEN_INT (GET_MODE_MASK (mode)));
9715           continue;
9716
9717         case IOR:
9718         case AND:
9719         case XOR:
9720           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
9721              with C the size of VAROP - 1 and the shift is logical if
9722              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9723              we have an (le X 0) operation.   If we have an arithmetic shift
9724              and STORE_FLAG_VALUE is 1 or we have a logical shift with
9725              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
9726
9727           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
9728               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
9729               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9730               && (code == LSHIFTRT || code == ASHIFTRT)
9731               && count == (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9732               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9733             {
9734               count = 0;
9735               varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
9736                                   const0_rtx);
9737
9738               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9739                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9740
9741               continue;
9742             }
9743
9744           /* If we have (shift (logical)), move the logical to the outside
9745              to allow it to possibly combine with another logical and the
9746              shift to combine with another shift.  This also canonicalizes to
9747              what a ZERO_EXTRACT looks like.  Also, some machines have
9748              (and (shift)) insns.  */
9749
9750           if (CONST_INT_P (XEXP (varop, 1))
9751               /* We can't do this if we have (ashiftrt (xor))  and the
9752                  constant has its sign bit set in shift_mode.  */
9753               && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9754                    && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9755                                               shift_mode))
9756               && (new_rtx = simplify_const_binary_operation (code, result_mode,
9757                                                          XEXP (varop, 1),
9758                                                          GEN_INT (count))) != 0
9759               && CONST_INT_P (new_rtx)
9760               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
9761                                   INTVAL (new_rtx), result_mode, &complement_p))
9762             {
9763               varop = XEXP (varop, 0);
9764               continue;
9765             }
9766
9767           /* If we can't do that, try to simplify the shift in each arm of the
9768              logical expression, make a new logical expression, and apply
9769              the inverse distributive law.  This also can't be done
9770              for some (ashiftrt (xor)).  */
9771           if (CONST_INT_P (XEXP (varop, 1))
9772              && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9773                   && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9774                                              shift_mode)))
9775             {
9776               rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9777                                               XEXP (varop, 0), count);
9778               rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9779                                               XEXP (varop, 1), count);
9780
9781               varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
9782                                            lhs, rhs);
9783               varop = apply_distributive_law (varop);
9784
9785               count = 0;
9786               continue;
9787             }
9788           break;
9789
9790         case EQ:
9791           /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
9792              says that the sign bit can be tested, FOO has mode MODE, C is
9793              GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
9794              that may be nonzero.  */
9795           if (code == LSHIFTRT
9796               && XEXP (varop, 1) == const0_rtx
9797               && GET_MODE (XEXP (varop, 0)) == result_mode
9798               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9799               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9800               && STORE_FLAG_VALUE == -1
9801               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9802               && merge_outer_ops (&outer_op, &outer_const, XOR,
9803                                   (HOST_WIDE_INT) 1, result_mode,
9804                                   &complement_p))
9805             {
9806               varop = XEXP (varop, 0);
9807               count = 0;
9808               continue;
9809             }
9810           break;
9811
9812         case NEG:
9813           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
9814              than the number of bits in the mode is equivalent to A.  */
9815           if (code == LSHIFTRT
9816               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9817               && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
9818             {
9819               varop = XEXP (varop, 0);
9820               count = 0;
9821               continue;
9822             }
9823
9824           /* NEG commutes with ASHIFT since it is multiplication.  Move the
9825              NEG outside to allow shifts to combine.  */
9826           if (code == ASHIFT
9827               && merge_outer_ops (&outer_op, &outer_const, NEG,
9828                                   (HOST_WIDE_INT) 0, result_mode,
9829                                   &complement_p))
9830             {
9831               varop = XEXP (varop, 0);
9832               continue;
9833             }
9834           break;
9835
9836         case PLUS:
9837           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
9838              is one less than the number of bits in the mode is
9839              equivalent to (xor A 1).  */
9840           if (code == LSHIFTRT
9841               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9842               && XEXP (varop, 1) == constm1_rtx
9843               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9844               && merge_outer_ops (&outer_op, &outer_const, XOR,
9845                                   (HOST_WIDE_INT) 1, result_mode,
9846                                   &complement_p))
9847             {
9848               count = 0;
9849               varop = XEXP (varop, 0);
9850               continue;
9851             }
9852
9853           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
9854              that might be nonzero in BAR are those being shifted out and those
9855              bits are known zero in FOO, we can replace the PLUS with FOO.
9856              Similarly in the other operand order.  This code occurs when
9857              we are computing the size of a variable-size array.  */
9858
9859           if ((code == ASHIFTRT || code == LSHIFTRT)
9860               && count < HOST_BITS_PER_WIDE_INT
9861               && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9862               && (nonzero_bits (XEXP (varop, 1), result_mode)
9863                   & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
9864             {
9865               varop = XEXP (varop, 0);
9866               continue;
9867             }
9868           else if ((code == ASHIFTRT || code == LSHIFTRT)
9869                    && count < HOST_BITS_PER_WIDE_INT
9870                    && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9871                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9872                             >> count)
9873                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9874                             & nonzero_bits (XEXP (varop, 1),
9875                                                  result_mode)))
9876             {
9877               varop = XEXP (varop, 1);
9878               continue;
9879             }
9880
9881           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
9882           if (code == ASHIFT
9883               && CONST_INT_P (XEXP (varop, 1))
9884               && (new_rtx = simplify_const_binary_operation (ASHIFT, result_mode,
9885                                                          XEXP (varop, 1),
9886                                                          GEN_INT (count))) != 0
9887               && CONST_INT_P (new_rtx)
9888               && merge_outer_ops (&outer_op, &outer_const, PLUS,
9889                                   INTVAL (new_rtx), result_mode, &complement_p))
9890             {
9891               varop = XEXP (varop, 0);
9892               continue;
9893             }
9894
9895           /* Check for 'PLUS signbit', which is the canonical form of 'XOR
9896              signbit', and attempt to change the PLUS to an XOR and move it to
9897              the outer operation as is done above in the AND/IOR/XOR case
9898              leg for shift(logical). See details in logical handling above
9899              for reasoning in doing so.  */
9900           if (code == LSHIFTRT
9901               && CONST_INT_P (XEXP (varop, 1))
9902               && mode_signbit_p (result_mode, XEXP (varop, 1))
9903               && (new_rtx = simplify_const_binary_operation (code, result_mode,
9904                                                          XEXP (varop, 1),
9905                                                          GEN_INT (count))) != 0
9906               && CONST_INT_P (new_rtx)
9907               && merge_outer_ops (&outer_op, &outer_const, XOR,
9908                                   INTVAL (new_rtx), result_mode, &complement_p))
9909             {
9910               varop = XEXP (varop, 0);
9911               continue;
9912             }
9913
9914           break;
9915
9916         case MINUS:
9917           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9918              with C the size of VAROP - 1 and the shift is logical if
9919              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9920              we have a (gt X 0) operation.  If the shift is arithmetic with
9921              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9922              we have a (neg (gt X 0)) operation.  */
9923
9924           if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9925               && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
9926               && count == (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9927               && (code == LSHIFTRT || code == ASHIFTRT)
9928               && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
9929               && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
9930               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9931             {
9932               count = 0;
9933               varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
9934                                   const0_rtx);
9935
9936               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9937                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9938
9939               continue;
9940             }
9941           break;
9942
9943         case TRUNCATE:
9944           /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
9945              if the truncate does not affect the value.  */
9946           if (code == LSHIFTRT
9947               && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
9948               && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
9949               && (INTVAL (XEXP (XEXP (varop, 0), 1))
9950                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
9951                       - GET_MODE_BITSIZE (GET_MODE (varop)))))
9952             {
9953               rtx varop_inner = XEXP (varop, 0);
9954
9955               varop_inner
9956                 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
9957                                     XEXP (varop_inner, 0),
9958                                     GEN_INT
9959                                     (count + INTVAL (XEXP (varop_inner, 1))));
9960               varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
9961               count = 0;
9962               continue;
9963             }
9964           break;
9965
9966         default:
9967           break;
9968         }
9969
9970       break;
9971     }
9972
9973   shift_mode = try_widen_shift_mode (code, varop, count, result_mode, mode,
9974                                      outer_op, outer_const);
9975
9976   /* We have now finished analyzing the shift.  The result should be
9977      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
9978      OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
9979      to the result of the shift.  OUTER_CONST is the relevant constant,
9980      but we must turn off all bits turned off in the shift.  */
9981
9982   if (outer_op == UNKNOWN
9983       && orig_code == code && orig_count == count
9984       && varop == orig_varop
9985       && shift_mode == GET_MODE (varop))
9986     return NULL_RTX;
9987
9988   /* Make a SUBREG if necessary.  If we can't make it, fail.  */
9989   varop = gen_lowpart (shift_mode, varop);
9990   if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
9991     return NULL_RTX;
9992
9993   /* If we have an outer operation and we just made a shift, it is
9994      possible that we could have simplified the shift were it not
9995      for the outer operation.  So try to do the simplification
9996      recursively.  */
9997
9998   if (outer_op != UNKNOWN)
9999     x = simplify_shift_const_1 (code, shift_mode, varop, count);
10000   else
10001     x = NULL_RTX;
10002
10003   if (x == NULL_RTX)
10004     x = simplify_gen_binary (code, shift_mode, varop, GEN_INT (count));
10005
10006   /* If we were doing an LSHIFTRT in a wider mode than it was originally,
10007      turn off all the bits that the shift would have turned off.  */
10008   if (orig_code == LSHIFTRT && result_mode != shift_mode)
10009     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
10010                                 GET_MODE_MASK (result_mode) >> orig_count);
10011
10012   /* Do the remainder of the processing in RESULT_MODE.  */
10013   x = gen_lowpart_or_truncate (result_mode, x);
10014
10015   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
10016      operation.  */
10017   if (complement_p)
10018     x = simplify_gen_unary (NOT, result_mode, x, result_mode);
10019
10020   if (outer_op != UNKNOWN)
10021     {
10022       if (GET_RTX_CLASS (outer_op) != RTX_UNARY
10023           && GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
10024         outer_const = trunc_int_for_mode (outer_const, result_mode);
10025
10026       if (outer_op == AND)
10027         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
10028       else if (outer_op == SET)
10029         {
10030           /* This means that we have determined that the result is
10031              equivalent to a constant.  This should be rare.  */
10032           if (!side_effects_p (x))
10033             x = GEN_INT (outer_const);
10034         }
10035       else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
10036         x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
10037       else
10038         x = simplify_gen_binary (outer_op, result_mode, x,
10039                                  GEN_INT (outer_const));
10040     }
10041
10042   return x;
10043 }
10044
10045 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
10046    The result of the shift is RESULT_MODE.  If we cannot simplify it,
10047    return X or, if it is NULL, synthesize the expression with
10048    simplify_gen_binary.  Otherwise, return a simplified value.
10049
10050    The shift is normally computed in the widest mode we find in VAROP, as
10051    long as it isn't a different number of words than RESULT_MODE.  Exceptions
10052    are ASHIFTRT and ROTATE, which are always done in their original mode.  */
10053
10054 static rtx
10055 simplify_shift_const (rtx x, enum rtx_code code, enum machine_mode result_mode,
10056                       rtx varop, int count)
10057 {
10058   rtx tem = simplify_shift_const_1 (code, result_mode, varop, count);
10059   if (tem)
10060     return tem;
10061
10062   if (!x)
10063     x = simplify_gen_binary (code, GET_MODE (varop), varop, GEN_INT (count));
10064   if (GET_MODE (x) != result_mode)
10065     x = gen_lowpart (result_mode, x);
10066   return x;
10067 }
10068
10069 \f
10070 /* Like recog, but we receive the address of a pointer to a new pattern.
10071    We try to match the rtx that the pointer points to.
10072    If that fails, we may try to modify or replace the pattern,
10073    storing the replacement into the same pointer object.
10074
10075    Modifications include deletion or addition of CLOBBERs.
10076
10077    PNOTES is a pointer to a location where any REG_UNUSED notes added for
10078    the CLOBBERs are placed.
10079
10080    The value is the final insn code from the pattern ultimately matched,
10081    or -1.  */
10082
10083 static int
10084 recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
10085 {
10086   rtx pat = *pnewpat;
10087   int insn_code_number;
10088   int num_clobbers_to_add = 0;
10089   int i;
10090   rtx notes = 0;
10091   rtx old_notes, old_pat;
10092
10093   /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
10094      we use to indicate that something didn't match.  If we find such a
10095      thing, force rejection.  */
10096   if (GET_CODE (pat) == PARALLEL)
10097     for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
10098       if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
10099           && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
10100         return -1;
10101
10102   old_pat = PATTERN (insn);
10103   old_notes = REG_NOTES (insn);
10104   PATTERN (insn) = pat;
10105   REG_NOTES (insn) = 0;
10106
10107   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
10108   if (dump_file && (dump_flags & TDF_DETAILS))
10109     {
10110       if (insn_code_number < 0)
10111         fputs ("Failed to match this instruction:\n", dump_file);
10112       else
10113         fputs ("Successfully matched this instruction:\n", dump_file);
10114       print_rtl_single (dump_file, pat);
10115     }
10116
10117   /* If it isn't, there is the possibility that we previously had an insn
10118      that clobbered some register as a side effect, but the combined
10119      insn doesn't need to do that.  So try once more without the clobbers
10120      unless this represents an ASM insn.  */
10121
10122   if (insn_code_number < 0 && ! check_asm_operands (pat)
10123       && GET_CODE (pat) == PARALLEL)
10124     {
10125       int pos;
10126
10127       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
10128         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
10129           {
10130             if (i != pos)
10131               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
10132             pos++;
10133           }
10134
10135       SUBST_INT (XVECLEN (pat, 0), pos);
10136
10137       if (pos == 1)
10138         pat = XVECEXP (pat, 0, 0);
10139
10140       PATTERN (insn) = pat;
10141       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
10142       if (dump_file && (dump_flags & TDF_DETAILS))
10143         {
10144           if (insn_code_number < 0)
10145             fputs ("Failed to match this instruction:\n", dump_file);
10146           else
10147             fputs ("Successfully matched this instruction:\n", dump_file);
10148           print_rtl_single (dump_file, pat);
10149         }
10150     }
10151   PATTERN (insn) = old_pat;
10152   REG_NOTES (insn) = old_notes;
10153
10154   /* Recognize all noop sets, these will be killed by followup pass.  */
10155   if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
10156     insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
10157
10158   /* If we had any clobbers to add, make a new pattern than contains
10159      them.  Then check to make sure that all of them are dead.  */
10160   if (num_clobbers_to_add)
10161     {
10162       rtx newpat = gen_rtx_PARALLEL (VOIDmode,
10163                                      rtvec_alloc (GET_CODE (pat) == PARALLEL
10164                                                   ? (XVECLEN (pat, 0)
10165                                                      + num_clobbers_to_add)
10166                                                   : num_clobbers_to_add + 1));
10167
10168       if (GET_CODE (pat) == PARALLEL)
10169         for (i = 0; i < XVECLEN (pat, 0); i++)
10170           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
10171       else
10172         XVECEXP (newpat, 0, 0) = pat;
10173
10174       add_clobbers (newpat, insn_code_number);
10175
10176       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
10177            i < XVECLEN (newpat, 0); i++)
10178         {
10179           if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
10180               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
10181             return -1;
10182           if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) != SCRATCH)
10183             {
10184               gcc_assert (REG_P (XEXP (XVECEXP (newpat, 0, i), 0)));
10185               notes = alloc_reg_note (REG_UNUSED,
10186                                       XEXP (XVECEXP (newpat, 0, i), 0), notes);
10187             }
10188         }
10189       pat = newpat;
10190     }
10191
10192   *pnewpat = pat;
10193   *pnotes = notes;
10194
10195   return insn_code_number;
10196 }
10197 \f
10198 /* Like gen_lowpart_general but for use by combine.  In combine it
10199    is not possible to create any new pseudoregs.  However, it is
10200    safe to create invalid memory addresses, because combine will
10201    try to recognize them and all they will do is make the combine
10202    attempt fail.
10203
10204    If for some reason this cannot do its job, an rtx
10205    (clobber (const_int 0)) is returned.
10206    An insn containing that will not be recognized.  */
10207
10208 static rtx
10209 gen_lowpart_for_combine (enum machine_mode omode, rtx x)
10210 {
10211   enum machine_mode imode = GET_MODE (x);
10212   unsigned int osize = GET_MODE_SIZE (omode);
10213   unsigned int isize = GET_MODE_SIZE (imode);
10214   rtx result;
10215
10216   if (omode == imode)
10217     return x;
10218
10219   /* Return identity if this is a CONST or symbolic reference.  */
10220   if (omode == Pmode
10221       && (GET_CODE (x) == CONST
10222           || GET_CODE (x) == SYMBOL_REF
10223           || GET_CODE (x) == LABEL_REF))
10224     return x;
10225
10226   /* We can only support MODE being wider than a word if X is a
10227      constant integer or has a mode the same size.  */
10228   if (GET_MODE_SIZE (omode) > UNITS_PER_WORD
10229       && ! ((imode == VOIDmode
10230              && (CONST_INT_P (x)
10231                  || GET_CODE (x) == CONST_DOUBLE))
10232             || isize == osize))
10233     goto fail;
10234
10235   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
10236      won't know what to do.  So we will strip off the SUBREG here and
10237      process normally.  */
10238   if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
10239     {
10240       x = SUBREG_REG (x);
10241
10242       /* For use in case we fall down into the address adjustments
10243          further below, we need to adjust the known mode and size of
10244          x; imode and isize, since we just adjusted x.  */
10245       imode = GET_MODE (x);
10246
10247       if (imode == omode)
10248         return x;
10249
10250       isize = GET_MODE_SIZE (imode);
10251     }
10252
10253   result = gen_lowpart_common (omode, x);
10254
10255   if (result)
10256     return result;
10257
10258   if (MEM_P (x))
10259     {
10260       int offset = 0;
10261
10262       /* Refuse to work on a volatile memory ref or one with a mode-dependent
10263          address.  */
10264       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
10265         goto fail;
10266
10267       /* If we want to refer to something bigger than the original memref,
10268          generate a paradoxical subreg instead.  That will force a reload
10269          of the original memref X.  */
10270       if (isize < osize)
10271         return gen_rtx_SUBREG (omode, x, 0);
10272
10273       if (WORDS_BIG_ENDIAN)
10274         offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
10275
10276       /* Adjust the address so that the address-after-the-data is
10277          unchanged.  */
10278       if (BYTES_BIG_ENDIAN)
10279         offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
10280
10281       return adjust_address_nv (x, omode, offset);
10282     }
10283
10284   /* If X is a comparison operator, rewrite it in a new mode.  This
10285      probably won't match, but may allow further simplifications.  */
10286   else if (COMPARISON_P (x))
10287     return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
10288
10289   /* If we couldn't simplify X any other way, just enclose it in a
10290      SUBREG.  Normally, this SUBREG won't match, but some patterns may
10291      include an explicit SUBREG or we may simplify it further in combine.  */
10292   else
10293     {
10294       int offset = 0;
10295       rtx res;
10296
10297       offset = subreg_lowpart_offset (omode, imode);
10298       if (imode == VOIDmode)
10299         {
10300           imode = int_mode_for_mode (omode);
10301           x = gen_lowpart_common (imode, x);
10302           if (x == NULL)
10303             goto fail;
10304         }
10305       res = simplify_gen_subreg (omode, x, imode, offset);
10306       if (res)
10307         return res;
10308     }
10309
10310  fail:
10311   return gen_rtx_CLOBBER (omode, const0_rtx);
10312 }
10313 \f
10314 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
10315    comparison code that will be tested.
10316
10317    The result is a possibly different comparison code to use.  *POP0 and
10318    *POP1 may be updated.
10319
10320    It is possible that we might detect that a comparison is either always
10321    true or always false.  However, we do not perform general constant
10322    folding in combine, so this knowledge isn't useful.  Such tautologies
10323    should have been detected earlier.  Hence we ignore all such cases.  */
10324
10325 static enum rtx_code
10326 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
10327 {
10328   rtx op0 = *pop0;
10329   rtx op1 = *pop1;
10330   rtx tem, tem1;
10331   int i;
10332   enum machine_mode mode, tmode;
10333
10334   /* Try a few ways of applying the same transformation to both operands.  */
10335   while (1)
10336     {
10337 #ifndef WORD_REGISTER_OPERATIONS
10338       /* The test below this one won't handle SIGN_EXTENDs on these machines,
10339          so check specially.  */
10340       if (code != GTU && code != GEU && code != LTU && code != LEU
10341           && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
10342           && GET_CODE (XEXP (op0, 0)) == ASHIFT
10343           && GET_CODE (XEXP (op1, 0)) == ASHIFT
10344           && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
10345           && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
10346           && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
10347               == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
10348           && CONST_INT_P (XEXP (op0, 1))
10349           && XEXP (op0, 1) == XEXP (op1, 1)
10350           && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10351           && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
10352           && (INTVAL (XEXP (op0, 1))
10353               == (GET_MODE_BITSIZE (GET_MODE (op0))
10354                   - (GET_MODE_BITSIZE
10355                      (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
10356         {
10357           op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
10358           op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
10359         }
10360 #endif
10361
10362       /* If both operands are the same constant shift, see if we can ignore the
10363          shift.  We can if the shift is a rotate or if the bits shifted out of
10364          this shift are known to be zero for both inputs and if the type of
10365          comparison is compatible with the shift.  */
10366       if (GET_CODE (op0) == GET_CODE (op1)
10367           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10368           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
10369               || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
10370                   && (code != GT && code != LT && code != GE && code != LE))
10371               || (GET_CODE (op0) == ASHIFTRT
10372                   && (code != GTU && code != LTU
10373                       && code != GEU && code != LEU)))
10374           && CONST_INT_P (XEXP (op0, 1))
10375           && INTVAL (XEXP (op0, 1)) >= 0
10376           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10377           && XEXP (op0, 1) == XEXP (op1, 1))
10378         {
10379           enum machine_mode mode = GET_MODE (op0);
10380           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10381           int shift_count = INTVAL (XEXP (op0, 1));
10382
10383           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
10384             mask &= (mask >> shift_count) << shift_count;
10385           else if (GET_CODE (op0) == ASHIFT)
10386             mask = (mask & (mask << shift_count)) >> shift_count;
10387
10388           if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
10389               && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
10390             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
10391           else
10392             break;
10393         }
10394
10395       /* If both operands are AND's of a paradoxical SUBREG by constant, the
10396          SUBREGs are of the same mode, and, in both cases, the AND would
10397          be redundant if the comparison was done in the narrower mode,
10398          do the comparison in the narrower mode (e.g., we are AND'ing with 1
10399          and the operand's possibly nonzero bits are 0xffffff01; in that case
10400          if we only care about QImode, we don't need the AND).  This case
10401          occurs if the output mode of an scc insn is not SImode and
10402          STORE_FLAG_VALUE == 1 (e.g., the 386).
10403
10404          Similarly, check for a case where the AND's are ZERO_EXTEND
10405          operations from some narrower mode even though a SUBREG is not
10406          present.  */
10407
10408       else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
10409                && CONST_INT_P (XEXP (op0, 1))
10410                && CONST_INT_P (XEXP (op1, 1)))
10411         {
10412           rtx inner_op0 = XEXP (op0, 0);
10413           rtx inner_op1 = XEXP (op1, 0);
10414           HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
10415           HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
10416           int changed = 0;
10417
10418           if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
10419               && (GET_MODE_SIZE (GET_MODE (inner_op0))
10420                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
10421               && (GET_MODE (SUBREG_REG (inner_op0))
10422                   == GET_MODE (SUBREG_REG (inner_op1)))
10423               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
10424                   <= HOST_BITS_PER_WIDE_INT)
10425               && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
10426                                              GET_MODE (SUBREG_REG (inner_op0)))))
10427               && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
10428                                              GET_MODE (SUBREG_REG (inner_op1))))))
10429             {
10430               op0 = SUBREG_REG (inner_op0);
10431               op1 = SUBREG_REG (inner_op1);
10432
10433               /* The resulting comparison is always unsigned since we masked
10434                  off the original sign bit.  */
10435               code = unsigned_condition (code);
10436
10437               changed = 1;
10438             }
10439
10440           else if (c0 == c1)
10441             for (tmode = GET_CLASS_NARROWEST_MODE
10442                  (GET_MODE_CLASS (GET_MODE (op0)));
10443                  tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
10444               if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
10445                 {
10446                   op0 = gen_lowpart (tmode, inner_op0);
10447                   op1 = gen_lowpart (tmode, inner_op1);
10448                   code = unsigned_condition (code);
10449                   changed = 1;
10450                   break;
10451                 }
10452
10453           if (! changed)
10454             break;
10455         }
10456
10457       /* If both operands are NOT, we can strip off the outer operation
10458          and adjust the comparison code for swapped operands; similarly for
10459          NEG, except that this must be an equality comparison.  */
10460       else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
10461                || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
10462                    && (code == EQ || code == NE)))
10463         op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
10464
10465       else
10466         break;
10467     }
10468
10469   /* If the first operand is a constant, swap the operands and adjust the
10470      comparison code appropriately, but don't do this if the second operand
10471      is already a constant integer.  */
10472   if (swap_commutative_operands_p (op0, op1))
10473     {
10474       tem = op0, op0 = op1, op1 = tem;
10475       code = swap_condition (code);
10476     }
10477
10478   /* We now enter a loop during which we will try to simplify the comparison.
10479      For the most part, we only are concerned with comparisons with zero,
10480      but some things may really be comparisons with zero but not start
10481      out looking that way.  */
10482
10483   while (CONST_INT_P (op1))
10484     {
10485       enum machine_mode mode = GET_MODE (op0);
10486       unsigned int mode_width = GET_MODE_BITSIZE (mode);
10487       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10488       int equality_comparison_p;
10489       int sign_bit_comparison_p;
10490       int unsigned_comparison_p;
10491       HOST_WIDE_INT const_op;
10492
10493       /* We only want to handle integral modes.  This catches VOIDmode,
10494          CCmode, and the floating-point modes.  An exception is that we
10495          can handle VOIDmode if OP0 is a COMPARE or a comparison
10496          operation.  */
10497
10498       if (GET_MODE_CLASS (mode) != MODE_INT
10499           && ! (mode == VOIDmode
10500                 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
10501         break;
10502
10503       /* Get the constant we are comparing against and turn off all bits
10504          not on in our mode.  */
10505       const_op = INTVAL (op1);
10506       if (mode != VOIDmode)
10507         const_op = trunc_int_for_mode (const_op, mode);
10508       op1 = GEN_INT (const_op);
10509
10510       /* If we are comparing against a constant power of two and the value
10511          being compared can only have that single bit nonzero (e.g., it was
10512          `and'ed with that bit), we can replace this with a comparison
10513          with zero.  */
10514       if (const_op
10515           && (code == EQ || code == NE || code == GE || code == GEU
10516               || code == LT || code == LTU)
10517           && mode_width <= HOST_BITS_PER_WIDE_INT
10518           && exact_log2 (const_op) >= 0
10519           && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
10520         {
10521           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
10522           op1 = const0_rtx, const_op = 0;
10523         }
10524
10525       /* Similarly, if we are comparing a value known to be either -1 or
10526          0 with -1, change it to the opposite comparison against zero.  */
10527
10528       if (const_op == -1
10529           && (code == EQ || code == NE || code == GT || code == LE
10530               || code == GEU || code == LTU)
10531           && num_sign_bit_copies (op0, mode) == mode_width)
10532         {
10533           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
10534           op1 = const0_rtx, const_op = 0;
10535         }
10536
10537       /* Do some canonicalizations based on the comparison code.  We prefer
10538          comparisons against zero and then prefer equality comparisons.
10539          If we can reduce the size of a constant, we will do that too.  */
10540
10541       switch (code)
10542         {
10543         case LT:
10544           /* < C is equivalent to <= (C - 1) */
10545           if (const_op > 0)
10546             {
10547               const_op -= 1;
10548               op1 = GEN_INT (const_op);
10549               code = LE;
10550               /* ... fall through to LE case below.  */
10551             }
10552           else
10553             break;
10554
10555         case LE:
10556           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
10557           if (const_op < 0)
10558             {
10559               const_op += 1;
10560               op1 = GEN_INT (const_op);
10561               code = LT;
10562             }
10563
10564           /* If we are doing a <= 0 comparison on a value known to have
10565              a zero sign bit, we can replace this with == 0.  */
10566           else if (const_op == 0
10567                    && mode_width <= HOST_BITS_PER_WIDE_INT
10568                    && (nonzero_bits (op0, mode)
10569                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10570             code = EQ;
10571           break;
10572
10573         case GE:
10574           /* >= C is equivalent to > (C - 1).  */
10575           if (const_op > 0)
10576             {
10577               const_op -= 1;
10578               op1 = GEN_INT (const_op);
10579               code = GT;
10580               /* ... fall through to GT below.  */
10581             }
10582           else
10583             break;
10584
10585         case GT:
10586           /* > C is equivalent to >= (C + 1); we do this for C < 0.  */
10587           if (const_op < 0)
10588             {
10589               const_op += 1;
10590               op1 = GEN_INT (const_op);
10591               code = GE;
10592             }
10593
10594           /* If we are doing a > 0 comparison on a value known to have
10595              a zero sign bit, we can replace this with != 0.  */
10596           else if (const_op == 0
10597                    && mode_width <= HOST_BITS_PER_WIDE_INT
10598                    && (nonzero_bits (op0, mode)
10599                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10600             code = NE;
10601           break;
10602
10603         case LTU:
10604           /* < C is equivalent to <= (C - 1).  */
10605           if (const_op > 0)
10606             {
10607               const_op -= 1;
10608               op1 = GEN_INT (const_op);
10609               code = LEU;
10610               /* ... fall through ...  */
10611             }
10612
10613           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
10614           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10615                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10616             {
10617               const_op = 0, op1 = const0_rtx;
10618               code = GE;
10619               break;
10620             }
10621           else
10622             break;
10623
10624         case LEU:
10625           /* unsigned <= 0 is equivalent to == 0 */
10626           if (const_op == 0)
10627             code = EQ;
10628
10629           /* (unsigned) <= 0x7fffffff is equivalent to >= 0.  */
10630           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10631                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10632             {
10633               const_op = 0, op1 = const0_rtx;
10634               code = GE;
10635             }
10636           break;
10637
10638         case GEU:
10639           /* >= C is equivalent to > (C - 1).  */
10640           if (const_op > 1)
10641             {
10642               const_op -= 1;
10643               op1 = GEN_INT (const_op);
10644               code = GTU;
10645               /* ... fall through ...  */
10646             }
10647
10648           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
10649           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10650                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10651             {
10652               const_op = 0, op1 = const0_rtx;
10653               code = LT;
10654               break;
10655             }
10656           else
10657             break;
10658
10659         case GTU:
10660           /* unsigned > 0 is equivalent to != 0 */
10661           if (const_op == 0)
10662             code = NE;
10663
10664           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
10665           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10666                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10667             {
10668               const_op = 0, op1 = const0_rtx;
10669               code = LT;
10670             }
10671           break;
10672
10673         default:
10674           break;
10675         }
10676
10677       /* Compute some predicates to simplify code below.  */
10678
10679       equality_comparison_p = (code == EQ || code == NE);
10680       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
10681       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
10682                                || code == GEU);
10683
10684       /* If this is a sign bit comparison and we can do arithmetic in
10685          MODE, say that we will only be needing the sign bit of OP0.  */
10686       if (sign_bit_comparison_p
10687           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10688         op0 = force_to_mode (op0, mode,
10689                              ((HOST_WIDE_INT) 1
10690                               << (GET_MODE_BITSIZE (mode) - 1)),
10691                              0);
10692
10693       /* Now try cases based on the opcode of OP0.  If none of the cases
10694          does a "continue", we exit this loop immediately after the
10695          switch.  */
10696
10697       switch (GET_CODE (op0))
10698         {
10699         case ZERO_EXTRACT:
10700           /* If we are extracting a single bit from a variable position in
10701              a constant that has only a single bit set and are comparing it
10702              with zero, we can convert this into an equality comparison
10703              between the position and the location of the single bit.  */
10704           /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
10705              have already reduced the shift count modulo the word size.  */
10706           if (!SHIFT_COUNT_TRUNCATED
10707               && CONST_INT_P (XEXP (op0, 0))
10708               && XEXP (op0, 1) == const1_rtx
10709               && equality_comparison_p && const_op == 0
10710               && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
10711             {
10712               if (BITS_BIG_ENDIAN)
10713                 {
10714                   enum machine_mode new_mode
10715                     = mode_for_extraction (EP_extzv, 1);
10716                   if (new_mode == MAX_MACHINE_MODE)
10717                     i = BITS_PER_WORD - 1 - i;
10718                   else
10719                     {
10720                       mode = new_mode;
10721                       i = (GET_MODE_BITSIZE (mode) - 1 - i);
10722                     }
10723                 }
10724
10725               op0 = XEXP (op0, 2);
10726               op1 = GEN_INT (i);
10727               const_op = i;
10728
10729               /* Result is nonzero iff shift count is equal to I.  */
10730               code = reverse_condition (code);
10731               continue;
10732             }
10733
10734           /* ... fall through ...  */
10735
10736         case SIGN_EXTRACT:
10737           tem = expand_compound_operation (op0);
10738           if (tem != op0)
10739             {
10740               op0 = tem;
10741               continue;
10742             }
10743           break;
10744
10745         case NOT:
10746           /* If testing for equality, we can take the NOT of the constant.  */
10747           if (equality_comparison_p
10748               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
10749             {
10750               op0 = XEXP (op0, 0);
10751               op1 = tem;
10752               continue;
10753             }
10754
10755           /* If just looking at the sign bit, reverse the sense of the
10756              comparison.  */
10757           if (sign_bit_comparison_p)
10758             {
10759               op0 = XEXP (op0, 0);
10760               code = (code == GE ? LT : GE);
10761               continue;
10762             }
10763           break;
10764
10765         case NEG:
10766           /* If testing for equality, we can take the NEG of the constant.  */
10767           if (equality_comparison_p
10768               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
10769             {
10770               op0 = XEXP (op0, 0);
10771               op1 = tem;
10772               continue;
10773             }
10774
10775           /* The remaining cases only apply to comparisons with zero.  */
10776           if (const_op != 0)
10777             break;
10778
10779           /* When X is ABS or is known positive,
10780              (neg X) is < 0 if and only if X != 0.  */
10781
10782           if (sign_bit_comparison_p
10783               && (GET_CODE (XEXP (op0, 0)) == ABS
10784                   || (mode_width <= HOST_BITS_PER_WIDE_INT
10785                       && (nonzero_bits (XEXP (op0, 0), mode)
10786                           & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
10787             {
10788               op0 = XEXP (op0, 0);
10789               code = (code == LT ? NE : EQ);
10790               continue;
10791             }
10792
10793           /* If we have NEG of something whose two high-order bits are the
10794              same, we know that "(-a) < 0" is equivalent to "a > 0".  */
10795           if (num_sign_bit_copies (op0, mode) >= 2)
10796             {
10797               op0 = XEXP (op0, 0);
10798               code = swap_condition (code);
10799               continue;
10800             }
10801           break;
10802
10803         case ROTATE:
10804           /* If we are testing equality and our count is a constant, we
10805              can perform the inverse operation on our RHS.  */
10806           if (equality_comparison_p && CONST_INT_P (XEXP (op0, 1))
10807               && (tem = simplify_binary_operation (ROTATERT, mode,
10808                                                    op1, XEXP (op0, 1))) != 0)
10809             {
10810               op0 = XEXP (op0, 0);
10811               op1 = tem;
10812               continue;
10813             }
10814
10815           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10816              a particular bit.  Convert it to an AND of a constant of that
10817              bit.  This will be converted into a ZERO_EXTRACT.  */
10818           if (const_op == 0 && sign_bit_comparison_p
10819               && CONST_INT_P (XEXP (op0, 1))
10820               && mode_width <= HOST_BITS_PER_WIDE_INT)
10821             {
10822               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10823                                             ((HOST_WIDE_INT) 1
10824                                              << (mode_width - 1
10825                                                  - INTVAL (XEXP (op0, 1)))));
10826               code = (code == LT ? NE : EQ);
10827               continue;
10828             }
10829
10830           /* Fall through.  */
10831
10832         case ABS:
10833           /* ABS is ignorable inside an equality comparison with zero.  */
10834           if (const_op == 0 && equality_comparison_p)
10835             {
10836               op0 = XEXP (op0, 0);
10837               continue;
10838             }
10839           break;
10840
10841         case SIGN_EXTEND:
10842           /* Can simplify (compare (zero/sign_extend FOO) CONST) to
10843              (compare FOO CONST) if CONST fits in FOO's mode and we
10844              are either testing inequality or have an unsigned
10845              comparison with ZERO_EXTEND or a signed comparison with
10846              SIGN_EXTEND.  But don't do it if we don't have a compare
10847              insn of the given mode, since we'd have to revert it
10848              later on, and then we wouldn't know whether to sign- or
10849              zero-extend.  */
10850           mode = GET_MODE (XEXP (op0, 0));
10851           if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10852               && ! unsigned_comparison_p
10853               && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10854               && ((unsigned HOST_WIDE_INT) const_op
10855                   < (((unsigned HOST_WIDE_INT) 1
10856                       << (GET_MODE_BITSIZE (mode) - 1))))
10857               && have_insn_for (COMPARE, mode))
10858             {
10859               op0 = XEXP (op0, 0);
10860               continue;
10861             }
10862           break;
10863
10864         case SUBREG:
10865           /* Check for the case where we are comparing A - C1 with C2, that is
10866
10867                (subreg:MODE (plus (A) (-C1))) op (C2)
10868
10869              with C1 a constant, and try to lift the SUBREG, i.e. to do the
10870              comparison in the wider mode.  One of the following two conditions
10871              must be true in order for this to be valid:
10872
10873                1. The mode extension results in the same bit pattern being added
10874                   on both sides and the comparison is equality or unsigned.  As
10875                   C2 has been truncated to fit in MODE, the pattern can only be
10876                   all 0s or all 1s.
10877
10878                2. The mode extension results in the sign bit being copied on
10879                   each side.
10880
10881              The difficulty here is that we have predicates for A but not for
10882              (A - C1) so we need to check that C1 is within proper bounds so
10883              as to perturbate A as little as possible.  */
10884
10885           if (mode_width <= HOST_BITS_PER_WIDE_INT
10886               && subreg_lowpart_p (op0)
10887               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) > mode_width
10888               && GET_CODE (SUBREG_REG (op0)) == PLUS
10889               && CONST_INT_P (XEXP (SUBREG_REG (op0), 1)))
10890             {
10891               enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
10892               rtx a = XEXP (SUBREG_REG (op0), 0);
10893               HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
10894
10895               if ((c1 > 0
10896                    && (unsigned HOST_WIDE_INT) c1
10897                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)
10898                    && (equality_comparison_p || unsigned_comparison_p)
10899                    /* (A - C1) zero-extends if it is positive and sign-extends
10900                       if it is negative, C2 both zero- and sign-extends.  */
10901                    && ((0 == (nonzero_bits (a, inner_mode)
10902                               & ~GET_MODE_MASK (mode))
10903                         && const_op >= 0)
10904                        /* (A - C1) sign-extends if it is positive and 1-extends
10905                           if it is negative, C2 both sign- and 1-extends.  */
10906                        || (num_sign_bit_copies (a, inner_mode)
10907                            > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10908                                              - mode_width)
10909                            && const_op < 0)))
10910                   || ((unsigned HOST_WIDE_INT) c1
10911                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 2)
10912                       /* (A - C1) always sign-extends, like C2.  */
10913                       && num_sign_bit_copies (a, inner_mode)
10914                          > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10915                                            - (mode_width - 1))))
10916                 {
10917                   op0 = SUBREG_REG (op0);
10918                   continue;
10919                 }
10920             }
10921
10922           /* If the inner mode is narrower and we are extracting the low part,
10923              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
10924           if (subreg_lowpart_p (op0)
10925               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10926             /* Fall through */ ;
10927           else
10928             break;
10929
10930           /* ... fall through ...  */
10931
10932         case ZERO_EXTEND:
10933           mode = GET_MODE (XEXP (op0, 0));
10934           if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10935               && (unsigned_comparison_p || equality_comparison_p)
10936               && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10937               && ((unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode))
10938               && have_insn_for (COMPARE, mode))
10939             {
10940               op0 = XEXP (op0, 0);
10941               continue;
10942             }
10943           break;
10944
10945         case PLUS:
10946           /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
10947              this for equality comparisons due to pathological cases involving
10948              overflows.  */
10949           if (equality_comparison_p
10950               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10951                                                         op1, XEXP (op0, 1))))
10952             {
10953               op0 = XEXP (op0, 0);
10954               op1 = tem;
10955               continue;
10956             }
10957
10958           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
10959           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
10960               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
10961             {
10962               op0 = XEXP (XEXP (op0, 0), 0);
10963               code = (code == LT ? EQ : NE);
10964               continue;
10965             }
10966           break;
10967
10968         case MINUS:
10969           /* We used to optimize signed comparisons against zero, but that
10970              was incorrect.  Unsigned comparisons against zero (GTU, LEU)
10971              arrive here as equality comparisons, or (GEU, LTU) are
10972              optimized away.  No need to special-case them.  */
10973
10974           /* (eq (minus A B) C) -> (eq A (plus B C)) or
10975              (eq B (minus A C)), whichever simplifies.  We can only do
10976              this for equality comparisons due to pathological cases involving
10977              overflows.  */
10978           if (equality_comparison_p
10979               && 0 != (tem = simplify_binary_operation (PLUS, mode,
10980                                                         XEXP (op0, 1), op1)))
10981             {
10982               op0 = XEXP (op0, 0);
10983               op1 = tem;
10984               continue;
10985             }
10986
10987           if (equality_comparison_p
10988               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10989                                                         XEXP (op0, 0), op1)))
10990             {
10991               op0 = XEXP (op0, 1);
10992               op1 = tem;
10993               continue;
10994             }
10995
10996           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
10997              of bits in X minus 1, is one iff X > 0.  */
10998           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
10999               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11000               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (op0, 0), 1))
11001                  == mode_width - 1
11002               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
11003             {
11004               op0 = XEXP (op0, 1);
11005               code = (code == GE ? LE : GT);
11006               continue;
11007             }
11008           break;
11009
11010         case XOR:
11011           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
11012              if C is zero or B is a constant.  */
11013           if (equality_comparison_p
11014               && 0 != (tem = simplify_binary_operation (XOR, mode,
11015                                                         XEXP (op0, 1), op1)))
11016             {
11017               op0 = XEXP (op0, 0);
11018               op1 = tem;
11019               continue;
11020             }
11021           break;
11022
11023         case EQ:  case NE:
11024         case UNEQ:  case LTGT:
11025         case LT:  case LTU:  case UNLT:  case LE:  case LEU:  case UNLE:
11026         case GT:  case GTU:  case UNGT:  case GE:  case GEU:  case UNGE:
11027         case UNORDERED: case ORDERED:
11028           /* We can't do anything if OP0 is a condition code value, rather
11029              than an actual data value.  */
11030           if (const_op != 0
11031               || CC0_P (XEXP (op0, 0))
11032               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
11033             break;
11034
11035           /* Get the two operands being compared.  */
11036           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
11037             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
11038           else
11039             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
11040
11041           /* Check for the cases where we simply want the result of the
11042              earlier test or the opposite of that result.  */
11043           if (code == NE || code == EQ
11044               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
11045                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11046                   && (STORE_FLAG_VALUE
11047                       & (((HOST_WIDE_INT) 1
11048                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
11049                   && (code == LT || code == GE)))
11050             {
11051               enum rtx_code new_code;
11052               if (code == LT || code == NE)
11053                 new_code = GET_CODE (op0);
11054               else
11055                 new_code = reversed_comparison_code (op0, NULL);
11056
11057               if (new_code != UNKNOWN)
11058                 {
11059                   code = new_code;
11060                   op0 = tem;
11061                   op1 = tem1;
11062                   continue;
11063                 }
11064             }
11065           break;
11066
11067         case IOR:
11068           /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
11069              iff X <= 0.  */
11070           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
11071               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
11072               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
11073             {
11074               op0 = XEXP (op0, 1);
11075               code = (code == GE ? GT : LE);
11076               continue;
11077             }
11078           break;
11079
11080         case AND:
11081           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
11082              will be converted to a ZERO_EXTRACT later.  */
11083           if (const_op == 0 && equality_comparison_p
11084               && GET_CODE (XEXP (op0, 0)) == ASHIFT
11085               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
11086             {
11087               op0 = simplify_and_const_int
11088                 (NULL_RTX, mode, gen_rtx_LSHIFTRT (mode,
11089                                                    XEXP (op0, 1),
11090                                                    XEXP (XEXP (op0, 0), 1)),
11091                  (HOST_WIDE_INT) 1);
11092               continue;
11093             }
11094
11095           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
11096              zero and X is a comparison and C1 and C2 describe only bits set
11097              in STORE_FLAG_VALUE, we can compare with X.  */
11098           if (const_op == 0 && equality_comparison_p
11099               && mode_width <= HOST_BITS_PER_WIDE_INT
11100               && CONST_INT_P (XEXP (op0, 1))
11101               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
11102               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11103               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
11104               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
11105             {
11106               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
11107                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
11108               if ((~STORE_FLAG_VALUE & mask) == 0
11109                   && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
11110                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
11111                           && COMPARISON_P (tem))))
11112                 {
11113                   op0 = XEXP (XEXP (op0, 0), 0);
11114                   continue;
11115                 }
11116             }
11117
11118           /* If we are doing an equality comparison of an AND of a bit equal
11119              to the sign bit, replace this with a LT or GE comparison of
11120              the underlying value.  */
11121           if (equality_comparison_p
11122               && const_op == 0
11123               && CONST_INT_P (XEXP (op0, 1))
11124               && mode_width <= HOST_BITS_PER_WIDE_INT
11125               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
11126                   == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
11127             {
11128               op0 = XEXP (op0, 0);
11129               code = (code == EQ ? GE : LT);
11130               continue;
11131             }
11132
11133           /* If this AND operation is really a ZERO_EXTEND from a narrower
11134              mode, the constant fits within that mode, and this is either an
11135              equality or unsigned comparison, try to do this comparison in
11136              the narrower mode.
11137
11138              Note that in:
11139
11140              (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
11141              -> (ne:DI (reg:SI 4) (const_int 0))
11142
11143              unless TRULY_NOOP_TRUNCATION allows it or the register is
11144              known to hold a value of the required mode the
11145              transformation is invalid.  */
11146           if ((equality_comparison_p || unsigned_comparison_p)
11147               && CONST_INT_P (XEXP (op0, 1))
11148               && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
11149                                    & GET_MODE_MASK (mode))
11150                                   + 1)) >= 0
11151               && const_op >> i == 0
11152               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode
11153               && (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode),
11154                                          GET_MODE_BITSIZE (GET_MODE (op0)))
11155                   || (REG_P (XEXP (op0, 0))
11156                       && reg_truncated_to_mode (tmode, XEXP (op0, 0)))))
11157             {
11158               op0 = gen_lowpart (tmode, XEXP (op0, 0));
11159               continue;
11160             }
11161
11162           /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1
11163              fits in both M1 and M2 and the SUBREG is either paradoxical
11164              or represents the low part, permute the SUBREG and the AND
11165              and try again.  */
11166           if (GET_CODE (XEXP (op0, 0)) == SUBREG)
11167             {
11168               unsigned HOST_WIDE_INT c1;
11169               tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0)));
11170               /* Require an integral mode, to avoid creating something like
11171                  (AND:SF ...).  */
11172               if (SCALAR_INT_MODE_P (tmode)
11173                   /* It is unsafe to commute the AND into the SUBREG if the
11174                      SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
11175                      not defined.  As originally written the upper bits
11176                      have a defined value due to the AND operation.
11177                      However, if we commute the AND inside the SUBREG then
11178                      they no longer have defined values and the meaning of
11179                      the code has been changed.  */
11180                   && (0
11181 #ifdef WORD_REGISTER_OPERATIONS
11182                       || (mode_width > GET_MODE_BITSIZE (tmode)
11183                           && mode_width <= BITS_PER_WORD)
11184 #endif
11185                       || (mode_width <= GET_MODE_BITSIZE (tmode)
11186                           && subreg_lowpart_p (XEXP (op0, 0))))
11187                   && CONST_INT_P (XEXP (op0, 1))
11188                   && mode_width <= HOST_BITS_PER_WIDE_INT
11189                   && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
11190                   && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0
11191                   && (c1 & ~GET_MODE_MASK (tmode)) == 0
11192                   && c1 != mask
11193                   && c1 != GET_MODE_MASK (tmode))
11194                 {
11195                   op0 = simplify_gen_binary (AND, tmode,
11196                                              SUBREG_REG (XEXP (op0, 0)),
11197                                              gen_int_mode (c1, tmode));
11198                   op0 = gen_lowpart (mode, op0);
11199                   continue;
11200                 }
11201             }
11202
11203           /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0).  */
11204           if (const_op == 0 && equality_comparison_p
11205               && XEXP (op0, 1) == const1_rtx
11206               && GET_CODE (XEXP (op0, 0)) == NOT)
11207             {
11208               op0 = simplify_and_const_int
11209                 (NULL_RTX, mode, XEXP (XEXP (op0, 0), 0), (HOST_WIDE_INT) 1);
11210               code = (code == NE ? EQ : NE);
11211               continue;
11212             }
11213
11214           /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
11215              (eq (and (lshiftrt X) 1) 0).
11216              Also handle the case where (not X) is expressed using xor.  */
11217           if (const_op == 0 && equality_comparison_p
11218               && XEXP (op0, 1) == const1_rtx
11219               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
11220             {
11221               rtx shift_op = XEXP (XEXP (op0, 0), 0);
11222               rtx shift_count = XEXP (XEXP (op0, 0), 1);
11223
11224               if (GET_CODE (shift_op) == NOT
11225                   || (GET_CODE (shift_op) == XOR
11226                       && CONST_INT_P (XEXP (shift_op, 1))
11227                       && CONST_INT_P (shift_count)
11228                       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
11229                       && (INTVAL (XEXP (shift_op, 1))
11230                           == (HOST_WIDE_INT) 1 << INTVAL (shift_count))))
11231                 {
11232                   op0 = simplify_and_const_int
11233                     (NULL_RTX, mode,
11234                      gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count),
11235                      (HOST_WIDE_INT) 1);
11236                   code = (code == NE ? EQ : NE);
11237                   continue;
11238                 }
11239             }
11240           break;
11241
11242         case ASHIFT:
11243           /* If we have (compare (ashift FOO N) (const_int C)) and
11244              the high order N bits of FOO (N+1 if an inequality comparison)
11245              are known to be zero, we can do this by comparing FOO with C
11246              shifted right N bits so long as the low-order N bits of C are
11247              zero.  */
11248           if (CONST_INT_P (XEXP (op0, 1))
11249               && INTVAL (XEXP (op0, 1)) >= 0
11250               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
11251                   < HOST_BITS_PER_WIDE_INT)
11252               && ((const_op
11253                    & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
11254               && mode_width <= HOST_BITS_PER_WIDE_INT
11255               && (nonzero_bits (XEXP (op0, 0), mode)
11256                   & ~(mask >> (INTVAL (XEXP (op0, 1))
11257                                + ! equality_comparison_p))) == 0)
11258             {
11259               /* We must perform a logical shift, not an arithmetic one,
11260                  as we want the top N bits of C to be zero.  */
11261               unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
11262
11263               temp >>= INTVAL (XEXP (op0, 1));
11264               op1 = gen_int_mode (temp, mode);
11265               op0 = XEXP (op0, 0);
11266               continue;
11267             }
11268
11269           /* If we are doing a sign bit comparison, it means we are testing
11270              a particular bit.  Convert it to the appropriate AND.  */
11271           if (sign_bit_comparison_p && CONST_INT_P (XEXP (op0, 1))
11272               && mode_width <= HOST_BITS_PER_WIDE_INT)
11273             {
11274               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11275                                             ((HOST_WIDE_INT) 1
11276                                              << (mode_width - 1
11277                                                  - INTVAL (XEXP (op0, 1)))));
11278               code = (code == LT ? NE : EQ);
11279               continue;
11280             }
11281
11282           /* If this an equality comparison with zero and we are shifting
11283              the low bit to the sign bit, we can convert this to an AND of the
11284              low-order bit.  */
11285           if (const_op == 0 && equality_comparison_p
11286               && CONST_INT_P (XEXP (op0, 1))
11287               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
11288                  == mode_width - 1)
11289             {
11290               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11291                                             (HOST_WIDE_INT) 1);
11292               continue;
11293             }
11294           break;
11295
11296         case ASHIFTRT:
11297           /* If this is an equality comparison with zero, we can do this
11298              as a logical shift, which might be much simpler.  */
11299           if (equality_comparison_p && const_op == 0
11300               && CONST_INT_P (XEXP (op0, 1)))
11301             {
11302               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
11303                                           XEXP (op0, 0),
11304                                           INTVAL (XEXP (op0, 1)));
11305               continue;
11306             }
11307
11308           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
11309              do the comparison in a narrower mode.  */
11310           if (! unsigned_comparison_p
11311               && CONST_INT_P (XEXP (op0, 1))
11312               && GET_CODE (XEXP (op0, 0)) == ASHIFT
11313               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
11314               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11315                                          MODE_INT, 1)) != BLKmode
11316               && (((unsigned HOST_WIDE_INT) const_op
11317                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11318                   <= GET_MODE_MASK (tmode)))
11319             {
11320               op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
11321               continue;
11322             }
11323
11324           /* Likewise if OP0 is a PLUS of a sign extension with a
11325              constant, which is usually represented with the PLUS
11326              between the shifts.  */
11327           if (! unsigned_comparison_p
11328               && CONST_INT_P (XEXP (op0, 1))
11329               && GET_CODE (XEXP (op0, 0)) == PLUS
11330               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11331               && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
11332               && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
11333               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11334                                          MODE_INT, 1)) != BLKmode
11335               && (((unsigned HOST_WIDE_INT) const_op
11336                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11337                   <= GET_MODE_MASK (tmode)))
11338             {
11339               rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
11340               rtx add_const = XEXP (XEXP (op0, 0), 1);
11341               rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
11342                                                    add_const, XEXP (op0, 1));
11343
11344               op0 = simplify_gen_binary (PLUS, tmode,
11345                                          gen_lowpart (tmode, inner),
11346                                          new_const);
11347               continue;
11348             }
11349
11350           /* ... fall through ...  */
11351         case LSHIFTRT:
11352           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
11353              the low order N bits of FOO are known to be zero, we can do this
11354              by comparing FOO with C shifted left N bits so long as no
11355              overflow occurs.  */
11356           if (CONST_INT_P (XEXP (op0, 1))
11357               && INTVAL (XEXP (op0, 1)) >= 0
11358               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
11359               && mode_width <= HOST_BITS_PER_WIDE_INT
11360               && (nonzero_bits (XEXP (op0, 0), mode)
11361                   & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
11362               && (((unsigned HOST_WIDE_INT) const_op
11363                    + (GET_CODE (op0) != LSHIFTRT
11364                       ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
11365                          + 1)
11366                       : 0))
11367                   <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
11368             {
11369               /* If the shift was logical, then we must make the condition
11370                  unsigned.  */
11371               if (GET_CODE (op0) == LSHIFTRT)
11372                 code = unsigned_condition (code);
11373
11374               const_op <<= INTVAL (XEXP (op0, 1));
11375               op1 = GEN_INT (const_op);
11376               op0 = XEXP (op0, 0);
11377               continue;
11378             }
11379
11380           /* If we are using this shift to extract just the sign bit, we
11381              can replace this with an LT or GE comparison.  */
11382           if (const_op == 0
11383               && (equality_comparison_p || sign_bit_comparison_p)
11384               && CONST_INT_P (XEXP (op0, 1))
11385               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
11386                  == mode_width - 1)
11387             {
11388               op0 = XEXP (op0, 0);
11389               code = (code == NE || code == GT ? LT : GE);
11390               continue;
11391             }
11392           break;
11393
11394         default:
11395           break;
11396         }
11397
11398       break;
11399     }
11400
11401   /* Now make any compound operations involved in this comparison.  Then,
11402      check for an outmost SUBREG on OP0 that is not doing anything or is
11403      paradoxical.  The latter transformation must only be performed when
11404      it is known that the "extra" bits will be the same in op0 and op1 or
11405      that they don't matter.  There are three cases to consider:
11406
11407      1. SUBREG_REG (op0) is a register.  In this case the bits are don't
11408      care bits and we can assume they have any convenient value.  So
11409      making the transformation is safe.
11410
11411      2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
11412      In this case the upper bits of op0 are undefined.  We should not make
11413      the simplification in that case as we do not know the contents of
11414      those bits.
11415
11416      3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
11417      UNKNOWN.  In that case we know those bits are zeros or ones.  We must
11418      also be sure that they are the same as the upper bits of op1.
11419
11420      We can never remove a SUBREG for a non-equality comparison because
11421      the sign bit is in a different place in the underlying object.  */
11422
11423   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
11424   op1 = make_compound_operation (op1, SET);
11425
11426   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
11427       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11428       && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
11429       && (code == NE || code == EQ))
11430     {
11431       if (GET_MODE_SIZE (GET_MODE (op0))
11432           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
11433         {
11434           /* For paradoxical subregs, allow case 1 as above.  Case 3 isn't
11435              implemented.  */
11436           if (REG_P (SUBREG_REG (op0)))
11437             {
11438               op0 = SUBREG_REG (op0);
11439               op1 = gen_lowpart (GET_MODE (op0), op1);
11440             }
11441         }
11442       else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
11443                 <= HOST_BITS_PER_WIDE_INT)
11444                && (nonzero_bits (SUBREG_REG (op0),
11445                                  GET_MODE (SUBREG_REG (op0)))
11446                    & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11447         {
11448           tem = gen_lowpart (GET_MODE (SUBREG_REG (op0)), op1);
11449
11450           if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
11451                & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11452             op0 = SUBREG_REG (op0), op1 = tem;
11453         }
11454     }
11455
11456   /* We now do the opposite procedure: Some machines don't have compare
11457      insns in all modes.  If OP0's mode is an integer mode smaller than a
11458      word and we can't do a compare in that mode, see if there is a larger
11459      mode for which we can do the compare.  There are a number of cases in
11460      which we can use the wider mode.  */
11461
11462   mode = GET_MODE (op0);
11463   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11464       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
11465       && ! have_insn_for (COMPARE, mode))
11466     for (tmode = GET_MODE_WIDER_MODE (mode);
11467          (tmode != VOIDmode
11468           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
11469          tmode = GET_MODE_WIDER_MODE (tmode))
11470       if (have_insn_for (COMPARE, tmode))
11471         {
11472           int zero_extended;
11473
11474           /* If this is a test for negative, we can make an explicit
11475              test of the sign bit.  Test this first so we can use
11476              a paradoxical subreg to extend OP0.  */
11477
11478           if (op1 == const0_rtx && (code == LT || code == GE)
11479               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11480             {
11481               op0 = simplify_gen_binary (AND, tmode,
11482                                          gen_lowpart (tmode, op0),
11483                                          GEN_INT ((HOST_WIDE_INT) 1
11484                                                   << (GET_MODE_BITSIZE (mode)
11485                                                       - 1)));
11486               code = (code == LT) ? NE : EQ;
11487               break;
11488             }
11489
11490           /* If the only nonzero bits in OP0 and OP1 are those in the
11491              narrower mode and this is an equality or unsigned comparison,
11492              we can use the wider mode.  Similarly for sign-extended
11493              values, in which case it is true for all comparisons.  */
11494           zero_extended = ((code == EQ || code == NE
11495                             || code == GEU || code == GTU
11496                             || code == LEU || code == LTU)
11497                            && (nonzero_bits (op0, tmode)
11498                                & ~GET_MODE_MASK (mode)) == 0
11499                            && ((CONST_INT_P (op1)
11500                                 || (nonzero_bits (op1, tmode)
11501                                     & ~GET_MODE_MASK (mode)) == 0)));
11502
11503           if (zero_extended
11504               || ((num_sign_bit_copies (op0, tmode)
11505                    > (unsigned int) (GET_MODE_BITSIZE (tmode)
11506                                      - GET_MODE_BITSIZE (mode)))
11507                   && (num_sign_bit_copies (op1, tmode)
11508                       > (unsigned int) (GET_MODE_BITSIZE (tmode)
11509                                         - GET_MODE_BITSIZE (mode)))))
11510             {
11511               /* If OP0 is an AND and we don't have an AND in MODE either,
11512                  make a new AND in the proper mode.  */
11513               if (GET_CODE (op0) == AND
11514                   && !have_insn_for (AND, mode))
11515                 op0 = simplify_gen_binary (AND, tmode,
11516                                            gen_lowpart (tmode,
11517                                                         XEXP (op0, 0)),
11518                                            gen_lowpart (tmode,
11519                                                         XEXP (op0, 1)));
11520               else
11521                 {
11522                   if (zero_extended)
11523                     {
11524                       op0 = simplify_gen_unary (ZERO_EXTEND, tmode, op0, mode);
11525                       op1 = simplify_gen_unary (ZERO_EXTEND, tmode, op1, mode);
11526                     }
11527                   else
11528                     {
11529                       op0 = simplify_gen_unary (SIGN_EXTEND, tmode, op0, mode);
11530                       op1 = simplify_gen_unary (SIGN_EXTEND, tmode, op1, mode);
11531                     }
11532                   break;
11533                 }
11534             }
11535         }
11536
11537 #ifdef CANONICALIZE_COMPARISON
11538   /* If this machine only supports a subset of valid comparisons, see if we
11539      can convert an unsupported one into a supported one.  */
11540   CANONICALIZE_COMPARISON (code, op0, op1);
11541 #endif
11542
11543   *pop0 = op0;
11544   *pop1 = op1;
11545
11546   return code;
11547 }
11548 \f
11549 /* Utility function for record_value_for_reg.  Count number of
11550    rtxs in X.  */
11551 static int
11552 count_rtxs (rtx x)
11553 {
11554   enum rtx_code code = GET_CODE (x);
11555   const char *fmt;
11556   int i, j, ret = 1;
11557
11558   if (GET_RTX_CLASS (code) == '2'
11559       || GET_RTX_CLASS (code) == 'c')
11560     {
11561       rtx x0 = XEXP (x, 0);
11562       rtx x1 = XEXP (x, 1);
11563
11564       if (x0 == x1)
11565         return 1 + 2 * count_rtxs (x0);
11566
11567       if ((GET_RTX_CLASS (GET_CODE (x1)) == '2'
11568            || GET_RTX_CLASS (GET_CODE (x1)) == 'c')
11569           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11570         return 2 + 2 * count_rtxs (x0)
11571                + count_rtxs (x == XEXP (x1, 0)
11572                              ? XEXP (x1, 1) : XEXP (x1, 0));
11573
11574       if ((GET_RTX_CLASS (GET_CODE (x0)) == '2'
11575            || GET_RTX_CLASS (GET_CODE (x0)) == 'c')
11576           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11577         return 2 + 2 * count_rtxs (x1)
11578                + count_rtxs (x == XEXP (x0, 0)
11579                              ? XEXP (x0, 1) : XEXP (x0, 0));
11580     }
11581
11582   fmt = GET_RTX_FORMAT (code);
11583   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11584     if (fmt[i] == 'e')
11585       ret += count_rtxs (XEXP (x, i));
11586     else if (fmt[i] == 'E')
11587       for (j = 0; j < XVECLEN (x, i); j++)
11588         ret += count_rtxs (XVECEXP (x, i, j));
11589
11590   return ret;
11591 }
11592 \f
11593 /* Utility function for following routine.  Called when X is part of a value
11594    being stored into last_set_value.  Sets last_set_table_tick
11595    for each register mentioned.  Similar to mention_regs in cse.c  */
11596
11597 static void
11598 update_table_tick (rtx x)
11599 {
11600   enum rtx_code code = GET_CODE (x);
11601   const char *fmt = GET_RTX_FORMAT (code);
11602   int i, j;
11603
11604   if (code == REG)
11605     {
11606       unsigned int regno = REGNO (x);
11607       unsigned int endregno = END_REGNO (x);
11608       unsigned int r;
11609
11610       for (r = regno; r < endregno; r++)
11611         {
11612           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, r);
11613           rsp->last_set_table_tick = label_tick;
11614         }
11615
11616       return;
11617     }
11618
11619   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11620     if (fmt[i] == 'e')
11621       {
11622         /* Check for identical subexpressions.  If x contains
11623            identical subexpression we only have to traverse one of
11624            them.  */
11625         if (i == 0 && ARITHMETIC_P (x))
11626           {
11627             /* Note that at this point x1 has already been
11628                processed.  */
11629             rtx x0 = XEXP (x, 0);
11630             rtx x1 = XEXP (x, 1);
11631
11632             /* If x0 and x1 are identical then there is no need to
11633                process x0.  */
11634             if (x0 == x1)
11635               break;
11636
11637             /* If x0 is identical to a subexpression of x1 then while
11638                processing x1, x0 has already been processed.  Thus we
11639                are done with x.  */
11640             if (ARITHMETIC_P (x1)
11641                 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11642               break;
11643
11644             /* If x1 is identical to a subexpression of x0 then we
11645                still have to process the rest of x0.  */
11646             if (ARITHMETIC_P (x0)
11647                 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11648               {
11649                 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
11650                 break;
11651               }
11652           }
11653
11654         update_table_tick (XEXP (x, i));
11655       }
11656     else if (fmt[i] == 'E')
11657       for (j = 0; j < XVECLEN (x, i); j++)
11658         update_table_tick (XVECEXP (x, i, j));
11659 }
11660
11661 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
11662    are saying that the register is clobbered and we no longer know its
11663    value.  If INSN is zero, don't update reg_stat[].last_set; this is
11664    only permitted with VALUE also zero and is used to invalidate the
11665    register.  */
11666
11667 static void
11668 record_value_for_reg (rtx reg, rtx insn, rtx value)
11669 {
11670   unsigned int regno = REGNO (reg);
11671   unsigned int endregno = END_REGNO (reg);
11672   unsigned int i;
11673   reg_stat_type *rsp;
11674
11675   /* If VALUE contains REG and we have a previous value for REG, substitute
11676      the previous value.  */
11677   if (value && insn && reg_overlap_mentioned_p (reg, value))
11678     {
11679       rtx tem;
11680
11681       /* Set things up so get_last_value is allowed to see anything set up to
11682          our insn.  */
11683       subst_low_luid = DF_INSN_LUID (insn);
11684       tem = get_last_value (reg);
11685
11686       /* If TEM is simply a binary operation with two CLOBBERs as operands,
11687          it isn't going to be useful and will take a lot of time to process,
11688          so just use the CLOBBER.  */
11689
11690       if (tem)
11691         {
11692           if (ARITHMETIC_P (tem)
11693               && GET_CODE (XEXP (tem, 0)) == CLOBBER
11694               && GET_CODE (XEXP (tem, 1)) == CLOBBER)
11695             tem = XEXP (tem, 0);
11696           else if (count_occurrences (value, reg, 1) >= 2)
11697             {
11698               /* If there are two or more occurrences of REG in VALUE,
11699                  prevent the value from growing too much.  */
11700               if (count_rtxs (tem) > MAX_LAST_VALUE_RTL)
11701                 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
11702             }
11703
11704           value = replace_rtx (copy_rtx (value), reg, tem);
11705         }
11706     }
11707
11708   /* For each register modified, show we don't know its value, that
11709      we don't know about its bitwise content, that its value has been
11710      updated, and that we don't know the location of the death of the
11711      register.  */
11712   for (i = regno; i < endregno; i++)
11713     {
11714       rsp = VEC_index (reg_stat_type, reg_stat, i);
11715
11716       if (insn)
11717         rsp->last_set = insn;
11718
11719       rsp->last_set_value = 0;
11720       rsp->last_set_mode = VOIDmode;
11721       rsp->last_set_nonzero_bits = 0;
11722       rsp->last_set_sign_bit_copies = 0;
11723       rsp->last_death = 0;
11724       rsp->truncated_to_mode = VOIDmode;
11725     }
11726
11727   /* Mark registers that are being referenced in this value.  */
11728   if (value)
11729     update_table_tick (value);
11730
11731   /* Now update the status of each register being set.
11732      If someone is using this register in this block, set this register
11733      to invalid since we will get confused between the two lives in this
11734      basic block.  This makes using this register always invalid.  In cse, we
11735      scan the table to invalidate all entries using this register, but this
11736      is too much work for us.  */
11737
11738   for (i = regno; i < endregno; i++)
11739     {
11740       rsp = VEC_index (reg_stat_type, reg_stat, i);
11741       rsp->last_set_label = label_tick;
11742       if (!insn
11743           || (value && rsp->last_set_table_tick >= label_tick_ebb_start))
11744         rsp->last_set_invalid = 1;
11745       else
11746         rsp->last_set_invalid = 0;
11747     }
11748
11749   /* The value being assigned might refer to X (like in "x++;").  In that
11750      case, we must replace it with (clobber (const_int 0)) to prevent
11751      infinite loops.  */
11752   rsp = VEC_index (reg_stat_type, reg_stat, regno);
11753   if (value && !get_last_value_validate (&value, insn, label_tick, 0))
11754     {
11755       value = copy_rtx (value);
11756       if (!get_last_value_validate (&value, insn, label_tick, 1))
11757         value = 0;
11758     }
11759
11760   /* For the main register being modified, update the value, the mode, the
11761      nonzero bits, and the number of sign bit copies.  */
11762
11763   rsp->last_set_value = value;
11764
11765   if (value)
11766     {
11767       enum machine_mode mode = GET_MODE (reg);
11768       subst_low_luid = DF_INSN_LUID (insn);
11769       rsp->last_set_mode = mode;
11770       if (GET_MODE_CLASS (mode) == MODE_INT
11771           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11772         mode = nonzero_bits_mode;
11773       rsp->last_set_nonzero_bits = nonzero_bits (value, mode);
11774       rsp->last_set_sign_bit_copies
11775         = num_sign_bit_copies (value, GET_MODE (reg));
11776     }
11777 }
11778
11779 /* Called via note_stores from record_dead_and_set_regs to handle one
11780    SET or CLOBBER in an insn.  DATA is the instruction in which the
11781    set is occurring.  */
11782
11783 static void
11784 record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data)
11785 {
11786   rtx record_dead_insn = (rtx) data;
11787
11788   if (GET_CODE (dest) == SUBREG)
11789     dest = SUBREG_REG (dest);
11790
11791   if (!record_dead_insn)
11792     {
11793       if (REG_P (dest))
11794         record_value_for_reg (dest, NULL_RTX, NULL_RTX);
11795       return;
11796     }
11797
11798   if (REG_P (dest))
11799     {
11800       /* If we are setting the whole register, we know its value.  Otherwise
11801          show that we don't know the value.  We can handle SUBREG in
11802          some cases.  */
11803       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
11804         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
11805       else if (GET_CODE (setter) == SET
11806                && GET_CODE (SET_DEST (setter)) == SUBREG
11807                && SUBREG_REG (SET_DEST (setter)) == dest
11808                && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
11809                && subreg_lowpart_p (SET_DEST (setter)))
11810         record_value_for_reg (dest, record_dead_insn,
11811                               gen_lowpart (GET_MODE (dest),
11812                                                        SET_SRC (setter)));
11813       else
11814         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
11815     }
11816   else if (MEM_P (dest)
11817            /* Ignore pushes, they clobber nothing.  */
11818            && ! push_operand (dest, GET_MODE (dest)))
11819     mem_last_set = DF_INSN_LUID (record_dead_insn);
11820 }
11821
11822 /* Update the records of when each REG was most recently set or killed
11823    for the things done by INSN.  This is the last thing done in processing
11824    INSN in the combiner loop.
11825
11826    We update reg_stat[], in particular fields last_set, last_set_value,
11827    last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
11828    last_death, and also the similar information mem_last_set (which insn
11829    most recently modified memory) and last_call_luid (which insn was the
11830    most recent subroutine call).  */
11831
11832 static void
11833 record_dead_and_set_regs (rtx insn)
11834 {
11835   rtx link;
11836   unsigned int i;
11837
11838   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
11839     {
11840       if (REG_NOTE_KIND (link) == REG_DEAD
11841           && REG_P (XEXP (link, 0)))
11842         {
11843           unsigned int regno = REGNO (XEXP (link, 0));
11844           unsigned int endregno = END_REGNO (XEXP (link, 0));
11845
11846           for (i = regno; i < endregno; i++)
11847             {
11848               reg_stat_type *rsp;
11849
11850               rsp = VEC_index (reg_stat_type, reg_stat, i);
11851               rsp->last_death = insn;
11852             }
11853         }
11854       else if (REG_NOTE_KIND (link) == REG_INC)
11855         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
11856     }
11857
11858   if (CALL_P (insn))
11859     {
11860       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
11861         if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
11862           {
11863             reg_stat_type *rsp;
11864
11865             rsp = VEC_index (reg_stat_type, reg_stat, i);
11866             rsp->last_set_invalid = 1;
11867             rsp->last_set = insn;
11868             rsp->last_set_value = 0;
11869             rsp->last_set_mode = VOIDmode;
11870             rsp->last_set_nonzero_bits = 0;
11871             rsp->last_set_sign_bit_copies = 0;
11872             rsp->last_death = 0;
11873             rsp->truncated_to_mode = VOIDmode;
11874           }
11875
11876       last_call_luid = mem_last_set = DF_INSN_LUID (insn);
11877
11878       /* We can't combine into a call pattern.  Remember, though, that
11879          the return value register is set at this LUID.  We could
11880          still replace a register with the return value from the
11881          wrong subroutine call!  */
11882       note_stores (PATTERN (insn), record_dead_and_set_regs_1, NULL_RTX);
11883     }
11884   else
11885     note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
11886 }
11887
11888 /* If a SUBREG has the promoted bit set, it is in fact a property of the
11889    register present in the SUBREG, so for each such SUBREG go back and
11890    adjust nonzero and sign bit information of the registers that are
11891    known to have some zero/sign bits set.
11892
11893    This is needed because when combine blows the SUBREGs away, the
11894    information on zero/sign bits is lost and further combines can be
11895    missed because of that.  */
11896
11897 static void
11898 record_promoted_value (rtx insn, rtx subreg)
11899 {
11900   rtx links, set;
11901   unsigned int regno = REGNO (SUBREG_REG (subreg));
11902   enum machine_mode mode = GET_MODE (subreg);
11903
11904   if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
11905     return;
11906
11907   for (links = LOG_LINKS (insn); links;)
11908     {
11909       reg_stat_type *rsp;
11910
11911       insn = XEXP (links, 0);
11912       set = single_set (insn);
11913
11914       if (! set || !REG_P (SET_DEST (set))
11915           || REGNO (SET_DEST (set)) != regno
11916           || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
11917         {
11918           links = XEXP (links, 1);
11919           continue;
11920         }
11921
11922       rsp = VEC_index (reg_stat_type, reg_stat, regno);
11923       if (rsp->last_set == insn)
11924         {
11925           if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
11926             rsp->last_set_nonzero_bits &= GET_MODE_MASK (mode);
11927         }
11928
11929       if (REG_P (SET_SRC (set)))
11930         {
11931           regno = REGNO (SET_SRC (set));
11932           links = LOG_LINKS (insn);
11933         }
11934       else
11935         break;
11936     }
11937 }
11938
11939 /* Check if X, a register, is known to contain a value already
11940    truncated to MODE.  In this case we can use a subreg to refer to
11941    the truncated value even though in the generic case we would need
11942    an explicit truncation.  */
11943
11944 static bool
11945 reg_truncated_to_mode (enum machine_mode mode, const_rtx x)
11946 {
11947   reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
11948   enum machine_mode truncated = rsp->truncated_to_mode;
11949
11950   if (truncated == 0
11951       || rsp->truncation_label < label_tick_ebb_start)
11952     return false;
11953   if (GET_MODE_SIZE (truncated) <= GET_MODE_SIZE (mode))
11954     return true;
11955   if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
11956                              GET_MODE_BITSIZE (truncated)))
11957     return true;
11958   return false;
11959 }
11960
11961 /* Callback for for_each_rtx.  If *P is a hard reg or a subreg record the mode
11962    that the register is accessed in.  For non-TRULY_NOOP_TRUNCATION targets we
11963    might be able to turn a truncate into a subreg using this information.
11964    Return -1 if traversing *P is complete or 0 otherwise.  */
11965
11966 static int
11967 record_truncated_value (rtx *p, void *data ATTRIBUTE_UNUSED)
11968 {
11969   rtx x = *p;
11970   enum machine_mode truncated_mode;
11971   reg_stat_type *rsp;
11972
11973   if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x)))
11974     {
11975       enum machine_mode original_mode = GET_MODE (SUBREG_REG (x));
11976       truncated_mode = GET_MODE (x);
11977
11978       if (GET_MODE_SIZE (original_mode) <= GET_MODE_SIZE (truncated_mode))
11979         return -1;
11980
11981       if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (truncated_mode),
11982                                  GET_MODE_BITSIZE (original_mode)))
11983         return -1;
11984
11985       x = SUBREG_REG (x);
11986     }
11987   /* ??? For hard-regs we now record everything.  We might be able to
11988      optimize this using last_set_mode.  */
11989   else if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
11990     truncated_mode = GET_MODE (x);
11991   else
11992     return 0;
11993
11994   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
11995   if (rsp->truncated_to_mode == 0
11996       || rsp->truncation_label < label_tick_ebb_start
11997       || (GET_MODE_SIZE (truncated_mode)
11998           < GET_MODE_SIZE (rsp->truncated_to_mode)))
11999     {
12000       rsp->truncated_to_mode = truncated_mode;
12001       rsp->truncation_label = label_tick;
12002     }
12003
12004   return -1;
12005 }
12006
12007 /* Callback for note_uses.  Find hardregs and subregs of pseudos and
12008    the modes they are used in.  This can help truning TRUNCATEs into
12009    SUBREGs.  */
12010
12011 static void
12012 record_truncated_values (rtx *x, void *data ATTRIBUTE_UNUSED)
12013 {
12014   for_each_rtx (x, record_truncated_value, NULL);
12015 }
12016
12017 /* Scan X for promoted SUBREGs.  For each one found,
12018    note what it implies to the registers used in it.  */
12019
12020 static void
12021 check_promoted_subreg (rtx insn, rtx x)
12022 {
12023   if (GET_CODE (x) == SUBREG
12024       && SUBREG_PROMOTED_VAR_P (x)
12025       && REG_P (SUBREG_REG (x)))
12026     record_promoted_value (insn, x);
12027   else
12028     {
12029       const char *format = GET_RTX_FORMAT (GET_CODE (x));
12030       int i, j;
12031
12032       for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
12033         switch (format[i])
12034           {
12035           case 'e':
12036             check_promoted_subreg (insn, XEXP (x, i));
12037             break;
12038           case 'V':
12039           case 'E':
12040             if (XVEC (x, i) != 0)
12041               for (j = 0; j < XVECLEN (x, i); j++)
12042                 check_promoted_subreg (insn, XVECEXP (x, i, j));
12043             break;
12044           }
12045     }
12046 }
12047 \f
12048 /* Verify that all the registers and memory references mentioned in *LOC are
12049    still valid.  *LOC was part of a value set in INSN when label_tick was
12050    equal to TICK.  Return 0 if some are not.  If REPLACE is nonzero, replace
12051    the invalid references with (clobber (const_int 0)) and return 1.  This
12052    replacement is useful because we often can get useful information about
12053    the form of a value (e.g., if it was produced by a shift that always
12054    produces -1 or 0) even though we don't know exactly what registers it
12055    was produced from.  */
12056
12057 static int
12058 get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
12059 {
12060   rtx x = *loc;
12061   const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
12062   int len = GET_RTX_LENGTH (GET_CODE (x));
12063   int i, j;
12064
12065   if (REG_P (x))
12066     {
12067       unsigned int regno = REGNO (x);
12068       unsigned int endregno = END_REGNO (x);
12069       unsigned int j;
12070
12071       for (j = regno; j < endregno; j++)
12072         {
12073           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, j);
12074           if (rsp->last_set_invalid
12075               /* If this is a pseudo-register that was only set once and not
12076                  live at the beginning of the function, it is always valid.  */
12077               || (! (regno >= FIRST_PSEUDO_REGISTER
12078                      && REG_N_SETS (regno) == 1
12079                      && (!REGNO_REG_SET_P
12080                          (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), regno)))
12081                   && rsp->last_set_label > tick))
12082           {
12083             if (replace)
12084               *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
12085             return replace;
12086           }
12087         }
12088
12089       return 1;
12090     }
12091   /* If this is a memory reference, make sure that there were no stores after
12092      it that might have clobbered the value.  We don't have alias info, so we
12093      assume any store invalidates it.  Moreover, we only have local UIDs, so
12094      we also assume that there were stores in the intervening basic blocks.  */
12095   else if (MEM_P (x) && !MEM_READONLY_P (x)
12096            && (tick != label_tick || DF_INSN_LUID (insn) <= mem_last_set))
12097     {
12098       if (replace)
12099         *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
12100       return replace;
12101     }
12102
12103   for (i = 0; i < len; i++)
12104     {
12105       if (fmt[i] == 'e')
12106         {
12107           /* Check for identical subexpressions.  If x contains
12108              identical subexpression we only have to traverse one of
12109              them.  */
12110           if (i == 1 && ARITHMETIC_P (x))
12111             {
12112               /* Note that at this point x0 has already been checked
12113                  and found valid.  */
12114               rtx x0 = XEXP (x, 0);
12115               rtx x1 = XEXP (x, 1);
12116
12117               /* If x0 and x1 are identical then x is also valid.  */
12118               if (x0 == x1)
12119                 return 1;
12120
12121               /* If x1 is identical to a subexpression of x0 then
12122                  while checking x0, x1 has already been checked.  Thus
12123                  it is valid and so as x.  */
12124               if (ARITHMETIC_P (x0)
12125                   && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12126                 return 1;
12127
12128               /* If x0 is identical to a subexpression of x1 then x is
12129                  valid iff the rest of x1 is valid.  */
12130               if (ARITHMETIC_P (x1)
12131                   && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12132                 return
12133                   get_last_value_validate (&XEXP (x1,
12134                                                   x0 == XEXP (x1, 0) ? 1 : 0),
12135                                            insn, tick, replace);
12136             }
12137
12138           if (get_last_value_validate (&XEXP (x, i), insn, tick,
12139                                        replace) == 0)
12140             return 0;
12141         }
12142       else if (fmt[i] == 'E')
12143         for (j = 0; j < XVECLEN (x, i); j++)
12144           if (get_last_value_validate (&XVECEXP (x, i, j),
12145                                        insn, tick, replace) == 0)
12146             return 0;
12147     }
12148
12149   /* If we haven't found a reason for it to be invalid, it is valid.  */
12150   return 1;
12151 }
12152
12153 /* Get the last value assigned to X, if known.  Some registers
12154    in the value may be replaced with (clobber (const_int 0)) if their value
12155    is known longer known reliably.  */
12156
12157 static rtx
12158 get_last_value (const_rtx x)
12159 {
12160   unsigned int regno;
12161   rtx value;
12162   reg_stat_type *rsp;
12163
12164   /* If this is a non-paradoxical SUBREG, get the value of its operand and
12165      then convert it to the desired mode.  If this is a paradoxical SUBREG,
12166      we cannot predict what values the "extra" bits might have.  */
12167   if (GET_CODE (x) == SUBREG
12168       && subreg_lowpart_p (x)
12169       && (GET_MODE_SIZE (GET_MODE (x))
12170           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
12171       && (value = get_last_value (SUBREG_REG (x))) != 0)
12172     return gen_lowpart (GET_MODE (x), value);
12173
12174   if (!REG_P (x))
12175     return 0;
12176
12177   regno = REGNO (x);
12178   rsp = VEC_index (reg_stat_type, reg_stat, regno);
12179   value = rsp->last_set_value;
12180
12181   /* If we don't have a value, or if it isn't for this basic block and
12182      it's either a hard register, set more than once, or it's a live
12183      at the beginning of the function, return 0.
12184
12185      Because if it's not live at the beginning of the function then the reg
12186      is always set before being used (is never used without being set).
12187      And, if it's set only once, and it's always set before use, then all
12188      uses must have the same last value, even if it's not from this basic
12189      block.  */
12190
12191   if (value == 0
12192       || (rsp->last_set_label < label_tick_ebb_start
12193           && (regno < FIRST_PSEUDO_REGISTER
12194               || REG_N_SETS (regno) != 1
12195               || REGNO_REG_SET_P
12196                  (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), regno))))
12197     return 0;
12198
12199   /* If the value was set in a later insn than the ones we are processing,
12200      we can't use it even if the register was only set once.  */
12201   if (rsp->last_set_label == label_tick
12202       && DF_INSN_LUID (rsp->last_set) >= subst_low_luid)
12203     return 0;
12204
12205   /* If the value has all its registers valid, return it.  */
12206   if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 0))
12207     return value;
12208
12209   /* Otherwise, make a copy and replace any invalid register with
12210      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
12211
12212   value = copy_rtx (value);
12213   if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 1))
12214     return value;
12215
12216   return 0;
12217 }
12218 \f
12219 /* Return nonzero if expression X refers to a REG or to memory
12220    that is set in an instruction more recent than FROM_LUID.  */
12221
12222 static int
12223 use_crosses_set_p (const_rtx x, int from_luid)
12224 {
12225   const char *fmt;
12226   int i;
12227   enum rtx_code code = GET_CODE (x);
12228
12229   if (code == REG)
12230     {
12231       unsigned int regno = REGNO (x);
12232       unsigned endreg = END_REGNO (x);
12233
12234 #ifdef PUSH_ROUNDING
12235       /* Don't allow uses of the stack pointer to be moved,
12236          because we don't know whether the move crosses a push insn.  */
12237       if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
12238         return 1;
12239 #endif
12240       for (; regno < endreg; regno++)
12241         {
12242           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, regno);
12243           if (rsp->last_set
12244               && rsp->last_set_label == label_tick
12245               && DF_INSN_LUID (rsp->last_set) > from_luid)
12246             return 1;
12247         }
12248       return 0;
12249     }
12250
12251   if (code == MEM && mem_last_set > from_luid)
12252     return 1;
12253
12254   fmt = GET_RTX_FORMAT (code);
12255
12256   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12257     {
12258       if (fmt[i] == 'E')
12259         {
12260           int j;
12261           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12262             if (use_crosses_set_p (XVECEXP (x, i, j), from_luid))
12263               return 1;
12264         }
12265       else if (fmt[i] == 'e'
12266                && use_crosses_set_p (XEXP (x, i), from_luid))
12267         return 1;
12268     }
12269   return 0;
12270 }
12271 \f
12272 /* Define three variables used for communication between the following
12273    routines.  */
12274
12275 static unsigned int reg_dead_regno, reg_dead_endregno;
12276 static int reg_dead_flag;
12277
12278 /* Function called via note_stores from reg_dead_at_p.
12279
12280    If DEST is within [reg_dead_regno, reg_dead_endregno), set
12281    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
12282
12283 static void
12284 reg_dead_at_p_1 (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
12285 {
12286   unsigned int regno, endregno;
12287
12288   if (!REG_P (dest))
12289     return;
12290
12291   regno = REGNO (dest);
12292   endregno = END_REGNO (dest);
12293   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
12294     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
12295 }
12296
12297 /* Return nonzero if REG is known to be dead at INSN.
12298
12299    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
12300    referencing REG, it is dead.  If we hit a SET referencing REG, it is
12301    live.  Otherwise, see if it is live or dead at the start of the basic
12302    block we are in.  Hard regs marked as being live in NEWPAT_USED_REGS
12303    must be assumed to be always live.  */
12304
12305 static int
12306 reg_dead_at_p (rtx reg, rtx insn)
12307 {
12308   basic_block block;
12309   unsigned int i;
12310
12311   /* Set variables for reg_dead_at_p_1.  */
12312   reg_dead_regno = REGNO (reg);
12313   reg_dead_endregno = END_REGNO (reg);
12314
12315   reg_dead_flag = 0;
12316
12317   /* Check that reg isn't mentioned in NEWPAT_USED_REGS.  For fixed registers
12318      we allow the machine description to decide whether use-and-clobber
12319      patterns are OK.  */
12320   if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
12321     {
12322       for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12323         if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
12324           return 0;
12325     }
12326
12327   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, or
12328      beginning of basic block.  */
12329   block = BLOCK_FOR_INSN (insn);
12330   for (;;)
12331     {
12332       if (INSN_P (insn))
12333         {
12334           note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
12335           if (reg_dead_flag)
12336             return reg_dead_flag == 1 ? 1 : 0;
12337
12338           if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
12339             return 1;
12340         }
12341
12342       if (insn == BB_HEAD (block))
12343         break;
12344
12345       insn = PREV_INSN (insn);
12346     }
12347
12348   /* Look at live-in sets for the basic block that we were in.  */
12349   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12350     if (REGNO_REG_SET_P (df_get_live_in (block), i))
12351       return 0;
12352
12353   return 1;
12354 }
12355 \f
12356 /* Note hard registers in X that are used.  */
12357
12358 static void
12359 mark_used_regs_combine (rtx x)
12360 {
12361   RTX_CODE code = GET_CODE (x);
12362   unsigned int regno;
12363   int i;
12364
12365   switch (code)
12366     {
12367     case LABEL_REF:
12368     case SYMBOL_REF:
12369     case CONST_INT:
12370     case CONST:
12371     case CONST_DOUBLE:
12372     case CONST_VECTOR:
12373     case PC:
12374     case ADDR_VEC:
12375     case ADDR_DIFF_VEC:
12376     case ASM_INPUT:
12377 #ifdef HAVE_cc0
12378     /* CC0 must die in the insn after it is set, so we don't need to take
12379        special note of it here.  */
12380     case CC0:
12381 #endif
12382       return;
12383
12384     case CLOBBER:
12385       /* If we are clobbering a MEM, mark any hard registers inside the
12386          address as used.  */
12387       if (MEM_P (XEXP (x, 0)))
12388         mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
12389       return;
12390
12391     case REG:
12392       regno = REGNO (x);
12393       /* A hard reg in a wide mode may really be multiple registers.
12394          If so, mark all of them just like the first.  */
12395       if (regno < FIRST_PSEUDO_REGISTER)
12396         {
12397           /* None of this applies to the stack, frame or arg pointers.  */
12398           if (regno == STACK_POINTER_REGNUM
12399 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
12400               || regno == HARD_FRAME_POINTER_REGNUM
12401 #endif
12402 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
12403               || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
12404 #endif
12405               || regno == FRAME_POINTER_REGNUM)
12406             return;
12407
12408           add_to_hard_reg_set (&newpat_used_regs, GET_MODE (x), regno);
12409         }
12410       return;
12411
12412     case SET:
12413       {
12414         /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
12415            the address.  */
12416         rtx testreg = SET_DEST (x);
12417
12418         while (GET_CODE (testreg) == SUBREG
12419                || GET_CODE (testreg) == ZERO_EXTRACT
12420                || GET_CODE (testreg) == STRICT_LOW_PART)
12421           testreg = XEXP (testreg, 0);
12422
12423         if (MEM_P (testreg))
12424           mark_used_regs_combine (XEXP (testreg, 0));
12425
12426         mark_used_regs_combine (SET_SRC (x));
12427       }
12428       return;
12429
12430     default:
12431       break;
12432     }
12433
12434   /* Recursively scan the operands of this expression.  */
12435
12436   {
12437     const char *fmt = GET_RTX_FORMAT (code);
12438
12439     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12440       {
12441         if (fmt[i] == 'e')
12442           mark_used_regs_combine (XEXP (x, i));
12443         else if (fmt[i] == 'E')
12444           {
12445             int j;
12446
12447             for (j = 0; j < XVECLEN (x, i); j++)
12448               mark_used_regs_combine (XVECEXP (x, i, j));
12449           }
12450       }
12451   }
12452 }
12453 \f
12454 /* Remove register number REGNO from the dead registers list of INSN.
12455
12456    Return the note used to record the death, if there was one.  */
12457
12458 rtx
12459 remove_death (unsigned int regno, rtx insn)
12460 {
12461   rtx note = find_regno_note (insn, REG_DEAD, regno);
12462
12463   if (note)
12464     remove_note (insn, note);
12465
12466   return note;
12467 }
12468
12469 /* For each register (hardware or pseudo) used within expression X, if its
12470    death is in an instruction with luid between FROM_LUID (inclusive) and
12471    TO_INSN (exclusive), put a REG_DEAD note for that register in the
12472    list headed by PNOTES.
12473
12474    That said, don't move registers killed by maybe_kill_insn.
12475
12476    This is done when X is being merged by combination into TO_INSN.  These
12477    notes will then be distributed as needed.  */
12478
12479 static void
12480 move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx to_insn,
12481              rtx *pnotes)
12482 {
12483   const char *fmt;
12484   int len, i;
12485   enum rtx_code code = GET_CODE (x);
12486
12487   if (code == REG)
12488     {
12489       unsigned int regno = REGNO (x);
12490       rtx where_dead = VEC_index (reg_stat_type, reg_stat, regno)->last_death;
12491
12492       /* Don't move the register if it gets killed in between from and to.  */
12493       if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
12494           && ! reg_referenced_p (x, maybe_kill_insn))
12495         return;
12496
12497       if (where_dead
12498           && BLOCK_FOR_INSN (where_dead) == BLOCK_FOR_INSN (to_insn)
12499           && DF_INSN_LUID (where_dead) >= from_luid
12500           && DF_INSN_LUID (where_dead) < DF_INSN_LUID (to_insn))
12501         {
12502           rtx note = remove_death (regno, where_dead);
12503
12504           /* It is possible for the call above to return 0.  This can occur
12505              when last_death points to I2 or I1 that we combined with.
12506              In that case make a new note.
12507
12508              We must also check for the case where X is a hard register
12509              and NOTE is a death note for a range of hard registers
12510              including X.  In that case, we must put REG_DEAD notes for
12511              the remaining registers in place of NOTE.  */
12512
12513           if (note != 0 && regno < FIRST_PSEUDO_REGISTER
12514               && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12515                   > GET_MODE_SIZE (GET_MODE (x))))
12516             {
12517               unsigned int deadregno = REGNO (XEXP (note, 0));
12518               unsigned int deadend = END_HARD_REGNO (XEXP (note, 0));
12519               unsigned int ourend = END_HARD_REGNO (x);
12520               unsigned int i;
12521
12522               for (i = deadregno; i < deadend; i++)
12523                 if (i < regno || i >= ourend)
12524                   add_reg_note (where_dead, REG_DEAD, regno_reg_rtx[i]);
12525             }
12526
12527           /* If we didn't find any note, or if we found a REG_DEAD note that
12528              covers only part of the given reg, and we have a multi-reg hard
12529              register, then to be safe we must check for REG_DEAD notes
12530              for each register other than the first.  They could have
12531              their own REG_DEAD notes lying around.  */
12532           else if ((note == 0
12533                     || (note != 0
12534                         && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12535                             < GET_MODE_SIZE (GET_MODE (x)))))
12536                    && regno < FIRST_PSEUDO_REGISTER
12537                    && hard_regno_nregs[regno][GET_MODE (x)] > 1)
12538             {
12539               unsigned int ourend = END_HARD_REGNO (x);
12540               unsigned int i, offset;
12541               rtx oldnotes = 0;
12542
12543               if (note)
12544                 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
12545               else
12546                 offset = 1;
12547
12548               for (i = regno + offset; i < ourend; i++)
12549                 move_deaths (regno_reg_rtx[i],
12550                              maybe_kill_insn, from_luid, to_insn, &oldnotes);
12551             }
12552
12553           if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
12554             {
12555               XEXP (note, 1) = *pnotes;
12556               *pnotes = note;
12557             }
12558           else
12559             *pnotes = alloc_reg_note (REG_DEAD, x, *pnotes);
12560         }
12561
12562       return;
12563     }
12564
12565   else if (GET_CODE (x) == SET)
12566     {
12567       rtx dest = SET_DEST (x);
12568
12569       move_deaths (SET_SRC (x), maybe_kill_insn, from_luid, to_insn, pnotes);
12570
12571       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
12572          that accesses one word of a multi-word item, some
12573          piece of everything register in the expression is used by
12574          this insn, so remove any old death.  */
12575       /* ??? So why do we test for equality of the sizes?  */
12576
12577       if (GET_CODE (dest) == ZERO_EXTRACT
12578           || GET_CODE (dest) == STRICT_LOW_PART
12579           || (GET_CODE (dest) == SUBREG
12580               && (((GET_MODE_SIZE (GET_MODE (dest))
12581                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
12582                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
12583                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
12584         {
12585           move_deaths (dest, maybe_kill_insn, from_luid, to_insn, pnotes);
12586           return;
12587         }
12588
12589       /* If this is some other SUBREG, we know it replaces the entire
12590          value, so use that as the destination.  */
12591       if (GET_CODE (dest) == SUBREG)
12592         dest = SUBREG_REG (dest);
12593
12594       /* If this is a MEM, adjust deaths of anything used in the address.
12595          For a REG (the only other possibility), the entire value is
12596          being replaced so the old value is not used in this insn.  */
12597
12598       if (MEM_P (dest))
12599         move_deaths (XEXP (dest, 0), maybe_kill_insn, from_luid,
12600                      to_insn, pnotes);
12601       return;
12602     }
12603
12604   else if (GET_CODE (x) == CLOBBER)
12605     return;
12606
12607   len = GET_RTX_LENGTH (code);
12608   fmt = GET_RTX_FORMAT (code);
12609
12610   for (i = 0; i < len; i++)
12611     {
12612       if (fmt[i] == 'E')
12613         {
12614           int j;
12615           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12616             move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_luid,
12617                          to_insn, pnotes);
12618         }
12619       else if (fmt[i] == 'e')
12620         move_deaths (XEXP (x, i), maybe_kill_insn, from_luid, to_insn, pnotes);
12621     }
12622 }
12623 \f
12624 /* Return 1 if X is the target of a bit-field assignment in BODY, the
12625    pattern of an insn.  X must be a REG.  */
12626
12627 static int
12628 reg_bitfield_target_p (rtx x, rtx body)
12629 {
12630   int i;
12631
12632   if (GET_CODE (body) == SET)
12633     {
12634       rtx dest = SET_DEST (body);
12635       rtx target;
12636       unsigned int regno, tregno, endregno, endtregno;
12637
12638       if (GET_CODE (dest) == ZERO_EXTRACT)
12639         target = XEXP (dest, 0);
12640       else if (GET_CODE (dest) == STRICT_LOW_PART)
12641         target = SUBREG_REG (XEXP (dest, 0));
12642       else
12643         return 0;
12644
12645       if (GET_CODE (target) == SUBREG)
12646         target = SUBREG_REG (target);
12647
12648       if (!REG_P (target))
12649         return 0;
12650
12651       tregno = REGNO (target), regno = REGNO (x);
12652       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
12653         return target == x;
12654
12655       endtregno = end_hard_regno (GET_MODE (target), tregno);
12656       endregno = end_hard_regno (GET_MODE (x), regno);
12657
12658       return endregno > tregno && regno < endtregno;
12659     }
12660
12661   else if (GET_CODE (body) == PARALLEL)
12662     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
12663       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
12664         return 1;
12665
12666   return 0;
12667 }
12668
12669 /* Return the next insn after INSN that is neither a NOTE nor a
12670    DEBUG_INSN.  This routine does not look inside SEQUENCEs.  */
12671
12672 static rtx
12673 next_nonnote_nondebug_insn (rtx insn)
12674 {
12675   while (insn)
12676     {
12677       insn = NEXT_INSN (insn);
12678       if (insn == 0)
12679         break;
12680       if (NOTE_P (insn))
12681         continue;
12682       if (DEBUG_INSN_P (insn))
12683         continue;
12684       break;
12685     }
12686
12687   return insn;
12688 }
12689
12690
12691 \f
12692 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
12693    as appropriate.  I3 and I2 are the insns resulting from the combination
12694    insns including FROM (I2 may be zero).
12695
12696    ELIM_I2 and ELIM_I1 are either zero or registers that we know will
12697    not need REG_DEAD notes because they are being substituted for.  This
12698    saves searching in the most common cases.
12699
12700    Each note in the list is either ignored or placed on some insns, depending
12701    on the type of note.  */
12702
12703 static void
12704 distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
12705                   rtx elim_i1)
12706 {
12707   rtx note, next_note;
12708   rtx tem;
12709
12710   for (note = notes; note; note = next_note)
12711     {
12712       rtx place = 0, place2 = 0;
12713
12714       next_note = XEXP (note, 1);
12715       switch (REG_NOTE_KIND (note))
12716         {
12717         case REG_BR_PROB:
12718         case REG_BR_PRED:
12719           /* Doesn't matter much where we put this, as long as it's somewhere.
12720              It is preferable to keep these notes on branches, which is most
12721              likely to be i3.  */
12722           place = i3;
12723           break;
12724
12725         case REG_VALUE_PROFILE:
12726           /* Just get rid of this note, as it is unused later anyway.  */
12727           break;
12728
12729         case REG_NON_LOCAL_GOTO:
12730           if (JUMP_P (i3))
12731             place = i3;
12732           else
12733             {
12734               gcc_assert (i2 && JUMP_P (i2));
12735               place = i2;
12736             }
12737           break;
12738
12739         case REG_EH_REGION:
12740           /* These notes must remain with the call or trapping instruction.  */
12741           if (CALL_P (i3))
12742             place = i3;
12743           else if (i2 && CALL_P (i2))
12744             place = i2;
12745           else
12746             {
12747               gcc_assert (flag_non_call_exceptions);
12748               if (may_trap_p (i3))
12749                 place = i3;
12750               else if (i2 && may_trap_p (i2))
12751                 place = i2;
12752               /* ??? Otherwise assume we've combined things such that we
12753                  can now prove that the instructions can't trap.  Drop the
12754                  note in this case.  */
12755             }
12756           break;
12757
12758         case REG_NORETURN:
12759         case REG_SETJMP:
12760           /* These notes must remain with the call.  It should not be
12761              possible for both I2 and I3 to be a call.  */
12762           if (CALL_P (i3))
12763             place = i3;
12764           else
12765             {
12766               gcc_assert (i2 && CALL_P (i2));
12767               place = i2;
12768             }
12769           break;
12770
12771         case REG_UNUSED:
12772           /* Any clobbers for i3 may still exist, and so we must process
12773              REG_UNUSED notes from that insn.
12774
12775              Any clobbers from i2 or i1 can only exist if they were added by
12776              recog_for_combine.  In that case, recog_for_combine created the
12777              necessary REG_UNUSED notes.  Trying to keep any original
12778              REG_UNUSED notes from these insns can cause incorrect output
12779              if it is for the same register as the original i3 dest.
12780              In that case, we will notice that the register is set in i3,
12781              and then add a REG_UNUSED note for the destination of i3, which
12782              is wrong.  However, it is possible to have REG_UNUSED notes from
12783              i2 or i1 for register which were both used and clobbered, so
12784              we keep notes from i2 or i1 if they will turn into REG_DEAD
12785              notes.  */
12786
12787           /* If this register is set or clobbered in I3, put the note there
12788              unless there is one already.  */
12789           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
12790             {
12791               if (from_insn != i3)
12792                 break;
12793
12794               if (! (REG_P (XEXP (note, 0))
12795                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
12796                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
12797                 place = i3;
12798             }
12799           /* Otherwise, if this register is used by I3, then this register
12800              now dies here, so we must put a REG_DEAD note here unless there
12801              is one already.  */
12802           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
12803                    && ! (REG_P (XEXP (note, 0))
12804                          ? find_regno_note (i3, REG_DEAD,
12805                                             REGNO (XEXP (note, 0)))
12806                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
12807             {
12808               PUT_REG_NOTE_KIND (note, REG_DEAD);
12809               place = i3;
12810             }
12811           break;
12812
12813         case REG_EQUAL:
12814         case REG_EQUIV:
12815         case REG_NOALIAS:
12816           /* These notes say something about results of an insn.  We can
12817              only support them if they used to be on I3 in which case they
12818              remain on I3.  Otherwise they are ignored.
12819
12820              If the note refers to an expression that is not a constant, we
12821              must also ignore the note since we cannot tell whether the
12822              equivalence is still true.  It might be possible to do
12823              slightly better than this (we only have a problem if I2DEST
12824              or I1DEST is present in the expression), but it doesn't
12825              seem worth the trouble.  */
12826
12827           if (from_insn == i3
12828               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
12829             place = i3;
12830           break;
12831
12832         case REG_INC:
12833           /* These notes say something about how a register is used.  They must
12834              be present on any use of the register in I2 or I3.  */
12835           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
12836             place = i3;
12837
12838           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
12839             {
12840               if (place)
12841                 place2 = i2;
12842               else
12843                 place = i2;
12844             }
12845           break;
12846
12847         case REG_LABEL_TARGET:
12848         case REG_LABEL_OPERAND:
12849           /* This can show up in several ways -- either directly in the
12850              pattern, or hidden off in the constant pool with (or without?)
12851              a REG_EQUAL note.  */
12852           /* ??? Ignore the without-reg_equal-note problem for now.  */
12853           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
12854               || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
12855                   && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12856                   && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
12857             place = i3;
12858
12859           if (i2
12860               && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
12861                   || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
12862                       && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12863                       && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
12864             {
12865               if (place)
12866                 place2 = i2;
12867               else
12868                 place = i2;
12869             }
12870
12871           /* For REG_LABEL_TARGET on a JUMP_P, we prefer to put the note
12872              as a JUMP_LABEL or decrement LABEL_NUSES if it's already
12873              there.  */
12874           if (place && JUMP_P (place)
12875               && REG_NOTE_KIND (note) == REG_LABEL_TARGET
12876               && (JUMP_LABEL (place) == NULL
12877                   || JUMP_LABEL (place) == XEXP (note, 0)))
12878             {
12879               rtx label = JUMP_LABEL (place);
12880
12881               if (!label)
12882                 JUMP_LABEL (place) = XEXP (note, 0);
12883               else if (LABEL_P (label))
12884                 LABEL_NUSES (label)--;
12885             }
12886
12887           if (place2 && JUMP_P (place2)
12888               && REG_NOTE_KIND (note) == REG_LABEL_TARGET
12889               && (JUMP_LABEL (place2) == NULL
12890                   || JUMP_LABEL (place2) == XEXP (note, 0)))
12891             {
12892               rtx label = JUMP_LABEL (place2);
12893
12894               if (!label)
12895                 JUMP_LABEL (place2) = XEXP (note, 0);
12896               else if (LABEL_P (label))
12897                 LABEL_NUSES (label)--;
12898               place2 = 0;
12899             }
12900           break;
12901
12902         case REG_NONNEG:
12903           /* This note says something about the value of a register prior
12904              to the execution of an insn.  It is too much trouble to see
12905              if the note is still correct in all situations.  It is better
12906              to simply delete it.  */
12907           break;
12908
12909         case REG_DEAD:
12910           /* If we replaced the right hand side of FROM_INSN with a
12911              REG_EQUAL note, the original use of the dying register
12912              will not have been combined into I3 and I2.  In such cases,
12913              FROM_INSN is guaranteed to be the first of the combined
12914              instructions, so we simply need to search back before
12915              FROM_INSN for the previous use or set of this register,
12916              then alter the notes there appropriately.
12917
12918              If the register is used as an input in I3, it dies there.
12919              Similarly for I2, if it is nonzero and adjacent to I3.
12920
12921              If the register is not used as an input in either I3 or I2
12922              and it is not one of the registers we were supposed to eliminate,
12923              there are two possibilities.  We might have a non-adjacent I2
12924              or we might have somehow eliminated an additional register
12925              from a computation.  For example, we might have had A & B where
12926              we discover that B will always be zero.  In this case we will
12927              eliminate the reference to A.
12928
12929              In both cases, we must search to see if we can find a previous
12930              use of A and put the death note there.  */
12931
12932           if (from_insn
12933               && from_insn == i2mod
12934               && !reg_overlap_mentioned_p (XEXP (note, 0), i2mod_new_rhs))
12935             tem = from_insn;
12936           else
12937             {
12938               if (from_insn
12939                   && CALL_P (from_insn)
12940                   && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
12941                 place = from_insn;
12942               else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
12943                 place = i3;
12944               else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
12945                        && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12946                 place = i2;
12947               else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
12948                         && !(i2mod
12949                              && reg_overlap_mentioned_p (XEXP (note, 0),
12950                                                          i2mod_old_rhs)))
12951                        || rtx_equal_p (XEXP (note, 0), elim_i1))
12952                 break;
12953               tem = i3;
12954             }
12955
12956           if (place == 0)
12957             {
12958               basic_block bb = this_basic_block;
12959
12960               for (tem = PREV_INSN (tem); place == 0; tem = PREV_INSN (tem))
12961                 {
12962                   if (!NONDEBUG_INSN_P (tem))
12963                     {
12964                       if (tem == BB_HEAD (bb))
12965                         break;
12966                       continue;
12967                     }
12968
12969                   /* If the register is being set at TEM, see if that is all
12970                      TEM is doing.  If so, delete TEM.  Otherwise, make this
12971                      into a REG_UNUSED note instead. Don't delete sets to
12972                      global register vars.  */
12973                   if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
12974                        || !global_regs[REGNO (XEXP (note, 0))])
12975                       && reg_set_p (XEXP (note, 0), PATTERN (tem)))
12976                     {
12977                       rtx set = single_set (tem);
12978                       rtx inner_dest = 0;
12979 #ifdef HAVE_cc0
12980                       rtx cc0_setter = NULL_RTX;
12981 #endif
12982
12983                       if (set != 0)
12984                         for (inner_dest = SET_DEST (set);
12985                              (GET_CODE (inner_dest) == STRICT_LOW_PART
12986                               || GET_CODE (inner_dest) == SUBREG
12987                               || GET_CODE (inner_dest) == ZERO_EXTRACT);
12988                              inner_dest = XEXP (inner_dest, 0))
12989                           ;
12990
12991                       /* Verify that it was the set, and not a clobber that
12992                          modified the register.
12993
12994                          CC0 targets must be careful to maintain setter/user
12995                          pairs.  If we cannot delete the setter due to side
12996                          effects, mark the user with an UNUSED note instead
12997                          of deleting it.  */
12998
12999                       if (set != 0 && ! side_effects_p (SET_SRC (set))
13000                           && rtx_equal_p (XEXP (note, 0), inner_dest)
13001 #ifdef HAVE_cc0
13002                           && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
13003                               || ((cc0_setter = prev_cc0_setter (tem)) != NULL
13004                                   && sets_cc0_p (PATTERN (cc0_setter)) > 0))
13005 #endif
13006                           )
13007                         {
13008                           /* Move the notes and links of TEM elsewhere.
13009                              This might delete other dead insns recursively.
13010                              First set the pattern to something that won't use
13011                              any register.  */
13012                           rtx old_notes = REG_NOTES (tem);
13013
13014                           PATTERN (tem) = pc_rtx;
13015                           REG_NOTES (tem) = NULL;
13016
13017                           distribute_notes (old_notes, tem, tem, NULL_RTX,
13018                                             NULL_RTX, NULL_RTX);
13019                           distribute_links (LOG_LINKS (tem));
13020
13021                           SET_INSN_DELETED (tem);
13022                           if (tem == i2)
13023                             i2 = NULL_RTX;
13024
13025 #ifdef HAVE_cc0
13026                           /* Delete the setter too.  */
13027                           if (cc0_setter)
13028                             {
13029                               PATTERN (cc0_setter) = pc_rtx;
13030                               old_notes = REG_NOTES (cc0_setter);
13031                               REG_NOTES (cc0_setter) = NULL;
13032
13033                               distribute_notes (old_notes, cc0_setter,
13034                                                 cc0_setter, NULL_RTX,
13035                                                 NULL_RTX, NULL_RTX);
13036                               distribute_links (LOG_LINKS (cc0_setter));
13037
13038                               SET_INSN_DELETED (cc0_setter);
13039                               if (cc0_setter == i2)
13040                                 i2 = NULL_RTX;
13041                             }
13042 #endif
13043                         }
13044                       else
13045                         {
13046                           PUT_REG_NOTE_KIND (note, REG_UNUSED);
13047
13048                           /*  If there isn't already a REG_UNUSED note, put one
13049                               here.  Do not place a REG_DEAD note, even if
13050                               the register is also used here; that would not
13051                               match the algorithm used in lifetime analysis
13052                               and can cause the consistency check in the
13053                               scheduler to fail.  */
13054                           if (! find_regno_note (tem, REG_UNUSED,
13055                                                  REGNO (XEXP (note, 0))))
13056                             place = tem;
13057                           break;
13058                         }
13059                     }
13060                   else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
13061                            || (CALL_P (tem)
13062                                && find_reg_fusage (tem, USE, XEXP (note, 0))))
13063                     {
13064                       place = tem;
13065
13066                       /* If we are doing a 3->2 combination, and we have a
13067                          register which formerly died in i3 and was not used
13068                          by i2, which now no longer dies in i3 and is used in
13069                          i2 but does not die in i2, and place is between i2
13070                          and i3, then we may need to move a link from place to
13071                          i2.  */
13072                       if (i2 && DF_INSN_LUID (place) > DF_INSN_LUID (i2)
13073                           && from_insn
13074                           && DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2)
13075                           && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
13076                         {
13077                           rtx links = LOG_LINKS (place);
13078                           LOG_LINKS (place) = 0;
13079                           distribute_links (links);
13080                         }
13081                       break;
13082                     }
13083
13084                   if (tem == BB_HEAD (bb))
13085                     break;
13086                 }
13087
13088             }
13089
13090           /* If the register is set or already dead at PLACE, we needn't do
13091              anything with this note if it is still a REG_DEAD note.
13092              We check here if it is set at all, not if is it totally replaced,
13093              which is what `dead_or_set_p' checks, so also check for it being
13094              set partially.  */
13095
13096           if (place && REG_NOTE_KIND (note) == REG_DEAD)
13097             {
13098               unsigned int regno = REGNO (XEXP (note, 0));
13099               reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, regno);
13100
13101               if (dead_or_set_p (place, XEXP (note, 0))
13102                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
13103                 {
13104                   /* Unless the register previously died in PLACE, clear
13105                      last_death.  [I no longer understand why this is
13106                      being done.] */
13107                   if (rsp->last_death != place)
13108                     rsp->last_death = 0;
13109                   place = 0;
13110                 }
13111               else
13112                 rsp->last_death = place;
13113
13114               /* If this is a death note for a hard reg that is occupying
13115                  multiple registers, ensure that we are still using all
13116                  parts of the object.  If we find a piece of the object
13117                  that is unused, we must arrange for an appropriate REG_DEAD
13118                  note to be added for it.  However, we can't just emit a USE
13119                  and tag the note to it, since the register might actually
13120                  be dead; so we recourse, and the recursive call then finds
13121                  the previous insn that used this register.  */
13122
13123               if (place && regno < FIRST_PSEUDO_REGISTER
13124                   && hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))] > 1)
13125                 {
13126                   unsigned int endregno = END_HARD_REGNO (XEXP (note, 0));
13127                   int all_used = 1;
13128                   unsigned int i;
13129
13130                   for (i = regno; i < endregno; i++)
13131                     if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
13132                          && ! find_regno_fusage (place, USE, i))
13133                         || dead_or_set_regno_p (place, i))
13134                       all_used = 0;
13135
13136                   if (! all_used)
13137                     {
13138                       /* Put only REG_DEAD notes for pieces that are
13139                          not already dead or set.  */
13140
13141                       for (i = regno; i < endregno;
13142                            i += hard_regno_nregs[i][reg_raw_mode[i]])
13143                         {
13144                           rtx piece = regno_reg_rtx[i];
13145                           basic_block bb = this_basic_block;
13146
13147                           if (! dead_or_set_p (place, piece)
13148                               && ! reg_bitfield_target_p (piece,
13149                                                           PATTERN (place)))
13150                             {
13151                               rtx new_note = alloc_reg_note (REG_DEAD, piece,
13152                                                              NULL_RTX);
13153
13154                               distribute_notes (new_note, place, place,
13155                                                 NULL_RTX, NULL_RTX, NULL_RTX);
13156                             }
13157                           else if (! refers_to_regno_p (i, i + 1,
13158                                                         PATTERN (place), 0)
13159                                    && ! find_regno_fusage (place, USE, i))
13160                             for (tem = PREV_INSN (place); ;
13161                                  tem = PREV_INSN (tem))
13162                               {
13163                                 if (!NONDEBUG_INSN_P (tem))
13164                                   {
13165                                     if (tem == BB_HEAD (bb))
13166                                       break;
13167                                     continue;
13168                                   }
13169                                 if (dead_or_set_p (tem, piece)
13170                                     || reg_bitfield_target_p (piece,
13171                                                               PATTERN (tem)))
13172                                   {
13173                                     add_reg_note (tem, REG_UNUSED, piece);
13174                                     break;
13175                                   }
13176                               }
13177
13178                         }
13179
13180                       place = 0;
13181                     }
13182                 }
13183             }
13184           break;
13185
13186         default:
13187           /* Any other notes should not be present at this point in the
13188              compilation.  */
13189           gcc_unreachable ();
13190         }
13191
13192       if (place)
13193         {
13194           XEXP (note, 1) = REG_NOTES (place);
13195           REG_NOTES (place) = note;
13196         }
13197
13198       if (place2)
13199         add_reg_note (place2, REG_NOTE_KIND (note), XEXP (note, 0));
13200     }
13201 }
13202 \f
13203 /* Similarly to above, distribute the LOG_LINKS that used to be present on
13204    I3, I2, and I1 to new locations.  This is also called to add a link
13205    pointing at I3 when I3's destination is changed.  */
13206
13207 static void
13208 distribute_links (rtx links)
13209 {
13210   rtx link, next_link;
13211
13212   for (link = links; link; link = next_link)
13213     {
13214       rtx place = 0;
13215       rtx insn;
13216       rtx set, reg;
13217
13218       next_link = XEXP (link, 1);
13219
13220       /* If the insn that this link points to is a NOTE or isn't a single
13221          set, ignore it.  In the latter case, it isn't clear what we
13222          can do other than ignore the link, since we can't tell which
13223          register it was for.  Such links wouldn't be used by combine
13224          anyway.
13225
13226          It is not possible for the destination of the target of the link to
13227          have been changed by combine.  The only potential of this is if we
13228          replace I3, I2, and I1 by I3 and I2.  But in that case the
13229          destination of I2 also remains unchanged.  */
13230
13231       if (NOTE_P (XEXP (link, 0))
13232           || (set = single_set (XEXP (link, 0))) == 0)
13233         continue;
13234
13235       reg = SET_DEST (set);
13236       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
13237              || GET_CODE (reg) == STRICT_LOW_PART)
13238         reg = XEXP (reg, 0);
13239
13240       /* A LOG_LINK is defined as being placed on the first insn that uses
13241          a register and points to the insn that sets the register.  Start
13242          searching at the next insn after the target of the link and stop
13243          when we reach a set of the register or the end of the basic block.
13244
13245          Note that this correctly handles the link that used to point from
13246          I3 to I2.  Also note that not much searching is typically done here
13247          since most links don't point very far away.  */
13248
13249       for (insn = NEXT_INSN (XEXP (link, 0));
13250            (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
13251                      || BB_HEAD (this_basic_block->next_bb) != insn));
13252            insn = NEXT_INSN (insn))
13253         if (DEBUG_INSN_P (insn))
13254           continue;
13255         else if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
13256           {
13257             if (reg_referenced_p (reg, PATTERN (insn)))
13258               place = insn;
13259             break;
13260           }
13261         else if (CALL_P (insn)
13262                  && find_reg_fusage (insn, USE, reg))
13263           {
13264             place = insn;
13265             break;
13266           }
13267         else if (INSN_P (insn) && reg_set_p (reg, insn))
13268           break;
13269
13270       /* If we found a place to put the link, place it there unless there
13271          is already a link to the same insn as LINK at that point.  */
13272
13273       if (place)
13274         {
13275           rtx link2;
13276
13277           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
13278             if (XEXP (link2, 0) == XEXP (link, 0))
13279               break;
13280
13281           if (link2 == 0)
13282             {
13283               XEXP (link, 1) = LOG_LINKS (place);
13284               LOG_LINKS (place) = link;
13285
13286               /* Set added_links_insn to the earliest insn we added a
13287                  link to.  */
13288               if (added_links_insn == 0
13289                   || DF_INSN_LUID (added_links_insn) > DF_INSN_LUID (place))
13290                 added_links_insn = place;
13291             }
13292         }
13293     }
13294 }
13295 \f
13296 /* Subroutine of unmentioned_reg_p and callback from for_each_rtx.
13297    Check whether the expression pointer to by LOC is a register or
13298    memory, and if so return 1 if it isn't mentioned in the rtx EXPR.
13299    Otherwise return zero.  */
13300
13301 static int
13302 unmentioned_reg_p_1 (rtx *loc, void *expr)
13303 {
13304   rtx x = *loc;
13305
13306   if (x != NULL_RTX
13307       && (REG_P (x) || MEM_P (x))
13308       && ! reg_mentioned_p (x, (rtx) expr))
13309     return 1;
13310   return 0;
13311 }
13312
13313 /* Check for any register or memory mentioned in EQUIV that is not
13314    mentioned in EXPR.  This is used to restrict EQUIV to "specializations"
13315    of EXPR where some registers may have been replaced by constants.  */
13316
13317 static bool
13318 unmentioned_reg_p (rtx equiv, rtx expr)
13319 {
13320   return for_each_rtx (&equiv, unmentioned_reg_p_1, expr);
13321 }
13322 \f
13323 void
13324 dump_combine_stats (FILE *file)
13325 {
13326   fprintf
13327     (file,
13328      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
13329      combine_attempts, combine_merges, combine_extras, combine_successes);
13330 }
13331
13332 void
13333 dump_combine_total_stats (FILE *file)
13334 {
13335   fprintf
13336     (file,
13337      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
13338      total_attempts, total_merges, total_extras, total_successes);
13339 }
13340 \f
13341 static bool
13342 gate_handle_combine (void)
13343 {
13344   return (optimize > 0);
13345 }
13346
13347 /* Try combining insns through substitution.  */
13348 static unsigned int
13349 rest_of_handle_combine (void)
13350 {
13351   int rebuild_jump_labels_after_combine;
13352
13353   df_set_flags (DF_LR_RUN_DCE + DF_DEFER_INSN_RESCAN);
13354   df_note_add_problem ();
13355   df_analyze ();
13356
13357   regstat_init_n_sets_and_refs ();
13358
13359   rebuild_jump_labels_after_combine
13360     = combine_instructions (get_insns (), max_reg_num ());
13361
13362   /* Combining insns may have turned an indirect jump into a
13363      direct jump.  Rebuild the JUMP_LABEL fields of jumping
13364      instructions.  */
13365   if (rebuild_jump_labels_after_combine)
13366     {
13367       timevar_push (TV_JUMP);
13368       rebuild_jump_labels (get_insns ());
13369       cleanup_cfg (0);
13370       timevar_pop (TV_JUMP);
13371     }
13372
13373   regstat_free_n_sets_and_refs ();
13374   return 0;
13375 }
13376
13377 struct rtl_opt_pass pass_combine =
13378 {
13379  {
13380   RTL_PASS,
13381   "combine",                            /* name */
13382   gate_handle_combine,                  /* gate */
13383   rest_of_handle_combine,               /* execute */
13384   NULL,                                 /* sub */
13385   NULL,                                 /* next */
13386   0,                                    /* static_pass_number */
13387   TV_COMBINE,                           /* tv_id */
13388   PROP_cfglayout,                       /* properties_required */
13389   0,                                    /* properties_provided */
13390   0,                                    /* properties_destroyed */
13391   0,                                    /* todo_flags_start */
13392   TODO_dump_func |
13393   TODO_df_finish | TODO_verify_rtl_sharing |
13394   TODO_ggc_collect,                     /* todo_flags_finish */
13395  }
13396 };