OSDN Git Service

* common.opt (initial_max_fld_align, flag_debug_asm,
[pf3gnuchains/gcc-fork.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This module is essentially the "combiner" phase of the U. of Arizona
23    Portable Optimizer, but redone to work on our list-structured
24    representation for RTL instead of their string representation.
25
26    The LOG_LINKS of each insn identify the most recent assignment
27    to each REG used in the insn.  It is a list of previous insns,
28    each of which contains a SET for a REG that is used in this insn
29    and not used or set in between.  LOG_LINKs never cross basic blocks.
30    They were set up by the preceding pass (lifetime analysis).
31
32    We try to combine each pair of insns joined by a logical link.
33    We also try to combine triples of insns A, B and C when
34    C has a link back to B and B has a link back to A.
35
36    LOG_LINKS does not have links for use of the CC0.  They don't
37    need to, because the insn that sets the CC0 is always immediately
38    before the insn that tests it.  So we always regard a branch
39    insn as having a logical link to the preceding insn.  The same is true
40    for an insn explicitly using CC0.
41
42    We check (with use_crosses_set_p) to avoid combining in such a way
43    as to move a computation to a place where its value would be different.
44
45    Combination is done by mathematically substituting the previous
46    insn(s) values for the regs they set into the expressions in
47    the later insns that refer to these regs.  If the result is a valid insn
48    for our target machine, according to the machine description,
49    we install it, delete the earlier insns, and update the data flow
50    information (LOG_LINKS and REG_NOTES) for what we did.
51
52    There are a few exceptions where the dataflow information isn't
53    completely updated (however this is only a local issue since it is
54    regenerated before the next pass that uses it):
55
56    - reg_live_length is not updated
57    - reg_n_refs is not adjusted in the rare case when a register is
58      no longer required in a computation
59    - there are extremely rare cases (see distribute_notes) when a
60      REG_DEAD note is lost
61    - a LOG_LINKS entry that refers to an insn with multiple SETs may be
62      removed because there is no way to know which register it was
63      linking
64
65    To simplify substitution, we combine only when the earlier insn(s)
66    consist of only a single assignment.  To simplify updating afterward,
67    we never combine when a subroutine call appears in the middle.
68
69    Since we do not represent assignments to CC0 explicitly except when that
70    is all an insn does, there is no LOG_LINKS entry in an insn that uses
71    the condition code for the insn that set the condition code.
72    Fortunately, these two insns must be consecutive.
73    Therefore, every JUMP_INSN is taken to have an implicit logical link
74    to the preceding insn.  This is not quite right, since non-jumps can
75    also use the condition code; but in practice such insns would not
76    combine anyway.  */
77
78 #include "config.h"
79 #include "system.h"
80 #include "coretypes.h"
81 #include "tm.h"
82 #include "rtl.h"
83 #include "tree.h"
84 #include "tm_p.h"
85 #include "flags.h"
86 #include "regs.h"
87 #include "hard-reg-set.h"
88 #include "basic-block.h"
89 #include "insn-config.h"
90 #include "function.h"
91 /* Include expr.h after insn-config.h so we get HAVE_conditional_move.  */
92 #include "expr.h"
93 #include "insn-attr.h"
94 #include "recog.h"
95 #include "diagnostic-core.h"
96 #include "toplev.h"
97 #include "target.h"
98 #include "optabs.h"
99 #include "insn-codes.h"
100 #include "rtlhooks-def.h"
101 /* Include output.h for dump_file.  */
102 #include "output.h"
103 #include "params.h"
104 #include "timevar.h"
105 #include "tree-pass.h"
106 #include "df.h"
107 #include "cgraph.h"
108
109 /* Number of attempts to combine instructions in this function.  */
110
111 static int combine_attempts;
112
113 /* Number of attempts that got as far as substitution in this function.  */
114
115 static int combine_merges;
116
117 /* Number of instructions combined with added SETs in this function.  */
118
119 static int combine_extras;
120
121 /* Number of instructions combined in this function.  */
122
123 static int combine_successes;
124
125 /* Totals over entire compilation.  */
126
127 static int total_attempts, total_merges, total_extras, total_successes;
128
129 /* combine_instructions may try to replace the right hand side of the
130    second instruction with the value of an associated REG_EQUAL note
131    before throwing it at try_combine.  That is problematic when there
132    is a REG_DEAD note for a register used in the old right hand side
133    and can cause distribute_notes to do wrong things.  This is the
134    second instruction if it has been so modified, null otherwise.  */
135
136 static rtx i2mod;
137
138 /* When I2MOD is nonnull, this is a copy of the old right hand side.  */
139
140 static rtx i2mod_old_rhs;
141
142 /* When I2MOD is nonnull, this is a copy of the new right hand side.  */
143
144 static rtx i2mod_new_rhs;
145 \f
146 typedef struct reg_stat_struct {
147   /* Record last point of death of (hard or pseudo) register n.  */
148   rtx                           last_death;
149
150   /* Record last point of modification of (hard or pseudo) register n.  */
151   rtx                           last_set;
152
153   /* The next group of fields allows the recording of the last value assigned
154      to (hard or pseudo) register n.  We use this information to see if an
155      operation being processed is redundant given a prior operation performed
156      on the register.  For example, an `and' with a constant is redundant if
157      all the zero bits are already known to be turned off.
158
159      We use an approach similar to that used by cse, but change it in the
160      following ways:
161
162      (1) We do not want to reinitialize at each label.
163      (2) It is useful, but not critical, to know the actual value assigned
164          to a register.  Often just its form is helpful.
165
166      Therefore, we maintain the following fields:
167
168      last_set_value             the last value assigned
169      last_set_label             records the value of label_tick when the
170                                 register was assigned
171      last_set_table_tick        records the value of label_tick when a
172                                 value using the register is assigned
173      last_set_invalid           set to nonzero when it is not valid
174                                 to use the value of this register in some
175                                 register's value
176
177      To understand the usage of these tables, it is important to understand
178      the distinction between the value in last_set_value being valid and
179      the register being validly contained in some other expression in the
180      table.
181
182      (The next two parameters are out of date).
183
184      reg_stat[i].last_set_value is valid if it is nonzero, and either
185      reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
186
187      Register I may validly appear in any expression returned for the value
188      of another register if reg_n_sets[i] is 1.  It may also appear in the
189      value for register J if reg_stat[j].last_set_invalid is zero, or
190      reg_stat[i].last_set_label < reg_stat[j].last_set_label.
191
192      If an expression is found in the table containing a register which may
193      not validly appear in an expression, the register is replaced by
194      something that won't match, (clobber (const_int 0)).  */
195
196   /* Record last value assigned to (hard or pseudo) register n.  */
197
198   rtx                           last_set_value;
199
200   /* Record the value of label_tick when an expression involving register n
201      is placed in last_set_value.  */
202
203   int                           last_set_table_tick;
204
205   /* Record the value of label_tick when the value for register n is placed in
206      last_set_value.  */
207
208   int                           last_set_label;
209
210   /* These fields are maintained in parallel with last_set_value and are
211      used to store the mode in which the register was last set, the bits
212      that were known to be zero when it was last set, and the number of
213      sign bits copies it was known to have when it was last set.  */
214
215   unsigned HOST_WIDE_INT        last_set_nonzero_bits;
216   char                          last_set_sign_bit_copies;
217   ENUM_BITFIELD(machine_mode)   last_set_mode : 8;
218
219   /* Set nonzero if references to register n in expressions should not be
220      used.  last_set_invalid is set nonzero when this register is being
221      assigned to and last_set_table_tick == label_tick.  */
222
223   char                          last_set_invalid;
224
225   /* Some registers that are set more than once and used in more than one
226      basic block are nevertheless always set in similar ways.  For example,
227      a QImode register may be loaded from memory in two places on a machine
228      where byte loads zero extend.
229
230      We record in the following fields if a register has some leading bits
231      that are always equal to the sign bit, and what we know about the
232      nonzero bits of a register, specifically which bits are known to be
233      zero.
234
235      If an entry is zero, it means that we don't know anything special.  */
236
237   unsigned char                 sign_bit_copies;
238
239   unsigned HOST_WIDE_INT        nonzero_bits;
240
241   /* Record the value of the label_tick when the last truncation
242      happened.  The field truncated_to_mode is only valid if
243      truncation_label == label_tick.  */
244
245   int                           truncation_label;
246
247   /* Record the last truncation seen for this register.  If truncation
248      is not a nop to this mode we might be able to save an explicit
249      truncation if we know that value already contains a truncated
250      value.  */
251
252   ENUM_BITFIELD(machine_mode)   truncated_to_mode : 8;
253 } reg_stat_type;
254
255 DEF_VEC_O(reg_stat_type);
256 DEF_VEC_ALLOC_O(reg_stat_type,heap);
257
258 static VEC(reg_stat_type,heap) *reg_stat;
259
260 /* Record the luid of the last insn that invalidated memory
261    (anything that writes memory, and subroutine calls, but not pushes).  */
262
263 static int mem_last_set;
264
265 /* Record the luid of the last CALL_INSN
266    so we can tell whether a potential combination crosses any calls.  */
267
268 static int last_call_luid;
269
270 /* When `subst' is called, this is the insn that is being modified
271    (by combining in a previous insn).  The PATTERN of this insn
272    is still the old pattern partially modified and it should not be
273    looked at, but this may be used to examine the successors of the insn
274    to judge whether a simplification is valid.  */
275
276 static rtx subst_insn;
277
278 /* This is the lowest LUID that `subst' is currently dealing with.
279    get_last_value will not return a value if the register was set at or
280    after this LUID.  If not for this mechanism, we could get confused if
281    I2 or I1 in try_combine were an insn that used the old value of a register
282    to obtain a new value.  In that case, we might erroneously get the
283    new value of the register when we wanted the old one.  */
284
285 static int subst_low_luid;
286
287 /* This contains any hard registers that are used in newpat; reg_dead_at_p
288    must consider all these registers to be always live.  */
289
290 static HARD_REG_SET newpat_used_regs;
291
292 /* This is an insn to which a LOG_LINKS entry has been added.  If this
293    insn is the earlier than I2 or I3, combine should rescan starting at
294    that location.  */
295
296 static rtx added_links_insn;
297
298 /* Basic block in which we are performing combines.  */
299 static basic_block this_basic_block;
300 static bool optimize_this_for_speed_p;
301
302 \f
303 /* Length of the currently allocated uid_insn_cost array.  */
304
305 static int max_uid_known;
306
307 /* The following array records the insn_rtx_cost for every insn
308    in the instruction stream.  */
309
310 static int *uid_insn_cost;
311
312 /* The following array records the LOG_LINKS for every insn in the
313    instruction stream as an INSN_LIST rtx.  */
314
315 static rtx *uid_log_links;
316
317 #define INSN_COST(INSN)         (uid_insn_cost[INSN_UID (INSN)])
318 #define LOG_LINKS(INSN)         (uid_log_links[INSN_UID (INSN)])
319
320 /* Incremented for each basic block.  */
321
322 static int label_tick;
323
324 /* Reset to label_tick for each extended basic block in scanning order.  */
325
326 static int label_tick_ebb_start;
327
328 /* Mode used to compute significance in reg_stat[].nonzero_bits.  It is the
329    largest integer mode that can fit in HOST_BITS_PER_WIDE_INT.  */
330
331 static enum machine_mode nonzero_bits_mode;
332
333 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
334    be safely used.  It is zero while computing them and after combine has
335    completed.  This former test prevents propagating values based on
336    previously set values, which can be incorrect if a variable is modified
337    in a loop.  */
338
339 static int nonzero_sign_valid;
340
341 \f
342 /* Record one modification to rtl structure
343    to be undone by storing old_contents into *where.  */
344
345 enum undo_kind { UNDO_RTX, UNDO_INT, UNDO_MODE };
346
347 struct undo
348 {
349   struct undo *next;
350   enum undo_kind kind;
351   union { rtx r; int i; enum machine_mode m; } old_contents;
352   union { rtx *r; int *i; } where;
353 };
354
355 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
356    num_undo says how many are currently recorded.
357
358    other_insn is nonzero if we have modified some other insn in the process
359    of working on subst_insn.  It must be verified too.  */
360
361 struct undobuf
362 {
363   struct undo *undos;
364   struct undo *frees;
365   rtx other_insn;
366 };
367
368 static struct undobuf undobuf;
369
370 /* Number of times the pseudo being substituted for
371    was found and replaced.  */
372
373 static int n_occurrences;
374
375 static rtx reg_nonzero_bits_for_combine (const_rtx, enum machine_mode, const_rtx,
376                                          enum machine_mode,
377                                          unsigned HOST_WIDE_INT,
378                                          unsigned HOST_WIDE_INT *);
379 static rtx reg_num_sign_bit_copies_for_combine (const_rtx, enum machine_mode, const_rtx,
380                                                 enum machine_mode,
381                                                 unsigned int, unsigned int *);
382 static void do_SUBST (rtx *, rtx);
383 static void do_SUBST_INT (int *, int);
384 static void init_reg_last (void);
385 static void setup_incoming_promotions (rtx);
386 static void set_nonzero_bits_and_sign_copies (rtx, const_rtx, void *);
387 static int cant_combine_insn_p (rtx);
388 static int can_combine_p (rtx, rtx, rtx, rtx, rtx, rtx, rtx *, rtx *);
389 static int combinable_i3pat (rtx, rtx *, rtx, rtx, rtx, int, int, rtx *);
390 static int contains_muldiv (rtx);
391 static rtx try_combine (rtx, rtx, rtx, rtx, int *);
392 static void undo_all (void);
393 static void undo_commit (void);
394 static rtx *find_split_point (rtx *, rtx, bool);
395 static rtx subst (rtx, rtx, rtx, int, int);
396 static rtx combine_simplify_rtx (rtx, enum machine_mode, int);
397 static rtx simplify_if_then_else (rtx);
398 static rtx simplify_set (rtx);
399 static rtx simplify_logical (rtx);
400 static rtx expand_compound_operation (rtx);
401 static const_rtx expand_field_assignment (const_rtx);
402 static rtx make_extraction (enum machine_mode, rtx, HOST_WIDE_INT,
403                             rtx, unsigned HOST_WIDE_INT, int, int, int);
404 static rtx extract_left_shift (rtx, int);
405 static rtx make_compound_operation (rtx, enum rtx_code);
406 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
407                               unsigned HOST_WIDE_INT *);
408 static rtx canon_reg_for_combine (rtx, rtx);
409 static rtx force_to_mode (rtx, enum machine_mode,
410                           unsigned HOST_WIDE_INT, int);
411 static rtx if_then_else_cond (rtx, rtx *, rtx *);
412 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
413 static int rtx_equal_for_field_assignment_p (rtx, rtx);
414 static rtx make_field_assignment (rtx);
415 static rtx apply_distributive_law (rtx);
416 static rtx distribute_and_simplify_rtx (rtx, int);
417 static rtx simplify_and_const_int_1 (enum machine_mode, rtx,
418                                      unsigned HOST_WIDE_INT);
419 static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
420                                    unsigned HOST_WIDE_INT);
421 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
422                             HOST_WIDE_INT, enum machine_mode, int *);
423 static rtx simplify_shift_const_1 (enum rtx_code, enum machine_mode, rtx, int);
424 static rtx simplify_shift_const (rtx, enum rtx_code, enum machine_mode, rtx,
425                                  int);
426 static int recog_for_combine (rtx *, rtx, rtx *);
427 static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
428 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
429 static void update_table_tick (rtx);
430 static void record_value_for_reg (rtx, rtx, rtx);
431 static void check_promoted_subreg (rtx, rtx);
432 static void record_dead_and_set_regs_1 (rtx, const_rtx, void *);
433 static void record_dead_and_set_regs (rtx);
434 static int get_last_value_validate (rtx *, rtx, int, int);
435 static rtx get_last_value (const_rtx);
436 static int use_crosses_set_p (const_rtx, int);
437 static void reg_dead_at_p_1 (rtx, const_rtx, void *);
438 static int reg_dead_at_p (rtx, rtx);
439 static void move_deaths (rtx, rtx, int, rtx, rtx *);
440 static int reg_bitfield_target_p (rtx, rtx);
441 static void distribute_notes (rtx, rtx, rtx, rtx, rtx, rtx, 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 I0, 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 i0, rtx i1, rtx i2, rtx i3, rtx newpat,
778                        rtx newi2pat, rtx newotherpat)
779 {
780   int i0_cost, 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       if (i0)
792         {
793           i0_cost = INSN_COST (i0);
794           old_cost = (i0_cost > 0 && i1_cost > 0 && i2_cost > 0 && i3_cost > 0
795                       ? i0_cost + i1_cost + i2_cost + i3_cost : 0);
796         }
797       else
798         {
799           old_cost = (i1_cost > 0 && i2_cost > 0 && i3_cost > 0
800                       ? i1_cost + i2_cost + i3_cost : 0);
801           i0_cost = 0;
802         }
803     }
804   else
805     {
806       old_cost = (i2_cost > 0 && i3_cost > 0) ? i2_cost + i3_cost : 0;
807       i1_cost = i0_cost = 0;
808     }
809
810   /* Calculate the replacement insn_rtx_costs.  */
811   new_i3_cost = insn_rtx_cost (newpat, optimize_this_for_speed_p);
812   if (newi2pat)
813     {
814       new_i2_cost = insn_rtx_cost (newi2pat, optimize_this_for_speed_p);
815       new_cost = (new_i2_cost > 0 && new_i3_cost > 0)
816                  ? new_i2_cost + new_i3_cost : 0;
817     }
818   else
819     {
820       new_cost = new_i3_cost;
821       new_i2_cost = 0;
822     }
823
824   if (undobuf.other_insn)
825     {
826       int old_other_cost, new_other_cost;
827
828       old_other_cost = INSN_COST (undobuf.other_insn);
829       new_other_cost = insn_rtx_cost (newotherpat, optimize_this_for_speed_p);
830       if (old_other_cost > 0 && new_other_cost > 0)
831         {
832           old_cost += old_other_cost;
833           new_cost += new_other_cost;
834         }
835       else
836         old_cost = 0;
837     }
838
839   /* Disallow this recombination if both new_cost and old_cost are
840      greater than zero, and new_cost is greater than old cost.  */
841   if (old_cost > 0
842       && new_cost > old_cost)
843     {
844       if (dump_file)
845         {
846           if (i0)
847             {
848               fprintf (dump_file,
849                        "rejecting combination of insns %d, %d, %d and %d\n",
850                        INSN_UID (i0), INSN_UID (i1), INSN_UID (i2),
851                        INSN_UID (i3));
852               fprintf (dump_file, "original costs %d + %d + %d + %d = %d\n",
853                        i0_cost, i1_cost, i2_cost, i3_cost, old_cost);
854             }
855           else if (i1)
856             {
857               fprintf (dump_file,
858                        "rejecting combination of insns %d, %d and %d\n",
859                        INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
860               fprintf (dump_file, "original costs %d + %d + %d = %d\n",
861                        i1_cost, i2_cost, i3_cost, old_cost);
862             }
863           else
864             {
865               fprintf (dump_file,
866                        "rejecting combination of insns %d and %d\n",
867                        INSN_UID (i2), INSN_UID (i3));
868               fprintf (dump_file, "original costs %d + %d = %d\n",
869                        i2_cost, i3_cost, old_cost);
870             }
871
872           if (newi2pat)
873             {
874               fprintf (dump_file, "replacement costs %d + %d = %d\n",
875                        new_i2_cost, new_i3_cost, new_cost);
876             }
877           else
878             fprintf (dump_file, "replacement cost %d\n", new_cost);
879         }
880
881       return false;
882     }
883
884   /* Update the uid_insn_cost array with the replacement costs.  */
885   INSN_COST (i2) = new_i2_cost;
886   INSN_COST (i3) = new_i3_cost;
887   if (i1)
888     INSN_COST (i1) = 0;
889
890   return true;
891 }
892
893
894 /* Delete any insns that copy a register to itself.  */
895
896 static void
897 delete_noop_moves (void)
898 {
899   rtx insn, next;
900   basic_block bb;
901
902   FOR_EACH_BB (bb)
903     {
904       for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next)
905         {
906           next = NEXT_INSN (insn);
907           if (INSN_P (insn) && noop_move_p (insn))
908             {
909               if (dump_file)
910                 fprintf (dump_file, "deleting noop move %d\n", INSN_UID (insn));
911
912               delete_insn_and_edges (insn);
913             }
914         }
915     }
916 }
917
918 \f
919 /* Fill in log links field for all insns.  */
920
921 static void
922 create_log_links (void)
923 {
924   basic_block bb;
925   rtx *next_use, insn;
926   df_ref *def_vec, *use_vec;
927
928   next_use = XCNEWVEC (rtx, max_reg_num ());
929
930   /* Pass through each block from the end, recording the uses of each
931      register and establishing log links when def is encountered.
932      Note that we do not clear next_use array in order to save time,
933      so we have to test whether the use is in the same basic block as def.
934
935      There are a few cases below when we do not consider the definition or
936      usage -- these are taken from original flow.c did. Don't ask me why it is
937      done this way; I don't know and if it works, I don't want to know.  */
938
939   FOR_EACH_BB (bb)
940     {
941       FOR_BB_INSNS_REVERSE (bb, insn)
942         {
943           if (!NONDEBUG_INSN_P (insn))
944             continue;
945
946           /* Log links are created only once.  */
947           gcc_assert (!LOG_LINKS (insn));
948
949           for (def_vec = DF_INSN_DEFS (insn); *def_vec; def_vec++)
950             {
951               df_ref def = *def_vec;
952               int regno = DF_REF_REGNO (def);
953               rtx use_insn;
954
955               if (!next_use[regno])
956                 continue;
957
958               /* Do not consider if it is pre/post modification in MEM.  */
959               if (DF_REF_FLAGS (def) & DF_REF_PRE_POST_MODIFY)
960                 continue;
961
962               /* Do not make the log link for frame pointer.  */
963               if ((regno == FRAME_POINTER_REGNUM
964                    && (! reload_completed || frame_pointer_needed))
965 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
966                   || (regno == HARD_FRAME_POINTER_REGNUM
967                       && (! reload_completed || frame_pointer_needed))
968 #endif
969 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
970                   || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
971 #endif
972                   )
973                 continue;
974
975               use_insn = next_use[regno];
976               if (BLOCK_FOR_INSN (use_insn) == bb)
977                 {
978                   /* flow.c claimed:
979
980                      We don't build a LOG_LINK for hard registers contained
981                      in ASM_OPERANDs.  If these registers get replaced,
982                      we might wind up changing the semantics of the insn,
983                      even if reload can make what appear to be valid
984                      assignments later.  */
985                   if (regno >= FIRST_PSEUDO_REGISTER
986                       || asm_noperands (PATTERN (use_insn)) < 0)
987                     {
988                       /* Don't add duplicate links between instructions.  */
989                       rtx links;
990                       for (links = LOG_LINKS (use_insn); links;
991                            links = XEXP (links, 1))
992                         if (insn == XEXP (links, 0))
993                           break;
994
995                       if (!links)
996                         LOG_LINKS (use_insn) =
997                           alloc_INSN_LIST (insn, LOG_LINKS (use_insn));
998                     }
999                 }
1000               next_use[regno] = NULL_RTX;
1001             }
1002
1003           for (use_vec = DF_INSN_USES (insn); *use_vec; use_vec++)
1004             {
1005               df_ref use = *use_vec;
1006               int regno = DF_REF_REGNO (use);
1007
1008               /* Do not consider the usage of the stack pointer
1009                  by function call.  */
1010               if (DF_REF_FLAGS (use) & DF_REF_CALL_STACK_USAGE)
1011                 continue;
1012
1013               next_use[regno] = insn;
1014             }
1015         }
1016     }
1017
1018   free (next_use);
1019 }
1020
1021 /* Clear LOG_LINKS fields of insns.  */
1022
1023 static void
1024 clear_log_links (void)
1025 {
1026   rtx insn;
1027
1028   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1029     if (INSN_P (insn))
1030       free_INSN_LIST_list (&LOG_LINKS (insn));
1031 }
1032
1033 /* Walk the LOG_LINKS of insn B to see if we find a reference to A.  Return
1034    true if we found a LOG_LINK that proves that A feeds B.  This only works
1035    if there are no instructions between A and B which could have a link
1036    depending on A, since in that case we would not record a link for B.  */
1037
1038 static bool
1039 insn_a_feeds_b (rtx a, rtx b)
1040 {
1041   rtx links;
1042   for (links = LOG_LINKS (b); links; links = XEXP (links, 1))
1043     if (XEXP (links, 0) == a)
1044       return true;
1045   return false;
1046 }
1047 \f
1048 /* Main entry point for combiner.  F is the first insn of the function.
1049    NREGS is the first unused pseudo-reg number.
1050
1051    Return nonzero if the combiner has turned an indirect jump
1052    instruction into a direct jump.  */
1053 static int
1054 combine_instructions (rtx f, unsigned int nregs)
1055 {
1056   rtx insn, next;
1057 #ifdef HAVE_cc0
1058   rtx prev;
1059 #endif
1060   rtx links, nextlinks;
1061   rtx first;
1062   basic_block last_bb;
1063
1064   int new_direct_jump_p = 0;
1065
1066   for (first = f; first && !INSN_P (first); )
1067     first = NEXT_INSN (first);
1068   if (!first)
1069     return 0;
1070
1071   combine_attempts = 0;
1072   combine_merges = 0;
1073   combine_extras = 0;
1074   combine_successes = 0;
1075
1076   rtl_hooks = combine_rtl_hooks;
1077
1078   VEC_safe_grow_cleared (reg_stat_type, heap, reg_stat, nregs);
1079
1080   init_recog_no_volatile ();
1081
1082   /* Allocate array for insn info.  */
1083   max_uid_known = get_max_uid ();
1084   uid_log_links = XCNEWVEC (rtx, max_uid_known + 1);
1085   uid_insn_cost = XCNEWVEC (int, max_uid_known + 1);
1086
1087   nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
1088
1089   /* Don't use reg_stat[].nonzero_bits when computing it.  This can cause
1090      problems when, for example, we have j <<= 1 in a loop.  */
1091
1092   nonzero_sign_valid = 0;
1093   label_tick = label_tick_ebb_start = 1;
1094
1095   /* Scan all SETs and see if we can deduce anything about what
1096      bits are known to be zero for some registers and how many copies
1097      of the sign bit are known to exist for those registers.
1098
1099      Also set any known values so that we can use it while searching
1100      for what bits are known to be set.  */
1101
1102   setup_incoming_promotions (first);
1103   /* Allow the entry block and the first block to fall into the same EBB.
1104      Conceptually the incoming promotions are assigned to the entry block.  */
1105   last_bb = ENTRY_BLOCK_PTR;
1106
1107   create_log_links ();
1108   FOR_EACH_BB (this_basic_block)
1109     {
1110       optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1111       last_call_luid = 0;
1112       mem_last_set = -1;
1113
1114       label_tick++;
1115       if (!single_pred_p (this_basic_block)
1116           || single_pred (this_basic_block) != last_bb)
1117         label_tick_ebb_start = label_tick;
1118       last_bb = this_basic_block;
1119
1120       FOR_BB_INSNS (this_basic_block, insn)
1121         if (INSN_P (insn) && BLOCK_FOR_INSN (insn))
1122           {
1123             subst_low_luid = DF_INSN_LUID (insn);
1124             subst_insn = insn;
1125
1126             note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
1127                          insn);
1128             record_dead_and_set_regs (insn);
1129
1130 #ifdef AUTO_INC_DEC
1131             for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
1132               if (REG_NOTE_KIND (links) == REG_INC)
1133                 set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
1134                                                   insn);
1135 #endif
1136
1137             /* Record the current insn_rtx_cost of this instruction.  */
1138             if (NONJUMP_INSN_P (insn))
1139               INSN_COST (insn) = insn_rtx_cost (PATTERN (insn),
1140                                                 optimize_this_for_speed_p);
1141             if (dump_file)
1142               fprintf(dump_file, "insn_cost %d: %d\n",
1143                     INSN_UID (insn), INSN_COST (insn));
1144           }
1145     }
1146
1147   nonzero_sign_valid = 1;
1148
1149   /* Now scan all the insns in forward order.  */
1150   label_tick = label_tick_ebb_start = 1;
1151   init_reg_last ();
1152   setup_incoming_promotions (first);
1153   last_bb = ENTRY_BLOCK_PTR;
1154
1155   FOR_EACH_BB (this_basic_block)
1156     {
1157       optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1158       last_call_luid = 0;
1159       mem_last_set = -1;
1160
1161       label_tick++;
1162       if (!single_pred_p (this_basic_block)
1163           || single_pred (this_basic_block) != last_bb)
1164         label_tick_ebb_start = label_tick;
1165       last_bb = this_basic_block;
1166
1167       rtl_profile_for_bb (this_basic_block);
1168       for (insn = BB_HEAD (this_basic_block);
1169            insn != NEXT_INSN (BB_END (this_basic_block));
1170            insn = next ? next : NEXT_INSN (insn))
1171         {
1172           next = 0;
1173           if (NONDEBUG_INSN_P (insn))
1174             {
1175               /* See if we know about function return values before this
1176                  insn based upon SUBREG flags.  */
1177               check_promoted_subreg (insn, PATTERN (insn));
1178
1179               /* See if we can find hardregs and subreg of pseudos in
1180                  narrower modes.  This could help turning TRUNCATEs
1181                  into SUBREGs.  */
1182               note_uses (&PATTERN (insn), record_truncated_values, NULL);
1183
1184               /* Try this insn with each insn it links back to.  */
1185
1186               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1187                 if ((next = try_combine (insn, XEXP (links, 0), NULL_RTX,
1188                                          NULL_RTX, &new_direct_jump_p)) != 0)
1189                   goto retry;
1190
1191               /* Try each sequence of three linked insns ending with this one.  */
1192
1193               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1194                 {
1195                   rtx link = XEXP (links, 0);
1196
1197                   /* If the linked insn has been replaced by a note, then there
1198                      is no point in pursuing this chain any further.  */
1199                   if (NOTE_P (link))
1200                     continue;
1201
1202                   for (nextlinks = LOG_LINKS (link);
1203                        nextlinks;
1204                        nextlinks = XEXP (nextlinks, 1))
1205                     if ((next = try_combine (insn, link, XEXP (nextlinks, 0),
1206                                              NULL_RTX,
1207                                              &new_direct_jump_p)) != 0)
1208                       goto retry;
1209                 }
1210
1211 #ifdef HAVE_cc0
1212               /* Try to combine a jump insn that uses CC0
1213                  with a preceding insn that sets CC0, and maybe with its
1214                  logical predecessor as well.
1215                  This is how we make decrement-and-branch insns.
1216                  We need this special code because data flow connections
1217                  via CC0 do not get entered in LOG_LINKS.  */
1218
1219               if (JUMP_P (insn)
1220                   && (prev = prev_nonnote_insn (insn)) != 0
1221                   && NONJUMP_INSN_P (prev)
1222                   && sets_cc0_p (PATTERN (prev)))
1223                 {
1224                   if ((next = try_combine (insn, prev, NULL_RTX, NULL_RTX,
1225                                            &new_direct_jump_p)) != 0)
1226                     goto retry;
1227
1228                   for (nextlinks = LOG_LINKS (prev); nextlinks;
1229                        nextlinks = XEXP (nextlinks, 1))
1230                     if ((next = try_combine (insn, prev, XEXP (nextlinks, 0),
1231                                              NULL_RTX,
1232                                              &new_direct_jump_p)) != 0)
1233                       goto retry;
1234                 }
1235
1236               /* Do the same for an insn that explicitly references CC0.  */
1237               if (NONJUMP_INSN_P (insn)
1238                   && (prev = prev_nonnote_insn (insn)) != 0
1239                   && NONJUMP_INSN_P (prev)
1240                   && sets_cc0_p (PATTERN (prev))
1241                   && GET_CODE (PATTERN (insn)) == SET
1242                   && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
1243                 {
1244                   if ((next = try_combine (insn, prev, NULL_RTX, NULL_RTX,
1245                                            &new_direct_jump_p)) != 0)
1246                     goto retry;
1247
1248                   for (nextlinks = LOG_LINKS (prev); nextlinks;
1249                        nextlinks = XEXP (nextlinks, 1))
1250                     if ((next = try_combine (insn, prev, XEXP (nextlinks, 0),
1251                                              NULL_RTX,
1252                                              &new_direct_jump_p)) != 0)
1253                       goto retry;
1254                 }
1255
1256               /* Finally, see if any of the insns that this insn links to
1257                  explicitly references CC0.  If so, try this insn, that insn,
1258                  and its predecessor if it sets CC0.  */
1259               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1260                 if (NONJUMP_INSN_P (XEXP (links, 0))
1261                     && GET_CODE (PATTERN (XEXP (links, 0))) == SET
1262                     && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
1263                     && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
1264                     && NONJUMP_INSN_P (prev)
1265                     && sets_cc0_p (PATTERN (prev))
1266                     && (next = try_combine (insn, XEXP (links, 0),
1267                                             prev, NULL_RTX,
1268                                             &new_direct_jump_p)) != 0)
1269                   goto retry;
1270 #endif
1271
1272               /* Try combining an insn with two different insns whose results it
1273                  uses.  */
1274               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1275                 for (nextlinks = XEXP (links, 1); nextlinks;
1276                      nextlinks = XEXP (nextlinks, 1))
1277                   if ((next = try_combine (insn, XEXP (links, 0),
1278                                            XEXP (nextlinks, 0), NULL_RTX,
1279                                            &new_direct_jump_p)) != 0)
1280                     goto retry;
1281
1282               /* Try four-instruction combinations.  */
1283               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1284                 {
1285                   rtx next1;
1286                   rtx link = XEXP (links, 0);
1287
1288                   /* If the linked insn has been replaced by a note, then there
1289                      is no point in pursuing this chain any further.  */
1290                   if (NOTE_P (link))
1291                     continue;
1292
1293                   for (next1 = LOG_LINKS (link); next1; next1 = XEXP (next1, 1))
1294                     {
1295                       rtx link1 = XEXP (next1, 0);
1296                       if (NOTE_P (link1))
1297                         continue;
1298                       /* I0 -> I1 -> I2 -> I3.  */
1299                       for (nextlinks = LOG_LINKS (link1); nextlinks;
1300                            nextlinks = XEXP (nextlinks, 1))
1301                         if ((next = try_combine (insn, link, link1,
1302                                                  XEXP (nextlinks, 0),
1303                                                  &new_direct_jump_p)) != 0)
1304                           goto retry;
1305                       /* I0, I1 -> I2, I2 -> I3.  */
1306                       for (nextlinks = XEXP (next1, 1); nextlinks;
1307                            nextlinks = XEXP (nextlinks, 1))
1308                         if ((next = try_combine (insn, link, link1,
1309                                                  XEXP (nextlinks, 0),
1310                                                  &new_direct_jump_p)) != 0)
1311                           goto retry;
1312                     }
1313
1314                   for (next1 = XEXP (links, 1); next1; next1 = XEXP (next1, 1))
1315                     {
1316                       rtx link1 = XEXP (next1, 0);
1317                       if (NOTE_P (link1))
1318                         continue;
1319                       /* I0 -> I2; I1, I2 -> I3.  */
1320                       for (nextlinks = LOG_LINKS (link); nextlinks;
1321                            nextlinks = XEXP (nextlinks, 1))
1322                         if ((next = try_combine (insn, link, link1,
1323                                                  XEXP (nextlinks, 0),
1324                                                  &new_direct_jump_p)) != 0)
1325                           goto retry;
1326                       /* I0 -> I1; I1, I2 -> I3.  */
1327                       for (nextlinks = LOG_LINKS (link1); nextlinks;
1328                            nextlinks = XEXP (nextlinks, 1))
1329                         if ((next = try_combine (insn, link, link1,
1330                                                  XEXP (nextlinks, 0),
1331                                                  &new_direct_jump_p)) != 0)
1332                           goto retry;
1333                     }
1334                 }
1335
1336               /* Try this insn with each REG_EQUAL note it links back to.  */
1337               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1338                 {
1339                   rtx set, note;
1340                   rtx temp = XEXP (links, 0);
1341                   if ((set = single_set (temp)) != 0
1342                       && (note = find_reg_equal_equiv_note (temp)) != 0
1343                       && (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST
1344                       /* Avoid using a register that may already been marked
1345                          dead by an earlier instruction.  */
1346                       && ! unmentioned_reg_p (note, SET_SRC (set))
1347                       && (GET_MODE (note) == VOIDmode
1348                           ? SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set)))
1349                           : GET_MODE (SET_DEST (set)) == GET_MODE (note)))
1350                     {
1351                       /* Temporarily replace the set's source with the
1352                          contents of the REG_EQUAL note.  The insn will
1353                          be deleted or recognized by try_combine.  */
1354                       rtx orig = SET_SRC (set);
1355                       SET_SRC (set) = note;
1356                       i2mod = temp;
1357                       i2mod_old_rhs = copy_rtx (orig);
1358                       i2mod_new_rhs = copy_rtx (note);
1359                       next = try_combine (insn, i2mod, NULL_RTX, NULL_RTX,
1360                                           &new_direct_jump_p);
1361                       i2mod = NULL_RTX;
1362                       if (next)
1363                         goto retry;
1364                       SET_SRC (set) = orig;
1365                     }
1366                 }
1367
1368               if (!NOTE_P (insn))
1369                 record_dead_and_set_regs (insn);
1370
1371             retry:
1372               ;
1373             }
1374         }
1375     }
1376
1377   default_rtl_profile ();
1378   clear_log_links ();
1379   clear_bb_flags ();
1380   new_direct_jump_p |= purge_all_dead_edges ();
1381   delete_noop_moves ();
1382
1383   /* Clean up.  */
1384   free (uid_log_links);
1385   free (uid_insn_cost);
1386   VEC_free (reg_stat_type, heap, reg_stat);
1387
1388   {
1389     struct undo *undo, *next;
1390     for (undo = undobuf.frees; undo; undo = next)
1391       {
1392         next = undo->next;
1393         free (undo);
1394       }
1395     undobuf.frees = 0;
1396   }
1397
1398   total_attempts += combine_attempts;
1399   total_merges += combine_merges;
1400   total_extras += combine_extras;
1401   total_successes += combine_successes;
1402
1403   nonzero_sign_valid = 0;
1404   rtl_hooks = general_rtl_hooks;
1405
1406   /* Make recognizer allow volatile MEMs again.  */
1407   init_recog ();
1408
1409   return new_direct_jump_p;
1410 }
1411
1412 /* Wipe the last_xxx fields of reg_stat in preparation for another pass.  */
1413
1414 static void
1415 init_reg_last (void)
1416 {
1417   unsigned int i;
1418   reg_stat_type *p;
1419
1420   FOR_EACH_VEC_ELT (reg_stat_type, reg_stat, i, p)
1421     memset (p, 0, offsetof (reg_stat_type, sign_bit_copies));
1422 }
1423 \f
1424 /* Set up any promoted values for incoming argument registers.  */
1425
1426 static void
1427 setup_incoming_promotions (rtx first)
1428 {
1429   tree arg;
1430   bool strictly_local = false;
1431
1432   for (arg = DECL_ARGUMENTS (current_function_decl); arg;
1433        arg = DECL_CHAIN (arg))
1434     {
1435       rtx x, reg = DECL_INCOMING_RTL (arg);
1436       int uns1, uns3;
1437       enum machine_mode mode1, mode2, mode3, mode4;
1438
1439       /* Only continue if the incoming argument is in a register.  */
1440       if (!REG_P (reg))
1441         continue;
1442
1443       /* Determine, if possible, whether all call sites of the current
1444          function lie within the current compilation unit.  (This does
1445          take into account the exporting of a function via taking its
1446          address, and so forth.)  */
1447       strictly_local = cgraph_local_info (current_function_decl)->local;
1448
1449       /* The mode and signedness of the argument before any promotions happen
1450          (equal to the mode of the pseudo holding it at that stage).  */
1451       mode1 = TYPE_MODE (TREE_TYPE (arg));
1452       uns1 = TYPE_UNSIGNED (TREE_TYPE (arg));
1453
1454       /* The mode and signedness of the argument after any source language and
1455          TARGET_PROMOTE_PROTOTYPES-driven promotions.  */
1456       mode2 = TYPE_MODE (DECL_ARG_TYPE (arg));
1457       uns3 = TYPE_UNSIGNED (DECL_ARG_TYPE (arg));
1458
1459       /* The mode and signedness of the argument as it is actually passed,
1460          after any TARGET_PROMOTE_FUNCTION_ARGS-driven ABI promotions.  */
1461       mode3 = promote_function_mode (DECL_ARG_TYPE (arg), mode2, &uns3,
1462                                      TREE_TYPE (cfun->decl), 0);
1463
1464       /* The mode of the register in which the argument is being passed.  */
1465       mode4 = GET_MODE (reg);
1466
1467       /* Eliminate sign extensions in the callee when:
1468          (a) A mode promotion has occurred;  */
1469       if (mode1 == mode3)
1470         continue;
1471       /* (b) The mode of the register is the same as the mode of
1472              the argument as it is passed; */
1473       if (mode3 != mode4)
1474         continue;
1475       /* (c) There's no language level extension;  */
1476       if (mode1 == mode2)
1477         ;
1478       /* (c.1) All callers are from the current compilation unit.  If that's
1479          the case we don't have to rely on an ABI, we only have to know
1480          what we're generating right now, and we know that we will do the
1481          mode1 to mode2 promotion with the given sign.  */
1482       else if (!strictly_local)
1483         continue;
1484       /* (c.2) The combination of the two promotions is useful.  This is
1485          true when the signs match, or if the first promotion is unsigned.
1486          In the later case, (sign_extend (zero_extend x)) is the same as
1487          (zero_extend (zero_extend x)), so make sure to force UNS3 true.  */
1488       else if (uns1)
1489         uns3 = true;
1490       else if (uns3)
1491         continue;
1492
1493       /* Record that the value was promoted from mode1 to mode3,
1494          so that any sign extension at the head of the current
1495          function may be eliminated.  */
1496       x = gen_rtx_CLOBBER (mode1, const0_rtx);
1497       x = gen_rtx_fmt_e ((uns3 ? ZERO_EXTEND : SIGN_EXTEND), mode3, x);
1498       record_value_for_reg (reg, first, x);
1499     }
1500 }
1501
1502 /* Called via note_stores.  If X is a pseudo that is narrower than
1503    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
1504
1505    If we are setting only a portion of X and we can't figure out what
1506    portion, assume all bits will be used since we don't know what will
1507    be happening.
1508
1509    Similarly, set how many bits of X are known to be copies of the sign bit
1510    at all locations in the function.  This is the smallest number implied
1511    by any set of X.  */
1512
1513 static void
1514 set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
1515 {
1516   rtx insn = (rtx) data;
1517   unsigned int num;
1518
1519   if (REG_P (x)
1520       && REGNO (x) >= FIRST_PSEUDO_REGISTER
1521       /* If this register is undefined at the start of the file, we can't
1522          say what its contents were.  */
1523       && ! REGNO_REG_SET_P
1524            (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x))
1525       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
1526     {
1527       reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
1528
1529       if (set == 0 || GET_CODE (set) == CLOBBER)
1530         {
1531           rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1532           rsp->sign_bit_copies = 1;
1533           return;
1534         }
1535
1536       /* If this register is being initialized using itself, and the
1537          register is uninitialized in this basic block, and there are
1538          no LOG_LINKS which set the register, then part of the
1539          register is uninitialized.  In that case we can't assume
1540          anything about the number of nonzero bits.
1541
1542          ??? We could do better if we checked this in
1543          reg_{nonzero_bits,num_sign_bit_copies}_for_combine.  Then we
1544          could avoid making assumptions about the insn which initially
1545          sets the register, while still using the information in other
1546          insns.  We would have to be careful to check every insn
1547          involved in the combination.  */
1548
1549       if (insn
1550           && reg_referenced_p (x, PATTERN (insn))
1551           && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)),
1552                                REGNO (x)))
1553         {
1554           rtx link;
1555
1556           for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
1557             {
1558               if (dead_or_set_p (XEXP (link, 0), x))
1559                 break;
1560             }
1561           if (!link)
1562             {
1563               rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1564               rsp->sign_bit_copies = 1;
1565               return;
1566             }
1567         }
1568
1569       /* If this is a complex assignment, see if we can convert it into a
1570          simple assignment.  */
1571       set = expand_field_assignment (set);
1572
1573       /* If this is a simple assignment, or we have a paradoxical SUBREG,
1574          set what we know about X.  */
1575
1576       if (SET_DEST (set) == x
1577           || (GET_CODE (SET_DEST (set)) == SUBREG
1578               && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
1579                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
1580               && SUBREG_REG (SET_DEST (set)) == x))
1581         {
1582           rtx src = SET_SRC (set);
1583
1584 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
1585           /* If X is narrower than a word and SRC is a non-negative
1586              constant that would appear negative in the mode of X,
1587              sign-extend it for use in reg_stat[].nonzero_bits because some
1588              machines (maybe most) will actually do the sign-extension
1589              and this is the conservative approach.
1590
1591              ??? For 2.5, try to tighten up the MD files in this regard
1592              instead of this kludge.  */
1593
1594           if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
1595               && CONST_INT_P (src)
1596               && INTVAL (src) > 0
1597               && 0 != (UINTVAL (src)
1598                        & ((unsigned HOST_WIDE_INT) 1
1599                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
1600             src = GEN_INT (UINTVAL (src)
1601                            | ((unsigned HOST_WIDE_INT) (-1)
1602                               << GET_MODE_BITSIZE (GET_MODE (x))));
1603 #endif
1604
1605           /* Don't call nonzero_bits if it cannot change anything.  */
1606           if (rsp->nonzero_bits != ~(unsigned HOST_WIDE_INT) 0)
1607             rsp->nonzero_bits |= nonzero_bits (src, nonzero_bits_mode);
1608           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1609           if (rsp->sign_bit_copies == 0
1610               || rsp->sign_bit_copies > num)
1611             rsp->sign_bit_copies = num;
1612         }
1613       else
1614         {
1615           rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1616           rsp->sign_bit_copies = 1;
1617         }
1618     }
1619 }
1620 \f
1621 /* See if INSN can be combined into I3.  PRED, PRED2, SUCC and SUCC2 are
1622    optionally insns that were previously combined into I3 or that will be
1623    combined into the merger of INSN and I3.  The order is PRED, PRED2,
1624    INSN, SUCC, SUCC2, I3.
1625
1626    Return 0 if the combination is not allowed for any reason.
1627
1628    If the combination is allowed, *PDEST will be set to the single
1629    destination of INSN and *PSRC to the single source, and this function
1630    will return 1.  */
1631
1632 static int
1633 can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED,
1634                rtx pred2 ATTRIBUTE_UNUSED, rtx succ, rtx succ2,
1635                rtx *pdest, rtx *psrc)
1636 {
1637   int i;
1638   const_rtx set = 0;
1639   rtx src, dest;
1640   rtx p;
1641 #ifdef AUTO_INC_DEC
1642   rtx link;
1643 #endif
1644   bool all_adjacent = true;
1645
1646   if (succ)
1647     {
1648       if (succ2)
1649         {
1650           if (next_active_insn (succ2) != i3)
1651             all_adjacent = false;
1652           if (next_active_insn (succ) != succ2)
1653             all_adjacent = false;
1654         }
1655       else if (next_active_insn (succ) != i3)
1656         all_adjacent = false;
1657       if (next_active_insn (insn) != succ)
1658         all_adjacent = false;
1659     }
1660   else if (next_active_insn (insn) != i3)
1661     all_adjacent = false;
1662     
1663   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1664      or a PARALLEL consisting of such a SET and CLOBBERs.
1665
1666      If INSN has CLOBBER parallel parts, ignore them for our processing.
1667      By definition, these happen during the execution of the insn.  When it
1668      is merged with another insn, all bets are off.  If they are, in fact,
1669      needed and aren't also supplied in I3, they may be added by
1670      recog_for_combine.  Otherwise, it won't match.
1671
1672      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1673      note.
1674
1675      Get the source and destination of INSN.  If more than one, can't
1676      combine.  */
1677
1678   if (GET_CODE (PATTERN (insn)) == SET)
1679     set = PATTERN (insn);
1680   else if (GET_CODE (PATTERN (insn)) == PARALLEL
1681            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1682     {
1683       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1684         {
1685           rtx elt = XVECEXP (PATTERN (insn), 0, i);
1686
1687           switch (GET_CODE (elt))
1688             {
1689             /* This is important to combine floating point insns
1690                for the SH4 port.  */
1691             case USE:
1692               /* Combining an isolated USE doesn't make sense.
1693                  We depend here on combinable_i3pat to reject them.  */
1694               /* The code below this loop only verifies that the inputs of
1695                  the SET in INSN do not change.  We call reg_set_between_p
1696                  to verify that the REG in the USE does not change between
1697                  I3 and INSN.
1698                  If the USE in INSN was for a pseudo register, the matching
1699                  insn pattern will likely match any register; combining this
1700                  with any other USE would only be safe if we knew that the
1701                  used registers have identical values, or if there was
1702                  something to tell them apart, e.g. different modes.  For
1703                  now, we forgo such complicated tests and simply disallow
1704                  combining of USES of pseudo registers with any other USE.  */
1705               if (REG_P (XEXP (elt, 0))
1706                   && GET_CODE (PATTERN (i3)) == PARALLEL)
1707                 {
1708                   rtx i3pat = PATTERN (i3);
1709                   int i = XVECLEN (i3pat, 0) - 1;
1710                   unsigned int regno = REGNO (XEXP (elt, 0));
1711
1712                   do
1713                     {
1714                       rtx i3elt = XVECEXP (i3pat, 0, i);
1715
1716                       if (GET_CODE (i3elt) == USE
1717                           && REG_P (XEXP (i3elt, 0))
1718                           && (REGNO (XEXP (i3elt, 0)) == regno
1719                               ? reg_set_between_p (XEXP (elt, 0),
1720                                                    PREV_INSN (insn), i3)
1721                               : regno >= FIRST_PSEUDO_REGISTER))
1722                         return 0;
1723                     }
1724                   while (--i >= 0);
1725                 }
1726               break;
1727
1728               /* We can ignore CLOBBERs.  */
1729             case CLOBBER:
1730               break;
1731
1732             case SET:
1733               /* Ignore SETs whose result isn't used but not those that
1734                  have side-effects.  */
1735               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1736                   && insn_nothrow_p (insn)
1737                   && !side_effects_p (elt))
1738                 break;
1739
1740               /* If we have already found a SET, this is a second one and
1741                  so we cannot combine with this insn.  */
1742               if (set)
1743                 return 0;
1744
1745               set = elt;
1746               break;
1747
1748             default:
1749               /* Anything else means we can't combine.  */
1750               return 0;
1751             }
1752         }
1753
1754       if (set == 0
1755           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1756              so don't do anything with it.  */
1757           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1758         return 0;
1759     }
1760   else
1761     return 0;
1762
1763   if (set == 0)
1764     return 0;
1765
1766   set = expand_field_assignment (set);
1767   src = SET_SRC (set), dest = SET_DEST (set);
1768
1769   /* Don't eliminate a store in the stack pointer.  */
1770   if (dest == stack_pointer_rtx
1771       /* Don't combine with an insn that sets a register to itself if it has
1772          a REG_EQUAL note.  This may be part of a LIBCALL sequence.  */
1773       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1774       /* Can't merge an ASM_OPERANDS.  */
1775       || GET_CODE (src) == ASM_OPERANDS
1776       /* Can't merge a function call.  */
1777       || GET_CODE (src) == CALL
1778       /* Don't eliminate a function call argument.  */
1779       || (CALL_P (i3)
1780           && (find_reg_fusage (i3, USE, dest)
1781               || (REG_P (dest)
1782                   && REGNO (dest) < FIRST_PSEUDO_REGISTER
1783                   && global_regs[REGNO (dest)])))
1784       /* Don't substitute into an incremented register.  */
1785       || FIND_REG_INC_NOTE (i3, dest)
1786       || (succ && FIND_REG_INC_NOTE (succ, dest))
1787       || (succ2 && FIND_REG_INC_NOTE (succ2, dest))
1788       /* Don't substitute into a non-local goto, this confuses CFG.  */
1789       || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1790       /* Make sure that DEST is not used after SUCC but before I3.  */
1791       || (!all_adjacent
1792           && ((succ2
1793                && (reg_used_between_p (dest, succ2, i3)
1794                    || reg_used_between_p (dest, succ, succ2)))
1795               || (!succ2 && succ && reg_used_between_p (dest, succ, i3))))
1796       /* Make sure that the value that is to be substituted for the register
1797          does not use any registers whose values alter in between.  However,
1798          If the insns are adjacent, a use can't cross a set even though we
1799          think it might (this can happen for a sequence of insns each setting
1800          the same destination; last_set of that register might point to
1801          a NOTE).  If INSN has a REG_EQUIV note, the register is always
1802          equivalent to the memory so the substitution is valid even if there
1803          are intervening stores.  Also, don't move a volatile asm or
1804          UNSPEC_VOLATILE across any other insns.  */
1805       || (! all_adjacent
1806           && (((!MEM_P (src)
1807                 || ! find_reg_note (insn, REG_EQUIV, src))
1808                && use_crosses_set_p (src, DF_INSN_LUID (insn)))
1809               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1810               || GET_CODE (src) == UNSPEC_VOLATILE))
1811       /* Don't combine across a CALL_INSN, because that would possibly
1812          change whether the life span of some REGs crosses calls or not,
1813          and it is a pain to update that information.
1814          Exception: if source is a constant, moving it later can't hurt.
1815          Accept that as a special case.  */
1816       || (DF_INSN_LUID (insn) < last_call_luid && ! CONSTANT_P (src)))
1817     return 0;
1818
1819   /* DEST must either be a REG or CC0.  */
1820   if (REG_P (dest))
1821     {
1822       /* If register alignment is being enforced for multi-word items in all
1823          cases except for parameters, it is possible to have a register copy
1824          insn referencing a hard register that is not allowed to contain the
1825          mode being copied and which would not be valid as an operand of most
1826          insns.  Eliminate this problem by not combining with such an insn.
1827
1828          Also, on some machines we don't want to extend the life of a hard
1829          register.  */
1830
1831       if (REG_P (src)
1832           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1833                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1834               /* Don't extend the life of a hard register unless it is
1835                  user variable (if we have few registers) or it can't
1836                  fit into the desired register (meaning something special
1837                  is going on).
1838                  Also avoid substituting a return register into I3, because
1839                  reload can't handle a conflict with constraints of other
1840                  inputs.  */
1841               || (REGNO (src) < FIRST_PSEUDO_REGISTER
1842                   && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1843         return 0;
1844     }
1845   else if (GET_CODE (dest) != CC0)
1846     return 0;
1847
1848
1849   if (GET_CODE (PATTERN (i3)) == PARALLEL)
1850     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1851       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
1852         {
1853           /* Don't substitute for a register intended as a clobberable
1854              operand.  */
1855           rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
1856           if (rtx_equal_p (reg, dest))
1857             return 0;
1858
1859           /* If the clobber represents an earlyclobber operand, we must not
1860              substitute an expression containing the clobbered register.
1861              As we do not analyze the constraint strings here, we have to
1862              make the conservative assumption.  However, if the register is
1863              a fixed hard reg, the clobber cannot represent any operand;
1864              we leave it up to the machine description to either accept or
1865              reject use-and-clobber patterns.  */
1866           if (!REG_P (reg)
1867               || REGNO (reg) >= FIRST_PSEUDO_REGISTER
1868               || !fixed_regs[REGNO (reg)])
1869             if (reg_overlap_mentioned_p (reg, src))
1870               return 0;
1871         }
1872
1873   /* If INSN contains anything volatile, or is an `asm' (whether volatile
1874      or not), reject, unless nothing volatile comes between it and I3 */
1875
1876   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1877     {
1878       /* Make sure neither succ nor succ2 contains a volatile reference.  */
1879       if (succ2 != 0 && volatile_refs_p (PATTERN (succ2)))
1880         return 0;
1881       if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1882         return 0;
1883       /* We'll check insns between INSN and I3 below.  */
1884     }
1885
1886   /* If INSN is an asm, and DEST is a hard register, reject, since it has
1887      to be an explicit register variable, and was chosen for a reason.  */
1888
1889   if (GET_CODE (src) == ASM_OPERANDS
1890       && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1891     return 0;
1892
1893   /* If there are any volatile insns between INSN and I3, reject, because
1894      they might affect machine state.  */
1895
1896   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1897     if (INSN_P (p) && p != succ && p != succ2 && volatile_insn_p (PATTERN (p)))
1898       return 0;
1899
1900   /* If INSN contains an autoincrement or autodecrement, make sure that
1901      register is not used between there and I3, and not already used in
1902      I3 either.  Neither must it be used in PRED or SUCC, if they exist.
1903      Also insist that I3 not be a jump; if it were one
1904      and the incremented register were spilled, we would lose.  */
1905
1906 #ifdef AUTO_INC_DEC
1907   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1908     if (REG_NOTE_KIND (link) == REG_INC
1909         && (JUMP_P (i3)
1910             || reg_used_between_p (XEXP (link, 0), insn, i3)
1911             || (pred != NULL_RTX
1912                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
1913             || (pred2 != NULL_RTX
1914                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred2)))
1915             || (succ != NULL_RTX
1916                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
1917             || (succ2 != NULL_RTX
1918                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ2)))
1919             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1920       return 0;
1921 #endif
1922
1923 #ifdef HAVE_cc0
1924   /* Don't combine an insn that follows a CC0-setting insn.
1925      An insn that uses CC0 must not be separated from the one that sets it.
1926      We do, however, allow I2 to follow a CC0-setting insn if that insn
1927      is passed as I1; in that case it will be deleted also.
1928      We also allow combining in this case if all the insns are adjacent
1929      because that would leave the two CC0 insns adjacent as well.
1930      It would be more logical to test whether CC0 occurs inside I1 or I2,
1931      but that would be much slower, and this ought to be equivalent.  */
1932
1933   p = prev_nonnote_insn (insn);
1934   if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
1935       && ! all_adjacent)
1936     return 0;
1937 #endif
1938
1939   /* If we get here, we have passed all the tests and the combination is
1940      to be allowed.  */
1941
1942   *pdest = dest;
1943   *psrc = src;
1944
1945   return 1;
1946 }
1947 \f
1948 /* LOC is the location within I3 that contains its pattern or the component
1949    of a PARALLEL of the pattern.  We validate that it is valid for combining.
1950
1951    One problem is if I3 modifies its output, as opposed to replacing it
1952    entirely, we can't allow the output to contain I2DEST, I1DEST or I0DEST as
1953    doing so would produce an insn that is not equivalent to the original insns.
1954
1955    Consider:
1956
1957          (set (reg:DI 101) (reg:DI 100))
1958          (set (subreg:SI (reg:DI 101) 0) <foo>)
1959
1960    This is NOT equivalent to:
1961
1962          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1963                     (set (reg:DI 101) (reg:DI 100))])
1964
1965    Not only does this modify 100 (in which case it might still be valid
1966    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
1967
1968    We can also run into a problem if I2 sets a register that I1
1969    uses and I1 gets directly substituted into I3 (not via I2).  In that
1970    case, we would be getting the wrong value of I2DEST into I3, so we
1971    must reject the combination.  This case occurs when I2 and I1 both
1972    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1973    If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
1974    of a SET must prevent combination from occurring.  The same situation
1975    can occur for I0, in which case I0_NOT_IN_SRC is set.
1976
1977    Before doing the above check, we first try to expand a field assignment
1978    into a set of logical operations.
1979
1980    If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
1981    we place a register that is both set and used within I3.  If more than one
1982    such register is detected, we fail.
1983
1984    Return 1 if the combination is valid, zero otherwise.  */
1985
1986 static int
1987 combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest, rtx i0dest,
1988                   int i1_not_in_src, int i0_not_in_src, rtx *pi3dest_killed)
1989 {
1990   rtx x = *loc;
1991
1992   if (GET_CODE (x) == SET)
1993     {
1994       rtx set = x ;
1995       rtx dest = SET_DEST (set);
1996       rtx src = SET_SRC (set);
1997       rtx inner_dest = dest;
1998       rtx subdest;
1999
2000       while (GET_CODE (inner_dest) == STRICT_LOW_PART
2001              || GET_CODE (inner_dest) == SUBREG
2002              || GET_CODE (inner_dest) == ZERO_EXTRACT)
2003         inner_dest = XEXP (inner_dest, 0);
2004
2005       /* Check for the case where I3 modifies its output, as discussed
2006          above.  We don't want to prevent pseudos from being combined
2007          into the address of a MEM, so only prevent the combination if
2008          i1 or i2 set the same MEM.  */
2009       if ((inner_dest != dest &&
2010            (!MEM_P (inner_dest)
2011             || rtx_equal_p (i2dest, inner_dest)
2012             || (i1dest && rtx_equal_p (i1dest, inner_dest))
2013             || (i0dest && rtx_equal_p (i0dest, inner_dest)))
2014            && (reg_overlap_mentioned_p (i2dest, inner_dest)
2015                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))
2016                || (i0dest && reg_overlap_mentioned_p (i0dest, inner_dest))))
2017
2018           /* This is the same test done in can_combine_p except we can't test
2019              all_adjacent; we don't have to, since this instruction will stay
2020              in place, thus we are not considering increasing the lifetime of
2021              INNER_DEST.
2022
2023              Also, if this insn sets a function argument, combining it with
2024              something that might need a spill could clobber a previous
2025              function argument; the all_adjacent test in can_combine_p also
2026              checks this; here, we do a more specific test for this case.  */
2027
2028           || (REG_P (inner_dest)
2029               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
2030               && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
2031                                         GET_MODE (inner_dest))))
2032           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src))
2033           || (i0_not_in_src && reg_overlap_mentioned_p (i0dest, src)))
2034         return 0;
2035
2036       /* If DEST is used in I3, it is being killed in this insn, so
2037          record that for later.  We have to consider paradoxical
2038          subregs here, since they kill the whole register, but we
2039          ignore partial subregs, STRICT_LOW_PART, etc.
2040          Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
2041          STACK_POINTER_REGNUM, since these are always considered to be
2042          live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
2043       subdest = dest;
2044       if (GET_CODE (subdest) == SUBREG
2045           && (GET_MODE_SIZE (GET_MODE (subdest))
2046               >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (subdest)))))
2047         subdest = SUBREG_REG (subdest);
2048       if (pi3dest_killed
2049           && REG_P (subdest)
2050           && reg_referenced_p (subdest, PATTERN (i3))
2051           && REGNO (subdest) != FRAME_POINTER_REGNUM
2052 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
2053           && REGNO (subdest) != HARD_FRAME_POINTER_REGNUM
2054 #endif
2055 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
2056           && (REGNO (subdest) != ARG_POINTER_REGNUM
2057               || ! fixed_regs [REGNO (subdest)])
2058 #endif
2059           && REGNO (subdest) != STACK_POINTER_REGNUM)
2060         {
2061           if (*pi3dest_killed)
2062             return 0;
2063
2064           *pi3dest_killed = subdest;
2065         }
2066     }
2067
2068   else if (GET_CODE (x) == PARALLEL)
2069     {
2070       int i;
2071
2072       for (i = 0; i < XVECLEN (x, 0); i++)
2073         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest, i0dest,
2074                                 i1_not_in_src, i0_not_in_src, pi3dest_killed))
2075           return 0;
2076     }
2077
2078   return 1;
2079 }
2080 \f
2081 /* Return 1 if X is an arithmetic expression that contains a multiplication
2082    and division.  We don't count multiplications by powers of two here.  */
2083
2084 static int
2085 contains_muldiv (rtx x)
2086 {
2087   switch (GET_CODE (x))
2088     {
2089     case MOD:  case DIV:  case UMOD:  case UDIV:
2090       return 1;
2091
2092     case MULT:
2093       return ! (CONST_INT_P (XEXP (x, 1))
2094                 && exact_log2 (UINTVAL (XEXP (x, 1))) >= 0);
2095     default:
2096       if (BINARY_P (x))
2097         return contains_muldiv (XEXP (x, 0))
2098             || contains_muldiv (XEXP (x, 1));
2099
2100       if (UNARY_P (x))
2101         return contains_muldiv (XEXP (x, 0));
2102
2103       return 0;
2104     }
2105 }
2106 \f
2107 /* Determine whether INSN can be used in a combination.  Return nonzero if
2108    not.  This is used in try_combine to detect early some cases where we
2109    can't perform combinations.  */
2110
2111 static int
2112 cant_combine_insn_p (rtx insn)
2113 {
2114   rtx set;
2115   rtx src, dest;
2116
2117   /* If this isn't really an insn, we can't do anything.
2118      This can occur when flow deletes an insn that it has merged into an
2119      auto-increment address.  */
2120   if (! INSN_P (insn))
2121     return 1;
2122
2123   /* Never combine loads and stores involving hard regs that are likely
2124      to be spilled.  The register allocator can usually handle such
2125      reg-reg moves by tying.  If we allow the combiner to make
2126      substitutions of likely-spilled regs, reload might die.
2127      As an exception, we allow combinations involving fixed regs; these are
2128      not available to the register allocator so there's no risk involved.  */
2129
2130   set = single_set (insn);
2131   if (! set)
2132     return 0;
2133   src = SET_SRC (set);
2134   dest = SET_DEST (set);
2135   if (GET_CODE (src) == SUBREG)
2136     src = SUBREG_REG (src);
2137   if (GET_CODE (dest) == SUBREG)
2138     dest = SUBREG_REG (dest);
2139   if (REG_P (src) && REG_P (dest)
2140       && ((HARD_REGISTER_P (src)
2141            && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (src))
2142            && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (src))))
2143           || (HARD_REGISTER_P (dest)
2144               && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (dest))
2145               && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (dest))))))
2146     return 1;
2147
2148   return 0;
2149 }
2150
2151 struct likely_spilled_retval_info
2152 {
2153   unsigned regno, nregs;
2154   unsigned mask;
2155 };
2156
2157 /* Called via note_stores by likely_spilled_retval_p.  Remove from info->mask
2158    hard registers that are known to be written to / clobbered in full.  */
2159 static void
2160 likely_spilled_retval_1 (rtx x, const_rtx set, void *data)
2161 {
2162   struct likely_spilled_retval_info *const info =
2163     (struct likely_spilled_retval_info *) data;
2164   unsigned regno, nregs;
2165   unsigned new_mask;
2166
2167   if (!REG_P (XEXP (set, 0)))
2168     return;
2169   regno = REGNO (x);
2170   if (regno >= info->regno + info->nregs)
2171     return;
2172   nregs = hard_regno_nregs[regno][GET_MODE (x)];
2173   if (regno + nregs <= info->regno)
2174     return;
2175   new_mask = (2U << (nregs - 1)) - 1;
2176   if (regno < info->regno)
2177     new_mask >>= info->regno - regno;
2178   else
2179     new_mask <<= regno - info->regno;
2180   info->mask &= ~new_mask;
2181 }
2182
2183 /* Return nonzero iff part of the return value is live during INSN, and
2184    it is likely spilled.  This can happen when more than one insn is needed
2185    to copy the return value, e.g. when we consider to combine into the
2186    second copy insn for a complex value.  */
2187
2188 static int
2189 likely_spilled_retval_p (rtx insn)
2190 {
2191   rtx use = BB_END (this_basic_block);
2192   rtx reg, p;
2193   unsigned regno, nregs;
2194   /* We assume here that no machine mode needs more than
2195      32 hard registers when the value overlaps with a register
2196      for which TARGET_FUNCTION_VALUE_REGNO_P is true.  */
2197   unsigned mask;
2198   struct likely_spilled_retval_info info;
2199
2200   if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
2201     return 0;
2202   reg = XEXP (PATTERN (use), 0);
2203   if (!REG_P (reg) || !targetm.calls.function_value_regno_p (REGNO (reg)))
2204     return 0;
2205   regno = REGNO (reg);
2206   nregs = hard_regno_nregs[regno][GET_MODE (reg)];
2207   if (nregs == 1)
2208     return 0;
2209   mask = (2U << (nregs - 1)) - 1;
2210
2211   /* Disregard parts of the return value that are set later.  */
2212   info.regno = regno;
2213   info.nregs = nregs;
2214   info.mask = mask;
2215   for (p = PREV_INSN (use); info.mask && p != insn; p = PREV_INSN (p))
2216     if (INSN_P (p))
2217       note_stores (PATTERN (p), likely_spilled_retval_1, &info);
2218   mask = info.mask;
2219
2220   /* Check if any of the (probably) live return value registers is
2221      likely spilled.  */
2222   nregs --;
2223   do
2224     {
2225       if ((mask & 1 << nregs)
2226           && targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno + nregs)))
2227         return 1;
2228     } while (nregs--);
2229   return 0;
2230 }
2231
2232 /* Adjust INSN after we made a change to its destination.
2233
2234    Changing the destination can invalidate notes that say something about
2235    the results of the insn and a LOG_LINK pointing to the insn.  */
2236
2237 static void
2238 adjust_for_new_dest (rtx insn)
2239 {
2240   /* For notes, be conservative and simply remove them.  */
2241   remove_reg_equal_equiv_notes (insn);
2242
2243   /* The new insn will have a destination that was previously the destination
2244      of an insn just above it.  Call distribute_links to make a LOG_LINK from
2245      the next use of that destination.  */
2246   distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
2247
2248   df_insn_rescan (insn);
2249 }
2250
2251 /* Return TRUE if combine can reuse reg X in mode MODE.
2252    ADDED_SETS is nonzero if the original set is still required.  */
2253 static bool
2254 can_change_dest_mode (rtx x, int added_sets, enum machine_mode mode)
2255 {
2256   unsigned int regno;
2257
2258   if (!REG_P(x))
2259     return false;
2260
2261   regno = REGNO (x);
2262   /* Allow hard registers if the new mode is legal, and occupies no more
2263      registers than the old mode.  */
2264   if (regno < FIRST_PSEUDO_REGISTER)
2265     return (HARD_REGNO_MODE_OK (regno, mode)
2266             && (hard_regno_nregs[regno][GET_MODE (x)]
2267                 >= hard_regno_nregs[regno][mode]));
2268
2269   /* Or a pseudo that is only used once.  */
2270   return (REG_N_SETS (regno) == 1 && !added_sets
2271           && !REG_USERVAR_P (x));
2272 }
2273
2274
2275 /* Check whether X, the destination of a set, refers to part of
2276    the register specified by REG.  */
2277
2278 static bool
2279 reg_subword_p (rtx x, rtx reg)
2280 {
2281   /* Check that reg is an integer mode register.  */
2282   if (!REG_P (reg) || GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
2283     return false;
2284
2285   if (GET_CODE (x) == STRICT_LOW_PART
2286       || GET_CODE (x) == ZERO_EXTRACT)
2287     x = XEXP (x, 0);
2288
2289   return GET_CODE (x) == SUBREG
2290          && SUBREG_REG (x) == reg
2291          && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT;
2292 }
2293
2294 #ifdef AUTO_INC_DEC
2295 /* Replace auto-increment addressing modes with explicit operations to access
2296    the same addresses without modifying the corresponding registers.  */
2297
2298 static rtx
2299 cleanup_auto_inc_dec (rtx src, enum machine_mode mem_mode)
2300 {
2301   rtx x = src;
2302   const RTX_CODE code = GET_CODE (x);
2303   int i;
2304   const char *fmt;
2305
2306   switch (code)
2307     {
2308     case REG:
2309     case CONST_INT:
2310     case CONST_DOUBLE:
2311     case CONST_FIXED:
2312     case CONST_VECTOR:
2313     case SYMBOL_REF:
2314     case CODE_LABEL:
2315     case PC:
2316     case CC0:
2317     case SCRATCH:
2318       /* SCRATCH must be shared because they represent distinct values.  */
2319       return x;
2320     case CLOBBER:
2321       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2322         return x;
2323       break;
2324
2325     case CONST:
2326       if (shared_const_p (x))
2327         return x;
2328       break;
2329
2330     case MEM:
2331       mem_mode = GET_MODE (x);
2332       break;
2333
2334     case PRE_INC:
2335     case PRE_DEC:
2336       gcc_assert (mem_mode != VOIDmode && mem_mode != BLKmode);
2337       return gen_rtx_PLUS (GET_MODE (x),
2338                            cleanup_auto_inc_dec (XEXP (x, 0), mem_mode),
2339                            GEN_INT (code == PRE_INC
2340                                     ? GET_MODE_SIZE (mem_mode)
2341                                     : -GET_MODE_SIZE (mem_mode)));
2342
2343     case POST_INC:
2344     case POST_DEC:
2345     case PRE_MODIFY:
2346     case POST_MODIFY:
2347       return cleanup_auto_inc_dec (code == PRE_MODIFY
2348                                    ? XEXP (x, 1) : XEXP (x, 0),
2349                                    mem_mode);
2350
2351     default:
2352       break;
2353     }
2354
2355   /* Copy the various flags, fields, and other information.  We assume
2356      that all fields need copying, and then clear the fields that should
2357      not be copied.  That is the sensible default behavior, and forces
2358      us to explicitly document why we are *not* copying a flag.  */
2359   x = shallow_copy_rtx (x);
2360
2361   /* We do not copy the USED flag, which is used as a mark bit during
2362      walks over the RTL.  */
2363   RTX_FLAG (x, used) = 0;
2364
2365   /* We do not copy FRAME_RELATED for INSNs.  */
2366   if (INSN_P (x))
2367     RTX_FLAG (x, frame_related) = 0;
2368
2369   fmt = GET_RTX_FORMAT (code);
2370   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2371     if (fmt[i] == 'e')
2372       XEXP (x, i) = cleanup_auto_inc_dec (XEXP (x, i), mem_mode);
2373     else if (fmt[i] == 'E' || fmt[i] == 'V')
2374       {
2375         int j;
2376         XVEC (x, i) = rtvec_alloc (XVECLEN (x, i));
2377         for (j = 0; j < XVECLEN (x, i); j++)
2378           XVECEXP (x, i, j)
2379             = cleanup_auto_inc_dec (XVECEXP (src, i, j), mem_mode);
2380       }
2381
2382   return x;
2383 }
2384 #endif
2385
2386 /* Auxiliary data structure for propagate_for_debug_stmt.  */
2387
2388 struct rtx_subst_pair
2389 {
2390   rtx to;
2391   bool adjusted;
2392 };
2393
2394 /* DATA points to an rtx_subst_pair.  Return the value that should be
2395    substituted.  */
2396
2397 static rtx
2398 propagate_for_debug_subst (rtx from, const_rtx old_rtx, void *data)
2399 {
2400   struct rtx_subst_pair *pair = (struct rtx_subst_pair *)data;
2401
2402   if (!rtx_equal_p (from, old_rtx))
2403     return NULL_RTX;
2404   if (!pair->adjusted)
2405     {
2406       pair->adjusted = true;
2407 #ifdef AUTO_INC_DEC
2408       pair->to = cleanup_auto_inc_dec (pair->to, VOIDmode);
2409 #else
2410       pair->to = copy_rtx (pair->to);
2411 #endif
2412       pair->to = make_compound_operation (pair->to, SET);
2413       return pair->to;
2414     }
2415   return copy_rtx (pair->to);
2416 }
2417
2418 /* Replace all the occurrences of DEST with SRC in DEBUG_INSNs between INSN
2419    and LAST.  */
2420
2421 static void
2422 propagate_for_debug (rtx insn, rtx last, rtx dest, rtx src)
2423 {
2424   rtx next, loc;
2425
2426   struct rtx_subst_pair p;
2427   p.to = src;
2428   p.adjusted = false;
2429
2430   next = NEXT_INSN (insn);
2431   while (next != last)
2432     {
2433       insn = next;
2434       next = NEXT_INSN (insn);
2435       if (DEBUG_INSN_P (insn))
2436         {
2437           loc = simplify_replace_fn_rtx (INSN_VAR_LOCATION_LOC (insn),
2438                                          dest, propagate_for_debug_subst, &p);
2439           if (loc == INSN_VAR_LOCATION_LOC (insn))
2440             continue;
2441           INSN_VAR_LOCATION_LOC (insn) = loc;
2442           df_insn_rescan (insn);
2443         }
2444     }
2445 }
2446
2447 /* Delete the unconditional jump INSN and adjust the CFG correspondingly.
2448    Note that the INSN should be deleted *after* removing dead edges, so
2449    that the kept edge is the fallthrough edge for a (set (pc) (pc))
2450    but not for a (set (pc) (label_ref FOO)).  */
2451
2452 static void
2453 update_cfg_for_uncondjump (rtx insn)
2454 {
2455   basic_block bb = BLOCK_FOR_INSN (insn);
2456   bool at_end = (BB_END (bb) == insn);
2457
2458   if (at_end)
2459     purge_dead_edges (bb);
2460
2461   delete_insn (insn);
2462   if (at_end && EDGE_COUNT (bb->succs) == 1)
2463     {
2464       rtx insn;
2465
2466       single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2467
2468       /* Remove barriers from the footer if there are any.  */
2469       for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
2470         if (BARRIER_P (insn))
2471           {
2472             if (PREV_INSN (insn))
2473               NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2474             else
2475               bb->il.rtl->footer = NEXT_INSN (insn);
2476             if (NEXT_INSN (insn))
2477               PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2478           }
2479         else if (LABEL_P (insn))
2480           break;
2481     }
2482 }
2483
2484 /* Try to combine the insns I0, I1 and I2 into I3.
2485    Here I0, I1 and I2 appear earlier than I3.
2486    I0 and I1 can be zero; then we combine just I2 into I3, or I1 and I2 into
2487    I3.
2488
2489    If we are combining more than two insns and the resulting insn is not
2490    recognized, try splitting it into two insns.  If that happens, I2 and I3
2491    are retained and I1/I0 are pseudo-deleted by turning them into a NOTE.
2492    Otherwise, I0, I1 and I2 are pseudo-deleted.
2493
2494    Return 0 if the combination does not work.  Then nothing is changed.
2495    If we did the combination, return the insn at which combine should
2496    resume scanning.
2497
2498    Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
2499    new direct jump instruction.  */
2500
2501 static rtx
2502 try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p)
2503 {
2504   /* New patterns for I3 and I2, respectively.  */
2505   rtx newpat, newi2pat = 0;
2506   rtvec newpat_vec_with_clobbers = 0;
2507   int substed_i2 = 0, substed_i1 = 0, substed_i0 = 0;
2508   /* Indicates need to preserve SET in I0, I1 or I2 in I3 if it is not
2509      dead.  */
2510   int added_sets_0, added_sets_1, added_sets_2;
2511   /* Total number of SETs to put into I3.  */
2512   int total_sets;
2513   /* Nonzero if I2's or I1's body now appears in I3.  */
2514   int i2_is_used = 0, i1_is_used = 0;
2515   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
2516   int insn_code_number, i2_code_number = 0, other_code_number = 0;
2517   /* Contains I3 if the destination of I3 is used in its source, which means
2518      that the old life of I3 is being killed.  If that usage is placed into
2519      I2 and not in I3, a REG_DEAD note must be made.  */
2520   rtx i3dest_killed = 0;
2521   /* SET_DEST and SET_SRC of I2, I1 and I0.  */
2522   rtx i2dest = 0, i2src = 0, i1dest = 0, i1src = 0, i0dest = 0, i0src = 0;
2523   /* Copy of SET_SRC of I1, if needed.  */
2524   rtx i1src_copy = 0;
2525   /* Set if I2DEST was reused as a scratch register.  */
2526   bool i2scratch = false;
2527   /* The PATTERNs of I0, I1, and I2, or a copy of them in certain cases.  */
2528   rtx i0pat = 0, i1pat = 0, i2pat = 0;
2529   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
2530   int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
2531   int i0dest_in_i0src = 0, i1dest_in_i0src = 0, i2dest_in_i0src = 0;
2532   int i2dest_killed = 0, i1dest_killed = 0, i0dest_killed = 0;
2533   int i1_feeds_i2_n = 0, i0_feeds_i2_n = 0, i0_feeds_i1_n = 0;
2534   /* Notes that must be added to REG_NOTES in I3 and I2.  */
2535   rtx new_i3_notes, new_i2_notes;
2536   /* Notes that we substituted I3 into I2 instead of the normal case.  */
2537   int i3_subst_into_i2 = 0;
2538   /* Notes that I1, I2 or I3 is a MULT operation.  */
2539   int have_mult = 0;
2540   int swap_i2i3 = 0;
2541   int changed_i3_dest = 0;
2542
2543   int maxreg;
2544   rtx temp;
2545   rtx link;
2546   rtx other_pat = 0;
2547   rtx new_other_notes;
2548   int i;
2549
2550   /* Only try four-insn combinations when there's high likelihood of
2551      success.  Look for simple insns, such as loads of constants or
2552      binary operations involving a constant.  */
2553   if (i0)
2554     {
2555       int i;
2556       int ngood = 0;
2557       int nshift = 0;
2558
2559       if (!flag_expensive_optimizations)
2560         return 0;
2561
2562       for (i = 0; i < 4; i++)
2563         {
2564           rtx insn = i == 0 ? i0 : i == 1 ? i1 : i == 2 ? i2 : i3;
2565           rtx set = single_set (insn);
2566           rtx src;
2567           if (!set)
2568             continue;
2569           src = SET_SRC (set);
2570           if (CONSTANT_P (src))
2571             {
2572               ngood += 2;
2573               break;
2574             }
2575           else if (BINARY_P (src) && CONSTANT_P (XEXP (src, 1)))
2576             ngood++;
2577           else if (GET_CODE (src) == ASHIFT || GET_CODE (src) == ASHIFTRT
2578                    || GET_CODE (src) == LSHIFTRT)
2579             nshift++;
2580         }
2581       if (ngood < 2 && nshift < 2)
2582         return 0;
2583     }
2584
2585   /* Exit early if one of the insns involved can't be used for
2586      combinations.  */
2587   if (cant_combine_insn_p (i3)
2588       || cant_combine_insn_p (i2)
2589       || (i1 && cant_combine_insn_p (i1))
2590       || (i0 && cant_combine_insn_p (i0))
2591       || likely_spilled_retval_p (i3))
2592     return 0;
2593
2594   combine_attempts++;
2595   undobuf.other_insn = 0;
2596
2597   /* Reset the hard register usage information.  */
2598   CLEAR_HARD_REG_SET (newpat_used_regs);
2599
2600   if (dump_file && (dump_flags & TDF_DETAILS))
2601     {
2602       if (i0)
2603         fprintf (dump_file, "\nTrying %d, %d, %d -> %d:\n",
2604                  INSN_UID (i0), INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2605       else if (i1)
2606         fprintf (dump_file, "\nTrying %d, %d -> %d:\n",
2607                  INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2608       else
2609         fprintf (dump_file, "\nTrying %d -> %d:\n",
2610                  INSN_UID (i2), INSN_UID (i3));
2611     }
2612
2613   /* If multiple insns feed into one of I2 or I3, they can be in any
2614      order.  To simplify the code below, reorder them in sequence.  */
2615   if (i0 && DF_INSN_LUID (i0) > DF_INSN_LUID (i2))
2616     temp = i2, i2 = i0, i0 = temp;
2617   if (i0 && DF_INSN_LUID (i0) > DF_INSN_LUID (i1))
2618     temp = i1, i1 = i0, i0 = temp;
2619   if (i1 && DF_INSN_LUID (i1) > DF_INSN_LUID (i2))
2620     temp = i1, i1 = i2, i2 = temp;
2621
2622   added_links_insn = 0;
2623
2624   /* First check for one important special case that the code below will
2625      not handle.  Namely, the case where I1 is zero, I2 is a PARALLEL
2626      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
2627      we may be able to replace that destination with the destination of I3.
2628      This occurs in the common code where we compute both a quotient and
2629      remainder into a structure, in which case we want to do the computation
2630      directly into the structure to avoid register-register copies.
2631
2632      Note that this case handles both multiple sets in I2 and also cases
2633      where I2 has a number of CLOBBERs inside the PARALLEL.
2634
2635      We make very conservative checks below and only try to handle the
2636      most common cases of this.  For example, we only handle the case
2637      where I2 and I3 are adjacent to avoid making difficult register
2638      usage tests.  */
2639
2640   if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
2641       && REG_P (SET_SRC (PATTERN (i3)))
2642       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
2643       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
2644       && GET_CODE (PATTERN (i2)) == PARALLEL
2645       && ! side_effects_p (SET_DEST (PATTERN (i3)))
2646       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
2647          below would need to check what is inside (and reg_overlap_mentioned_p
2648          doesn't support those codes anyway).  Don't allow those destinations;
2649          the resulting insn isn't likely to be recognized anyway.  */
2650       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
2651       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
2652       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
2653                                     SET_DEST (PATTERN (i3)))
2654       && next_active_insn (i2) == i3)
2655     {
2656       rtx p2 = PATTERN (i2);
2657
2658       /* Make sure that the destination of I3,
2659          which we are going to substitute into one output of I2,
2660          is not used within another output of I2.  We must avoid making this:
2661          (parallel [(set (mem (reg 69)) ...)
2662                     (set (reg 69) ...)])
2663          which is not well-defined as to order of actions.
2664          (Besides, reload can't handle output reloads for this.)
2665
2666          The problem can also happen if the dest of I3 is a memory ref,
2667          if another dest in I2 is an indirect memory ref.  */
2668       for (i = 0; i < XVECLEN (p2, 0); i++)
2669         if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2670              || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2671             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
2672                                         SET_DEST (XVECEXP (p2, 0, i))))
2673           break;
2674
2675       if (i == XVECLEN (p2, 0))
2676         for (i = 0; i < XVECLEN (p2, 0); i++)
2677           if (GET_CODE (XVECEXP (p2, 0, i)) == SET
2678               && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
2679             {
2680               combine_merges++;
2681
2682               subst_insn = i3;
2683               subst_low_luid = DF_INSN_LUID (i2);
2684
2685               added_sets_2 = added_sets_1 = added_sets_0 = 0;
2686               i2src = SET_SRC (XVECEXP (p2, 0, i));
2687               i2dest = SET_DEST (XVECEXP (p2, 0, i));
2688               i2dest_killed = dead_or_set_p (i2, i2dest);
2689
2690               /* Replace the dest in I2 with our dest and make the resulting
2691                  insn the new pattern for I3.  Then skip to where we validate
2692                  the pattern.  Everything was set up above.  */
2693               SUBST (SET_DEST (XVECEXP (p2, 0, i)), SET_DEST (PATTERN (i3)));
2694               newpat = p2;
2695               i3_subst_into_i2 = 1;
2696               goto validate_replacement;
2697             }
2698     }
2699
2700   /* If I2 is setting a pseudo to a constant and I3 is setting some
2701      sub-part of it to another constant, merge them by making a new
2702      constant.  */
2703   if (i1 == 0
2704       && (temp = single_set (i2)) != 0
2705       && (CONST_INT_P (SET_SRC (temp))
2706           || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
2707       && GET_CODE (PATTERN (i3)) == SET
2708       && (CONST_INT_P (SET_SRC (PATTERN (i3)))
2709           || GET_CODE (SET_SRC (PATTERN (i3))) == CONST_DOUBLE)
2710       && reg_subword_p (SET_DEST (PATTERN (i3)), SET_DEST (temp)))
2711     {
2712       rtx dest = SET_DEST (PATTERN (i3));
2713       int offset = -1;
2714       int width = 0;
2715
2716       if (GET_CODE (dest) == ZERO_EXTRACT)
2717         {
2718           if (CONST_INT_P (XEXP (dest, 1))
2719               && CONST_INT_P (XEXP (dest, 2)))
2720             {
2721               width = INTVAL (XEXP (dest, 1));
2722               offset = INTVAL (XEXP (dest, 2));
2723               dest = XEXP (dest, 0);
2724               if (BITS_BIG_ENDIAN)
2725                 offset = GET_MODE_BITSIZE (GET_MODE (dest)) - width - offset;
2726             }
2727         }
2728       else
2729         {
2730           if (GET_CODE (dest) == STRICT_LOW_PART)
2731             dest = XEXP (dest, 0);
2732           width = GET_MODE_BITSIZE (GET_MODE (dest));
2733           offset = 0;
2734         }
2735
2736       if (offset >= 0)
2737         {
2738           /* If this is the low part, we're done.  */
2739           if (subreg_lowpart_p (dest))
2740             ;
2741           /* Handle the case where inner is twice the size of outer.  */
2742           else if (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp)))
2743                    == 2 * GET_MODE_BITSIZE (GET_MODE (dest)))
2744             offset += GET_MODE_BITSIZE (GET_MODE (dest));
2745           /* Otherwise give up for now.  */
2746           else
2747             offset = -1;
2748         }
2749
2750       if (offset >= 0
2751           && (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp)))
2752               <= HOST_BITS_PER_DOUBLE_INT))
2753         {
2754           double_int m, o, i;
2755           rtx inner = SET_SRC (PATTERN (i3));
2756           rtx outer = SET_SRC (temp);
2757
2758           o = rtx_to_double_int (outer);
2759           i = rtx_to_double_int (inner);
2760
2761           m = double_int_mask (width);
2762           i = double_int_and (i, m);
2763           m = double_int_lshift (m, offset, HOST_BITS_PER_DOUBLE_INT, false);
2764           i = double_int_lshift (i, offset, HOST_BITS_PER_DOUBLE_INT, false);
2765           o = double_int_ior (double_int_and_not (o, m), i);
2766
2767           combine_merges++;
2768           subst_insn = i3;
2769           subst_low_luid = DF_INSN_LUID (i2);
2770           added_sets_2 = added_sets_1 = added_sets_0 = 0;
2771           i2dest = SET_DEST (temp);
2772           i2dest_killed = dead_or_set_p (i2, i2dest);
2773
2774           /* Replace the source in I2 with the new constant and make the
2775              resulting insn the new pattern for I3.  Then skip to where we
2776              validate the pattern.  Everything was set up above.  */
2777           SUBST (SET_SRC (temp),
2778                  immed_double_int_const (o, GET_MODE (SET_DEST (temp))));
2779
2780           newpat = PATTERN (i2);
2781
2782           /* The dest of I3 has been replaced with the dest of I2.  */
2783           changed_i3_dest = 1;
2784           goto validate_replacement;
2785         }
2786     }
2787
2788 #ifndef HAVE_cc0
2789   /* If we have no I1 and I2 looks like:
2790         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
2791                    (set Y OP)])
2792      make up a dummy I1 that is
2793         (set Y OP)
2794      and change I2 to be
2795         (set (reg:CC X) (compare:CC Y (const_int 0)))
2796
2797      (We can ignore any trailing CLOBBERs.)
2798
2799      This undoes a previous combination and allows us to match a branch-and-
2800      decrement insn.  */
2801
2802   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
2803       && XVECLEN (PATTERN (i2), 0) >= 2
2804       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
2805       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
2806           == MODE_CC)
2807       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
2808       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
2809       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
2810       && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)))
2811       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
2812                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
2813     {
2814       for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
2815         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
2816           break;
2817
2818       if (i == 1)
2819         {
2820           /* We make I1 with the same INSN_UID as I2.  This gives it
2821              the same DF_INSN_LUID for value tracking.  Our fake I1 will
2822              never appear in the insn stream so giving it the same INSN_UID
2823              as I2 will not cause a problem.  */
2824
2825           i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
2826                              BLOCK_FOR_INSN (i2), XVECEXP (PATTERN (i2), 0, 1),
2827                              INSN_LOCATOR (i2), -1, NULL_RTX);
2828
2829           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
2830           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
2831                  SET_DEST (PATTERN (i1)));
2832         }
2833     }
2834 #endif
2835
2836   /* Verify that I2 and I1 are valid for combining.  */
2837   if (! can_combine_p (i2, i3, i0, i1, NULL_RTX, NULL_RTX, &i2dest, &i2src)
2838       || (i1 && ! can_combine_p (i1, i3, i0, NULL_RTX, i2, NULL_RTX,
2839                                  &i1dest, &i1src))
2840       || (i0 && ! can_combine_p (i0, i3, NULL_RTX, NULL_RTX, i1, i2,
2841                                  &i0dest, &i0src)))
2842     {
2843       undo_all ();
2844       return 0;
2845     }
2846
2847   /* Record whether I2DEST is used in I2SRC and similarly for the other
2848      cases.  Knowing this will help in register status updating below.  */
2849   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
2850   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
2851   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
2852   i0dest_in_i0src = i0 && reg_overlap_mentioned_p (i0dest, i0src);
2853   i1dest_in_i0src = i0 && reg_overlap_mentioned_p (i1dest, i0src);
2854   i2dest_in_i0src = i0 && reg_overlap_mentioned_p (i2dest, i0src);
2855   i2dest_killed = dead_or_set_p (i2, i2dest);
2856   i1dest_killed = i1 && dead_or_set_p (i1, i1dest);
2857   i0dest_killed = i0 && dead_or_set_p (i0, i0dest);
2858
2859   /* For the earlier insns, determine which of the subsequent ones they
2860      feed.  */
2861   i1_feeds_i2_n = i1 && insn_a_feeds_b (i1, i2);
2862   i0_feeds_i1_n = i0 && insn_a_feeds_b (i0, i1);
2863   i0_feeds_i2_n = (i0 && (!i0_feeds_i1_n ? insn_a_feeds_b (i0, i2)
2864                           : (!reg_overlap_mentioned_p (i1dest, i0dest)
2865                              && reg_overlap_mentioned_p (i0dest, i2src))));
2866
2867   /* Ensure that I3's pattern can be the destination of combines.  */
2868   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest, i0dest,
2869                           i1 && i2dest_in_i1src && !i1_feeds_i2_n,
2870                           i0 && ((i2dest_in_i0src && !i0_feeds_i2_n)
2871                                  || (i1dest_in_i0src && !i0_feeds_i1_n)),
2872                           &i3dest_killed))
2873     {
2874       undo_all ();
2875       return 0;
2876     }
2877
2878   /* See if any of the insns is a MULT operation.  Unless one is, we will
2879      reject a combination that is, since it must be slower.  Be conservative
2880      here.  */
2881   if (GET_CODE (i2src) == MULT
2882       || (i1 != 0 && GET_CODE (i1src) == MULT)
2883       || (i0 != 0 && GET_CODE (i0src) == MULT)
2884       || (GET_CODE (PATTERN (i3)) == SET
2885           && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
2886     have_mult = 1;
2887
2888   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
2889      We used to do this EXCEPT in one case: I3 has a post-inc in an
2890      output operand.  However, that exception can give rise to insns like
2891         mov r3,(r3)+
2892      which is a famous insn on the PDP-11 where the value of r3 used as the
2893      source was model-dependent.  Avoid this sort of thing.  */
2894
2895 #if 0
2896   if (!(GET_CODE (PATTERN (i3)) == SET
2897         && REG_P (SET_SRC (PATTERN (i3)))
2898         && MEM_P (SET_DEST (PATTERN (i3)))
2899         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
2900             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
2901     /* It's not the exception.  */
2902 #endif
2903 #ifdef AUTO_INC_DEC
2904     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
2905       if (REG_NOTE_KIND (link) == REG_INC
2906           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
2907               || (i1 != 0
2908                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
2909         {
2910           undo_all ();
2911           return 0;
2912         }
2913 #endif
2914
2915   /* See if the SETs in I1 or I2 need to be kept around in the merged
2916      instruction: whenever the value set there is still needed past I3.
2917      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
2918
2919      For the SET in I1, we have two cases:  If I1 and I2 independently
2920      feed into I3, the set in I1 needs to be kept around if I1DEST dies
2921      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
2922      in I1 needs to be kept around unless I1DEST dies or is set in either
2923      I2 or I3.  The same consideration applies to I0.  */
2924
2925   added_sets_2 = !dead_or_set_p (i3, i2dest);
2926
2927   if (i1)
2928     added_sets_1 = !(dead_or_set_p (i3, i1dest)
2929                      || (i1_feeds_i2_n && dead_or_set_p (i2, i1dest)));
2930   else
2931     added_sets_1 = 0;
2932
2933   if (i0)
2934     added_sets_0 =  !(dead_or_set_p (i3, i0dest)
2935                       || (i0_feeds_i2_n && dead_or_set_p (i2, i0dest))
2936                       || (i0_feeds_i1_n && dead_or_set_p (i1, i0dest)));
2937   else
2938     added_sets_0 = 0;
2939
2940   /* We are about to copy insns for the case where they need to be kept
2941      around.  Check that they can be copied in the merged instruction.  */
2942
2943   if (targetm.cannot_copy_insn_p
2944       && ((added_sets_2 && targetm.cannot_copy_insn_p (i2))
2945           || (i1 && added_sets_1 && targetm.cannot_copy_insn_p (i1))
2946           || (i0 && added_sets_0 && targetm.cannot_copy_insn_p (i0))))
2947     {
2948       undo_all ();
2949       return 0;
2950     }
2951
2952   /* If the set in I2 needs to be kept around, we must make a copy of
2953      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
2954      PATTERN (I2), we are only substituting for the original I1DEST, not into
2955      an already-substituted copy.  This also prevents making self-referential
2956      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
2957      I2DEST.  */
2958
2959   if (added_sets_2)
2960     {
2961       if (GET_CODE (PATTERN (i2)) == PARALLEL)
2962         i2pat = gen_rtx_SET (VOIDmode, i2dest, copy_rtx (i2src));
2963       else
2964         i2pat = copy_rtx (PATTERN (i2));
2965     }
2966
2967   if (added_sets_1)
2968     {
2969       if (GET_CODE (PATTERN (i1)) == PARALLEL)
2970         i1pat = gen_rtx_SET (VOIDmode, i1dest, copy_rtx (i1src));
2971       else
2972         i1pat = copy_rtx (PATTERN (i1));
2973     }
2974
2975   if (added_sets_0)
2976     {
2977       if (GET_CODE (PATTERN (i0)) == PARALLEL)
2978         i0pat = gen_rtx_SET (VOIDmode, i0dest, copy_rtx (i0src));
2979       else
2980         i0pat = copy_rtx (PATTERN (i0));
2981     }
2982
2983   combine_merges++;
2984
2985   /* Substitute in the latest insn for the regs set by the earlier ones.  */
2986
2987   maxreg = max_reg_num ();
2988
2989   subst_insn = i3;
2990
2991 #ifndef HAVE_cc0
2992   /* Many machines that don't use CC0 have insns that can both perform an
2993      arithmetic operation and set the condition code.  These operations will
2994      be represented as a PARALLEL with the first element of the vector
2995      being a COMPARE of an arithmetic operation with the constant zero.
2996      The second element of the vector will set some pseudo to the result
2997      of the same arithmetic operation.  If we simplify the COMPARE, we won't
2998      match such a pattern and so will generate an extra insn.   Here we test
2999      for this case, where both the comparison and the operation result are
3000      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
3001      I2SRC.  Later we will make the PARALLEL that contains I2.  */
3002
3003   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
3004       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
3005       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
3006       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
3007     {
3008 #ifdef SELECT_CC_MODE
3009       rtx *cc_use;
3010       enum machine_mode compare_mode;
3011 #endif
3012
3013       newpat = PATTERN (i3);
3014       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
3015
3016       i2_is_used = 1;
3017
3018 #ifdef SELECT_CC_MODE
3019       /* See if a COMPARE with the operand we substituted in should be done
3020          with the mode that is currently being used.  If not, do the same
3021          processing we do in `subst' for a SET; namely, if the destination
3022          is used only once, try to replace it with a register of the proper
3023          mode and also replace the COMPARE.  */
3024       if (undobuf.other_insn == 0
3025           && (cc_use = find_single_use (SET_DEST (newpat), i3,
3026                                         &undobuf.other_insn))
3027           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
3028                                               i2src, const0_rtx))
3029               != GET_MODE (SET_DEST (newpat))))
3030         {
3031           if (can_change_dest_mode (SET_DEST (newpat), added_sets_2,
3032                                     compare_mode))
3033             {
3034               unsigned int regno = REGNO (SET_DEST (newpat));
3035               rtx new_dest;
3036
3037               if (regno < FIRST_PSEUDO_REGISTER)
3038                 new_dest = gen_rtx_REG (compare_mode, regno);
3039               else
3040                 {
3041                   SUBST_MODE (regno_reg_rtx[regno], compare_mode);
3042                   new_dest = regno_reg_rtx[regno];
3043                 }
3044
3045               SUBST (SET_DEST (newpat), new_dest);
3046               SUBST (XEXP (*cc_use, 0), new_dest);
3047               SUBST (SET_SRC (newpat),
3048                      gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
3049             }
3050           else
3051             undobuf.other_insn = 0;
3052         }
3053 #endif
3054     }
3055   else
3056 #endif
3057     {
3058       /* It is possible that the source of I2 or I1 may be performing
3059          an unneeded operation, such as a ZERO_EXTEND of something
3060          that is known to have the high part zero.  Handle that case
3061          by letting subst look at the innermost one of them.
3062
3063          Another way to do this would be to have a function that tries
3064          to simplify a single insn instead of merging two or more
3065          insns.  We don't do this because of the potential of infinite
3066          loops and because of the potential extra memory required.
3067          However, doing it the way we are is a bit of a kludge and
3068          doesn't catch all cases.
3069
3070          But only do this if -fexpensive-optimizations since it slows
3071          things down and doesn't usually win.
3072
3073          This is not done in the COMPARE case above because the
3074          unmodified I2PAT is used in the PARALLEL and so a pattern
3075          with a modified I2SRC would not match.  */
3076
3077       if (flag_expensive_optimizations)
3078         {
3079           /* Pass pc_rtx so no substitutions are done, just
3080              simplifications.  */
3081           if (i1)
3082             {
3083               subst_low_luid = DF_INSN_LUID (i1);
3084               i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
3085             }
3086           else
3087             {
3088               subst_low_luid = DF_INSN_LUID (i2);
3089               i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
3090             }
3091         }
3092
3093       n_occurrences = 0;                /* `subst' counts here */
3094       subst_low_luid = DF_INSN_LUID (i2);
3095
3096       /* If I1 feeds into I2 and I1DEST is in I1SRC, we need to make a unique
3097          copy of I2SRC each time we substitute it, in order to avoid creating
3098          self-referential RTL when we will be substituting I1SRC for I1DEST
3099          later.  Likewise if I0 feeds into I2 and I0DEST is in I0SRC.  */
3100       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
3101                       (i1_feeds_i2_n && i1dest_in_i1src)
3102                       || (i0_feeds_i2_n && i0dest_in_i0src));
3103       substed_i2 = 1;
3104
3105       /* Record whether I2's body now appears within I3's body.  */
3106       i2_is_used = n_occurrences;
3107     }
3108
3109   /* If we already got a failure, don't try to do more.  Otherwise, try to
3110      substitute I1 if we have it.  */
3111
3112   if (i1 && GET_CODE (newpat) != CLOBBER)
3113     {
3114       /* Check that an autoincrement side-effect on I1 has not been lost.
3115          This happens if I1DEST is mentioned in I2 and dies there, and
3116          has disappeared from the new pattern.  */
3117       if ((FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
3118            && i1_feeds_i2_n
3119            && dead_or_set_p (i2, i1dest)
3120            && !reg_overlap_mentioned_p (i1dest, newpat))
3121            /* Before we can do this substitution, we must redo the test done
3122               above (see detailed comments there) that ensures I1DEST isn't
3123               mentioned in any SETs in NEWPAT that are field assignments.  */
3124           || !combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, NULL_RTX,
3125                                 0, 0, 0))
3126         {
3127           undo_all ();
3128           return 0;
3129         }
3130
3131       n_occurrences = 0;
3132       subst_low_luid = DF_INSN_LUID (i1);
3133
3134       /* If I0 feeds into I1 and I0DEST is in I0SRC, we need to make a unique
3135          copy of I1SRC each time we substitute it, in order to avoid creating
3136          self-referential RTL when we will be substituting I0SRC for I0DEST
3137          later.  */
3138       newpat = subst (newpat, i1dest, i1src, 0,
3139                       i0_feeds_i1_n && i0dest_in_i0src);
3140       substed_i1 = 1;
3141
3142       /* Record whether I1's body now appears within I3's body.  */
3143       i1_is_used = n_occurrences;
3144     }
3145
3146   /* Likewise for I0 if we have it.  */
3147
3148   if (i0 && GET_CODE (newpat) != CLOBBER)
3149     {
3150       if ((FIND_REG_INC_NOTE (i0, NULL_RTX) != 0
3151            && ((i0_feeds_i2_n && dead_or_set_p (i2, i0dest))
3152                || (i0_feeds_i1_n && dead_or_set_p (i1, i0dest)))
3153            && !reg_overlap_mentioned_p (i0dest, newpat))
3154           || !combinable_i3pat (NULL_RTX, &newpat, i0dest, NULL_RTX, NULL_RTX,
3155                                 0, 0, 0))
3156         {
3157           undo_all ();
3158           return 0;
3159         }
3160
3161       /* If the following substitution will modify I1SRC, make a copy of it
3162          for the case where it is substituted for I1DEST in I2PAT later.  */
3163       if (i0_feeds_i1_n && added_sets_2 && i1_feeds_i2_n)
3164         i1src_copy = copy_rtx (i1src);
3165
3166       n_occurrences = 0;
3167       subst_low_luid = DF_INSN_LUID (i0);
3168       newpat = subst (newpat, i0dest, i0src, 0, 0);
3169       substed_i0 = 1;
3170     }
3171
3172   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
3173      to count all the ways that I2SRC and I1SRC can be used.  */
3174   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
3175        && i2_is_used + added_sets_2 > 1)
3176       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
3177           && (i1_is_used + added_sets_1 + (added_sets_2 && i1_feeds_i2_n)
3178               > 1))
3179       || (i0 != 0 && FIND_REG_INC_NOTE (i0, NULL_RTX) != 0
3180           && (n_occurrences + added_sets_0
3181               + (added_sets_1 && i0_feeds_i1_n)
3182               + (added_sets_2 && i0_feeds_i2_n)
3183               > 1))
3184       /* Fail if we tried to make a new register.  */
3185       || max_reg_num () != maxreg
3186       /* Fail if we couldn't do something and have a CLOBBER.  */
3187       || GET_CODE (newpat) == CLOBBER
3188       /* Fail if this new pattern is a MULT and we didn't have one before
3189          at the outer level.  */
3190       || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
3191           && ! have_mult))
3192     {
3193       undo_all ();
3194       return 0;
3195     }
3196
3197   /* If the actions of the earlier insns must be kept
3198      in addition to substituting them into the latest one,
3199      we must make a new PARALLEL for the latest insn
3200      to hold additional the SETs.  */
3201
3202   if (added_sets_0 || added_sets_1 || added_sets_2)
3203     {
3204       int extra_sets = added_sets_0 + added_sets_1 + added_sets_2;
3205       combine_extras++;
3206
3207       if (GET_CODE (newpat) == PARALLEL)
3208         {
3209           rtvec old = XVEC (newpat, 0);
3210           total_sets = XVECLEN (newpat, 0) + extra_sets;
3211           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3212           memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
3213                   sizeof (old->elem[0]) * old->num_elem);
3214         }
3215       else
3216         {
3217           rtx old = newpat;
3218           total_sets = 1 + extra_sets;
3219           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3220           XVECEXP (newpat, 0, 0) = old;
3221         }
3222
3223       if (added_sets_0)
3224         XVECEXP (newpat, 0, --total_sets) = i0pat;
3225
3226       if (added_sets_1)
3227         {
3228           rtx t = i1pat;
3229           if (i0_feeds_i1_n)
3230             t = subst (t, i0dest, i0src, 0, 0);
3231
3232           XVECEXP (newpat, 0, --total_sets) = t;
3233         }
3234       if (added_sets_2)
3235         {
3236           rtx t = i2pat;
3237           if (i1_feeds_i2_n)
3238             t = subst (t, i1dest, i1src_copy ? i1src_copy : i1src, 0,
3239                        i0_feeds_i1_n && i0dest_in_i0src);
3240           if ((i0_feeds_i1_n && i1_feeds_i2_n) || i0_feeds_i2_n)
3241             t = subst (t, i0dest, i0src, 0, 0);
3242
3243           XVECEXP (newpat, 0, --total_sets) = t;
3244         }
3245     }
3246
3247  validate_replacement:
3248
3249   /* Note which hard regs this insn has as inputs.  */
3250   mark_used_regs_combine (newpat);
3251
3252   /* If recog_for_combine fails, it strips existing clobbers.  If we'll
3253      consider splitting this pattern, we might need these clobbers.  */
3254   if (i1 && GET_CODE (newpat) == PARALLEL
3255       && GET_CODE (XVECEXP (newpat, 0, XVECLEN (newpat, 0) - 1)) == CLOBBER)
3256     {
3257       int len = XVECLEN (newpat, 0);
3258
3259       newpat_vec_with_clobbers = rtvec_alloc (len);
3260       for (i = 0; i < len; i++)
3261         RTVEC_ELT (newpat_vec_with_clobbers, i) = XVECEXP (newpat, 0, i);
3262     }
3263
3264   /* Is the result of combination a valid instruction?  */
3265   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3266
3267   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
3268      the second SET's destination is a register that is unused and isn't
3269      marked as an instruction that might trap in an EH region.  In that case,
3270      we just need the first SET.   This can occur when simplifying a divmod
3271      insn.  We *must* test for this case here because the code below that
3272      splits two independent SETs doesn't handle this case correctly when it
3273      updates the register status.
3274
3275      It's pointless doing this if we originally had two sets, one from
3276      i3, and one from i2.  Combining then splitting the parallel results
3277      in the original i2 again plus an invalid insn (which we delete).
3278      The net effect is only to move instructions around, which makes
3279      debug info less accurate.
3280
3281      Also check the case where the first SET's destination is unused.
3282      That would not cause incorrect code, but does cause an unneeded
3283      insn to remain.  */
3284
3285   if (insn_code_number < 0
3286       && !(added_sets_2 && i1 == 0)
3287       && GET_CODE (newpat) == PARALLEL
3288       && XVECLEN (newpat, 0) == 2
3289       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3290       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3291       && asm_noperands (newpat) < 0)
3292     {
3293       rtx set0 = XVECEXP (newpat, 0, 0);
3294       rtx set1 = XVECEXP (newpat, 0, 1);
3295
3296       if (((REG_P (SET_DEST (set1))
3297             && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
3298            || (GET_CODE (SET_DEST (set1)) == SUBREG
3299                && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
3300           && insn_nothrow_p (i3)
3301           && !side_effects_p (SET_SRC (set1)))
3302         {
3303           newpat = set0;
3304           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3305         }
3306
3307       else if (((REG_P (SET_DEST (set0))
3308                  && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
3309                 || (GET_CODE (SET_DEST (set0)) == SUBREG
3310                     && find_reg_note (i3, REG_UNUSED,
3311                                       SUBREG_REG (SET_DEST (set0)))))
3312                && insn_nothrow_p (i3)
3313                && !side_effects_p (SET_SRC (set0)))
3314         {
3315           newpat = set1;
3316           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3317
3318           if (insn_code_number >= 0)
3319             changed_i3_dest = 1;
3320         }
3321     }
3322
3323   /* If we were combining three insns and the result is a simple SET
3324      with no ASM_OPERANDS that wasn't recognized, try to split it into two
3325      insns.  There are two ways to do this.  It can be split using a
3326      machine-specific method (like when you have an addition of a large
3327      constant) or by combine in the function find_split_point.  */
3328
3329   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
3330       && asm_noperands (newpat) < 0)
3331     {
3332       rtx parallel, m_split, *split;
3333
3334       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
3335          use I2DEST as a scratch register will help.  In the latter case,
3336          convert I2DEST to the mode of the source of NEWPAT if we can.  */
3337
3338       m_split = combine_split_insns (newpat, i3);
3339
3340       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
3341          inputs of NEWPAT.  */
3342
3343       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
3344          possible to try that as a scratch reg.  This would require adding
3345          more code to make it work though.  */
3346
3347       if (m_split == 0 && ! reg_overlap_mentioned_p (i2dest, newpat))
3348         {
3349           enum machine_mode new_mode = GET_MODE (SET_DEST (newpat));
3350
3351           /* First try to split using the original register as a
3352              scratch register.  */
3353           parallel = gen_rtx_PARALLEL (VOIDmode,
3354                                        gen_rtvec (2, newpat,
3355                                                   gen_rtx_CLOBBER (VOIDmode,
3356                                                                    i2dest)));
3357           m_split = combine_split_insns (parallel, i3);
3358
3359           /* If that didn't work, try changing the mode of I2DEST if
3360              we can.  */
3361           if (m_split == 0
3362               && new_mode != GET_MODE (i2dest)
3363               && new_mode != VOIDmode
3364               && can_change_dest_mode (i2dest, added_sets_2, new_mode))
3365             {
3366               enum machine_mode old_mode = GET_MODE (i2dest);
3367               rtx ni2dest;
3368
3369               if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3370                 ni2dest = gen_rtx_REG (new_mode, REGNO (i2dest));
3371               else
3372                 {
3373                   SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], new_mode);
3374                   ni2dest = regno_reg_rtx[REGNO (i2dest)];
3375                 }
3376
3377               parallel = (gen_rtx_PARALLEL
3378                           (VOIDmode,
3379                            gen_rtvec (2, newpat,
3380                                       gen_rtx_CLOBBER (VOIDmode,
3381                                                        ni2dest))));
3382               m_split = combine_split_insns (parallel, i3);
3383
3384               if (m_split == 0
3385                   && REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
3386                 {
3387                   struct undo *buf;
3388
3389                   adjust_reg_mode (regno_reg_rtx[REGNO (i2dest)], old_mode);
3390                   buf = undobuf.undos;
3391                   undobuf.undos = buf->next;
3392                   buf->next = undobuf.frees;
3393                   undobuf.frees = buf;
3394                 }
3395             }
3396
3397           i2scratch = m_split != 0;
3398         }
3399
3400       /* If recog_for_combine has discarded clobbers, try to use them
3401          again for the split.  */
3402       if (m_split == 0 && newpat_vec_with_clobbers)
3403         {
3404           parallel = gen_rtx_PARALLEL (VOIDmode, newpat_vec_with_clobbers);
3405           m_split = combine_split_insns (parallel, i3);
3406         }
3407
3408       if (m_split && NEXT_INSN (m_split) == NULL_RTX)
3409         {
3410           m_split = PATTERN (m_split);
3411           insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
3412           if (insn_code_number >= 0)
3413             newpat = m_split;
3414         }
3415       else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX
3416                && (next_real_insn (i2) == i3
3417                    || ! use_crosses_set_p (PATTERN (m_split), DF_INSN_LUID (i2))))
3418         {
3419           rtx i2set, i3set;
3420           rtx newi3pat = PATTERN (NEXT_INSN (m_split));
3421           newi2pat = PATTERN (m_split);
3422
3423           i3set = single_set (NEXT_INSN (m_split));
3424           i2set = single_set (m_split);
3425
3426           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3427
3428           /* If I2 or I3 has multiple SETs, we won't know how to track
3429              register status, so don't use these insns.  If I2's destination
3430              is used between I2 and I3, we also can't use these insns.  */
3431
3432           if (i2_code_number >= 0 && i2set && i3set
3433               && (next_real_insn (i2) == i3
3434                   || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
3435             insn_code_number = recog_for_combine (&newi3pat, i3,
3436                                                   &new_i3_notes);
3437           if (insn_code_number >= 0)
3438             newpat = newi3pat;
3439
3440           /* It is possible that both insns now set the destination of I3.
3441              If so, we must show an extra use of it.  */
3442
3443           if (insn_code_number >= 0)
3444             {
3445               rtx new_i3_dest = SET_DEST (i3set);
3446               rtx new_i2_dest = SET_DEST (i2set);
3447
3448               while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
3449                      || GET_CODE (new_i3_dest) == STRICT_LOW_PART
3450                      || GET_CODE (new_i3_dest) == SUBREG)
3451                 new_i3_dest = XEXP (new_i3_dest, 0);
3452
3453               while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
3454                      || GET_CODE (new_i2_dest) == STRICT_LOW_PART
3455                      || GET_CODE (new_i2_dest) == SUBREG)
3456                 new_i2_dest = XEXP (new_i2_dest, 0);
3457
3458               if (REG_P (new_i3_dest)
3459                   && REG_P (new_i2_dest)
3460                   && REGNO (new_i3_dest) == REGNO (new_i2_dest))
3461                 INC_REG_N_SETS (REGNO (new_i2_dest), 1);
3462             }
3463         }
3464
3465       /* If we can split it and use I2DEST, go ahead and see if that
3466          helps things be recognized.  Verify that none of the registers
3467          are set between I2 and I3.  */
3468       if (insn_code_number < 0
3469           && (split = find_split_point (&newpat, i3, false)) != 0
3470 #ifdef HAVE_cc0
3471           && REG_P (i2dest)
3472 #endif
3473           /* We need I2DEST in the proper mode.  If it is a hard register
3474              or the only use of a pseudo, we can change its mode.
3475              Make sure we don't change a hard register to have a mode that
3476              isn't valid for it, or change the number of registers.  */
3477           && (GET_MODE (*split) == GET_MODE (i2dest)
3478               || GET_MODE (*split) == VOIDmode
3479               || can_change_dest_mode (i2dest, added_sets_2,
3480                                        GET_MODE (*split)))
3481           && (next_real_insn (i2) == i3
3482               || ! use_crosses_set_p (*split, DF_INSN_LUID (i2)))
3483           /* We can't overwrite I2DEST if its value is still used by
3484              NEWPAT.  */
3485           && ! reg_referenced_p (i2dest, newpat))
3486         {
3487           rtx newdest = i2dest;
3488           enum rtx_code split_code = GET_CODE (*split);
3489           enum machine_mode split_mode = GET_MODE (*split);
3490           bool subst_done = false;
3491           newi2pat = NULL_RTX;
3492
3493           i2scratch = true;
3494
3495           /* *SPLIT may be part of I2SRC, so make sure we have the
3496              original expression around for later debug processing.
3497              We should not need I2SRC any more in other cases.  */
3498           if (MAY_HAVE_DEBUG_INSNS)
3499             i2src = copy_rtx (i2src);
3500           else
3501             i2src = NULL;
3502
3503           /* Get NEWDEST as a register in the proper mode.  We have already
3504              validated that we can do this.  */
3505           if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
3506             {
3507               if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3508                 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
3509               else
3510                 {
3511                   SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], split_mode);
3512                   newdest = regno_reg_rtx[REGNO (i2dest)];
3513                 }
3514             }
3515
3516           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
3517              an ASHIFT.  This can occur if it was inside a PLUS and hence
3518              appeared to be a memory address.  This is a kludge.  */
3519           if (split_code == MULT
3520               && CONST_INT_P (XEXP (*split, 1))
3521               && INTVAL (XEXP (*split, 1)) > 0
3522               && (i = exact_log2 (UINTVAL (XEXP (*split, 1)))) >= 0)
3523             {
3524               SUBST (*split, gen_rtx_ASHIFT (split_mode,
3525                                              XEXP (*split, 0), GEN_INT (i)));
3526               /* Update split_code because we may not have a multiply
3527                  anymore.  */
3528               split_code = GET_CODE (*split);
3529             }
3530
3531 #ifdef INSN_SCHEDULING
3532           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
3533              be written as a ZERO_EXTEND.  */
3534           if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
3535             {
3536 #ifdef LOAD_EXTEND_OP
3537               /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
3538                  what it really is.  */
3539               if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (*split)))
3540                   == SIGN_EXTEND)
3541                 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
3542                                                     SUBREG_REG (*split)));
3543               else
3544 #endif
3545                 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
3546                                                     SUBREG_REG (*split)));
3547             }
3548 #endif
3549
3550           /* Attempt to split binary operators using arithmetic identities.  */
3551           if (BINARY_P (SET_SRC (newpat))
3552               && split_mode == GET_MODE (SET_SRC (newpat))
3553               && ! side_effects_p (SET_SRC (newpat)))
3554             {
3555               rtx setsrc = SET_SRC (newpat);
3556               enum machine_mode mode = GET_MODE (setsrc);
3557               enum rtx_code code = GET_CODE (setsrc);
3558               rtx src_op0 = XEXP (setsrc, 0);
3559               rtx src_op1 = XEXP (setsrc, 1);
3560
3561               /* Split "X = Y op Y" as "Z = Y; X = Z op Z".  */
3562               if (rtx_equal_p (src_op0, src_op1))
3563                 {
3564                   newi2pat = gen_rtx_SET (VOIDmode, newdest, src_op0);
3565                   SUBST (XEXP (setsrc, 0), newdest);
3566                   SUBST (XEXP (setsrc, 1), newdest);
3567                   subst_done = true;
3568                 }
3569               /* Split "((P op Q) op R) op S" where op is PLUS or MULT.  */
3570               else if ((code == PLUS || code == MULT)
3571                        && GET_CODE (src_op0) == code
3572                        && GET_CODE (XEXP (src_op0, 0)) == code
3573                        && (INTEGRAL_MODE_P (mode)
3574                            || (FLOAT_MODE_P (mode)
3575                                && flag_unsafe_math_optimizations)))
3576                 {
3577                   rtx p = XEXP (XEXP (src_op0, 0), 0);
3578                   rtx q = XEXP (XEXP (src_op0, 0), 1);
3579                   rtx r = XEXP (src_op0, 1);
3580                   rtx s = src_op1;
3581
3582                   /* Split both "((X op Y) op X) op Y" and
3583                      "((X op Y) op Y) op X" as "T op T" where T is
3584                      "X op Y".  */
3585                   if ((rtx_equal_p (p,r) && rtx_equal_p (q,s))
3586                        || (rtx_equal_p (p,s) && rtx_equal_p (q,r)))
3587                     {
3588                       newi2pat = gen_rtx_SET (VOIDmode, newdest,
3589                                               XEXP (src_op0, 0));
3590                       SUBST (XEXP (setsrc, 0), newdest);
3591                       SUBST (XEXP (setsrc, 1), newdest);
3592                       subst_done = true;
3593                     }
3594                   /* Split "((X op X) op Y) op Y)" as "T op T" where
3595                      T is "X op Y".  */
3596                   else if (rtx_equal_p (p,q) && rtx_equal_p (r,s))
3597                     {
3598                       rtx tmp = simplify_gen_binary (code, mode, p, r);
3599                       newi2pat = gen_rtx_SET (VOIDmode, newdest, tmp);
3600                       SUBST (XEXP (setsrc, 0), newdest);
3601                       SUBST (XEXP (setsrc, 1), newdest);
3602                       subst_done = true;
3603                     }
3604                 }
3605             }
3606
3607           if (!subst_done)
3608             {
3609               newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
3610               SUBST (*split, newdest);
3611             }
3612
3613           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3614
3615           /* recog_for_combine might have added CLOBBERs to newi2pat.
3616              Make sure NEWPAT does not depend on the clobbered regs.  */
3617           if (GET_CODE (newi2pat) == PARALLEL)
3618             for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3619               if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3620                 {
3621                   rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3622                   if (reg_overlap_mentioned_p (reg, newpat))
3623                     {
3624                       undo_all ();
3625                       return 0;
3626                     }
3627                 }
3628
3629           /* If the split point was a MULT and we didn't have one before,
3630              don't use one now.  */
3631           if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
3632             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3633         }
3634     }
3635
3636   /* Check for a case where we loaded from memory in a narrow mode and
3637      then sign extended it, but we need both registers.  In that case,
3638      we have a PARALLEL with both loads from the same memory location.
3639      We can split this into a load from memory followed by a register-register
3640      copy.  This saves at least one insn, more if register allocation can
3641      eliminate the copy.
3642
3643      We cannot do this if the destination of the first assignment is a
3644      condition code register or cc0.  We eliminate this case by making sure
3645      the SET_DEST and SET_SRC have the same mode.
3646
3647      We cannot do this if the destination of the second assignment is
3648      a register that we have already assumed is zero-extended.  Similarly
3649      for a SUBREG of such a register.  */
3650
3651   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3652            && GET_CODE (newpat) == PARALLEL
3653            && XVECLEN (newpat, 0) == 2
3654            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3655            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
3656            && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
3657                == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
3658            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3659            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3660                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
3661            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3662                                    DF_INSN_LUID (i2))
3663            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3664            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3665            && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
3666                  (REG_P (temp)
3667                   && VEC_index (reg_stat_type, reg_stat,
3668                                 REGNO (temp))->nonzero_bits != 0
3669                   && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
3670                   && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
3671                   && (VEC_index (reg_stat_type, reg_stat,
3672                                  REGNO (temp))->nonzero_bits
3673                       != GET_MODE_MASK (word_mode))))
3674            && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
3675                  && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
3676                      (REG_P (temp)
3677                       && VEC_index (reg_stat_type, reg_stat,
3678                                     REGNO (temp))->nonzero_bits != 0
3679                       && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
3680                       && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
3681                       && (VEC_index (reg_stat_type, reg_stat,
3682                                      REGNO (temp))->nonzero_bits
3683                           != GET_MODE_MASK (word_mode)))))
3684            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3685                                          SET_SRC (XVECEXP (newpat, 0, 1)))
3686            && ! find_reg_note (i3, REG_UNUSED,
3687                                SET_DEST (XVECEXP (newpat, 0, 0))))
3688     {
3689       rtx ni2dest;
3690
3691       newi2pat = XVECEXP (newpat, 0, 0);
3692       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
3693       newpat = XVECEXP (newpat, 0, 1);
3694       SUBST (SET_SRC (newpat),
3695              gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
3696       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3697
3698       if (i2_code_number >= 0)
3699         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3700
3701       if (insn_code_number >= 0)
3702         swap_i2i3 = 1;
3703     }
3704
3705   /* Similarly, check for a case where we have a PARALLEL of two independent
3706      SETs but we started with three insns.  In this case, we can do the sets
3707      as two separate insns.  This case occurs when some SET allows two
3708      other insns to combine, but the destination of that SET is still live.  */
3709
3710   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3711            && GET_CODE (newpat) == PARALLEL
3712            && XVECLEN (newpat, 0) == 2
3713            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3714            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
3715            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
3716            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3717            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3718            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3719            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3720                                   XVECEXP (newpat, 0, 0))
3721            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
3722                                   XVECEXP (newpat, 0, 1))
3723            && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
3724                  && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
3725     {
3726       /* Normally, it doesn't matter which of the two is done first,
3727          but the one that references cc0 can't be the second, and
3728          one which uses any regs/memory set in between i2 and i3 can't
3729          be first.  */
3730       if (!use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3731                               DF_INSN_LUID (i2))
3732 #ifdef HAVE_cc0
3733           && !reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0))
3734 #endif
3735          )
3736         {
3737           newi2pat = XVECEXP (newpat, 0, 1);
3738           newpat = XVECEXP (newpat, 0, 0);
3739         }
3740       else if (!use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 0)),
3741                                    DF_INSN_LUID (i2))
3742 #ifdef HAVE_cc0
3743                && !reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 1))
3744 #endif
3745               )
3746         {
3747           newi2pat = XVECEXP (newpat, 0, 0);
3748           newpat = XVECEXP (newpat, 0, 1);
3749         }
3750       else
3751         {
3752           undo_all ();
3753           return 0;
3754         }
3755
3756       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3757
3758       if (i2_code_number >= 0)
3759         {
3760           /* recog_for_combine might have added CLOBBERs to newi2pat.
3761              Make sure NEWPAT does not depend on the clobbered regs.  */
3762           if (GET_CODE (newi2pat) == PARALLEL)
3763             {
3764               for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3765                 if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3766                   {
3767                     rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3768                     if (reg_overlap_mentioned_p (reg, newpat))
3769                       {
3770                         undo_all ();
3771                         return 0;
3772                       }
3773                   }
3774             }
3775
3776           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3777         }
3778     }
3779
3780   /* If it still isn't recognized, fail and change things back the way they
3781      were.  */
3782   if ((insn_code_number < 0
3783        /* Is the result a reasonable ASM_OPERANDS?  */
3784        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
3785     {
3786       undo_all ();
3787       return 0;
3788     }
3789
3790   /* If we had to change another insn, make sure it is valid also.  */
3791   if (undobuf.other_insn)
3792     {
3793       CLEAR_HARD_REG_SET (newpat_used_regs);
3794
3795       other_pat = PATTERN (undobuf.other_insn);
3796       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
3797                                              &new_other_notes);
3798
3799       if (other_code_number < 0 && ! check_asm_operands (other_pat))
3800         {
3801           undo_all ();
3802           return 0;
3803         }
3804     }
3805
3806 #ifdef HAVE_cc0
3807   /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
3808      they are adjacent to each other or not.  */
3809   {
3810     rtx p = prev_nonnote_insn (i3);
3811     if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
3812         && sets_cc0_p (newi2pat))
3813       {
3814         undo_all ();
3815         return 0;
3816       }
3817   }
3818 #endif
3819
3820   /* Only allow this combination if insn_rtx_costs reports that the
3821      replacement instructions are cheaper than the originals.  */
3822   if (!combine_validate_cost (i0, i1, i2, i3, newpat, newi2pat, other_pat))
3823     {
3824       undo_all ();
3825       return 0;
3826     }
3827
3828   if (MAY_HAVE_DEBUG_INSNS)
3829     {
3830       struct undo *undo;
3831
3832       for (undo = undobuf.undos; undo; undo = undo->next)
3833         if (undo->kind == UNDO_MODE)
3834           {
3835             rtx reg = *undo->where.r;
3836             enum machine_mode new_mode = GET_MODE (reg);
3837             enum machine_mode old_mode = undo->old_contents.m;
3838
3839             /* Temporarily revert mode back.  */
3840             adjust_reg_mode (reg, old_mode);
3841
3842             if (reg == i2dest && i2scratch)
3843               {
3844                 /* If we used i2dest as a scratch register with a
3845                    different mode, substitute it for the original
3846                    i2src while its original mode is temporarily
3847                    restored, and then clear i2scratch so that we don't
3848                    do it again later.  */
3849                 propagate_for_debug (i2, i3, reg, i2src);
3850                 i2scratch = false;
3851                 /* Put back the new mode.  */
3852                 adjust_reg_mode (reg, new_mode);
3853               }
3854             else
3855               {
3856                 rtx tempreg = gen_raw_REG (old_mode, REGNO (reg));
3857                 rtx first, last;
3858
3859                 if (reg == i2dest)
3860                   {
3861                     first = i2;
3862                     last = i3;
3863                   }
3864                 else
3865                   {
3866                     first = i3;
3867                     last = undobuf.other_insn;
3868                     gcc_assert (last);
3869                   }
3870
3871                 /* We're dealing with a reg that changed mode but not
3872                    meaning, so we want to turn it into a subreg for
3873                    the new mode.  However, because of REG sharing and
3874                    because its mode had already changed, we have to do
3875                    it in two steps.  First, replace any debug uses of
3876                    reg, with its original mode temporarily restored,
3877                    with this copy we have created; then, replace the
3878                    copy with the SUBREG of the original shared reg,
3879                    once again changed to the new mode.  */
3880                 propagate_for_debug (first, last, reg, tempreg);
3881                 adjust_reg_mode (reg, new_mode);
3882                 propagate_for_debug (first, last, tempreg,
3883                                      lowpart_subreg (old_mode, reg, new_mode));
3884               }
3885           }
3886     }
3887
3888   /* If we will be able to accept this, we have made a
3889      change to the destination of I3.  This requires us to
3890      do a few adjustments.  */
3891
3892   if (changed_i3_dest)
3893     {
3894       PATTERN (i3) = newpat;
3895       adjust_for_new_dest (i3);
3896     }
3897
3898   /* We now know that we can do this combination.  Merge the insns and
3899      update the status of registers and LOG_LINKS.  */
3900
3901   if (undobuf.other_insn)
3902     {
3903       rtx note, next;
3904
3905       PATTERN (undobuf.other_insn) = other_pat;
3906
3907       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
3908          are still valid.  Then add any non-duplicate notes added by
3909          recog_for_combine.  */
3910       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
3911         {
3912           next = XEXP (note, 1);
3913
3914           if (REG_NOTE_KIND (note) == REG_UNUSED
3915               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
3916             remove_note (undobuf.other_insn, note);
3917         }
3918
3919       distribute_notes (new_other_notes, undobuf.other_insn,
3920                         undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX,
3921                         NULL_RTX);
3922     }
3923
3924   if (swap_i2i3)
3925     {
3926       rtx insn;
3927       rtx link;
3928       rtx ni2dest;
3929
3930       /* I3 now uses what used to be its destination and which is now
3931          I2's destination.  This requires us to do a few adjustments.  */
3932       PATTERN (i3) = newpat;
3933       adjust_for_new_dest (i3);
3934
3935       /* We need a LOG_LINK from I3 to I2.  But we used to have one,
3936          so we still will.
3937
3938          However, some later insn might be using I2's dest and have
3939          a LOG_LINK pointing at I3.  We must remove this link.
3940          The simplest way to remove the link is to point it at I1,
3941          which we know will be a NOTE.  */
3942
3943       /* newi2pat is usually a SET here; however, recog_for_combine might
3944          have added some clobbers.  */
3945       if (GET_CODE (newi2pat) == PARALLEL)
3946         ni2dest = SET_DEST (XVECEXP (newi2pat, 0, 0));
3947       else
3948         ni2dest = SET_DEST (newi2pat);
3949
3950       for (insn = NEXT_INSN (i3);
3951            insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
3952                     || insn != BB_HEAD (this_basic_block->next_bb));
3953            insn = NEXT_INSN (insn))
3954         {
3955           if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
3956             {
3957               for (link = LOG_LINKS (insn); link;
3958                    link = XEXP (link, 1))
3959                 if (XEXP (link, 0) == i3)
3960                   XEXP (link, 0) = i1;
3961
3962               break;
3963             }
3964         }
3965     }
3966
3967   {
3968     rtx i3notes, i2notes, i1notes = 0, i0notes = 0;
3969     rtx i3links, i2links, i1links = 0, i0links = 0;
3970     rtx midnotes = 0;
3971     int from_luid;
3972     unsigned int regno;
3973     /* Compute which registers we expect to eliminate.  newi2pat may be setting
3974        either i3dest or i2dest, so we must check it.  Also, i1dest may be the
3975        same as i3dest, in which case newi2pat may be setting i1dest.  */
3976     rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
3977                    || i2dest_in_i2src || i2dest_in_i1src || i2dest_in_i0src
3978                    || !i2dest_killed
3979                    ? 0 : i2dest);
3980     rtx elim_i1 = (i1 == 0 || i1dest_in_i1src || i1dest_in_i0src
3981                    || (newi2pat && reg_set_p (i1dest, newi2pat))
3982                    || !i1dest_killed
3983                    ? 0 : i1dest);
3984     rtx elim_i0 = (i0 == 0 || i0dest_in_i0src
3985                    || (newi2pat && reg_set_p (i0dest, newi2pat))
3986                    || !i0dest_killed
3987                    ? 0 : i0dest);
3988
3989     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
3990        clear them.  */
3991     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
3992     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
3993     if (i1)
3994       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
3995     if (i0)
3996       i0notes = REG_NOTES (i0), i0links = LOG_LINKS (i0);
3997
3998     /* Ensure that we do not have something that should not be shared but
3999        occurs multiple times in the new insns.  Check this by first
4000        resetting all the `used' flags and then copying anything is shared.  */
4001
4002     reset_used_flags (i3notes);
4003     reset_used_flags (i2notes);
4004     reset_used_flags (i1notes);
4005     reset_used_flags (i0notes);
4006     reset_used_flags (newpat);
4007     reset_used_flags (newi2pat);
4008     if (undobuf.other_insn)
4009       reset_used_flags (PATTERN (undobuf.other_insn));
4010
4011     i3notes = copy_rtx_if_shared (i3notes);
4012     i2notes = copy_rtx_if_shared (i2notes);
4013     i1notes = copy_rtx_if_shared (i1notes);
4014     i0notes = copy_rtx_if_shared (i0notes);
4015     newpat = copy_rtx_if_shared (newpat);
4016     newi2pat = copy_rtx_if_shared (newi2pat);
4017     if (undobuf.other_insn)
4018       reset_used_flags (PATTERN (undobuf.other_insn));
4019
4020     INSN_CODE (i3) = insn_code_number;
4021     PATTERN (i3) = newpat;
4022
4023     if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
4024       {
4025         rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
4026
4027         reset_used_flags (call_usage);
4028         call_usage = copy_rtx (call_usage);
4029
4030         if (substed_i2)
4031           {
4032             /* I2SRC must still be meaningful at this point.  Some splitting
4033                operations can invalidate I2SRC, but those operations do not
4034                apply to calls.  */
4035             gcc_assert (i2src);
4036             replace_rtx (call_usage, i2dest, i2src);
4037           }
4038
4039         if (substed_i1)
4040           replace_rtx (call_usage, i1dest, i1src);
4041         if (substed_i0)
4042           replace_rtx (call_usage, i0dest, i0src);
4043
4044         CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
4045       }
4046
4047     if (undobuf.other_insn)
4048       INSN_CODE (undobuf.other_insn) = other_code_number;
4049
4050     /* We had one special case above where I2 had more than one set and
4051        we replaced a destination of one of those sets with the destination
4052        of I3.  In that case, we have to update LOG_LINKS of insns later
4053        in this basic block.  Note that this (expensive) case is rare.
4054
4055        Also, in this case, we must pretend that all REG_NOTEs for I2
4056        actually came from I3, so that REG_UNUSED notes from I2 will be
4057        properly handled.  */
4058
4059     if (i3_subst_into_i2)
4060       {
4061         for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
4062           if ((GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == SET
4063                || GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == CLOBBER)
4064               && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
4065               && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
4066               && ! find_reg_note (i2, REG_UNUSED,
4067                                   SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
4068             for (temp = NEXT_INSN (i2);
4069                  temp && (this_basic_block->next_bb == EXIT_BLOCK_PTR
4070                           || BB_HEAD (this_basic_block) != temp);
4071                  temp = NEXT_INSN (temp))
4072               if (temp != i3 && INSN_P (temp))
4073                 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
4074                   if (XEXP (link, 0) == i2)
4075                     XEXP (link, 0) = i3;
4076
4077         if (i3notes)
4078           {
4079             rtx link = i3notes;
4080             while (XEXP (link, 1))
4081               link = XEXP (link, 1);
4082             XEXP (link, 1) = i2notes;
4083           }
4084         else
4085           i3notes = i2notes;
4086         i2notes = 0;
4087       }
4088
4089     LOG_LINKS (i3) = 0;
4090     REG_NOTES (i3) = 0;
4091     LOG_LINKS (i2) = 0;
4092     REG_NOTES (i2) = 0;
4093
4094     if (newi2pat)
4095       {
4096         if (MAY_HAVE_DEBUG_INSNS && i2scratch)
4097           propagate_for_debug (i2, i3, i2dest, i2src);
4098         INSN_CODE (i2) = i2_code_number;
4099         PATTERN (i2) = newi2pat;
4100       }
4101     else
4102       {
4103         if (MAY_HAVE_DEBUG_INSNS && i2src)
4104           propagate_for_debug (i2, i3, i2dest, i2src);
4105         SET_INSN_DELETED (i2);
4106       }
4107
4108     if (i1)
4109       {
4110         LOG_LINKS (i1) = 0;
4111         REG_NOTES (i1) = 0;
4112         if (MAY_HAVE_DEBUG_INSNS)
4113           propagate_for_debug (i1, i3, i1dest, i1src);
4114         SET_INSN_DELETED (i1);
4115       }
4116
4117     if (i0)
4118       {
4119         LOG_LINKS (i0) = 0;
4120         REG_NOTES (i0) = 0;
4121         if (MAY_HAVE_DEBUG_INSNS)
4122           propagate_for_debug (i0, i3, i0dest, i0src);
4123         SET_INSN_DELETED (i0);
4124       }
4125
4126     /* Get death notes for everything that is now used in either I3 or
4127        I2 and used to die in a previous insn.  If we built two new
4128        patterns, move from I1 to I2 then I2 to I3 so that we get the
4129        proper movement on registers that I2 modifies.  */
4130
4131     if (i0)
4132       from_luid = DF_INSN_LUID (i0);
4133     else if (i1)
4134       from_luid = DF_INSN_LUID (i1);
4135     else
4136       from_luid = DF_INSN_LUID (i2);
4137     if (newi2pat)
4138       move_deaths (newi2pat, NULL_RTX, from_luid, i2, &midnotes);
4139     move_deaths (newpat, newi2pat, from_luid, i3, &midnotes);
4140
4141     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
4142     if (i3notes)
4143       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
4144                         elim_i2, elim_i1, elim_i0);
4145     if (i2notes)
4146       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
4147                         elim_i2, elim_i1, elim_i0);
4148     if (i1notes)
4149       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
4150                         elim_i2, elim_i1, elim_i0);
4151     if (i0notes)
4152       distribute_notes (i0notes, i0, i3, newi2pat ? i2 : NULL_RTX,
4153                         elim_i2, elim_i1, elim_i0);
4154     if (midnotes)
4155       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4156                         elim_i2, elim_i1, elim_i0);
4157
4158     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
4159        know these are REG_UNUSED and want them to go to the desired insn,
4160        so we always pass it as i3.  */
4161
4162     if (newi2pat && new_i2_notes)
4163       distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX,
4164                         NULL_RTX);
4165
4166     if (new_i3_notes)
4167       distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX,
4168                         NULL_RTX);
4169
4170     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
4171        put a REG_DEAD note for it somewhere.  If NEWI2PAT exists and sets
4172        I3DEST, the death must be somewhere before I2, not I3.  If we passed I3
4173        in that case, it might delete I2.  Similarly for I2 and I1.
4174        Show an additional death due to the REG_DEAD note we make here.  If
4175        we discard it in distribute_notes, we will decrement it again.  */
4176
4177     if (i3dest_killed)
4178       {
4179         if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
4180           distribute_notes (alloc_reg_note (REG_DEAD, i3dest_killed,
4181                                             NULL_RTX),
4182                             NULL_RTX, i2, NULL_RTX, elim_i2, elim_i1, elim_i0);
4183         else
4184           distribute_notes (alloc_reg_note (REG_DEAD, i3dest_killed,
4185                                             NULL_RTX),
4186                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4187                             elim_i2, elim_i1, elim_i0);
4188       }
4189
4190     if (i2dest_in_i2src)
4191       {
4192         rtx new_note = alloc_reg_note (REG_DEAD, i2dest, NULL_RTX);
4193         if (newi2pat && reg_set_p (i2dest, newi2pat))
4194           distribute_notes (new_note,  NULL_RTX, i2, NULL_RTX, NULL_RTX,
4195                             NULL_RTX, NULL_RTX);
4196         else
4197           distribute_notes (new_note, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4198                             NULL_RTX, NULL_RTX, NULL_RTX);
4199       }
4200
4201     if (i1dest_in_i1src)
4202       {
4203         rtx new_note = alloc_reg_note (REG_DEAD, i1dest, NULL_RTX);
4204         if (newi2pat && reg_set_p (i1dest, newi2pat))
4205           distribute_notes (new_note, NULL_RTX, i2, NULL_RTX, NULL_RTX,
4206                             NULL_RTX, NULL_RTX);
4207         else
4208           distribute_notes (new_note, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4209                             NULL_RTX, NULL_RTX, NULL_RTX);
4210       }
4211
4212     if (i0dest_in_i0src)
4213       {
4214         rtx new_note = alloc_reg_note (REG_DEAD, i0dest, NULL_RTX);
4215         if (newi2pat && reg_set_p (i0dest, newi2pat))
4216           distribute_notes (new_note, NULL_RTX, i2, NULL_RTX, NULL_RTX,
4217                             NULL_RTX, NULL_RTX);
4218         else
4219           distribute_notes (new_note, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4220                             NULL_RTX, NULL_RTX, NULL_RTX);
4221       }
4222
4223     distribute_links (i3links);
4224     distribute_links (i2links);
4225     distribute_links (i1links);
4226     distribute_links (i0links);
4227
4228     if (REG_P (i2dest))
4229       {
4230         rtx link;
4231         rtx i2_insn = 0, i2_val = 0, set;
4232
4233         /* The insn that used to set this register doesn't exist, and
4234            this life of the register may not exist either.  See if one of
4235            I3's links points to an insn that sets I2DEST.  If it does,
4236            that is now the last known value for I2DEST. If we don't update
4237            this and I2 set the register to a value that depended on its old
4238            contents, we will get confused.  If this insn is used, thing
4239            will be set correctly in combine_instructions.  */
4240
4241         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
4242           if ((set = single_set (XEXP (link, 0))) != 0
4243               && rtx_equal_p (i2dest, SET_DEST (set)))
4244             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
4245
4246         record_value_for_reg (i2dest, i2_insn, i2_val);
4247
4248         /* If the reg formerly set in I2 died only once and that was in I3,
4249            zero its use count so it won't make `reload' do any work.  */
4250         if (! added_sets_2
4251             && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
4252             && ! i2dest_in_i2src)
4253           {
4254             regno = REGNO (i2dest);
4255             INC_REG_N_SETS (regno, -1);
4256           }
4257       }
4258
4259     if (i1 && REG_P (i1dest))
4260       {
4261         rtx link;
4262         rtx i1_insn = 0, i1_val = 0, set;
4263
4264         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
4265           if ((set = single_set (XEXP (link, 0))) != 0
4266               && rtx_equal_p (i1dest, SET_DEST (set)))
4267             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
4268
4269         record_value_for_reg (i1dest, i1_insn, i1_val);
4270
4271         regno = REGNO (i1dest);
4272         if (! added_sets_1 && ! i1dest_in_i1src)
4273           INC_REG_N_SETS (regno, -1);
4274       }
4275
4276     if (i0 && REG_P (i0dest))
4277       {
4278         rtx link;
4279         rtx i0_insn = 0, i0_val = 0, set;
4280
4281         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
4282           if ((set = single_set (XEXP (link, 0))) != 0
4283               && rtx_equal_p (i0dest, SET_DEST (set)))
4284             i0_insn = XEXP (link, 0), i0_val = SET_SRC (set);
4285
4286         record_value_for_reg (i0dest, i0_insn, i0_val);
4287
4288         regno = REGNO (i0dest);
4289         if (! added_sets_0 && ! i0dest_in_i0src)
4290           INC_REG_N_SETS (regno, -1);
4291       }
4292
4293     /* Update reg_stat[].nonzero_bits et al for any changes that may have
4294        been made to this insn.  The order of
4295        set_nonzero_bits_and_sign_copies() is important.  Because newi2pat
4296        can affect nonzero_bits of newpat */
4297     if (newi2pat)
4298       note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
4299     note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
4300   }
4301
4302   if (undobuf.other_insn != NULL_RTX)
4303     {
4304       if (dump_file)
4305         {
4306           fprintf (dump_file, "modifying other_insn ");
4307           dump_insn_slim (dump_file, undobuf.other_insn);
4308         }
4309       df_insn_rescan (undobuf.other_insn);
4310     }
4311
4312   if (i0 && !(NOTE_P(i0) && (NOTE_KIND (i0) == NOTE_INSN_DELETED)))
4313     {
4314       if (dump_file)
4315         {
4316           fprintf (dump_file, "modifying insn i1 ");
4317           dump_insn_slim (dump_file, i0);
4318         }
4319       df_insn_rescan (i0);
4320     }
4321
4322   if (i1 && !(NOTE_P(i1) && (NOTE_KIND (i1) == NOTE_INSN_DELETED)))
4323     {
4324       if (dump_file)
4325         {
4326           fprintf (dump_file, "modifying insn i1 ");
4327           dump_insn_slim (dump_file, i1);
4328         }
4329       df_insn_rescan (i1);
4330     }
4331
4332   if (i2 && !(NOTE_P(i2) && (NOTE_KIND (i2) == NOTE_INSN_DELETED)))
4333     {
4334       if (dump_file)
4335         {
4336           fprintf (dump_file, "modifying insn i2 ");
4337           dump_insn_slim (dump_file, i2);
4338         }
4339       df_insn_rescan (i2);
4340     }
4341
4342   if (i3 && !(NOTE_P(i3) && (NOTE_KIND (i3) == NOTE_INSN_DELETED)))
4343     {
4344       if (dump_file)
4345         {
4346           fprintf (dump_file, "modifying insn i3 ");
4347           dump_insn_slim (dump_file, i3);
4348         }
4349       df_insn_rescan (i3);
4350     }
4351
4352   /* Set new_direct_jump_p if a new return or simple jump instruction
4353      has been created.  Adjust the CFG accordingly.  */
4354
4355   if (returnjump_p (i3) || any_uncondjump_p (i3))
4356     {
4357       *new_direct_jump_p = 1;
4358       mark_jump_label (PATTERN (i3), i3, 0);
4359       update_cfg_for_uncondjump (i3);
4360     }
4361
4362   if (undobuf.other_insn != NULL_RTX
4363       && (returnjump_p (undobuf.other_insn)
4364           || any_uncondjump_p (undobuf.other_insn)))
4365     {
4366       *new_direct_jump_p = 1;
4367       update_cfg_for_uncondjump (undobuf.other_insn);
4368     }
4369
4370   /* A noop might also need cleaning up of CFG, if it comes from the
4371      simplification of a jump.  */
4372   if (GET_CODE (newpat) == SET
4373       && SET_SRC (newpat) == pc_rtx
4374       && SET_DEST (newpat) == pc_rtx)
4375     {
4376       *new_direct_jump_p = 1;
4377       update_cfg_for_uncondjump (i3);
4378     }
4379
4380   combine_successes++;
4381   undo_commit ();
4382
4383   if (added_links_insn
4384       && (newi2pat == 0 || DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i2))
4385       && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i3))
4386     return added_links_insn;
4387   else
4388     return newi2pat ? i2 : i3;
4389 }
4390 \f
4391 /* Undo all the modifications recorded in undobuf.  */
4392
4393 static void
4394 undo_all (void)
4395 {
4396   struct undo *undo, *next;
4397
4398   for (undo = undobuf.undos; undo; undo = next)
4399     {
4400       next = undo->next;
4401       switch (undo->kind)
4402         {
4403         case UNDO_RTX:
4404           *undo->where.r = undo->old_contents.r;
4405           break;
4406         case UNDO_INT:
4407           *undo->where.i = undo->old_contents.i;
4408           break;
4409         case UNDO_MODE:
4410           adjust_reg_mode (*undo->where.r, undo->old_contents.m);
4411           break;
4412         default:
4413           gcc_unreachable ();
4414         }
4415
4416       undo->next = undobuf.frees;
4417       undobuf.frees = undo;
4418     }
4419
4420   undobuf.undos = 0;
4421 }
4422
4423 /* We've committed to accepting the changes we made.  Move all
4424    of the undos to the free list.  */
4425
4426 static void
4427 undo_commit (void)
4428 {
4429   struct undo *undo, *next;
4430
4431   for (undo = undobuf.undos; undo; undo = next)
4432     {
4433       next = undo->next;
4434       undo->next = undobuf.frees;
4435       undobuf.frees = undo;
4436     }
4437   undobuf.undos = 0;
4438 }
4439 \f
4440 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
4441    where we have an arithmetic expression and return that point.  LOC will
4442    be inside INSN.
4443
4444    try_combine will call this function to see if an insn can be split into
4445    two insns.  */
4446
4447 static rtx *
4448 find_split_point (rtx *loc, rtx insn, bool set_src)
4449 {
4450   rtx x = *loc;
4451   enum rtx_code code = GET_CODE (x);
4452   rtx *split;
4453   unsigned HOST_WIDE_INT len = 0;
4454   HOST_WIDE_INT pos = 0;
4455   int unsignedp = 0;
4456   rtx inner = NULL_RTX;
4457
4458   /* First special-case some codes.  */
4459   switch (code)
4460     {
4461     case SUBREG:
4462 #ifdef INSN_SCHEDULING
4463       /* If we are making a paradoxical SUBREG invalid, it becomes a split
4464          point.  */
4465       if (MEM_P (SUBREG_REG (x)))
4466         return loc;
4467 #endif
4468       return find_split_point (&SUBREG_REG (x), insn, false);
4469
4470     case MEM:
4471 #ifdef HAVE_lo_sum
4472       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
4473          using LO_SUM and HIGH.  */
4474       if (GET_CODE (XEXP (x, 0)) == CONST
4475           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
4476         {
4477           enum machine_mode address_mode
4478             = targetm.addr_space.address_mode (MEM_ADDR_SPACE (x));
4479
4480           SUBST (XEXP (x, 0),
4481                  gen_rtx_LO_SUM (address_mode,
4482                                  gen_rtx_HIGH (address_mode, XEXP (x, 0)),
4483                                  XEXP (x, 0)));
4484           return &XEXP (XEXP (x, 0), 0);
4485         }
4486 #endif
4487
4488       /* If we have a PLUS whose second operand is a constant and the
4489          address is not valid, perhaps will can split it up using
4490          the machine-specific way to split large constants.  We use
4491          the first pseudo-reg (one of the virtual regs) as a placeholder;
4492          it will not remain in the result.  */
4493       if (GET_CODE (XEXP (x, 0)) == PLUS
4494           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
4495           && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4496                                             MEM_ADDR_SPACE (x)))
4497         {
4498           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
4499           rtx seq = combine_split_insns (gen_rtx_SET (VOIDmode, reg,
4500                                                       XEXP (x, 0)),
4501                                          subst_insn);
4502
4503           /* This should have produced two insns, each of which sets our
4504              placeholder.  If the source of the second is a valid address,
4505              we can make put both sources together and make a split point
4506              in the middle.  */
4507
4508           if (seq
4509               && NEXT_INSN (seq) != NULL_RTX
4510               && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
4511               && NONJUMP_INSN_P (seq)
4512               && GET_CODE (PATTERN (seq)) == SET
4513               && SET_DEST (PATTERN (seq)) == reg
4514               && ! reg_mentioned_p (reg,
4515                                     SET_SRC (PATTERN (seq)))
4516               && NONJUMP_INSN_P (NEXT_INSN (seq))
4517               && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
4518               && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
4519               && memory_address_addr_space_p
4520                    (GET_MODE (x), SET_SRC (PATTERN (NEXT_INSN (seq))),
4521                     MEM_ADDR_SPACE (x)))
4522             {
4523               rtx src1 = SET_SRC (PATTERN (seq));
4524               rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
4525
4526               /* Replace the placeholder in SRC2 with SRC1.  If we can
4527                  find where in SRC2 it was placed, that can become our
4528                  split point and we can replace this address with SRC2.
4529                  Just try two obvious places.  */
4530
4531               src2 = replace_rtx (src2, reg, src1);
4532               split = 0;
4533               if (XEXP (src2, 0) == src1)
4534                 split = &XEXP (src2, 0);
4535               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
4536                        && XEXP (XEXP (src2, 0), 0) == src1)
4537                 split = &XEXP (XEXP (src2, 0), 0);
4538
4539               if (split)
4540                 {
4541                   SUBST (XEXP (x, 0), src2);
4542                   return split;
4543                 }
4544             }
4545
4546           /* If that didn't work, perhaps the first operand is complex and
4547              needs to be computed separately, so make a split point there.
4548              This will occur on machines that just support REG + CONST
4549              and have a constant moved through some previous computation.  */
4550
4551           else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
4552                    && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4553                          && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4554             return &XEXP (XEXP (x, 0), 0);
4555         }
4556
4557       /* If we have a PLUS whose first operand is complex, try computing it
4558          separately by making a split there.  */
4559       if (GET_CODE (XEXP (x, 0)) == PLUS
4560           && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4561                                             MEM_ADDR_SPACE (x))
4562           && ! OBJECT_P (XEXP (XEXP (x, 0), 0))
4563           && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4564                 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4565         return &XEXP (XEXP (x, 0), 0);
4566       break;
4567
4568     case SET:
4569 #ifdef HAVE_cc0
4570       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
4571          ZERO_EXTRACT, the most likely reason why this doesn't match is that
4572          we need to put the operand into a register.  So split at that
4573          point.  */
4574
4575       if (SET_DEST (x) == cc0_rtx
4576           && GET_CODE (SET_SRC (x)) != COMPARE
4577           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
4578           && !OBJECT_P (SET_SRC (x))
4579           && ! (GET_CODE (SET_SRC (x)) == SUBREG
4580                 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
4581         return &SET_SRC (x);
4582 #endif
4583
4584       /* See if we can split SET_SRC as it stands.  */
4585       split = find_split_point (&SET_SRC (x), insn, true);
4586       if (split && split != &SET_SRC (x))
4587         return split;
4588
4589       /* See if we can split SET_DEST as it stands.  */
4590       split = find_split_point (&SET_DEST (x), insn, false);
4591       if (split && split != &SET_DEST (x))
4592         return split;
4593
4594       /* See if this is a bitfield assignment with everything constant.  If
4595          so, this is an IOR of an AND, so split it into that.  */
4596       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
4597           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
4598               <= HOST_BITS_PER_WIDE_INT)
4599           && CONST_INT_P (XEXP (SET_DEST (x), 1))
4600           && CONST_INT_P (XEXP (SET_DEST (x), 2))
4601           && CONST_INT_P (SET_SRC (x))
4602           && ((INTVAL (XEXP (SET_DEST (x), 1))
4603                + INTVAL (XEXP (SET_DEST (x), 2)))
4604               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
4605           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
4606         {
4607           HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
4608           unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
4609           unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
4610           rtx dest = XEXP (SET_DEST (x), 0);
4611           enum machine_mode mode = GET_MODE (dest);
4612           unsigned HOST_WIDE_INT mask
4613             = ((unsigned HOST_WIDE_INT) 1 << len) - 1;
4614           rtx or_mask;
4615
4616           if (BITS_BIG_ENDIAN)
4617             pos = GET_MODE_BITSIZE (mode) - len - pos;
4618
4619           or_mask = gen_int_mode (src << pos, mode);
4620           if (src == mask)
4621             SUBST (SET_SRC (x),
4622                    simplify_gen_binary (IOR, mode, dest, or_mask));
4623           else
4624             {
4625               rtx negmask = gen_int_mode (~(mask << pos), mode);
4626               SUBST (SET_SRC (x),
4627                      simplify_gen_binary (IOR, mode,
4628                                           simplify_gen_binary (AND, mode,
4629                                                                dest, negmask),
4630                                           or_mask));
4631             }
4632
4633           SUBST (SET_DEST (x), dest);
4634
4635           split = find_split_point (&SET_SRC (x), insn, true);
4636           if (split && split != &SET_SRC (x))
4637             return split;
4638         }
4639
4640       /* Otherwise, see if this is an operation that we can split into two.
4641          If so, try to split that.  */
4642       code = GET_CODE (SET_SRC (x));
4643
4644       switch (code)
4645         {
4646         case AND:
4647           /* If we are AND'ing with a large constant that is only a single
4648              bit and the result is only being used in a context where we
4649              need to know if it is zero or nonzero, replace it with a bit
4650              extraction.  This will avoid the large constant, which might
4651              have taken more than one insn to make.  If the constant were
4652              not a valid argument to the AND but took only one insn to make,
4653              this is no worse, but if it took more than one insn, it will
4654              be better.  */
4655
4656           if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4657               && REG_P (XEXP (SET_SRC (x), 0))
4658               && (pos = exact_log2 (UINTVAL (XEXP (SET_SRC (x), 1)))) >= 7
4659               && REG_P (SET_DEST (x))
4660               && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
4661               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
4662               && XEXP (*split, 0) == SET_DEST (x)
4663               && XEXP (*split, 1) == const0_rtx)
4664             {
4665               rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
4666                                                 XEXP (SET_SRC (x), 0),
4667                                                 pos, NULL_RTX, 1, 1, 0, 0);
4668               if (extraction != 0)
4669                 {
4670                   SUBST (SET_SRC (x), extraction);
4671                   return find_split_point (loc, insn, false);
4672                 }
4673             }
4674           break;
4675
4676         case NE:
4677           /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
4678              is known to be on, this can be converted into a NEG of a shift.  */
4679           if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
4680               && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
4681               && 1 <= (pos = exact_log2
4682                        (nonzero_bits (XEXP (SET_SRC (x), 0),
4683                                       GET_MODE (XEXP (SET_SRC (x), 0))))))
4684             {
4685               enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
4686
4687               SUBST (SET_SRC (x),
4688                      gen_rtx_NEG (mode,
4689                                   gen_rtx_LSHIFTRT (mode,
4690                                                     XEXP (SET_SRC (x), 0),
4691                                                     GEN_INT (pos))));
4692
4693               split = find_split_point (&SET_SRC (x), insn, true);
4694               if (split && split != &SET_SRC (x))
4695                 return split;
4696             }
4697           break;
4698
4699         case SIGN_EXTEND:
4700           inner = XEXP (SET_SRC (x), 0);
4701
4702           /* We can't optimize if either mode is a partial integer
4703              mode as we don't know how many bits are significant
4704              in those modes.  */
4705           if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
4706               || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
4707             break;
4708
4709           pos = 0;
4710           len = GET_MODE_BITSIZE (GET_MODE (inner));
4711           unsignedp = 0;
4712           break;
4713
4714         case SIGN_EXTRACT:
4715         case ZERO_EXTRACT:
4716           if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4717               && CONST_INT_P (XEXP (SET_SRC (x), 2)))
4718             {
4719               inner = XEXP (SET_SRC (x), 0);
4720               len = INTVAL (XEXP (SET_SRC (x), 1));
4721               pos = INTVAL (XEXP (SET_SRC (x), 2));
4722
4723               if (BITS_BIG_ENDIAN)
4724                 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
4725               unsignedp = (code == ZERO_EXTRACT);
4726             }
4727           break;
4728
4729         default:
4730           break;
4731         }
4732
4733       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
4734         {
4735           enum machine_mode mode = GET_MODE (SET_SRC (x));
4736
4737           /* For unsigned, we have a choice of a shift followed by an
4738              AND or two shifts.  Use two shifts for field sizes where the
4739              constant might be too large.  We assume here that we can
4740              always at least get 8-bit constants in an AND insn, which is
4741              true for every current RISC.  */
4742
4743           if (unsignedp && len <= 8)
4744             {
4745               SUBST (SET_SRC (x),
4746                      gen_rtx_AND (mode,
4747                                   gen_rtx_LSHIFTRT
4748                                   (mode, gen_lowpart (mode, inner),
4749                                    GEN_INT (pos)),
4750                                   GEN_INT (((unsigned HOST_WIDE_INT) 1 << len)
4751                                            - 1)));
4752
4753               split = find_split_point (&SET_SRC (x), insn, true);
4754               if (split && split != &SET_SRC (x))
4755                 return split;
4756             }
4757           else
4758             {
4759               SUBST (SET_SRC (x),
4760                      gen_rtx_fmt_ee
4761                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
4762                       gen_rtx_ASHIFT (mode,
4763                                       gen_lowpart (mode, inner),
4764                                       GEN_INT (GET_MODE_BITSIZE (mode)
4765                                                - len - pos)),
4766                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
4767
4768               split = find_split_point (&SET_SRC (x), insn, true);
4769               if (split && split != &SET_SRC (x))
4770                 return split;
4771             }
4772         }
4773
4774       /* See if this is a simple operation with a constant as the second
4775          operand.  It might be that this constant is out of range and hence
4776          could be used as a split point.  */
4777       if (BINARY_P (SET_SRC (x))
4778           && CONSTANT_P (XEXP (SET_SRC (x), 1))
4779           && (OBJECT_P (XEXP (SET_SRC (x), 0))
4780               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
4781                   && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
4782         return &XEXP (SET_SRC (x), 1);
4783
4784       /* Finally, see if this is a simple operation with its first operand
4785          not in a register.  The operation might require this operand in a
4786          register, so return it as a split point.  We can always do this
4787          because if the first operand were another operation, we would have
4788          already found it as a split point.  */
4789       if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
4790           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
4791         return &XEXP (SET_SRC (x), 0);
4792
4793       return 0;
4794
4795     case AND:
4796     case IOR:
4797       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
4798          it is better to write this as (not (ior A B)) so we can split it.
4799          Similarly for IOR.  */
4800       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
4801         {
4802           SUBST (*loc,
4803                  gen_rtx_NOT (GET_MODE (x),
4804                               gen_rtx_fmt_ee (code == IOR ? AND : IOR,
4805                                               GET_MODE (x),
4806                                               XEXP (XEXP (x, 0), 0),
4807                                               XEXP (XEXP (x, 1), 0))));
4808           return find_split_point (loc, insn, set_src);
4809         }
4810
4811       /* Many RISC machines have a large set of logical insns.  If the
4812          second operand is a NOT, put it first so we will try to split the
4813          other operand first.  */
4814       if (GET_CODE (XEXP (x, 1)) == NOT)
4815         {
4816           rtx tem = XEXP (x, 0);
4817           SUBST (XEXP (x, 0), XEXP (x, 1));
4818           SUBST (XEXP (x, 1), tem);
4819         }
4820       break;
4821
4822     case PLUS:
4823     case MINUS:
4824       /* Canonicalization can produce (minus A (mult B C)), where C is a
4825          constant.  It may be better to try splitting (plus (mult B -C) A)
4826          instead if this isn't a multiply by a power of two.  */
4827       if (set_src && code == MINUS && GET_CODE (XEXP (x, 1)) == MULT
4828           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
4829           && exact_log2 (INTVAL (XEXP (XEXP (x, 1), 1))) < 0)
4830         {
4831           enum machine_mode mode = GET_MODE (x);
4832           unsigned HOST_WIDE_INT this_int = INTVAL (XEXP (XEXP (x, 1), 1));
4833           HOST_WIDE_INT other_int = trunc_int_for_mode (-this_int, mode);
4834           SUBST (*loc, gen_rtx_PLUS (mode, gen_rtx_MULT (mode,
4835                                                          XEXP (XEXP (x, 1), 0),
4836                                                          GEN_INT (other_int)),
4837                                      XEXP (x, 0)));
4838           return find_split_point (loc, insn, set_src);
4839         }
4840
4841       /* Split at a multiply-accumulate instruction.  However if this is
4842          the SET_SRC, we likely do not have such an instruction and it's
4843          worthless to try this split.  */
4844       if (!set_src && GET_CODE (XEXP (x, 0)) == MULT)
4845         return loc;
4846
4847     default:
4848       break;
4849     }
4850
4851   /* Otherwise, select our actions depending on our rtx class.  */
4852   switch (GET_RTX_CLASS (code))
4853     {
4854     case RTX_BITFIELD_OPS:              /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
4855     case RTX_TERNARY:
4856       split = find_split_point (&XEXP (x, 2), insn, false);
4857       if (split)
4858         return split;
4859       /* ... fall through ...  */
4860     case RTX_BIN_ARITH:
4861     case RTX_COMM_ARITH:
4862     case RTX_COMPARE:
4863     case RTX_COMM_COMPARE:
4864       split = find_split_point (&XEXP (x, 1), insn, false);
4865       if (split)
4866         return split;
4867       /* ... fall through ...  */
4868     case RTX_UNARY:
4869       /* Some machines have (and (shift ...) ...) insns.  If X is not
4870          an AND, but XEXP (X, 0) is, use it as our split point.  */
4871       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
4872         return &XEXP (x, 0);
4873
4874       split = find_split_point (&XEXP (x, 0), insn, false);
4875       if (split)
4876         return split;
4877       return loc;
4878
4879     default:
4880       /* Otherwise, we don't have a split point.  */
4881       return 0;
4882     }
4883 }
4884 \f
4885 /* Throughout X, replace FROM with TO, and return the result.
4886    The result is TO if X is FROM;
4887    otherwise the result is X, but its contents may have been modified.
4888    If they were modified, a record was made in undobuf so that
4889    undo_all will (among other things) return X to its original state.
4890
4891    If the number of changes necessary is too much to record to undo,
4892    the excess changes are not made, so the result is invalid.
4893    The changes already made can still be undone.
4894    undobuf.num_undo is incremented for such changes, so by testing that
4895    the caller can tell whether the result is valid.
4896
4897    `n_occurrences' is incremented each time FROM is replaced.
4898
4899    IN_DEST is nonzero if we are processing the SET_DEST of a SET.
4900
4901    UNIQUE_COPY is nonzero if each substitution must be unique.  We do this
4902    by copying if `n_occurrences' is nonzero.  */
4903
4904 static rtx
4905 subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
4906 {
4907   enum rtx_code code = GET_CODE (x);
4908   enum machine_mode op0_mode = VOIDmode;
4909   const char *fmt;
4910   int len, i;
4911   rtx new_rtx;
4912
4913 /* Two expressions are equal if they are identical copies of a shared
4914    RTX or if they are both registers with the same register number
4915    and mode.  */
4916
4917 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
4918   ((X) == (Y)                                           \
4919    || (REG_P (X) && REG_P (Y)   \
4920        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
4921
4922   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
4923     {
4924       n_occurrences++;
4925       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
4926     }
4927
4928   /* If X and FROM are the same register but different modes, they
4929      will not have been seen as equal above.  However, the log links code
4930      will make a LOG_LINKS entry for that case.  If we do nothing, we
4931      will try to rerecognize our original insn and, when it succeeds,
4932      we will delete the feeding insn, which is incorrect.
4933
4934      So force this insn not to match in this (rare) case.  */
4935   if (! in_dest && code == REG && REG_P (from)
4936       && reg_overlap_mentioned_p (x, from))
4937     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
4938
4939   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
4940      of which may contain things that can be combined.  */
4941   if (code != MEM && code != LO_SUM && OBJECT_P (x))
4942     return x;
4943
4944   /* It is possible to have a subexpression appear twice in the insn.
4945      Suppose that FROM is a register that appears within TO.
4946      Then, after that subexpression has been scanned once by `subst',
4947      the second time it is scanned, TO may be found.  If we were
4948      to scan TO here, we would find FROM within it and create a
4949      self-referent rtl structure which is completely wrong.  */
4950   if (COMBINE_RTX_EQUAL_P (x, to))
4951     return to;
4952
4953   /* Parallel asm_operands need special attention because all of the
4954      inputs are shared across the arms.  Furthermore, unsharing the
4955      rtl results in recognition failures.  Failure to handle this case
4956      specially can result in circular rtl.
4957
4958      Solve this by doing a normal pass across the first entry of the
4959      parallel, and only processing the SET_DESTs of the subsequent
4960      entries.  Ug.  */
4961
4962   if (code == PARALLEL
4963       && GET_CODE (XVECEXP (x, 0, 0)) == SET
4964       && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
4965     {
4966       new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
4967
4968       /* If this substitution failed, this whole thing fails.  */
4969       if (GET_CODE (new_rtx) == CLOBBER
4970           && XEXP (new_rtx, 0) == const0_rtx)
4971         return new_rtx;
4972
4973       SUBST (XVECEXP (x, 0, 0), new_rtx);
4974
4975       for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
4976         {
4977           rtx dest = SET_DEST (XVECEXP (x, 0, i));
4978
4979           if (!REG_P (dest)
4980               && GET_CODE (dest) != CC0
4981               && GET_CODE (dest) != PC)
4982             {
4983               new_rtx = subst (dest, from, to, 0, unique_copy);
4984
4985               /* If this substitution failed, this whole thing fails.  */
4986               if (GET_CODE (new_rtx) == CLOBBER
4987                   && XEXP (new_rtx, 0) == const0_rtx)
4988                 return new_rtx;
4989
4990               SUBST (SET_DEST (XVECEXP (x, 0, i)), new_rtx);
4991             }
4992         }
4993     }
4994   else
4995     {
4996       len = GET_RTX_LENGTH (code);
4997       fmt = GET_RTX_FORMAT (code);
4998
4999       /* We don't need to process a SET_DEST that is a register, CC0,
5000          or PC, so set up to skip this common case.  All other cases
5001          where we want to suppress replacing something inside a
5002          SET_SRC are handled via the IN_DEST operand.  */
5003       if (code == SET
5004           && (REG_P (SET_DEST (x))
5005               || GET_CODE (SET_DEST (x)) == CC0
5006               || GET_CODE (SET_DEST (x)) == PC))
5007         fmt = "ie";
5008
5009       /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
5010          constant.  */
5011       if (fmt[0] == 'e')
5012         op0_mode = GET_MODE (XEXP (x, 0));
5013
5014       for (i = 0; i < len; i++)
5015         {
5016           if (fmt[i] == 'E')
5017             {
5018               int j;
5019               for (j = XVECLEN (x, i) - 1; j >= 0; j--)
5020                 {
5021                   if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
5022                     {
5023                       new_rtx = (unique_copy && n_occurrences
5024                              ? copy_rtx (to) : to);
5025                       n_occurrences++;
5026                     }
5027                   else
5028                     {
5029                       new_rtx = subst (XVECEXP (x, i, j), from, to, 0,
5030                                    unique_copy);
5031
5032                       /* If this substitution failed, this whole thing
5033                          fails.  */
5034                       if (GET_CODE (new_rtx) == CLOBBER
5035                           && XEXP (new_rtx, 0) == const0_rtx)
5036                         return new_rtx;
5037                     }
5038
5039                   SUBST (XVECEXP (x, i, j), new_rtx);
5040                 }
5041             }
5042           else if (fmt[i] == 'e')
5043             {
5044               /* If this is a register being set, ignore it.  */
5045               new_rtx = XEXP (x, i);
5046               if (in_dest
5047                   && i == 0
5048                   && (((code == SUBREG || code == ZERO_EXTRACT)
5049                        && REG_P (new_rtx))
5050                       || code == STRICT_LOW_PART))
5051                 ;
5052
5053               else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
5054                 {
5055                   /* In general, don't install a subreg involving two
5056                      modes not tieable.  It can worsen register
5057                      allocation, and can even make invalid reload
5058                      insns, since the reg inside may need to be copied
5059                      from in the outside mode, and that may be invalid
5060                      if it is an fp reg copied in integer mode.
5061
5062                      We allow two exceptions to this: It is valid if
5063                      it is inside another SUBREG and the mode of that
5064                      SUBREG and the mode of the inside of TO is
5065                      tieable and it is valid if X is a SET that copies
5066                      FROM to CC0.  */
5067
5068                   if (GET_CODE (to) == SUBREG
5069                       && ! MODES_TIEABLE_P (GET_MODE (to),
5070                                             GET_MODE (SUBREG_REG (to)))
5071                       && ! (code == SUBREG
5072                             && MODES_TIEABLE_P (GET_MODE (x),
5073                                                 GET_MODE (SUBREG_REG (to))))
5074 #ifdef HAVE_cc0
5075                       && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
5076 #endif
5077                       )
5078                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5079
5080 #ifdef CANNOT_CHANGE_MODE_CLASS
5081                   if (code == SUBREG
5082                       && REG_P (to)
5083                       && REGNO (to) < FIRST_PSEUDO_REGISTER
5084                       && REG_CANNOT_CHANGE_MODE_P (REGNO (to),
5085                                                    GET_MODE (to),
5086                                                    GET_MODE (x)))
5087                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5088 #endif
5089
5090                   new_rtx = (unique_copy && n_occurrences ? copy_rtx (to) : to);
5091                   n_occurrences++;
5092                 }
5093               else
5094                 /* If we are in a SET_DEST, suppress most cases unless we
5095                    have gone inside a MEM, in which case we want to
5096                    simplify the address.  We assume here that things that
5097                    are actually part of the destination have their inner
5098                    parts in the first expression.  This is true for SUBREG,
5099                    STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
5100                    things aside from REG and MEM that should appear in a
5101                    SET_DEST.  */
5102                 new_rtx = subst (XEXP (x, i), from, to,
5103                              (((in_dest
5104                                 && (code == SUBREG || code == STRICT_LOW_PART
5105                                     || code == ZERO_EXTRACT))
5106                                || code == SET)
5107                               && i == 0), unique_copy);
5108
5109               /* If we found that we will have to reject this combination,
5110                  indicate that by returning the CLOBBER ourselves, rather than
5111                  an expression containing it.  This will speed things up as
5112                  well as prevent accidents where two CLOBBERs are considered
5113                  to be equal, thus producing an incorrect simplification.  */
5114
5115               if (GET_CODE (new_rtx) == CLOBBER && XEXP (new_rtx, 0) == const0_rtx)
5116                 return new_rtx;
5117
5118               if (GET_CODE (x) == SUBREG
5119                   && (CONST_INT_P (new_rtx)
5120                       || GET_CODE (new_rtx) == CONST_DOUBLE))
5121                 {
5122                   enum machine_mode mode = GET_MODE (x);
5123
5124                   x = simplify_subreg (GET_MODE (x), new_rtx,
5125                                        GET_MODE (SUBREG_REG (x)),
5126                                        SUBREG_BYTE (x));
5127                   if (! x)
5128                     x = gen_rtx_CLOBBER (mode, const0_rtx);
5129                 }
5130               else if (CONST_INT_P (new_rtx)
5131                        && GET_CODE (x) == ZERO_EXTEND)
5132                 {
5133                   x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
5134                                                 new_rtx, GET_MODE (XEXP (x, 0)));
5135                   gcc_assert (x);
5136                 }
5137               else
5138                 SUBST (XEXP (x, i), new_rtx);
5139             }
5140         }
5141     }
5142
5143   /* Check if we are loading something from the constant pool via float
5144      extension; in this case we would undo compress_float_constant
5145      optimization and degenerate constant load to an immediate value.  */
5146   if (GET_CODE (x) == FLOAT_EXTEND
5147       && MEM_P (XEXP (x, 0))
5148       && MEM_READONLY_P (XEXP (x, 0)))
5149     {
5150       rtx tmp = avoid_constant_pool_reference (x);
5151       if (x != tmp)
5152         return x;
5153     }
5154
5155   /* Try to simplify X.  If the simplification changed the code, it is likely
5156      that further simplification will help, so loop, but limit the number
5157      of repetitions that will be performed.  */
5158
5159   for (i = 0; i < 4; i++)
5160     {
5161       /* If X is sufficiently simple, don't bother trying to do anything
5162          with it.  */
5163       if (code != CONST_INT && code != REG && code != CLOBBER)
5164         x = combine_simplify_rtx (x, op0_mode, in_dest);
5165
5166       if (GET_CODE (x) == code)
5167         break;
5168
5169       code = GET_CODE (x);
5170
5171       /* We no longer know the original mode of operand 0 since we
5172          have changed the form of X)  */
5173       op0_mode = VOIDmode;
5174     }
5175
5176   return x;
5177 }
5178 \f
5179 /* Simplify X, a piece of RTL.  We just operate on the expression at the
5180    outer level; call `subst' to simplify recursively.  Return the new
5181    expression.
5182
5183    OP0_MODE is the original mode of XEXP (x, 0).  IN_DEST is nonzero
5184    if we are inside a SET_DEST.  */
5185
5186 static rtx
5187 combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
5188 {
5189   enum rtx_code code = GET_CODE (x);
5190   enum machine_mode mode = GET_MODE (x);
5191   rtx temp;
5192   int i;
5193
5194   /* If this is a commutative operation, put a constant last and a complex
5195      expression first.  We don't need to do this for comparisons here.  */
5196   if (COMMUTATIVE_ARITH_P (x)
5197       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
5198     {
5199       temp = XEXP (x, 0);
5200       SUBST (XEXP (x, 0), XEXP (x, 1));
5201       SUBST (XEXP (x, 1), temp);
5202     }
5203
5204   /* If this is a simple operation applied to an IF_THEN_ELSE, try
5205      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
5206      things.  Check for cases where both arms are testing the same
5207      condition.
5208
5209      Don't do anything if all operands are very simple.  */
5210
5211   if ((BINARY_P (x)
5212        && ((!OBJECT_P (XEXP (x, 0))
5213             && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5214                   && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
5215            || (!OBJECT_P (XEXP (x, 1))
5216                && ! (GET_CODE (XEXP (x, 1)) == SUBREG
5217                      && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
5218       || (UNARY_P (x)
5219           && (!OBJECT_P (XEXP (x, 0))
5220                && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5221                      && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
5222     {
5223       rtx cond, true_rtx, false_rtx;
5224
5225       cond = if_then_else_cond (x, &true_rtx, &false_rtx);
5226       if (cond != 0
5227           /* If everything is a comparison, what we have is highly unlikely
5228              to be simpler, so don't use it.  */
5229           && ! (COMPARISON_P (x)
5230                 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
5231         {
5232           rtx cop1 = const0_rtx;
5233           enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
5234
5235           if (cond_code == NE && COMPARISON_P (cond))
5236             return x;
5237
5238           /* Simplify the alternative arms; this may collapse the true and
5239              false arms to store-flag values.  Be careful to use copy_rtx
5240              here since true_rtx or false_rtx might share RTL with x as a
5241              result of the if_then_else_cond call above.  */
5242           true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0);
5243           false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0);
5244
5245           /* If true_rtx and false_rtx are not general_operands, an if_then_else
5246              is unlikely to be simpler.  */
5247           if (general_operand (true_rtx, VOIDmode)
5248               && general_operand (false_rtx, VOIDmode))
5249             {
5250               enum rtx_code reversed;
5251
5252               /* Restarting if we generate a store-flag expression will cause
5253                  us to loop.  Just drop through in this case.  */
5254
5255               /* If the result values are STORE_FLAG_VALUE and zero, we can
5256                  just make the comparison operation.  */
5257               if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
5258                 x = simplify_gen_relational (cond_code, mode, VOIDmode,
5259                                              cond, cop1);
5260               else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
5261                        && ((reversed = reversed_comparison_code_parts
5262                                         (cond_code, cond, cop1, NULL))
5263                            != UNKNOWN))
5264                 x = simplify_gen_relational (reversed, mode, VOIDmode,
5265                                              cond, cop1);
5266
5267               /* Likewise, we can make the negate of a comparison operation
5268                  if the result values are - STORE_FLAG_VALUE and zero.  */
5269               else if (CONST_INT_P (true_rtx)
5270                        && INTVAL (true_rtx) == - STORE_FLAG_VALUE
5271                        && false_rtx == const0_rtx)
5272                 x = simplify_gen_unary (NEG, mode,
5273                                         simplify_gen_relational (cond_code,
5274                                                                  mode, VOIDmode,
5275                                                                  cond, cop1),
5276                                         mode);
5277               else if (CONST_INT_P (false_rtx)
5278                        && INTVAL (false_rtx) == - STORE_FLAG_VALUE
5279                        && true_rtx == const0_rtx
5280                        && ((reversed = reversed_comparison_code_parts
5281                                         (cond_code, cond, cop1, NULL))
5282                            != UNKNOWN))
5283                 x = simplify_gen_unary (NEG, mode,
5284                                         simplify_gen_relational (reversed,
5285                                                                  mode, VOIDmode,
5286                                                                  cond, cop1),
5287                                         mode);
5288               else
5289                 return gen_rtx_IF_THEN_ELSE (mode,
5290                                              simplify_gen_relational (cond_code,
5291                                                                       mode,
5292                                                                       VOIDmode,
5293                                                                       cond,
5294                                                                       cop1),
5295                                              true_rtx, false_rtx);
5296
5297               code = GET_CODE (x);
5298               op0_mode = VOIDmode;
5299             }
5300         }
5301     }
5302
5303   /* Try to fold this expression in case we have constants that weren't
5304      present before.  */
5305   temp = 0;
5306   switch (GET_RTX_CLASS (code))
5307     {
5308     case RTX_UNARY:
5309       if (op0_mode == VOIDmode)
5310         op0_mode = GET_MODE (XEXP (x, 0));
5311       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
5312       break;
5313     case RTX_COMPARE:
5314     case RTX_COMM_COMPARE:
5315       {
5316         enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
5317         if (cmp_mode == VOIDmode)
5318           {
5319             cmp_mode = GET_MODE (XEXP (x, 1));
5320             if (cmp_mode == VOIDmode)
5321               cmp_mode = op0_mode;
5322           }
5323         temp = simplify_relational_operation (code, mode, cmp_mode,
5324                                               XEXP (x, 0), XEXP (x, 1));
5325       }
5326       break;
5327     case RTX_COMM_ARITH:
5328     case RTX_BIN_ARITH:
5329       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
5330       break;
5331     case RTX_BITFIELD_OPS:
5332     case RTX_TERNARY:
5333       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
5334                                          XEXP (x, 1), XEXP (x, 2));
5335       break;
5336     default:
5337       break;
5338     }
5339
5340   if (temp)
5341     {
5342       x = temp;
5343       code = GET_CODE (temp);
5344       op0_mode = VOIDmode;
5345       mode = GET_MODE (temp);
5346     }
5347
5348   /* First see if we can apply the inverse distributive law.  */
5349   if (code == PLUS || code == MINUS
5350       || code == AND || code == IOR || code == XOR)
5351     {
5352       x = apply_distributive_law (x);
5353       code = GET_CODE (x);
5354       op0_mode = VOIDmode;
5355     }
5356
5357   /* If CODE is an associative operation not otherwise handled, see if we
5358      can associate some operands.  This can win if they are constants or
5359      if they are logically related (i.e. (a & b) & a).  */
5360   if ((code == PLUS || code == MINUS || code == MULT || code == DIV
5361        || code == AND || code == IOR || code == XOR
5362        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
5363       && ((INTEGRAL_MODE_P (mode) && code != DIV)
5364           || (flag_associative_math && FLOAT_MODE_P (mode))))
5365     {
5366       if (GET_CODE (XEXP (x, 0)) == code)
5367         {
5368           rtx other = XEXP (XEXP (x, 0), 0);
5369           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
5370           rtx inner_op1 = XEXP (x, 1);
5371           rtx inner;
5372
5373           /* Make sure we pass the constant operand if any as the second
5374              one if this is a commutative operation.  */
5375           if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
5376             {
5377               rtx tem = inner_op0;
5378               inner_op0 = inner_op1;
5379               inner_op1 = tem;
5380             }
5381           inner = simplify_binary_operation (code == MINUS ? PLUS
5382                                              : code == DIV ? MULT
5383                                              : code,
5384                                              mode, inner_op0, inner_op1);
5385
5386           /* For commutative operations, try the other pair if that one
5387              didn't simplify.  */
5388           if (inner == 0 && COMMUTATIVE_ARITH_P (x))
5389             {
5390               other = XEXP (XEXP (x, 0), 1);
5391               inner = simplify_binary_operation (code, mode,
5392                                                  XEXP (XEXP (x, 0), 0),
5393                                                  XEXP (x, 1));
5394             }
5395
5396           if (inner)
5397             return simplify_gen_binary (code, mode, other, inner);
5398         }
5399     }
5400
5401   /* A little bit of algebraic simplification here.  */
5402   switch (code)
5403     {
5404     case MEM:
5405       /* Ensure that our address has any ASHIFTs converted to MULT in case
5406          address-recognizing predicates are called later.  */
5407       temp = make_compound_operation (XEXP (x, 0), MEM);
5408       SUBST (XEXP (x, 0), temp);
5409       break;
5410
5411     case SUBREG:
5412       if (op0_mode == VOIDmode)
5413         op0_mode = GET_MODE (SUBREG_REG (x));
5414
5415       /* See if this can be moved to simplify_subreg.  */
5416       if (CONSTANT_P (SUBREG_REG (x))
5417           && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
5418              /* Don't call gen_lowpart if the inner mode
5419                 is VOIDmode and we cannot simplify it, as SUBREG without
5420                 inner mode is invalid.  */
5421           && (GET_MODE (SUBREG_REG (x)) != VOIDmode
5422               || gen_lowpart_common (mode, SUBREG_REG (x))))
5423         return gen_lowpart (mode, SUBREG_REG (x));
5424
5425       if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
5426         break;
5427       {
5428         rtx temp;
5429         temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
5430                                 SUBREG_BYTE (x));
5431         if (temp)
5432           return temp;
5433       }
5434
5435       /* Don't change the mode of the MEM if that would change the meaning
5436          of the address.  */
5437       if (MEM_P (SUBREG_REG (x))
5438           && (MEM_VOLATILE_P (SUBREG_REG (x))
5439               || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
5440         return gen_rtx_CLOBBER (mode, const0_rtx);
5441
5442       /* Note that we cannot do any narrowing for non-constants since
5443          we might have been counting on using the fact that some bits were
5444          zero.  We now do this in the SET.  */
5445
5446       break;
5447
5448     case NEG:
5449       temp = expand_compound_operation (XEXP (x, 0));
5450
5451       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
5452          replaced by (lshiftrt X C).  This will convert
5453          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
5454
5455       if (GET_CODE (temp) == ASHIFTRT
5456           && CONST_INT_P (XEXP (temp, 1))
5457           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
5458         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (temp, 0),
5459                                      INTVAL (XEXP (temp, 1)));
5460
5461       /* If X has only a single bit that might be nonzero, say, bit I, convert
5462          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
5463          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
5464          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
5465          or a SUBREG of one since we'd be making the expression more
5466          complex if it was just a register.  */
5467
5468       if (!REG_P (temp)
5469           && ! (GET_CODE (temp) == SUBREG
5470                 && REG_P (SUBREG_REG (temp)))
5471           && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
5472         {
5473           rtx temp1 = simplify_shift_const
5474             (NULL_RTX, ASHIFTRT, mode,
5475              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
5476                                    GET_MODE_BITSIZE (mode) - 1 - i),
5477              GET_MODE_BITSIZE (mode) - 1 - i);
5478
5479           /* If all we did was surround TEMP with the two shifts, we
5480              haven't improved anything, so don't use it.  Otherwise,
5481              we are better off with TEMP1.  */
5482           if (GET_CODE (temp1) != ASHIFTRT
5483               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
5484               || XEXP (XEXP (temp1, 0), 0) != temp)
5485             return temp1;
5486         }
5487       break;
5488
5489     case TRUNCATE:
5490       /* We can't handle truncation to a partial integer mode here
5491          because we don't know the real bitsize of the partial
5492          integer mode.  */
5493       if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
5494         break;
5495
5496       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
5497         SUBST (XEXP (x, 0),
5498                force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
5499                               GET_MODE_MASK (mode), 0));
5500
5501       /* We can truncate a constant value and return it.  */
5502       if (CONST_INT_P (XEXP (x, 0)))
5503         return gen_int_mode (INTVAL (XEXP (x, 0)), mode);
5504
5505       /* Similarly to what we do in simplify-rtx.c, a truncate of a register
5506          whose value is a comparison can be replaced with a subreg if
5507          STORE_FLAG_VALUE permits.  */
5508       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5509           && (STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
5510           && (temp = get_last_value (XEXP (x, 0)))
5511           && COMPARISON_P (temp))
5512         return gen_lowpart (mode, XEXP (x, 0));
5513       break;
5514
5515     case CONST:
5516       /* (const (const X)) can become (const X).  Do it this way rather than
5517          returning the inner CONST since CONST can be shared with a
5518          REG_EQUAL note.  */
5519       if (GET_CODE (XEXP (x, 0)) == CONST)
5520         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
5521       break;
5522
5523 #ifdef HAVE_lo_sum
5524     case LO_SUM:
5525       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
5526          can add in an offset.  find_split_point will split this address up
5527          again if it doesn't match.  */
5528       if (GET_CODE (XEXP (x, 0)) == HIGH
5529           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
5530         return XEXP (x, 1);
5531       break;
5532 #endif
5533
5534     case PLUS:
5535       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
5536          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
5537          bit-field and can be replaced by either a sign_extend or a
5538          sign_extract.  The `and' may be a zero_extend and the two
5539          <c>, -<c> constants may be reversed.  */
5540       if (GET_CODE (XEXP (x, 0)) == XOR
5541           && CONST_INT_P (XEXP (x, 1))
5542           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
5543           && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
5544           && ((i = exact_log2 (UINTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
5545               || (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0)
5546           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5547           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
5548                && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
5549                && (UINTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
5550                    == ((unsigned HOST_WIDE_INT) 1 << (i + 1)) - 1))
5551               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
5552                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
5553                       == (unsigned int) i + 1))))
5554         return simplify_shift_const
5555           (NULL_RTX, ASHIFTRT, mode,
5556            simplify_shift_const (NULL_RTX, ASHIFT, mode,
5557                                  XEXP (XEXP (XEXP (x, 0), 0), 0),
5558                                  GET_MODE_BITSIZE (mode) - (i + 1)),
5559            GET_MODE_BITSIZE (mode) - (i + 1));
5560
5561       /* If only the low-order bit of X is possibly nonzero, (plus x -1)
5562          can become (ashiftrt (ashift (xor x 1) C) C) where C is
5563          the bitsize of the mode - 1.  This allows simplification of
5564          "a = (b & 8) == 0;"  */
5565       if (XEXP (x, 1) == constm1_rtx
5566           && !REG_P (XEXP (x, 0))
5567           && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5568                 && REG_P (SUBREG_REG (XEXP (x, 0))))
5569           && nonzero_bits (XEXP (x, 0), mode) == 1)
5570         return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
5571            simplify_shift_const (NULL_RTX, ASHIFT, mode,
5572                                  gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
5573                                  GET_MODE_BITSIZE (mode) - 1),
5574            GET_MODE_BITSIZE (mode) - 1);
5575
5576       /* If we are adding two things that have no bits in common, convert
5577          the addition into an IOR.  This will often be further simplified,
5578          for example in cases like ((a & 1) + (a & 2)), which can
5579          become a & 3.  */
5580
5581       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5582           && (nonzero_bits (XEXP (x, 0), mode)
5583               & nonzero_bits (XEXP (x, 1), mode)) == 0)
5584         {
5585           /* Try to simplify the expression further.  */
5586           rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
5587           temp = combine_simplify_rtx (tor, mode, in_dest);
5588
5589           /* If we could, great.  If not, do not go ahead with the IOR
5590              replacement, since PLUS appears in many special purpose
5591              address arithmetic instructions.  */
5592           if (GET_CODE (temp) != CLOBBER && temp != tor)
5593             return temp;
5594         }
5595       break;
5596
5597     case MINUS:
5598       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
5599          (and <foo> (const_int pow2-1))  */
5600       if (GET_CODE (XEXP (x, 1)) == AND
5601           && CONST_INT_P (XEXP (XEXP (x, 1), 1))
5602           && exact_log2 (-UINTVAL (XEXP (XEXP (x, 1), 1))) >= 0
5603           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
5604         return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
5605                                        -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
5606       break;
5607
5608     case MULT:
5609       /* If we have (mult (plus A B) C), apply the distributive law and then
5610          the inverse distributive law to see if things simplify.  This
5611          occurs mostly in addresses, often when unrolling loops.  */
5612
5613       if (GET_CODE (XEXP (x, 0)) == PLUS)
5614         {
5615           rtx result = distribute_and_simplify_rtx (x, 0);
5616           if (result)
5617             return result;
5618         }
5619
5620       /* Try simplify a*(b/c) as (a*b)/c.  */
5621       if (FLOAT_MODE_P (mode) && flag_associative_math
5622           && GET_CODE (XEXP (x, 0)) == DIV)
5623         {
5624           rtx tem = simplify_binary_operation (MULT, mode,
5625                                                XEXP (XEXP (x, 0), 0),
5626                                                XEXP (x, 1));
5627           if (tem)
5628             return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
5629         }
5630       break;
5631
5632     case UDIV:
5633       /* If this is a divide by a power of two, treat it as a shift if
5634          its first operand is a shift.  */
5635       if (CONST_INT_P (XEXP (x, 1))
5636           && (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0
5637           && (GET_CODE (XEXP (x, 0)) == ASHIFT
5638               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
5639               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
5640               || GET_CODE (XEXP (x, 0)) == ROTATE
5641               || GET_CODE (XEXP (x, 0)) == ROTATERT))
5642         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
5643       break;
5644
5645     case EQ:  case NE:
5646     case GT:  case GTU:  case GE:  case GEU:
5647     case LT:  case LTU:  case LE:  case LEU:
5648     case UNEQ:  case LTGT:
5649     case UNGT:  case UNGE:
5650     case UNLT:  case UNLE:
5651     case UNORDERED: case ORDERED:
5652       /* If the first operand is a condition code, we can't do anything
5653          with it.  */
5654       if (GET_CODE (XEXP (x, 0)) == COMPARE
5655           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
5656               && ! CC0_P (XEXP (x, 0))))
5657         {
5658           rtx op0 = XEXP (x, 0);
5659           rtx op1 = XEXP (x, 1);
5660           enum rtx_code new_code;
5661
5662           if (GET_CODE (op0) == COMPARE)
5663             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
5664
5665           /* Simplify our comparison, if possible.  */
5666           new_code = simplify_comparison (code, &op0, &op1);
5667
5668           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
5669              if only the low-order bit is possibly nonzero in X (such as when
5670              X is a ZERO_EXTRACT of one bit).  Similarly, we can convert EQ to
5671              (xor X 1) or (minus 1 X); we use the former.  Finally, if X is
5672              known to be either 0 or -1, NE becomes a NEG and EQ becomes
5673              (plus X 1).
5674
5675              Remove any ZERO_EXTRACT we made when thinking this was a
5676              comparison.  It may now be simpler to use, e.g., an AND.  If a
5677              ZERO_EXTRACT is indeed appropriate, it will be placed back by
5678              the call to make_compound_operation in the SET case.  */
5679
5680           if (STORE_FLAG_VALUE == 1
5681               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5682               && op1 == const0_rtx
5683               && mode == GET_MODE (op0)
5684               && nonzero_bits (op0, mode) == 1)
5685             return gen_lowpart (mode,
5686                                 expand_compound_operation (op0));
5687
5688           else if (STORE_FLAG_VALUE == 1
5689                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5690                    && op1 == const0_rtx
5691                    && mode == GET_MODE (op0)
5692                    && (num_sign_bit_copies (op0, mode)
5693                        == GET_MODE_BITSIZE (mode)))
5694             {
5695               op0 = expand_compound_operation (op0);
5696               return simplify_gen_unary (NEG, mode,
5697                                          gen_lowpart (mode, op0),
5698                                          mode);
5699             }
5700
5701           else if (STORE_FLAG_VALUE == 1
5702                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5703                    && op1 == const0_rtx
5704                    && mode == GET_MODE (op0)
5705                    && nonzero_bits (op0, mode) == 1)
5706             {
5707               op0 = expand_compound_operation (op0);
5708               return simplify_gen_binary (XOR, mode,
5709                                           gen_lowpart (mode, op0),
5710                                           const1_rtx);
5711             }
5712
5713           else if (STORE_FLAG_VALUE == 1
5714                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5715                    && op1 == const0_rtx
5716                    && mode == GET_MODE (op0)
5717                    && (num_sign_bit_copies (op0, mode)
5718                        == GET_MODE_BITSIZE (mode)))
5719             {
5720               op0 = expand_compound_operation (op0);
5721               return plus_constant (gen_lowpart (mode, op0), 1);
5722             }
5723
5724           /* If STORE_FLAG_VALUE is -1, we have cases similar to
5725              those above.  */
5726           if (STORE_FLAG_VALUE == -1
5727               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5728               && op1 == const0_rtx
5729               && (num_sign_bit_copies (op0, mode)
5730                   == GET_MODE_BITSIZE (mode)))
5731             return gen_lowpart (mode,
5732                                 expand_compound_operation (op0));
5733
5734           else if (STORE_FLAG_VALUE == -1
5735                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5736                    && op1 == const0_rtx
5737                    && mode == GET_MODE (op0)
5738                    && nonzero_bits (op0, mode) == 1)
5739             {
5740               op0 = expand_compound_operation (op0);
5741               return simplify_gen_unary (NEG, mode,
5742                                          gen_lowpart (mode, op0),
5743                                          mode);
5744             }
5745
5746           else if (STORE_FLAG_VALUE == -1
5747                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5748                    && op1 == const0_rtx
5749                    && mode == GET_MODE (op0)
5750                    && (num_sign_bit_copies (op0, mode)
5751                        == GET_MODE_BITSIZE (mode)))
5752             {
5753               op0 = expand_compound_operation (op0);
5754               return simplify_gen_unary (NOT, mode,
5755                                          gen_lowpart (mode, op0),
5756                                          mode);
5757             }
5758
5759           /* If X is 0/1, (eq X 0) is X-1.  */
5760           else if (STORE_FLAG_VALUE == -1
5761                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5762                    && op1 == const0_rtx
5763                    && mode == GET_MODE (op0)
5764                    && nonzero_bits (op0, mode) == 1)
5765             {
5766               op0 = expand_compound_operation (op0);
5767               return plus_constant (gen_lowpart (mode, op0), -1);
5768             }
5769
5770           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
5771              one bit that might be nonzero, we can convert (ne x 0) to
5772              (ashift x c) where C puts the bit in the sign bit.  Remove any
5773              AND with STORE_FLAG_VALUE when we are done, since we are only
5774              going to test the sign bit.  */
5775           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5776               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5777               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5778                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5779               && op1 == const0_rtx
5780               && mode == GET_MODE (op0)
5781               && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
5782             {
5783               x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
5784                                         expand_compound_operation (op0),
5785                                         GET_MODE_BITSIZE (mode) - 1 - i);
5786               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
5787                 return XEXP (x, 0);
5788               else
5789                 return x;
5790             }
5791
5792           /* If the code changed, return a whole new comparison.  */
5793           if (new_code != code)
5794             return gen_rtx_fmt_ee (new_code, mode, op0, op1);
5795
5796           /* Otherwise, keep this operation, but maybe change its operands.
5797              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
5798           SUBST (XEXP (x, 0), op0);
5799           SUBST (XEXP (x, 1), op1);
5800         }
5801       break;
5802
5803     case IF_THEN_ELSE:
5804       return simplify_if_then_else (x);
5805
5806     case ZERO_EXTRACT:
5807     case SIGN_EXTRACT:
5808     case ZERO_EXTEND:
5809     case SIGN_EXTEND:
5810       /* If we are processing SET_DEST, we are done.  */
5811       if (in_dest)
5812         return x;
5813
5814       return expand_compound_operation (x);
5815
5816     case SET:
5817       return simplify_set (x);
5818
5819     case AND:
5820     case IOR:
5821       return simplify_logical (x);
5822
5823     case ASHIFT:
5824     case LSHIFTRT:
5825     case ASHIFTRT:
5826     case ROTATE:
5827     case ROTATERT:
5828       /* If this is a shift by a constant amount, simplify it.  */
5829       if (CONST_INT_P (XEXP (x, 1)))
5830         return simplify_shift_const (x, code, mode, XEXP (x, 0),
5831                                      INTVAL (XEXP (x, 1)));
5832
5833       else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
5834         SUBST (XEXP (x, 1),
5835                force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
5836                               ((unsigned HOST_WIDE_INT) 1
5837                                << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
5838                               - 1,
5839                               0));
5840       break;
5841
5842     default:
5843       break;
5844     }
5845
5846   return x;
5847 }
5848 \f
5849 /* Simplify X, an IF_THEN_ELSE expression.  Return the new expression.  */
5850
5851 static rtx
5852 simplify_if_then_else (rtx x)
5853 {
5854   enum machine_mode mode = GET_MODE (x);
5855   rtx cond = XEXP (x, 0);
5856   rtx true_rtx = XEXP (x, 1);
5857   rtx false_rtx = XEXP (x, 2);
5858   enum rtx_code true_code = GET_CODE (cond);
5859   int comparison_p = COMPARISON_P (cond);
5860   rtx temp;
5861   int i;
5862   enum rtx_code false_code;
5863   rtx reversed;
5864
5865   /* Simplify storing of the truth value.  */
5866   if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
5867     return simplify_gen_relational (true_code, mode, VOIDmode,
5868                                     XEXP (cond, 0), XEXP (cond, 1));
5869
5870   /* Also when the truth value has to be reversed.  */
5871   if (comparison_p
5872       && true_rtx == const0_rtx && false_rtx == const_true_rtx
5873       && (reversed = reversed_comparison (cond, mode)))
5874     return reversed;
5875
5876   /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
5877      in it is being compared against certain values.  Get the true and false
5878      comparisons and see if that says anything about the value of each arm.  */
5879
5880   if (comparison_p
5881       && ((false_code = reversed_comparison_code (cond, NULL))
5882           != UNKNOWN)
5883       && REG_P (XEXP (cond, 0)))
5884     {
5885       HOST_WIDE_INT nzb;
5886       rtx from = XEXP (cond, 0);
5887       rtx true_val = XEXP (cond, 1);
5888       rtx false_val = true_val;
5889       int swapped = 0;
5890
5891       /* If FALSE_CODE is EQ, swap the codes and arms.  */
5892
5893       if (false_code == EQ)
5894         {
5895           swapped = 1, true_code = EQ, false_code = NE;
5896           temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5897         }
5898
5899       /* If we are comparing against zero and the expression being tested has
5900          only a single bit that might be nonzero, that is its value when it is
5901          not equal to zero.  Similarly if it is known to be -1 or 0.  */
5902
5903       if (true_code == EQ && true_val == const0_rtx
5904           && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
5905         {
5906           false_code = EQ;
5907           false_val = GEN_INT (trunc_int_for_mode (nzb, GET_MODE (from)));
5908         }
5909       else if (true_code == EQ && true_val == const0_rtx
5910                && (num_sign_bit_copies (from, GET_MODE (from))
5911                    == GET_MODE_BITSIZE (GET_MODE (from))))
5912         {
5913           false_code = EQ;
5914           false_val = constm1_rtx;
5915         }
5916
5917       /* Now simplify an arm if we know the value of the register in the
5918          branch and it is used in the arm.  Be careful due to the potential
5919          of locally-shared RTL.  */
5920
5921       if (reg_mentioned_p (from, true_rtx))
5922         true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
5923                                       from, true_val),
5924                       pc_rtx, pc_rtx, 0, 0);
5925       if (reg_mentioned_p (from, false_rtx))
5926         false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
5927                                    from, false_val),
5928                        pc_rtx, pc_rtx, 0, 0);
5929
5930       SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
5931       SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
5932
5933       true_rtx = XEXP (x, 1);
5934       false_rtx = XEXP (x, 2);
5935       true_code = GET_CODE (cond);
5936     }
5937
5938   /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
5939      reversed, do so to avoid needing two sets of patterns for
5940      subtract-and-branch insns.  Similarly if we have a constant in the true
5941      arm, the false arm is the same as the first operand of the comparison, or
5942      the false arm is more complicated than the true arm.  */
5943
5944   if (comparison_p
5945       && reversed_comparison_code (cond, NULL) != UNKNOWN
5946       && (true_rtx == pc_rtx
5947           || (CONSTANT_P (true_rtx)
5948               && !CONST_INT_P (false_rtx) && false_rtx != pc_rtx)
5949           || true_rtx == const0_rtx
5950           || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
5951           || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
5952               && !OBJECT_P (false_rtx))
5953           || reg_mentioned_p (true_rtx, false_rtx)
5954           || rtx_equal_p (false_rtx, XEXP (cond, 0))))
5955     {
5956       true_code = reversed_comparison_code (cond, NULL);
5957       SUBST (XEXP (x, 0), reversed_comparison (cond, GET_MODE (cond)));
5958       SUBST (XEXP (x, 1), false_rtx);
5959       SUBST (XEXP (x, 2), true_rtx);
5960
5961       temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5962       cond = XEXP (x, 0);
5963
5964       /* It is possible that the conditional has been simplified out.  */
5965       true_code = GET_CODE (cond);
5966       comparison_p = COMPARISON_P (cond);
5967     }
5968
5969   /* If the two arms are identical, we don't need the comparison.  */
5970
5971   if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
5972     return true_rtx;
5973
5974   /* Convert a == b ? b : a to "a".  */
5975   if (true_code == EQ && ! side_effects_p (cond)
5976       && !HONOR_NANS (mode)
5977       && rtx_equal_p (XEXP (cond, 0), false_rtx)
5978       && rtx_equal_p (XEXP (cond, 1), true_rtx))
5979     return false_rtx;
5980   else if (true_code == NE && ! side_effects_p (cond)
5981            && !HONOR_NANS (mode)
5982            && rtx_equal_p (XEXP (cond, 0), true_rtx)
5983            && rtx_equal_p (XEXP (cond, 1), false_rtx))
5984     return true_rtx;
5985
5986   /* Look for cases where we have (abs x) or (neg (abs X)).  */
5987
5988   if (GET_MODE_CLASS (mode) == MODE_INT
5989       && comparison_p
5990       && XEXP (cond, 1) == const0_rtx
5991       && GET_CODE (false_rtx) == NEG
5992       && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
5993       && rtx_equal_p (true_rtx, XEXP (cond, 0))
5994       && ! side_effects_p (true_rtx))
5995     switch (true_code)
5996       {
5997       case GT:
5998       case GE:
5999         return simplify_gen_unary (ABS, mode, true_rtx, mode);
6000       case LT:
6001       case LE:
6002         return
6003           simplify_gen_unary (NEG, mode,
6004                               simplify_gen_unary (ABS, mode, true_rtx, mode),
6005                               mode);
6006       default:
6007         break;
6008       }
6009
6010   /* Look for MIN or MAX.  */
6011
6012   if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
6013       && comparison_p
6014       && rtx_equal_p (XEXP (cond, 0), true_rtx)
6015       && rtx_equal_p (XEXP (cond, 1), false_rtx)
6016       && ! side_effects_p (cond))
6017     switch (true_code)
6018       {
6019       case GE:
6020       case GT:
6021         return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
6022       case LE:
6023       case LT:
6024         return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
6025       case GEU:
6026       case GTU:
6027         return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
6028       case LEU:
6029       case LTU:
6030         return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
6031       default:
6032         break;
6033       }
6034
6035   /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
6036      second operand is zero, this can be done as (OP Z (mult COND C2)) where
6037      C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
6038      SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
6039      We can do this kind of thing in some cases when STORE_FLAG_VALUE is
6040      neither 1 or -1, but it isn't worth checking for.  */
6041
6042   if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
6043       && comparison_p
6044       && GET_MODE_CLASS (mode) == MODE_INT
6045       && ! side_effects_p (x))
6046     {
6047       rtx t = make_compound_operation (true_rtx, SET);
6048       rtx f = make_compound_operation (false_rtx, SET);
6049       rtx cond_op0 = XEXP (cond, 0);
6050       rtx cond_op1 = XEXP (cond, 1);
6051       enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
6052       enum machine_mode m = mode;
6053       rtx z = 0, c1 = NULL_RTX;
6054
6055       if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
6056            || GET_CODE (t) == IOR || GET_CODE (t) == XOR
6057            || GET_CODE (t) == ASHIFT
6058            || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
6059           && rtx_equal_p (XEXP (t, 0), f))
6060         c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
6061
6062       /* If an identity-zero op is commutative, check whether there
6063          would be a match if we swapped the operands.  */
6064       else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
6065                 || GET_CODE (t) == XOR)
6066                && rtx_equal_p (XEXP (t, 1), f))
6067         c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
6068       else if (GET_CODE (t) == SIGN_EXTEND
6069                && (GET_CODE (XEXP (t, 0)) == PLUS
6070                    || GET_CODE (XEXP (t, 0)) == MINUS
6071                    || GET_CODE (XEXP (t, 0)) == IOR
6072                    || GET_CODE (XEXP (t, 0)) == XOR
6073                    || GET_CODE (XEXP (t, 0)) == ASHIFT
6074                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
6075                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
6076                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
6077                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
6078                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
6079                && (num_sign_bit_copies (f, GET_MODE (f))
6080                    > (unsigned int)
6081                      (GET_MODE_BITSIZE (mode)
6082                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
6083         {
6084           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
6085           extend_op = SIGN_EXTEND;
6086           m = GET_MODE (XEXP (t, 0));
6087         }
6088       else if (GET_CODE (t) == SIGN_EXTEND
6089                && (GET_CODE (XEXP (t, 0)) == PLUS
6090                    || GET_CODE (XEXP (t, 0)) == IOR
6091                    || GET_CODE (XEXP (t, 0)) == XOR)
6092                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
6093                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
6094                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
6095                && (num_sign_bit_copies (f, GET_MODE (f))
6096                    > (unsigned int)
6097                      (GET_MODE_BITSIZE (mode)
6098                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
6099         {
6100           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
6101           extend_op = SIGN_EXTEND;
6102           m = GET_MODE (XEXP (t, 0));
6103         }
6104       else if (GET_CODE (t) == ZERO_EXTEND
6105                && (GET_CODE (XEXP (t, 0)) == PLUS
6106                    || GET_CODE (XEXP (t, 0)) == MINUS
6107                    || GET_CODE (XEXP (t, 0)) == IOR
6108                    || GET_CODE (XEXP (t, 0)) == XOR
6109                    || GET_CODE (XEXP (t, 0)) == ASHIFT
6110                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
6111                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
6112                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
6113                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
6114                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
6115                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
6116                && ((nonzero_bits (f, GET_MODE (f))
6117                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
6118                    == 0))
6119         {
6120           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
6121           extend_op = ZERO_EXTEND;
6122           m = GET_MODE (XEXP (t, 0));
6123         }
6124       else if (GET_CODE (t) == ZERO_EXTEND
6125                && (GET_CODE (XEXP (t, 0)) == PLUS
6126                    || GET_CODE (XEXP (t, 0)) == IOR
6127                    || GET_CODE (XEXP (t, 0)) == XOR)
6128                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
6129                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
6130                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
6131                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
6132                && ((nonzero_bits (f, GET_MODE (f))
6133                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
6134                    == 0))
6135         {
6136           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
6137           extend_op = ZERO_EXTEND;
6138           m = GET_MODE (XEXP (t, 0));
6139         }
6140
6141       if (z)
6142         {
6143           temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
6144                                                  cond_op0, cond_op1),
6145                         pc_rtx, pc_rtx, 0, 0);
6146           temp = simplify_gen_binary (MULT, m, temp,
6147                                       simplify_gen_binary (MULT, m, c1,
6148                                                            const_true_rtx));
6149           temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
6150           temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
6151
6152           if (extend_op != UNKNOWN)
6153             temp = simplify_gen_unary (extend_op, mode, temp, m);
6154
6155           return temp;
6156         }
6157     }
6158
6159   /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
6160      1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
6161      negation of a single bit, we can convert this operation to a shift.  We
6162      can actually do this more generally, but it doesn't seem worth it.  */
6163
6164   if (true_code == NE && XEXP (cond, 1) == const0_rtx
6165       && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
6166       && ((1 == nonzero_bits (XEXP (cond, 0), mode)
6167            && (i = exact_log2 (UINTVAL (true_rtx))) >= 0)
6168           || ((num_sign_bit_copies (XEXP (cond, 0), mode)
6169                == GET_MODE_BITSIZE (mode))
6170               && (i = exact_log2 (-UINTVAL (true_rtx))) >= 0)))
6171     return
6172       simplify_shift_const (NULL_RTX, ASHIFT, mode,
6173                             gen_lowpart (mode, XEXP (cond, 0)), i);
6174
6175   /* (IF_THEN_ELSE (NE REG 0) (0) (8)) is REG for nonzero_bits (REG) == 8.  */
6176   if (true_code == NE && XEXP (cond, 1) == const0_rtx
6177       && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
6178       && GET_MODE (XEXP (cond, 0)) == mode
6179       && (UINTVAL (true_rtx) & GET_MODE_MASK (mode))
6180           == nonzero_bits (XEXP (cond, 0), mode)
6181       && (i = exact_log2 (UINTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
6182     return XEXP (cond, 0);
6183
6184   return x;
6185 }
6186 \f
6187 /* Simplify X, a SET expression.  Return the new expression.  */
6188
6189 static rtx
6190 simplify_set (rtx x)
6191 {
6192   rtx src = SET_SRC (x);
6193   rtx dest = SET_DEST (x);
6194   enum machine_mode mode
6195     = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
6196   rtx other_insn;
6197   rtx *cc_use;
6198
6199   /* (set (pc) (return)) gets written as (return).  */
6200   if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
6201     return src;
6202
6203   /* Now that we know for sure which bits of SRC we are using, see if we can
6204      simplify the expression for the object knowing that we only need the
6205      low-order bits.  */
6206
6207   if (GET_MODE_CLASS (mode) == MODE_INT
6208       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
6209     {
6210       src = force_to_mode (src, mode, ~(unsigned HOST_WIDE_INT) 0, 0);
6211       SUBST (SET_SRC (x), src);
6212     }
6213
6214   /* If we are setting CC0 or if the source is a COMPARE, look for the use of
6215      the comparison result and try to simplify it unless we already have used
6216      undobuf.other_insn.  */
6217   if ((GET_MODE_CLASS (mode) == MODE_CC
6218        || GET_CODE (src) == COMPARE
6219        || CC0_P (dest))
6220       && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
6221       && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
6222       && COMPARISON_P (*cc_use)
6223       && rtx_equal_p (XEXP (*cc_use, 0), dest))
6224     {
6225       enum rtx_code old_code = GET_CODE (*cc_use);
6226       enum rtx_code new_code;
6227       rtx op0, op1, tmp;
6228       int other_changed = 0;
6229       enum machine_mode compare_mode = GET_MODE (dest);
6230
6231       if (GET_CODE (src) == COMPARE)
6232         op0 = XEXP (src, 0), op1 = XEXP (src, 1);
6233       else
6234         op0 = src, op1 = CONST0_RTX (GET_MODE (src));
6235
6236       tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
6237                                            op0, op1);
6238       if (!tmp)
6239         new_code = old_code;
6240       else if (!CONSTANT_P (tmp))
6241         {
6242           new_code = GET_CODE (tmp);
6243           op0 = XEXP (tmp, 0);
6244           op1 = XEXP (tmp, 1);
6245         }
6246       else
6247         {
6248           rtx pat = PATTERN (other_insn);
6249           undobuf.other_insn = other_insn;
6250           SUBST (*cc_use, tmp);
6251
6252           /* Attempt to simplify CC user.  */
6253           if (GET_CODE (pat) == SET)
6254             {
6255               rtx new_rtx = simplify_rtx (SET_SRC (pat));
6256               if (new_rtx != NULL_RTX)
6257                 SUBST (SET_SRC (pat), new_rtx);
6258             }
6259
6260           /* Convert X into a no-op move.  */
6261           SUBST (SET_DEST (x), pc_rtx);
6262           SUBST (SET_SRC (x), pc_rtx);
6263           return x;
6264         }
6265
6266       /* Simplify our comparison, if possible.  */
6267       new_code = simplify_comparison (new_code, &op0, &op1);
6268
6269 #ifdef SELECT_CC_MODE
6270       /* If this machine has CC modes other than CCmode, check to see if we
6271          need to use a different CC mode here.  */
6272       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
6273         compare_mode = GET_MODE (op0);
6274       else
6275         compare_mode = SELECT_CC_MODE (new_code, op0, op1);
6276
6277 #ifndef HAVE_cc0
6278       /* If the mode changed, we have to change SET_DEST, the mode in the
6279          compare, and the mode in the place SET_DEST is used.  If SET_DEST is
6280          a hard register, just build new versions with the proper mode.  If it
6281          is a pseudo, we lose unless it is only time we set the pseudo, in
6282          which case we can safely change its mode.  */
6283       if (compare_mode != GET_MODE (dest))
6284         {
6285           if (can_change_dest_mode (dest, 0, compare_mode))
6286             {
6287               unsigned int regno = REGNO (dest);
6288               rtx new_dest;
6289
6290               if (regno < FIRST_PSEUDO_REGISTER)
6291                 new_dest = gen_rtx_REG (compare_mode, regno);
6292               else
6293                 {
6294                   SUBST_MODE (regno_reg_rtx[regno], compare_mode);
6295                   new_dest = regno_reg_rtx[regno];
6296                 }
6297
6298               SUBST (SET_DEST (x), new_dest);
6299               SUBST (XEXP (*cc_use, 0), new_dest);
6300               other_changed = 1;
6301
6302               dest = new_dest;
6303             }
6304         }
6305 #endif  /* cc0 */
6306 #endif  /* SELECT_CC_MODE */
6307
6308       /* If the code changed, we have to build a new comparison in
6309          undobuf.other_insn.  */
6310       if (new_code != old_code)
6311         {
6312           int other_changed_previously = other_changed;
6313           unsigned HOST_WIDE_INT mask;
6314           rtx old_cc_use = *cc_use;
6315
6316           SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
6317                                           dest, const0_rtx));
6318           other_changed = 1;
6319
6320           /* If the only change we made was to change an EQ into an NE or
6321              vice versa, OP0 has only one bit that might be nonzero, and OP1
6322              is zero, check if changing the user of the condition code will
6323              produce a valid insn.  If it won't, we can keep the original code
6324              in that insn by surrounding our operation with an XOR.  */
6325
6326           if (((old_code == NE && new_code == EQ)
6327                || (old_code == EQ && new_code == NE))
6328               && ! other_changed_previously && op1 == const0_rtx
6329               && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
6330               && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
6331             {
6332               rtx pat = PATTERN (other_insn), note = 0;
6333
6334               if ((recog_for_combine (&pat, other_insn, &note) < 0
6335                    && ! check_asm_operands (pat)))
6336                 {
6337                   *cc_use = old_cc_use;
6338                   other_changed = 0;
6339
6340                   op0 = simplify_gen_binary (XOR, GET_MODE (op0),
6341                                              op0, GEN_INT (mask));
6342                 }
6343             }
6344         }
6345
6346       if (other_changed)
6347         undobuf.other_insn = other_insn;
6348
6349       /* Otherwise, if we didn't previously have a COMPARE in the
6350          correct mode, we need one.  */
6351       if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
6352         {
6353           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
6354           src = SET_SRC (x);
6355         }
6356       else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
6357         {
6358           SUBST (SET_SRC (x), op0);
6359           src = SET_SRC (x);
6360         }
6361       /* Otherwise, update the COMPARE if needed.  */
6362       else if (XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
6363         {
6364           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
6365           src = SET_SRC (x);
6366         }
6367     }
6368   else
6369     {
6370       /* Get SET_SRC in a form where we have placed back any
6371          compound expressions.  Then do the checks below.  */
6372       src = make_compound_operation (src, SET);
6373       SUBST (SET_SRC (x), src);
6374     }
6375
6376   /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
6377      and X being a REG or (subreg (reg)), we may be able to convert this to
6378      (set (subreg:m2 x) (op)).
6379
6380      We can always do this if M1 is narrower than M2 because that means that
6381      we only care about the low bits of the result.
6382
6383      However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
6384      perform a narrower operation than requested since the high-order bits will
6385      be undefined.  On machine where it is defined, this transformation is safe
6386      as long as M1 and M2 have the same number of words.  */
6387
6388   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6389       && !OBJECT_P (SUBREG_REG (src))
6390       && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
6391            / UNITS_PER_WORD)
6392           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
6393                + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
6394 #ifndef WORD_REGISTER_OPERATIONS
6395       && (GET_MODE_SIZE (GET_MODE (src))
6396         < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
6397 #endif
6398 #ifdef CANNOT_CHANGE_MODE_CLASS
6399       && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
6400             && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
6401                                          GET_MODE (SUBREG_REG (src)),
6402                                          GET_MODE (src)))
6403 #endif
6404       && (REG_P (dest)
6405           || (GET_CODE (dest) == SUBREG
6406               && REG_P (SUBREG_REG (dest)))))
6407     {
6408       SUBST (SET_DEST (x),
6409              gen_lowpart (GET_MODE (SUBREG_REG (src)),
6410                                       dest));
6411       SUBST (SET_SRC (x), SUBREG_REG (src));
6412
6413       src = SET_SRC (x), dest = SET_DEST (x);
6414     }
6415
6416 #ifdef HAVE_cc0
6417   /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
6418      in SRC.  */
6419   if (dest == cc0_rtx
6420       && GET_CODE (src) == SUBREG
6421       && subreg_lowpart_p (src)
6422       && (GET_MODE_BITSIZE (GET_MODE (src))
6423           < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
6424     {
6425       rtx inner = SUBREG_REG (src);
6426       enum machine_mode inner_mode = GET_MODE (inner);
6427
6428       /* Here we make sure that we don't have a sign bit on.  */
6429       if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
6430           && (nonzero_bits (inner, inner_mode)
6431               < ((unsigned HOST_WIDE_INT) 1
6432                  << (GET_MODE_BITSIZE (GET_MODE (src)) - 1))))
6433         {
6434           SUBST (SET_SRC (x), inner);
6435           src = SET_SRC (x);
6436         }
6437     }
6438 #endif
6439
6440 #ifdef LOAD_EXTEND_OP
6441   /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
6442      would require a paradoxical subreg.  Replace the subreg with a
6443      zero_extend to avoid the reload that would otherwise be required.  */
6444
6445   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6446       && INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (src)))
6447       && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != UNKNOWN
6448       && SUBREG_BYTE (src) == 0
6449       && (GET_MODE_SIZE (GET_MODE (src))
6450           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
6451       && MEM_P (SUBREG_REG (src)))
6452     {
6453       SUBST (SET_SRC (x),
6454              gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
6455                             GET_MODE (src), SUBREG_REG (src)));
6456
6457       src = SET_SRC (x);
6458     }
6459 #endif
6460
6461   /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
6462      are comparing an item known to be 0 or -1 against 0, use a logical
6463      operation instead. Check for one of the arms being an IOR of the other
6464      arm with some value.  We compute three terms to be IOR'ed together.  In
6465      practice, at most two will be nonzero.  Then we do the IOR's.  */
6466
6467   if (GET_CODE (dest) != PC
6468       && GET_CODE (src) == IF_THEN_ELSE
6469       && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
6470       && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
6471       && XEXP (XEXP (src, 0), 1) == const0_rtx
6472       && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
6473 #ifdef HAVE_conditional_move
6474       && ! can_conditionally_move_p (GET_MODE (src))
6475 #endif
6476       && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
6477                                GET_MODE (XEXP (XEXP (src, 0), 0)))
6478           == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
6479       && ! side_effects_p (src))
6480     {
6481       rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
6482                       ? XEXP (src, 1) : XEXP (src, 2));
6483       rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
6484                    ? XEXP (src, 2) : XEXP (src, 1));
6485       rtx term1 = const0_rtx, term2, term3;
6486
6487       if (GET_CODE (true_rtx) == IOR
6488           && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
6489         term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
6490       else if (GET_CODE (true_rtx) == IOR
6491                && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
6492         term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
6493       else if (GET_CODE (false_rtx) == IOR
6494                && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
6495         term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
6496       else if (GET_CODE (false_rtx) == IOR
6497                && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
6498         term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
6499
6500       term2 = simplify_gen_binary (AND, GET_MODE (src),
6501                                    XEXP (XEXP (src, 0), 0), true_rtx);
6502       term3 = simplify_gen_binary (AND, GET_MODE (src),
6503                                    simplify_gen_unary (NOT, GET_MODE (src),
6504                                                        XEXP (XEXP (src, 0), 0),
6505                                                        GET_MODE (src)),
6506                                    false_rtx);
6507
6508       SUBST (SET_SRC (x),
6509              simplify_gen_binary (IOR, GET_MODE (src),
6510                                   simplify_gen_binary (IOR, GET_MODE (src),
6511                                                        term1, term2),
6512                                   term3));
6513
6514       src = SET_SRC (x);
6515     }
6516
6517   /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
6518      whole thing fail.  */
6519   if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
6520     return src;
6521   else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
6522     return dest;
6523   else
6524     /* Convert this into a field assignment operation, if possible.  */
6525     return make_field_assignment (x);
6526 }
6527 \f
6528 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
6529    result.  */
6530
6531 static rtx
6532 simplify_logical (rtx x)
6533 {
6534   enum machine_mode mode = GET_MODE (x);
6535   rtx op0 = XEXP (x, 0);
6536   rtx op1 = XEXP (x, 1);
6537
6538   switch (GET_CODE (x))
6539     {
6540     case AND:
6541       /* We can call simplify_and_const_int only if we don't lose
6542          any (sign) bits when converting INTVAL (op1) to
6543          "unsigned HOST_WIDE_INT".  */
6544       if (CONST_INT_P (op1)
6545           && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
6546               || INTVAL (op1) > 0))
6547         {
6548           x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
6549           if (GET_CODE (x) != AND)
6550             return x;
6551
6552           op0 = XEXP (x, 0);
6553           op1 = XEXP (x, 1);
6554         }
6555
6556       /* If we have any of (and (ior A B) C) or (and (xor A B) C),
6557          apply the distributive law and then the inverse distributive
6558          law to see if things simplify.  */
6559       if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
6560         {
6561           rtx result = distribute_and_simplify_rtx (x, 0);
6562           if (result)
6563             return result;
6564         }
6565       if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
6566         {
6567           rtx result = distribute_and_simplify_rtx (x, 1);
6568           if (result)
6569             return result;
6570         }
6571       break;
6572
6573     case IOR:
6574       /* If we have (ior (and A B) C), apply the distributive law and then
6575          the inverse distributive law to see if things simplify.  */
6576
6577       if (GET_CODE (op0) == AND)
6578         {
6579           rtx result = distribute_and_simplify_rtx (x, 0);
6580           if (result)
6581             return result;
6582         }
6583
6584       if (GET_CODE (op1) == AND)
6585         {
6586           rtx result = distribute_and_simplify_rtx (x, 1);
6587           if (result)
6588             return result;
6589         }
6590       break;
6591
6592     default:
6593       gcc_unreachable ();
6594     }
6595
6596   return x;
6597 }
6598 \f
6599 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
6600    operations" because they can be replaced with two more basic operations.
6601    ZERO_EXTEND is also considered "compound" because it can be replaced with
6602    an AND operation, which is simpler, though only one operation.
6603
6604    The function expand_compound_operation is called with an rtx expression
6605    and will convert it to the appropriate shifts and AND operations,
6606    simplifying at each stage.
6607
6608    The function make_compound_operation is called to convert an expression
6609    consisting of shifts and ANDs into the equivalent compound expression.
6610    It is the inverse of this function, loosely speaking.  */
6611
6612 static rtx
6613 expand_compound_operation (rtx x)
6614 {
6615   unsigned HOST_WIDE_INT pos = 0, len;
6616   int unsignedp = 0;
6617   unsigned int modewidth;
6618   rtx tem;
6619
6620   switch (GET_CODE (x))
6621     {
6622     case ZERO_EXTEND:
6623       unsignedp = 1;
6624     case SIGN_EXTEND:
6625       /* We can't necessarily use a const_int for a multiword mode;
6626          it depends on implicitly extending the value.
6627          Since we don't know the right way to extend it,
6628          we can't tell whether the implicit way is right.
6629
6630          Even for a mode that is no wider than a const_int,
6631          we can't win, because we need to sign extend one of its bits through
6632          the rest of it, and we don't know which bit.  */
6633       if (CONST_INT_P (XEXP (x, 0)))
6634         return x;
6635
6636       /* Return if (subreg:MODE FROM 0) is not a safe replacement for
6637          (zero_extend:MODE FROM) or (sign_extend:MODE FROM).  It is for any MEM
6638          because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
6639          reloaded. If not for that, MEM's would very rarely be safe.
6640
6641          Reject MODEs bigger than a word, because we might not be able
6642          to reference a two-register group starting with an arbitrary register
6643          (and currently gen_lowpart might crash for a SUBREG).  */
6644
6645       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
6646         return x;
6647
6648       /* Reject MODEs that aren't scalar integers because turning vector
6649          or complex modes into shifts causes problems.  */
6650
6651       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6652         return x;
6653
6654       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
6655       /* If the inner object has VOIDmode (the only way this can happen
6656          is if it is an ASM_OPERANDS), we can't do anything since we don't
6657          know how much masking to do.  */
6658       if (len == 0)
6659         return x;
6660
6661       break;
6662
6663     case ZERO_EXTRACT:
6664       unsignedp = 1;
6665
6666       /* ... fall through ...  */
6667
6668     case SIGN_EXTRACT:
6669       /* If the operand is a CLOBBER, just return it.  */
6670       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
6671         return XEXP (x, 0);
6672
6673       if (!CONST_INT_P (XEXP (x, 1))
6674           || !CONST_INT_P (XEXP (x, 2))
6675           || GET_MODE (XEXP (x, 0)) == VOIDmode)
6676         return x;
6677
6678       /* Reject MODEs that aren't scalar integers because turning vector
6679          or complex modes into shifts causes problems.  */
6680
6681       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6682         return x;
6683
6684       len = INTVAL (XEXP (x, 1));
6685       pos = INTVAL (XEXP (x, 2));
6686
6687       /* This should stay within the object being extracted, fail otherwise.  */
6688       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
6689         return x;
6690
6691       if (BITS_BIG_ENDIAN)
6692         pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
6693
6694       break;
6695
6696     default:
6697       return x;
6698     }
6699   /* Convert sign extension to zero extension, if we know that the high
6700      bit is not set, as this is easier to optimize.  It will be converted
6701      back to cheaper alternative in make_extraction.  */
6702   if (GET_CODE (x) == SIGN_EXTEND
6703       && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6704           && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
6705                 & ~(((unsigned HOST_WIDE_INT)
6706                       GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
6707                      >> 1))
6708                == 0)))
6709     {
6710       rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
6711       rtx temp2 = expand_compound_operation (temp);
6712
6713       /* Make sure this is a profitable operation.  */
6714       if (rtx_cost (x, SET, optimize_this_for_speed_p)
6715           > rtx_cost (temp2, SET, optimize_this_for_speed_p))
6716        return temp2;
6717       else if (rtx_cost (x, SET, optimize_this_for_speed_p)
6718                > rtx_cost (temp, SET, optimize_this_for_speed_p))
6719        return temp;
6720       else
6721        return x;
6722     }
6723
6724   /* We can optimize some special cases of ZERO_EXTEND.  */
6725   if (GET_CODE (x) == ZERO_EXTEND)
6726     {
6727       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
6728          know that the last value didn't have any inappropriate bits
6729          set.  */
6730       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6731           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6732           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6733           && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
6734               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6735         return XEXP (XEXP (x, 0), 0);
6736
6737       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
6738       if (GET_CODE (XEXP (x, 0)) == SUBREG
6739           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6740           && subreg_lowpart_p (XEXP (x, 0))
6741           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6742           && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
6743               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6744         return SUBREG_REG (XEXP (x, 0));
6745
6746       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
6747          is a comparison and STORE_FLAG_VALUE permits.  This is like
6748          the first case, but it works even when GET_MODE (x) is larger
6749          than HOST_WIDE_INT.  */
6750       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6751           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6752           && COMPARISON_P (XEXP (XEXP (x, 0), 0))
6753           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6754               <= HOST_BITS_PER_WIDE_INT)
6755           && (STORE_FLAG_VALUE & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6756         return XEXP (XEXP (x, 0), 0);
6757
6758       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
6759       if (GET_CODE (XEXP (x, 0)) == SUBREG
6760           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6761           && subreg_lowpart_p (XEXP (x, 0))
6762           && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
6763           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6764               <= HOST_BITS_PER_WIDE_INT)
6765           && (STORE_FLAG_VALUE & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6766         return SUBREG_REG (XEXP (x, 0));
6767
6768     }
6769
6770   /* If we reach here, we want to return a pair of shifts.  The inner
6771      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
6772      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
6773      logical depending on the value of UNSIGNEDP.
6774
6775      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
6776      converted into an AND of a shift.
6777
6778      We must check for the case where the left shift would have a negative
6779      count.  This can happen in a case like (x >> 31) & 255 on machines
6780      that can't shift by a constant.  On those machines, we would first
6781      combine the shift with the AND to produce a variable-position
6782      extraction.  Then the constant of 31 would be substituted in
6783      to produce such a position.  */
6784
6785   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
6786   if (modewidth >= pos + len)
6787     {
6788       enum machine_mode mode = GET_MODE (x);
6789       tem = gen_lowpart (mode, XEXP (x, 0));
6790       if (!tem || GET_CODE (tem) == CLOBBER)
6791         return x;
6792       tem = simplify_shift_const (NULL_RTX, ASHIFT, mode,
6793                                   tem, modewidth - pos - len);
6794       tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
6795                                   mode, tem, modewidth - len);
6796     }
6797   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
6798     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
6799                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
6800                                                         GET_MODE (x),
6801                                                         XEXP (x, 0), pos),
6802                                   ((unsigned HOST_WIDE_INT) 1 << len) - 1);
6803   else
6804     /* Any other cases we can't handle.  */
6805     return x;
6806
6807   /* If we couldn't do this for some reason, return the original
6808      expression.  */
6809   if (GET_CODE (tem) == CLOBBER)
6810     return x;
6811
6812   return tem;
6813 }
6814 \f
6815 /* X is a SET which contains an assignment of one object into
6816    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
6817    or certain SUBREGS). If possible, convert it into a series of
6818    logical operations.
6819
6820    We half-heartedly support variable positions, but do not at all
6821    support variable lengths.  */
6822
6823 static const_rtx
6824 expand_field_assignment (const_rtx x)
6825 {
6826   rtx inner;
6827   rtx pos;                      /* Always counts from low bit.  */
6828   int len;
6829   rtx mask, cleared, masked;
6830   enum machine_mode compute_mode;
6831
6832   /* Loop until we find something we can't simplify.  */
6833   while (1)
6834     {
6835       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
6836           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
6837         {
6838           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
6839           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
6840           pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
6841         }
6842       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
6843                && CONST_INT_P (XEXP (SET_DEST (x), 1)))
6844         {
6845           inner = XEXP (SET_DEST (x), 0);
6846           len = INTVAL (XEXP (SET_DEST (x), 1));
6847           pos = XEXP (SET_DEST (x), 2);
6848
6849           /* A constant position should stay within the width of INNER.  */
6850           if (CONST_INT_P (pos)
6851               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
6852             break;
6853
6854           if (BITS_BIG_ENDIAN)
6855             {
6856               if (CONST_INT_P (pos))
6857                 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
6858                                - INTVAL (pos));
6859               else if (GET_CODE (pos) == MINUS
6860                        && CONST_INT_P (XEXP (pos, 1))
6861                        && (INTVAL (XEXP (pos, 1))
6862                            == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
6863                 /* If position is ADJUST - X, new position is X.  */
6864                 pos = XEXP (pos, 0);
6865               else
6866                 pos = simplify_gen_binary (MINUS, GET_MODE (pos),
6867                                            GEN_INT (GET_MODE_BITSIZE (
6868                                                     GET_MODE (inner))
6869                                                     - len),
6870                                            pos);
6871             }
6872         }
6873
6874       /* A SUBREG between two modes that occupy the same numbers of words
6875          can be done by moving the SUBREG to the source.  */
6876       else if (GET_CODE (SET_DEST (x)) == SUBREG
6877                /* We need SUBREGs to compute nonzero_bits properly.  */
6878                && nonzero_sign_valid
6879                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
6880                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
6881                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
6882                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
6883         {
6884           x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
6885                            gen_lowpart
6886                            (GET_MODE (SUBREG_REG (SET_DEST (x))),
6887                             SET_SRC (x)));
6888           continue;
6889         }
6890       else
6891         break;
6892
6893       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6894         inner = SUBREG_REG (inner);
6895
6896       compute_mode = GET_MODE (inner);
6897
6898       /* Don't attempt bitwise arithmetic on non scalar integer modes.  */
6899       if (! SCALAR_INT_MODE_P (compute_mode))
6900         {
6901           enum machine_mode imode;
6902
6903           /* Don't do anything for vector or complex integral types.  */
6904           if (! FLOAT_MODE_P (compute_mode))
6905             break;
6906
6907           /* Try to find an integral mode to pun with.  */
6908           imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
6909           if (imode == BLKmode)
6910             break;
6911
6912           compute_mode = imode;
6913           inner = gen_lowpart (imode, inner);
6914         }
6915
6916       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
6917       if (len >= HOST_BITS_PER_WIDE_INT)
6918         break;
6919
6920       /* Now compute the equivalent expression.  Make a copy of INNER
6921          for the SET_DEST in case it is a MEM into which we will substitute;
6922          we don't want shared RTL in that case.  */
6923       mask = GEN_INT (((unsigned HOST_WIDE_INT) 1 << len) - 1);
6924       cleared = simplify_gen_binary (AND, compute_mode,
6925                                      simplify_gen_unary (NOT, compute_mode,
6926                                        simplify_gen_binary (ASHIFT,
6927                                                             compute_mode,
6928                                                             mask, pos),
6929                                        compute_mode),
6930                                      inner);
6931       masked = simplify_gen_binary (ASHIFT, compute_mode,
6932                                     simplify_gen_binary (
6933                                       AND, compute_mode,
6934                                       gen_lowpart (compute_mode, SET_SRC (x)),
6935                                       mask),
6936                                     pos);
6937
6938       x = gen_rtx_SET (VOIDmode, copy_rtx (inner),
6939                        simplify_gen_binary (IOR, compute_mode,
6940                                             cleared, masked));
6941     }
6942
6943   return x;
6944 }
6945 \f
6946 /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
6947    it is an RTX that represents a variable starting position; otherwise,
6948    POS is the (constant) starting bit position (counted from the LSB).
6949
6950    UNSIGNEDP is nonzero for an unsigned reference and zero for a
6951    signed reference.
6952
6953    IN_DEST is nonzero if this is a reference in the destination of a
6954    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If nonzero,
6955    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
6956    be used.
6957
6958    IN_COMPARE is nonzero if we are in a COMPARE.  This means that a
6959    ZERO_EXTRACT should be built even for bits starting at bit 0.
6960
6961    MODE is the desired mode of the result (if IN_DEST == 0).
6962
6963    The result is an RTX for the extraction or NULL_RTX if the target
6964    can't handle it.  */
6965
6966 static rtx
6967 make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
6968                  rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
6969                  int in_dest, int in_compare)
6970 {
6971   /* This mode describes the size of the storage area
6972      to fetch the overall value from.  Within that, we
6973      ignore the POS lowest bits, etc.  */
6974   enum machine_mode is_mode = GET_MODE (inner);
6975   enum machine_mode inner_mode;
6976   enum machine_mode wanted_inner_mode;
6977   enum machine_mode wanted_inner_reg_mode = word_mode;
6978   enum machine_mode pos_mode = word_mode;
6979   enum machine_mode extraction_mode = word_mode;
6980   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
6981   rtx new_rtx = 0;
6982   rtx orig_pos_rtx = pos_rtx;
6983   HOST_WIDE_INT orig_pos;
6984
6985   if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6986     {
6987       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
6988          consider just the QI as the memory to extract from.
6989          The subreg adds or removes high bits; its mode is
6990          irrelevant to the meaning of this extraction,
6991          since POS and LEN count from the lsb.  */
6992       if (MEM_P (SUBREG_REG (inner)))
6993         is_mode = GET_MODE (SUBREG_REG (inner));
6994       inner = SUBREG_REG (inner);
6995     }
6996   else if (GET_CODE (inner) == ASHIFT
6997            && CONST_INT_P (XEXP (inner, 1))
6998            && pos_rtx == 0 && pos == 0
6999            && len > UINTVAL (XEXP (inner, 1)))
7000     {
7001       /* We're extracting the least significant bits of an rtx
7002          (ashift X (const_int C)), where LEN > C.  Extract the
7003          least significant (LEN - C) bits of X, giving an rtx
7004          whose mode is MODE, then shift it left C times.  */
7005       new_rtx = make_extraction (mode, XEXP (inner, 0),
7006                              0, 0, len - INTVAL (XEXP (inner, 1)),
7007                              unsignedp, in_dest, in_compare);
7008       if (new_rtx != 0)
7009         return gen_rtx_ASHIFT (mode, new_rtx, XEXP (inner, 1));
7010     }
7011
7012   inner_mode = GET_MODE (inner);
7013
7014   if (pos_rtx && CONST_INT_P (pos_rtx))
7015     pos = INTVAL (pos_rtx), pos_rtx = 0;
7016
7017   /* See if this can be done without an extraction.  We never can if the
7018      width of the field is not the same as that of some integer mode. For
7019      registers, we can only avoid the extraction if the position is at the
7020      low-order bit and this is either not in the destination or we have the
7021      appropriate STRICT_LOW_PART operation available.
7022
7023      For MEM, we can avoid an extract if the field starts on an appropriate
7024      boundary and we can change the mode of the memory reference.  */
7025
7026   if (tmode != BLKmode
7027       && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
7028            && !MEM_P (inner)
7029            && (inner_mode == tmode
7030                || !REG_P (inner)
7031                || TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode),
7032                                          GET_MODE_BITSIZE (inner_mode))
7033                || reg_truncated_to_mode (tmode, inner))
7034            && (! in_dest
7035                || (REG_P (inner)
7036                    && have_insn_for (STRICT_LOW_PART, tmode))))
7037           || (MEM_P (inner) && pos_rtx == 0
7038               && (pos
7039                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
7040                      : BITS_PER_UNIT)) == 0
7041               /* We can't do this if we are widening INNER_MODE (it
7042                  may not be aligned, for one thing).  */
7043               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
7044               && (inner_mode == tmode
7045                   || (! mode_dependent_address_p (XEXP (inner, 0))
7046                       && ! MEM_VOLATILE_P (inner))))))
7047     {
7048       /* If INNER is a MEM, make a new MEM that encompasses just the desired
7049          field.  If the original and current mode are the same, we need not
7050          adjust the offset.  Otherwise, we do if bytes big endian.
7051
7052          If INNER is not a MEM, get a piece consisting of just the field
7053          of interest (in this case POS % BITS_PER_WORD must be 0).  */
7054
7055       if (MEM_P (inner))
7056         {
7057           HOST_WIDE_INT offset;
7058
7059           /* POS counts from lsb, but make OFFSET count in memory order.  */
7060           if (BYTES_BIG_ENDIAN)
7061             offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
7062           else
7063             offset = pos / BITS_PER_UNIT;
7064
7065           new_rtx = adjust_address_nv (inner, tmode, offset);
7066         }
7067       else if (REG_P (inner))
7068         {
7069           if (tmode != inner_mode)
7070             {
7071               /* We can't call gen_lowpart in a DEST since we
7072                  always want a SUBREG (see below) and it would sometimes
7073                  return a new hard register.  */
7074               if (pos || in_dest)
7075                 {
7076                   HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
7077
7078                   if (WORDS_BIG_ENDIAN
7079                       && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
7080                     final_word = ((GET_MODE_SIZE (inner_mode)
7081                                    - GET_MODE_SIZE (tmode))
7082                                   / UNITS_PER_WORD) - final_word;
7083
7084                   final_word *= UNITS_PER_WORD;
7085                   if (BYTES_BIG_ENDIAN &&
7086                       GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
7087                     final_word += (GET_MODE_SIZE (inner_mode)
7088                                    - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
7089
7090                   /* Avoid creating invalid subregs, for example when
7091                      simplifying (x>>32)&255.  */
7092                   if (!validate_subreg (tmode, inner_mode, inner, final_word))
7093                     return NULL_RTX;
7094
7095                   new_rtx = gen_rtx_SUBREG (tmode, inner, final_word);
7096                 }
7097               else
7098                 new_rtx = gen_lowpart (tmode, inner);
7099             }
7100           else
7101             new_rtx = inner;
7102         }
7103       else
7104         new_rtx = force_to_mode (inner, tmode,
7105                              len >= HOST_BITS_PER_WIDE_INT
7106                              ? ~(unsigned HOST_WIDE_INT) 0
7107                              : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
7108                              0);
7109
7110       /* If this extraction is going into the destination of a SET,
7111          make a STRICT_LOW_PART unless we made a MEM.  */
7112
7113       if (in_dest)
7114         return (MEM_P (new_rtx) ? new_rtx
7115                 : (GET_CODE (new_rtx) != SUBREG
7116                    ? gen_rtx_CLOBBER (tmode, const0_rtx)
7117                    : gen_rtx_STRICT_LOW_PART (VOIDmode, new_rtx)));
7118
7119       if (mode == tmode)
7120         return new_rtx;
7121
7122       if (CONST_INT_P (new_rtx)
7123           || GET_CODE (new_rtx) == CONST_DOUBLE)
7124         return simplify_unary_operation (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
7125                                          mode, new_rtx, tmode);
7126
7127       /* If we know that no extraneous bits are set, and that the high
7128          bit is not set, convert the extraction to the cheaper of
7129          sign and zero extension, that are equivalent in these cases.  */
7130       if (flag_expensive_optimizations
7131           && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
7132               && ((nonzero_bits (new_rtx, tmode)
7133                    & ~(((unsigned HOST_WIDE_INT)
7134                         GET_MODE_MASK (tmode))
7135                        >> 1))
7136                   == 0)))
7137         {
7138           rtx temp = gen_rtx_ZERO_EXTEND (mode, new_rtx);
7139           rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new_rtx);
7140
7141           /* Prefer ZERO_EXTENSION, since it gives more information to
7142              backends.  */
7143           if (rtx_cost (temp, SET, optimize_this_for_speed_p)
7144               <= rtx_cost (temp1, SET, optimize_this_for_speed_p))
7145             return temp;
7146           return temp1;
7147         }
7148
7149       /* Otherwise, sign- or zero-extend unless we already are in the
7150          proper mode.  */
7151
7152       return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
7153                              mode, new_rtx));
7154     }
7155
7156   /* Unless this is a COMPARE or we have a funny memory reference,
7157      don't do anything with zero-extending field extracts starting at
7158      the low-order bit since they are simple AND operations.  */
7159   if (pos_rtx == 0 && pos == 0 && ! in_dest
7160       && ! in_compare && unsignedp)
7161     return 0;
7162
7163   /* Unless INNER is not MEM, reject this if we would be spanning bytes or
7164      if the position is not a constant and the length is not 1.  In all
7165      other cases, we would only be going outside our object in cases when
7166      an original shift would have been undefined.  */
7167   if (MEM_P (inner)
7168       && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
7169           || (pos_rtx != 0 && len != 1)))
7170     return 0;
7171
7172   /* Get the mode to use should INNER not be a MEM, the mode for the position,
7173      and the mode for the result.  */
7174   if (in_dest && mode_for_extraction (EP_insv, -1) != MAX_MACHINE_MODE)
7175     {
7176       wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
7177       pos_mode = mode_for_extraction (EP_insv, 2);
7178       extraction_mode = mode_for_extraction (EP_insv, 3);
7179     }
7180
7181   if (! in_dest && unsignedp
7182       && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
7183     {
7184       wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
7185       pos_mode = mode_for_extraction (EP_extzv, 3);
7186       extraction_mode = mode_for_extraction (EP_extzv, 0);
7187     }
7188
7189   if (! in_dest && ! unsignedp
7190       && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
7191     {
7192       wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
7193       pos_mode = mode_for_extraction (EP_extv, 3);
7194       extraction_mode = mode_for_extraction (EP_extv, 0);
7195     }
7196
7197   /* Never narrow an object, since that might not be safe.  */
7198
7199   if (mode != VOIDmode
7200       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
7201     extraction_mode = mode;
7202
7203   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
7204       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
7205     pos_mode = GET_MODE (pos_rtx);
7206
7207   /* If this is not from memory, the desired mode is the preferred mode
7208      for an extraction pattern's first input operand, or word_mode if there
7209      is none.  */
7210   if (!MEM_P (inner))
7211     wanted_inner_mode = wanted_inner_reg_mode;
7212   else
7213     {
7214       /* Be careful not to go beyond the extracted object and maintain the
7215          natural alignment of the memory.  */
7216       wanted_inner_mode = smallest_mode_for_size (len, MODE_INT);
7217       while (pos % GET_MODE_BITSIZE (wanted_inner_mode) + len
7218              > GET_MODE_BITSIZE (wanted_inner_mode))
7219         {
7220           wanted_inner_mode = GET_MODE_WIDER_MODE (wanted_inner_mode);
7221           gcc_assert (wanted_inner_mode != VOIDmode);
7222         }
7223
7224       /* If we have to change the mode of memory and cannot, the desired mode
7225          is EXTRACTION_MODE.  */
7226       if (inner_mode != wanted_inner_mode
7227           && (mode_dependent_address_p (XEXP (inner, 0))
7228               || MEM_VOLATILE_P (inner)
7229               || pos_rtx))
7230         wanted_inner_mode = extraction_mode;
7231     }
7232
7233   orig_pos = pos;
7234
7235   if (BITS_BIG_ENDIAN)
7236     {
7237       /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
7238          BITS_BIG_ENDIAN style.  If position is constant, compute new
7239          position.  Otherwise, build subtraction.
7240          Note that POS is relative to the mode of the original argument.
7241          If it's a MEM we need to recompute POS relative to that.
7242          However, if we're extracting from (or inserting into) a register,
7243          we want to recompute POS relative to wanted_inner_mode.  */
7244       int width = (MEM_P (inner)
7245                    ? GET_MODE_BITSIZE (is_mode)
7246                    : GET_MODE_BITSIZE (wanted_inner_mode));
7247
7248       if (pos_rtx == 0)
7249         pos = width - len - pos;
7250       else
7251         pos_rtx
7252           = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
7253       /* POS may be less than 0 now, but we check for that below.
7254          Note that it can only be less than 0 if !MEM_P (inner).  */
7255     }
7256
7257   /* If INNER has a wider mode, and this is a constant extraction, try to
7258      make it smaller and adjust the byte to point to the byte containing
7259      the value.  */
7260   if (wanted_inner_mode != VOIDmode
7261       && inner_mode != wanted_inner_mode
7262       && ! pos_rtx
7263       && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
7264       && MEM_P (inner)
7265       && ! mode_dependent_address_p (XEXP (inner, 0))
7266       && ! MEM_VOLATILE_P (inner))
7267     {
7268       int offset = 0;
7269
7270       /* The computations below will be correct if the machine is big
7271          endian in both bits and bytes or little endian in bits and bytes.
7272          If it is mixed, we must adjust.  */
7273
7274       /* If bytes are big endian and we had a paradoxical SUBREG, we must
7275          adjust OFFSET to compensate.  */
7276       if (BYTES_BIG_ENDIAN
7277           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
7278         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
7279
7280       /* We can now move to the desired byte.  */
7281       offset += (pos / GET_MODE_BITSIZE (wanted_inner_mode))
7282                 * GET_MODE_SIZE (wanted_inner_mode);
7283       pos %= GET_MODE_BITSIZE (wanted_inner_mode);
7284
7285       if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
7286           && is_mode != wanted_inner_mode)
7287         offset = (GET_MODE_SIZE (is_mode)
7288                   - GET_MODE_SIZE (wanted_inner_mode) - offset);
7289
7290       inner = adjust_address_nv (inner, wanted_inner_mode, offset);
7291     }
7292
7293   /* If INNER is not memory, get it into the proper mode.  If we are changing
7294      its mode, POS must be a constant and smaller than the size of the new
7295      mode.  */
7296   else if (!MEM_P (inner))
7297     {
7298       /* On the LHS, don't create paradoxical subregs implicitely truncating
7299          the register unless TRULY_NOOP_TRUNCATION.  */
7300       if (in_dest
7301           && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (GET_MODE (inner)),
7302                                      GET_MODE_BITSIZE (wanted_inner_mode)))
7303         return NULL_RTX;
7304
7305       if (GET_MODE (inner) != wanted_inner_mode
7306           && (pos_rtx != 0
7307               || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
7308         return NULL_RTX;
7309
7310       if (orig_pos < 0)
7311         return NULL_RTX;
7312
7313       inner = force_to_mode (inner, wanted_inner_mode,
7314                              pos_rtx
7315                              || len + orig_pos >= HOST_BITS_PER_WIDE_INT
7316                              ? ~(unsigned HOST_WIDE_INT) 0
7317                              : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
7318                                 << orig_pos),
7319                              0);
7320     }
7321
7322   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
7323      have to zero extend.  Otherwise, we can just use a SUBREG.  */
7324   if (pos_rtx != 0
7325       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
7326     {
7327       rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
7328
7329       /* If we know that no extraneous bits are set, and that the high
7330          bit is not set, convert extraction to cheaper one - either
7331          SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
7332          cases.  */
7333       if (flag_expensive_optimizations
7334           && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
7335               && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
7336                    & ~(((unsigned HOST_WIDE_INT)
7337                         GET_MODE_MASK (GET_MODE (pos_rtx)))
7338                        >> 1))
7339                   == 0)))
7340         {
7341           rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
7342
7343           /* Prefer ZERO_EXTENSION, since it gives more information to
7344              backends.  */
7345           if (rtx_cost (temp1, SET, optimize_this_for_speed_p)
7346               < rtx_cost (temp, SET, optimize_this_for_speed_p))
7347             temp = temp1;
7348         }
7349       pos_rtx = temp;
7350     }
7351   else if (pos_rtx != 0
7352            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
7353     pos_rtx = gen_lowpart (pos_mode, pos_rtx);
7354
7355   /* Make POS_RTX unless we already have it and it is correct.  If we don't
7356      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
7357      be a CONST_INT.  */
7358   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
7359     pos_rtx = orig_pos_rtx;
7360
7361   else if (pos_rtx == 0)
7362     pos_rtx = GEN_INT (pos);
7363
7364   /* Make the required operation.  See if we can use existing rtx.  */
7365   new_rtx = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
7366                          extraction_mode, inner, GEN_INT (len), pos_rtx);
7367   if (! in_dest)
7368     new_rtx = gen_lowpart (mode, new_rtx);
7369
7370   return new_rtx;
7371 }
7372 \f
7373 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
7374    with any other operations in X.  Return X without that shift if so.  */
7375
7376 static rtx
7377 extract_left_shift (rtx x, int count)
7378 {
7379   enum rtx_code code = GET_CODE (x);
7380   enum machine_mode mode = GET_MODE (x);
7381   rtx tem;
7382
7383   switch (code)
7384     {
7385     case ASHIFT:
7386       /* This is the shift itself.  If it is wide enough, we will return
7387          either the value being shifted if the shift count is equal to
7388          COUNT or a shift for the difference.  */
7389       if (CONST_INT_P (XEXP (x, 1))
7390           && INTVAL (XEXP (x, 1)) >= count)
7391         return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
7392                                      INTVAL (XEXP (x, 1)) - count);
7393       break;
7394
7395     case NEG:  case NOT:
7396       if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7397         return simplify_gen_unary (code, mode, tem, mode);
7398
7399       break;
7400
7401     case PLUS:  case IOR:  case XOR:  case AND:
7402       /* If we can safely shift this constant and we find the inner shift,
7403          make a new operation.  */
7404       if (CONST_INT_P (XEXP (x, 1))
7405           && (UINTVAL (XEXP (x, 1))
7406               & ((((unsigned HOST_WIDE_INT) 1 << count)) - 1)) == 0
7407           && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7408         return simplify_gen_binary (code, mode, tem,
7409                                     GEN_INT (INTVAL (XEXP (x, 1)) >> count));
7410
7411       break;
7412
7413     default:
7414       break;
7415     }
7416
7417   return 0;
7418 }
7419 \f
7420 /* Look at the expression rooted at X.  Look for expressions
7421    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
7422    Form these expressions.
7423
7424    Return the new rtx, usually just X.
7425
7426    Also, for machines like the VAX that don't have logical shift insns,
7427    try to convert logical to arithmetic shift operations in cases where
7428    they are equivalent.  This undoes the canonicalizations to logical
7429    shifts done elsewhere.
7430
7431    We try, as much as possible, to re-use rtl expressions to save memory.
7432
7433    IN_CODE says what kind of expression we are processing.  Normally, it is
7434    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
7435    being kludges), it is MEM.  When processing the arguments of a comparison
7436    or a COMPARE against zero, it is COMPARE.  */
7437
7438 static rtx
7439 make_compound_operation (rtx x, enum rtx_code in_code)
7440 {
7441   enum rtx_code code = GET_CODE (x);
7442   enum machine_mode mode = GET_MODE (x);
7443   int mode_width = GET_MODE_BITSIZE (mode);
7444   rtx rhs, lhs;
7445   enum rtx_code next_code;
7446   int i, j;
7447   rtx new_rtx = 0;
7448   rtx tem;
7449   const char *fmt;
7450
7451   /* Select the code to be used in recursive calls.  Once we are inside an
7452      address, we stay there.  If we have a comparison, set to COMPARE,
7453      but once inside, go back to our default of SET.  */
7454
7455   next_code = (code == MEM ? MEM
7456                : ((code == PLUS || code == MINUS)
7457                   && SCALAR_INT_MODE_P (mode)) ? MEM
7458                : ((code == COMPARE || COMPARISON_P (x))
7459                   && XEXP (x, 1) == const0_rtx) ? COMPARE
7460                : in_code == COMPARE ? SET : in_code);
7461
7462   /* Process depending on the code of this operation.  If NEW is set
7463      nonzero, it will be returned.  */
7464
7465   switch (code)
7466     {
7467     case ASHIFT:
7468       /* Convert shifts by constants into multiplications if inside
7469          an address.  */
7470       if (in_code == MEM && CONST_INT_P (XEXP (x, 1))
7471           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7472           && INTVAL (XEXP (x, 1)) >= 0)
7473         {
7474           HOST_WIDE_INT count = INTVAL (XEXP (x, 1));
7475           HOST_WIDE_INT multval = (HOST_WIDE_INT) 1 << count;
7476
7477           new_rtx = make_compound_operation (XEXP (x, 0), next_code);
7478           if (GET_CODE (new_rtx) == NEG)
7479             {
7480               new_rtx = XEXP (new_rtx, 0);
7481               multval = -multval;
7482             }
7483           multval = trunc_int_for_mode (multval, mode);
7484           new_rtx = gen_rtx_MULT (mode, new_rtx, GEN_INT (multval));
7485         }
7486       break;
7487
7488     case PLUS:
7489       lhs = XEXP (x, 0);
7490       rhs = XEXP (x, 1);
7491       lhs = make_compound_operation (lhs, next_code);
7492       rhs = make_compound_operation (rhs, next_code);
7493       if (GET_CODE (lhs) == MULT && GET_CODE (XEXP (lhs, 0)) == NEG
7494           && SCALAR_INT_MODE_P (mode))
7495         {
7496           tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (lhs, 0), 0),
7497                                      XEXP (lhs, 1));
7498           new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
7499         }
7500       else if (GET_CODE (lhs) == MULT
7501                && (CONST_INT_P (XEXP (lhs, 1)) && INTVAL (XEXP (lhs, 1)) < 0))
7502         {
7503           tem = simplify_gen_binary (MULT, mode, XEXP (lhs, 0),
7504                                      simplify_gen_unary (NEG, mode,
7505                                                          XEXP (lhs, 1),
7506                                                          mode));
7507           new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
7508         }
7509       else
7510         {
7511           SUBST (XEXP (x, 0), lhs);
7512           SUBST (XEXP (x, 1), rhs);
7513           goto maybe_swap;
7514         }
7515       x = gen_lowpart (mode, new_rtx);
7516       goto maybe_swap;
7517
7518     case MINUS:
7519       lhs = XEXP (x, 0);
7520       rhs = XEXP (x, 1);
7521       lhs = make_compound_operation (lhs, next_code);
7522       rhs = make_compound_operation (rhs, next_code);
7523       if (GET_CODE (rhs) == MULT && GET_CODE (XEXP (rhs, 0)) == NEG
7524           && SCALAR_INT_MODE_P (mode))
7525         {
7526           tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (rhs, 0), 0),
7527                                      XEXP (rhs, 1));
7528           new_rtx = simplify_gen_binary (PLUS, mode, tem, lhs);
7529         }
7530       else if (GET_CODE (rhs) == MULT
7531                && (CONST_INT_P (XEXP (rhs, 1)) && INTVAL (XEXP (rhs, 1)) < 0))
7532         {
7533           tem = simplify_gen_binary (MULT, mode, XEXP (rhs, 0),
7534                                      simplify_gen_unary (NEG, mode,
7535                                                          XEXP (rhs, 1),
7536                                                          mode));
7537           new_rtx = simplify_gen_binary (PLUS, mode, tem, lhs);
7538         }
7539       else
7540         {
7541           SUBST (XEXP (x, 0), lhs);
7542           SUBST (XEXP (x, 1), rhs);
7543           return x;
7544         }
7545       return gen_lowpart (mode, new_rtx);
7546
7547     case AND:
7548       /* If the second operand is not a constant, we can't do anything
7549          with it.  */
7550       if (!CONST_INT_P (XEXP (x, 1)))
7551         break;
7552
7553       /* If the constant is a power of two minus one and the first operand
7554          is a logical right shift, make an extraction.  */
7555       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7556           && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7557         {
7558           new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7559           new_rtx = make_extraction (mode, new_rtx, 0, XEXP (XEXP (x, 0), 1), i, 1,
7560                                  0, in_code == COMPARE);
7561         }
7562
7563       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
7564       else if (GET_CODE (XEXP (x, 0)) == SUBREG
7565                && subreg_lowpart_p (XEXP (x, 0))
7566                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
7567                && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7568         {
7569           new_rtx = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
7570                                          next_code);
7571           new_rtx = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new_rtx, 0,
7572                                  XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
7573                                  0, in_code == COMPARE);
7574         }
7575       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
7576       else if ((GET_CODE (XEXP (x, 0)) == XOR
7577                 || GET_CODE (XEXP (x, 0)) == IOR)
7578                && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
7579                && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
7580                && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7581         {
7582           /* Apply the distributive law, and then try to make extractions.  */
7583           new_rtx = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
7584                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
7585                                              XEXP (x, 1)),
7586                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
7587                                              XEXP (x, 1)));
7588           new_rtx = make_compound_operation (new_rtx, in_code);
7589         }
7590
7591       /* If we are have (and (rotate X C) M) and C is larger than the number
7592          of bits in M, this is an extraction.  */
7593
7594       else if (GET_CODE (XEXP (x, 0)) == ROTATE
7595                && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7596                && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0
7597                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
7598         {
7599           new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7600           new_rtx = make_extraction (mode, new_rtx,
7601                                  (GET_MODE_BITSIZE (mode)
7602                                   - INTVAL (XEXP (XEXP (x, 0), 1))),
7603                                  NULL_RTX, i, 1, 0, in_code == COMPARE);
7604         }
7605
7606       /* On machines without logical shifts, if the operand of the AND is
7607          a logical shift and our mask turns off all the propagated sign
7608          bits, we can replace the logical shift with an arithmetic shift.  */
7609       else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7610                && !have_insn_for (LSHIFTRT, mode)
7611                && have_insn_for (ASHIFTRT, mode)
7612                && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7613                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7614                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7615                && mode_width <= HOST_BITS_PER_WIDE_INT)
7616         {
7617           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
7618
7619           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
7620           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
7621             SUBST (XEXP (x, 0),
7622                    gen_rtx_ASHIFTRT (mode,
7623                                      make_compound_operation
7624                                      (XEXP (XEXP (x, 0), 0), next_code),
7625                                      XEXP (XEXP (x, 0), 1)));
7626         }
7627
7628       /* If the constant is one less than a power of two, this might be
7629          representable by an extraction even if no shift is present.
7630          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
7631          we are in a COMPARE.  */
7632       else if ((i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7633         new_rtx = make_extraction (mode,
7634                                make_compound_operation (XEXP (x, 0),
7635                                                         next_code),
7636                                0, NULL_RTX, i, 1, 0, in_code == COMPARE);
7637
7638       /* If we are in a comparison and this is an AND with a power of two,
7639          convert this into the appropriate bit extract.  */
7640       else if (in_code == COMPARE
7641                && (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0)
7642         new_rtx = make_extraction (mode,
7643                                make_compound_operation (XEXP (x, 0),
7644                                                         next_code),
7645                                i, NULL_RTX, 1, 1, 0, 1);
7646
7647       break;
7648
7649     case LSHIFTRT:
7650       /* If the sign bit is known to be zero, replace this with an
7651          arithmetic shift.  */
7652       if (have_insn_for (ASHIFTRT, mode)
7653           && ! have_insn_for (LSHIFTRT, mode)
7654           && mode_width <= HOST_BITS_PER_WIDE_INT
7655           && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
7656         {
7657           new_rtx = gen_rtx_ASHIFTRT (mode,
7658                                   make_compound_operation (XEXP (x, 0),
7659                                                            next_code),
7660                                   XEXP (x, 1));
7661           break;
7662         }
7663
7664       /* ... fall through ...  */
7665
7666     case ASHIFTRT:
7667       lhs = XEXP (x, 0);
7668       rhs = XEXP (x, 1);
7669
7670       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
7671          this is a SIGN_EXTRACT.  */
7672       if (CONST_INT_P (rhs)
7673           && GET_CODE (lhs) == ASHIFT
7674           && CONST_INT_P (XEXP (lhs, 1))
7675           && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))
7676           && INTVAL (rhs) < mode_width)
7677         {
7678           new_rtx = make_compound_operation (XEXP (lhs, 0), next_code);
7679           new_rtx = make_extraction (mode, new_rtx,
7680                                  INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
7681                                  NULL_RTX, mode_width - INTVAL (rhs),
7682                                  code == LSHIFTRT, 0, in_code == COMPARE);
7683           break;
7684         }
7685
7686       /* See if we have operations between an ASHIFTRT and an ASHIFT.
7687          If so, try to merge the shifts into a SIGN_EXTEND.  We could
7688          also do this for some cases of SIGN_EXTRACT, but it doesn't
7689          seem worth the effort; the case checked for occurs on Alpha.  */
7690
7691       if (!OBJECT_P (lhs)
7692           && ! (GET_CODE (lhs) == SUBREG
7693                 && (OBJECT_P (SUBREG_REG (lhs))))
7694           && CONST_INT_P (rhs)
7695           && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
7696           && INTVAL (rhs) < mode_width
7697           && (new_rtx = extract_left_shift (lhs, INTVAL (rhs))) != 0)
7698         new_rtx = make_extraction (mode, make_compound_operation (new_rtx, next_code),
7699                                0, NULL_RTX, mode_width - INTVAL (rhs),
7700                                code == LSHIFTRT, 0, in_code == COMPARE);
7701
7702       break;
7703
7704     case SUBREG:
7705       /* Call ourselves recursively on the inner expression.  If we are
7706          narrowing the object and it has a different RTL code from
7707          what it originally did, do this SUBREG as a force_to_mode.  */
7708       {
7709         rtx inner = SUBREG_REG (x), simplified;
7710         
7711         tem = make_compound_operation (inner, in_code);
7712
7713         simplified
7714           = simplify_subreg (mode, tem, GET_MODE (inner), SUBREG_BYTE (x));
7715         if (simplified)
7716           tem = simplified;
7717
7718         if (GET_CODE (tem) != GET_CODE (inner)
7719             && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner))
7720             && subreg_lowpart_p (x))
7721           {
7722             rtx newer
7723               = force_to_mode (tem, mode, ~(unsigned HOST_WIDE_INT) 0, 0);
7724
7725             /* If we have something other than a SUBREG, we might have
7726                done an expansion, so rerun ourselves.  */
7727             if (GET_CODE (newer) != SUBREG)
7728               newer = make_compound_operation (newer, in_code);
7729
7730             /* force_to_mode can expand compounds.  If it just re-expanded the
7731                compound, use gen_lowpart to convert to the desired mode.  */
7732             if (rtx_equal_p (newer, x)
7733                 /* Likewise if it re-expanded the compound only partially.
7734                    This happens for SUBREG of ZERO_EXTRACT if they extract
7735                    the same number of bits.  */
7736                 || (GET_CODE (newer) == SUBREG
7737                     && (GET_CODE (SUBREG_REG (newer)) == LSHIFTRT
7738                         || GET_CODE (SUBREG_REG (newer)) == ASHIFTRT)
7739                     && GET_CODE (inner) == AND
7740                     && rtx_equal_p (SUBREG_REG (newer), XEXP (inner, 0))))
7741               return gen_lowpart (GET_MODE (x), tem);
7742
7743             return newer;
7744           }
7745
7746         if (simplified)
7747           return tem;
7748       }
7749       break;
7750
7751     default:
7752       break;
7753     }
7754
7755   if (new_rtx)
7756     {
7757       x = gen_lowpart (mode, new_rtx);
7758       code = GET_CODE (x);
7759     }
7760
7761   /* Now recursively process each operand of this operation.  */
7762   fmt = GET_RTX_FORMAT (code);
7763   for (i = 0; i < GET_RTX_LENGTH (code); i++)
7764     if (fmt[i] == 'e')
7765       {
7766         new_rtx = make_compound_operation (XEXP (x, i), next_code);
7767         SUBST (XEXP (x, i), new_rtx);
7768       }
7769     else if (fmt[i] == 'E')
7770       for (j = 0; j < XVECLEN (x, i); j++)
7771         {
7772           new_rtx = make_compound_operation (XVECEXP (x, i, j), next_code);
7773           SUBST (XVECEXP (x, i, j), new_rtx);
7774         }
7775
7776  maybe_swap:
7777   /* If this is a commutative operation, the changes to the operands
7778      may have made it noncanonical.  */
7779   if (COMMUTATIVE_ARITH_P (x)
7780       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
7781     {
7782       tem = XEXP (x, 0);
7783       SUBST (XEXP (x, 0), XEXP (x, 1));
7784       SUBST (XEXP (x, 1), tem);
7785     }
7786
7787   return x;
7788 }
7789 \f
7790 /* Given M see if it is a value that would select a field of bits
7791    within an item, but not the entire word.  Return -1 if not.
7792    Otherwise, return the starting position of the field, where 0 is the
7793    low-order bit.
7794
7795    *PLEN is set to the length of the field.  */
7796
7797 static int
7798 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
7799 {
7800   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
7801   int pos = m ? ctz_hwi (m) : -1;
7802   int len = 0;
7803
7804   if (pos >= 0)
7805     /* Now shift off the low-order zero bits and see if we have a
7806        power of two minus 1.  */
7807     len = exact_log2 ((m >> pos) + 1);
7808
7809   if (len <= 0)
7810     pos = -1;
7811
7812   *plen = len;
7813   return pos;
7814 }
7815 \f
7816 /* If X refers to a register that equals REG in value, replace these
7817    references with REG.  */
7818 static rtx
7819 canon_reg_for_combine (rtx x, rtx reg)
7820 {
7821   rtx op0, op1, op2;
7822   const char *fmt;
7823   int i;
7824   bool copied;
7825
7826   enum rtx_code code = GET_CODE (x);
7827   switch (GET_RTX_CLASS (code))
7828     {
7829     case RTX_UNARY:
7830       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7831       if (op0 != XEXP (x, 0))
7832         return simplify_gen_unary (GET_CODE (x), GET_MODE (x), op0,
7833                                    GET_MODE (reg));
7834       break;
7835
7836     case RTX_BIN_ARITH:
7837     case RTX_COMM_ARITH:
7838       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7839       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7840       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7841         return simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
7842       break;
7843
7844     case RTX_COMPARE:
7845     case RTX_COMM_COMPARE:
7846       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7847       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7848       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7849         return simplify_gen_relational (GET_CODE (x), GET_MODE (x),
7850                                         GET_MODE (op0), op0, op1);
7851       break;
7852
7853     case RTX_TERNARY:
7854     case RTX_BITFIELD_OPS:
7855       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7856       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7857       op2 = canon_reg_for_combine (XEXP (x, 2), reg);
7858       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1) || op2 != XEXP (x, 2))
7859         return simplify_gen_ternary (GET_CODE (x), GET_MODE (x),
7860                                      GET_MODE (op0), op0, op1, op2);
7861
7862     case RTX_OBJ:
7863       if (REG_P (x))
7864         {
7865           if (rtx_equal_p (get_last_value (reg), x)
7866               || rtx_equal_p (reg, get_last_value (x)))
7867             return reg;
7868           else
7869             break;
7870         }
7871
7872       /* fall through */
7873
7874     default:
7875       fmt = GET_RTX_FORMAT (code);
7876       copied = false;
7877       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7878         if (fmt[i] == 'e')
7879           {
7880             rtx op = canon_reg_for_combine (XEXP (x, i), reg);
7881             if (op != XEXP (x, i))
7882               {
7883                 if (!copied)
7884                   {
7885                     copied = true;
7886                     x = copy_rtx (x);
7887                   }
7888                 XEXP (x, i) = op;
7889               }
7890           }
7891         else if (fmt[i] == 'E')
7892           {
7893             int j;
7894             for (j = 0; j < XVECLEN (x, i); j++)
7895               {
7896                 rtx op = canon_reg_for_combine (XVECEXP (x, i, j), reg);
7897                 if (op != XVECEXP (x, i, j))
7898                   {
7899                     if (!copied)
7900                       {
7901                         copied = true;
7902                         x = copy_rtx (x);
7903                       }
7904                     XVECEXP (x, i, j) = op;
7905                   }
7906               }
7907           }
7908
7909       break;
7910     }
7911
7912   return x;
7913 }
7914
7915 /* Return X converted to MODE.  If the value is already truncated to
7916    MODE we can just return a subreg even though in the general case we
7917    would need an explicit truncation.  */
7918
7919 static rtx
7920 gen_lowpart_or_truncate (enum machine_mode mode, rtx x)
7921 {
7922   if (!CONST_INT_P (x)
7923       && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x))
7924       && !TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
7925                                  GET_MODE_BITSIZE (GET_MODE (x)))
7926       && !(REG_P (x) && reg_truncated_to_mode (mode, x)))
7927     {
7928       /* Bit-cast X into an integer mode.  */
7929       if (!SCALAR_INT_MODE_P (GET_MODE (x)))
7930         x = gen_lowpart (int_mode_for_mode (GET_MODE (x)), x);
7931       x = simplify_gen_unary (TRUNCATE, int_mode_for_mode (mode),
7932                               x, GET_MODE (x));
7933     }
7934
7935   return gen_lowpart (mode, x);
7936 }
7937
7938 /* See if X can be simplified knowing that we will only refer to it in
7939    MODE and will only refer to those bits that are nonzero in MASK.
7940    If other bits are being computed or if masking operations are done
7941    that select a superset of the bits in MASK, they can sometimes be
7942    ignored.
7943
7944    Return a possibly simplified expression, but always convert X to
7945    MODE.  If X is a CONST_INT, AND the CONST_INT with MASK.
7946
7947    If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
7948    are all off in X.  This is used when X will be complemented, by either
7949    NOT, NEG, or XOR.  */
7950
7951 static rtx
7952 force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
7953                int just_select)
7954 {
7955   enum rtx_code code = GET_CODE (x);
7956   int next_select = just_select || code == XOR || code == NOT || code == NEG;
7957   enum machine_mode op_mode;
7958   unsigned HOST_WIDE_INT fuller_mask, nonzero;
7959   rtx op0, op1, temp;
7960
7961   /* If this is a CALL or ASM_OPERANDS, don't do anything.  Some of the
7962      code below will do the wrong thing since the mode of such an
7963      expression is VOIDmode.
7964
7965      Also do nothing if X is a CLOBBER; this can happen if X was
7966      the return value from a call to gen_lowpart.  */
7967   if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
7968     return x;
7969
7970   /* We want to perform the operation is its present mode unless we know
7971      that the operation is valid in MODE, in which case we do the operation
7972      in MODE.  */
7973   op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
7974               && have_insn_for (code, mode))
7975              ? mode : GET_MODE (x));
7976
7977   /* It is not valid to do a right-shift in a narrower mode
7978      than the one it came in with.  */
7979   if ((code == LSHIFTRT || code == ASHIFTRT)
7980       && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
7981     op_mode = GET_MODE (x);
7982
7983   /* Truncate MASK to fit OP_MODE.  */
7984   if (op_mode)
7985     mask &= GET_MODE_MASK (op_mode);
7986
7987   /* When we have an arithmetic operation, or a shift whose count we
7988      do not know, we need to assume that all bits up to the highest-order
7989      bit in MASK will be needed.  This is how we form such a mask.  */
7990   if (mask & ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
7991     fuller_mask = ~(unsigned HOST_WIDE_INT) 0;
7992   else
7993     fuller_mask = (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
7994                    - 1);
7995
7996   /* Determine what bits of X are guaranteed to be (non)zero.  */
7997   nonzero = nonzero_bits (x, mode);
7998
7999   /* If none of the bits in X are needed, return a zero.  */
8000   if (!just_select && (nonzero & mask) == 0 && !side_effects_p (x))
8001     x = const0_rtx;
8002
8003   /* If X is a CONST_INT, return a new one.  Do this here since the
8004      test below will fail.  */
8005   if (CONST_INT_P (x))
8006     {
8007       if (SCALAR_INT_MODE_P (mode))
8008         return gen_int_mode (INTVAL (x) & mask, mode);
8009       else
8010         {
8011           x = GEN_INT (INTVAL (x) & mask);
8012           return gen_lowpart_common (mode, x);
8013         }
8014     }
8015
8016   /* If X is narrower than MODE and we want all the bits in X's mode, just
8017      get X in the proper mode.  */
8018   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
8019       && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
8020     return gen_lowpart (mode, x);
8021
8022   /* We can ignore the effect of a SUBREG if it narrows the mode or
8023      if the constant masks to zero all the bits the mode doesn't have.  */
8024   if (GET_CODE (x) == SUBREG
8025       && subreg_lowpart_p (x)
8026       && ((GET_MODE_SIZE (GET_MODE (x))
8027            < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8028           || (0 == (mask
8029                     & GET_MODE_MASK (GET_MODE (x))
8030                     & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
8031     return force_to_mode (SUBREG_REG (x), mode, mask, next_select);
8032
8033   /* The arithmetic simplifications here only work for scalar integer modes.  */
8034   if (!SCALAR_INT_MODE_P (mode) || !SCALAR_INT_MODE_P (GET_MODE (x)))
8035     return gen_lowpart_or_truncate (mode, x);
8036
8037   switch (code)
8038     {
8039     case CLOBBER:
8040       /* If X is a (clobber (const_int)), return it since we know we are
8041          generating something that won't match.  */
8042       return x;
8043
8044     case SIGN_EXTEND:
8045     case ZERO_EXTEND:
8046     case ZERO_EXTRACT:
8047     case SIGN_EXTRACT:
8048       x = expand_compound_operation (x);
8049       if (GET_CODE (x) != code)
8050         return force_to_mode (x, mode, mask, next_select);
8051       break;
8052
8053     case TRUNCATE:
8054       /* Similarly for a truncate.  */
8055       return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8056
8057     case AND:
8058       /* If this is an AND with a constant, convert it into an AND
8059          whose constant is the AND of that constant with MASK.  If it
8060          remains an AND of MASK, delete it since it is redundant.  */
8061
8062       if (CONST_INT_P (XEXP (x, 1)))
8063         {
8064           x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
8065                                       mask & INTVAL (XEXP (x, 1)));
8066
8067           /* If X is still an AND, see if it is an AND with a mask that
8068              is just some low-order bits.  If so, and it is MASK, we don't
8069              need it.  */
8070
8071           if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
8072               && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
8073                   == mask))
8074             x = XEXP (x, 0);
8075
8076           /* If it remains an AND, try making another AND with the bits
8077              in the mode mask that aren't in MASK turned on.  If the
8078              constant in the AND is wide enough, this might make a
8079              cheaper constant.  */
8080
8081           if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
8082               && GET_MODE_MASK (GET_MODE (x)) != mask
8083               && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
8084             {
8085               unsigned HOST_WIDE_INT cval
8086                 = UINTVAL (XEXP (x, 1))
8087                   | (GET_MODE_MASK (GET_MODE (x)) & ~mask);
8088               int width = GET_MODE_BITSIZE (GET_MODE (x));
8089               rtx y;
8090
8091               /* If MODE is narrower than HOST_WIDE_INT and CVAL is a negative
8092                  number, sign extend it.  */
8093               if (width > 0 && width < HOST_BITS_PER_WIDE_INT
8094                   && (cval & ((unsigned HOST_WIDE_INT) 1 << (width - 1))) != 0)
8095                 cval |= (unsigned HOST_WIDE_INT) -1 << width;
8096
8097               y = simplify_gen_binary (AND, GET_MODE (x),
8098                                        XEXP (x, 0), GEN_INT (cval));
8099               if (rtx_cost (y, SET, optimize_this_for_speed_p)
8100                   < rtx_cost (x, SET, optimize_this_for_speed_p))
8101                 x = y;
8102             }
8103
8104           break;
8105         }
8106
8107       goto binop;
8108
8109     case PLUS:
8110       /* In (and (plus FOO C1) M), if M is a mask that just turns off
8111          low-order bits (as in an alignment operation) and FOO is already
8112          aligned to that boundary, mask C1 to that boundary as well.
8113          This may eliminate that PLUS and, later, the AND.  */
8114
8115       {
8116         unsigned int width = GET_MODE_BITSIZE (mode);
8117         unsigned HOST_WIDE_INT smask = mask;
8118
8119         /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
8120            number, sign extend it.  */
8121
8122         if (width < HOST_BITS_PER_WIDE_INT
8123             && (smask & ((unsigned HOST_WIDE_INT) 1 << (width - 1))) != 0)
8124           smask |= (unsigned HOST_WIDE_INT) (-1) << width;
8125
8126         if (CONST_INT_P (XEXP (x, 1))
8127             && exact_log2 (- smask) >= 0
8128             && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
8129             && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
8130           return force_to_mode (plus_constant (XEXP (x, 0),
8131                                                (INTVAL (XEXP (x, 1)) & smask)),
8132                                 mode, smask, next_select);
8133       }
8134
8135       /* ... fall through ...  */
8136
8137     case MULT:
8138       /* For PLUS, MINUS and MULT, we need any bits less significant than the
8139          most significant bit in MASK since carries from those bits will
8140          affect the bits we are interested in.  */
8141       mask = fuller_mask;
8142       goto binop;
8143
8144     case MINUS:
8145       /* If X is (minus C Y) where C's least set bit is larger than any bit
8146          in the mask, then we may replace with (neg Y).  */
8147       if (CONST_INT_P (XEXP (x, 0))
8148           && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
8149                                         & -INTVAL (XEXP (x, 0))))
8150               > mask))
8151         {
8152           x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
8153                                   GET_MODE (x));
8154           return force_to_mode (x, mode, mask, next_select);
8155         }
8156
8157       /* Similarly, if C contains every bit in the fuller_mask, then we may
8158          replace with (not Y).  */
8159       if (CONST_INT_P (XEXP (x, 0))
8160           && ((UINTVAL (XEXP (x, 0)) | fuller_mask) == UINTVAL (XEXP (x, 0))))
8161         {
8162           x = simplify_gen_unary (NOT, GET_MODE (x),
8163                                   XEXP (x, 1), GET_MODE (x));
8164           return force_to_mode (x, mode, mask, next_select);
8165         }
8166
8167       mask = fuller_mask;
8168       goto binop;
8169
8170     case IOR:
8171     case XOR:
8172       /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
8173          LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
8174          operation which may be a bitfield extraction.  Ensure that the
8175          constant we form is not wider than the mode of X.  */
8176
8177       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8178           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8179           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8180           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
8181           && CONST_INT_P (XEXP (x, 1))
8182           && ((INTVAL (XEXP (XEXP (x, 0), 1))
8183                + floor_log2 (INTVAL (XEXP (x, 1))))
8184               < GET_MODE_BITSIZE (GET_MODE (x)))
8185           && (UINTVAL (XEXP (x, 1))
8186               & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
8187         {
8188           temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
8189                           << INTVAL (XEXP (XEXP (x, 0), 1)));
8190           temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
8191                                       XEXP (XEXP (x, 0), 0), temp);
8192           x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
8193                                    XEXP (XEXP (x, 0), 1));
8194           return force_to_mode (x, mode, mask, next_select);
8195         }
8196
8197     binop:
8198       /* For most binary operations, just propagate into the operation and
8199          change the mode if we have an operation of that mode.  */
8200
8201       op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
8202       op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
8203
8204       /* If we ended up truncating both operands, truncate the result of the
8205          operation instead.  */
8206       if (GET_CODE (op0) == TRUNCATE
8207           && GET_CODE (op1) == TRUNCATE)
8208         {
8209           op0 = XEXP (op0, 0);
8210           op1 = XEXP (op1, 0);
8211         }
8212
8213       op0 = gen_lowpart_or_truncate (op_mode, op0);
8214       op1 = gen_lowpart_or_truncate (op_mode, op1);
8215
8216       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
8217         x = simplify_gen_binary (code, op_mode, op0, op1);
8218       break;
8219
8220     case ASHIFT:
8221       /* For left shifts, do the same, but just for the first operand.
8222          However, we cannot do anything with shifts where we cannot
8223          guarantee that the counts are smaller than the size of the mode
8224          because such a count will have a different meaning in a
8225          wider mode.  */
8226
8227       if (! (CONST_INT_P (XEXP (x, 1))
8228              && INTVAL (XEXP (x, 1)) >= 0
8229              && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
8230           && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
8231                 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
8232                     < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
8233         break;
8234
8235       /* If the shift count is a constant and we can do arithmetic in
8236          the mode of the shift, refine which bits we need.  Otherwise, use the
8237          conservative form of the mask.  */
8238       if (CONST_INT_P (XEXP (x, 1))
8239           && INTVAL (XEXP (x, 1)) >= 0
8240           && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
8241           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
8242         mask >>= INTVAL (XEXP (x, 1));
8243       else
8244         mask = fuller_mask;
8245
8246       op0 = gen_lowpart_or_truncate (op_mode,
8247                                      force_to_mode (XEXP (x, 0), op_mode,
8248                                                     mask, next_select));
8249
8250       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
8251         x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
8252       break;
8253
8254     case LSHIFTRT:
8255       /* Here we can only do something if the shift count is a constant,
8256          this shift constant is valid for the host, and we can do arithmetic
8257          in OP_MODE.  */
8258
8259       if (CONST_INT_P (XEXP (x, 1))
8260           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
8261           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
8262         {
8263           rtx inner = XEXP (x, 0);
8264           unsigned HOST_WIDE_INT inner_mask;
8265
8266           /* Select the mask of the bits we need for the shift operand.  */
8267           inner_mask = mask << INTVAL (XEXP (x, 1));
8268
8269           /* We can only change the mode of the shift if we can do arithmetic
8270              in the mode of the shift and INNER_MASK is no wider than the
8271              width of X's mode.  */
8272           if ((inner_mask & ~GET_MODE_MASK (GET_MODE (x))) != 0)
8273             op_mode = GET_MODE (x);
8274
8275           inner = force_to_mode (inner, op_mode, inner_mask, next_select);
8276
8277           if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
8278             x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
8279         }
8280
8281       /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
8282          shift and AND produces only copies of the sign bit (C2 is one less
8283          than a power of two), we can do this with just a shift.  */
8284
8285       if (GET_CODE (x) == LSHIFTRT
8286           && CONST_INT_P (XEXP (x, 1))
8287           /* The shift puts one of the sign bit copies in the least significant
8288              bit.  */
8289           && ((INTVAL (XEXP (x, 1))
8290                + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
8291               >= GET_MODE_BITSIZE (GET_MODE (x)))
8292           && exact_log2 (mask + 1) >= 0
8293           /* Number of bits left after the shift must be more than the mask
8294              needs.  */
8295           && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
8296               <= GET_MODE_BITSIZE (GET_MODE (x)))
8297           /* Must be more sign bit copies than the mask needs.  */
8298           && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
8299               >= exact_log2 (mask + 1)))
8300         x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
8301                                  GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
8302                                           - exact_log2 (mask + 1)));
8303
8304       goto shiftrt;
8305
8306     case ASHIFTRT:
8307       /* If we are just looking for the sign bit, we don't need this shift at
8308          all, even if it has a variable count.  */
8309       if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
8310           && (mask == ((unsigned HOST_WIDE_INT) 1
8311                        << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
8312         return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8313
8314       /* If this is a shift by a constant, get a mask that contains those bits
8315          that are not copies of the sign bit.  We then have two cases:  If
8316          MASK only includes those bits, this can be a logical shift, which may
8317          allow simplifications.  If MASK is a single-bit field not within
8318          those bits, we are requesting a copy of the sign bit and hence can
8319          shift the sign bit to the appropriate location.  */
8320
8321       if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0
8322           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
8323         {
8324           int i;
8325
8326           /* If the considered data is wider than HOST_WIDE_INT, we can't
8327              represent a mask for all its bits in a single scalar.
8328              But we only care about the lower bits, so calculate these.  */
8329
8330           if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
8331             {
8332               nonzero = ~(unsigned HOST_WIDE_INT) 0;
8333
8334               /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
8335                  is the number of bits a full-width mask would have set.
8336                  We need only shift if these are fewer than nonzero can
8337                  hold.  If not, we must keep all bits set in nonzero.  */
8338
8339               if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
8340                   < HOST_BITS_PER_WIDE_INT)
8341                 nonzero >>= INTVAL (XEXP (x, 1))
8342                             + HOST_BITS_PER_WIDE_INT
8343                             - GET_MODE_BITSIZE (GET_MODE (x)) ;
8344             }
8345           else
8346             {
8347               nonzero = GET_MODE_MASK (GET_MODE (x));
8348               nonzero >>= INTVAL (XEXP (x, 1));
8349             }
8350
8351           if ((mask & ~nonzero) == 0)
8352             {
8353               x = simplify_shift_const (NULL_RTX, LSHIFTRT, GET_MODE (x),
8354                                         XEXP (x, 0), INTVAL (XEXP (x, 1)));
8355               if (GET_CODE (x) != ASHIFTRT)
8356                 return force_to_mode (x, mode, mask, next_select);
8357             }
8358
8359           else if ((i = exact_log2 (mask)) >= 0)
8360             {
8361               x = simplify_shift_const
8362                   (NULL_RTX, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
8363                    GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
8364
8365               if (GET_CODE (x) != ASHIFTRT)
8366                 return force_to_mode (x, mode, mask, next_select);
8367             }
8368         }
8369
8370       /* If MASK is 1, convert this to an LSHIFTRT.  This can be done
8371          even if the shift count isn't a constant.  */
8372       if (mask == 1)
8373         x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8374                                  XEXP (x, 0), XEXP (x, 1));
8375
8376     shiftrt:
8377
8378       /* If this is a zero- or sign-extension operation that just affects bits
8379          we don't care about, remove it.  Be sure the call above returned
8380          something that is still a shift.  */
8381
8382       if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
8383           && CONST_INT_P (XEXP (x, 1))
8384           && INTVAL (XEXP (x, 1)) >= 0
8385           && (INTVAL (XEXP (x, 1))
8386               <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
8387           && GET_CODE (XEXP (x, 0)) == ASHIFT
8388           && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
8389         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
8390                               next_select);
8391
8392       break;
8393
8394     case ROTATE:
8395     case ROTATERT:
8396       /* If the shift count is constant and we can do computations
8397          in the mode of X, compute where the bits we care about are.
8398          Otherwise, we can't do anything.  Don't change the mode of
8399          the shift or propagate MODE into the shift, though.  */
8400       if (CONST_INT_P (XEXP (x, 1))
8401           && INTVAL (XEXP (x, 1)) >= 0)
8402         {
8403           temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
8404                                             GET_MODE (x), GEN_INT (mask),
8405                                             XEXP (x, 1));
8406           if (temp && CONST_INT_P (temp))
8407             SUBST (XEXP (x, 0),
8408                    force_to_mode (XEXP (x, 0), GET_MODE (x),
8409                                   INTVAL (temp), next_select));
8410         }
8411       break;
8412
8413     case NEG:
8414       /* If we just want the low-order bit, the NEG isn't needed since it
8415          won't change the low-order bit.  */
8416       if (mask == 1)
8417         return force_to_mode (XEXP (x, 0), mode, mask, just_select);
8418
8419       /* We need any bits less significant than the most significant bit in
8420          MASK since carries from those bits will affect the bits we are
8421          interested in.  */
8422       mask = fuller_mask;
8423       goto unop;
8424
8425     case NOT:
8426       /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
8427          same as the XOR case above.  Ensure that the constant we form is not
8428          wider than the mode of X.  */
8429
8430       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8431           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8432           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8433           && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
8434               < GET_MODE_BITSIZE (GET_MODE (x)))
8435           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
8436         {
8437           temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
8438                                GET_MODE (x));
8439           temp = simplify_gen_binary (XOR, GET_MODE (x),
8440                                       XEXP (XEXP (x, 0), 0), temp);
8441           x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8442                                    temp, XEXP (XEXP (x, 0), 1));
8443
8444           return force_to_mode (x, mode, mask, next_select);
8445         }
8446
8447       /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
8448          use the full mask inside the NOT.  */
8449       mask = fuller_mask;
8450
8451     unop:
8452       op0 = gen_lowpart_or_truncate (op_mode,
8453                                      force_to_mode (XEXP (x, 0), mode, mask,
8454                                                     next_select));
8455       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
8456         x = simplify_gen_unary (code, op_mode, op0, op_mode);
8457       break;
8458
8459     case NE:
8460       /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
8461          in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
8462          which is equal to STORE_FLAG_VALUE.  */
8463       if ((mask & ~STORE_FLAG_VALUE) == 0
8464           && XEXP (x, 1) == const0_rtx
8465           && GET_MODE (XEXP (x, 0)) == mode
8466           && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
8467           && (nonzero_bits (XEXP (x, 0), mode)
8468               == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
8469         return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8470
8471       break;
8472
8473     case IF_THEN_ELSE:
8474       /* We have no way of knowing if the IF_THEN_ELSE can itself be
8475          written in a narrower mode.  We play it safe and do not do so.  */
8476
8477       SUBST (XEXP (x, 1),
8478              gen_lowpart_or_truncate (GET_MODE (x),
8479                                       force_to_mode (XEXP (x, 1), mode,
8480                                                      mask, next_select)));
8481       SUBST (XEXP (x, 2),
8482              gen_lowpart_or_truncate (GET_MODE (x),
8483                                       force_to_mode (XEXP (x, 2), mode,
8484                                                      mask, next_select)));
8485       break;
8486
8487     default:
8488       break;
8489     }
8490
8491   /* Ensure we return a value of the proper mode.  */
8492   return gen_lowpart_or_truncate (mode, x);
8493 }
8494 \f
8495 /* Return nonzero if X is an expression that has one of two values depending on
8496    whether some other value is zero or nonzero.  In that case, we return the
8497    value that is being tested, *PTRUE is set to the value if the rtx being
8498    returned has a nonzero value, and *PFALSE is set to the other alternative.
8499
8500    If we return zero, we set *PTRUE and *PFALSE to X.  */
8501
8502 static rtx
8503 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
8504 {
8505   enum machine_mode mode = GET_MODE (x);
8506   enum rtx_code code = GET_CODE (x);
8507   rtx cond0, cond1, true0, true1, false0, false1;
8508   unsigned HOST_WIDE_INT nz;
8509
8510   /* If we are comparing a value against zero, we are done.  */
8511   if ((code == NE || code == EQ)
8512       && XEXP (x, 1) == const0_rtx)
8513     {
8514       *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
8515       *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
8516       return XEXP (x, 0);
8517     }
8518
8519   /* If this is a unary operation whose operand has one of two values, apply
8520      our opcode to compute those values.  */
8521   else if (UNARY_P (x)
8522            && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
8523     {
8524       *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
8525       *pfalse = simplify_gen_unary (code, mode, false0,
8526                                     GET_MODE (XEXP (x, 0)));
8527       return cond0;
8528     }
8529
8530   /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
8531      make can't possibly match and would suppress other optimizations.  */
8532   else if (code == COMPARE)
8533     ;
8534
8535   /* If this is a binary operation, see if either side has only one of two
8536      values.  If either one does or if both do and they are conditional on
8537      the same value, compute the new true and false values.  */
8538   else if (BINARY_P (x))
8539     {
8540       cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
8541       cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
8542
8543       if ((cond0 != 0 || cond1 != 0)
8544           && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
8545         {
8546           /* If if_then_else_cond returned zero, then true/false are the
8547              same rtl.  We must copy one of them to prevent invalid rtl
8548              sharing.  */
8549           if (cond0 == 0)
8550             true0 = copy_rtx (true0);
8551           else if (cond1 == 0)
8552             true1 = copy_rtx (true1);
8553
8554           if (COMPARISON_P (x))
8555             {
8556               *ptrue = simplify_gen_relational (code, mode, VOIDmode,
8557                                                 true0, true1);
8558               *pfalse = simplify_gen_relational (code, mode, VOIDmode,
8559                                                  false0, false1);
8560              }
8561           else
8562             {
8563               *ptrue = simplify_gen_binary (code, mode, true0, true1);
8564               *pfalse = simplify_gen_binary (code, mode, false0, false1);
8565             }
8566
8567           return cond0 ? cond0 : cond1;
8568         }
8569
8570       /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
8571          operands is zero when the other is nonzero, and vice-versa,
8572          and STORE_FLAG_VALUE is 1 or -1.  */
8573
8574       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8575           && (code == PLUS || code == IOR || code == XOR || code == MINUS
8576               || code == UMAX)
8577           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
8578         {
8579           rtx op0 = XEXP (XEXP (x, 0), 1);
8580           rtx op1 = XEXP (XEXP (x, 1), 1);
8581
8582           cond0 = XEXP (XEXP (x, 0), 0);
8583           cond1 = XEXP (XEXP (x, 1), 0);
8584
8585           if (COMPARISON_P (cond0)
8586               && COMPARISON_P (cond1)
8587               && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
8588                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
8589                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
8590                   || ((swap_condition (GET_CODE (cond0))
8591                        == reversed_comparison_code (cond1, NULL))
8592                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
8593                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
8594               && ! side_effects_p (x))
8595             {
8596               *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
8597               *pfalse = simplify_gen_binary (MULT, mode,
8598                                              (code == MINUS
8599                                               ? simplify_gen_unary (NEG, mode,
8600                                                                     op1, mode)
8601                                               : op1),
8602                                               const_true_rtx);
8603               return cond0;
8604             }
8605         }
8606
8607       /* Similarly for MULT, AND and UMIN, except that for these the result
8608          is always zero.  */
8609       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8610           && (code == MULT || code == AND || code == UMIN)
8611           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
8612         {
8613           cond0 = XEXP (XEXP (x, 0), 0);
8614           cond1 = XEXP (XEXP (x, 1), 0);
8615
8616           if (COMPARISON_P (cond0)
8617               && COMPARISON_P (cond1)
8618               && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
8619                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
8620                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
8621                   || ((swap_condition (GET_CODE (cond0))
8622                        == reversed_comparison_code (cond1, NULL))
8623                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
8624                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
8625               && ! side_effects_p (x))
8626             {
8627               *ptrue = *pfalse = const0_rtx;
8628               return cond0;
8629             }
8630         }
8631     }
8632
8633   else if (code == IF_THEN_ELSE)
8634     {
8635       /* If we have IF_THEN_ELSE already, extract the condition and
8636          canonicalize it if it is NE or EQ.  */
8637       cond0 = XEXP (x, 0);
8638       *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
8639       if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
8640         return XEXP (cond0, 0);
8641       else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
8642         {
8643           *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
8644           return XEXP (cond0, 0);
8645         }
8646       else
8647         return cond0;
8648     }
8649
8650   /* If X is a SUBREG, we can narrow both the true and false values
8651      if the inner expression, if there is a condition.  */
8652   else if (code == SUBREG
8653            && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
8654                                                &true0, &false0)))
8655     {
8656       true0 = simplify_gen_subreg (mode, true0,
8657                                    GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
8658       false0 = simplify_gen_subreg (mode, false0,
8659                                     GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
8660       if (true0 && false0)
8661         {
8662           *ptrue = true0;
8663           *pfalse = false0;
8664           return cond0;
8665         }
8666     }
8667
8668   /* If X is a constant, this isn't special and will cause confusions
8669      if we treat it as such.  Likewise if it is equivalent to a constant.  */
8670   else if (CONSTANT_P (x)
8671            || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
8672     ;
8673
8674   /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
8675      will be least confusing to the rest of the compiler.  */
8676   else if (mode == BImode)
8677     {
8678       *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
8679       return x;
8680     }
8681
8682   /* If X is known to be either 0 or -1, those are the true and
8683      false values when testing X.  */
8684   else if (x == constm1_rtx || x == const0_rtx
8685            || (mode != VOIDmode
8686                && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
8687     {
8688       *ptrue = constm1_rtx, *pfalse = const0_rtx;
8689       return x;
8690     }
8691
8692   /* Likewise for 0 or a single bit.  */
8693   else if (SCALAR_INT_MODE_P (mode)
8694            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8695            && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
8696     {
8697       *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
8698       return x;
8699     }
8700
8701   /* Otherwise fail; show no condition with true and false values the same.  */
8702   *ptrue = *pfalse = x;
8703   return 0;
8704 }
8705 \f
8706 /* Return the value of expression X given the fact that condition COND
8707    is known to be true when applied to REG as its first operand and VAL
8708    as its second.  X is known to not be shared and so can be modified in
8709    place.
8710
8711    We only handle the simplest cases, and specifically those cases that
8712    arise with IF_THEN_ELSE expressions.  */
8713
8714 static rtx
8715 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
8716 {
8717   enum rtx_code code = GET_CODE (x);
8718   rtx temp;
8719   const char *fmt;
8720   int i, j;
8721
8722   if (side_effects_p (x))
8723     return x;
8724
8725   /* If either operand of the condition is a floating point value,
8726      then we have to avoid collapsing an EQ comparison.  */
8727   if (cond == EQ
8728       && rtx_equal_p (x, reg)
8729       && ! FLOAT_MODE_P (GET_MODE (x))
8730       && ! FLOAT_MODE_P (GET_MODE (val)))
8731     return val;
8732
8733   if (cond == UNEQ && rtx_equal_p (x, reg))
8734     return val;
8735
8736   /* If X is (abs REG) and we know something about REG's relationship
8737      with zero, we may be able to simplify this.  */
8738
8739   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
8740     switch (cond)
8741       {
8742       case GE:  case GT:  case EQ:
8743         return XEXP (x, 0);
8744       case LT:  case LE:
8745         return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
8746                                    XEXP (x, 0),
8747                                    GET_MODE (XEXP (x, 0)));
8748       default:
8749         break;
8750       }
8751
8752   /* The only other cases we handle are MIN, MAX, and comparisons if the
8753      operands are the same as REG and VAL.  */
8754
8755   else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
8756     {
8757       if (rtx_equal_p (XEXP (x, 0), val))
8758         cond = swap_condition (cond), temp = val, val = reg, reg = temp;
8759
8760       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
8761         {
8762           if (COMPARISON_P (x))
8763             {
8764               if (comparison_dominates_p (cond, code))
8765                 return const_true_rtx;
8766
8767               code = reversed_comparison_code (x, NULL);
8768               if (code != UNKNOWN
8769                   && comparison_dominates_p (cond, code))
8770                 return const0_rtx;
8771               else
8772                 return x;
8773             }
8774           else if (code == SMAX || code == SMIN
8775                    || code == UMIN || code == UMAX)
8776             {
8777               int unsignedp = (code == UMIN || code == UMAX);
8778
8779               /* Do not reverse the condition when it is NE or EQ.
8780                  This is because we cannot conclude anything about
8781                  the value of 'SMAX (x, y)' when x is not equal to y,
8782                  but we can when x equals y.  */
8783               if ((code == SMAX || code == UMAX)
8784                   && ! (cond == EQ || cond == NE))
8785                 cond = reverse_condition (cond);
8786
8787               switch (cond)
8788                 {
8789                 case GE:   case GT:
8790                   return unsignedp ? x : XEXP (x, 1);
8791                 case LE:   case LT:
8792                   return unsignedp ? x : XEXP (x, 0);
8793                 case GEU:  case GTU:
8794                   return unsignedp ? XEXP (x, 1) : x;
8795                 case LEU:  case LTU:
8796                   return unsignedp ? XEXP (x, 0) : x;
8797                 default:
8798                   break;
8799                 }
8800             }
8801         }
8802     }
8803   else if (code == SUBREG)
8804     {
8805       enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
8806       rtx new_rtx, r = known_cond (SUBREG_REG (x), cond, reg, val);
8807
8808       if (SUBREG_REG (x) != r)
8809         {
8810           /* We must simplify subreg here, before we lose track of the
8811              original inner_mode.  */
8812           new_rtx = simplify_subreg (GET_MODE (x), r,
8813                                  inner_mode, SUBREG_BYTE (x));
8814           if (new_rtx)
8815             return new_rtx;
8816           else
8817             SUBST (SUBREG_REG (x), r);
8818         }
8819
8820       return x;
8821     }
8822   /* We don't have to handle SIGN_EXTEND here, because even in the
8823      case of replacing something with a modeless CONST_INT, a
8824      CONST_INT is already (supposed to be) a valid sign extension for
8825      its narrower mode, which implies it's already properly
8826      sign-extended for the wider mode.  Now, for ZERO_EXTEND, the
8827      story is different.  */
8828   else if (code == ZERO_EXTEND)
8829     {
8830       enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
8831       rtx new_rtx, r = known_cond (XEXP (x, 0), cond, reg, val);
8832
8833       if (XEXP (x, 0) != r)
8834         {
8835           /* We must simplify the zero_extend here, before we lose
8836              track of the original inner_mode.  */
8837           new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
8838                                           r, inner_mode);
8839           if (new_rtx)
8840             return new_rtx;
8841           else
8842             SUBST (XEXP (x, 0), r);
8843         }
8844
8845       return x;
8846     }
8847
8848   fmt = GET_RTX_FORMAT (code);
8849   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8850     {
8851       if (fmt[i] == 'e')
8852         SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
8853       else if (fmt[i] == 'E')
8854         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8855           SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
8856                                                 cond, reg, val));
8857     }
8858
8859   return x;
8860 }
8861 \f
8862 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
8863    assignment as a field assignment.  */
8864
8865 static int
8866 rtx_equal_for_field_assignment_p (rtx x, rtx y)
8867 {
8868   if (x == y || rtx_equal_p (x, y))
8869     return 1;
8870
8871   if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
8872     return 0;
8873
8874   /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
8875      Note that all SUBREGs of MEM are paradoxical; otherwise they
8876      would have been rewritten.  */
8877   if (MEM_P (x) && GET_CODE (y) == SUBREG
8878       && MEM_P (SUBREG_REG (y))
8879       && rtx_equal_p (SUBREG_REG (y),
8880                       gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
8881     return 1;
8882
8883   if (MEM_P (y) && GET_CODE (x) == SUBREG
8884       && MEM_P (SUBREG_REG (x))
8885       && rtx_equal_p (SUBREG_REG (x),
8886                       gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
8887     return 1;
8888
8889   /* We used to see if get_last_value of X and Y were the same but that's
8890      not correct.  In one direction, we'll cause the assignment to have
8891      the wrong destination and in the case, we'll import a register into this
8892      insn that might have already have been dead.   So fail if none of the
8893      above cases are true.  */
8894   return 0;
8895 }
8896 \f
8897 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
8898    Return that assignment if so.
8899
8900    We only handle the most common cases.  */
8901
8902 static rtx
8903 make_field_assignment (rtx x)
8904 {
8905   rtx dest = SET_DEST (x);
8906   rtx src = SET_SRC (x);
8907   rtx assign;
8908   rtx rhs, lhs;
8909   HOST_WIDE_INT c1;
8910   HOST_WIDE_INT pos;
8911   unsigned HOST_WIDE_INT len;
8912   rtx other;
8913   enum machine_mode mode;
8914
8915   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
8916      a clear of a one-bit field.  We will have changed it to
8917      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
8918      for a SUBREG.  */
8919
8920   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
8921       && CONST_INT_P (XEXP (XEXP (src, 0), 0))
8922       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
8923       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8924     {
8925       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8926                                 1, 1, 1, 0);
8927       if (assign != 0)
8928         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8929       return x;
8930     }
8931
8932   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
8933       && subreg_lowpart_p (XEXP (src, 0))
8934       && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
8935           < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
8936       && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
8937       && CONST_INT_P (XEXP (SUBREG_REG (XEXP (src, 0)), 0))
8938       && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
8939       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8940     {
8941       assign = make_extraction (VOIDmode, dest, 0,
8942                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
8943                                 1, 1, 1, 0);
8944       if (assign != 0)
8945         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8946       return x;
8947     }
8948
8949   /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
8950      one-bit field.  */
8951   if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
8952       && XEXP (XEXP (src, 0), 0) == const1_rtx
8953       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8954     {
8955       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8956                                 1, 1, 1, 0);
8957       if (assign != 0)
8958         return gen_rtx_SET (VOIDmode, assign, const1_rtx);
8959       return x;
8960     }
8961
8962   /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
8963      SRC is an AND with all bits of that field set, then we can discard
8964      the AND.  */
8965   if (GET_CODE (dest) == ZERO_EXTRACT
8966       && CONST_INT_P (XEXP (dest, 1))
8967       && GET_CODE (src) == AND
8968       && CONST_INT_P (XEXP (src, 1)))
8969     {
8970       HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
8971       unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
8972       unsigned HOST_WIDE_INT ze_mask;
8973
8974       if (width >= HOST_BITS_PER_WIDE_INT)
8975         ze_mask = -1;
8976       else
8977         ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
8978
8979       /* Complete overlap.  We can remove the source AND.  */
8980       if ((and_mask & ze_mask) == ze_mask)
8981         return gen_rtx_SET (VOIDmode, dest, XEXP (src, 0));
8982
8983       /* Partial overlap.  We can reduce the source AND.  */
8984       if ((and_mask & ze_mask) != and_mask)
8985         {
8986           mode = GET_MODE (src);
8987           src = gen_rtx_AND (mode, XEXP (src, 0),
8988                              gen_int_mode (and_mask & ze_mask, mode));
8989           return gen_rtx_SET (VOIDmode, dest, src);
8990         }
8991     }
8992
8993   /* The other case we handle is assignments into a constant-position
8994      field.  They look like (ior/xor (and DEST C1) OTHER).  If C1 represents
8995      a mask that has all one bits except for a group of zero bits and
8996      OTHER is known to have zeros where C1 has ones, this is such an
8997      assignment.  Compute the position and length from C1.  Shift OTHER
8998      to the appropriate position, force it to the required mode, and
8999      make the extraction.  Check for the AND in both operands.  */
9000
9001   if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
9002     return x;
9003
9004   rhs = expand_compound_operation (XEXP (src, 0));
9005   lhs = expand_compound_operation (XEXP (src, 1));
9006
9007   if (GET_CODE (rhs) == AND
9008       && CONST_INT_P (XEXP (rhs, 1))
9009       && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
9010     c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
9011   else if (GET_CODE (lhs) == AND
9012            && CONST_INT_P (XEXP (lhs, 1))
9013            && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
9014     c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
9015   else
9016     return x;
9017
9018   pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
9019   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
9020       || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
9021       || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
9022     return x;
9023
9024   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
9025   if (assign == 0)
9026     return x;
9027
9028   /* The mode to use for the source is the mode of the assignment, or of
9029      what is inside a possible STRICT_LOW_PART.  */
9030   mode = (GET_CODE (assign) == STRICT_LOW_PART
9031           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
9032
9033   /* Shift OTHER right POS places and make it the source, restricting it
9034      to the proper length and mode.  */
9035
9036   src = canon_reg_for_combine (simplify_shift_const (NULL_RTX, LSHIFTRT,
9037                                                      GET_MODE (src),
9038                                                      other, pos),
9039                                dest);
9040   src = force_to_mode (src, mode,
9041                        GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
9042                        ? ~(unsigned HOST_WIDE_INT) 0
9043                        : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
9044                        0);
9045
9046   /* If SRC is masked by an AND that does not make a difference in
9047      the value being stored, strip it.  */
9048   if (GET_CODE (assign) == ZERO_EXTRACT
9049       && CONST_INT_P (XEXP (assign, 1))
9050       && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
9051       && GET_CODE (src) == AND
9052       && CONST_INT_P (XEXP (src, 1))
9053       && UINTVAL (XEXP (src, 1))
9054          == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1)
9055     src = XEXP (src, 0);
9056
9057   return gen_rtx_SET (VOIDmode, assign, src);
9058 }
9059 \f
9060 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
9061    if so.  */
9062
9063 static rtx
9064 apply_distributive_law (rtx x)
9065 {
9066   enum rtx_code code = GET_CODE (x);
9067   enum rtx_code inner_code;
9068   rtx lhs, rhs, other;
9069   rtx tem;
9070
9071   /* Distributivity is not true for floating point as it can change the
9072      value.  So we don't do it unless -funsafe-math-optimizations.  */
9073   if (FLOAT_MODE_P (GET_MODE (x))
9074       && ! flag_unsafe_math_optimizations)
9075     return x;
9076
9077   /* The outer operation can only be one of the following:  */
9078   if (code != IOR && code != AND && code != XOR
9079       && code != PLUS && code != MINUS)
9080     return x;
9081
9082   lhs = XEXP (x, 0);
9083   rhs = XEXP (x, 1);
9084
9085   /* If either operand is a primitive we can't do anything, so get out
9086      fast.  */
9087   if (OBJECT_P (lhs) || OBJECT_P (rhs))
9088     return x;
9089
9090   lhs = expand_compound_operation (lhs);
9091   rhs = expand_compound_operation (rhs);
9092   inner_code = GET_CODE (lhs);
9093   if (inner_code != GET_CODE (rhs))
9094     return x;
9095
9096   /* See if the inner and outer operations distribute.  */
9097   switch (inner_code)
9098     {
9099     case LSHIFTRT:
9100     case ASHIFTRT:
9101     case AND:
9102     case IOR:
9103       /* These all distribute except over PLUS.  */
9104       if (code == PLUS || code == MINUS)
9105         return x;
9106       break;
9107
9108     case MULT:
9109       if (code != PLUS && code != MINUS)
9110         return x;
9111       break;
9112
9113     case ASHIFT:
9114       /* This is also a multiply, so it distributes over everything.  */
9115       break;
9116
9117     case SUBREG:
9118       /* Non-paradoxical SUBREGs distributes over all operations,
9119          provided the inner modes and byte offsets are the same, this
9120          is an extraction of a low-order part, we don't convert an fp
9121          operation to int or vice versa, this is not a vector mode,
9122          and we would not be converting a single-word operation into a
9123          multi-word operation.  The latter test is not required, but
9124          it prevents generating unneeded multi-word operations.  Some
9125          of the previous tests are redundant given the latter test,
9126          but are retained because they are required for correctness.
9127
9128          We produce the result slightly differently in this case.  */
9129
9130       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
9131           || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
9132           || ! subreg_lowpart_p (lhs)
9133           || (GET_MODE_CLASS (GET_MODE (lhs))
9134               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
9135           || (GET_MODE_SIZE (GET_MODE (lhs))
9136               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
9137           || VECTOR_MODE_P (GET_MODE (lhs))
9138           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD
9139           /* Result might need to be truncated.  Don't change mode if
9140              explicit truncation is needed.  */
9141           || !TRULY_NOOP_TRUNCATION
9142                (GET_MODE_BITSIZE (GET_MODE (x)),
9143                 GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (lhs)))))
9144         return x;
9145
9146       tem = simplify_gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
9147                                  SUBREG_REG (lhs), SUBREG_REG (rhs));
9148       return gen_lowpart (GET_MODE (x), tem);
9149
9150     default:
9151       return x;
9152     }
9153
9154   /* Set LHS and RHS to the inner operands (A and B in the example
9155      above) and set OTHER to the common operand (C in the example).
9156      There is only one way to do this unless the inner operation is
9157      commutative.  */
9158   if (COMMUTATIVE_ARITH_P (lhs)
9159       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
9160     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
9161   else if (COMMUTATIVE_ARITH_P (lhs)
9162            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
9163     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
9164   else if (COMMUTATIVE_ARITH_P (lhs)
9165            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
9166     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
9167   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
9168     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
9169   else
9170     return x;
9171
9172   /* Form the new inner operation, seeing if it simplifies first.  */
9173   tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
9174
9175   /* There is one exception to the general way of distributing:
9176      (a | c) ^ (b | c) -> (a ^ b) & ~c  */
9177   if (code == XOR && inner_code == IOR)
9178     {
9179       inner_code = AND;
9180       other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
9181     }
9182
9183   /* We may be able to continuing distributing the result, so call
9184      ourselves recursively on the inner operation before forming the
9185      outer operation, which we return.  */
9186   return simplify_gen_binary (inner_code, GET_MODE (x),
9187                               apply_distributive_law (tem), other);
9188 }
9189
9190 /* See if X is of the form (* (+ A B) C), and if so convert to
9191    (+ (* A C) (* B C)) and try to simplify.
9192
9193    Most of the time, this results in no change.  However, if some of
9194    the operands are the same or inverses of each other, simplifications
9195    will result.
9196
9197    For example, (and (ior A B) (not B)) can occur as the result of
9198    expanding a bit field assignment.  When we apply the distributive
9199    law to this, we get (ior (and (A (not B))) (and (B (not B)))),
9200    which then simplifies to (and (A (not B))).
9201
9202    Note that no checks happen on the validity of applying the inverse
9203    distributive law.  This is pointless since we can do it in the
9204    few places where this routine is called.
9205
9206    N is the index of the term that is decomposed (the arithmetic operation,
9207    i.e. (+ A B) in the first example above).  !N is the index of the term that
9208    is distributed, i.e. of C in the first example above.  */
9209 static rtx
9210 distribute_and_simplify_rtx (rtx x, int n)
9211 {
9212   enum machine_mode mode;
9213   enum rtx_code outer_code, inner_code;
9214   rtx decomposed, distributed, inner_op0, inner_op1, new_op0, new_op1, tmp;
9215
9216   /* Distributivity is not true for floating point as it can change the
9217      value.  So we don't do it unless -funsafe-math-optimizations.  */
9218   if (FLOAT_MODE_P (GET_MODE (x))
9219       && ! flag_unsafe_math_optimizations)
9220     return NULL_RTX;
9221
9222   decomposed = XEXP (x, n);
9223   if (!ARITHMETIC_P (decomposed))
9224     return NULL_RTX;
9225
9226   mode = GET_MODE (x);
9227   outer_code = GET_CODE (x);
9228   distributed = XEXP (x, !n);
9229
9230   inner_code = GET_CODE (decomposed);
9231   inner_op0 = XEXP (decomposed, 0);
9232   inner_op1 = XEXP (decomposed, 1);
9233
9234   /* Special case (and (xor B C) (not A)), which is equivalent to
9235      (xor (ior A B) (ior A C))  */
9236   if (outer_code == AND && inner_code == XOR && GET_CODE (distributed) == NOT)
9237     {
9238       distributed = XEXP (distributed, 0);
9239       outer_code = IOR;
9240     }
9241
9242   if (n == 0)
9243     {
9244       /* Distribute the second term.  */
9245       new_op0 = simplify_gen_binary (outer_code, mode, inner_op0, distributed);
9246       new_op1 = simplify_gen_binary (outer_code, mode, inner_op1, distributed);
9247     }
9248   else
9249     {
9250       /* Distribute the first term.  */
9251       new_op0 = simplify_gen_binary (outer_code, mode, distributed, inner_op0);
9252       new_op1 = simplify_gen_binary (outer_code, mode, distributed, inner_op1);
9253     }
9254
9255   tmp = apply_distributive_law (simplify_gen_binary (inner_code, mode,
9256                                                      new_op0, new_op1));
9257   if (GET_CODE (tmp) != outer_code
9258       && rtx_cost (tmp, SET, optimize_this_for_speed_p)
9259          < rtx_cost (x, SET, optimize_this_for_speed_p))
9260     return tmp;
9261
9262   return NULL_RTX;
9263 }
9264 \f
9265 /* Simplify a logical `and' of VAROP with the constant CONSTOP, to be done
9266    in MODE.  Return an equivalent form, if different from (and VAROP
9267    (const_int CONSTOP)).  Otherwise, return NULL_RTX.  */
9268
9269 static rtx
9270 simplify_and_const_int_1 (enum machine_mode mode, rtx varop,
9271                           unsigned HOST_WIDE_INT constop)
9272 {
9273   unsigned HOST_WIDE_INT nonzero;
9274   unsigned HOST_WIDE_INT orig_constop;
9275   rtx orig_varop;
9276   int i;
9277
9278   orig_varop = varop;
9279   orig_constop = constop;
9280   if (GET_CODE (varop) == CLOBBER)
9281     return NULL_RTX;
9282
9283   /* Simplify VAROP knowing that we will be only looking at some of the
9284      bits in it.
9285
9286      Note by passing in CONSTOP, we guarantee that the bits not set in
9287      CONSTOP are not significant and will never be examined.  We must
9288      ensure that is the case by explicitly masking out those bits
9289      before returning.  */
9290   varop = force_to_mode (varop, mode, constop, 0);
9291
9292   /* If VAROP is a CLOBBER, we will fail so return it.  */
9293   if (GET_CODE (varop) == CLOBBER)
9294     return varop;
9295
9296   /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
9297      to VAROP and return the new constant.  */
9298   if (CONST_INT_P (varop))
9299     return gen_int_mode (INTVAL (varop) & constop, mode);
9300
9301   /* See what bits may be nonzero in VAROP.  Unlike the general case of
9302      a call to nonzero_bits, here we don't care about bits outside
9303      MODE.  */
9304
9305   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
9306
9307   /* Turn off all bits in the constant that are known to already be zero.
9308      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
9309      which is tested below.  */
9310
9311   constop &= nonzero;
9312
9313   /* If we don't have any bits left, return zero.  */
9314   if (constop == 0)
9315     return const0_rtx;
9316
9317   /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
9318      a power of two, we can replace this with an ASHIFT.  */
9319   if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
9320       && (i = exact_log2 (constop)) >= 0)
9321     return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
9322
9323   /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
9324      or XOR, then try to apply the distributive law.  This may eliminate
9325      operations if either branch can be simplified because of the AND.
9326      It may also make some cases more complex, but those cases probably
9327      won't match a pattern either with or without this.  */
9328
9329   if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
9330     return
9331       gen_lowpart
9332         (mode,
9333          apply_distributive_law
9334          (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
9335                                simplify_and_const_int (NULL_RTX,
9336                                                        GET_MODE (varop),
9337                                                        XEXP (varop, 0),
9338                                                        constop),
9339                                simplify_and_const_int (NULL_RTX,
9340                                                        GET_MODE (varop),
9341                                                        XEXP (varop, 1),
9342                                                        constop))));
9343
9344   /* If VAROP is PLUS, and the constant is a mask of low bits, distribute
9345      the AND and see if one of the operands simplifies to zero.  If so, we
9346      may eliminate it.  */
9347
9348   if (GET_CODE (varop) == PLUS
9349       && exact_log2 (constop + 1) >= 0)
9350     {
9351       rtx o0, o1;
9352
9353       o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
9354       o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
9355       if (o0 == const0_rtx)
9356         return o1;
9357       if (o1 == const0_rtx)
9358         return o0;
9359     }
9360
9361   /* Make a SUBREG if necessary.  If we can't make it, fail.  */
9362   varop = gen_lowpart (mode, varop);
9363   if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
9364     return NULL_RTX;
9365
9366   /* If we are only masking insignificant bits, return VAROP.  */
9367   if (constop == nonzero)
9368     return varop;
9369
9370   if (varop == orig_varop && constop == orig_constop)
9371     return NULL_RTX;
9372
9373   /* Otherwise, return an AND.  */
9374   return simplify_gen_binary (AND, mode, varop, gen_int_mode (constop, mode));
9375 }
9376
9377
9378 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
9379    in MODE.
9380
9381    Return an equivalent form, if different from X.  Otherwise, return X.  If
9382    X is zero, we are to always construct the equivalent form.  */
9383
9384 static rtx
9385 simplify_and_const_int (rtx x, enum machine_mode mode, rtx varop,
9386                         unsigned HOST_WIDE_INT constop)
9387 {
9388   rtx tem = simplify_and_const_int_1 (mode, varop, constop);
9389   if (tem)
9390     return tem;
9391
9392   if (!x)
9393     x = simplify_gen_binary (AND, GET_MODE (varop), varop,
9394                              gen_int_mode (constop, mode));
9395   if (GET_MODE (x) != mode)
9396     x = gen_lowpart (mode, x);
9397   return x;
9398 }
9399 \f
9400 /* Given a REG, X, compute which bits in X can be nonzero.
9401    We don't care about bits outside of those defined in MODE.
9402
9403    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
9404    a shift, AND, or zero_extract, we can do better.  */
9405
9406 static rtx
9407 reg_nonzero_bits_for_combine (const_rtx x, enum machine_mode mode,
9408                               const_rtx known_x ATTRIBUTE_UNUSED,
9409                               enum machine_mode known_mode ATTRIBUTE_UNUSED,
9410                               unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
9411                               unsigned HOST_WIDE_INT *nonzero)
9412 {
9413   rtx tem;
9414   reg_stat_type *rsp;
9415
9416   /* If X is a register whose nonzero bits value is current, use it.
9417      Otherwise, if X is a register whose value we can find, use that
9418      value.  Otherwise, use the previously-computed global nonzero bits
9419      for this register.  */
9420
9421   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
9422   if (rsp->last_set_value != 0
9423       && (rsp->last_set_mode == mode
9424           || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
9425               && GET_MODE_CLASS (mode) == MODE_INT))
9426       && ((rsp->last_set_label >= label_tick_ebb_start
9427            && rsp->last_set_label < label_tick)
9428           || (rsp->last_set_label == label_tick
9429               && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
9430           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
9431               && REG_N_SETS (REGNO (x)) == 1
9432               && !REGNO_REG_SET_P
9433                   (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x)))))
9434     {
9435       *nonzero &= rsp->last_set_nonzero_bits;
9436       return NULL;
9437     }
9438
9439   tem = get_last_value (x);
9440
9441   if (tem)
9442     {
9443 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
9444       /* If X is narrower than MODE and TEM is a non-negative
9445          constant that would appear negative in the mode of X,
9446          sign-extend it for use in reg_nonzero_bits because some
9447          machines (maybe most) will actually do the sign-extension
9448          and this is the conservative approach.
9449
9450          ??? For 2.5, try to tighten up the MD files in this regard
9451          instead of this kludge.  */
9452
9453       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode)
9454           && CONST_INT_P (tem)
9455           && INTVAL (tem) > 0
9456           && 0 != (UINTVAL (tem)
9457                    & ((unsigned HOST_WIDE_INT) 1
9458                       << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
9459         tem = GEN_INT (UINTVAL (tem)
9460                        | ((unsigned HOST_WIDE_INT) (-1)
9461                           << GET_MODE_BITSIZE (GET_MODE (x))));
9462 #endif
9463       return tem;
9464     }
9465   else if (nonzero_sign_valid && rsp->nonzero_bits)
9466     {
9467       unsigned HOST_WIDE_INT mask = rsp->nonzero_bits;
9468
9469       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode))
9470         /* We don't know anything about the upper bits.  */
9471         mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
9472       *nonzero &= mask;
9473     }
9474
9475   return NULL;
9476 }
9477
9478 /* Return the number of bits at the high-order end of X that are known to
9479    be equal to the sign bit.  X will be used in mode MODE; if MODE is
9480    VOIDmode, X will be used in its own mode.  The returned value  will always
9481    be between 1 and the number of bits in MODE.  */
9482
9483 static rtx
9484 reg_num_sign_bit_copies_for_combine (const_rtx x, enum machine_mode mode,
9485                                      const_rtx known_x ATTRIBUTE_UNUSED,
9486                                      enum machine_mode known_mode
9487                                      ATTRIBUTE_UNUSED,
9488                                      unsigned int known_ret ATTRIBUTE_UNUSED,
9489                                      unsigned int *result)
9490 {
9491   rtx tem;
9492   reg_stat_type *rsp;
9493
9494   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
9495   if (rsp->last_set_value != 0
9496       && rsp->last_set_mode == mode
9497       && ((rsp->last_set_label >= label_tick_ebb_start
9498            && rsp->last_set_label < label_tick)
9499           || (rsp->last_set_label == label_tick
9500               && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
9501           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
9502               && REG_N_SETS (REGNO (x)) == 1
9503               && !REGNO_REG_SET_P
9504                   (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x)))))
9505     {
9506       *result = rsp->last_set_sign_bit_copies;
9507       return NULL;
9508     }
9509
9510   tem = get_last_value (x);
9511   if (tem != 0)
9512     return tem;
9513
9514   if (nonzero_sign_valid && rsp->sign_bit_copies != 0
9515       && GET_MODE_BITSIZE (GET_MODE (x)) == GET_MODE_BITSIZE (mode))
9516     *result = rsp->sign_bit_copies;
9517
9518   return NULL;
9519 }
9520 \f
9521 /* Return the number of "extended" bits there are in X, when interpreted
9522    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
9523    unsigned quantities, this is the number of high-order zero bits.
9524    For signed quantities, this is the number of copies of the sign bit
9525    minus 1.  In both case, this function returns the number of "spare"
9526    bits.  For example, if two quantities for which this function returns
9527    at least 1 are added, the addition is known not to overflow.
9528
9529    This function will always return 0 unless called during combine, which
9530    implies that it must be called from a define_split.  */
9531
9532 unsigned int
9533 extended_count (const_rtx x, enum machine_mode mode, int unsignedp)
9534 {
9535   if (nonzero_sign_valid == 0)
9536     return 0;
9537
9538   return (unsignedp
9539           ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9540              ? (unsigned int) (GET_MODE_BITSIZE (mode) - 1
9541                                - floor_log2 (nonzero_bits (x, mode)))
9542              : 0)
9543           : num_sign_bit_copies (x, mode) - 1);
9544 }
9545 \f
9546 /* This function is called from `simplify_shift_const' to merge two
9547    outer operations.  Specifically, we have already found that we need
9548    to perform operation *POP0 with constant *PCONST0 at the outermost
9549    position.  We would now like to also perform OP1 with constant CONST1
9550    (with *POP0 being done last).
9551
9552    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
9553    the resulting operation.  *PCOMP_P is set to 1 if we would need to
9554    complement the innermost operand, otherwise it is unchanged.
9555
9556    MODE is the mode in which the operation will be done.  No bits outside
9557    the width of this mode matter.  It is assumed that the width of this mode
9558    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
9559
9560    If *POP0 or OP1 are UNKNOWN, it means no operation is required.  Only NEG, PLUS,
9561    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
9562    result is simply *PCONST0.
9563
9564    If the resulting operation cannot be expressed as one operation, we
9565    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
9566
9567 static int
9568 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)
9569 {
9570   enum rtx_code op0 = *pop0;
9571   HOST_WIDE_INT const0 = *pconst0;
9572
9573   const0 &= GET_MODE_MASK (mode);
9574   const1 &= GET_MODE_MASK (mode);
9575
9576   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
9577   if (op0 == AND)
9578     const1 &= const0;
9579
9580   /* If OP0 or OP1 is UNKNOWN, this is easy.  Similarly if they are the same or
9581      if OP0 is SET.  */
9582
9583   if (op1 == UNKNOWN || op0 == SET)
9584     return 1;
9585
9586   else if (op0 == UNKNOWN)
9587     op0 = op1, const0 = const1;
9588
9589   else if (op0 == op1)
9590     {
9591       switch (op0)
9592         {
9593         case AND:
9594           const0 &= const1;
9595           break;
9596         case IOR:
9597           const0 |= const1;
9598           break;
9599         case XOR:
9600           const0 ^= const1;
9601           break;
9602         case PLUS:
9603           const0 += const1;
9604           break;
9605         case NEG:
9606           op0 = UNKNOWN;
9607           break;
9608         default:
9609           break;
9610         }
9611     }
9612
9613   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
9614   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
9615     return 0;
9616
9617   /* If the two constants aren't the same, we can't do anything.  The
9618      remaining six cases can all be done.  */
9619   else if (const0 != const1)
9620     return 0;
9621
9622   else
9623     switch (op0)
9624       {
9625       case IOR:
9626         if (op1 == AND)
9627           /* (a & b) | b == b */
9628           op0 = SET;
9629         else /* op1 == XOR */
9630           /* (a ^ b) | b == a | b */
9631           {;}
9632         break;
9633
9634       case XOR:
9635         if (op1 == AND)
9636           /* (a & b) ^ b == (~a) & b */
9637           op0 = AND, *pcomp_p = 1;
9638         else /* op1 == IOR */
9639           /* (a | b) ^ b == a & ~b */
9640           op0 = AND, const0 = ~const0;
9641         break;
9642
9643       case AND:
9644         if (op1 == IOR)
9645           /* (a | b) & b == b */
9646         op0 = SET;
9647         else /* op1 == XOR */
9648           /* (a ^ b) & b) == (~a) & b */
9649           *pcomp_p = 1;
9650         break;
9651       default:
9652         break;
9653       }
9654
9655   /* Check for NO-OP cases.  */
9656   const0 &= GET_MODE_MASK (mode);
9657   if (const0 == 0
9658       && (op0 == IOR || op0 == XOR || op0 == PLUS))
9659     op0 = UNKNOWN;
9660   else if (const0 == 0 && op0 == AND)
9661     op0 = SET;
9662   else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
9663            && op0 == AND)
9664     op0 = UNKNOWN;
9665
9666   *pop0 = op0;
9667
9668   /* ??? Slightly redundant with the above mask, but not entirely.
9669      Moving this above means we'd have to sign-extend the mode mask
9670      for the final test.  */
9671   if (op0 != UNKNOWN && op0 != NEG)
9672     *pconst0 = trunc_int_for_mode (const0, mode);
9673
9674   return 1;
9675 }
9676 \f
9677 /* A helper to simplify_shift_const_1 to determine the mode we can perform
9678    the shift in.  The original shift operation CODE is performed on OP in
9679    ORIG_MODE.  Return the wider mode MODE if we can perform the operation
9680    in that mode.  Return ORIG_MODE otherwise.  We can also assume that the
9681    result of the shift is subject to operation OUTER_CODE with operand
9682    OUTER_CONST.  */
9683
9684 static enum machine_mode
9685 try_widen_shift_mode (enum rtx_code code, rtx op, int count,
9686                       enum machine_mode orig_mode, enum machine_mode mode,
9687                       enum rtx_code outer_code, HOST_WIDE_INT outer_const)
9688 {
9689   if (orig_mode == mode)
9690     return mode;
9691   gcc_assert (GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (orig_mode));
9692
9693   /* In general we can't perform in wider mode for right shift and rotate.  */
9694   switch (code)
9695     {
9696     case ASHIFTRT:
9697       /* We can still widen if the bits brought in from the left are identical
9698          to the sign bit of ORIG_MODE.  */
9699       if (num_sign_bit_copies (op, mode)
9700           > (unsigned) (GET_MODE_BITSIZE (mode)
9701                         - GET_MODE_BITSIZE (orig_mode)))
9702         return mode;
9703       return orig_mode;
9704
9705     case LSHIFTRT:
9706       /* Similarly here but with zero bits.  */
9707       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9708           && (nonzero_bits (op, mode) & ~GET_MODE_MASK (orig_mode)) == 0)
9709         return mode;
9710
9711       /* We can also widen if the bits brought in will be masked off.  This
9712          operation is performed in ORIG_MODE.  */
9713       if (outer_code == AND)
9714         {
9715           int care_bits = low_bitmask_len (orig_mode, outer_const);
9716
9717           if (care_bits >= 0
9718               && GET_MODE_BITSIZE (orig_mode) - care_bits >= count)
9719             return mode;
9720         }
9721       /* fall through */
9722
9723     case ROTATE:
9724       return orig_mode;
9725
9726     case ROTATERT:
9727       gcc_unreachable ();
9728
9729     default:
9730       return mode;
9731     }
9732 }
9733
9734 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
9735    The result of the shift is RESULT_MODE.  Return NULL_RTX if we cannot
9736    simplify it.  Otherwise, return a simplified value.
9737
9738    The shift is normally computed in the widest mode we find in VAROP, as
9739    long as it isn't a different number of words than RESULT_MODE.  Exceptions
9740    are ASHIFTRT and ROTATE, which are always done in their original mode.  */
9741
9742 static rtx
9743 simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode,
9744                         rtx varop, int orig_count)
9745 {
9746   enum rtx_code orig_code = code;
9747   rtx orig_varop = varop;
9748   int count;
9749   enum machine_mode mode = result_mode;
9750   enum machine_mode shift_mode, tmode;
9751   unsigned int mode_words
9752     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
9753   /* We form (outer_op (code varop count) (outer_const)).  */
9754   enum rtx_code outer_op = UNKNOWN;
9755   HOST_WIDE_INT outer_const = 0;
9756   int complement_p = 0;
9757   rtx new_rtx, x;
9758
9759   /* Make sure and truncate the "natural" shift on the way in.  We don't
9760      want to do this inside the loop as it makes it more difficult to
9761      combine shifts.  */
9762   if (SHIFT_COUNT_TRUNCATED)
9763     orig_count &= GET_MODE_BITSIZE (mode) - 1;
9764
9765   /* If we were given an invalid count, don't do anything except exactly
9766      what was requested.  */
9767
9768   if (orig_count < 0 || orig_count >= (int) GET_MODE_BITSIZE (mode))
9769     return NULL_RTX;
9770
9771   count = orig_count;
9772
9773   /* Unless one of the branches of the `if' in this loop does a `continue',
9774      we will `break' the loop after the `if'.  */
9775
9776   while (count != 0)
9777     {
9778       /* If we have an operand of (clobber (const_int 0)), fail.  */
9779       if (GET_CODE (varop) == CLOBBER)
9780         return NULL_RTX;
9781
9782       /* Convert ROTATERT to ROTATE.  */
9783       if (code == ROTATERT)
9784         {
9785           unsigned int bitsize = GET_MODE_BITSIZE (result_mode);;
9786           code = ROTATE;
9787           if (VECTOR_MODE_P (result_mode))
9788             count = bitsize / GET_MODE_NUNITS (result_mode) - count;
9789           else
9790             count = bitsize - count;
9791         }
9792
9793       shift_mode = try_widen_shift_mode (code, varop, count, result_mode,
9794                                          mode, outer_op, outer_const);
9795
9796       /* Handle cases where the count is greater than the size of the mode
9797          minus 1.  For ASHIFT, use the size minus one as the count (this can
9798          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
9799          take the count modulo the size.  For other shifts, the result is
9800          zero.
9801
9802          Since these shifts are being produced by the compiler by combining
9803          multiple operations, each of which are defined, we know what the
9804          result is supposed to be.  */
9805
9806       if (count > (GET_MODE_BITSIZE (shift_mode) - 1))
9807         {
9808           if (code == ASHIFTRT)
9809             count = GET_MODE_BITSIZE (shift_mode) - 1;
9810           else if (code == ROTATE || code == ROTATERT)
9811             count %= GET_MODE_BITSIZE (shift_mode);
9812           else
9813             {
9814               /* We can't simply return zero because there may be an
9815                  outer op.  */
9816               varop = const0_rtx;
9817               count = 0;
9818               break;
9819             }
9820         }
9821
9822       /* If we discovered we had to complement VAROP, leave.  Making a NOT
9823          here would cause an infinite loop.  */
9824       if (complement_p)
9825         break;
9826
9827       /* An arithmetic right shift of a quantity known to be -1 or 0
9828          is a no-op.  */
9829       if (code == ASHIFTRT
9830           && (num_sign_bit_copies (varop, shift_mode)
9831               == GET_MODE_BITSIZE (shift_mode)))
9832         {
9833           count = 0;
9834           break;
9835         }
9836
9837       /* If we are doing an arithmetic right shift and discarding all but
9838          the sign bit copies, this is equivalent to doing a shift by the
9839          bitsize minus one.  Convert it into that shift because it will often
9840          allow other simplifications.  */
9841
9842       if (code == ASHIFTRT
9843           && (count + num_sign_bit_copies (varop, shift_mode)
9844               >= GET_MODE_BITSIZE (shift_mode)))
9845         count = GET_MODE_BITSIZE (shift_mode) - 1;
9846
9847       /* We simplify the tests below and elsewhere by converting
9848          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
9849          `make_compound_operation' will convert it to an ASHIFTRT for
9850          those machines (such as VAX) that don't have an LSHIFTRT.  */
9851       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9852           && code == ASHIFTRT
9853           && ((nonzero_bits (varop, shift_mode)
9854                & ((unsigned HOST_WIDE_INT) 1
9855                   << (GET_MODE_BITSIZE (shift_mode) - 1))) == 0))
9856         code = LSHIFTRT;
9857
9858       if (((code == LSHIFTRT
9859             && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9860             && !(nonzero_bits (varop, shift_mode) >> count))
9861            || (code == ASHIFT
9862                && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9863                && !((nonzero_bits (varop, shift_mode) << count)
9864                     & GET_MODE_MASK (shift_mode))))
9865           && !side_effects_p (varop))
9866         varop = const0_rtx;
9867
9868       switch (GET_CODE (varop))
9869         {
9870         case SIGN_EXTEND:
9871         case ZERO_EXTEND:
9872         case SIGN_EXTRACT:
9873         case ZERO_EXTRACT:
9874           new_rtx = expand_compound_operation (varop);
9875           if (new_rtx != varop)
9876             {
9877               varop = new_rtx;
9878               continue;
9879             }
9880           break;
9881
9882         case MEM:
9883           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
9884              minus the width of a smaller mode, we can do this with a
9885              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
9886           if ((code == ASHIFTRT || code == LSHIFTRT)
9887               && ! mode_dependent_address_p (XEXP (varop, 0))
9888               && ! MEM_VOLATILE_P (varop)
9889               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9890                                          MODE_INT, 1)) != BLKmode)
9891             {
9892               new_rtx = adjust_address_nv (varop, tmode,
9893                                        BYTES_BIG_ENDIAN ? 0
9894                                        : count / BITS_PER_UNIT);
9895
9896               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9897                                      : ZERO_EXTEND, mode, new_rtx);
9898               count = 0;
9899               continue;
9900             }
9901           break;
9902
9903         case SUBREG:
9904           /* If VAROP is a SUBREG, strip it as long as the inner operand has
9905              the same number of words as what we've seen so far.  Then store
9906              the widest mode in MODE.  */
9907           if (subreg_lowpart_p (varop)
9908               && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9909                   > GET_MODE_SIZE (GET_MODE (varop)))
9910               && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9911                                   + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
9912                  == mode_words
9913               && GET_MODE_CLASS (GET_MODE (varop)) == MODE_INT
9914               && GET_MODE_CLASS (GET_MODE (SUBREG_REG (varop))) == MODE_INT)
9915             {
9916               varop = SUBREG_REG (varop);
9917               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
9918                 mode = GET_MODE (varop);
9919               continue;
9920             }
9921           break;
9922
9923         case MULT:
9924           /* Some machines use MULT instead of ASHIFT because MULT
9925              is cheaper.  But it is still better on those machines to
9926              merge two shifts into one.  */
9927           if (CONST_INT_P (XEXP (varop, 1))
9928               && exact_log2 (UINTVAL (XEXP (varop, 1))) >= 0)
9929             {
9930               varop
9931                 = simplify_gen_binary (ASHIFT, GET_MODE (varop),
9932                                        XEXP (varop, 0),
9933                                        GEN_INT (exact_log2 (
9934                                                 UINTVAL (XEXP (varop, 1)))));
9935               continue;
9936             }
9937           break;
9938
9939         case UDIV:
9940           /* Similar, for when divides are cheaper.  */
9941           if (CONST_INT_P (XEXP (varop, 1))
9942               && exact_log2 (UINTVAL (XEXP (varop, 1))) >= 0)
9943             {
9944               varop
9945                 = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
9946                                        XEXP (varop, 0),
9947                                        GEN_INT (exact_log2 (
9948                                                 UINTVAL (XEXP (varop, 1)))));
9949               continue;
9950             }
9951           break;
9952
9953         case ASHIFTRT:
9954           /* If we are extracting just the sign bit of an arithmetic
9955              right shift, that shift is not needed.  However, the sign
9956              bit of a wider mode may be different from what would be
9957              interpreted as the sign bit in a narrower mode, so, if
9958              the result is narrower, don't discard the shift.  */
9959           if (code == LSHIFTRT
9960               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9961               && (GET_MODE_BITSIZE (result_mode)
9962                   >= GET_MODE_BITSIZE (GET_MODE (varop))))
9963             {
9964               varop = XEXP (varop, 0);
9965               continue;
9966             }
9967
9968           /* ... fall through ...  */
9969
9970         case LSHIFTRT:
9971         case ASHIFT:
9972         case ROTATE:
9973           /* Here we have two nested shifts.  The result is usually the
9974              AND of a new shift with a mask.  We compute the result below.  */
9975           if (CONST_INT_P (XEXP (varop, 1))
9976               && INTVAL (XEXP (varop, 1)) >= 0
9977               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
9978               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9979               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9980               && !VECTOR_MODE_P (result_mode))
9981             {
9982               enum rtx_code first_code = GET_CODE (varop);
9983               unsigned int first_count = INTVAL (XEXP (varop, 1));
9984               unsigned HOST_WIDE_INT mask;
9985               rtx mask_rtx;
9986
9987               /* We have one common special case.  We can't do any merging if
9988                  the inner code is an ASHIFTRT of a smaller mode.  However, if
9989                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
9990                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
9991                  we can convert it to
9992                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
9993                  This simplifies certain SIGN_EXTEND operations.  */
9994               if (code == ASHIFT && first_code == ASHIFTRT
9995                   && count == (GET_MODE_BITSIZE (result_mode)
9996                                - GET_MODE_BITSIZE (GET_MODE (varop))))
9997                 {
9998                   /* C3 has the low-order C1 bits zero.  */
9999
10000                   mask = GET_MODE_MASK (mode)
10001                          & ~(((unsigned HOST_WIDE_INT) 1 << first_count) - 1);
10002
10003                   varop = simplify_and_const_int (NULL_RTX, result_mode,
10004                                                   XEXP (varop, 0), mask);
10005                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
10006                                                 varop, count);
10007                   count = first_count;
10008                   code = ASHIFTRT;
10009                   continue;
10010                 }
10011
10012               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
10013                  than C1 high-order bits equal to the sign bit, we can convert
10014                  this to either an ASHIFT or an ASHIFTRT depending on the
10015                  two counts.
10016
10017                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
10018
10019               if (code == ASHIFTRT && first_code == ASHIFT
10020                   && GET_MODE (varop) == shift_mode
10021                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
10022                       > first_count))
10023                 {
10024                   varop = XEXP (varop, 0);
10025                   count -= first_count;
10026                   if (count < 0)
10027                     {
10028                       count = -count;
10029                       code = ASHIFT;
10030                     }
10031
10032                   continue;
10033                 }
10034
10035               /* There are some cases we can't do.  If CODE is ASHIFTRT,
10036                  we can only do this if FIRST_CODE is also ASHIFTRT.
10037
10038                  We can't do the case when CODE is ROTATE and FIRST_CODE is
10039                  ASHIFTRT.
10040
10041                  If the mode of this shift is not the mode of the outer shift,
10042                  we can't do this if either shift is a right shift or ROTATE.
10043
10044                  Finally, we can't do any of these if the mode is too wide
10045                  unless the codes are the same.
10046
10047                  Handle the case where the shift codes are the same
10048                  first.  */
10049
10050               if (code == first_code)
10051                 {
10052                   if (GET_MODE (varop) != result_mode
10053                       && (code == ASHIFTRT || code == LSHIFTRT
10054                           || code == ROTATE))
10055                     break;
10056
10057                   count += first_count;
10058                   varop = XEXP (varop, 0);
10059                   continue;
10060                 }
10061
10062               if (code == ASHIFTRT
10063                   || (code == ROTATE && first_code == ASHIFTRT)
10064                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
10065                   || (GET_MODE (varop) != result_mode
10066                       && (first_code == ASHIFTRT || first_code == LSHIFTRT
10067                           || first_code == ROTATE
10068                           || code == ROTATE)))
10069                 break;
10070
10071               /* To compute the mask to apply after the shift, shift the
10072                  nonzero bits of the inner shift the same way the
10073                  outer shift will.  */
10074
10075               mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
10076
10077               mask_rtx
10078                 = simplify_const_binary_operation (code, result_mode, mask_rtx,
10079                                                    GEN_INT (count));
10080
10081               /* Give up if we can't compute an outer operation to use.  */
10082               if (mask_rtx == 0
10083                   || !CONST_INT_P (mask_rtx)
10084                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
10085                                         INTVAL (mask_rtx),
10086                                         result_mode, &complement_p))
10087                 break;
10088
10089               /* If the shifts are in the same direction, we add the
10090                  counts.  Otherwise, we subtract them.  */
10091               if ((code == ASHIFTRT || code == LSHIFTRT)
10092                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
10093                 count += first_count;
10094               else
10095                 count -= first_count;
10096
10097               /* If COUNT is positive, the new shift is usually CODE,
10098                  except for the two exceptions below, in which case it is
10099                  FIRST_CODE.  If the count is negative, FIRST_CODE should
10100                  always be used  */
10101               if (count > 0
10102                   && ((first_code == ROTATE && code == ASHIFT)
10103                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
10104                 code = first_code;
10105               else if (count < 0)
10106                 code = first_code, count = -count;
10107
10108               varop = XEXP (varop, 0);
10109               continue;
10110             }
10111
10112           /* If we have (A << B << C) for any shift, we can convert this to
10113              (A << C << B).  This wins if A is a constant.  Only try this if
10114              B is not a constant.  */
10115
10116           else if (GET_CODE (varop) == code
10117                    && CONST_INT_P (XEXP (varop, 0))
10118                    && !CONST_INT_P (XEXP (varop, 1)))
10119             {
10120               rtx new_rtx = simplify_const_binary_operation (code, mode,
10121                                                          XEXP (varop, 0),
10122                                                          GEN_INT (count));
10123               varop = gen_rtx_fmt_ee (code, mode, new_rtx, XEXP (varop, 1));
10124               count = 0;
10125               continue;
10126             }
10127           break;
10128
10129         case NOT:
10130           if (VECTOR_MODE_P (mode))
10131             break;
10132
10133           /* Make this fit the case below.  */
10134           varop = gen_rtx_XOR (mode, XEXP (varop, 0),
10135                                GEN_INT (GET_MODE_MASK (mode)));
10136           continue;
10137
10138         case IOR:
10139         case AND:
10140         case XOR:
10141           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
10142              with C the size of VAROP - 1 and the shift is logical if
10143              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
10144              we have an (le X 0) operation.   If we have an arithmetic shift
10145              and STORE_FLAG_VALUE is 1 or we have a logical shift with
10146              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
10147
10148           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
10149               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
10150               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
10151               && (code == LSHIFTRT || code == ASHIFTRT)
10152               && count == (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
10153               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
10154             {
10155               count = 0;
10156               varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
10157                                   const0_rtx);
10158
10159               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
10160                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
10161
10162               continue;
10163             }
10164
10165           /* If we have (shift (logical)), move the logical to the outside
10166              to allow it to possibly combine with another logical and the
10167              shift to combine with another shift.  This also canonicalizes to
10168              what a ZERO_EXTRACT looks like.  Also, some machines have
10169              (and (shift)) insns.  */
10170
10171           if (CONST_INT_P (XEXP (varop, 1))
10172               /* We can't do this if we have (ashiftrt (xor))  and the
10173                  constant has its sign bit set in shift_mode.  */
10174               && !(code == ASHIFTRT && GET_CODE (varop) == XOR
10175                    && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
10176                                               shift_mode))
10177               && (new_rtx = simplify_const_binary_operation (code, result_mode,
10178                                                          XEXP (varop, 1),
10179                                                          GEN_INT (count))) != 0
10180               && CONST_INT_P (new_rtx)
10181               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
10182                                   INTVAL (new_rtx), result_mode, &complement_p))
10183             {
10184               varop = XEXP (varop, 0);
10185               continue;
10186             }
10187
10188           /* If we can't do that, try to simplify the shift in each arm of the
10189              logical expression, make a new logical expression, and apply
10190              the inverse distributive law.  This also can't be done
10191              for some (ashiftrt (xor)).  */
10192           if (CONST_INT_P (XEXP (varop, 1))
10193              && !(code == ASHIFTRT && GET_CODE (varop) == XOR
10194                   && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
10195                                              shift_mode)))
10196             {
10197               rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
10198                                               XEXP (varop, 0), count);
10199               rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
10200                                               XEXP (varop, 1), count);
10201
10202               varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
10203                                            lhs, rhs);
10204               varop = apply_distributive_law (varop);
10205
10206               count = 0;
10207               continue;
10208             }
10209           break;
10210
10211         case EQ:
10212           /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
10213              says that the sign bit can be tested, FOO has mode MODE, C is
10214              GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
10215              that may be nonzero.  */
10216           if (code == LSHIFTRT
10217               && XEXP (varop, 1) == const0_rtx
10218               && GET_MODE (XEXP (varop, 0)) == result_mode
10219               && count == (GET_MODE_BITSIZE (result_mode) - 1)
10220               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
10221               && STORE_FLAG_VALUE == -1
10222               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
10223               && merge_outer_ops (&outer_op, &outer_const, XOR, 1, result_mode,
10224                                   &complement_p))
10225             {
10226               varop = XEXP (varop, 0);
10227               count = 0;
10228               continue;
10229             }
10230           break;
10231
10232         case NEG:
10233           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
10234              than the number of bits in the mode is equivalent to A.  */
10235           if (code == LSHIFTRT
10236               && count == (GET_MODE_BITSIZE (result_mode) - 1)
10237               && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
10238             {
10239               varop = XEXP (varop, 0);
10240               count = 0;
10241               continue;
10242             }
10243
10244           /* NEG commutes with ASHIFT since it is multiplication.  Move the
10245              NEG outside to allow shifts to combine.  */
10246           if (code == ASHIFT
10247               && merge_outer_ops (&outer_op, &outer_const, NEG, 0, result_mode,
10248                                   &complement_p))
10249             {
10250               varop = XEXP (varop, 0);
10251               continue;
10252             }
10253           break;
10254
10255         case PLUS:
10256           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
10257              is one less than the number of bits in the mode is
10258              equivalent to (xor A 1).  */
10259           if (code == LSHIFTRT
10260               && count == (GET_MODE_BITSIZE (result_mode) - 1)
10261               && XEXP (varop, 1) == constm1_rtx
10262               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
10263               && merge_outer_ops (&outer_op, &outer_const, XOR, 1, result_mode,
10264                                   &complement_p))
10265             {
10266               count = 0;
10267               varop = XEXP (varop, 0);
10268               continue;
10269             }
10270
10271           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
10272              that might be nonzero in BAR are those being shifted out and those
10273              bits are known zero in FOO, we can replace the PLUS with FOO.
10274              Similarly in the other operand order.  This code occurs when
10275              we are computing the size of a variable-size array.  */
10276
10277           if ((code == ASHIFTRT || code == LSHIFTRT)
10278               && count < HOST_BITS_PER_WIDE_INT
10279               && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
10280               && (nonzero_bits (XEXP (varop, 1), result_mode)
10281                   & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
10282             {
10283               varop = XEXP (varop, 0);
10284               continue;
10285             }
10286           else if ((code == ASHIFTRT || code == LSHIFTRT)
10287                    && count < HOST_BITS_PER_WIDE_INT
10288                    && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
10289                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
10290                             >> count)
10291                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
10292                             & nonzero_bits (XEXP (varop, 1),
10293                                                  result_mode)))
10294             {
10295               varop = XEXP (varop, 1);
10296               continue;
10297             }
10298
10299           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
10300           if (code == ASHIFT
10301               && CONST_INT_P (XEXP (varop, 1))
10302               && (new_rtx = simplify_const_binary_operation (ASHIFT, result_mode,
10303                                                          XEXP (varop, 1),
10304                                                          GEN_INT (count))) != 0
10305               && CONST_INT_P (new_rtx)
10306               && merge_outer_ops (&outer_op, &outer_const, PLUS,
10307                                   INTVAL (new_rtx), result_mode, &complement_p))
10308             {
10309               varop = XEXP (varop, 0);
10310               continue;
10311             }
10312
10313           /* Check for 'PLUS signbit', which is the canonical form of 'XOR
10314              signbit', and attempt to change the PLUS to an XOR and move it to
10315              the outer operation as is done above in the AND/IOR/XOR case
10316              leg for shift(logical). See details in logical handling above
10317              for reasoning in doing so.  */
10318           if (code == LSHIFTRT
10319               && CONST_INT_P (XEXP (varop, 1))
10320               && mode_signbit_p (result_mode, XEXP (varop, 1))
10321               && (new_rtx = simplify_const_binary_operation (code, result_mode,
10322                                                          XEXP (varop, 1),
10323                                                          GEN_INT (count))) != 0
10324               && CONST_INT_P (new_rtx)
10325               && merge_outer_ops (&outer_op, &outer_const, XOR,
10326                                   INTVAL (new_rtx), result_mode, &complement_p))
10327             {
10328               varop = XEXP (varop, 0);
10329               continue;
10330             }
10331
10332           break;
10333
10334         case MINUS:
10335           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
10336              with C the size of VAROP - 1 and the shift is logical if
10337              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
10338              we have a (gt X 0) operation.  If the shift is arithmetic with
10339              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
10340              we have a (neg (gt X 0)) operation.  */
10341
10342           if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
10343               && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
10344               && count == (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
10345               && (code == LSHIFTRT || code == ASHIFTRT)
10346               && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
10347               && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
10348               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
10349             {
10350               count = 0;
10351               varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
10352                                   const0_rtx);
10353
10354               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
10355                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
10356
10357               continue;
10358             }
10359           break;
10360
10361         case TRUNCATE:
10362           /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
10363              if the truncate does not affect the value.  */
10364           if (code == LSHIFTRT
10365               && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
10366               && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
10367               && (INTVAL (XEXP (XEXP (varop, 0), 1))
10368                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
10369                       - GET_MODE_BITSIZE (GET_MODE (varop)))))
10370             {
10371               rtx varop_inner = XEXP (varop, 0);
10372
10373               varop_inner
10374                 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
10375                                     XEXP (varop_inner, 0),
10376                                     GEN_INT
10377                                     (count + INTVAL (XEXP (varop_inner, 1))));
10378               varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
10379               count = 0;
10380               continue;
10381             }
10382           break;
10383
10384         default:
10385           break;
10386         }
10387
10388       break;
10389     }
10390
10391   shift_mode = try_widen_shift_mode (code, varop, count, result_mode, mode,
10392                                      outer_op, outer_const);
10393
10394   /* We have now finished analyzing the shift.  The result should be
10395      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
10396      OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
10397      to the result of the shift.  OUTER_CONST is the relevant constant,
10398      but we must turn off all bits turned off in the shift.  */
10399
10400   if (outer_op == UNKNOWN
10401       && orig_code == code && orig_count == count
10402       && varop == orig_varop
10403       && shift_mode == GET_MODE (varop))
10404     return NULL_RTX;
10405
10406   /* Make a SUBREG if necessary.  If we can't make it, fail.  */
10407   varop = gen_lowpart (shift_mode, varop);
10408   if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
10409     return NULL_RTX;
10410
10411   /* If we have an outer operation and we just made a shift, it is
10412      possible that we could have simplified the shift were it not
10413      for the outer operation.  So try to do the simplification
10414      recursively.  */
10415
10416   if (outer_op != UNKNOWN)
10417     x = simplify_shift_const_1 (code, shift_mode, varop, count);
10418   else
10419     x = NULL_RTX;
10420
10421   if (x == NULL_RTX)
10422     x = simplify_gen_binary (code, shift_mode, varop, GEN_INT (count));
10423
10424   /* If we were doing an LSHIFTRT in a wider mode than it was originally,
10425      turn off all the bits that the shift would have turned off.  */
10426   if (orig_code == LSHIFTRT && result_mode != shift_mode)
10427     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
10428                                 GET_MODE_MASK (result_mode) >> orig_count);
10429
10430   /* Do the remainder of the processing in RESULT_MODE.  */
10431   x = gen_lowpart_or_truncate (result_mode, x);
10432
10433   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
10434      operation.  */
10435   if (complement_p)
10436     x = simplify_gen_unary (NOT, result_mode, x, result_mode);
10437
10438   if (outer_op != UNKNOWN)
10439     {
10440       if (GET_RTX_CLASS (outer_op) != RTX_UNARY
10441           && GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
10442         outer_const = trunc_int_for_mode (outer_const, result_mode);
10443
10444       if (outer_op == AND)
10445         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
10446       else if (outer_op == SET)
10447         {
10448           /* This means that we have determined that the result is
10449              equivalent to a constant.  This should be rare.  */
10450           if (!side_effects_p (x))
10451             x = GEN_INT (outer_const);
10452         }
10453       else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
10454         x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
10455       else
10456         x = simplify_gen_binary (outer_op, result_mode, x,
10457                                  GEN_INT (outer_const));
10458     }
10459
10460   return x;
10461 }
10462
10463 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
10464    The result of the shift is RESULT_MODE.  If we cannot simplify it,
10465    return X or, if it is NULL, synthesize the expression with
10466    simplify_gen_binary.  Otherwise, return a simplified value.
10467
10468    The shift is normally computed in the widest mode we find in VAROP, as
10469    long as it isn't a different number of words than RESULT_MODE.  Exceptions
10470    are ASHIFTRT and ROTATE, which are always done in their original mode.  */
10471
10472 static rtx
10473 simplify_shift_const (rtx x, enum rtx_code code, enum machine_mode result_mode,
10474                       rtx varop, int count)
10475 {
10476   rtx tem = simplify_shift_const_1 (code, result_mode, varop, count);
10477   if (tem)
10478     return tem;
10479
10480   if (!x)
10481     x = simplify_gen_binary (code, GET_MODE (varop), varop, GEN_INT (count));
10482   if (GET_MODE (x) != result_mode)
10483     x = gen_lowpart (result_mode, x);
10484   return x;
10485 }
10486
10487 \f
10488 /* Like recog, but we receive the address of a pointer to a new pattern.
10489    We try to match the rtx that the pointer points to.
10490    If that fails, we may try to modify or replace the pattern,
10491    storing the replacement into the same pointer object.
10492
10493    Modifications include deletion or addition of CLOBBERs.
10494
10495    PNOTES is a pointer to a location where any REG_UNUSED notes added for
10496    the CLOBBERs are placed.
10497
10498    The value is the final insn code from the pattern ultimately matched,
10499    or -1.  */
10500
10501 static int
10502 recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
10503 {
10504   rtx pat = *pnewpat;
10505   int insn_code_number;
10506   int num_clobbers_to_add = 0;
10507   int i;
10508   rtx notes = 0;
10509   rtx old_notes, old_pat;
10510
10511   /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
10512      we use to indicate that something didn't match.  If we find such a
10513      thing, force rejection.  */
10514   if (GET_CODE (pat) == PARALLEL)
10515     for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
10516       if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
10517           && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
10518         return -1;
10519
10520   old_pat = PATTERN (insn);
10521   old_notes = REG_NOTES (insn);
10522   PATTERN (insn) = pat;
10523   REG_NOTES (insn) = 0;
10524
10525   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
10526   if (dump_file && (dump_flags & TDF_DETAILS))
10527     {
10528       if (insn_code_number < 0)
10529         fputs ("Failed to match this instruction:\n", dump_file);
10530       else
10531         fputs ("Successfully matched this instruction:\n", dump_file);
10532       print_rtl_single (dump_file, pat);
10533     }
10534
10535   /* If it isn't, there is the possibility that we previously had an insn
10536      that clobbered some register as a side effect, but the combined
10537      insn doesn't need to do that.  So try once more without the clobbers
10538      unless this represents an ASM insn.  */
10539
10540   if (insn_code_number < 0 && ! check_asm_operands (pat)
10541       && GET_CODE (pat) == PARALLEL)
10542     {
10543       int pos;
10544
10545       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
10546         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
10547           {
10548             if (i != pos)
10549               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
10550             pos++;
10551           }
10552
10553       SUBST_INT (XVECLEN (pat, 0), pos);
10554
10555       if (pos == 1)
10556         pat = XVECEXP (pat, 0, 0);
10557
10558       PATTERN (insn) = pat;
10559       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
10560       if (dump_file && (dump_flags & TDF_DETAILS))
10561         {
10562           if (insn_code_number < 0)
10563             fputs ("Failed to match this instruction:\n", dump_file);
10564           else
10565             fputs ("Successfully matched this instruction:\n", dump_file);
10566           print_rtl_single (dump_file, pat);
10567         }
10568     }
10569   PATTERN (insn) = old_pat;
10570   REG_NOTES (insn) = old_notes;
10571
10572   /* Recognize all noop sets, these will be killed by followup pass.  */
10573   if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
10574     insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
10575
10576   /* If we had any clobbers to add, make a new pattern than contains
10577      them.  Then check to make sure that all of them are dead.  */
10578   if (num_clobbers_to_add)
10579     {
10580       rtx newpat = gen_rtx_PARALLEL (VOIDmode,
10581                                      rtvec_alloc (GET_CODE (pat) == PARALLEL
10582                                                   ? (XVECLEN (pat, 0)
10583                                                      + num_clobbers_to_add)
10584                                                   : num_clobbers_to_add + 1));
10585
10586       if (GET_CODE (pat) == PARALLEL)
10587         for (i = 0; i < XVECLEN (pat, 0); i++)
10588           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
10589       else
10590         XVECEXP (newpat, 0, 0) = pat;
10591
10592       add_clobbers (newpat, insn_code_number);
10593
10594       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
10595            i < XVECLEN (newpat, 0); i++)
10596         {
10597           if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
10598               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
10599             return -1;
10600           if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) != SCRATCH)
10601             {
10602               gcc_assert (REG_P (XEXP (XVECEXP (newpat, 0, i), 0)));
10603               notes = alloc_reg_note (REG_UNUSED,
10604                                       XEXP (XVECEXP (newpat, 0, i), 0), notes);
10605             }
10606         }
10607       pat = newpat;
10608     }
10609
10610   *pnewpat = pat;
10611   *pnotes = notes;
10612
10613   return insn_code_number;
10614 }
10615 \f
10616 /* Like gen_lowpart_general but for use by combine.  In combine it
10617    is not possible to create any new pseudoregs.  However, it is
10618    safe to create invalid memory addresses, because combine will
10619    try to recognize them and all they will do is make the combine
10620    attempt fail.
10621
10622    If for some reason this cannot do its job, an rtx
10623    (clobber (const_int 0)) is returned.
10624    An insn containing that will not be recognized.  */
10625
10626 static rtx
10627 gen_lowpart_for_combine (enum machine_mode omode, rtx x)
10628 {
10629   enum machine_mode imode = GET_MODE (x);
10630   unsigned int osize = GET_MODE_SIZE (omode);
10631   unsigned int isize = GET_MODE_SIZE (imode);
10632   rtx result;
10633
10634   if (omode == imode)
10635     return x;
10636
10637   /* Return identity if this is a CONST or symbolic reference.  */
10638   if (omode == Pmode
10639       && (GET_CODE (x) == CONST
10640           || GET_CODE (x) == SYMBOL_REF
10641           || GET_CODE (x) == LABEL_REF))
10642     return x;
10643
10644   /* We can only support MODE being wider than a word if X is a
10645      constant integer or has a mode the same size.  */
10646   if (GET_MODE_SIZE (omode) > UNITS_PER_WORD
10647       && ! ((imode == VOIDmode
10648              && (CONST_INT_P (x)
10649                  || GET_CODE (x) == CONST_DOUBLE))
10650             || isize == osize))
10651     goto fail;
10652
10653   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
10654      won't know what to do.  So we will strip off the SUBREG here and
10655      process normally.  */
10656   if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
10657     {
10658       x = SUBREG_REG (x);
10659
10660       /* For use in case we fall down into the address adjustments
10661          further below, we need to adjust the known mode and size of
10662          x; imode and isize, since we just adjusted x.  */
10663       imode = GET_MODE (x);
10664
10665       if (imode == omode)
10666         return x;
10667
10668       isize = GET_MODE_SIZE (imode);
10669     }
10670
10671   result = gen_lowpart_common (omode, x);
10672
10673   if (result)
10674     return result;
10675
10676   if (MEM_P (x))
10677     {
10678       int offset = 0;
10679
10680       /* Refuse to work on a volatile memory ref or one with a mode-dependent
10681          address.  */
10682       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
10683         goto fail;
10684
10685       /* If we want to refer to something bigger than the original memref,
10686          generate a paradoxical subreg instead.  That will force a reload
10687          of the original memref X.  */
10688       if (isize < osize)
10689         return gen_rtx_SUBREG (omode, x, 0);
10690
10691       if (WORDS_BIG_ENDIAN)
10692         offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
10693
10694       /* Adjust the address so that the address-after-the-data is
10695          unchanged.  */
10696       if (BYTES_BIG_ENDIAN)
10697         offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
10698
10699       return adjust_address_nv (x, omode, offset);
10700     }
10701
10702   /* If X is a comparison operator, rewrite it in a new mode.  This
10703      probably won't match, but may allow further simplifications.  */
10704   else if (COMPARISON_P (x))
10705     return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
10706
10707   /* If we couldn't simplify X any other way, just enclose it in a
10708      SUBREG.  Normally, this SUBREG won't match, but some patterns may
10709      include an explicit SUBREG or we may simplify it further in combine.  */
10710   else
10711     {
10712       int offset = 0;
10713       rtx res;
10714
10715       offset = subreg_lowpart_offset (omode, imode);
10716       if (imode == VOIDmode)
10717         {
10718           imode = int_mode_for_mode (omode);
10719           x = gen_lowpart_common (imode, x);
10720           if (x == NULL)
10721             goto fail;
10722         }
10723       res = simplify_gen_subreg (omode, x, imode, offset);
10724       if (res)
10725         return res;
10726     }
10727
10728  fail:
10729   return gen_rtx_CLOBBER (omode, const0_rtx);
10730 }
10731 \f
10732 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
10733    comparison code that will be tested.
10734
10735    The result is a possibly different comparison code to use.  *POP0 and
10736    *POP1 may be updated.
10737
10738    It is possible that we might detect that a comparison is either always
10739    true or always false.  However, we do not perform general constant
10740    folding in combine, so this knowledge isn't useful.  Such tautologies
10741    should have been detected earlier.  Hence we ignore all such cases.  */
10742
10743 static enum rtx_code
10744 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
10745 {
10746   rtx op0 = *pop0;
10747   rtx op1 = *pop1;
10748   rtx tem, tem1;
10749   int i;
10750   enum machine_mode mode, tmode;
10751
10752   /* Try a few ways of applying the same transformation to both operands.  */
10753   while (1)
10754     {
10755 #ifndef WORD_REGISTER_OPERATIONS
10756       /* The test below this one won't handle SIGN_EXTENDs on these machines,
10757          so check specially.  */
10758       if (code != GTU && code != GEU && code != LTU && code != LEU
10759           && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
10760           && GET_CODE (XEXP (op0, 0)) == ASHIFT
10761           && GET_CODE (XEXP (op1, 0)) == ASHIFT
10762           && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
10763           && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
10764           && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
10765               == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
10766           && CONST_INT_P (XEXP (op0, 1))
10767           && XEXP (op0, 1) == XEXP (op1, 1)
10768           && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10769           && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
10770           && (INTVAL (XEXP (op0, 1))
10771               == (GET_MODE_BITSIZE (GET_MODE (op0))
10772                   - (GET_MODE_BITSIZE
10773                      (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
10774         {
10775           op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
10776           op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
10777         }
10778 #endif
10779
10780       /* If both operands are the same constant shift, see if we can ignore the
10781          shift.  We can if the shift is a rotate or if the bits shifted out of
10782          this shift are known to be zero for both inputs and if the type of
10783          comparison is compatible with the shift.  */
10784       if (GET_CODE (op0) == GET_CODE (op1)
10785           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10786           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
10787               || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
10788                   && (code != GT && code != LT && code != GE && code != LE))
10789               || (GET_CODE (op0) == ASHIFTRT
10790                   && (code != GTU && code != LTU
10791                       && code != GEU && code != LEU)))
10792           && CONST_INT_P (XEXP (op0, 1))
10793           && INTVAL (XEXP (op0, 1)) >= 0
10794           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10795           && XEXP (op0, 1) == XEXP (op1, 1))
10796         {
10797           enum machine_mode mode = GET_MODE (op0);
10798           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10799           int shift_count = INTVAL (XEXP (op0, 1));
10800
10801           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
10802             mask &= (mask >> shift_count) << shift_count;
10803           else if (GET_CODE (op0) == ASHIFT)
10804             mask = (mask & (mask << shift_count)) >> shift_count;
10805
10806           if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
10807               && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
10808             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
10809           else
10810             break;
10811         }
10812
10813       /* If both operands are AND's of a paradoxical SUBREG by constant, the
10814          SUBREGs are of the same mode, and, in both cases, the AND would
10815          be redundant if the comparison was done in the narrower mode,
10816          do the comparison in the narrower mode (e.g., we are AND'ing with 1
10817          and the operand's possibly nonzero bits are 0xffffff01; in that case
10818          if we only care about QImode, we don't need the AND).  This case
10819          occurs if the output mode of an scc insn is not SImode and
10820          STORE_FLAG_VALUE == 1 (e.g., the 386).
10821
10822          Similarly, check for a case where the AND's are ZERO_EXTEND
10823          operations from some narrower mode even though a SUBREG is not
10824          present.  */
10825
10826       else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
10827                && CONST_INT_P (XEXP (op0, 1))
10828                && CONST_INT_P (XEXP (op1, 1)))
10829         {
10830           rtx inner_op0 = XEXP (op0, 0);
10831           rtx inner_op1 = XEXP (op1, 0);
10832           HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
10833           HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
10834           int changed = 0;
10835
10836           if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
10837               && (GET_MODE_SIZE (GET_MODE (inner_op0))
10838                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
10839               && (GET_MODE (SUBREG_REG (inner_op0))
10840                   == GET_MODE (SUBREG_REG (inner_op1)))
10841               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
10842                   <= HOST_BITS_PER_WIDE_INT)
10843               && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
10844                                              GET_MODE (SUBREG_REG (inner_op0)))))
10845               && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
10846                                              GET_MODE (SUBREG_REG (inner_op1))))))
10847             {
10848               op0 = SUBREG_REG (inner_op0);
10849               op1 = SUBREG_REG (inner_op1);
10850
10851               /* The resulting comparison is always unsigned since we masked
10852                  off the original sign bit.  */
10853               code = unsigned_condition (code);
10854
10855               changed = 1;
10856             }
10857
10858           else if (c0 == c1)
10859             for (tmode = GET_CLASS_NARROWEST_MODE
10860                  (GET_MODE_CLASS (GET_MODE (op0)));
10861                  tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
10862               if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
10863                 {
10864                   op0 = gen_lowpart (tmode, inner_op0);
10865                   op1 = gen_lowpart (tmode, inner_op1);
10866                   code = unsigned_condition (code);
10867                   changed = 1;
10868                   break;
10869                 }
10870
10871           if (! changed)
10872             break;
10873         }
10874
10875       /* If both operands are NOT, we can strip off the outer operation
10876          and adjust the comparison code for swapped operands; similarly for
10877          NEG, except that this must be an equality comparison.  */
10878       else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
10879                || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
10880                    && (code == EQ || code == NE)))
10881         op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
10882
10883       else
10884         break;
10885     }
10886
10887   /* If the first operand is a constant, swap the operands and adjust the
10888      comparison code appropriately, but don't do this if the second operand
10889      is already a constant integer.  */
10890   if (swap_commutative_operands_p (op0, op1))
10891     {
10892       tem = op0, op0 = op1, op1 = tem;
10893       code = swap_condition (code);
10894     }
10895
10896   /* We now enter a loop during which we will try to simplify the comparison.
10897      For the most part, we only are concerned with comparisons with zero,
10898      but some things may really be comparisons with zero but not start
10899      out looking that way.  */
10900
10901   while (CONST_INT_P (op1))
10902     {
10903       enum machine_mode mode = GET_MODE (op0);
10904       unsigned int mode_width = GET_MODE_BITSIZE (mode);
10905       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10906       int equality_comparison_p;
10907       int sign_bit_comparison_p;
10908       int unsigned_comparison_p;
10909       HOST_WIDE_INT const_op;
10910
10911       /* We only want to handle integral modes.  This catches VOIDmode,
10912          CCmode, and the floating-point modes.  An exception is that we
10913          can handle VOIDmode if OP0 is a COMPARE or a comparison
10914          operation.  */
10915
10916       if (GET_MODE_CLASS (mode) != MODE_INT
10917           && ! (mode == VOIDmode
10918                 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
10919         break;
10920
10921       /* Get the constant we are comparing against and turn off all bits
10922          not on in our mode.  */
10923       const_op = INTVAL (op1);
10924       if (mode != VOIDmode)
10925         const_op = trunc_int_for_mode (const_op, mode);
10926       op1 = GEN_INT (const_op);
10927
10928       /* If we are comparing against a constant power of two and the value
10929          being compared can only have that single bit nonzero (e.g., it was
10930          `and'ed with that bit), we can replace this with a comparison
10931          with zero.  */
10932       if (const_op
10933           && (code == EQ || code == NE || code == GE || code == GEU
10934               || code == LT || code == LTU)
10935           && mode_width <= HOST_BITS_PER_WIDE_INT
10936           && exact_log2 (const_op) >= 0
10937           && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
10938         {
10939           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
10940           op1 = const0_rtx, const_op = 0;
10941         }
10942
10943       /* Similarly, if we are comparing a value known to be either -1 or
10944          0 with -1, change it to the opposite comparison against zero.  */
10945
10946       if (const_op == -1
10947           && (code == EQ || code == NE || code == GT || code == LE
10948               || code == GEU || code == LTU)
10949           && num_sign_bit_copies (op0, mode) == mode_width)
10950         {
10951           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
10952           op1 = const0_rtx, const_op = 0;
10953         }
10954
10955       /* Do some canonicalizations based on the comparison code.  We prefer
10956          comparisons against zero and then prefer equality comparisons.
10957          If we can reduce the size of a constant, we will do that too.  */
10958
10959       switch (code)
10960         {
10961         case LT:
10962           /* < C is equivalent to <= (C - 1) */
10963           if (const_op > 0)
10964             {
10965               const_op -= 1;
10966               op1 = GEN_INT (const_op);
10967               code = LE;
10968               /* ... fall through to LE case below.  */
10969             }
10970           else
10971             break;
10972
10973         case LE:
10974           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
10975           if (const_op < 0)
10976             {
10977               const_op += 1;
10978               op1 = GEN_INT (const_op);
10979               code = LT;
10980             }
10981
10982           /* If we are doing a <= 0 comparison on a value known to have
10983              a zero sign bit, we can replace this with == 0.  */
10984           else if (const_op == 0
10985                    && mode_width <= HOST_BITS_PER_WIDE_INT
10986                    && (nonzero_bits (op0, mode)
10987                        & ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10988                          == 0)
10989             code = EQ;
10990           break;
10991
10992         case GE:
10993           /* >= C is equivalent to > (C - 1).  */
10994           if (const_op > 0)
10995             {
10996               const_op -= 1;
10997               op1 = GEN_INT (const_op);
10998               code = GT;
10999               /* ... fall through to GT below.  */
11000             }
11001           else
11002             break;
11003
11004         case GT:
11005           /* > C is equivalent to >= (C + 1); we do this for C < 0.  */
11006           if (const_op < 0)
11007             {
11008               const_op += 1;
11009               op1 = GEN_INT (const_op);
11010               code = GE;
11011             }
11012
11013           /* If we are doing a > 0 comparison on a value known to have
11014              a zero sign bit, we can replace this with != 0.  */
11015           else if (const_op == 0
11016                    && mode_width <= HOST_BITS_PER_WIDE_INT
11017                    && (nonzero_bits (op0, mode)
11018                        & ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
11019                        == 0)
11020             code = NE;
11021           break;
11022
11023         case LTU:
11024           /* < C is equivalent to <= (C - 1).  */
11025           if (const_op > 0)
11026             {
11027               const_op -= 1;
11028               op1 = GEN_INT (const_op);
11029               code = LEU;
11030               /* ... fall through ...  */
11031             }
11032
11033           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
11034           else if (mode_width <= HOST_BITS_PER_WIDE_INT
11035                    && (unsigned HOST_WIDE_INT) const_op
11036                       == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1))
11037             {
11038               const_op = 0, op1 = const0_rtx;
11039               code = GE;
11040               break;
11041             }
11042           else
11043             break;
11044
11045         case LEU:
11046           /* unsigned <= 0 is equivalent to == 0 */
11047           if (const_op == 0)
11048             code = EQ;
11049
11050           /* (unsigned) <= 0x7fffffff is equivalent to >= 0.  */
11051           else if (mode_width <= HOST_BITS_PER_WIDE_INT
11052                    && (unsigned HOST_WIDE_INT) const_op
11053                       == ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)) - 1)
11054             {
11055               const_op = 0, op1 = const0_rtx;
11056               code = GE;
11057             }
11058           break;
11059
11060         case GEU:
11061           /* >= C is equivalent to > (C - 1).  */
11062           if (const_op > 1)
11063             {
11064               const_op -= 1;
11065               op1 = GEN_INT (const_op);
11066               code = GTU;
11067               /* ... fall through ...  */
11068             }
11069
11070           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
11071           else if (mode_width <= HOST_BITS_PER_WIDE_INT
11072                    && (unsigned HOST_WIDE_INT) const_op
11073                       == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1))
11074             {
11075               const_op = 0, op1 = const0_rtx;
11076               code = LT;
11077               break;
11078             }
11079           else
11080             break;
11081
11082         case GTU:
11083           /* unsigned > 0 is equivalent to != 0 */
11084           if (const_op == 0)
11085             code = NE;
11086
11087           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
11088           else if (mode_width <= HOST_BITS_PER_WIDE_INT
11089                    && (unsigned HOST_WIDE_INT) const_op
11090                       == ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)) - 1)
11091             {
11092               const_op = 0, op1 = const0_rtx;
11093               code = LT;
11094             }
11095           break;
11096
11097         default:
11098           break;
11099         }
11100
11101       /* Compute some predicates to simplify code below.  */
11102
11103       equality_comparison_p = (code == EQ || code == NE);
11104       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
11105       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
11106                                || code == GEU);
11107
11108       /* If this is a sign bit comparison and we can do arithmetic in
11109          MODE, say that we will only be needing the sign bit of OP0.  */
11110       if (sign_bit_comparison_p
11111           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11112         op0 = force_to_mode (op0, mode,
11113                              (unsigned HOST_WIDE_INT) 1
11114                              << (GET_MODE_BITSIZE (mode) - 1),
11115                              0);
11116
11117       /* Now try cases based on the opcode of OP0.  If none of the cases
11118          does a "continue", we exit this loop immediately after the
11119          switch.  */
11120
11121       switch (GET_CODE (op0))
11122         {
11123         case ZERO_EXTRACT:
11124           /* If we are extracting a single bit from a variable position in
11125              a constant that has only a single bit set and are comparing it
11126              with zero, we can convert this into an equality comparison
11127              between the position and the location of the single bit.  */
11128           /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
11129              have already reduced the shift count modulo the word size.  */
11130           if (!SHIFT_COUNT_TRUNCATED
11131               && CONST_INT_P (XEXP (op0, 0))
11132               && XEXP (op0, 1) == const1_rtx
11133               && equality_comparison_p && const_op == 0
11134               && (i = exact_log2 (UINTVAL (XEXP (op0, 0)))) >= 0)
11135             {
11136               if (BITS_BIG_ENDIAN)
11137                 {
11138                   enum machine_mode new_mode
11139                     = mode_for_extraction (EP_extzv, 1);
11140                   if (new_mode == MAX_MACHINE_MODE)
11141                     i = BITS_PER_WORD - 1 - i;
11142                   else
11143                     {
11144                       mode = new_mode;
11145                       i = (GET_MODE_BITSIZE (mode) - 1 - i);
11146                     }
11147                 }
11148
11149               op0 = XEXP (op0, 2);
11150               op1 = GEN_INT (i);
11151               const_op = i;
11152
11153               /* Result is nonzero iff shift count is equal to I.  */
11154               code = reverse_condition (code);
11155               continue;
11156             }
11157
11158           /* ... fall through ...  */
11159
11160         case SIGN_EXTRACT:
11161           tem = expand_compound_operation (op0);
11162           if (tem != op0)
11163             {
11164               op0 = tem;
11165               continue;
11166             }
11167           break;
11168
11169         case NOT:
11170           /* If testing for equality, we can take the NOT of the constant.  */
11171           if (equality_comparison_p
11172               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
11173             {
11174               op0 = XEXP (op0, 0);
11175               op1 = tem;
11176               continue;
11177             }
11178
11179           /* If just looking at the sign bit, reverse the sense of the
11180              comparison.  */
11181           if (sign_bit_comparison_p)
11182             {
11183               op0 = XEXP (op0, 0);
11184               code = (code == GE ? LT : GE);
11185               continue;
11186             }
11187           break;
11188
11189         case NEG:
11190           /* If testing for equality, we can take the NEG of the constant.  */
11191           if (equality_comparison_p
11192               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
11193             {
11194               op0 = XEXP (op0, 0);
11195               op1 = tem;
11196               continue;
11197             }
11198
11199           /* The remaining cases only apply to comparisons with zero.  */
11200           if (const_op != 0)
11201             break;
11202
11203           /* When X is ABS or is known positive,
11204              (neg X) is < 0 if and only if X != 0.  */
11205
11206           if (sign_bit_comparison_p
11207               && (GET_CODE (XEXP (op0, 0)) == ABS
11208                   || (mode_width <= HOST_BITS_PER_WIDE_INT
11209                       && (nonzero_bits (XEXP (op0, 0), mode)
11210                           & ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
11211                          == 0)))
11212             {
11213               op0 = XEXP (op0, 0);
11214               code = (code == LT ? NE : EQ);
11215               continue;
11216             }
11217
11218           /* If we have NEG of something whose two high-order bits are the
11219              same, we know that "(-a) < 0" is equivalent to "a > 0".  */
11220           if (num_sign_bit_copies (op0, mode) >= 2)
11221             {
11222               op0 = XEXP (op0, 0);
11223               code = swap_condition (code);
11224               continue;
11225             }
11226           break;
11227
11228         case ROTATE:
11229           /* If we are testing equality and our count is a constant, we
11230              can perform the inverse operation on our RHS.  */
11231           if (equality_comparison_p && CONST_INT_P (XEXP (op0, 1))
11232               && (tem = simplify_binary_operation (ROTATERT, mode,
11233                                                    op1, XEXP (op0, 1))) != 0)
11234             {
11235               op0 = XEXP (op0, 0);
11236               op1 = tem;
11237               continue;
11238             }
11239
11240           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
11241              a particular bit.  Convert it to an AND of a constant of that
11242              bit.  This will be converted into a ZERO_EXTRACT.  */
11243           if (const_op == 0 && sign_bit_comparison_p
11244               && CONST_INT_P (XEXP (op0, 1))
11245               && mode_width <= HOST_BITS_PER_WIDE_INT)
11246             {
11247               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11248                                             ((unsigned HOST_WIDE_INT) 1
11249                                              << (mode_width - 1
11250                                                  - INTVAL (XEXP (op0, 1)))));
11251               code = (code == LT ? NE : EQ);
11252               continue;
11253             }
11254
11255           /* Fall through.  */
11256
11257         case ABS:
11258           /* ABS is ignorable inside an equality comparison with zero.  */
11259           if (const_op == 0 && equality_comparison_p)
11260             {
11261               op0 = XEXP (op0, 0);
11262               continue;
11263             }
11264           break;
11265
11266         case SIGN_EXTEND:
11267           /* Can simplify (compare (zero/sign_extend FOO) CONST) to
11268              (compare FOO CONST) if CONST fits in FOO's mode and we
11269              are either testing inequality or have an unsigned
11270              comparison with ZERO_EXTEND or a signed comparison with
11271              SIGN_EXTEND.  But don't do it if we don't have a compare
11272              insn of the given mode, since we'd have to revert it
11273              later on, and then we wouldn't know whether to sign- or
11274              zero-extend.  */
11275           mode = GET_MODE (XEXP (op0, 0));
11276           if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11277               && ! unsigned_comparison_p
11278               && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11279               && ((unsigned HOST_WIDE_INT) const_op
11280                   < (((unsigned HOST_WIDE_INT) 1
11281                       << (GET_MODE_BITSIZE (mode) - 1))))
11282               && have_insn_for (COMPARE, mode))
11283             {
11284               op0 = XEXP (op0, 0);
11285               continue;
11286             }
11287           break;
11288
11289         case SUBREG:
11290           /* Check for the case where we are comparing A - C1 with C2, that is
11291
11292                (subreg:MODE (plus (A) (-C1))) op (C2)
11293
11294              with C1 a constant, and try to lift the SUBREG, i.e. to do the
11295              comparison in the wider mode.  One of the following two conditions
11296              must be true in order for this to be valid:
11297
11298                1. The mode extension results in the same bit pattern being added
11299                   on both sides and the comparison is equality or unsigned.  As
11300                   C2 has been truncated to fit in MODE, the pattern can only be
11301                   all 0s or all 1s.
11302
11303                2. The mode extension results in the sign bit being copied on
11304                   each side.
11305
11306              The difficulty here is that we have predicates for A but not for
11307              (A - C1) so we need to check that C1 is within proper bounds so
11308              as to perturbate A as little as possible.  */
11309
11310           if (mode_width <= HOST_BITS_PER_WIDE_INT
11311               && subreg_lowpart_p (op0)
11312               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) > mode_width
11313               && GET_CODE (SUBREG_REG (op0)) == PLUS
11314               && CONST_INT_P (XEXP (SUBREG_REG (op0), 1)))
11315             {
11316               enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
11317               rtx a = XEXP (SUBREG_REG (op0), 0);
11318               HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
11319
11320               if ((c1 > 0
11321                    && (unsigned HOST_WIDE_INT) c1
11322                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)
11323                    && (equality_comparison_p || unsigned_comparison_p)
11324                    /* (A - C1) zero-extends if it is positive and sign-extends
11325                       if it is negative, C2 both zero- and sign-extends.  */
11326                    && ((0 == (nonzero_bits (a, inner_mode)
11327                               & ~GET_MODE_MASK (mode))
11328                         && const_op >= 0)
11329                        /* (A - C1) sign-extends if it is positive and 1-extends
11330                           if it is negative, C2 both sign- and 1-extends.  */
11331                        || (num_sign_bit_copies (a, inner_mode)
11332                            > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
11333                                              - mode_width)
11334                            && const_op < 0)))
11335                   || ((unsigned HOST_WIDE_INT) c1
11336                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 2)
11337                       /* (A - C1) always sign-extends, like C2.  */
11338                       && num_sign_bit_copies (a, inner_mode)
11339                          > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
11340                                            - (mode_width - 1))))
11341                 {
11342                   op0 = SUBREG_REG (op0);
11343                   continue;
11344                 }
11345             }
11346
11347           /* If the inner mode is narrower and we are extracting the low part,
11348              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
11349           if (subreg_lowpart_p (op0)
11350               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
11351             /* Fall through */ ;
11352           else
11353             break;
11354
11355           /* ... fall through ...  */
11356
11357         case ZERO_EXTEND:
11358           mode = GET_MODE (XEXP (op0, 0));
11359           if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11360               && (unsigned_comparison_p || equality_comparison_p)
11361               && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11362               && ((unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode))
11363               && have_insn_for (COMPARE, mode))
11364             {
11365               op0 = XEXP (op0, 0);
11366               continue;
11367             }
11368           break;
11369
11370         case PLUS:
11371           /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
11372              this for equality comparisons due to pathological cases involving
11373              overflows.  */
11374           if (equality_comparison_p
11375               && 0 != (tem = simplify_binary_operation (MINUS, mode,
11376                                                         op1, XEXP (op0, 1))))
11377             {
11378               op0 = XEXP (op0, 0);
11379               op1 = tem;
11380               continue;
11381             }
11382
11383           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
11384           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
11385               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
11386             {
11387               op0 = XEXP (XEXP (op0, 0), 0);
11388               code = (code == LT ? EQ : NE);
11389               continue;
11390             }
11391           break;
11392
11393         case MINUS:
11394           /* We used to optimize signed comparisons against zero, but that
11395              was incorrect.  Unsigned comparisons against zero (GTU, LEU)
11396              arrive here as equality comparisons, or (GEU, LTU) are
11397              optimized away.  No need to special-case them.  */
11398
11399           /* (eq (minus A B) C) -> (eq A (plus B C)) or
11400              (eq B (minus A C)), whichever simplifies.  We can only do
11401              this for equality comparisons due to pathological cases involving
11402              overflows.  */
11403           if (equality_comparison_p
11404               && 0 != (tem = simplify_binary_operation (PLUS, mode,
11405                                                         XEXP (op0, 1), op1)))
11406             {
11407               op0 = XEXP (op0, 0);
11408               op1 = tem;
11409               continue;
11410             }
11411
11412           if (equality_comparison_p
11413               && 0 != (tem = simplify_binary_operation (MINUS, mode,
11414                                                         XEXP (op0, 0), op1)))
11415             {
11416               op0 = XEXP (op0, 1);
11417               op1 = tem;
11418               continue;
11419             }
11420
11421           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
11422              of bits in X minus 1, is one iff X > 0.  */
11423           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
11424               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11425               && UINTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
11426               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
11427             {
11428               op0 = XEXP (op0, 1);
11429               code = (code == GE ? LE : GT);
11430               continue;
11431             }
11432           break;
11433
11434         case XOR:
11435           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
11436              if C is zero or B is a constant.  */
11437           if (equality_comparison_p
11438               && 0 != (tem = simplify_binary_operation (XOR, mode,
11439                                                         XEXP (op0, 1), op1)))
11440             {
11441               op0 = XEXP (op0, 0);
11442               op1 = tem;
11443               continue;
11444             }
11445           break;
11446
11447         case EQ:  case NE:
11448         case UNEQ:  case LTGT:
11449         case LT:  case LTU:  case UNLT:  case LE:  case LEU:  case UNLE:
11450         case GT:  case GTU:  case UNGT:  case GE:  case GEU:  case UNGE:
11451         case UNORDERED: case ORDERED:
11452           /* We can't do anything if OP0 is a condition code value, rather
11453              than an actual data value.  */
11454           if (const_op != 0
11455               || CC0_P (XEXP (op0, 0))
11456               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
11457             break;
11458
11459           /* Get the two operands being compared.  */
11460           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
11461             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
11462           else
11463             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
11464
11465           /* Check for the cases where we simply want the result of the
11466              earlier test or the opposite of that result.  */
11467           if (code == NE || code == EQ
11468               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
11469                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11470                   && (STORE_FLAG_VALUE
11471                       & (((unsigned HOST_WIDE_INT) 1
11472                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
11473                   && (code == LT || code == GE)))
11474             {
11475               enum rtx_code new_code;
11476               if (code == LT || code == NE)
11477                 new_code = GET_CODE (op0);
11478               else
11479                 new_code = reversed_comparison_code (op0, NULL);
11480
11481               if (new_code != UNKNOWN)
11482                 {
11483                   code = new_code;
11484                   op0 = tem;
11485                   op1 = tem1;
11486                   continue;
11487                 }
11488             }
11489           break;
11490
11491         case IOR:
11492           /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
11493              iff X <= 0.  */
11494           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
11495               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
11496               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
11497             {
11498               op0 = XEXP (op0, 1);
11499               code = (code == GE ? GT : LE);
11500               continue;
11501             }
11502           break;
11503
11504         case AND:
11505           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
11506              will be converted to a ZERO_EXTRACT later.  */
11507           if (const_op == 0 && equality_comparison_p
11508               && GET_CODE (XEXP (op0, 0)) == ASHIFT
11509               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
11510             {
11511               op0 = gen_rtx_LSHIFTRT (mode, XEXP (op0, 1),
11512                                       XEXP (XEXP (op0, 0), 1));
11513               op0 = simplify_and_const_int (NULL_RTX, mode, op0, 1);
11514               continue;
11515             }
11516
11517           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
11518              zero and X is a comparison and C1 and C2 describe only bits set
11519              in STORE_FLAG_VALUE, we can compare with X.  */
11520           if (const_op == 0 && equality_comparison_p
11521               && mode_width <= HOST_BITS_PER_WIDE_INT
11522               && CONST_INT_P (XEXP (op0, 1))
11523               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
11524               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11525               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
11526               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
11527             {
11528               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
11529                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
11530               if ((~STORE_FLAG_VALUE & mask) == 0
11531                   && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
11532                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
11533                           && COMPARISON_P (tem))))
11534                 {
11535                   op0 = XEXP (XEXP (op0, 0), 0);
11536                   continue;
11537                 }
11538             }
11539
11540           /* If we are doing an equality comparison of an AND of a bit equal
11541              to the sign bit, replace this with a LT or GE comparison of
11542              the underlying value.  */
11543           if (equality_comparison_p
11544               && const_op == 0
11545               && CONST_INT_P (XEXP (op0, 1))
11546               && mode_width <= HOST_BITS_PER_WIDE_INT
11547               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
11548                   == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
11549             {
11550               op0 = XEXP (op0, 0);
11551               code = (code == EQ ? GE : LT);
11552               continue;
11553             }
11554
11555           /* If this AND operation is really a ZERO_EXTEND from a narrower
11556              mode, the constant fits within that mode, and this is either an
11557              equality or unsigned comparison, try to do this comparison in
11558              the narrower mode.
11559
11560              Note that in:
11561
11562              (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
11563              -> (ne:DI (reg:SI 4) (const_int 0))
11564
11565              unless TRULY_NOOP_TRUNCATION allows it or the register is
11566              known to hold a value of the required mode the
11567              transformation is invalid.  */
11568           if ((equality_comparison_p || unsigned_comparison_p)
11569               && CONST_INT_P (XEXP (op0, 1))
11570               && (i = exact_log2 ((UINTVAL (XEXP (op0, 1))
11571                                    & GET_MODE_MASK (mode))
11572                                   + 1)) >= 0
11573               && const_op >> i == 0
11574               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode
11575               && (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode),
11576                                          GET_MODE_BITSIZE (GET_MODE (op0)))
11577                   || (REG_P (XEXP (op0, 0))
11578                       && reg_truncated_to_mode (tmode, XEXP (op0, 0)))))
11579             {
11580               op0 = gen_lowpart (tmode, XEXP (op0, 0));
11581               continue;
11582             }
11583
11584           /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1
11585              fits in both M1 and M2 and the SUBREG is either paradoxical
11586              or represents the low part, permute the SUBREG and the AND
11587              and try again.  */
11588           if (GET_CODE (XEXP (op0, 0)) == SUBREG)
11589             {
11590               unsigned HOST_WIDE_INT c1;
11591               tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0)));
11592               /* Require an integral mode, to avoid creating something like
11593                  (AND:SF ...).  */
11594               if (SCALAR_INT_MODE_P (tmode)
11595                   /* It is unsafe to commute the AND into the SUBREG if the
11596                      SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
11597                      not defined.  As originally written the upper bits
11598                      have a defined value due to the AND operation.
11599                      However, if we commute the AND inside the SUBREG then
11600                      they no longer have defined values and the meaning of
11601                      the code has been changed.  */
11602                   && (0
11603 #ifdef WORD_REGISTER_OPERATIONS
11604                       || (mode_width > GET_MODE_BITSIZE (tmode)
11605                           && mode_width <= BITS_PER_WORD)
11606 #endif
11607                       || (mode_width <= GET_MODE_BITSIZE (tmode)
11608                           && subreg_lowpart_p (XEXP (op0, 0))))
11609                   && CONST_INT_P (XEXP (op0, 1))
11610                   && mode_width <= HOST_BITS_PER_WIDE_INT
11611                   && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
11612                   && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0
11613                   && (c1 & ~GET_MODE_MASK (tmode)) == 0
11614                   && c1 != mask
11615                   && c1 != GET_MODE_MASK (tmode))
11616                 {
11617                   op0 = simplify_gen_binary (AND, tmode,
11618                                              SUBREG_REG (XEXP (op0, 0)),
11619                                              gen_int_mode (c1, tmode));
11620                   op0 = gen_lowpart (mode, op0);
11621                   continue;
11622                 }
11623             }
11624
11625           /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0).  */
11626           if (const_op == 0 && equality_comparison_p
11627               && XEXP (op0, 1) == const1_rtx
11628               && GET_CODE (XEXP (op0, 0)) == NOT)
11629             {
11630               op0 = simplify_and_const_int (NULL_RTX, mode,
11631                                             XEXP (XEXP (op0, 0), 0), 1);
11632               code = (code == NE ? EQ : NE);
11633               continue;
11634             }
11635
11636           /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
11637              (eq (and (lshiftrt X) 1) 0).
11638              Also handle the case where (not X) is expressed using xor.  */
11639           if (const_op == 0 && equality_comparison_p
11640               && XEXP (op0, 1) == const1_rtx
11641               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
11642             {
11643               rtx shift_op = XEXP (XEXP (op0, 0), 0);
11644               rtx shift_count = XEXP (XEXP (op0, 0), 1);
11645
11646               if (GET_CODE (shift_op) == NOT
11647                   || (GET_CODE (shift_op) == XOR
11648                       && CONST_INT_P (XEXP (shift_op, 1))
11649                       && CONST_INT_P (shift_count)
11650                       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
11651                       && (UINTVAL (XEXP (shift_op, 1))
11652                           == (unsigned HOST_WIDE_INT) 1
11653                                << INTVAL (shift_count))))
11654                 {
11655                   op0
11656                     = gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count);
11657                   op0 = simplify_and_const_int (NULL_RTX, mode, op0, 1);
11658                   code = (code == NE ? EQ : NE);
11659                   continue;
11660                 }
11661             }
11662           break;
11663
11664         case ASHIFT:
11665           /* If we have (compare (ashift FOO N) (const_int C)) and
11666              the high order N bits of FOO (N+1 if an inequality comparison)
11667              are known to be zero, we can do this by comparing FOO with C
11668              shifted right N bits so long as the low-order N bits of C are
11669              zero.  */
11670           if (CONST_INT_P (XEXP (op0, 1))
11671               && INTVAL (XEXP (op0, 1)) >= 0
11672               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
11673                   < HOST_BITS_PER_WIDE_INT)
11674               && (((unsigned HOST_WIDE_INT) const_op
11675                    & (((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1)))
11676                       - 1)) == 0)
11677               && mode_width <= HOST_BITS_PER_WIDE_INT
11678               && (nonzero_bits (XEXP (op0, 0), mode)
11679                   & ~(mask >> (INTVAL (XEXP (op0, 1))
11680                                + ! equality_comparison_p))) == 0)
11681             {
11682               /* We must perform a logical shift, not an arithmetic one,
11683                  as we want the top N bits of C to be zero.  */
11684               unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
11685
11686               temp >>= INTVAL (XEXP (op0, 1));
11687               op1 = gen_int_mode (temp, mode);
11688               op0 = XEXP (op0, 0);
11689               continue;
11690             }
11691
11692           /* If we are doing a sign bit comparison, it means we are testing
11693              a particular bit.  Convert it to the appropriate AND.  */
11694           if (sign_bit_comparison_p && CONST_INT_P (XEXP (op0, 1))
11695               && mode_width <= HOST_BITS_PER_WIDE_INT)
11696             {
11697               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11698                                             ((unsigned HOST_WIDE_INT) 1
11699                                              << (mode_width - 1
11700                                                  - INTVAL (XEXP (op0, 1)))));
11701               code = (code == LT ? NE : EQ);
11702               continue;
11703             }
11704
11705           /* If this an equality comparison with zero and we are shifting
11706              the low bit to the sign bit, we can convert this to an AND of the
11707              low-order bit.  */
11708           if (const_op == 0 && equality_comparison_p
11709               && CONST_INT_P (XEXP (op0, 1))
11710               && UINTVAL (XEXP (op0, 1)) == mode_width - 1)
11711             {
11712               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), 1);
11713               continue;
11714             }
11715           break;
11716
11717         case ASHIFTRT:
11718           /* If this is an equality comparison with zero, we can do this
11719              as a logical shift, which might be much simpler.  */
11720           if (equality_comparison_p && const_op == 0
11721               && CONST_INT_P (XEXP (op0, 1)))
11722             {
11723               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
11724                                           XEXP (op0, 0),
11725                                           INTVAL (XEXP (op0, 1)));
11726               continue;
11727             }
11728
11729           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
11730              do the comparison in a narrower mode.  */
11731           if (! unsigned_comparison_p
11732               && CONST_INT_P (XEXP (op0, 1))
11733               && GET_CODE (XEXP (op0, 0)) == ASHIFT
11734               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
11735               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11736                                          MODE_INT, 1)) != BLKmode
11737               && (((unsigned HOST_WIDE_INT) const_op
11738                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11739                   <= GET_MODE_MASK (tmode)))
11740             {
11741               op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
11742               continue;
11743             }
11744
11745           /* Likewise if OP0 is a PLUS of a sign extension with a
11746              constant, which is usually represented with the PLUS
11747              between the shifts.  */
11748           if (! unsigned_comparison_p
11749               && CONST_INT_P (XEXP (op0, 1))
11750               && GET_CODE (XEXP (op0, 0)) == PLUS
11751               && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11752               && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
11753               && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
11754               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11755                                          MODE_INT, 1)) != BLKmode
11756               && (((unsigned HOST_WIDE_INT) const_op
11757                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11758                   <= GET_MODE_MASK (tmode)))
11759             {
11760               rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
11761               rtx add_const = XEXP (XEXP (op0, 0), 1);
11762               rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
11763                                                    add_const, XEXP (op0, 1));
11764
11765               op0 = simplify_gen_binary (PLUS, tmode,
11766                                          gen_lowpart (tmode, inner),
11767                                          new_const);
11768               continue;
11769             }
11770
11771           /* ... fall through ...  */
11772         case LSHIFTRT:
11773           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
11774              the low order N bits of FOO are known to be zero, we can do this
11775              by comparing FOO with C shifted left N bits so long as no
11776              overflow occurs.  Even if the low order N bits of FOO aren't known
11777              to be zero, if the comparison is >= or < we can use the same
11778              optimization and for > or <= by setting all the low
11779              order N bits in the comparison constant.  */
11780           if (CONST_INT_P (XEXP (op0, 1))
11781               && INTVAL (XEXP (op0, 1)) > 0
11782               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
11783               && mode_width <= HOST_BITS_PER_WIDE_INT
11784               && (((unsigned HOST_WIDE_INT) const_op
11785                    + (GET_CODE (op0) != LSHIFTRT
11786                       ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
11787                          + 1)
11788                       : 0))
11789                   <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
11790             {
11791               unsigned HOST_WIDE_INT low_bits
11792                 = (nonzero_bits (XEXP (op0, 0), mode)
11793                    & (((unsigned HOST_WIDE_INT) 1
11794                        << INTVAL (XEXP (op0, 1))) - 1));
11795               if (low_bits == 0 || !equality_comparison_p)
11796                 {
11797                   /* If the shift was logical, then we must make the condition
11798                      unsigned.  */
11799                   if (GET_CODE (op0) == LSHIFTRT)
11800                     code = unsigned_condition (code);
11801
11802                   const_op <<= INTVAL (XEXP (op0, 1));
11803                   if (low_bits != 0
11804                       && (code == GT || code == GTU
11805                           || code == LE || code == LEU))
11806                     const_op
11807                       |= (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1);
11808                   op1 = GEN_INT (const_op);
11809                   op0 = XEXP (op0, 0);
11810                   continue;
11811                 }
11812             }
11813
11814           /* If we are using this shift to extract just the sign bit, we
11815              can replace this with an LT or GE comparison.  */
11816           if (const_op == 0
11817               && (equality_comparison_p || sign_bit_comparison_p)
11818               && CONST_INT_P (XEXP (op0, 1))
11819               && UINTVAL (XEXP (op0, 1)) == mode_width - 1)
11820             {
11821               op0 = XEXP (op0, 0);
11822               code = (code == NE || code == GT ? LT : GE);
11823               continue;
11824             }
11825           break;
11826
11827         default:
11828           break;
11829         }
11830
11831       break;
11832     }
11833
11834   /* Now make any compound operations involved in this comparison.  Then,
11835      check for an outmost SUBREG on OP0 that is not doing anything or is
11836      paradoxical.  The latter transformation must only be performed when
11837      it is known that the "extra" bits will be the same in op0 and op1 or
11838      that they don't matter.  There are three cases to consider:
11839
11840      1. SUBREG_REG (op0) is a register.  In this case the bits are don't
11841      care bits and we can assume they have any convenient value.  So
11842      making the transformation is safe.
11843
11844      2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
11845      In this case the upper bits of op0 are undefined.  We should not make
11846      the simplification in that case as we do not know the contents of
11847      those bits.
11848
11849      3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
11850      UNKNOWN.  In that case we know those bits are zeros or ones.  We must
11851      also be sure that they are the same as the upper bits of op1.
11852
11853      We can never remove a SUBREG for a non-equality comparison because
11854      the sign bit is in a different place in the underlying object.  */
11855
11856   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
11857   op1 = make_compound_operation (op1, SET);
11858
11859   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
11860       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11861       && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
11862       && (code == NE || code == EQ))
11863     {
11864       if (GET_MODE_SIZE (GET_MODE (op0))
11865           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
11866         {
11867           /* For paradoxical subregs, allow case 1 as above.  Case 3 isn't
11868              implemented.  */
11869           if (REG_P (SUBREG_REG (op0)))
11870             {
11871               op0 = SUBREG_REG (op0);
11872               op1 = gen_lowpart (GET_MODE (op0), op1);
11873             }
11874         }
11875       else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
11876                 <= HOST_BITS_PER_WIDE_INT)
11877                && (nonzero_bits (SUBREG_REG (op0),
11878                                  GET_MODE (SUBREG_REG (op0)))
11879                    & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11880         {
11881           tem = gen_lowpart (GET_MODE (SUBREG_REG (op0)), op1);
11882
11883           if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
11884                & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11885             op0 = SUBREG_REG (op0), op1 = tem;
11886         }
11887     }
11888
11889   /* We now do the opposite procedure: Some machines don't have compare
11890      insns in all modes.  If OP0's mode is an integer mode smaller than a
11891      word and we can't do a compare in that mode, see if there is a larger
11892      mode for which we can do the compare.  There are a number of cases in
11893      which we can use the wider mode.  */
11894
11895   mode = GET_MODE (op0);
11896   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11897       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
11898       && ! have_insn_for (COMPARE, mode))
11899     for (tmode = GET_MODE_WIDER_MODE (mode);
11900          (tmode != VOIDmode
11901           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
11902          tmode = GET_MODE_WIDER_MODE (tmode))
11903       if (have_insn_for (COMPARE, tmode))
11904         {
11905           int zero_extended;
11906
11907           /* If this is a test for negative, we can make an explicit
11908              test of the sign bit.  Test this first so we can use
11909              a paradoxical subreg to extend OP0.  */
11910
11911           if (op1 == const0_rtx && (code == LT || code == GE)
11912               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11913             {
11914               op0 = simplify_gen_binary (AND, tmode,
11915                                          gen_lowpart (tmode, op0),
11916                                          GEN_INT ((unsigned HOST_WIDE_INT) 1
11917                                                   << (GET_MODE_BITSIZE (mode)
11918                                                       - 1)));
11919               code = (code == LT) ? NE : EQ;
11920               break;
11921             }
11922
11923           /* If the only nonzero bits in OP0 and OP1 are those in the
11924              narrower mode and this is an equality or unsigned comparison,
11925              we can use the wider mode.  Similarly for sign-extended
11926              values, in which case it is true for all comparisons.  */
11927           zero_extended = ((code == EQ || code == NE
11928                             || code == GEU || code == GTU
11929                             || code == LEU || code == LTU)
11930                            && (nonzero_bits (op0, tmode)
11931                                & ~GET_MODE_MASK (mode)) == 0
11932                            && ((CONST_INT_P (op1)
11933                                 || (nonzero_bits (op1, tmode)
11934                                     & ~GET_MODE_MASK (mode)) == 0)));
11935
11936           if (zero_extended
11937               || ((num_sign_bit_copies (op0, tmode)
11938                    > (unsigned int) (GET_MODE_BITSIZE (tmode)
11939                                      - GET_MODE_BITSIZE (mode)))
11940                   && (num_sign_bit_copies (op1, tmode)
11941                       > (unsigned int) (GET_MODE_BITSIZE (tmode)
11942                                         - GET_MODE_BITSIZE (mode)))))
11943             {
11944               /* If OP0 is an AND and we don't have an AND in MODE either,
11945                  make a new AND in the proper mode.  */
11946               if (GET_CODE (op0) == AND
11947                   && !have_insn_for (AND, mode))
11948                 op0 = simplify_gen_binary (AND, tmode,
11949                                            gen_lowpart (tmode,
11950                                                         XEXP (op0, 0)),
11951                                            gen_lowpart (tmode,
11952                                                         XEXP (op0, 1)));
11953               else
11954                 {
11955                   if (zero_extended)
11956                     {
11957                       op0 = simplify_gen_unary (ZERO_EXTEND, tmode, op0, mode);
11958                       op1 = simplify_gen_unary (ZERO_EXTEND, tmode, op1, mode);
11959                     }
11960                   else
11961                     {
11962                       op0 = simplify_gen_unary (SIGN_EXTEND, tmode, op0, mode);
11963                       op1 = simplify_gen_unary (SIGN_EXTEND, tmode, op1, mode);
11964                     }
11965                   break;
11966                 }
11967             }
11968         }
11969
11970 #ifdef CANONICALIZE_COMPARISON
11971   /* If this machine only supports a subset of valid comparisons, see if we
11972      can convert an unsupported one into a supported one.  */
11973   CANONICALIZE_COMPARISON (code, op0, op1);
11974 #endif
11975
11976   *pop0 = op0;
11977   *pop1 = op1;
11978
11979   return code;
11980 }
11981 \f
11982 /* Utility function for record_value_for_reg.  Count number of
11983    rtxs in X.  */
11984 static int
11985 count_rtxs (rtx x)
11986 {
11987   enum rtx_code code = GET_CODE (x);
11988   const char *fmt;
11989   int i, j, ret = 1;
11990
11991   if (GET_RTX_CLASS (code) == '2'
11992       || GET_RTX_CLASS (code) == 'c')
11993     {
11994       rtx x0 = XEXP (x, 0);
11995       rtx x1 = XEXP (x, 1);
11996
11997       if (x0 == x1)
11998         return 1 + 2 * count_rtxs (x0);
11999
12000       if ((GET_RTX_CLASS (GET_CODE (x1)) == '2'
12001            || GET_RTX_CLASS (GET_CODE (x1)) == 'c')
12002           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12003         return 2 + 2 * count_rtxs (x0)
12004                + count_rtxs (x == XEXP (x1, 0)
12005                              ? XEXP (x1, 1) : XEXP (x1, 0));
12006
12007       if ((GET_RTX_CLASS (GET_CODE (x0)) == '2'
12008            || GET_RTX_CLASS (GET_CODE (x0)) == 'c')
12009           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12010         return 2 + 2 * count_rtxs (x1)
12011                + count_rtxs (x == XEXP (x0, 0)
12012                              ? XEXP (x0, 1) : XEXP (x0, 0));
12013     }
12014
12015   fmt = GET_RTX_FORMAT (code);
12016   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12017     if (fmt[i] == 'e')
12018       ret += count_rtxs (XEXP (x, i));
12019     else if (fmt[i] == 'E')
12020       for (j = 0; j < XVECLEN (x, i); j++)
12021         ret += count_rtxs (XVECEXP (x, i, j));
12022
12023   return ret;
12024 }
12025 \f
12026 /* Utility function for following routine.  Called when X is part of a value
12027    being stored into last_set_value.  Sets last_set_table_tick
12028    for each register mentioned.  Similar to mention_regs in cse.c  */
12029
12030 static void
12031 update_table_tick (rtx x)
12032 {
12033   enum rtx_code code = GET_CODE (x);
12034   const char *fmt = GET_RTX_FORMAT (code);
12035   int i, j;
12036
12037   if (code == REG)
12038     {
12039       unsigned int regno = REGNO (x);
12040       unsigned int endregno = END_REGNO (x);
12041       unsigned int r;
12042
12043       for (r = regno; r < endregno; r++)
12044         {
12045           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, r);
12046           rsp->last_set_table_tick = label_tick;
12047         }
12048
12049       return;
12050     }
12051
12052   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12053     if (fmt[i] == 'e')
12054       {
12055         /* Check for identical subexpressions.  If x contains
12056            identical subexpression we only have to traverse one of
12057            them.  */
12058         if (i == 0 && ARITHMETIC_P (x))
12059           {
12060             /* Note that at this point x1 has already been
12061                processed.  */
12062             rtx x0 = XEXP (x, 0);
12063             rtx x1 = XEXP (x, 1);
12064
12065             /* If x0 and x1 are identical then there is no need to
12066                process x0.  */
12067             if (x0 == x1)
12068               break;
12069
12070             /* If x0 is identical to a subexpression of x1 then while
12071                processing x1, x0 has already been processed.  Thus we
12072                are done with x.  */
12073             if (ARITHMETIC_P (x1)
12074                 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12075               break;
12076
12077             /* If x1 is identical to a subexpression of x0 then we
12078                still have to process the rest of x0.  */
12079             if (ARITHMETIC_P (x0)
12080                 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12081               {
12082                 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
12083                 break;
12084               }
12085           }
12086
12087         update_table_tick (XEXP (x, i));
12088       }
12089     else if (fmt[i] == 'E')
12090       for (j = 0; j < XVECLEN (x, i); j++)
12091         update_table_tick (XVECEXP (x, i, j));
12092 }
12093
12094 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
12095    are saying that the register is clobbered and we no longer know its
12096    value.  If INSN is zero, don't update reg_stat[].last_set; this is
12097    only permitted with VALUE also zero and is used to invalidate the
12098    register.  */
12099
12100 static void
12101 record_value_for_reg (rtx reg, rtx insn, rtx value)
12102 {
12103   unsigned int regno = REGNO (reg);
12104   unsigned int endregno = END_REGNO (reg);
12105   unsigned int i;
12106   reg_stat_type *rsp;
12107
12108   /* If VALUE contains REG and we have a previous value for REG, substitute
12109      the previous value.  */
12110   if (value && insn && reg_overlap_mentioned_p (reg, value))
12111     {
12112       rtx tem;
12113
12114       /* Set things up so get_last_value is allowed to see anything set up to
12115          our insn.  */
12116       subst_low_luid = DF_INSN_LUID (insn);
12117       tem = get_last_value (reg);
12118
12119       /* If TEM is simply a binary operation with two CLOBBERs as operands,
12120          it isn't going to be useful and will take a lot of time to process,
12121          so just use the CLOBBER.  */
12122
12123       if (tem)
12124         {
12125           if (ARITHMETIC_P (tem)
12126               && GET_CODE (XEXP (tem, 0)) == CLOBBER
12127               && GET_CODE (XEXP (tem, 1)) == CLOBBER)
12128             tem = XEXP (tem, 0);
12129           else if (count_occurrences (value, reg, 1) >= 2)
12130             {
12131               /* If there are two or more occurrences of REG in VALUE,
12132                  prevent the value from growing too much.  */
12133               if (count_rtxs (tem) > MAX_LAST_VALUE_RTL)
12134                 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
12135             }
12136
12137           value = replace_rtx (copy_rtx (value), reg, tem);
12138         }
12139     }
12140
12141   /* For each register modified, show we don't know its value, that
12142      we don't know about its bitwise content, that its value has been
12143      updated, and that we don't know the location of the death of the
12144      register.  */
12145   for (i = regno; i < endregno; i++)
12146     {
12147       rsp = VEC_index (reg_stat_type, reg_stat, i);
12148
12149       if (insn)
12150         rsp->last_set = insn;
12151
12152       rsp->last_set_value = 0;
12153       rsp->last_set_mode = VOIDmode;
12154       rsp->last_set_nonzero_bits = 0;
12155       rsp->last_set_sign_bit_copies = 0;
12156       rsp->last_death = 0;
12157       rsp->truncated_to_mode = VOIDmode;
12158     }
12159
12160   /* Mark registers that are being referenced in this value.  */
12161   if (value)
12162     update_table_tick (value);
12163
12164   /* Now update the status of each register being set.
12165      If someone is using this register in this block, set this register
12166      to invalid since we will get confused between the two lives in this
12167      basic block.  This makes using this register always invalid.  In cse, we
12168      scan the table to invalidate all entries using this register, but this
12169      is too much work for us.  */
12170
12171   for (i = regno; i < endregno; i++)
12172     {
12173       rsp = VEC_index (reg_stat_type, reg_stat, i);
12174       rsp->last_set_label = label_tick;
12175       if (!insn
12176           || (value && rsp->last_set_table_tick >= label_tick_ebb_start))
12177         rsp->last_set_invalid = 1;
12178       else
12179         rsp->last_set_invalid = 0;
12180     }
12181
12182   /* The value being assigned might refer to X (like in "x++;").  In that
12183      case, we must replace it with (clobber (const_int 0)) to prevent
12184      infinite loops.  */
12185   rsp = VEC_index (reg_stat_type, reg_stat, regno);
12186   if (value && !get_last_value_validate (&value, insn, label_tick, 0))
12187     {
12188       value = copy_rtx (value);
12189       if (!get_last_value_validate (&value, insn, label_tick, 1))
12190         value = 0;
12191     }
12192
12193   /* For the main register being modified, update the value, the mode, the
12194      nonzero bits, and the number of sign bit copies.  */
12195
12196   rsp->last_set_value = value;
12197
12198   if (value)
12199     {
12200       enum machine_mode mode = GET_MODE (reg);
12201       subst_low_luid = DF_INSN_LUID (insn);
12202       rsp->last_set_mode = mode;
12203       if (GET_MODE_CLASS (mode) == MODE_INT
12204           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
12205         mode = nonzero_bits_mode;
12206       rsp->last_set_nonzero_bits = nonzero_bits (value, mode);
12207       rsp->last_set_sign_bit_copies
12208         = num_sign_bit_copies (value, GET_MODE (reg));
12209     }
12210 }
12211
12212 /* Called via note_stores from record_dead_and_set_regs to handle one
12213    SET or CLOBBER in an insn.  DATA is the instruction in which the
12214    set is occurring.  */
12215
12216 static void
12217 record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data)
12218 {
12219   rtx record_dead_insn = (rtx) data;
12220
12221   if (GET_CODE (dest) == SUBREG)
12222     dest = SUBREG_REG (dest);
12223
12224   if (!record_dead_insn)
12225     {
12226       if (REG_P (dest))
12227         record_value_for_reg (dest, NULL_RTX, NULL_RTX);
12228       return;
12229     }
12230
12231   if (REG_P (dest))
12232     {
12233       /* If we are setting the whole register, we know its value.  Otherwise
12234          show that we don't know the value.  We can handle SUBREG in
12235          some cases.  */
12236       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
12237         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
12238       else if (GET_CODE (setter) == SET
12239                && GET_CODE (SET_DEST (setter)) == SUBREG
12240                && SUBREG_REG (SET_DEST (setter)) == dest
12241                && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
12242                && subreg_lowpart_p (SET_DEST (setter)))
12243         record_value_for_reg (dest, record_dead_insn,
12244                               gen_lowpart (GET_MODE (dest),
12245                                                        SET_SRC (setter)));
12246       else
12247         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
12248     }
12249   else if (MEM_P (dest)
12250            /* Ignore pushes, they clobber nothing.  */
12251            && ! push_operand (dest, GET_MODE (dest)))
12252     mem_last_set = DF_INSN_LUID (record_dead_insn);
12253 }
12254
12255 /* Update the records of when each REG was most recently set or killed
12256    for the things done by INSN.  This is the last thing done in processing
12257    INSN in the combiner loop.
12258
12259    We update reg_stat[], in particular fields last_set, last_set_value,
12260    last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
12261    last_death, and also the similar information mem_last_set (which insn
12262    most recently modified memory) and last_call_luid (which insn was the
12263    most recent subroutine call).  */
12264
12265 static void
12266 record_dead_and_set_regs (rtx insn)
12267 {
12268   rtx link;
12269   unsigned int i;
12270
12271   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
12272     {
12273       if (REG_NOTE_KIND (link) == REG_DEAD
12274           && REG_P (XEXP (link, 0)))
12275         {
12276           unsigned int regno = REGNO (XEXP (link, 0));
12277           unsigned int endregno = END_REGNO (XEXP (link, 0));
12278
12279           for (i = regno; i < endregno; i++)
12280             {
12281               reg_stat_type *rsp;
12282
12283               rsp = VEC_index (reg_stat_type, reg_stat, i);
12284               rsp->last_death = insn;
12285             }
12286         }
12287       else if (REG_NOTE_KIND (link) == REG_INC)
12288         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
12289     }
12290
12291   if (CALL_P (insn))
12292     {
12293       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
12294         if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
12295           {
12296             reg_stat_type *rsp;
12297
12298             rsp = VEC_index (reg_stat_type, reg_stat, i);
12299             rsp->last_set_invalid = 1;
12300             rsp->last_set = insn;
12301             rsp->last_set_value = 0;
12302             rsp->last_set_mode = VOIDmode;
12303             rsp->last_set_nonzero_bits = 0;
12304             rsp->last_set_sign_bit_copies = 0;
12305             rsp->last_death = 0;
12306             rsp->truncated_to_mode = VOIDmode;
12307           }
12308
12309       last_call_luid = mem_last_set = DF_INSN_LUID (insn);
12310
12311       /* We can't combine into a call pattern.  Remember, though, that
12312          the return value register is set at this LUID.  We could
12313          still replace a register with the return value from the
12314          wrong subroutine call!  */
12315       note_stores (PATTERN (insn), record_dead_and_set_regs_1, NULL_RTX);
12316     }
12317   else
12318     note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
12319 }
12320
12321 /* If a SUBREG has the promoted bit set, it is in fact a property of the
12322    register present in the SUBREG, so for each such SUBREG go back and
12323    adjust nonzero and sign bit information of the registers that are
12324    known to have some zero/sign bits set.
12325
12326    This is needed because when combine blows the SUBREGs away, the
12327    information on zero/sign bits is lost and further combines can be
12328    missed because of that.  */
12329
12330 static void
12331 record_promoted_value (rtx insn, rtx subreg)
12332 {
12333   rtx links, set;
12334   unsigned int regno = REGNO (SUBREG_REG (subreg));
12335   enum machine_mode mode = GET_MODE (subreg);
12336
12337   if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
12338     return;
12339
12340   for (links = LOG_LINKS (insn); links;)
12341     {
12342       reg_stat_type *rsp;
12343
12344       insn = XEXP (links, 0);
12345       set = single_set (insn);
12346
12347       if (! set || !REG_P (SET_DEST (set))
12348           || REGNO (SET_DEST (set)) != regno
12349           || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
12350         {
12351           links = XEXP (links, 1);
12352           continue;
12353         }
12354
12355       rsp = VEC_index (reg_stat_type, reg_stat, regno);
12356       if (rsp->last_set == insn)
12357         {
12358           if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
12359             rsp->last_set_nonzero_bits &= GET_MODE_MASK (mode);
12360         }
12361
12362       if (REG_P (SET_SRC (set)))
12363         {
12364           regno = REGNO (SET_SRC (set));
12365           links = LOG_LINKS (insn);
12366         }
12367       else
12368         break;
12369     }
12370 }
12371
12372 /* Check if X, a register, is known to contain a value already
12373    truncated to MODE.  In this case we can use a subreg to refer to
12374    the truncated value even though in the generic case we would need
12375    an explicit truncation.  */
12376
12377 static bool
12378 reg_truncated_to_mode (enum machine_mode mode, const_rtx x)
12379 {
12380   reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
12381   enum machine_mode truncated = rsp->truncated_to_mode;
12382
12383   if (truncated == 0
12384       || rsp->truncation_label < label_tick_ebb_start)
12385     return false;
12386   if (GET_MODE_SIZE (truncated) <= GET_MODE_SIZE (mode))
12387     return true;
12388   if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
12389                              GET_MODE_BITSIZE (truncated)))
12390     return true;
12391   return false;
12392 }
12393
12394 /* Callback for for_each_rtx.  If *P is a hard reg or a subreg record the mode
12395    that the register is accessed in.  For non-TRULY_NOOP_TRUNCATION targets we
12396    might be able to turn a truncate into a subreg using this information.
12397    Return -1 if traversing *P is complete or 0 otherwise.  */
12398
12399 static int
12400 record_truncated_value (rtx *p, void *data ATTRIBUTE_UNUSED)
12401 {
12402   rtx x = *p;
12403   enum machine_mode truncated_mode;
12404   reg_stat_type *rsp;
12405
12406   if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x)))
12407     {
12408       enum machine_mode original_mode = GET_MODE (SUBREG_REG (x));
12409       truncated_mode = GET_MODE (x);
12410
12411       if (GET_MODE_SIZE (original_mode) <= GET_MODE_SIZE (truncated_mode))
12412         return -1;
12413
12414       if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (truncated_mode),
12415                                  GET_MODE_BITSIZE (original_mode)))
12416         return -1;
12417
12418       x = SUBREG_REG (x);
12419     }
12420   /* ??? For hard-regs we now record everything.  We might be able to
12421      optimize this using last_set_mode.  */
12422   else if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
12423     truncated_mode = GET_MODE (x);
12424   else
12425     return 0;
12426
12427   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
12428   if (rsp->truncated_to_mode == 0
12429       || rsp->truncation_label < label_tick_ebb_start
12430       || (GET_MODE_SIZE (truncated_mode)
12431           < GET_MODE_SIZE (rsp->truncated_to_mode)))
12432     {
12433       rsp->truncated_to_mode = truncated_mode;
12434       rsp->truncation_label = label_tick;
12435     }
12436
12437   return -1;
12438 }
12439
12440 /* Callback for note_uses.  Find hardregs and subregs of pseudos and
12441    the modes they are used in.  This can help truning TRUNCATEs into
12442    SUBREGs.  */
12443
12444 static void
12445 record_truncated_values (rtx *x, void *data ATTRIBUTE_UNUSED)
12446 {
12447   for_each_rtx (x, record_truncated_value, NULL);
12448 }
12449
12450 /* Scan X for promoted SUBREGs.  For each one found,
12451    note what it implies to the registers used in it.  */
12452
12453 static void
12454 check_promoted_subreg (rtx insn, rtx x)
12455 {
12456   if (GET_CODE (x) == SUBREG
12457       && SUBREG_PROMOTED_VAR_P (x)
12458       && REG_P (SUBREG_REG (x)))
12459     record_promoted_value (insn, x);
12460   else
12461     {
12462       const char *format = GET_RTX_FORMAT (GET_CODE (x));
12463       int i, j;
12464
12465       for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
12466         switch (format[i])
12467           {
12468           case 'e':
12469             check_promoted_subreg (insn, XEXP (x, i));
12470             break;
12471           case 'V':
12472           case 'E':
12473             if (XVEC (x, i) != 0)
12474               for (j = 0; j < XVECLEN (x, i); j++)
12475                 check_promoted_subreg (insn, XVECEXP (x, i, j));
12476             break;
12477           }
12478     }
12479 }
12480 \f
12481 /* Verify that all the registers and memory references mentioned in *LOC are
12482    still valid.  *LOC was part of a value set in INSN when label_tick was
12483    equal to TICK.  Return 0 if some are not.  If REPLACE is nonzero, replace
12484    the invalid references with (clobber (const_int 0)) and return 1.  This
12485    replacement is useful because we often can get useful information about
12486    the form of a value (e.g., if it was produced by a shift that always
12487    produces -1 or 0) even though we don't know exactly what registers it
12488    was produced from.  */
12489
12490 static int
12491 get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
12492 {
12493   rtx x = *loc;
12494   const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
12495   int len = GET_RTX_LENGTH (GET_CODE (x));
12496   int i, j;
12497
12498   if (REG_P (x))
12499     {
12500       unsigned int regno = REGNO (x);
12501       unsigned int endregno = END_REGNO (x);
12502       unsigned int j;
12503
12504       for (j = regno; j < endregno; j++)
12505         {
12506           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, j);
12507           if (rsp->last_set_invalid
12508               /* If this is a pseudo-register that was only set once and not
12509                  live at the beginning of the function, it is always valid.  */
12510               || (! (regno >= FIRST_PSEUDO_REGISTER
12511                      && REG_N_SETS (regno) == 1
12512                      && (!REGNO_REG_SET_P
12513                          (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), regno)))
12514                   && rsp->last_set_label > tick))
12515           {
12516             if (replace)
12517               *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
12518             return replace;
12519           }
12520         }
12521
12522       return 1;
12523     }
12524   /* If this is a memory reference, make sure that there were no stores after
12525      it that might have clobbered the value.  We don't have alias info, so we
12526      assume any store invalidates it.  Moreover, we only have local UIDs, so
12527      we also assume that there were stores in the intervening basic blocks.  */
12528   else if (MEM_P (x) && !MEM_READONLY_P (x)
12529            && (tick != label_tick || DF_INSN_LUID (insn) <= mem_last_set))
12530     {
12531       if (replace)
12532         *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
12533       return replace;
12534     }
12535
12536   for (i = 0; i < len; i++)
12537     {
12538       if (fmt[i] == 'e')
12539         {
12540           /* Check for identical subexpressions.  If x contains
12541              identical subexpression we only have to traverse one of
12542              them.  */
12543           if (i == 1 && ARITHMETIC_P (x))
12544             {
12545               /* Note that at this point x0 has already been checked
12546                  and found valid.  */
12547               rtx x0 = XEXP (x, 0);
12548               rtx x1 = XEXP (x, 1);
12549
12550               /* If x0 and x1 are identical then x is also valid.  */
12551               if (x0 == x1)
12552                 return 1;
12553
12554               /* If x1 is identical to a subexpression of x0 then
12555                  while checking x0, x1 has already been checked.  Thus
12556                  it is valid and so as x.  */
12557               if (ARITHMETIC_P (x0)
12558                   && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12559                 return 1;
12560
12561               /* If x0 is identical to a subexpression of x1 then x is
12562                  valid iff the rest of x1 is valid.  */
12563               if (ARITHMETIC_P (x1)
12564                   && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12565                 return
12566                   get_last_value_validate (&XEXP (x1,
12567                                                   x0 == XEXP (x1, 0) ? 1 : 0),
12568                                            insn, tick, replace);
12569             }
12570
12571           if (get_last_value_validate (&XEXP (x, i), insn, tick,
12572                                        replace) == 0)
12573             return 0;
12574         }
12575       else if (fmt[i] == 'E')
12576         for (j = 0; j < XVECLEN (x, i); j++)
12577           if (get_last_value_validate (&XVECEXP (x, i, j),
12578                                        insn, tick, replace) == 0)
12579             return 0;
12580     }
12581
12582   /* If we haven't found a reason for it to be invalid, it is valid.  */
12583   return 1;
12584 }
12585
12586 /* Get the last value assigned to X, if known.  Some registers
12587    in the value may be replaced with (clobber (const_int 0)) if their value
12588    is known longer known reliably.  */
12589
12590 static rtx
12591 get_last_value (const_rtx x)
12592 {
12593   unsigned int regno;
12594   rtx value;
12595   reg_stat_type *rsp;
12596
12597   /* If this is a non-paradoxical SUBREG, get the value of its operand and
12598      then convert it to the desired mode.  If this is a paradoxical SUBREG,
12599      we cannot predict what values the "extra" bits might have.  */
12600   if (GET_CODE (x) == SUBREG
12601       && subreg_lowpart_p (x)
12602       && (GET_MODE_SIZE (GET_MODE (x))
12603           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
12604       && (value = get_last_value (SUBREG_REG (x))) != 0)
12605     return gen_lowpart (GET_MODE (x), value);
12606
12607   if (!REG_P (x))
12608     return 0;
12609
12610   regno = REGNO (x);
12611   rsp = VEC_index (reg_stat_type, reg_stat, regno);
12612   value = rsp->last_set_value;
12613
12614   /* If we don't have a value, or if it isn't for this basic block and
12615      it's either a hard register, set more than once, or it's a live
12616      at the beginning of the function, return 0.
12617
12618      Because if it's not live at the beginning of the function then the reg
12619      is always set before being used (is never used without being set).
12620      And, if it's set only once, and it's always set before use, then all
12621      uses must have the same last value, even if it's not from this basic
12622      block.  */
12623
12624   if (value == 0
12625       || (rsp->last_set_label < label_tick_ebb_start
12626           && (regno < FIRST_PSEUDO_REGISTER
12627               || REG_N_SETS (regno) != 1
12628               || REGNO_REG_SET_P
12629                  (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), regno))))
12630     return 0;
12631
12632   /* If the value was set in a later insn than the ones we are processing,
12633      we can't use it even if the register was only set once.  */
12634   if (rsp->last_set_label == label_tick
12635       && DF_INSN_LUID (rsp->last_set) >= subst_low_luid)
12636     return 0;
12637
12638   /* If the value has all its registers valid, return it.  */
12639   if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 0))
12640     return value;
12641
12642   /* Otherwise, make a copy and replace any invalid register with
12643      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
12644
12645   value = copy_rtx (value);
12646   if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 1))
12647     return value;
12648
12649   return 0;
12650 }
12651 \f
12652 /* Return nonzero if expression X refers to a REG or to memory
12653    that is set in an instruction more recent than FROM_LUID.  */
12654
12655 static int
12656 use_crosses_set_p (const_rtx x, int from_luid)
12657 {
12658   const char *fmt;
12659   int i;
12660   enum rtx_code code = GET_CODE (x);
12661
12662   if (code == REG)
12663     {
12664       unsigned int regno = REGNO (x);
12665       unsigned endreg = END_REGNO (x);
12666
12667 #ifdef PUSH_ROUNDING
12668       /* Don't allow uses of the stack pointer to be moved,
12669          because we don't know whether the move crosses a push insn.  */
12670       if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
12671         return 1;
12672 #endif
12673       for (; regno < endreg; regno++)
12674         {
12675           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, regno);
12676           if (rsp->last_set
12677               && rsp->last_set_label == label_tick
12678               && DF_INSN_LUID (rsp->last_set) > from_luid)
12679             return 1;
12680         }
12681       return 0;
12682     }
12683
12684   if (code == MEM && mem_last_set > from_luid)
12685     return 1;
12686
12687   fmt = GET_RTX_FORMAT (code);
12688
12689   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12690     {
12691       if (fmt[i] == 'E')
12692         {
12693           int j;
12694           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12695             if (use_crosses_set_p (XVECEXP (x, i, j), from_luid))
12696               return 1;
12697         }
12698       else if (fmt[i] == 'e'
12699                && use_crosses_set_p (XEXP (x, i), from_luid))
12700         return 1;
12701     }
12702   return 0;
12703 }
12704 \f
12705 /* Define three variables used for communication between the following
12706    routines.  */
12707
12708 static unsigned int reg_dead_regno, reg_dead_endregno;
12709 static int reg_dead_flag;
12710
12711 /* Function called via note_stores from reg_dead_at_p.
12712
12713    If DEST is within [reg_dead_regno, reg_dead_endregno), set
12714    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
12715
12716 static void
12717 reg_dead_at_p_1 (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
12718 {
12719   unsigned int regno, endregno;
12720
12721   if (!REG_P (dest))
12722     return;
12723
12724   regno = REGNO (dest);
12725   endregno = END_REGNO (dest);
12726   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
12727     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
12728 }
12729
12730 /* Return nonzero if REG is known to be dead at INSN.
12731
12732    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
12733    referencing REG, it is dead.  If we hit a SET referencing REG, it is
12734    live.  Otherwise, see if it is live or dead at the start of the basic
12735    block we are in.  Hard regs marked as being live in NEWPAT_USED_REGS
12736    must be assumed to be always live.  */
12737
12738 static int
12739 reg_dead_at_p (rtx reg, rtx insn)
12740 {
12741   basic_block block;
12742   unsigned int i;
12743
12744   /* Set variables for reg_dead_at_p_1.  */
12745   reg_dead_regno = REGNO (reg);
12746   reg_dead_endregno = END_REGNO (reg);
12747
12748   reg_dead_flag = 0;
12749
12750   /* Check that reg isn't mentioned in NEWPAT_USED_REGS.  For fixed registers
12751      we allow the machine description to decide whether use-and-clobber
12752      patterns are OK.  */
12753   if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
12754     {
12755       for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12756         if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
12757           return 0;
12758     }
12759
12760   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, or
12761      beginning of basic block.  */
12762   block = BLOCK_FOR_INSN (insn);
12763   for (;;)
12764     {
12765       if (INSN_P (insn))
12766         {
12767           note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
12768           if (reg_dead_flag)
12769             return reg_dead_flag == 1 ? 1 : 0;
12770
12771           if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
12772             return 1;
12773         }
12774
12775       if (insn == BB_HEAD (block))
12776         break;
12777
12778       insn = PREV_INSN (insn);
12779     }
12780
12781   /* Look at live-in sets for the basic block that we were in.  */
12782   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12783     if (REGNO_REG_SET_P (df_get_live_in (block), i))
12784       return 0;
12785
12786   return 1;
12787 }
12788 \f
12789 /* Note hard registers in X that are used.  */
12790
12791 static void
12792 mark_used_regs_combine (rtx x)
12793 {
12794   RTX_CODE code = GET_CODE (x);
12795   unsigned int regno;
12796   int i;
12797
12798   switch (code)
12799     {
12800     case LABEL_REF:
12801     case SYMBOL_REF:
12802     case CONST_INT:
12803     case CONST:
12804     case CONST_DOUBLE:
12805     case CONST_VECTOR:
12806     case PC:
12807     case ADDR_VEC:
12808     case ADDR_DIFF_VEC:
12809     case ASM_INPUT:
12810 #ifdef HAVE_cc0
12811     /* CC0 must die in the insn after it is set, so we don't need to take
12812        special note of it here.  */
12813     case CC0:
12814 #endif
12815       return;
12816
12817     case CLOBBER:
12818       /* If we are clobbering a MEM, mark any hard registers inside the
12819          address as used.  */
12820       if (MEM_P (XEXP (x, 0)))
12821         mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
12822       return;
12823
12824     case REG:
12825       regno = REGNO (x);
12826       /* A hard reg in a wide mode may really be multiple registers.
12827          If so, mark all of them just like the first.  */
12828       if (regno < FIRST_PSEUDO_REGISTER)
12829         {
12830           /* None of this applies to the stack, frame or arg pointers.  */
12831           if (regno == STACK_POINTER_REGNUM
12832 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
12833               || regno == HARD_FRAME_POINTER_REGNUM
12834 #endif
12835 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
12836               || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
12837 #endif
12838               || regno == FRAME_POINTER_REGNUM)
12839             return;
12840
12841           add_to_hard_reg_set (&newpat_used_regs, GET_MODE (x), regno);
12842         }
12843       return;
12844
12845     case SET:
12846       {
12847         /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
12848            the address.  */
12849         rtx testreg = SET_DEST (x);
12850
12851         while (GET_CODE (testreg) == SUBREG
12852                || GET_CODE (testreg) == ZERO_EXTRACT
12853                || GET_CODE (testreg) == STRICT_LOW_PART)
12854           testreg = XEXP (testreg, 0);
12855
12856         if (MEM_P (testreg))
12857           mark_used_regs_combine (XEXP (testreg, 0));
12858
12859         mark_used_regs_combine (SET_SRC (x));
12860       }
12861       return;
12862
12863     default:
12864       break;
12865     }
12866
12867   /* Recursively scan the operands of this expression.  */
12868
12869   {
12870     const char *fmt = GET_RTX_FORMAT (code);
12871
12872     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12873       {
12874         if (fmt[i] == 'e')
12875           mark_used_regs_combine (XEXP (x, i));
12876         else if (fmt[i] == 'E')
12877           {
12878             int j;
12879
12880             for (j = 0; j < XVECLEN (x, i); j++)
12881               mark_used_regs_combine (XVECEXP (x, i, j));
12882           }
12883       }
12884   }
12885 }
12886 \f
12887 /* Remove register number REGNO from the dead registers list of INSN.
12888
12889    Return the note used to record the death, if there was one.  */
12890
12891 rtx
12892 remove_death (unsigned int regno, rtx insn)
12893 {
12894   rtx note = find_regno_note (insn, REG_DEAD, regno);
12895
12896   if (note)
12897     remove_note (insn, note);
12898
12899   return note;
12900 }
12901
12902 /* For each register (hardware or pseudo) used within expression X, if its
12903    death is in an instruction with luid between FROM_LUID (inclusive) and
12904    TO_INSN (exclusive), put a REG_DEAD note for that register in the
12905    list headed by PNOTES.
12906
12907    That said, don't move registers killed by maybe_kill_insn.
12908
12909    This is done when X is being merged by combination into TO_INSN.  These
12910    notes will then be distributed as needed.  */
12911
12912 static void
12913 move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx to_insn,
12914              rtx *pnotes)
12915 {
12916   const char *fmt;
12917   int len, i;
12918   enum rtx_code code = GET_CODE (x);
12919
12920   if (code == REG)
12921     {
12922       unsigned int regno = REGNO (x);
12923       rtx where_dead = VEC_index (reg_stat_type, reg_stat, regno)->last_death;
12924
12925       /* Don't move the register if it gets killed in between from and to.  */
12926       if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
12927           && ! reg_referenced_p (x, maybe_kill_insn))
12928         return;
12929
12930       if (where_dead
12931           && BLOCK_FOR_INSN (where_dead) == BLOCK_FOR_INSN (to_insn)
12932           && DF_INSN_LUID (where_dead) >= from_luid
12933           && DF_INSN_LUID (where_dead) < DF_INSN_LUID (to_insn))
12934         {
12935           rtx note = remove_death (regno, where_dead);
12936
12937           /* It is possible for the call above to return 0.  This can occur
12938              when last_death points to I2 or I1 that we combined with.
12939              In that case make a new note.
12940
12941              We must also check for the case where X is a hard register
12942              and NOTE is a death note for a range of hard registers
12943              including X.  In that case, we must put REG_DEAD notes for
12944              the remaining registers in place of NOTE.  */
12945
12946           if (note != 0 && regno < FIRST_PSEUDO_REGISTER
12947               && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12948                   > GET_MODE_SIZE (GET_MODE (x))))
12949             {
12950               unsigned int deadregno = REGNO (XEXP (note, 0));
12951               unsigned int deadend = END_HARD_REGNO (XEXP (note, 0));
12952               unsigned int ourend = END_HARD_REGNO (x);
12953               unsigned int i;
12954
12955               for (i = deadregno; i < deadend; i++)
12956                 if (i < regno || i >= ourend)
12957                   add_reg_note (where_dead, REG_DEAD, regno_reg_rtx[i]);
12958             }
12959
12960           /* If we didn't find any note, or if we found a REG_DEAD note that
12961              covers only part of the given reg, and we have a multi-reg hard
12962              register, then to be safe we must check for REG_DEAD notes
12963              for each register other than the first.  They could have
12964              their own REG_DEAD notes lying around.  */
12965           else if ((note == 0
12966                     || (note != 0
12967                         && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12968                             < GET_MODE_SIZE (GET_MODE (x)))))
12969                    && regno < FIRST_PSEUDO_REGISTER
12970                    && hard_regno_nregs[regno][GET_MODE (x)] > 1)
12971             {
12972               unsigned int ourend = END_HARD_REGNO (x);
12973               unsigned int i, offset;
12974               rtx oldnotes = 0;
12975
12976               if (note)
12977                 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
12978               else
12979                 offset = 1;
12980
12981               for (i = regno + offset; i < ourend; i++)
12982                 move_deaths (regno_reg_rtx[i],
12983                              maybe_kill_insn, from_luid, to_insn, &oldnotes);
12984             }
12985
12986           if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
12987             {
12988               XEXP (note, 1) = *pnotes;
12989               *pnotes = note;
12990             }
12991           else
12992             *pnotes = alloc_reg_note (REG_DEAD, x, *pnotes);
12993         }
12994
12995       return;
12996     }
12997
12998   else if (GET_CODE (x) == SET)
12999     {
13000       rtx dest = SET_DEST (x);
13001
13002       move_deaths (SET_SRC (x), maybe_kill_insn, from_luid, to_insn, pnotes);
13003
13004       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
13005          that accesses one word of a multi-word item, some
13006          piece of everything register in the expression is used by
13007          this insn, so remove any old death.  */
13008       /* ??? So why do we test for equality of the sizes?  */
13009
13010       if (GET_CODE (dest) == ZERO_EXTRACT
13011           || GET_CODE (dest) == STRICT_LOW_PART
13012           || (GET_CODE (dest) == SUBREG
13013               && (((GET_MODE_SIZE (GET_MODE (dest))
13014                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
13015                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
13016                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
13017         {
13018           move_deaths (dest, maybe_kill_insn, from_luid, to_insn, pnotes);
13019           return;
13020         }
13021
13022       /* If this is some other SUBREG, we know it replaces the entire
13023          value, so use that as the destination.  */
13024       if (GET_CODE (dest) == SUBREG)
13025         dest = SUBREG_REG (dest);
13026
13027       /* If this is a MEM, adjust deaths of anything used in the address.
13028          For a REG (the only other possibility), the entire value is
13029          being replaced so the old value is not used in this insn.  */
13030
13031       if (MEM_P (dest))
13032         move_deaths (XEXP (dest, 0), maybe_kill_insn, from_luid,
13033                      to_insn, pnotes);
13034       return;
13035     }
13036
13037   else if (GET_CODE (x) == CLOBBER)
13038     return;
13039
13040   len = GET_RTX_LENGTH (code);
13041   fmt = GET_RTX_FORMAT (code);
13042
13043   for (i = 0; i < len; i++)
13044     {
13045       if (fmt[i] == 'E')
13046         {
13047           int j;
13048           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
13049             move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_luid,
13050                          to_insn, pnotes);
13051         }
13052       else if (fmt[i] == 'e')
13053         move_deaths (XEXP (x, i), maybe_kill_insn, from_luid, to_insn, pnotes);
13054     }
13055 }
13056 \f
13057 /* Return 1 if X is the target of a bit-field assignment in BODY, the
13058    pattern of an insn.  X must be a REG.  */
13059
13060 static int
13061 reg_bitfield_target_p (rtx x, rtx body)
13062 {
13063   int i;
13064
13065   if (GET_CODE (body) == SET)
13066     {
13067       rtx dest = SET_DEST (body);
13068       rtx target;
13069       unsigned int regno, tregno, endregno, endtregno;
13070
13071       if (GET_CODE (dest) == ZERO_EXTRACT)
13072         target = XEXP (dest, 0);
13073       else if (GET_CODE (dest) == STRICT_LOW_PART)
13074         target = SUBREG_REG (XEXP (dest, 0));
13075       else
13076         return 0;
13077
13078       if (GET_CODE (target) == SUBREG)
13079         target = SUBREG_REG (target);
13080
13081       if (!REG_P (target))
13082         return 0;
13083
13084       tregno = REGNO (target), regno = REGNO (x);
13085       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
13086         return target == x;
13087
13088       endtregno = end_hard_regno (GET_MODE (target), tregno);
13089       endregno = end_hard_regno (GET_MODE (x), regno);
13090
13091       return endregno > tregno && regno < endtregno;
13092     }
13093
13094   else if (GET_CODE (body) == PARALLEL)
13095     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
13096       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
13097         return 1;
13098
13099   return 0;
13100 }
13101 \f
13102 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
13103    as appropriate.  I3 and I2 are the insns resulting from the combination
13104    insns including FROM (I2 may be zero).
13105
13106    ELIM_I2 and ELIM_I1 are either zero or registers that we know will
13107    not need REG_DEAD notes because they are being substituted for.  This
13108    saves searching in the most common cases.
13109
13110    Each note in the list is either ignored or placed on some insns, depending
13111    on the type of note.  */
13112
13113 static void
13114 distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
13115                   rtx elim_i1, rtx elim_i0)
13116 {
13117   rtx note, next_note;
13118   rtx tem;
13119
13120   for (note = notes; note; note = next_note)
13121     {
13122       rtx place = 0, place2 = 0;
13123
13124       next_note = XEXP (note, 1);
13125       switch (REG_NOTE_KIND (note))
13126         {
13127         case REG_BR_PROB:
13128         case REG_BR_PRED:
13129           /* Doesn't matter much where we put this, as long as it's somewhere.
13130              It is preferable to keep these notes on branches, which is most
13131              likely to be i3.  */
13132           place = i3;
13133           break;
13134
13135         case REG_VALUE_PROFILE:
13136           /* Just get rid of this note, as it is unused later anyway.  */
13137           break;
13138
13139         case REG_NON_LOCAL_GOTO:
13140           if (JUMP_P (i3))
13141             place = i3;
13142           else
13143             {
13144               gcc_assert (i2 && JUMP_P (i2));
13145               place = i2;
13146             }
13147           break;
13148
13149         case REG_EH_REGION:
13150           /* These notes must remain with the call or trapping instruction.  */
13151           if (CALL_P (i3))
13152             place = i3;
13153           else if (i2 && CALL_P (i2))
13154             place = i2;
13155           else
13156             {
13157               gcc_assert (cfun->can_throw_non_call_exceptions);
13158               if (may_trap_p (i3))
13159                 place = i3;
13160               else if (i2 && may_trap_p (i2))
13161                 place = i2;
13162               /* ??? Otherwise assume we've combined things such that we
13163                  can now prove that the instructions can't trap.  Drop the
13164                  note in this case.  */
13165             }
13166           break;
13167
13168         case REG_NORETURN:
13169         case REG_SETJMP:
13170           /* These notes must remain with the call.  It should not be
13171              possible for both I2 and I3 to be a call.  */
13172           if (CALL_P (i3))
13173             place = i3;
13174           else
13175             {
13176               gcc_assert (i2 && CALL_P (i2));
13177               place = i2;
13178             }
13179           break;
13180
13181         case REG_UNUSED:
13182           /* Any clobbers for i3 may still exist, and so we must process
13183              REG_UNUSED notes from that insn.
13184
13185              Any clobbers from i2 or i1 can only exist if they were added by
13186              recog_for_combine.  In that case, recog_for_combine created the
13187              necessary REG_UNUSED notes.  Trying to keep any original
13188              REG_UNUSED notes from these insns can cause incorrect output
13189              if it is for the same register as the original i3 dest.
13190              In that case, we will notice that the register is set in i3,
13191              and then add a REG_UNUSED note for the destination of i3, which
13192              is wrong.  However, it is possible to have REG_UNUSED notes from
13193              i2 or i1 for register which were both used and clobbered, so
13194              we keep notes from i2 or i1 if they will turn into REG_DEAD
13195              notes.  */
13196
13197           /* If this register is set or clobbered in I3, put the note there
13198              unless there is one already.  */
13199           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
13200             {
13201               if (from_insn != i3)
13202                 break;
13203
13204               if (! (REG_P (XEXP (note, 0))
13205                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
13206                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
13207                 place = i3;
13208             }
13209           /* Otherwise, if this register is used by I3, then this register
13210              now dies here, so we must put a REG_DEAD note here unless there
13211              is one already.  */
13212           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
13213                    && ! (REG_P (XEXP (note, 0))
13214                          ? find_regno_note (i3, REG_DEAD,
13215                                             REGNO (XEXP (note, 0)))
13216                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
13217             {
13218               PUT_REG_NOTE_KIND (note, REG_DEAD);
13219               place = i3;
13220             }
13221           break;
13222
13223         case REG_EQUAL:
13224         case REG_EQUIV:
13225         case REG_NOALIAS:
13226           /* These notes say something about results of an insn.  We can
13227              only support them if they used to be on I3 in which case they
13228              remain on I3.  Otherwise they are ignored.
13229
13230              If the note refers to an expression that is not a constant, we
13231              must also ignore the note since we cannot tell whether the
13232              equivalence is still true.  It might be possible to do
13233              slightly better than this (we only have a problem if I2DEST
13234              or I1DEST is present in the expression), but it doesn't
13235              seem worth the trouble.  */
13236
13237           if (from_insn == i3
13238               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
13239             place = i3;
13240           break;
13241
13242         case REG_INC:
13243           /* These notes say something about how a register is used.  They must
13244              be present on any use of the register in I2 or I3.  */
13245           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
13246             place = i3;
13247
13248           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
13249             {
13250               if (place)
13251                 place2 = i2;
13252               else
13253                 place = i2;
13254             }
13255           break;
13256
13257         case REG_LABEL_TARGET:
13258         case REG_LABEL_OPERAND:
13259           /* This can show up in several ways -- either directly in the
13260              pattern, or hidden off in the constant pool with (or without?)
13261              a REG_EQUAL note.  */
13262           /* ??? Ignore the without-reg_equal-note problem for now.  */
13263           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
13264               || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
13265                   && GET_CODE (XEXP (tem, 0)) == LABEL_REF
13266                   && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
13267             place = i3;
13268
13269           if (i2
13270               && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
13271                   || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
13272                       && GET_CODE (XEXP (tem, 0)) == LABEL_REF
13273                       && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
13274             {
13275               if (place)
13276                 place2 = i2;
13277               else
13278                 place = i2;
13279             }
13280
13281           /* For REG_LABEL_TARGET on a JUMP_P, we prefer to put the note
13282              as a JUMP_LABEL or decrement LABEL_NUSES if it's already
13283              there.  */
13284           if (place && JUMP_P (place)
13285               && REG_NOTE_KIND (note) == REG_LABEL_TARGET
13286               && (JUMP_LABEL (place) == NULL
13287                   || JUMP_LABEL (place) == XEXP (note, 0)))
13288             {
13289               rtx label = JUMP_LABEL (place);
13290
13291               if (!label)
13292                 JUMP_LABEL (place) = XEXP (note, 0);
13293               else if (LABEL_P (label))
13294                 LABEL_NUSES (label)--;
13295             }
13296
13297           if (place2 && JUMP_P (place2)
13298               && REG_NOTE_KIND (note) == REG_LABEL_TARGET
13299               && (JUMP_LABEL (place2) == NULL
13300                   || JUMP_LABEL (place2) == XEXP (note, 0)))
13301             {
13302               rtx label = JUMP_LABEL (place2);
13303
13304               if (!label)
13305                 JUMP_LABEL (place2) = XEXP (note, 0);
13306               else if (LABEL_P (label))
13307                 LABEL_NUSES (label)--;
13308               place2 = 0;
13309             }
13310           break;
13311
13312         case REG_NONNEG:
13313           /* This note says something about the value of a register prior
13314              to the execution of an insn.  It is too much trouble to see
13315              if the note is still correct in all situations.  It is better
13316              to simply delete it.  */
13317           break;
13318
13319         case REG_DEAD:
13320           /* If we replaced the right hand side of FROM_INSN with a
13321              REG_EQUAL note, the original use of the dying register
13322              will not have been combined into I3 and I2.  In such cases,
13323              FROM_INSN is guaranteed to be the first of the combined
13324              instructions, so we simply need to search back before
13325              FROM_INSN for the previous use or set of this register,
13326              then alter the notes there appropriately.
13327
13328              If the register is used as an input in I3, it dies there.
13329              Similarly for I2, if it is nonzero and adjacent to I3.
13330
13331              If the register is not used as an input in either I3 or I2
13332              and it is not one of the registers we were supposed to eliminate,
13333              there are two possibilities.  We might have a non-adjacent I2
13334              or we might have somehow eliminated an additional register
13335              from a computation.  For example, we might have had A & B where
13336              we discover that B will always be zero.  In this case we will
13337              eliminate the reference to A.
13338
13339              In both cases, we must search to see if we can find a previous
13340              use of A and put the death note there.  */
13341
13342           if (from_insn
13343               && from_insn == i2mod
13344               && !reg_overlap_mentioned_p (XEXP (note, 0), i2mod_new_rhs))
13345             tem = from_insn;
13346           else
13347             {
13348               if (from_insn
13349                   && CALL_P (from_insn)
13350                   && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
13351                 place = from_insn;
13352               else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
13353                 place = i3;
13354               else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
13355                        && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
13356                 place = i2;
13357               else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
13358                         && !(i2mod
13359                              && reg_overlap_mentioned_p (XEXP (note, 0),
13360                                                          i2mod_old_rhs)))
13361                        || rtx_equal_p (XEXP (note, 0), elim_i1)
13362                        || rtx_equal_p (XEXP (note, 0), elim_i0))
13363                 break;
13364               tem = i3;
13365             }
13366
13367           if (place == 0)
13368             {
13369               basic_block bb = this_basic_block;
13370
13371               for (tem = PREV_INSN (tem); place == 0; tem = PREV_INSN (tem))
13372                 {
13373                   if (!NONDEBUG_INSN_P (tem))
13374                     {
13375                       if (tem == BB_HEAD (bb))
13376                         break;
13377                       continue;
13378                     }
13379
13380                   /* If the register is being set at TEM, see if that is all
13381                      TEM is doing.  If so, delete TEM.  Otherwise, make this
13382                      into a REG_UNUSED note instead. Don't delete sets to
13383                      global register vars.  */
13384                   if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
13385                        || !global_regs[REGNO (XEXP (note, 0))])
13386                       && reg_set_p (XEXP (note, 0), PATTERN (tem)))
13387                     {
13388                       rtx set = single_set (tem);
13389                       rtx inner_dest = 0;
13390 #ifdef HAVE_cc0
13391                       rtx cc0_setter = NULL_RTX;
13392 #endif
13393
13394                       if (set != 0)
13395                         for (inner_dest = SET_DEST (set);
13396                              (GET_CODE (inner_dest) == STRICT_LOW_PART
13397                               || GET_CODE (inner_dest) == SUBREG
13398                               || GET_CODE (inner_dest) == ZERO_EXTRACT);
13399                              inner_dest = XEXP (inner_dest, 0))
13400                           ;
13401
13402                       /* Verify that it was the set, and not a clobber that
13403                          modified the register.
13404
13405                          CC0 targets must be careful to maintain setter/user
13406                          pairs.  If we cannot delete the setter due to side
13407                          effects, mark the user with an UNUSED note instead
13408                          of deleting it.  */
13409
13410                       if (set != 0 && ! side_effects_p (SET_SRC (set))
13411                           && rtx_equal_p (XEXP (note, 0), inner_dest)
13412 #ifdef HAVE_cc0
13413                           && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
13414                               || ((cc0_setter = prev_cc0_setter (tem)) != NULL
13415                                   && sets_cc0_p (PATTERN (cc0_setter)) > 0))
13416 #endif
13417                           )
13418                         {
13419                           /* Move the notes and links of TEM elsewhere.
13420                              This might delete other dead insns recursively.
13421                              First set the pattern to something that won't use
13422                              any register.  */
13423                           rtx old_notes = REG_NOTES (tem);
13424
13425                           PATTERN (tem) = pc_rtx;
13426                           REG_NOTES (tem) = NULL;
13427
13428                           distribute_notes (old_notes, tem, tem, NULL_RTX,
13429                                             NULL_RTX, NULL_RTX, NULL_RTX);
13430                           distribute_links (LOG_LINKS (tem));
13431
13432                           SET_INSN_DELETED (tem);
13433                           if (tem == i2)
13434                             i2 = NULL_RTX;
13435
13436 #ifdef HAVE_cc0
13437                           /* Delete the setter too.  */
13438                           if (cc0_setter)
13439                             {
13440                               PATTERN (cc0_setter) = pc_rtx;
13441                               old_notes = REG_NOTES (cc0_setter);
13442                               REG_NOTES (cc0_setter) = NULL;
13443
13444                               distribute_notes (old_notes, cc0_setter,
13445                                                 cc0_setter, NULL_RTX,
13446                                                 NULL_RTX, NULL_RTX, NULL_RTX);
13447                               distribute_links (LOG_LINKS (cc0_setter));
13448
13449                               SET_INSN_DELETED (cc0_setter);
13450                               if (cc0_setter == i2)
13451                                 i2 = NULL_RTX;
13452                             }
13453 #endif
13454                         }
13455                       else
13456                         {
13457                           PUT_REG_NOTE_KIND (note, REG_UNUSED);
13458
13459                           /*  If there isn't already a REG_UNUSED note, put one
13460                               here.  Do not place a REG_DEAD note, even if
13461                               the register is also used here; that would not
13462                               match the algorithm used in lifetime analysis
13463                               and can cause the consistency check in the
13464                               scheduler to fail.  */
13465                           if (! find_regno_note (tem, REG_UNUSED,
13466                                                  REGNO (XEXP (note, 0))))
13467                             place = tem;
13468                           break;
13469                         }
13470                     }
13471                   else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
13472                            || (CALL_P (tem)
13473                                && find_reg_fusage (tem, USE, XEXP (note, 0))))
13474                     {
13475                       place = tem;
13476
13477                       /* If we are doing a 3->2 combination, and we have a
13478                          register which formerly died in i3 and was not used
13479                          by i2, which now no longer dies in i3 and is used in
13480                          i2 but does not die in i2, and place is between i2
13481                          and i3, then we may need to move a link from place to
13482                          i2.  */
13483                       if (i2 && DF_INSN_LUID (place) > DF_INSN_LUID (i2)
13484                           && from_insn
13485                           && DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2)
13486                           && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
13487                         {
13488                           rtx links = LOG_LINKS (place);
13489                           LOG_LINKS (place) = 0;
13490                           distribute_links (links);
13491                         }
13492                       break;
13493                     }
13494
13495                   if (tem == BB_HEAD (bb))
13496                     break;
13497                 }
13498
13499             }
13500
13501           /* If the register is set or already dead at PLACE, we needn't do
13502              anything with this note if it is still a REG_DEAD note.
13503              We check here if it is set at all, not if is it totally replaced,
13504              which is what `dead_or_set_p' checks, so also check for it being
13505              set partially.  */
13506
13507           if (place && REG_NOTE_KIND (note) == REG_DEAD)
13508             {
13509               unsigned int regno = REGNO (XEXP (note, 0));
13510               reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, regno);
13511
13512               if (dead_or_set_p (place, XEXP (note, 0))
13513                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
13514                 {
13515                   /* Unless the register previously died in PLACE, clear
13516                      last_death.  [I no longer understand why this is
13517                      being done.] */
13518                   if (rsp->last_death != place)
13519                     rsp->last_death = 0;
13520                   place = 0;
13521                 }
13522               else
13523                 rsp->last_death = place;
13524
13525               /* If this is a death note for a hard reg that is occupying
13526                  multiple registers, ensure that we are still using all
13527                  parts of the object.  If we find a piece of the object
13528                  that is unused, we must arrange for an appropriate REG_DEAD
13529                  note to be added for it.  However, we can't just emit a USE
13530                  and tag the note to it, since the register might actually
13531                  be dead; so we recourse, and the recursive call then finds
13532                  the previous insn that used this register.  */
13533
13534               if (place && regno < FIRST_PSEUDO_REGISTER
13535                   && hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))] > 1)
13536                 {
13537                   unsigned int endregno = END_HARD_REGNO (XEXP (note, 0));
13538                   int all_used = 1;
13539                   unsigned int i;
13540
13541                   for (i = regno; i < endregno; i++)
13542                     if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
13543                          && ! find_regno_fusage (place, USE, i))
13544                         || dead_or_set_regno_p (place, i))
13545                       all_used = 0;
13546
13547                   if (! all_used)
13548                     {
13549                       /* Put only REG_DEAD notes for pieces that are
13550                          not already dead or set.  */
13551
13552                       for (i = regno; i < endregno;
13553                            i += hard_regno_nregs[i][reg_raw_mode[i]])
13554                         {
13555                           rtx piece = regno_reg_rtx[i];
13556                           basic_block bb = this_basic_block;
13557
13558                           if (! dead_or_set_p (place, piece)
13559                               && ! reg_bitfield_target_p (piece,
13560                                                           PATTERN (place)))
13561                             {
13562                               rtx new_note = alloc_reg_note (REG_DEAD, piece,
13563                                                              NULL_RTX);
13564
13565                               distribute_notes (new_note, place, place,
13566                                                 NULL_RTX, NULL_RTX, NULL_RTX,
13567                                                 NULL_RTX);
13568                             }
13569                           else if (! refers_to_regno_p (i, i + 1,
13570                                                         PATTERN (place), 0)
13571                                    && ! find_regno_fusage (place, USE, i))
13572                             for (tem = PREV_INSN (place); ;
13573                                  tem = PREV_INSN (tem))
13574                               {
13575                                 if (!NONDEBUG_INSN_P (tem))
13576                                   {
13577                                     if (tem == BB_HEAD (bb))
13578                                       break;
13579                                     continue;
13580                                   }
13581                                 if (dead_or_set_p (tem, piece)
13582                                     || reg_bitfield_target_p (piece,
13583                                                               PATTERN (tem)))
13584                                   {
13585                                     add_reg_note (tem, REG_UNUSED, piece);
13586                                     break;
13587                                   }
13588                               }
13589
13590                         }
13591
13592                       place = 0;
13593                     }
13594                 }
13595             }
13596           break;
13597
13598         default:
13599           /* Any other notes should not be present at this point in the
13600              compilation.  */
13601           gcc_unreachable ();
13602         }
13603
13604       if (place)
13605         {
13606           XEXP (note, 1) = REG_NOTES (place);
13607           REG_NOTES (place) = note;
13608         }
13609
13610       if (place2)
13611         add_reg_note (place2, REG_NOTE_KIND (note), XEXP (note, 0));
13612     }
13613 }
13614 \f
13615 /* Similarly to above, distribute the LOG_LINKS that used to be present on
13616    I3, I2, and I1 to new locations.  This is also called to add a link
13617    pointing at I3 when I3's destination is changed.  */
13618
13619 static void
13620 distribute_links (rtx links)
13621 {
13622   rtx link, next_link;
13623
13624   for (link = links; link; link = next_link)
13625     {
13626       rtx place = 0;
13627       rtx insn;
13628       rtx set, reg;
13629
13630       next_link = XEXP (link, 1);
13631
13632       /* If the insn that this link points to is a NOTE or isn't a single
13633          set, ignore it.  In the latter case, it isn't clear what we
13634          can do other than ignore the link, since we can't tell which
13635          register it was for.  Such links wouldn't be used by combine
13636          anyway.
13637
13638          It is not possible for the destination of the target of the link to
13639          have been changed by combine.  The only potential of this is if we
13640          replace I3, I2, and I1 by I3 and I2.  But in that case the
13641          destination of I2 also remains unchanged.  */
13642
13643       if (NOTE_P (XEXP (link, 0))
13644           || (set = single_set (XEXP (link, 0))) == 0)
13645         continue;
13646
13647       reg = SET_DEST (set);
13648       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
13649              || GET_CODE (reg) == STRICT_LOW_PART)
13650         reg = XEXP (reg, 0);
13651
13652       /* A LOG_LINK is defined as being placed on the first insn that uses
13653          a register and points to the insn that sets the register.  Start
13654          searching at the next insn after the target of the link and stop
13655          when we reach a set of the register or the end of the basic block.
13656
13657          Note that this correctly handles the link that used to point from
13658          I3 to I2.  Also note that not much searching is typically done here
13659          since most links don't point very far away.  */
13660
13661       for (insn = NEXT_INSN (XEXP (link, 0));
13662            (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
13663                      || BB_HEAD (this_basic_block->next_bb) != insn));
13664            insn = NEXT_INSN (insn))
13665         if (DEBUG_INSN_P (insn))
13666           continue;
13667         else if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
13668           {
13669             if (reg_referenced_p (reg, PATTERN (insn)))
13670               place = insn;
13671             break;
13672           }
13673         else if (CALL_P (insn)
13674                  && find_reg_fusage (insn, USE, reg))
13675           {
13676             place = insn;
13677             break;
13678           }
13679         else if (INSN_P (insn) && reg_set_p (reg, insn))
13680           break;
13681
13682       /* If we found a place to put the link, place it there unless there
13683          is already a link to the same insn as LINK at that point.  */
13684
13685       if (place)
13686         {
13687           rtx link2;
13688
13689           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
13690             if (XEXP (link2, 0) == XEXP (link, 0))
13691               break;
13692
13693           if (link2 == 0)
13694             {
13695               XEXP (link, 1) = LOG_LINKS (place);
13696               LOG_LINKS (place) = link;
13697
13698               /* Set added_links_insn to the earliest insn we added a
13699                  link to.  */
13700               if (added_links_insn == 0
13701                   || DF_INSN_LUID (added_links_insn) > DF_INSN_LUID (place))
13702                 added_links_insn = place;
13703             }
13704         }
13705     }
13706 }
13707 \f
13708 /* Subroutine of unmentioned_reg_p and callback from for_each_rtx.
13709    Check whether the expression pointer to by LOC is a register or
13710    memory, and if so return 1 if it isn't mentioned in the rtx EXPR.
13711    Otherwise return zero.  */
13712
13713 static int
13714 unmentioned_reg_p_1 (rtx *loc, void *expr)
13715 {
13716   rtx x = *loc;
13717
13718   if (x != NULL_RTX
13719       && (REG_P (x) || MEM_P (x))
13720       && ! reg_mentioned_p (x, (rtx) expr))
13721     return 1;
13722   return 0;
13723 }
13724
13725 /* Check for any register or memory mentioned in EQUIV that is not
13726    mentioned in EXPR.  This is used to restrict EQUIV to "specializations"
13727    of EXPR where some registers may have been replaced by constants.  */
13728
13729 static bool
13730 unmentioned_reg_p (rtx equiv, rtx expr)
13731 {
13732   return for_each_rtx (&equiv, unmentioned_reg_p_1, expr);
13733 }
13734 \f
13735 void
13736 dump_combine_stats (FILE *file)
13737 {
13738   fprintf
13739     (file,
13740      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
13741      combine_attempts, combine_merges, combine_extras, combine_successes);
13742 }
13743
13744 void
13745 dump_combine_total_stats (FILE *file)
13746 {
13747   fprintf
13748     (file,
13749      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
13750      total_attempts, total_merges, total_extras, total_successes);
13751 }
13752 \f
13753 static bool
13754 gate_handle_combine (void)
13755 {
13756   return (optimize > 0);
13757 }
13758
13759 /* Try combining insns through substitution.  */
13760 static unsigned int
13761 rest_of_handle_combine (void)
13762 {
13763   int rebuild_jump_labels_after_combine;
13764
13765   df_set_flags (DF_LR_RUN_DCE + DF_DEFER_INSN_RESCAN);
13766   df_note_add_problem ();
13767   df_analyze ();
13768
13769   regstat_init_n_sets_and_refs ();
13770
13771   rebuild_jump_labels_after_combine
13772     = combine_instructions (get_insns (), max_reg_num ());
13773
13774   /* Combining insns may have turned an indirect jump into a
13775      direct jump.  Rebuild the JUMP_LABEL fields of jumping
13776      instructions.  */
13777   if (rebuild_jump_labels_after_combine)
13778     {
13779       timevar_push (TV_JUMP);
13780       rebuild_jump_labels (get_insns ());
13781       cleanup_cfg (0);
13782       timevar_pop (TV_JUMP);
13783     }
13784
13785   regstat_free_n_sets_and_refs ();
13786   return 0;
13787 }
13788
13789 struct rtl_opt_pass pass_combine =
13790 {
13791  {
13792   RTL_PASS,
13793   "combine",                            /* name */
13794   gate_handle_combine,                  /* gate */
13795   rest_of_handle_combine,               /* execute */
13796   NULL,                                 /* sub */
13797   NULL,                                 /* next */
13798   0,                                    /* static_pass_number */
13799   TV_COMBINE,                           /* tv_id */
13800   PROP_cfglayout,                       /* properties_required */
13801   0,                                    /* properties_provided */
13802   0,                                    /* properties_destroyed */
13803   0,                                    /* todo_flags_start */
13804   TODO_dump_func |
13805   TODO_df_finish | TODO_verify_rtl_sharing |
13806   TODO_ggc_collect,                     /* todo_flags_finish */
13807  }
13808 };