OSDN Git Service

PR target/39558
[pf3gnuchains/gcc-fork.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This module is essentially the "combiner" phase of the U. of Arizona
23    Portable Optimizer, but redone to work on our list-structured
24    representation for RTL instead of their string representation.
25
26    The LOG_LINKS of each insn identify the most recent assignment
27    to each REG used in the insn.  It is a list of previous insns,
28    each of which contains a SET for a REG that is used in this insn
29    and not used or set in between.  LOG_LINKs never cross basic blocks.
30    They were set up by the preceding pass (lifetime analysis).
31
32    We try to combine each pair of insns joined by a logical link.
33    We also try to combine triples of insns A, B and C when
34    C has a link back to B and B has a link back to A.
35
36    LOG_LINKS does not have links for use of the CC0.  They don't
37    need to, because the insn that sets the CC0 is always immediately
38    before the insn that tests it.  So we always regard a branch
39    insn as having a logical link to the preceding insn.  The same is true
40    for an insn explicitly using CC0.
41
42    We check (with use_crosses_set_p) to avoid combining in such a way
43    as to move a computation to a place where its value would be different.
44
45    Combination is done by mathematically substituting the previous
46    insn(s) values for the regs they set into the expressions in
47    the later insns that refer to these regs.  If the result is a valid insn
48    for our target machine, according to the machine description,
49    we install it, delete the earlier insns, and update the data flow
50    information (LOG_LINKS and REG_NOTES) for what we did.
51
52    There are a few exceptions where the dataflow information isn't
53    completely updated (however this is only a local issue since it is
54    regenerated before the next pass that uses it):
55
56    - reg_live_length is not updated
57    - reg_n_refs is not adjusted in the rare case when a register is
58      no longer required in a computation
59    - there are extremely rare cases (see distribute_notes) when a
60      REG_DEAD note is lost
61    - a LOG_LINKS entry that refers to an insn with multiple SETs may be
62      removed because there is no way to know which register it was
63      linking
64
65    To simplify substitution, we combine only when the earlier insn(s)
66    consist of only a single assignment.  To simplify updating afterward,
67    we never combine when a subroutine call appears in the middle.
68
69    Since we do not represent assignments to CC0 explicitly except when that
70    is all an insn does, there is no LOG_LINKS entry in an insn that uses
71    the condition code for the insn that set the condition code.
72    Fortunately, these two insns must be consecutive.
73    Therefore, every JUMP_INSN is taken to have an implicit logical link
74    to the preceding insn.  This is not quite right, since non-jumps can
75    also use the condition code; but in practice such insns would not
76    combine anyway.  */
77
78 #include "config.h"
79 #include "system.h"
80 #include "coretypes.h"
81 #include "tm.h"
82 #include "rtl.h"
83 #include "tree.h"
84 #include "tm_p.h"
85 #include "flags.h"
86 #include "regs.h"
87 #include "hard-reg-set.h"
88 #include "basic-block.h"
89 #include "insn-config.h"
90 #include "function.h"
91 /* Include expr.h after insn-config.h so we get HAVE_conditional_move.  */
92 #include "expr.h"
93 #include "insn-attr.h"
94 #include "recog.h"
95 #include "real.h"
96 #include "toplev.h"
97 #include "target.h"
98 #include "optabs.h"
99 #include "insn-codes.h"
100 #include "rtlhooks-def.h"
101 /* Include output.h for dump_file.  */
102 #include "output.h"
103 #include "params.h"
104 #include "timevar.h"
105 #include "tree-pass.h"
106 #include "df.h"
107 #include "cgraph.h"
108
109 /* Number of attempts to combine instructions in this function.  */
110
111 static int combine_attempts;
112
113 /* Number of attempts that got as far as substitution in this function.  */
114
115 static int combine_merges;
116
117 /* Number of instructions combined with added SETs in this function.  */
118
119 static int combine_extras;
120
121 /* Number of instructions combined in this function.  */
122
123 static int combine_successes;
124
125 /* Totals over entire compilation.  */
126
127 static int total_attempts, total_merges, total_extras, total_successes;
128
129 /* combine_instructions may try to replace the right hand side of the
130    second instruction with the value of an associated REG_EQUAL note
131    before throwing it at try_combine.  That is problematic when there
132    is a REG_DEAD note for a register used in the old right hand side
133    and can cause distribute_notes to do wrong things.  This is the
134    second instruction if it has been so modified, null otherwise.  */
135
136 static rtx i2mod;
137
138 /* When I2MOD is nonnull, this is a copy of the old right hand side.  */
139
140 static rtx i2mod_old_rhs;
141
142 /* When I2MOD is nonnull, this is a copy of the new right hand side.  */
143
144 static rtx i2mod_new_rhs;
145 \f
146 typedef struct reg_stat_struct {
147   /* Record last point of death of (hard or pseudo) register n.  */
148   rtx                           last_death;
149
150   /* Record last point of modification of (hard or pseudo) register n.  */
151   rtx                           last_set;
152
153   /* The next group of fields allows the recording of the last value assigned
154      to (hard or pseudo) register n.  We use this information to see if an
155      operation being processed is redundant given a prior operation performed
156      on the register.  For example, an `and' with a constant is redundant if
157      all the zero bits are already known to be turned off.
158
159      We use an approach similar to that used by cse, but change it in the
160      following ways:
161
162      (1) We do not want to reinitialize at each label.
163      (2) It is useful, but not critical, to know the actual value assigned
164          to a register.  Often just its form is helpful.
165
166      Therefore, we maintain the following fields:
167
168      last_set_value             the last value assigned
169      last_set_label             records the value of label_tick when the
170                                 register was assigned
171      last_set_table_tick        records the value of label_tick when a
172                                 value using the register is assigned
173      last_set_invalid           set to nonzero when it is not valid
174                                 to use the value of this register in some
175                                 register's value
176
177      To understand the usage of these tables, it is important to understand
178      the distinction between the value in last_set_value being valid and
179      the register being validly contained in some other expression in the
180      table.
181
182      (The next two parameters are out of date).
183
184      reg_stat[i].last_set_value is valid if it is nonzero, and either
185      reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
186
187      Register I may validly appear in any expression returned for the value
188      of another register if reg_n_sets[i] is 1.  It may also appear in the
189      value for register J if reg_stat[j].last_set_invalid is zero, or
190      reg_stat[i].last_set_label < reg_stat[j].last_set_label.
191
192      If an expression is found in the table containing a register which may
193      not validly appear in an expression, the register is replaced by
194      something that won't match, (clobber (const_int 0)).  */
195
196   /* Record last value assigned to (hard or pseudo) register n.  */
197
198   rtx                           last_set_value;
199
200   /* Record the value of label_tick when an expression involving register n
201      is placed in last_set_value.  */
202
203   int                           last_set_table_tick;
204
205   /* Record the value of label_tick when the value for register n is placed in
206      last_set_value.  */
207
208   int                           last_set_label;
209
210   /* These fields are maintained in parallel with last_set_value and are
211      used to store the mode in which the register was last set, the bits
212      that were known to be zero when it was last set, and the number of
213      sign bits copies it was known to have when it was last set.  */
214
215   unsigned HOST_WIDE_INT        last_set_nonzero_bits;
216   char                          last_set_sign_bit_copies;
217   ENUM_BITFIELD(machine_mode)   last_set_mode : 8;
218
219   /* Set nonzero if references to register n in expressions should not be
220      used.  last_set_invalid is set nonzero when this register is being
221      assigned to and last_set_table_tick == label_tick.  */
222
223   char                          last_set_invalid;
224
225   /* Some registers that are set more than once and used in more than one
226      basic block are nevertheless always set in similar ways.  For example,
227      a QImode register may be loaded from memory in two places on a machine
228      where byte loads zero extend.
229
230      We record in the following fields if a register has some leading bits
231      that are always equal to the sign bit, and what we know about the
232      nonzero bits of a register, specifically which bits are known to be
233      zero.
234
235      If an entry is zero, it means that we don't know anything special.  */
236
237   unsigned char                 sign_bit_copies;
238
239   unsigned HOST_WIDE_INT        nonzero_bits;
240
241   /* Record the value of the label_tick when the last truncation
242      happened.  The field truncated_to_mode is only valid if
243      truncation_label == label_tick.  */
244
245   int                           truncation_label;
246
247   /* Record the last truncation seen for this register.  If truncation
248      is not a nop to this mode we might be able to save an explicit
249      truncation if we know that value already contains a truncated
250      value.  */
251
252   ENUM_BITFIELD(machine_mode)   truncated_to_mode : 8;
253 } reg_stat_type;
254
255 DEF_VEC_O(reg_stat_type);
256 DEF_VEC_ALLOC_O(reg_stat_type,heap);
257
258 static VEC(reg_stat_type,heap) *reg_stat;
259
260 /* Record the luid of the last insn that invalidated memory
261    (anything that writes memory, and subroutine calls, but not pushes).  */
262
263 static int mem_last_set;
264
265 /* Record the luid of the last CALL_INSN
266    so we can tell whether a potential combination crosses any calls.  */
267
268 static int last_call_luid;
269
270 /* When `subst' is called, this is the insn that is being modified
271    (by combining in a previous insn).  The PATTERN of this insn
272    is still the old pattern partially modified and it should not be
273    looked at, but this may be used to examine the successors of the insn
274    to judge whether a simplification is valid.  */
275
276 static rtx subst_insn;
277
278 /* This is the lowest LUID that `subst' is currently dealing with.
279    get_last_value will not return a value if the register was set at or
280    after this LUID.  If not for this mechanism, we could get confused if
281    I2 or I1 in try_combine were an insn that used the old value of a register
282    to obtain a new value.  In that case, we might erroneously get the
283    new value of the register when we wanted the old one.  */
284
285 static int subst_low_luid;
286
287 /* This contains any hard registers that are used in newpat; reg_dead_at_p
288    must consider all these registers to be always live.  */
289
290 static HARD_REG_SET newpat_used_regs;
291
292 /* This is an insn to which a LOG_LINKS entry has been added.  If this
293    insn is the earlier than I2 or I3, combine should rescan starting at
294    that location.  */
295
296 static rtx added_links_insn;
297
298 /* Basic block in which we are performing combines.  */
299 static basic_block this_basic_block;
300 static bool optimize_this_for_speed_p;
301
302 \f
303 /* Length of the currently allocated uid_insn_cost array.  */
304
305 static int max_uid_known;
306
307 /* The following array records the insn_rtx_cost for every insn
308    in the instruction stream.  */
309
310 static int *uid_insn_cost;
311
312 /* The following array records the LOG_LINKS for every insn in the
313    instruction stream as an INSN_LIST rtx.  */
314
315 static rtx *uid_log_links;
316
317 #define INSN_COST(INSN)         (uid_insn_cost[INSN_UID (INSN)])
318 #define LOG_LINKS(INSN)         (uid_log_links[INSN_UID (INSN)])
319
320 /* Incremented for each basic block.  */
321
322 static int label_tick;
323
324 /* Reset to label_tick for each label.  */
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 struct undo
346 {
347   struct undo *next;
348   enum { UNDO_RTX, UNDO_INT, UNDO_MODE } kind;
349   union { rtx r; int i; enum machine_mode m; } old_contents;
350   union { rtx *r; int *i; } where;
351 };
352
353 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
354    num_undo says how many are currently recorded.
355
356    other_insn is nonzero if we have modified some other insn in the process
357    of working on subst_insn.  It must be verified too.  */
358
359 struct undobuf
360 {
361   struct undo *undos;
362   struct undo *frees;
363   rtx other_insn;
364 };
365
366 static struct undobuf undobuf;
367
368 /* Number of times the pseudo being substituted for
369    was found and replaced.  */
370
371 static int n_occurrences;
372
373 static rtx reg_nonzero_bits_for_combine (const_rtx, enum machine_mode, const_rtx,
374                                          enum machine_mode,
375                                          unsigned HOST_WIDE_INT,
376                                          unsigned HOST_WIDE_INT *);
377 static rtx reg_num_sign_bit_copies_for_combine (const_rtx, enum machine_mode, const_rtx,
378                                                 enum machine_mode,
379                                                 unsigned int, unsigned int *);
380 static void do_SUBST (rtx *, rtx);
381 static void do_SUBST_INT (int *, int);
382 static void init_reg_last (void);
383 static void setup_incoming_promotions (rtx);
384 static void set_nonzero_bits_and_sign_copies (rtx, const_rtx, void *);
385 static int cant_combine_insn_p (rtx);
386 static int can_combine_p (rtx, rtx, rtx, rtx, rtx *, rtx *);
387 static int combinable_i3pat (rtx, rtx *, rtx, rtx, int, rtx *);
388 static int contains_muldiv (rtx);
389 static rtx try_combine (rtx, rtx, rtx, int *);
390 static void undo_all (void);
391 static void undo_commit (void);
392 static rtx *find_split_point (rtx *, rtx);
393 static rtx subst (rtx, rtx, rtx, int, int);
394 static rtx combine_simplify_rtx (rtx, enum machine_mode, int);
395 static rtx simplify_if_then_else (rtx);
396 static rtx simplify_set (rtx);
397 static rtx simplify_logical (rtx);
398 static rtx expand_compound_operation (rtx);
399 static const_rtx expand_field_assignment (const_rtx);
400 static rtx make_extraction (enum machine_mode, rtx, HOST_WIDE_INT,
401                             rtx, unsigned HOST_WIDE_INT, int, int, int);
402 static rtx extract_left_shift (rtx, int);
403 static rtx make_compound_operation (rtx, enum rtx_code);
404 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
405                               unsigned HOST_WIDE_INT *);
406 static rtx canon_reg_for_combine (rtx, rtx);
407 static rtx force_to_mode (rtx, enum machine_mode,
408                           unsigned HOST_WIDE_INT, int);
409 static rtx if_then_else_cond (rtx, rtx *, rtx *);
410 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
411 static int rtx_equal_for_field_assignment_p (rtx, rtx);
412 static rtx make_field_assignment (rtx);
413 static rtx apply_distributive_law (rtx);
414 static rtx distribute_and_simplify_rtx (rtx, int);
415 static rtx simplify_and_const_int_1 (enum machine_mode, rtx,
416                                      unsigned HOST_WIDE_INT);
417 static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
418                                    unsigned HOST_WIDE_INT);
419 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
420                             HOST_WIDE_INT, enum machine_mode, int *);
421 static rtx simplify_shift_const_1 (enum rtx_code, enum machine_mode, rtx, int);
422 static rtx simplify_shift_const (rtx, enum rtx_code, enum machine_mode, rtx,
423                                  int);
424 static int recog_for_combine (rtx *, rtx, rtx *);
425 static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
426 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
427 static void update_table_tick (rtx);
428 static void record_value_for_reg (rtx, rtx, rtx);
429 static void check_promoted_subreg (rtx, rtx);
430 static void record_dead_and_set_regs_1 (rtx, const_rtx, void *);
431 static void record_dead_and_set_regs (rtx);
432 static int get_last_value_validate (rtx *, rtx, int, int);
433 static rtx get_last_value (const_rtx);
434 static int use_crosses_set_p (const_rtx, int);
435 static void reg_dead_at_p_1 (rtx, const_rtx, void *);
436 static int reg_dead_at_p (rtx, rtx);
437 static void move_deaths (rtx, rtx, int, rtx, rtx *);
438 static int reg_bitfield_target_p (rtx, rtx);
439 static void distribute_notes (rtx, rtx, rtx, rtx, rtx, rtx);
440 static void distribute_links (rtx);
441 static void mark_used_regs_combine (rtx);
442 static void record_promoted_value (rtx, rtx);
443 static int unmentioned_reg_p_1 (rtx *, void *);
444 static bool unmentioned_reg_p (rtx, rtx);
445 static int record_truncated_value (rtx *, void *);
446 static void record_truncated_values (rtx *, void *);
447 static bool reg_truncated_to_mode (enum machine_mode, const_rtx);
448 static rtx gen_lowpart_or_truncate (enum machine_mode, rtx);
449 \f
450
451 /* It is not safe to use ordinary gen_lowpart in combine.
452    See comments in gen_lowpart_for_combine.  */
453 #undef RTL_HOOKS_GEN_LOWPART
454 #define RTL_HOOKS_GEN_LOWPART              gen_lowpart_for_combine
455
456 /* Our implementation of gen_lowpart never emits a new pseudo.  */
457 #undef RTL_HOOKS_GEN_LOWPART_NO_EMIT
458 #define RTL_HOOKS_GEN_LOWPART_NO_EMIT      gen_lowpart_for_combine
459
460 #undef RTL_HOOKS_REG_NONZERO_REG_BITS
461 #define RTL_HOOKS_REG_NONZERO_REG_BITS     reg_nonzero_bits_for_combine
462
463 #undef RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES
464 #define RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES  reg_num_sign_bit_copies_for_combine
465
466 #undef RTL_HOOKS_REG_TRUNCATED_TO_MODE
467 #define RTL_HOOKS_REG_TRUNCATED_TO_MODE    reg_truncated_to_mode
468
469 static const struct rtl_hooks combine_rtl_hooks = RTL_HOOKS_INITIALIZER;
470
471 \f
472 /* Try to split PATTERN found in INSN.  This returns NULL_RTX if
473    PATTERN can not be split.  Otherwise, it returns an insn sequence.
474    This is a wrapper around split_insns which ensures that the
475    reg_stat vector is made larger if the splitter creates a new
476    register.  */
477
478 static rtx
479 combine_split_insns (rtx pattern, rtx insn)
480 {
481   rtx ret;
482   unsigned int nregs;
483
484   ret = split_insns (pattern, insn);
485   nregs = max_reg_num ();
486   if (nregs > VEC_length (reg_stat_type, reg_stat))
487     VEC_safe_grow_cleared (reg_stat_type, heap, reg_stat, nregs);
488   return ret;
489 }
490
491 /* This is used by find_single_use to locate an rtx in LOC that
492    contains exactly one use of DEST, which is typically either a REG
493    or CC0.  It returns a pointer to the innermost rtx expression
494    containing DEST.  Appearances of DEST that are being used to
495    totally replace it are not counted.  */
496
497 static rtx *
498 find_single_use_1 (rtx dest, rtx *loc)
499 {
500   rtx x = *loc;
501   enum rtx_code code = GET_CODE (x);
502   rtx *result = NULL;
503   rtx *this_result;
504   int i;
505   const char *fmt;
506
507   switch (code)
508     {
509     case CONST_INT:
510     case CONST:
511     case LABEL_REF:
512     case SYMBOL_REF:
513     case CONST_DOUBLE:
514     case CONST_VECTOR:
515     case CLOBBER:
516       return 0;
517
518     case SET:
519       /* If the destination is anything other than CC0, PC, a REG or a SUBREG
520          of a REG that occupies all of the REG, the insn uses DEST if
521          it is mentioned in the destination or the source.  Otherwise, we
522          need just check the source.  */
523       if (GET_CODE (SET_DEST (x)) != CC0
524           && GET_CODE (SET_DEST (x)) != PC
525           && !REG_P (SET_DEST (x))
526           && ! (GET_CODE (SET_DEST (x)) == SUBREG
527                 && REG_P (SUBREG_REG (SET_DEST (x)))
528                 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
529                       + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
530                     == ((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
531                          + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
532         break;
533
534       return find_single_use_1 (dest, &SET_SRC (x));
535
536     case MEM:
537     case SUBREG:
538       return find_single_use_1 (dest, &XEXP (x, 0));
539
540     default:
541       break;
542     }
543
544   /* If it wasn't one of the common cases above, check each expression and
545      vector of this code.  Look for a unique usage of DEST.  */
546
547   fmt = GET_RTX_FORMAT (code);
548   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
549     {
550       if (fmt[i] == 'e')
551         {
552           if (dest == XEXP (x, i)
553               || (REG_P (dest) && REG_P (XEXP (x, i))
554                   && REGNO (dest) == REGNO (XEXP (x, i))))
555             this_result = loc;
556           else
557             this_result = find_single_use_1 (dest, &XEXP (x, i));
558
559           if (result == NULL)
560             result = this_result;
561           else if (this_result)
562             /* Duplicate usage.  */
563             return NULL;
564         }
565       else if (fmt[i] == 'E')
566         {
567           int j;
568
569           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
570             {
571               if (XVECEXP (x, i, j) == dest
572                   || (REG_P (dest)
573                       && REG_P (XVECEXP (x, i, j))
574                       && REGNO (XVECEXP (x, i, j)) == REGNO (dest)))
575                 this_result = loc;
576               else
577                 this_result = find_single_use_1 (dest, &XVECEXP (x, i, j));
578
579               if (result == NULL)
580                 result = this_result;
581               else if (this_result)
582                 return NULL;
583             }
584         }
585     }
586
587   return result;
588 }
589
590
591 /* See if DEST, produced in INSN, is used only a single time in the
592    sequel.  If so, return a pointer to the innermost rtx expression in which
593    it is used.
594
595    If PLOC is nonzero, *PLOC is set to the insn containing the single use.
596
597    If DEST is cc0_rtx, we look only at the next insn.  In that case, we don't
598    care about REG_DEAD notes or LOG_LINKS.
599
600    Otherwise, we find the single use by finding an insn that has a
601    LOG_LINKS pointing at INSN and has a REG_DEAD note for DEST.  If DEST is
602    only referenced once in that insn, we know that it must be the first
603    and last insn referencing DEST.  */
604
605 static rtx *
606 find_single_use (rtx dest, rtx insn, rtx *ploc)
607 {
608   basic_block bb;
609   rtx next;
610   rtx *result;
611   rtx link;
612
613 #ifdef HAVE_cc0
614   if (dest == cc0_rtx)
615     {
616       next = NEXT_INSN (insn);
617       if (next == 0
618           || (!NONJUMP_INSN_P (next) && !JUMP_P (next)))
619         return 0;
620
621       result = find_single_use_1 (dest, &PATTERN (next));
622       if (result && ploc)
623         *ploc = next;
624       return result;
625     }
626 #endif
627
628   if (!REG_P (dest))
629     return 0;
630
631   bb = BLOCK_FOR_INSN (insn);
632   for (next = NEXT_INSN (insn);
633        next && BLOCK_FOR_INSN (next) == bb;
634        next = NEXT_INSN (next))
635     if (INSN_P (next) && dead_or_set_p (next, dest))
636       {
637         for (link = LOG_LINKS (next); link; link = XEXP (link, 1))
638           if (XEXP (link, 0) == insn)
639             break;
640
641         if (link)
642           {
643             result = find_single_use_1 (dest, &PATTERN (next));
644             if (ploc)
645               *ploc = next;
646             return result;
647           }
648       }
649
650   return 0;
651 }
652 \f
653 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
654    insn.  The substitution can be undone by undo_all.  If INTO is already
655    set to NEWVAL, do not record this change.  Because computing NEWVAL might
656    also call SUBST, we have to compute it before we put anything into
657    the undo table.  */
658
659 static void
660 do_SUBST (rtx *into, rtx newval)
661 {
662   struct undo *buf;
663   rtx oldval = *into;
664
665   if (oldval == newval)
666     return;
667
668   /* We'd like to catch as many invalid transformations here as
669      possible.  Unfortunately, there are way too many mode changes
670      that are perfectly valid, so we'd waste too much effort for
671      little gain doing the checks here.  Focus on catching invalid
672      transformations involving integer constants.  */
673   if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
674       && GET_CODE (newval) == CONST_INT)
675     {
676       /* Sanity check that we're replacing oldval with a CONST_INT
677          that is a valid sign-extension for the original mode.  */
678       gcc_assert (INTVAL (newval)
679                   == trunc_int_for_mode (INTVAL (newval), GET_MODE (oldval)));
680
681       /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
682          CONST_INT is not valid, because after the replacement, the
683          original mode would be gone.  Unfortunately, we can't tell
684          when do_SUBST is called to replace the operand thereof, so we
685          perform this test on oldval instead, checking whether an
686          invalid replacement took place before we got here.  */
687       gcc_assert (!(GET_CODE (oldval) == SUBREG
688                     && GET_CODE (SUBREG_REG (oldval)) == CONST_INT));
689       gcc_assert (!(GET_CODE (oldval) == ZERO_EXTEND
690                     && GET_CODE (XEXP (oldval, 0)) == CONST_INT));
691     }
692
693   if (undobuf.frees)
694     buf = undobuf.frees, undobuf.frees = buf->next;
695   else
696     buf = XNEW (struct undo);
697
698   buf->kind = UNDO_RTX;
699   buf->where.r = into;
700   buf->old_contents.r = oldval;
701   *into = newval;
702
703   buf->next = undobuf.undos, undobuf.undos = buf;
704 }
705
706 #define SUBST(INTO, NEWVAL)     do_SUBST(&(INTO), (NEWVAL))
707
708 /* Similar to SUBST, but NEWVAL is an int expression.  Note that substitution
709    for the value of a HOST_WIDE_INT value (including CONST_INT) is
710    not safe.  */
711
712 static void
713 do_SUBST_INT (int *into, int newval)
714 {
715   struct undo *buf;
716   int oldval = *into;
717
718   if (oldval == newval)
719     return;
720
721   if (undobuf.frees)
722     buf = undobuf.frees, undobuf.frees = buf->next;
723   else
724     buf = XNEW (struct undo);
725
726   buf->kind = UNDO_INT;
727   buf->where.i = into;
728   buf->old_contents.i = oldval;
729   *into = newval;
730
731   buf->next = undobuf.undos, undobuf.undos = buf;
732 }
733
734 #define SUBST_INT(INTO, NEWVAL)  do_SUBST_INT(&(INTO), (NEWVAL))
735
736 /* Similar to SUBST, but just substitute the mode.  This is used when
737    changing the mode of a pseudo-register, so that any other
738    references to the entry in the regno_reg_rtx array will change as
739    well.  */
740
741 static void
742 do_SUBST_MODE (rtx *into, enum machine_mode newval)
743 {
744   struct undo *buf;
745   enum machine_mode oldval = GET_MODE (*into);
746
747   if (oldval == newval)
748     return;
749
750   if (undobuf.frees)
751     buf = undobuf.frees, undobuf.frees = buf->next;
752   else
753     buf = XNEW (struct undo);
754
755   buf->kind = UNDO_MODE;
756   buf->where.r = into;
757   buf->old_contents.m = oldval;
758   adjust_reg_mode (*into, newval);
759
760   buf->next = undobuf.undos, undobuf.undos = buf;
761 }
762
763 #define SUBST_MODE(INTO, NEWVAL)  do_SUBST_MODE(&(INTO), (NEWVAL))
764 \f
765 /* Subroutine of try_combine.  Determine whether the combine replacement
766    patterns NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to
767    insn_rtx_cost that the original instruction sequence I1, I2, I3 and
768    undobuf.other_insn.  Note that I1 and/or NEWI2PAT may be NULL_RTX. 
769    NEWOTHERPAT and undobuf.other_insn may also both be NULL_RTX.  This
770    function returns false, if the costs of all instructions can be
771    estimated, and the replacements are more expensive than the original
772    sequence.  */
773
774 static bool
775 combine_validate_cost (rtx i1, rtx i2, rtx i3, rtx newpat, rtx newi2pat,
776                        rtx newotherpat)
777 {
778   int i1_cost, i2_cost, i3_cost;
779   int new_i2_cost, new_i3_cost;
780   int old_cost, new_cost;
781
782   /* Lookup the original insn_rtx_costs.  */
783   i2_cost = INSN_COST (i2);
784   i3_cost = INSN_COST (i3);
785
786   if (i1)
787     {
788       i1_cost = INSN_COST (i1);
789       old_cost = (i1_cost > 0 && i2_cost > 0 && i3_cost > 0)
790                  ? i1_cost + i2_cost + i3_cost : 0;
791     }
792   else
793     {
794       old_cost = (i2_cost > 0 && i3_cost > 0) ? i2_cost + i3_cost : 0;
795       i1_cost = 0;
796     }
797
798   /* Calculate the replacement insn_rtx_costs.  */
799   new_i3_cost = insn_rtx_cost (newpat, optimize_this_for_speed_p);
800   if (newi2pat)
801     {
802       new_i2_cost = insn_rtx_cost (newi2pat, optimize_this_for_speed_p);
803       new_cost = (new_i2_cost > 0 && new_i3_cost > 0)
804                  ? new_i2_cost + new_i3_cost : 0;
805     }
806   else
807     {
808       new_cost = new_i3_cost;
809       new_i2_cost = 0;
810     }
811
812   if (undobuf.other_insn)
813     {
814       int old_other_cost, new_other_cost;
815
816       old_other_cost = INSN_COST (undobuf.other_insn);
817       new_other_cost = insn_rtx_cost (newotherpat, optimize_this_for_speed_p);
818       if (old_other_cost > 0 && new_other_cost > 0)
819         {
820           old_cost += old_other_cost;
821           new_cost += new_other_cost;
822         }
823       else
824         old_cost = 0;
825     }
826
827   /* Disallow this recombination if both new_cost and old_cost are
828      greater than zero, and new_cost is greater than old cost.  */
829   if (old_cost > 0
830       && new_cost > old_cost)
831     {
832       if (dump_file)
833         {
834           if (i1)
835             {
836               fprintf (dump_file,
837                        "rejecting combination of insns %d, %d and %d\n",
838                        INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
839               fprintf (dump_file, "original costs %d + %d + %d = %d\n",
840                        i1_cost, i2_cost, i3_cost, old_cost);
841             }
842           else
843             {
844               fprintf (dump_file,
845                        "rejecting combination of insns %d and %d\n",
846                        INSN_UID (i2), INSN_UID (i3));
847               fprintf (dump_file, "original costs %d + %d = %d\n",
848                        i2_cost, i3_cost, old_cost);
849             }
850
851           if (newi2pat)
852             {
853               fprintf (dump_file, "replacement costs %d + %d = %d\n",
854                        new_i2_cost, new_i3_cost, new_cost);
855             }
856           else
857             fprintf (dump_file, "replacement cost %d\n", new_cost);
858         }
859
860       return false;
861     }
862
863   /* Update the uid_insn_cost array with the replacement costs.  */
864   INSN_COST (i2) = new_i2_cost;
865   INSN_COST (i3) = new_i3_cost;
866   if (i1)
867     INSN_COST (i1) = 0;
868
869   return true;
870 }
871
872
873 /* Delete any insns that copy a register to itself.  */
874
875 static void
876 delete_noop_moves (void)
877 {
878   rtx insn, next;
879   basic_block bb;
880
881   FOR_EACH_BB (bb)
882     {
883       for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next)
884         {
885           next = NEXT_INSN (insn);
886           if (INSN_P (insn) && noop_move_p (insn))
887             {
888               if (dump_file)
889                 fprintf (dump_file, "deleting noop move %d\n", INSN_UID (insn));
890
891               delete_insn_and_edges (insn);
892             }
893         }
894     }
895 }
896
897 \f
898 /* Fill in log links field for all insns.  */
899
900 static void
901 create_log_links (void)
902 {
903   basic_block bb;
904   rtx *next_use, insn;
905   df_ref *def_vec, *use_vec;
906
907   next_use = XCNEWVEC (rtx, max_reg_num ());
908
909   /* Pass through each block from the end, recording the uses of each
910      register and establishing log links when def is encountered.
911      Note that we do not clear next_use array in order to save time,
912      so we have to test whether the use is in the same basic block as def.
913               
914      There are a few cases below when we do not consider the definition or
915      usage -- these are taken from original flow.c did. Don't ask me why it is
916      done this way; I don't know and if it works, I don't want to know.  */
917
918   FOR_EACH_BB (bb)
919     {
920       FOR_BB_INSNS_REVERSE (bb, insn)
921         {
922           if (!INSN_P (insn))
923             continue;
924
925           /* Log links are created only once.  */
926           gcc_assert (!LOG_LINKS (insn));
927
928           for (def_vec = DF_INSN_DEFS (insn); *def_vec; def_vec++)
929             {
930               df_ref def = *def_vec;
931               int regno = DF_REF_REGNO (def);
932               rtx use_insn;
933
934               if (!next_use[regno])
935                 continue;
936
937               /* Do not consider if it is pre/post modification in MEM.  */
938               if (DF_REF_FLAGS (def) & DF_REF_PRE_POST_MODIFY)
939                 continue;
940
941               /* Do not make the log link for frame pointer.  */
942               if ((regno == FRAME_POINTER_REGNUM
943                    && (! reload_completed || frame_pointer_needed))
944 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
945                   || (regno == HARD_FRAME_POINTER_REGNUM
946                       && (! reload_completed || frame_pointer_needed))
947 #endif
948 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
949                   || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
950 #endif
951                   )
952                 continue;
953
954               use_insn = next_use[regno];
955               if (BLOCK_FOR_INSN (use_insn) == bb)
956                 {
957                   /* flow.c claimed:
958
959                      We don't build a LOG_LINK for hard registers contained
960                      in ASM_OPERANDs.  If these registers get replaced,
961                      we might wind up changing the semantics of the insn,
962                      even if reload can make what appear to be valid
963                      assignments later.  */
964                   if (regno >= FIRST_PSEUDO_REGISTER
965                       || asm_noperands (PATTERN (use_insn)) < 0)
966                     {
967                       /* Don't add duplicate links between instructions.  */
968                       rtx links;
969                       for (links = LOG_LINKS (use_insn); links;
970                            links = XEXP (links, 1))
971                         if (insn == XEXP (links, 0))
972                           break;
973
974                       if (!links)
975                         LOG_LINKS (use_insn) =
976                           alloc_INSN_LIST (insn, LOG_LINKS (use_insn));
977                     }
978                 }
979               next_use[regno] = NULL_RTX;
980             }
981
982           for (use_vec = DF_INSN_USES (insn); *use_vec; use_vec++)
983             {
984               df_ref use = *use_vec;
985               int regno = DF_REF_REGNO (use);
986
987               /* Do not consider the usage of the stack pointer
988                  by function call.  */
989               if (DF_REF_FLAGS (use) & DF_REF_CALL_STACK_USAGE)
990                 continue;
991
992               next_use[regno] = insn;
993             }
994         }
995     }
996
997   free (next_use);
998 }
999
1000 /* Clear LOG_LINKS fields of insns.  */
1001
1002 static void
1003 clear_log_links (void)
1004 {
1005   rtx insn;
1006
1007   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1008     if (INSN_P (insn))
1009       free_INSN_LIST_list (&LOG_LINKS (insn));
1010 }
1011
1012
1013
1014 \f
1015 /* Main entry point for combiner.  F is the first insn of the function.
1016    NREGS is the first unused pseudo-reg number.
1017
1018    Return nonzero if the combiner has turned an indirect jump
1019    instruction into a direct jump.  */
1020 static int
1021 combine_instructions (rtx f, unsigned int nregs)
1022 {
1023   rtx insn, next;
1024 #ifdef HAVE_cc0
1025   rtx prev;
1026 #endif
1027   rtx links, nextlinks;
1028   rtx first;
1029
1030   int new_direct_jump_p = 0;
1031
1032   for (first = f; first && !INSN_P (first); )
1033     first = NEXT_INSN (first);
1034   if (!first)
1035     return 0;
1036
1037   combine_attempts = 0;
1038   combine_merges = 0;
1039   combine_extras = 0;
1040   combine_successes = 0;
1041
1042   rtl_hooks = combine_rtl_hooks;
1043
1044   VEC_safe_grow_cleared (reg_stat_type, heap, reg_stat, nregs);
1045
1046   init_recog_no_volatile ();
1047
1048   /* Allocate array for insn info.  */
1049   max_uid_known = get_max_uid ();
1050   uid_log_links = XCNEWVEC (rtx, max_uid_known + 1);
1051   uid_insn_cost = XCNEWVEC (int, max_uid_known + 1);
1052
1053   nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
1054
1055   /* Don't use reg_stat[].nonzero_bits when computing it.  This can cause
1056      problems when, for example, we have j <<= 1 in a loop.  */
1057
1058   nonzero_sign_valid = 0;
1059
1060   /* Scan all SETs and see if we can deduce anything about what
1061      bits are known to be zero for some registers and how many copies
1062      of the sign bit are known to exist for those registers.
1063
1064      Also set any known values so that we can use it while searching
1065      for what bits are known to be set.  */
1066
1067   setup_incoming_promotions (first);
1068
1069   create_log_links ();
1070   label_tick_ebb_start = ENTRY_BLOCK_PTR->index;
1071   FOR_EACH_BB (this_basic_block)
1072     {
1073       optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1074       last_call_luid = 0;
1075       mem_last_set = -1;
1076       label_tick = this_basic_block->index;
1077       if (!single_pred_p (this_basic_block)
1078           || single_pred (this_basic_block)->index != label_tick - 1)
1079         label_tick_ebb_start = label_tick;
1080       FOR_BB_INSNS (this_basic_block, insn)
1081         if (INSN_P (insn) && BLOCK_FOR_INSN (insn))
1082           {
1083             subst_low_luid = DF_INSN_LUID (insn);
1084             subst_insn = insn;
1085
1086             note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
1087                          insn);
1088             record_dead_and_set_regs (insn);
1089
1090 #ifdef AUTO_INC_DEC
1091             for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
1092               if (REG_NOTE_KIND (links) == REG_INC)
1093                 set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
1094                                                   insn);
1095 #endif
1096
1097             /* Record the current insn_rtx_cost of this instruction.  */
1098             if (NONJUMP_INSN_P (insn))
1099               INSN_COST (insn) = insn_rtx_cost (PATTERN (insn),
1100                                                 optimize_this_for_speed_p);
1101             if (dump_file)
1102               fprintf(dump_file, "insn_cost %d: %d\n",
1103                     INSN_UID (insn), INSN_COST (insn));
1104           }
1105     }
1106
1107   nonzero_sign_valid = 1;
1108
1109   /* Now scan all the insns in forward order.  */
1110
1111   label_tick_ebb_start = ENTRY_BLOCK_PTR->index;
1112   init_reg_last ();
1113   setup_incoming_promotions (first);
1114
1115   FOR_EACH_BB (this_basic_block)
1116     {
1117       optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1118       last_call_luid = 0;
1119       mem_last_set = -1;
1120       label_tick = this_basic_block->index;
1121       if (!single_pred_p (this_basic_block)
1122           || single_pred (this_basic_block)->index != label_tick - 1)
1123         label_tick_ebb_start = label_tick;
1124       rtl_profile_for_bb (this_basic_block);
1125       for (insn = BB_HEAD (this_basic_block);
1126            insn != NEXT_INSN (BB_END (this_basic_block));
1127            insn = next ? next : NEXT_INSN (insn))
1128         {
1129           next = 0;
1130           if (INSN_P (insn))
1131             {
1132               /* See if we know about function return values before this
1133                  insn based upon SUBREG flags.  */
1134               check_promoted_subreg (insn, PATTERN (insn));
1135
1136               /* See if we can find hardregs and subreg of pseudos in
1137                  narrower modes.  This could help turning TRUNCATEs
1138                  into SUBREGs.  */
1139               note_uses (&PATTERN (insn), record_truncated_values, NULL);
1140
1141               /* Try this insn with each insn it links back to.  */
1142
1143               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1144                 if ((next = try_combine (insn, XEXP (links, 0),
1145                                          NULL_RTX, &new_direct_jump_p)) != 0)
1146                   goto retry;
1147
1148               /* Try each sequence of three linked insns ending with this one.  */
1149
1150               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1151                 {
1152                   rtx link = XEXP (links, 0);
1153
1154                   /* If the linked insn has been replaced by a note, then there
1155                      is no point in pursuing this chain any further.  */
1156                   if (NOTE_P (link))
1157                     continue;
1158
1159                   for (nextlinks = LOG_LINKS (link);
1160                        nextlinks;
1161                        nextlinks = XEXP (nextlinks, 1))
1162                     if ((next = try_combine (insn, link,
1163                                              XEXP (nextlinks, 0),
1164                                              &new_direct_jump_p)) != 0)
1165                       goto retry;
1166                 }
1167
1168 #ifdef HAVE_cc0
1169               /* Try to combine a jump insn that uses CC0
1170                  with a preceding insn that sets CC0, and maybe with its
1171                  logical predecessor as well.
1172                  This is how we make decrement-and-branch insns.
1173                  We need this special code because data flow connections
1174                  via CC0 do not get entered in LOG_LINKS.  */
1175
1176               if (JUMP_P (insn)
1177                   && (prev = prev_nonnote_insn (insn)) != 0
1178                   && NONJUMP_INSN_P (prev)
1179                   && sets_cc0_p (PATTERN (prev)))
1180                 {
1181                   if ((next = try_combine (insn, prev,
1182                                            NULL_RTX, &new_direct_jump_p)) != 0)
1183                     goto retry;
1184
1185                   for (nextlinks = LOG_LINKS (prev); nextlinks;
1186                        nextlinks = XEXP (nextlinks, 1))
1187                     if ((next = try_combine (insn, prev,
1188                                              XEXP (nextlinks, 0),
1189                                              &new_direct_jump_p)) != 0)
1190                       goto retry;
1191                 }
1192
1193               /* Do the same for an insn that explicitly references CC0.  */
1194               if (NONJUMP_INSN_P (insn)
1195                   && (prev = prev_nonnote_insn (insn)) != 0
1196                   && NONJUMP_INSN_P (prev)
1197                   && sets_cc0_p (PATTERN (prev))
1198                   && GET_CODE (PATTERN (insn)) == SET
1199                   && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
1200                 {
1201                   if ((next = try_combine (insn, prev,
1202                                            NULL_RTX, &new_direct_jump_p)) != 0)
1203                     goto retry;
1204
1205                   for (nextlinks = LOG_LINKS (prev); nextlinks;
1206                        nextlinks = XEXP (nextlinks, 1))
1207                     if ((next = try_combine (insn, prev,
1208                                              XEXP (nextlinks, 0),
1209                                              &new_direct_jump_p)) != 0)
1210                       goto retry;
1211                 }
1212
1213               /* Finally, see if any of the insns that this insn links to
1214                  explicitly references CC0.  If so, try this insn, that insn,
1215                  and its predecessor if it sets CC0.  */
1216               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1217                 if (NONJUMP_INSN_P (XEXP (links, 0))
1218                     && GET_CODE (PATTERN (XEXP (links, 0))) == SET
1219                     && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
1220                     && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
1221                     && NONJUMP_INSN_P (prev)
1222                     && sets_cc0_p (PATTERN (prev))
1223                     && (next = try_combine (insn, XEXP (links, 0),
1224                                             prev, &new_direct_jump_p)) != 0)
1225                   goto retry;
1226 #endif
1227
1228               /* Try combining an insn with two different insns whose results it
1229                  uses.  */
1230               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1231                 for (nextlinks = XEXP (links, 1); nextlinks;
1232                      nextlinks = XEXP (nextlinks, 1))
1233                   if ((next = try_combine (insn, XEXP (links, 0),
1234                                            XEXP (nextlinks, 0),
1235                                            &new_direct_jump_p)) != 0)
1236                     goto retry;
1237
1238               /* Try this insn with each REG_EQUAL note it links back to.  */
1239               for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1240                 {
1241                   rtx set, note;
1242                   rtx temp = XEXP (links, 0);
1243                   if ((set = single_set (temp)) != 0
1244                       && (note = find_reg_equal_equiv_note (temp)) != 0
1245                       && (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST
1246                       /* Avoid using a register that may already been marked
1247                          dead by an earlier instruction.  */
1248                       && ! unmentioned_reg_p (note, SET_SRC (set))
1249                       && (GET_MODE (note) == VOIDmode
1250                           ? SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set)))
1251                           : GET_MODE (SET_DEST (set)) == GET_MODE (note)))
1252                     {
1253                       /* Temporarily replace the set's source with the
1254                          contents of the REG_EQUAL note.  The insn will
1255                          be deleted or recognized by try_combine.  */
1256                       rtx orig = SET_SRC (set);
1257                       SET_SRC (set) = note;
1258                       i2mod = temp;
1259                       i2mod_old_rhs = copy_rtx (orig);
1260                       i2mod_new_rhs = copy_rtx (note);
1261                       next = try_combine (insn, i2mod, NULL_RTX,
1262                                           &new_direct_jump_p);
1263                       i2mod = NULL_RTX;
1264                       if (next)
1265                         goto retry;
1266                       SET_SRC (set) = orig;
1267                     }
1268                 }
1269
1270               if (!NOTE_P (insn))
1271                 record_dead_and_set_regs (insn);
1272
1273             retry:
1274               ;
1275             }
1276         }
1277     }
1278
1279   default_rtl_profile ();
1280   clear_log_links ();
1281   clear_bb_flags ();
1282   new_direct_jump_p |= purge_all_dead_edges ();
1283   delete_noop_moves ();
1284
1285   /* Clean up.  */
1286   free (uid_log_links);
1287   free (uid_insn_cost);
1288   VEC_free (reg_stat_type, heap, reg_stat);
1289
1290   {
1291     struct undo *undo, *next;
1292     for (undo = undobuf.frees; undo; undo = next)
1293       {
1294         next = undo->next;
1295         free (undo);
1296       }
1297     undobuf.frees = 0;
1298   }
1299
1300   total_attempts += combine_attempts;
1301   total_merges += combine_merges;
1302   total_extras += combine_extras;
1303   total_successes += combine_successes;
1304
1305   nonzero_sign_valid = 0;
1306   rtl_hooks = general_rtl_hooks;
1307
1308   /* Make recognizer allow volatile MEMs again.  */
1309   init_recog ();
1310
1311   return new_direct_jump_p;
1312 }
1313
1314 /* Wipe the last_xxx fields of reg_stat in preparation for another pass.  */
1315
1316 static void
1317 init_reg_last (void)
1318 {
1319   unsigned int i;
1320   reg_stat_type *p;
1321
1322   for (i = 0; VEC_iterate (reg_stat_type, reg_stat, i, p); ++i)
1323     memset (p, 0, offsetof (reg_stat_type, sign_bit_copies));
1324 }
1325 \f
1326 /* Set up any promoted values for incoming argument registers.  */
1327
1328 static void
1329 setup_incoming_promotions (rtx first)
1330 {
1331   tree arg;
1332   bool strictly_local = false;
1333
1334   if (!targetm.calls.promote_function_args (TREE_TYPE (cfun->decl)))
1335     return;
1336
1337   for (arg = DECL_ARGUMENTS (current_function_decl); arg;
1338        arg = TREE_CHAIN (arg))
1339     {
1340       rtx reg = DECL_INCOMING_RTL (arg);
1341       int uns1, uns3;
1342       enum machine_mode mode1, mode2, mode3, mode4;
1343
1344       /* Only continue if the incoming argument is in a register.  */
1345       if (!REG_P (reg))
1346         continue;
1347
1348       /* Determine, if possible, whether all call sites of the current
1349          function lie within the current compilation unit.  (This does
1350          take into account the exporting of a function via taking its
1351          address, and so forth.)  */
1352       strictly_local = cgraph_local_info (current_function_decl)->local;
1353
1354       /* The mode and signedness of the argument before any promotions happen
1355          (equal to the mode of the pseudo holding it at that stage).  */
1356       mode1 = TYPE_MODE (TREE_TYPE (arg));
1357       uns1 = TYPE_UNSIGNED (TREE_TYPE (arg));
1358
1359       /* The mode and signedness of the argument after any source language and
1360          TARGET_PROMOTE_PROTOTYPES-driven promotions.  */
1361       mode2 = TYPE_MODE (DECL_ARG_TYPE (arg));
1362       uns3 = TYPE_UNSIGNED (DECL_ARG_TYPE (arg));
1363
1364       /* The mode and signedness of the argument as it is actually passed, 
1365          after any TARGET_PROMOTE_FUNCTION_ARGS-driven ABI promotions.  */
1366       mode3 = promote_mode (DECL_ARG_TYPE (arg), mode2, &uns3, 1);
1367
1368       /* The mode of the register in which the argument is being passed.  */
1369       mode4 = GET_MODE (reg);
1370
1371       /* Eliminate sign extensions in the callee when possible.  Only
1372          do this when:
1373          (a) a mode promotion has occurred;
1374          (b) the mode of the register is the same as the mode of
1375              the argument as it is passed; and
1376          (c) the signedness does not change across any of the promotions; and
1377          (d) when no language-level promotions (which we cannot guarantee
1378              will have been done by an external caller) are necessary,
1379              unless we know that this function is only ever called from
1380              the current compilation unit -- all of whose call sites will
1381              do the mode1 --> mode2 promotion.  */
1382       if (mode1 != mode3
1383           && mode3 == mode4
1384           && uns1 == uns3
1385           && (mode1 == mode2 || strictly_local))
1386         {
1387           /* Record that the value was promoted from mode1 to mode3,
1388              so that any sign extension at the head of the current
1389              function may be eliminated.  */
1390           rtx x;
1391           x = gen_rtx_CLOBBER (mode1, const0_rtx);
1392           x = gen_rtx_fmt_e ((uns3 ? ZERO_EXTEND : SIGN_EXTEND), mode3, x);
1393           record_value_for_reg (reg, first, x);
1394         }
1395     }
1396 }
1397
1398 /* Called via note_stores.  If X is a pseudo that is narrower than
1399    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
1400
1401    If we are setting only a portion of X and we can't figure out what
1402    portion, assume all bits will be used since we don't know what will
1403    be happening.
1404
1405    Similarly, set how many bits of X are known to be copies of the sign bit
1406    at all locations in the function.  This is the smallest number implied
1407    by any set of X.  */
1408
1409 static void
1410 set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
1411 {
1412   rtx insn = (rtx) data;
1413   unsigned int num;
1414
1415   if (REG_P (x)
1416       && REGNO (x) >= FIRST_PSEUDO_REGISTER
1417       /* If this register is undefined at the start of the file, we can't
1418          say what its contents were.  */
1419       && ! REGNO_REG_SET_P
1420            (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x))
1421       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
1422     {
1423       reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
1424
1425       if (set == 0 || GET_CODE (set) == CLOBBER)
1426         {
1427           rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1428           rsp->sign_bit_copies = 1;
1429           return;
1430         }
1431
1432       /* If this register is being initialized using itself, and the
1433          register is uninitialized in this basic block, and there are
1434          no LOG_LINKS which set the register, then part of the
1435          register is uninitialized.  In that case we can't assume
1436          anything about the number of nonzero bits.
1437
1438          ??? We could do better if we checked this in
1439          reg_{nonzero_bits,num_sign_bit_copies}_for_combine.  Then we
1440          could avoid making assumptions about the insn which initially
1441          sets the register, while still using the information in other
1442          insns.  We would have to be careful to check every insn
1443          involved in the combination.  */
1444
1445       if (insn
1446           && reg_referenced_p (x, PATTERN (insn))
1447           && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)),
1448                                REGNO (x)))
1449         {
1450           rtx link;
1451
1452           for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
1453             {
1454               if (dead_or_set_p (XEXP (link, 0), x))
1455                 break;
1456             }
1457           if (!link)
1458             {
1459               rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1460               rsp->sign_bit_copies = 1;
1461               return;
1462             }
1463         }
1464
1465       /* If this is a complex assignment, see if we can convert it into a
1466          simple assignment.  */
1467       set = expand_field_assignment (set);
1468
1469       /* If this is a simple assignment, or we have a paradoxical SUBREG,
1470          set what we know about X.  */
1471
1472       if (SET_DEST (set) == x
1473           || (GET_CODE (SET_DEST (set)) == SUBREG
1474               && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
1475                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
1476               && SUBREG_REG (SET_DEST (set)) == x))
1477         {
1478           rtx src = SET_SRC (set);
1479
1480 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
1481           /* If X is narrower than a word and SRC is a non-negative
1482              constant that would appear negative in the mode of X,
1483              sign-extend it for use in reg_stat[].nonzero_bits because some
1484              machines (maybe most) will actually do the sign-extension
1485              and this is the conservative approach.
1486
1487              ??? For 2.5, try to tighten up the MD files in this regard
1488              instead of this kludge.  */
1489
1490           if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
1491               && GET_CODE (src) == CONST_INT
1492               && INTVAL (src) > 0
1493               && 0 != (INTVAL (src)
1494                        & ((HOST_WIDE_INT) 1
1495                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
1496             src = GEN_INT (INTVAL (src)
1497                            | ((HOST_WIDE_INT) (-1)
1498                               << GET_MODE_BITSIZE (GET_MODE (x))));
1499 #endif
1500
1501           /* Don't call nonzero_bits if it cannot change anything.  */
1502           if (rsp->nonzero_bits != ~(unsigned HOST_WIDE_INT) 0)
1503             rsp->nonzero_bits |= nonzero_bits (src, nonzero_bits_mode);
1504           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1505           if (rsp->sign_bit_copies == 0
1506               || rsp->sign_bit_copies > num)
1507             rsp->sign_bit_copies = num;
1508         }
1509       else
1510         {
1511           rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1512           rsp->sign_bit_copies = 1;
1513         }
1514     }
1515 }
1516 \f
1517 /* See if INSN can be combined into I3.  PRED and SUCC are optionally
1518    insns that were previously combined into I3 or that will be combined
1519    into the merger of INSN and I3.
1520
1521    Return 0 if the combination is not allowed for any reason.
1522
1523    If the combination is allowed, *PDEST will be set to the single
1524    destination of INSN and *PSRC to the single source, and this function
1525    will return 1.  */
1526
1527 static int
1528 can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
1529                rtx *pdest, rtx *psrc)
1530 {
1531   int i;
1532   const_rtx set = 0;
1533   rtx src, dest;
1534   rtx p;
1535 #ifdef AUTO_INC_DEC
1536   rtx link;
1537 #endif
1538   int all_adjacent = (succ ? (next_active_insn (insn) == succ
1539                               && next_active_insn (succ) == i3)
1540                       : next_active_insn (insn) == i3);
1541
1542   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1543      or a PARALLEL consisting of such a SET and CLOBBERs.
1544
1545      If INSN has CLOBBER parallel parts, ignore them for our processing.
1546      By definition, these happen during the execution of the insn.  When it
1547      is merged with another insn, all bets are off.  If they are, in fact,
1548      needed and aren't also supplied in I3, they may be added by
1549      recog_for_combine.  Otherwise, it won't match.
1550
1551      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1552      note.
1553
1554      Get the source and destination of INSN.  If more than one, can't
1555      combine.  */
1556
1557   if (GET_CODE (PATTERN (insn)) == SET)
1558     set = PATTERN (insn);
1559   else if (GET_CODE (PATTERN (insn)) == PARALLEL
1560            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1561     {
1562       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1563         {
1564           rtx elt = XVECEXP (PATTERN (insn), 0, i);
1565           rtx note;
1566
1567           switch (GET_CODE (elt))
1568             {
1569             /* This is important to combine floating point insns
1570                for the SH4 port.  */
1571             case USE:
1572               /* Combining an isolated USE doesn't make sense.
1573                  We depend here on combinable_i3pat to reject them.  */
1574               /* The code below this loop only verifies that the inputs of
1575                  the SET in INSN do not change.  We call reg_set_between_p
1576                  to verify that the REG in the USE does not change between
1577                  I3 and INSN.
1578                  If the USE in INSN was for a pseudo register, the matching
1579                  insn pattern will likely match any register; combining this
1580                  with any other USE would only be safe if we knew that the
1581                  used registers have identical values, or if there was
1582                  something to tell them apart, e.g. different modes.  For
1583                  now, we forgo such complicated tests and simply disallow
1584                  combining of USES of pseudo registers with any other USE.  */
1585               if (REG_P (XEXP (elt, 0))
1586                   && GET_CODE (PATTERN (i3)) == PARALLEL)
1587                 {
1588                   rtx i3pat = PATTERN (i3);
1589                   int i = XVECLEN (i3pat, 0) - 1;
1590                   unsigned int regno = REGNO (XEXP (elt, 0));
1591
1592                   do
1593                     {
1594                       rtx i3elt = XVECEXP (i3pat, 0, i);
1595
1596                       if (GET_CODE (i3elt) == USE
1597                           && REG_P (XEXP (i3elt, 0))
1598                           && (REGNO (XEXP (i3elt, 0)) == regno
1599                               ? reg_set_between_p (XEXP (elt, 0),
1600                                                    PREV_INSN (insn), i3)
1601                               : regno >= FIRST_PSEUDO_REGISTER))
1602                         return 0;
1603                     }
1604                   while (--i >= 0);
1605                 }
1606               break;
1607
1608               /* We can ignore CLOBBERs.  */
1609             case CLOBBER:
1610               break;
1611
1612             case SET:
1613               /* Ignore SETs whose result isn't used but not those that
1614                  have side-effects.  */
1615               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1616                   && (!(note = find_reg_note (insn, REG_EH_REGION, NULL_RTX))
1617                       || INTVAL (XEXP (note, 0)) <= 0)
1618                   && ! side_effects_p (elt))
1619                 break;
1620
1621               /* If we have already found a SET, this is a second one and
1622                  so we cannot combine with this insn.  */
1623               if (set)
1624                 return 0;
1625
1626               set = elt;
1627               break;
1628
1629             default:
1630               /* Anything else means we can't combine.  */
1631               return 0;
1632             }
1633         }
1634
1635       if (set == 0
1636           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1637              so don't do anything with it.  */
1638           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1639         return 0;
1640     }
1641   else
1642     return 0;
1643
1644   if (set == 0)
1645     return 0;
1646
1647   set = expand_field_assignment (set);
1648   src = SET_SRC (set), dest = SET_DEST (set);
1649
1650   /* Don't eliminate a store in the stack pointer.  */
1651   if (dest == stack_pointer_rtx
1652       /* Don't combine with an insn that sets a register to itself if it has
1653          a REG_EQUAL note.  This may be part of a LIBCALL sequence.  */
1654       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1655       /* Can't merge an ASM_OPERANDS.  */
1656       || GET_CODE (src) == ASM_OPERANDS
1657       /* Can't merge a function call.  */
1658       || GET_CODE (src) == CALL
1659       /* Don't eliminate a function call argument.  */
1660       || (CALL_P (i3)
1661           && (find_reg_fusage (i3, USE, dest)
1662               || (REG_P (dest)
1663                   && REGNO (dest) < FIRST_PSEUDO_REGISTER
1664                   && global_regs[REGNO (dest)])))
1665       /* Don't substitute into an incremented register.  */
1666       || FIND_REG_INC_NOTE (i3, dest)
1667       || (succ && FIND_REG_INC_NOTE (succ, dest))
1668       /* Don't substitute into a non-local goto, this confuses CFG.  */
1669       || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1670       /* Make sure that DEST is not used after SUCC but before I3.  */
1671       || (succ && ! all_adjacent
1672           && reg_used_between_p (dest, succ, i3))
1673       /* Make sure that the value that is to be substituted for the register
1674          does not use any registers whose values alter in between.  However,
1675          If the insns are adjacent, a use can't cross a set even though we
1676          think it might (this can happen for a sequence of insns each setting
1677          the same destination; last_set of that register might point to
1678          a NOTE).  If INSN has a REG_EQUIV note, the register is always
1679          equivalent to the memory so the substitution is valid even if there
1680          are intervening stores.  Also, don't move a volatile asm or
1681          UNSPEC_VOLATILE across any other insns.  */
1682       || (! all_adjacent
1683           && (((!MEM_P (src)
1684                 || ! find_reg_note (insn, REG_EQUIV, src))
1685                && use_crosses_set_p (src, DF_INSN_LUID (insn)))
1686               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1687               || GET_CODE (src) == UNSPEC_VOLATILE))
1688       /* Don't combine across a CALL_INSN, because that would possibly
1689          change whether the life span of some REGs crosses calls or not,
1690          and it is a pain to update that information.
1691          Exception: if source is a constant, moving it later can't hurt.
1692          Accept that as a special case.  */
1693       || (DF_INSN_LUID (insn) < last_call_luid && ! CONSTANT_P (src)))
1694     return 0;
1695
1696   /* DEST must either be a REG or CC0.  */
1697   if (REG_P (dest))
1698     {
1699       /* If register alignment is being enforced for multi-word items in all
1700          cases except for parameters, it is possible to have a register copy
1701          insn referencing a hard register that is not allowed to contain the
1702          mode being copied and which would not be valid as an operand of most
1703          insns.  Eliminate this problem by not combining with such an insn.
1704
1705          Also, on some machines we don't want to extend the life of a hard
1706          register.  */
1707
1708       if (REG_P (src)
1709           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1710                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1711               /* Don't extend the life of a hard register unless it is
1712                  user variable (if we have few registers) or it can't
1713                  fit into the desired register (meaning something special
1714                  is going on).
1715                  Also avoid substituting a return register into I3, because
1716                  reload can't handle a conflict with constraints of other
1717                  inputs.  */
1718               || (REGNO (src) < FIRST_PSEUDO_REGISTER
1719                   && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1720         return 0;
1721     }
1722   else if (GET_CODE (dest) != CC0)
1723     return 0;
1724
1725
1726   if (GET_CODE (PATTERN (i3)) == PARALLEL)
1727     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1728       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
1729         {
1730           /* Don't substitute for a register intended as a clobberable
1731              operand.  */
1732           rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
1733           if (rtx_equal_p (reg, dest))
1734             return 0;
1735
1736           /* If the clobber represents an earlyclobber operand, we must not
1737              substitute an expression containing the clobbered register.
1738              As we do not analyze the constraint strings here, we have to
1739              make the conservative assumption.  However, if the register is
1740              a fixed hard reg, the clobber cannot represent any operand;
1741              we leave it up to the machine description to either accept or
1742              reject use-and-clobber patterns.  */
1743           if (!REG_P (reg)
1744               || REGNO (reg) >= FIRST_PSEUDO_REGISTER
1745               || !fixed_regs[REGNO (reg)])
1746             if (reg_overlap_mentioned_p (reg, src))
1747               return 0;
1748         }
1749
1750   /* If INSN contains anything volatile, or is an `asm' (whether volatile
1751      or not), reject, unless nothing volatile comes between it and I3 */
1752
1753   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1754     {
1755       /* Make sure succ doesn't contain a volatile reference.  */
1756       if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1757         return 0;
1758
1759       for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1760         if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
1761           return 0;
1762     }
1763
1764   /* If INSN is an asm, and DEST is a hard register, reject, since it has
1765      to be an explicit register variable, and was chosen for a reason.  */
1766
1767   if (GET_CODE (src) == ASM_OPERANDS
1768       && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1769     return 0;
1770
1771   /* If there are any volatile insns between INSN and I3, reject, because
1772      they might affect machine state.  */
1773
1774   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1775     if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
1776       return 0;
1777
1778   /* If INSN contains an autoincrement or autodecrement, make sure that
1779      register is not used between there and I3, and not already used in
1780      I3 either.  Neither must it be used in PRED or SUCC, if they exist.
1781      Also insist that I3 not be a jump; if it were one
1782      and the incremented register were spilled, we would lose.  */
1783
1784 #ifdef AUTO_INC_DEC
1785   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1786     if (REG_NOTE_KIND (link) == REG_INC
1787         && (JUMP_P (i3)
1788             || reg_used_between_p (XEXP (link, 0), insn, i3)
1789             || (pred != NULL_RTX
1790                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
1791             || (succ != NULL_RTX
1792                 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
1793             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1794       return 0;
1795 #endif
1796
1797 #ifdef HAVE_cc0
1798   /* Don't combine an insn that follows a CC0-setting insn.
1799      An insn that uses CC0 must not be separated from the one that sets it.
1800      We do, however, allow I2 to follow a CC0-setting insn if that insn
1801      is passed as I1; in that case it will be deleted also.
1802      We also allow combining in this case if all the insns are adjacent
1803      because that would leave the two CC0 insns adjacent as well.
1804      It would be more logical to test whether CC0 occurs inside I1 or I2,
1805      but that would be much slower, and this ought to be equivalent.  */
1806
1807   p = prev_nonnote_insn (insn);
1808   if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
1809       && ! all_adjacent)
1810     return 0;
1811 #endif
1812
1813   /* If we get here, we have passed all the tests and the combination is
1814      to be allowed.  */
1815
1816   *pdest = dest;
1817   *psrc = src;
1818
1819   return 1;
1820 }
1821 \f
1822 /* LOC is the location within I3 that contains its pattern or the component
1823    of a PARALLEL of the pattern.  We validate that it is valid for combining.
1824
1825    One problem is if I3 modifies its output, as opposed to replacing it
1826    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1827    so would produce an insn that is not equivalent to the original insns.
1828
1829    Consider:
1830
1831          (set (reg:DI 101) (reg:DI 100))
1832          (set (subreg:SI (reg:DI 101) 0) <foo>)
1833
1834    This is NOT equivalent to:
1835
1836          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1837                     (set (reg:DI 101) (reg:DI 100))])
1838
1839    Not only does this modify 100 (in which case it might still be valid
1840    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
1841
1842    We can also run into a problem if I2 sets a register that I1
1843    uses and I1 gets directly substituted into I3 (not via I2).  In that
1844    case, we would be getting the wrong value of I2DEST into I3, so we
1845    must reject the combination.  This case occurs when I2 and I1 both
1846    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1847    If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
1848    of a SET must prevent combination from occurring.
1849
1850    Before doing the above check, we first try to expand a field assignment
1851    into a set of logical operations.
1852
1853    If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
1854    we place a register that is both set and used within I3.  If more than one
1855    such register is detected, we fail.
1856
1857    Return 1 if the combination is valid, zero otherwise.  */
1858
1859 static int
1860 combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest,
1861                   int i1_not_in_src, rtx *pi3dest_killed)
1862 {
1863   rtx x = *loc;
1864
1865   if (GET_CODE (x) == SET)
1866     {
1867       rtx set = x ;
1868       rtx dest = SET_DEST (set);
1869       rtx src = SET_SRC (set);
1870       rtx inner_dest = dest;
1871       rtx subdest;
1872
1873       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1874              || GET_CODE (inner_dest) == SUBREG
1875              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1876         inner_dest = XEXP (inner_dest, 0);
1877
1878       /* Check for the case where I3 modifies its output, as discussed
1879          above.  We don't want to prevent pseudos from being combined
1880          into the address of a MEM, so only prevent the combination if
1881          i1 or i2 set the same MEM.  */
1882       if ((inner_dest != dest &&
1883            (!MEM_P (inner_dest)
1884             || rtx_equal_p (i2dest, inner_dest)
1885             || (i1dest && rtx_equal_p (i1dest, inner_dest)))
1886            && (reg_overlap_mentioned_p (i2dest, inner_dest)
1887                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1888
1889           /* This is the same test done in can_combine_p except we can't test
1890              all_adjacent; we don't have to, since this instruction will stay
1891              in place, thus we are not considering increasing the lifetime of
1892              INNER_DEST.
1893
1894              Also, if this insn sets a function argument, combining it with
1895              something that might need a spill could clobber a previous
1896              function argument; the all_adjacent test in can_combine_p also
1897              checks this; here, we do a more specific test for this case.  */
1898
1899           || (REG_P (inner_dest)
1900               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1901               && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
1902                                         GET_MODE (inner_dest))))
1903           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1904         return 0;
1905
1906       /* If DEST is used in I3, it is being killed in this insn, so
1907          record that for later.  We have to consider paradoxical
1908          subregs here, since they kill the whole register, but we
1909          ignore partial subregs, STRICT_LOW_PART, etc.
1910          Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1911          STACK_POINTER_REGNUM, since these are always considered to be
1912          live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
1913       subdest = dest;
1914       if (GET_CODE (subdest) == SUBREG
1915           && (GET_MODE_SIZE (GET_MODE (subdest))
1916               >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (subdest)))))
1917         subdest = SUBREG_REG (subdest);
1918       if (pi3dest_killed
1919           && REG_P (subdest)
1920           && reg_referenced_p (subdest, PATTERN (i3))
1921           && REGNO (subdest) != FRAME_POINTER_REGNUM
1922 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1923           && REGNO (subdest) != HARD_FRAME_POINTER_REGNUM
1924 #endif
1925 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1926           && (REGNO (subdest) != ARG_POINTER_REGNUM
1927               || ! fixed_regs [REGNO (subdest)])
1928 #endif
1929           && REGNO (subdest) != STACK_POINTER_REGNUM)
1930         {
1931           if (*pi3dest_killed)
1932             return 0;
1933
1934           *pi3dest_killed = subdest;
1935         }
1936     }
1937
1938   else if (GET_CODE (x) == PARALLEL)
1939     {
1940       int i;
1941
1942       for (i = 0; i < XVECLEN (x, 0); i++)
1943         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1944                                 i1_not_in_src, pi3dest_killed))
1945           return 0;
1946     }
1947
1948   return 1;
1949 }
1950 \f
1951 /* Return 1 if X is an arithmetic expression that contains a multiplication
1952    and division.  We don't count multiplications by powers of two here.  */
1953
1954 static int
1955 contains_muldiv (rtx x)
1956 {
1957   switch (GET_CODE (x))
1958     {
1959     case MOD:  case DIV:  case UMOD:  case UDIV:
1960       return 1;
1961
1962     case MULT:
1963       return ! (GET_CODE (XEXP (x, 1)) == CONST_INT
1964                 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0);
1965     default:
1966       if (BINARY_P (x))
1967         return contains_muldiv (XEXP (x, 0))
1968             || contains_muldiv (XEXP (x, 1));
1969
1970       if (UNARY_P (x))
1971         return contains_muldiv (XEXP (x, 0));
1972
1973       return 0;
1974     }
1975 }
1976 \f
1977 /* Determine whether INSN can be used in a combination.  Return nonzero if
1978    not.  This is used in try_combine to detect early some cases where we
1979    can't perform combinations.  */
1980
1981 static int
1982 cant_combine_insn_p (rtx insn)
1983 {
1984   rtx set;
1985   rtx src, dest;
1986
1987   /* If this isn't really an insn, we can't do anything.
1988      This can occur when flow deletes an insn that it has merged into an
1989      auto-increment address.  */
1990   if (! INSN_P (insn))
1991     return 1;
1992
1993   /* Never combine loads and stores involving hard regs that are likely
1994      to be spilled.  The register allocator can usually handle such
1995      reg-reg moves by tying.  If we allow the combiner to make
1996      substitutions of likely-spilled regs, reload might die.
1997      As an exception, we allow combinations involving fixed regs; these are
1998      not available to the register allocator so there's no risk involved.  */
1999
2000   set = single_set (insn);
2001   if (! set)
2002     return 0;
2003   src = SET_SRC (set);
2004   dest = SET_DEST (set);
2005   if (GET_CODE (src) == SUBREG)
2006     src = SUBREG_REG (src);
2007   if (GET_CODE (dest) == SUBREG)
2008     dest = SUBREG_REG (dest);
2009   if (REG_P (src) && REG_P (dest)
2010       && ((REGNO (src) < FIRST_PSEUDO_REGISTER
2011            && ! fixed_regs[REGNO (src)]
2012            && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (src))))
2013           || (REGNO (dest) < FIRST_PSEUDO_REGISTER
2014               && ! fixed_regs[REGNO (dest)]
2015               && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (dest))))))
2016     return 1;
2017
2018   return 0;
2019 }
2020
2021 struct likely_spilled_retval_info
2022 {
2023   unsigned regno, nregs;
2024   unsigned mask;
2025 };
2026
2027 /* Called via note_stores by likely_spilled_retval_p.  Remove from info->mask
2028    hard registers that are known to be written to / clobbered in full.  */
2029 static void
2030 likely_spilled_retval_1 (rtx x, const_rtx set, void *data)
2031 {
2032   struct likely_spilled_retval_info *const info =
2033     (struct likely_spilled_retval_info *) data;
2034   unsigned regno, nregs;
2035   unsigned new_mask;
2036
2037   if (!REG_P (XEXP (set, 0)))
2038     return;
2039   regno = REGNO (x);
2040   if (regno >= info->regno + info->nregs)
2041     return;
2042   nregs = hard_regno_nregs[regno][GET_MODE (x)];
2043   if (regno + nregs <= info->regno)
2044     return;
2045   new_mask = (2U << (nregs - 1)) - 1;
2046   if (regno < info->regno)
2047     new_mask >>= info->regno - regno;
2048   else
2049     new_mask <<= regno - info->regno;
2050   info->mask &= ~new_mask;
2051 }
2052
2053 /* Return nonzero iff part of the return value is live during INSN, and
2054    it is likely spilled.  This can happen when more than one insn is needed
2055    to copy the return value, e.g. when we consider to combine into the
2056    second copy insn for a complex value.  */
2057
2058 static int
2059 likely_spilled_retval_p (rtx insn)
2060 {
2061   rtx use = BB_END (this_basic_block);
2062   rtx reg, p;
2063   unsigned regno, nregs;
2064   /* We assume here that no machine mode needs more than
2065      32 hard registers when the value overlaps with a register
2066      for which FUNCTION_VALUE_REGNO_P is true.  */
2067   unsigned mask;
2068   struct likely_spilled_retval_info info;
2069
2070   if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
2071     return 0;
2072   reg = XEXP (PATTERN (use), 0);
2073   if (!REG_P (reg) || !FUNCTION_VALUE_REGNO_P (REGNO (reg)))
2074     return 0;
2075   regno = REGNO (reg);
2076   nregs = hard_regno_nregs[regno][GET_MODE (reg)];
2077   if (nregs == 1)
2078     return 0;
2079   mask = (2U << (nregs - 1)) - 1;
2080
2081   /* Disregard parts of the return value that are set later.  */
2082   info.regno = regno;
2083   info.nregs = nregs;
2084   info.mask = mask;
2085   for (p = PREV_INSN (use); info.mask && p != insn; p = PREV_INSN (p))
2086     if (INSN_P (p))
2087       note_stores (PATTERN (p), likely_spilled_retval_1, &info);
2088   mask = info.mask;
2089
2090   /* Check if any of the (probably) live return value registers is
2091      likely spilled.  */
2092   nregs --;
2093   do
2094     {
2095       if ((mask & 1 << nregs)
2096           && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno + nregs)))
2097         return 1;
2098     } while (nregs--);
2099   return 0;
2100 }
2101
2102 /* Adjust INSN after we made a change to its destination.
2103
2104    Changing the destination can invalidate notes that say something about
2105    the results of the insn and a LOG_LINK pointing to the insn.  */
2106
2107 static void
2108 adjust_for_new_dest (rtx insn)
2109 {
2110   /* For notes, be conservative and simply remove them.  */
2111   remove_reg_equal_equiv_notes (insn);
2112
2113   /* The new insn will have a destination that was previously the destination
2114      of an insn just above it.  Call distribute_links to make a LOG_LINK from
2115      the next use of that destination.  */
2116   distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
2117
2118   df_insn_rescan (insn);
2119 }
2120
2121 /* Return TRUE if combine can reuse reg X in mode MODE.
2122    ADDED_SETS is nonzero if the original set is still required.  */
2123 static bool
2124 can_change_dest_mode (rtx x, int added_sets, enum machine_mode mode)
2125 {
2126   unsigned int regno;
2127
2128   if (!REG_P(x))
2129     return false;
2130
2131   regno = REGNO (x);
2132   /* Allow hard registers if the new mode is legal, and occupies no more
2133      registers than the old mode.  */
2134   if (regno < FIRST_PSEUDO_REGISTER)
2135     return (HARD_REGNO_MODE_OK (regno, mode)
2136             && (hard_regno_nregs[regno][GET_MODE (x)]
2137                 >= hard_regno_nregs[regno][mode]));
2138
2139   /* Or a pseudo that is only used once.  */
2140   return (REG_N_SETS (regno) == 1 && !added_sets
2141           && !REG_USERVAR_P (x));
2142 }
2143
2144
2145 /* Check whether X, the destination of a set, refers to part of
2146    the register specified by REG.  */
2147
2148 static bool
2149 reg_subword_p (rtx x, rtx reg)
2150 {
2151   /* Check that reg is an integer mode register.  */
2152   if (!REG_P (reg) || GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
2153     return false;
2154
2155   if (GET_CODE (x) == STRICT_LOW_PART
2156       || GET_CODE (x) == ZERO_EXTRACT)
2157     x = XEXP (x, 0);
2158
2159   return GET_CODE (x) == SUBREG
2160          && SUBREG_REG (x) == reg
2161          && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT;
2162 }
2163
2164
2165 /* Delete the conditional jump INSN and adjust the CFG correspondingly.
2166    Note that the INSN should be deleted *after* removing dead edges, so
2167    that the kept edge is the fallthrough edge for a (set (pc) (pc))
2168    but not for a (set (pc) (label_ref FOO)).  */
2169
2170 static void
2171 update_cfg_for_uncondjump (rtx insn)
2172 {
2173   basic_block bb = BLOCK_FOR_INSN (insn);
2174
2175   if (BB_END (bb) == insn)
2176     purge_dead_edges (bb);
2177
2178   delete_insn (insn);
2179   if (EDGE_COUNT (bb->succs) == 1)
2180     single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2181 }
2182
2183
2184 /* Try to combine the insns I1 and I2 into I3.
2185    Here I1 and I2 appear earlier than I3.
2186    I1 can be zero; then we combine just I2 into I3.
2187
2188    If we are combining three insns and the resulting insn is not recognized,
2189    try splitting it into two insns.  If that happens, I2 and I3 are retained
2190    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
2191    are pseudo-deleted.
2192
2193    Return 0 if the combination does not work.  Then nothing is changed.
2194    If we did the combination, return the insn at which combine should
2195    resume scanning.
2196
2197    Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
2198    new direct jump instruction.  */
2199
2200 static rtx
2201 try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
2202 {
2203   /* New patterns for I3 and I2, respectively.  */
2204   rtx newpat, newi2pat = 0;
2205   rtvec newpat_vec_with_clobbers = 0;
2206   int substed_i2 = 0, substed_i1 = 0;
2207   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
2208   int added_sets_1, added_sets_2;
2209   /* Total number of SETs to put into I3.  */
2210   int total_sets;
2211   /* Nonzero if I2's body now appears in I3.  */
2212   int i2_is_used;
2213   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
2214   int insn_code_number, i2_code_number = 0, other_code_number = 0;
2215   /* Contains I3 if the destination of I3 is used in its source, which means
2216      that the old life of I3 is being killed.  If that usage is placed into
2217      I2 and not in I3, a REG_DEAD note must be made.  */
2218   rtx i3dest_killed = 0;
2219   /* SET_DEST and SET_SRC of I2 and I1.  */
2220   rtx i2dest, i2src, i1dest = 0, i1src = 0;
2221   /* PATTERN (I1) and PATTERN (I2), or a copy of it in certain cases.  */
2222   rtx i1pat = 0, i2pat = 0;
2223   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
2224   int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
2225   int i2dest_killed = 0, i1dest_killed = 0;
2226   int i1_feeds_i3 = 0;
2227   /* Notes that must be added to REG_NOTES in I3 and I2.  */
2228   rtx new_i3_notes, new_i2_notes;
2229   /* Notes that we substituted I3 into I2 instead of the normal case.  */
2230   int i3_subst_into_i2 = 0;
2231   /* Notes that I1, I2 or I3 is a MULT operation.  */
2232   int have_mult = 0;
2233   int swap_i2i3 = 0;
2234   int changed_i3_dest = 0;
2235
2236   int maxreg;
2237   rtx temp;
2238   rtx link;
2239   rtx other_pat = 0;
2240   rtx new_other_notes;
2241   int i;
2242
2243   /* Exit early if one of the insns involved can't be used for
2244      combinations.  */
2245   if (cant_combine_insn_p (i3)
2246       || cant_combine_insn_p (i2)
2247       || (i1 && cant_combine_insn_p (i1))
2248       || likely_spilled_retval_p (i3))
2249     return 0;
2250
2251   combine_attempts++;
2252   undobuf.other_insn = 0;
2253
2254   /* Reset the hard register usage information.  */
2255   CLEAR_HARD_REG_SET (newpat_used_regs);
2256
2257   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
2258      code below, set I1 to be the earlier of the two insns.  */
2259   if (i1 && DF_INSN_LUID (i1) > DF_INSN_LUID (i2))
2260     temp = i1, i1 = i2, i2 = temp;
2261
2262   added_links_insn = 0;
2263
2264   /* First check for one important special-case that the code below will
2265      not handle.  Namely, the case where I1 is zero, I2 is a PARALLEL
2266      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
2267      we may be able to replace that destination with the destination of I3.
2268      This occurs in the common code where we compute both a quotient and
2269      remainder into a structure, in which case we want to do the computation
2270      directly into the structure to avoid register-register copies.
2271
2272      Note that this case handles both multiple sets in I2 and also
2273      cases where I2 has a number of CLOBBER or PARALLELs.
2274
2275      We make very conservative checks below and only try to handle the
2276      most common cases of this.  For example, we only handle the case
2277      where I2 and I3 are adjacent to avoid making difficult register
2278      usage tests.  */
2279
2280   if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
2281       && REG_P (SET_SRC (PATTERN (i3)))
2282       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
2283       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
2284       && GET_CODE (PATTERN (i2)) == PARALLEL
2285       && ! side_effects_p (SET_DEST (PATTERN (i3)))
2286       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
2287          below would need to check what is inside (and reg_overlap_mentioned_p
2288          doesn't support those codes anyway).  Don't allow those destinations;
2289          the resulting insn isn't likely to be recognized anyway.  */
2290       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
2291       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
2292       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
2293                                     SET_DEST (PATTERN (i3)))
2294       && next_real_insn (i2) == i3)
2295     {
2296       rtx p2 = PATTERN (i2);
2297
2298       /* Make sure that the destination of I3,
2299          which we are going to substitute into one output of I2,
2300          is not used within another output of I2.  We must avoid making this:
2301          (parallel [(set (mem (reg 69)) ...)
2302                     (set (reg 69) ...)])
2303          which is not well-defined as to order of actions.
2304          (Besides, reload can't handle output reloads for this.)
2305
2306          The problem can also happen if the dest of I3 is a memory ref,
2307          if another dest in I2 is an indirect memory ref.  */
2308       for (i = 0; i < XVECLEN (p2, 0); i++)
2309         if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2310              || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2311             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
2312                                         SET_DEST (XVECEXP (p2, 0, i))))
2313           break;
2314
2315       if (i == XVECLEN (p2, 0))
2316         for (i = 0; i < XVECLEN (p2, 0); i++)
2317           if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2318                || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2319               && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
2320             {
2321               combine_merges++;
2322
2323               subst_insn = i3;
2324               subst_low_luid = DF_INSN_LUID (i2);
2325
2326               added_sets_2 = added_sets_1 = 0;
2327               i2dest = SET_SRC (PATTERN (i3));
2328               i2dest_killed = dead_or_set_p (i2, i2dest);
2329
2330               /* Replace the dest in I2 with our dest and make the resulting
2331                  insn the new pattern for I3.  Then skip to where we
2332                  validate the pattern.  Everything was set up above.  */
2333               SUBST (SET_DEST (XVECEXP (p2, 0, i)),
2334                      SET_DEST (PATTERN (i3)));
2335
2336               newpat = p2;
2337               i3_subst_into_i2 = 1;
2338               goto validate_replacement;
2339             }
2340     }
2341
2342   /* If I2 is setting a pseudo to a constant and I3 is setting some
2343      sub-part of it to another constant, merge them by making a new
2344      constant.  */
2345   if (i1 == 0
2346       && (temp = single_set (i2)) != 0
2347       && (GET_CODE (SET_SRC (temp)) == CONST_INT
2348           || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
2349       && GET_CODE (PATTERN (i3)) == SET
2350       && (GET_CODE (SET_SRC (PATTERN (i3))) == CONST_INT
2351           || GET_CODE (SET_SRC (PATTERN (i3))) == CONST_DOUBLE)
2352       && reg_subword_p (SET_DEST (PATTERN (i3)), SET_DEST (temp)))
2353     {
2354       rtx dest = SET_DEST (PATTERN (i3));
2355       int offset = -1;
2356       int width = 0;
2357
2358       if (GET_CODE (dest) == ZERO_EXTRACT)
2359         {
2360           if (GET_CODE (XEXP (dest, 1)) == CONST_INT
2361               && GET_CODE (XEXP (dest, 2)) == CONST_INT)
2362             {
2363               width = INTVAL (XEXP (dest, 1));
2364               offset = INTVAL (XEXP (dest, 2));
2365               dest = XEXP (dest, 0);
2366               if (BITS_BIG_ENDIAN)
2367                 offset = GET_MODE_BITSIZE (GET_MODE (dest)) - width - offset;
2368             }
2369         }
2370       else
2371         {
2372           if (GET_CODE (dest) == STRICT_LOW_PART)
2373             dest = XEXP (dest, 0);
2374           width = GET_MODE_BITSIZE (GET_MODE (dest));
2375           offset = 0;
2376         }
2377
2378       if (offset >= 0)
2379         {
2380           /* If this is the low part, we're done.  */
2381           if (subreg_lowpart_p (dest))
2382             ;
2383           /* Handle the case where inner is twice the size of outer.  */
2384           else if (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp)))
2385                    == 2 * GET_MODE_BITSIZE (GET_MODE (dest)))
2386             offset += GET_MODE_BITSIZE (GET_MODE (dest));
2387           /* Otherwise give up for now.  */
2388           else
2389             offset = -1;
2390         }
2391
2392       if (offset >= 0
2393           && (GET_MODE_BITSIZE (GET_MODE (SET_DEST (temp)))
2394               <= HOST_BITS_PER_WIDE_INT * 2))
2395         {
2396           HOST_WIDE_INT mhi, ohi, ihi;
2397           HOST_WIDE_INT mlo, olo, ilo;
2398           rtx inner = SET_SRC (PATTERN (i3));
2399           rtx outer = SET_SRC (temp);
2400
2401           if (GET_CODE (outer) == CONST_INT)
2402             {
2403               olo = INTVAL (outer);
2404               ohi = olo < 0 ? -1 : 0;
2405             }
2406           else
2407             {
2408               olo = CONST_DOUBLE_LOW (outer);
2409               ohi = CONST_DOUBLE_HIGH (outer);
2410             }
2411
2412           if (GET_CODE (inner) == CONST_INT)
2413             {
2414               ilo = INTVAL (inner);
2415               ihi = ilo < 0 ? -1 : 0;
2416             }
2417           else
2418             {
2419               ilo = CONST_DOUBLE_LOW (inner);
2420               ihi = CONST_DOUBLE_HIGH (inner);
2421             }
2422
2423           if (width < HOST_BITS_PER_WIDE_INT)
2424             {
2425               mlo = ((unsigned HOST_WIDE_INT) 1 << width) - 1;
2426               mhi = 0;
2427             }
2428           else if (width < HOST_BITS_PER_WIDE_INT * 2)
2429             {
2430               mhi = ((unsigned HOST_WIDE_INT) 1
2431                      << (width - HOST_BITS_PER_WIDE_INT)) - 1;
2432               mlo = -1;
2433             }
2434           else
2435             {
2436               mlo = -1;
2437               mhi = -1;
2438             }
2439
2440           ilo &= mlo;
2441           ihi &= mhi;
2442
2443           if (offset >= HOST_BITS_PER_WIDE_INT)
2444             {
2445               mhi = mlo << (offset - HOST_BITS_PER_WIDE_INT);
2446               mlo = 0;
2447               ihi = ilo << (offset - HOST_BITS_PER_WIDE_INT);
2448               ilo = 0;
2449             }
2450           else if (offset > 0)
2451             {
2452               mhi = (mhi << offset) | ((unsigned HOST_WIDE_INT) mlo
2453                                        >> (HOST_BITS_PER_WIDE_INT - offset));
2454               mlo = mlo << offset;
2455               ihi = (ihi << offset) | ((unsigned HOST_WIDE_INT) ilo
2456                                        >> (HOST_BITS_PER_WIDE_INT - offset));
2457               ilo = ilo << offset;
2458             }
2459
2460           olo = (olo & ~mlo) | ilo;
2461           ohi = (ohi & ~mhi) | ihi;
2462
2463           combine_merges++;
2464           subst_insn = i3;
2465           subst_low_luid = DF_INSN_LUID (i2);
2466           added_sets_2 = added_sets_1 = 0;
2467           i2dest = SET_DEST (temp);
2468           i2dest_killed = dead_or_set_p (i2, i2dest);
2469
2470           SUBST (SET_SRC (temp),
2471                  immed_double_const (olo, ohi, GET_MODE (SET_DEST (temp))));
2472
2473           newpat = PATTERN (i2);
2474           goto validate_replacement;
2475         }
2476     }
2477
2478 #ifndef HAVE_cc0
2479   /* If we have no I1 and I2 looks like:
2480         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
2481                    (set Y OP)])
2482      make up a dummy I1 that is
2483         (set Y OP)
2484      and change I2 to be
2485         (set (reg:CC X) (compare:CC Y (const_int 0)))
2486
2487      (We can ignore any trailing CLOBBERs.)
2488
2489      This undoes a previous combination and allows us to match a branch-and-
2490      decrement insn.  */
2491
2492   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
2493       && XVECLEN (PATTERN (i2), 0) >= 2
2494       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
2495       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
2496           == MODE_CC)
2497       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
2498       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
2499       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
2500       && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)))
2501       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
2502                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
2503     {
2504       for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
2505         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
2506           break;
2507
2508       if (i == 1)
2509         {
2510           /* We make I1 with the same INSN_UID as I2.  This gives it
2511              the same DF_INSN_LUID for value tracking.  Our fake I1 will
2512              never appear in the insn stream so giving it the same INSN_UID
2513              as I2 will not cause a problem.  */
2514
2515           i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
2516                              BLOCK_FOR_INSN (i2), INSN_LOCATOR (i2),
2517                              XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX);
2518
2519           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
2520           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
2521                  SET_DEST (PATTERN (i1)));
2522         }
2523     }
2524 #endif
2525
2526   /* Verify that I2 and I1 are valid for combining.  */
2527   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
2528       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
2529     {
2530       undo_all ();
2531       return 0;
2532     }
2533
2534   /* Record whether I2DEST is used in I2SRC and similarly for the other
2535      cases.  Knowing this will help in register status updating below.  */
2536   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
2537   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
2538   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
2539   i2dest_killed = dead_or_set_p (i2, i2dest);
2540   i1dest_killed = i1 && dead_or_set_p (i1, i1dest);
2541
2542   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
2543      in I2SRC.  */
2544   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
2545
2546   /* Ensure that I3's pattern can be the destination of combines.  */
2547   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
2548                           i1 && i2dest_in_i1src && i1_feeds_i3,
2549                           &i3dest_killed))
2550     {
2551       undo_all ();
2552       return 0;
2553     }
2554
2555   /* See if any of the insns is a MULT operation.  Unless one is, we will
2556      reject a combination that is, since it must be slower.  Be conservative
2557      here.  */
2558   if (GET_CODE (i2src) == MULT
2559       || (i1 != 0 && GET_CODE (i1src) == MULT)
2560       || (GET_CODE (PATTERN (i3)) == SET
2561           && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
2562     have_mult = 1;
2563
2564   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
2565      We used to do this EXCEPT in one case: I3 has a post-inc in an
2566      output operand.  However, that exception can give rise to insns like
2567         mov r3,(r3)+
2568      which is a famous insn on the PDP-11 where the value of r3 used as the
2569      source was model-dependent.  Avoid this sort of thing.  */
2570
2571 #if 0
2572   if (!(GET_CODE (PATTERN (i3)) == SET
2573         && REG_P (SET_SRC (PATTERN (i3)))
2574         && MEM_P (SET_DEST (PATTERN (i3)))
2575         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
2576             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
2577     /* It's not the exception.  */
2578 #endif
2579 #ifdef AUTO_INC_DEC
2580     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
2581       if (REG_NOTE_KIND (link) == REG_INC
2582           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
2583               || (i1 != 0
2584                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
2585         {
2586           undo_all ();
2587           return 0;
2588         }
2589 #endif
2590
2591   /* See if the SETs in I1 or I2 need to be kept around in the merged
2592      instruction: whenever the value set there is still needed past I3.
2593      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
2594
2595      For the SET in I1, we have two cases:  If I1 and I2 independently
2596      feed into I3, the set in I1 needs to be kept around if I1DEST dies
2597      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
2598      in I1 needs to be kept around unless I1DEST dies or is set in either
2599      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
2600      I1DEST.  If so, we know I1 feeds into I2.  */
2601
2602   added_sets_2 = ! dead_or_set_p (i3, i2dest);
2603
2604   added_sets_1
2605     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
2606                : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
2607
2608   /* If the set in I2 needs to be kept around, we must make a copy of
2609      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
2610      PATTERN (I2), we are only substituting for the original I1DEST, not into
2611      an already-substituted copy.  This also prevents making self-referential
2612      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
2613      I2DEST.  */
2614
2615   if (added_sets_2)
2616     {
2617       if (GET_CODE (PATTERN (i2)) == PARALLEL)
2618         i2pat = gen_rtx_SET (VOIDmode, i2dest, copy_rtx (i2src));
2619       else
2620         i2pat = copy_rtx (PATTERN (i2));
2621     }
2622
2623   if (added_sets_1)
2624     {
2625       if (GET_CODE (PATTERN (i1)) == PARALLEL)
2626         i1pat = gen_rtx_SET (VOIDmode, i1dest, copy_rtx (i1src));
2627       else
2628         i1pat = copy_rtx (PATTERN (i1));
2629     }
2630
2631   combine_merges++;
2632
2633   /* Substitute in the latest insn for the regs set by the earlier ones.  */
2634
2635   maxreg = max_reg_num ();
2636
2637   subst_insn = i3;
2638
2639 #ifndef HAVE_cc0
2640   /* Many machines that don't use CC0 have insns that can both perform an
2641      arithmetic operation and set the condition code.  These operations will
2642      be represented as a PARALLEL with the first element of the vector
2643      being a COMPARE of an arithmetic operation with the constant zero.
2644      The second element of the vector will set some pseudo to the result
2645      of the same arithmetic operation.  If we simplify the COMPARE, we won't
2646      match such a pattern and so will generate an extra insn.   Here we test
2647      for this case, where both the comparison and the operation result are
2648      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
2649      I2SRC.  Later we will make the PARALLEL that contains I2.  */
2650
2651   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
2652       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
2653       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
2654       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
2655     {
2656 #ifdef SELECT_CC_MODE
2657       rtx *cc_use;
2658       enum machine_mode compare_mode;
2659 #endif
2660
2661       newpat = PATTERN (i3);
2662       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
2663
2664       i2_is_used = 1;
2665
2666 #ifdef SELECT_CC_MODE
2667       /* See if a COMPARE with the operand we substituted in should be done
2668          with the mode that is currently being used.  If not, do the same
2669          processing we do in `subst' for a SET; namely, if the destination
2670          is used only once, try to replace it with a register of the proper
2671          mode and also replace the COMPARE.  */
2672       if (undobuf.other_insn == 0
2673           && (cc_use = find_single_use (SET_DEST (newpat), i3,
2674                                         &undobuf.other_insn))
2675           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
2676                                               i2src, const0_rtx))
2677               != GET_MODE (SET_DEST (newpat))))
2678         {
2679           if (can_change_dest_mode(SET_DEST (newpat), added_sets_2,
2680                                    compare_mode))
2681             {
2682               unsigned int regno = REGNO (SET_DEST (newpat));
2683               rtx new_dest;
2684
2685               if (regno < FIRST_PSEUDO_REGISTER)
2686                 new_dest = gen_rtx_REG (compare_mode, regno);
2687               else
2688                 {
2689                   SUBST_MODE (regno_reg_rtx[regno], compare_mode);
2690                   new_dest = regno_reg_rtx[regno];
2691                 }
2692
2693               SUBST (SET_DEST (newpat), new_dest);
2694               SUBST (XEXP (*cc_use, 0), new_dest);
2695               SUBST (SET_SRC (newpat),
2696                      gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
2697             }
2698           else
2699             undobuf.other_insn = 0;
2700         }
2701 #endif
2702     }
2703   else
2704 #endif
2705     {
2706       /* It is possible that the source of I2 or I1 may be performing
2707          an unneeded operation, such as a ZERO_EXTEND of something
2708          that is known to have the high part zero.  Handle that case
2709          by letting subst look at the innermost one of them.
2710
2711          Another way to do this would be to have a function that tries
2712          to simplify a single insn instead of merging two or more
2713          insns.  We don't do this because of the potential of infinite
2714          loops and because of the potential extra memory required.
2715          However, doing it the way we are is a bit of a kludge and
2716          doesn't catch all cases.
2717
2718          But only do this if -fexpensive-optimizations since it slows
2719          things down and doesn't usually win.
2720
2721          This is not done in the COMPARE case above because the
2722          unmodified I2PAT is used in the PARALLEL and so a pattern
2723          with a modified I2SRC would not match.  */
2724
2725       if (flag_expensive_optimizations)
2726         {
2727           /* Pass pc_rtx so no substitutions are done, just
2728              simplifications.  */
2729           if (i1)
2730             {
2731               subst_low_luid = DF_INSN_LUID (i1);
2732               i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
2733             }
2734           else
2735             {
2736               subst_low_luid = DF_INSN_LUID (i2);
2737               i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
2738             }
2739         }
2740
2741       n_occurrences = 0;                /* `subst' counts here */
2742
2743       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
2744          need to make a unique copy of I2SRC each time we substitute it
2745          to avoid self-referential rtl.  */
2746
2747       subst_low_luid = DF_INSN_LUID (i2);
2748       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
2749                       ! i1_feeds_i3 && i1dest_in_i1src);
2750       substed_i2 = 1;
2751
2752       /* Record whether i2's body now appears within i3's body.  */
2753       i2_is_used = n_occurrences;
2754     }
2755
2756   /* If we already got a failure, don't try to do more.  Otherwise,
2757      try to substitute in I1 if we have it.  */
2758
2759   if (i1 && GET_CODE (newpat) != CLOBBER)
2760     {
2761       /* Check that an autoincrement side-effect on I1 has not been lost.
2762          This happens if I1DEST is mentioned in I2 and dies there, and
2763          has disappeared from the new pattern.  */
2764       if ((FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2765            && !i1_feeds_i3
2766            && dead_or_set_p (i2, i1dest)
2767            && !reg_overlap_mentioned_p (i1dest, newpat))
2768           /* Before we can do this substitution, we must redo the test done
2769              above (see detailed comments there) that ensures  that I1DEST
2770              isn't mentioned in any SETs in NEWPAT that are field assignments.  */
2771           || !combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, 0, 0))
2772         {
2773           undo_all ();
2774           return 0;
2775         }
2776
2777       n_occurrences = 0;
2778       subst_low_luid = DF_INSN_LUID (i1);
2779       newpat = subst (newpat, i1dest, i1src, 0, 0);
2780       substed_i1 = 1;
2781     }
2782
2783   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
2784      to count all the ways that I2SRC and I1SRC can be used.  */
2785   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
2786        && i2_is_used + added_sets_2 > 1)
2787       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2788           && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
2789               > 1))
2790       /* Fail if we tried to make a new register.  */
2791       || max_reg_num () != maxreg
2792       /* Fail if we couldn't do something and have a CLOBBER.  */
2793       || GET_CODE (newpat) == CLOBBER
2794       /* Fail if this new pattern is a MULT and we didn't have one before
2795          at the outer level.  */
2796       || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
2797           && ! have_mult))
2798     {
2799       undo_all ();
2800       return 0;
2801     }
2802
2803   /* If the actions of the earlier insns must be kept
2804      in addition to substituting them into the latest one,
2805      we must make a new PARALLEL for the latest insn
2806      to hold additional the SETs.  */
2807
2808   if (added_sets_1 || added_sets_2)
2809     {
2810       combine_extras++;
2811
2812       if (GET_CODE (newpat) == PARALLEL)
2813         {
2814           rtvec old = XVEC (newpat, 0);
2815           total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
2816           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2817           memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
2818                   sizeof (old->elem[0]) * old->num_elem);
2819         }
2820       else
2821         {
2822           rtx old = newpat;
2823           total_sets = 1 + added_sets_1 + added_sets_2;
2824           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2825           XVECEXP (newpat, 0, 0) = old;
2826         }
2827
2828       if (added_sets_1)
2829         XVECEXP (newpat, 0, --total_sets) = i1pat;
2830
2831       if (added_sets_2)
2832         {
2833           /* If there is no I1, use I2's body as is.  We used to also not do
2834              the subst call below if I2 was substituted into I3,
2835              but that could lose a simplification.  */
2836           if (i1 == 0)
2837             XVECEXP (newpat, 0, --total_sets) = i2pat;
2838           else
2839             /* See comment where i2pat is assigned.  */
2840             XVECEXP (newpat, 0, --total_sets)
2841               = subst (i2pat, i1dest, i1src, 0, 0);
2842         }
2843     }
2844
2845   /* We come here when we are replacing a destination in I2 with the
2846      destination of I3.  */
2847  validate_replacement:
2848
2849   /* Note which hard regs this insn has as inputs.  */
2850   mark_used_regs_combine (newpat);
2851
2852   /* If recog_for_combine fails, it strips existing clobbers.  If we'll
2853      consider splitting this pattern, we might need these clobbers.  */
2854   if (i1 && GET_CODE (newpat) == PARALLEL
2855       && GET_CODE (XVECEXP (newpat, 0, XVECLEN (newpat, 0) - 1)) == CLOBBER)
2856     {
2857       int len = XVECLEN (newpat, 0);
2858
2859       newpat_vec_with_clobbers = rtvec_alloc (len);
2860       for (i = 0; i < len; i++)
2861         RTVEC_ELT (newpat_vec_with_clobbers, i) = XVECEXP (newpat, 0, i);
2862     }
2863
2864   /* Is the result of combination a valid instruction?  */
2865   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2866
2867   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
2868      the second SET's destination is a register that is unused and isn't
2869      marked as an instruction that might trap in an EH region.  In that case,
2870      we just need the first SET.   This can occur when simplifying a divmod
2871      insn.  We *must* test for this case here because the code below that
2872      splits two independent SETs doesn't handle this case correctly when it
2873      updates the register status.
2874
2875      It's pointless doing this if we originally had two sets, one from
2876      i3, and one from i2.  Combining then splitting the parallel results
2877      in the original i2 again plus an invalid insn (which we delete).
2878      The net effect is only to move instructions around, which makes
2879      debug info less accurate.
2880
2881      Also check the case where the first SET's destination is unused.
2882      That would not cause incorrect code, but does cause an unneeded
2883      insn to remain.  */
2884
2885   if (insn_code_number < 0
2886       && !(added_sets_2 && i1 == 0)
2887       && GET_CODE (newpat) == PARALLEL
2888       && XVECLEN (newpat, 0) == 2
2889       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2890       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2891       && asm_noperands (newpat) < 0)
2892     {
2893       rtx set0 = XVECEXP (newpat, 0, 0);
2894       rtx set1 = XVECEXP (newpat, 0, 1);
2895       rtx note;
2896
2897       if (((REG_P (SET_DEST (set1))
2898             && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
2899            || (GET_CODE (SET_DEST (set1)) == SUBREG
2900                && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
2901           && (!(note = find_reg_note (i3, REG_EH_REGION, NULL_RTX))
2902               || INTVAL (XEXP (note, 0)) <= 0)
2903           && ! side_effects_p (SET_SRC (set1)))
2904         {
2905           newpat = set0;
2906           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2907         }
2908
2909       else if (((REG_P (SET_DEST (set0))
2910                  && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
2911                 || (GET_CODE (SET_DEST (set0)) == SUBREG
2912                     && find_reg_note (i3, REG_UNUSED,
2913                                       SUBREG_REG (SET_DEST (set0)))))
2914                && (!(note = find_reg_note (i3, REG_EH_REGION, NULL_RTX))
2915                    || INTVAL (XEXP (note, 0)) <= 0)
2916                && ! side_effects_p (SET_SRC (set0)))
2917         {
2918           newpat = set1;
2919           insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2920
2921           if (insn_code_number >= 0)
2922             changed_i3_dest = 1;
2923         }
2924     }
2925
2926   /* If we were combining three insns and the result is a simple SET
2927      with no ASM_OPERANDS that wasn't recognized, try to split it into two
2928      insns.  There are two ways to do this.  It can be split using a
2929      machine-specific method (like when you have an addition of a large
2930      constant) or by combine in the function find_split_point.  */
2931
2932   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
2933       && asm_noperands (newpat) < 0)
2934     {
2935       rtx parallel, m_split, *split;
2936
2937       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
2938          use I2DEST as a scratch register will help.  In the latter case,
2939          convert I2DEST to the mode of the source of NEWPAT if we can.  */
2940
2941       m_split = combine_split_insns (newpat, i3);
2942
2943       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
2944          inputs of NEWPAT.  */
2945
2946       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
2947          possible to try that as a scratch reg.  This would require adding
2948          more code to make it work though.  */
2949
2950       if (m_split == 0 && ! reg_overlap_mentioned_p (i2dest, newpat))
2951         {
2952           enum machine_mode new_mode = GET_MODE (SET_DEST (newpat));
2953
2954           /* First try to split using the original register as a
2955              scratch register.  */
2956           parallel = gen_rtx_PARALLEL (VOIDmode,
2957                                        gen_rtvec (2, newpat,
2958                                                   gen_rtx_CLOBBER (VOIDmode,
2959                                                                    i2dest)));
2960           m_split = combine_split_insns (parallel, i3);
2961
2962           /* If that didn't work, try changing the mode of I2DEST if
2963              we can.  */
2964           if (m_split == 0
2965               && new_mode != GET_MODE (i2dest)
2966               && new_mode != VOIDmode
2967               && can_change_dest_mode (i2dest, added_sets_2, new_mode))
2968             {
2969               enum machine_mode old_mode = GET_MODE (i2dest);
2970               rtx ni2dest;
2971
2972               if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
2973                 ni2dest = gen_rtx_REG (new_mode, REGNO (i2dest));
2974               else
2975                 {
2976                   SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], new_mode);
2977                   ni2dest = regno_reg_rtx[REGNO (i2dest)];
2978                 }
2979
2980               parallel = (gen_rtx_PARALLEL
2981                           (VOIDmode,
2982                            gen_rtvec (2, newpat,
2983                                       gen_rtx_CLOBBER (VOIDmode,
2984                                                        ni2dest))));
2985               m_split = combine_split_insns (parallel, i3);
2986
2987               if (m_split == 0
2988                   && REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2989                 {
2990                   struct undo *buf;
2991
2992                   adjust_reg_mode (regno_reg_rtx[REGNO (i2dest)], old_mode);
2993                   buf = undobuf.undos;
2994                   undobuf.undos = buf->next;
2995                   buf->next = undobuf.frees;
2996                   undobuf.frees = buf;
2997                 }
2998             }
2999         }
3000
3001       /* If recog_for_combine has discarded clobbers, try to use them
3002          again for the split.  */
3003       if (m_split == 0 && newpat_vec_with_clobbers)
3004         {
3005           parallel = gen_rtx_PARALLEL (VOIDmode, newpat_vec_with_clobbers);
3006           m_split = combine_split_insns (parallel, i3);
3007         }
3008
3009       if (m_split && NEXT_INSN (m_split) == NULL_RTX)
3010         {
3011           m_split = PATTERN (m_split);
3012           insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
3013           if (insn_code_number >= 0)
3014             newpat = m_split;
3015         }
3016       else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX
3017                && (next_real_insn (i2) == i3
3018                    || ! use_crosses_set_p (PATTERN (m_split), DF_INSN_LUID (i2))))
3019         {
3020           rtx i2set, i3set;
3021           rtx newi3pat = PATTERN (NEXT_INSN (m_split));
3022           newi2pat = PATTERN (m_split);
3023
3024           i3set = single_set (NEXT_INSN (m_split));
3025           i2set = single_set (m_split);
3026
3027           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3028
3029           /* If I2 or I3 has multiple SETs, we won't know how to track
3030              register status, so don't use these insns.  If I2's destination
3031              is used between I2 and I3, we also can't use these insns.  */
3032
3033           if (i2_code_number >= 0 && i2set && i3set
3034               && (next_real_insn (i2) == i3
3035                   || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
3036             insn_code_number = recog_for_combine (&newi3pat, i3,
3037                                                   &new_i3_notes);
3038           if (insn_code_number >= 0)
3039             newpat = newi3pat;
3040
3041           /* It is possible that both insns now set the destination of I3.
3042              If so, we must show an extra use of it.  */
3043
3044           if (insn_code_number >= 0)
3045             {
3046               rtx new_i3_dest = SET_DEST (i3set);
3047               rtx new_i2_dest = SET_DEST (i2set);
3048
3049               while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
3050                      || GET_CODE (new_i3_dest) == STRICT_LOW_PART
3051                      || GET_CODE (new_i3_dest) == SUBREG)
3052                 new_i3_dest = XEXP (new_i3_dest, 0);
3053
3054               while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
3055                      || GET_CODE (new_i2_dest) == STRICT_LOW_PART
3056                      || GET_CODE (new_i2_dest) == SUBREG)
3057                 new_i2_dest = XEXP (new_i2_dest, 0);
3058
3059               if (REG_P (new_i3_dest)
3060                   && REG_P (new_i2_dest)
3061                   && REGNO (new_i3_dest) == REGNO (new_i2_dest))
3062                 INC_REG_N_SETS (REGNO (new_i2_dest), 1);
3063             }
3064         }
3065
3066       /* If we can split it and use I2DEST, go ahead and see if that
3067          helps things be recognized.  Verify that none of the registers
3068          are set between I2 and I3.  */
3069       if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
3070 #ifdef HAVE_cc0
3071           && REG_P (i2dest)
3072 #endif
3073           /* We need I2DEST in the proper mode.  If it is a hard register
3074              or the only use of a pseudo, we can change its mode.
3075              Make sure we don't change a hard register to have a mode that
3076              isn't valid for it, or change the number of registers.  */
3077           && (GET_MODE (*split) == GET_MODE (i2dest)
3078               || GET_MODE (*split) == VOIDmode
3079               || can_change_dest_mode (i2dest, added_sets_2,
3080                                        GET_MODE (*split)))
3081           && (next_real_insn (i2) == i3
3082               || ! use_crosses_set_p (*split, DF_INSN_LUID (i2)))
3083           /* We can't overwrite I2DEST if its value is still used by
3084              NEWPAT.  */
3085           && ! reg_referenced_p (i2dest, newpat))
3086         {
3087           rtx newdest = i2dest;
3088           enum rtx_code split_code = GET_CODE (*split);
3089           enum machine_mode split_mode = GET_MODE (*split);
3090           bool subst_done = false;
3091           newi2pat = NULL_RTX;
3092
3093           /* Get NEWDEST as a register in the proper mode.  We have already
3094              validated that we can do this.  */
3095           if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
3096             {
3097               if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3098                 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
3099               else
3100                 {
3101                   SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], split_mode);
3102                   newdest = regno_reg_rtx[REGNO (i2dest)];
3103                 }
3104             }
3105
3106           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
3107              an ASHIFT.  This can occur if it was inside a PLUS and hence
3108              appeared to be a memory address.  This is a kludge.  */
3109           if (split_code == MULT
3110               && GET_CODE (XEXP (*split, 1)) == CONST_INT
3111               && INTVAL (XEXP (*split, 1)) > 0
3112               && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
3113             {
3114               SUBST (*split, gen_rtx_ASHIFT (split_mode,
3115                                              XEXP (*split, 0), GEN_INT (i)));
3116               /* Update split_code because we may not have a multiply
3117                  anymore.  */
3118               split_code = GET_CODE (*split);
3119             }
3120
3121 #ifdef INSN_SCHEDULING
3122           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
3123              be written as a ZERO_EXTEND.  */
3124           if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
3125             {
3126 #ifdef LOAD_EXTEND_OP
3127               /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
3128                  what it really is.  */
3129               if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (*split)))
3130                   == SIGN_EXTEND)
3131                 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
3132                                                     SUBREG_REG (*split)));
3133               else
3134 #endif
3135                 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
3136                                                     SUBREG_REG (*split)));
3137             }
3138 #endif
3139
3140           /* Attempt to split binary operators using arithmetic identities.  */
3141           if (BINARY_P (SET_SRC (newpat))
3142               && split_mode == GET_MODE (SET_SRC (newpat))
3143               && ! side_effects_p (SET_SRC (newpat)))
3144             {
3145               rtx setsrc = SET_SRC (newpat);
3146               enum machine_mode mode = GET_MODE (setsrc);
3147               enum rtx_code code = GET_CODE (setsrc);
3148               rtx src_op0 = XEXP (setsrc, 0);
3149               rtx src_op1 = XEXP (setsrc, 1);
3150
3151               /* Split "X = Y op Y" as "Z = Y; X = Z op Z".  */
3152               if (rtx_equal_p (src_op0, src_op1))
3153                 {
3154                   newi2pat = gen_rtx_SET (VOIDmode, newdest, src_op0);
3155                   SUBST (XEXP (setsrc, 0), newdest);
3156                   SUBST (XEXP (setsrc, 1), newdest);
3157                   subst_done = true;
3158                 }
3159               /* Split "((P op Q) op R) op S" where op is PLUS or MULT.  */
3160               else if ((code == PLUS || code == MULT)
3161                        && GET_CODE (src_op0) == code
3162                        && GET_CODE (XEXP (src_op0, 0)) == code
3163                        && (INTEGRAL_MODE_P (mode)
3164                            || (FLOAT_MODE_P (mode)
3165                                && flag_unsafe_math_optimizations)))
3166                 {
3167                   rtx p = XEXP (XEXP (src_op0, 0), 0);
3168                   rtx q = XEXP (XEXP (src_op0, 0), 1);
3169                   rtx r = XEXP (src_op0, 1);
3170                   rtx s = src_op1;
3171
3172                   /* Split both "((X op Y) op X) op Y" and
3173                      "((X op Y) op Y) op X" as "T op T" where T is
3174                      "X op Y".  */
3175                   if ((rtx_equal_p (p,r) && rtx_equal_p (q,s))
3176                        || (rtx_equal_p (p,s) && rtx_equal_p (q,r)))
3177                     {
3178                       newi2pat = gen_rtx_SET (VOIDmode, newdest,
3179                                               XEXP (src_op0, 0));
3180                       SUBST (XEXP (setsrc, 0), newdest);
3181                       SUBST (XEXP (setsrc, 1), newdest);
3182                       subst_done = true;
3183                     }
3184                   /* Split "((X op X) op Y) op Y)" as "T op T" where
3185                      T is "X op Y".  */
3186                   else if (rtx_equal_p (p,q) && rtx_equal_p (r,s))
3187                     {
3188                       rtx tmp = simplify_gen_binary (code, mode, p, r);
3189                       newi2pat = gen_rtx_SET (VOIDmode, newdest, tmp);
3190                       SUBST (XEXP (setsrc, 0), newdest);
3191                       SUBST (XEXP (setsrc, 1), newdest);
3192                       subst_done = true;
3193                     }
3194                 }
3195             }
3196
3197           if (!subst_done)
3198             {
3199               newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
3200               SUBST (*split, newdest);
3201             }
3202
3203           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3204
3205           /* recog_for_combine might have added CLOBBERs to newi2pat.
3206              Make sure NEWPAT does not depend on the clobbered regs.  */
3207           if (GET_CODE (newi2pat) == PARALLEL)
3208             for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3209               if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3210                 {
3211                   rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3212                   if (reg_overlap_mentioned_p (reg, newpat))
3213                     {
3214                       undo_all ();
3215                       return 0;
3216                     }
3217                 }
3218
3219           /* If the split point was a MULT and we didn't have one before,
3220              don't use one now.  */
3221           if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
3222             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3223         }
3224     }
3225
3226   /* Check for a case where we loaded from memory in a narrow mode and
3227      then sign extended it, but we need both registers.  In that case,
3228      we have a PARALLEL with both loads from the same memory location.
3229      We can split this into a load from memory followed by a register-register
3230      copy.  This saves at least one insn, more if register allocation can
3231      eliminate the copy.
3232
3233      We cannot do this if the destination of the first assignment is a
3234      condition code register or cc0.  We eliminate this case by making sure
3235      the SET_DEST and SET_SRC have the same mode.
3236
3237      We cannot do this if the destination of the second assignment is
3238      a register that we have already assumed is zero-extended.  Similarly
3239      for a SUBREG of such a register.  */
3240
3241   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3242            && GET_CODE (newpat) == PARALLEL
3243            && XVECLEN (newpat, 0) == 2
3244            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3245            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
3246            && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
3247                == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
3248            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3249            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3250                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
3251            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3252                                    DF_INSN_LUID (i2))
3253            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3254            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3255            && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
3256                  (REG_P (temp)
3257                   && VEC_index (reg_stat_type, reg_stat,
3258                                 REGNO (temp))->nonzero_bits != 0
3259                   && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
3260                   && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
3261                   && (VEC_index (reg_stat_type, reg_stat,
3262                                  REGNO (temp))->nonzero_bits
3263                       != GET_MODE_MASK (word_mode))))
3264            && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
3265                  && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
3266                      (REG_P (temp)
3267                       && VEC_index (reg_stat_type, reg_stat,
3268                                     REGNO (temp))->nonzero_bits != 0
3269                       && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
3270                       && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
3271                       && (VEC_index (reg_stat_type, reg_stat,
3272                                      REGNO (temp))->nonzero_bits
3273                           != GET_MODE_MASK (word_mode)))))
3274            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3275                                          SET_SRC (XVECEXP (newpat, 0, 1)))
3276            && ! find_reg_note (i3, REG_UNUSED,
3277                                SET_DEST (XVECEXP (newpat, 0, 0))))
3278     {
3279       rtx ni2dest;
3280
3281       newi2pat = XVECEXP (newpat, 0, 0);
3282       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
3283       newpat = XVECEXP (newpat, 0, 1);
3284       SUBST (SET_SRC (newpat),
3285              gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
3286       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3287
3288       if (i2_code_number >= 0)
3289         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3290
3291       if (insn_code_number >= 0)
3292         swap_i2i3 = 1;
3293     }
3294
3295   /* Similarly, check for a case where we have a PARALLEL of two independent
3296      SETs but we started with three insns.  In this case, we can do the sets
3297      as two separate insns.  This case occurs when some SET allows two
3298      other insns to combine, but the destination of that SET is still live.  */
3299
3300   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3301            && GET_CODE (newpat) == PARALLEL
3302            && XVECLEN (newpat, 0) == 2
3303            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3304            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
3305            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
3306            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3307            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3308            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3309            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3310                                    DF_INSN_LUID (i2))
3311            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3312                                   XVECEXP (newpat, 0, 0))
3313            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
3314                                   XVECEXP (newpat, 0, 1))
3315            && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
3316                  && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1))))
3317 #ifdef HAVE_cc0
3318            /* We cannot split the parallel into two sets if both sets
3319               reference cc0.  */
3320            && ! (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0))
3321                  && reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 1)))
3322 #endif
3323            )
3324     {
3325       /* Normally, it doesn't matter which of the two is done first,
3326          but it does if one references cc0.  In that case, it has to
3327          be first.  */
3328 #ifdef HAVE_cc0
3329       if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
3330         {
3331           newi2pat = XVECEXP (newpat, 0, 0);
3332           newpat = XVECEXP (newpat, 0, 1);
3333         }
3334       else
3335 #endif
3336         {
3337           newi2pat = XVECEXP (newpat, 0, 1);
3338           newpat = XVECEXP (newpat, 0, 0);
3339         }
3340
3341       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3342
3343       if (i2_code_number >= 0)
3344         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3345     }
3346
3347   /* If it still isn't recognized, fail and change things back the way they
3348      were.  */
3349   if ((insn_code_number < 0
3350        /* Is the result a reasonable ASM_OPERANDS?  */
3351        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
3352     {
3353       undo_all ();
3354       return 0;
3355     }
3356
3357   /* If we had to change another insn, make sure it is valid also.  */
3358   if (undobuf.other_insn)
3359     {
3360       CLEAR_HARD_REG_SET (newpat_used_regs);
3361
3362       other_pat = PATTERN (undobuf.other_insn);
3363       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
3364                                              &new_other_notes);
3365
3366       if (other_code_number < 0 && ! check_asm_operands (other_pat))
3367         {
3368           undo_all ();
3369           return 0;
3370         }
3371     }
3372
3373 #ifdef HAVE_cc0
3374   /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
3375      they are adjacent to each other or not.  */
3376   {
3377     rtx p = prev_nonnote_insn (i3);
3378     if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
3379         && sets_cc0_p (newi2pat))
3380       {
3381         undo_all ();
3382         return 0;
3383       }
3384   }
3385 #endif
3386
3387   /* Only allow this combination if insn_rtx_costs reports that the
3388      replacement instructions are cheaper than the originals.  */
3389   if (!combine_validate_cost (i1, i2, i3, newpat, newi2pat, other_pat))
3390     {
3391       undo_all ();
3392       return 0;
3393     }
3394
3395   /* If we will be able to accept this, we have made a
3396      change to the destination of I3.  This requires us to
3397      do a few adjustments.  */
3398
3399   if (changed_i3_dest)
3400     {
3401       PATTERN (i3) = newpat;
3402       adjust_for_new_dest (i3);
3403     }
3404
3405   /* We now know that we can do this combination.  Merge the insns and
3406      update the status of registers and LOG_LINKS.  */
3407
3408   if (undobuf.other_insn)
3409     {
3410       rtx note, next;
3411
3412       PATTERN (undobuf.other_insn) = other_pat;
3413
3414       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
3415          are still valid.  Then add any non-duplicate notes added by
3416          recog_for_combine.  */
3417       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
3418         {
3419           next = XEXP (note, 1);
3420
3421           if (REG_NOTE_KIND (note) == REG_UNUSED
3422               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
3423             remove_note (undobuf.other_insn, note);
3424         }
3425
3426       distribute_notes (new_other_notes, undobuf.other_insn,
3427                         undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
3428     }
3429
3430   if (swap_i2i3)
3431     {
3432       rtx insn;
3433       rtx link;
3434       rtx ni2dest;
3435
3436       /* I3 now uses what used to be its destination and which is now
3437          I2's destination.  This requires us to do a few adjustments.  */
3438       PATTERN (i3) = newpat;
3439       adjust_for_new_dest (i3);
3440
3441       /* We need a LOG_LINK from I3 to I2.  But we used to have one,
3442          so we still will.
3443
3444          However, some later insn might be using I2's dest and have
3445          a LOG_LINK pointing at I3.  We must remove this link.
3446          The simplest way to remove the link is to point it at I1,
3447          which we know will be a NOTE.  */
3448
3449       /* newi2pat is usually a SET here; however, recog_for_combine might
3450          have added some clobbers.  */
3451       if (GET_CODE (newi2pat) == PARALLEL)
3452         ni2dest = SET_DEST (XVECEXP (newi2pat, 0, 0));
3453       else
3454         ni2dest = SET_DEST (newi2pat);
3455
3456       for (insn = NEXT_INSN (i3);
3457            insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
3458                     || insn != BB_HEAD (this_basic_block->next_bb));
3459            insn = NEXT_INSN (insn))
3460         {
3461           if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
3462             {
3463               for (link = LOG_LINKS (insn); link;
3464                    link = XEXP (link, 1))
3465                 if (XEXP (link, 0) == i3)
3466                   XEXP (link, 0) = i1;
3467
3468               break;
3469             }
3470         }
3471     }
3472
3473   {
3474     rtx i3notes, i2notes, i1notes = 0;
3475     rtx i3links, i2links, i1links = 0;
3476     rtx midnotes = 0;
3477     unsigned int regno;
3478     /* Compute which registers we expect to eliminate.  newi2pat may be setting
3479        either i3dest or i2dest, so we must check it.  Also, i1dest may be the
3480        same as i3dest, in which case newi2pat may be setting i1dest.  */
3481     rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
3482                    || i2dest_in_i2src || i2dest_in_i1src
3483                    || !i2dest_killed
3484                    ? 0 : i2dest);
3485     rtx elim_i1 = (i1 == 0 || i1dest_in_i1src
3486                    || (newi2pat && reg_set_p (i1dest, newi2pat))
3487                    || !i1dest_killed
3488                    ? 0 : i1dest);
3489
3490     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
3491        clear them.  */
3492     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
3493     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
3494     if (i1)
3495       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
3496
3497     /* Ensure that we do not have something that should not be shared but
3498        occurs multiple times in the new insns.  Check this by first
3499        resetting all the `used' flags and then copying anything is shared.  */
3500
3501     reset_used_flags (i3notes);
3502     reset_used_flags (i2notes);
3503     reset_used_flags (i1notes);
3504     reset_used_flags (newpat);
3505     reset_used_flags (newi2pat);
3506     if (undobuf.other_insn)
3507       reset_used_flags (PATTERN (undobuf.other_insn));
3508
3509     i3notes = copy_rtx_if_shared (i3notes);
3510     i2notes = copy_rtx_if_shared (i2notes);
3511     i1notes = copy_rtx_if_shared (i1notes);
3512     newpat = copy_rtx_if_shared (newpat);
3513     newi2pat = copy_rtx_if_shared (newi2pat);
3514     if (undobuf.other_insn)
3515       reset_used_flags (PATTERN (undobuf.other_insn));
3516
3517     INSN_CODE (i3) = insn_code_number;
3518     PATTERN (i3) = newpat;
3519
3520     if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
3521       {
3522         rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
3523
3524         reset_used_flags (call_usage);
3525         call_usage = copy_rtx (call_usage);
3526
3527         if (substed_i2)
3528           replace_rtx (call_usage, i2dest, i2src);
3529
3530         if (substed_i1)
3531           replace_rtx (call_usage, i1dest, i1src);
3532
3533         CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
3534       }
3535
3536     if (undobuf.other_insn)
3537       INSN_CODE (undobuf.other_insn) = other_code_number;
3538
3539     /* We had one special case above where I2 had more than one set and
3540        we replaced a destination of one of those sets with the destination
3541        of I3.  In that case, we have to update LOG_LINKS of insns later
3542        in this basic block.  Note that this (expensive) case is rare.
3543
3544        Also, in this case, we must pretend that all REG_NOTEs for I2
3545        actually came from I3, so that REG_UNUSED notes from I2 will be
3546        properly handled.  */
3547
3548     if (i3_subst_into_i2)
3549       {
3550         for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
3551           if ((GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == SET
3552                || GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == CLOBBER)
3553               && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
3554               && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
3555               && ! find_reg_note (i2, REG_UNUSED,
3556                                   SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
3557             for (temp = NEXT_INSN (i2);
3558                  temp && (this_basic_block->next_bb == EXIT_BLOCK_PTR
3559                           || BB_HEAD (this_basic_block) != temp);
3560                  temp = NEXT_INSN (temp))
3561               if (temp != i3 && INSN_P (temp))
3562                 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
3563                   if (XEXP (link, 0) == i2)
3564                     XEXP (link, 0) = i3;
3565
3566         if (i3notes)
3567           {
3568             rtx link = i3notes;
3569             while (XEXP (link, 1))
3570               link = XEXP (link, 1);
3571             XEXP (link, 1) = i2notes;
3572           }
3573         else
3574           i3notes = i2notes;
3575         i2notes = 0;
3576       }
3577
3578     LOG_LINKS (i3) = 0;
3579     REG_NOTES (i3) = 0;
3580     LOG_LINKS (i2) = 0;
3581     REG_NOTES (i2) = 0;
3582
3583     if (newi2pat)
3584       {
3585         INSN_CODE (i2) = i2_code_number;
3586         PATTERN (i2) = newi2pat;
3587       }
3588     else
3589       SET_INSN_DELETED (i2);
3590
3591     if (i1)
3592       {
3593         LOG_LINKS (i1) = 0;
3594         REG_NOTES (i1) = 0;
3595         SET_INSN_DELETED (i1);
3596       }
3597
3598     /* Get death notes for everything that is now used in either I3 or
3599        I2 and used to die in a previous insn.  If we built two new
3600        patterns, move from I1 to I2 then I2 to I3 so that we get the
3601        proper movement on registers that I2 modifies.  */
3602
3603     if (newi2pat)
3604       {
3605         move_deaths (newi2pat, NULL_RTX, DF_INSN_LUID (i1), i2, &midnotes);
3606         move_deaths (newpat, newi2pat, DF_INSN_LUID (i1), i3, &midnotes);
3607       }
3608     else
3609       move_deaths (newpat, NULL_RTX, i1 ? DF_INSN_LUID (i1) : DF_INSN_LUID (i2),
3610                    i3, &midnotes);
3611
3612     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
3613     if (i3notes)
3614       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
3615                         elim_i2, elim_i1);
3616     if (i2notes)
3617       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
3618                         elim_i2, elim_i1);
3619     if (i1notes)
3620       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
3621                         elim_i2, elim_i1);
3622     if (midnotes)
3623       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3624                         elim_i2, elim_i1);
3625
3626     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
3627        know these are REG_UNUSED and want them to go to the desired insn,
3628        so we always pass it as i3.  */
3629
3630     if (newi2pat && new_i2_notes)
3631       distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3632     
3633     if (new_i3_notes)
3634       distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
3635
3636     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
3637        put a REG_DEAD note for it somewhere.  If NEWI2PAT exists and sets
3638        I3DEST, the death must be somewhere before I2, not I3.  If we passed I3
3639        in that case, it might delete I2.  Similarly for I2 and I1.
3640        Show an additional death due to the REG_DEAD note we make here.  If
3641        we discard it in distribute_notes, we will decrement it again.  */
3642
3643     if (i3dest_killed)
3644       {
3645         if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
3646           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
3647                                                NULL_RTX),
3648                             NULL_RTX, i2, NULL_RTX, elim_i2, elim_i1);
3649         else
3650           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
3651                                                NULL_RTX),
3652                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3653                             elim_i2, elim_i1);
3654       }
3655
3656     if (i2dest_in_i2src)
3657       {
3658         if (newi2pat && reg_set_p (i2dest, newi2pat))
3659           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
3660                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3661         else
3662           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
3663                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3664                             NULL_RTX, NULL_RTX);
3665       }
3666
3667     if (i1dest_in_i1src)
3668       {
3669         if (newi2pat && reg_set_p (i1dest, newi2pat))
3670           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
3671                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3672         else
3673           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
3674                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3675                             NULL_RTX, NULL_RTX);
3676       }
3677
3678     distribute_links (i3links);
3679     distribute_links (i2links);
3680     distribute_links (i1links);
3681
3682     if (REG_P (i2dest))
3683       {
3684         rtx link;
3685         rtx i2_insn = 0, i2_val = 0, set;
3686
3687         /* The insn that used to set this register doesn't exist, and
3688            this life of the register may not exist either.  See if one of
3689            I3's links points to an insn that sets I2DEST.  If it does,
3690            that is now the last known value for I2DEST. If we don't update
3691            this and I2 set the register to a value that depended on its old
3692            contents, we will get confused.  If this insn is used, thing
3693            will be set correctly in combine_instructions.  */
3694
3695         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
3696           if ((set = single_set (XEXP (link, 0))) != 0
3697               && rtx_equal_p (i2dest, SET_DEST (set)))
3698             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
3699
3700         record_value_for_reg (i2dest, i2_insn, i2_val);
3701
3702         /* If the reg formerly set in I2 died only once and that was in I3,
3703            zero its use count so it won't make `reload' do any work.  */
3704         if (! added_sets_2
3705             && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
3706             && ! i2dest_in_i2src)
3707           {
3708             regno = REGNO (i2dest);
3709             INC_REG_N_SETS (regno, -1);
3710           }
3711       }
3712
3713     if (i1 && REG_P (i1dest))
3714       {
3715         rtx link;
3716         rtx i1_insn = 0, i1_val = 0, set;
3717
3718         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
3719           if ((set = single_set (XEXP (link, 0))) != 0
3720               && rtx_equal_p (i1dest, SET_DEST (set)))
3721             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
3722
3723         record_value_for_reg (i1dest, i1_insn, i1_val);
3724
3725         regno = REGNO (i1dest);
3726         if (! added_sets_1 && ! i1dest_in_i1src)
3727           INC_REG_N_SETS (regno, -1);
3728       }
3729
3730     /* Update reg_stat[].nonzero_bits et al for any changes that may have
3731        been made to this insn.  The order of
3732        set_nonzero_bits_and_sign_copies() is important.  Because newi2pat
3733        can affect nonzero_bits of newpat */
3734     if (newi2pat)
3735       note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
3736     note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
3737   }
3738
3739   if (undobuf.other_insn != NULL_RTX)
3740     {
3741       if (dump_file)
3742         {
3743           fprintf (dump_file, "modifying other_insn ");
3744           dump_insn_slim (dump_file, undobuf.other_insn);
3745         }
3746       df_insn_rescan (undobuf.other_insn);
3747     }
3748
3749   if (i1 && !(NOTE_P(i1) && (NOTE_KIND (i1) == NOTE_INSN_DELETED)))
3750     {
3751       if (dump_file)
3752         {
3753           fprintf (dump_file, "modifying insn i1 ");
3754           dump_insn_slim (dump_file, i1);
3755         }
3756       df_insn_rescan (i1);
3757     }
3758
3759   if (i2 && !(NOTE_P(i2) && (NOTE_KIND (i2) == NOTE_INSN_DELETED)))
3760     {
3761       if (dump_file)
3762         {
3763           fprintf (dump_file, "modifying insn i2 ");
3764           dump_insn_slim (dump_file, i2);
3765         }
3766       df_insn_rescan (i2);
3767     }
3768
3769   if (i3 && !(NOTE_P(i3) && (NOTE_KIND (i3) == NOTE_INSN_DELETED)))
3770     {
3771       if (dump_file)
3772         {
3773           fprintf (dump_file, "modifying insn i3 ");
3774           dump_insn_slim (dump_file, i3);
3775         }
3776       df_insn_rescan (i3);
3777     }
3778   
3779   /* Set new_direct_jump_p if a new return or simple jump instruction
3780      has been created.  Adjust the CFG accordingly.  */
3781
3782   if (returnjump_p (i3) || any_uncondjump_p (i3))
3783     {
3784       *new_direct_jump_p = 1;
3785       mark_jump_label (PATTERN (i3), i3, 0);
3786       update_cfg_for_uncondjump (i3);
3787     }
3788
3789   if (undobuf.other_insn != NULL_RTX
3790       && (returnjump_p (undobuf.other_insn)
3791           || any_uncondjump_p (undobuf.other_insn)))
3792     {
3793       *new_direct_jump_p = 1;
3794       update_cfg_for_uncondjump (undobuf.other_insn);
3795     }
3796
3797   /* A noop might also need cleaning up of CFG, if it comes from the
3798      simplification of a jump.  */
3799   if (GET_CODE (newpat) == SET
3800       && SET_SRC (newpat) == pc_rtx
3801       && SET_DEST (newpat) == pc_rtx)
3802     {
3803       *new_direct_jump_p = 1;
3804       update_cfg_for_uncondjump (i3);
3805     }
3806   
3807   combine_successes++;
3808   undo_commit ();
3809
3810   if (added_links_insn
3811       && (newi2pat == 0 || DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i2))
3812       && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i3))
3813     return added_links_insn;
3814   else
3815     return newi2pat ? i2 : i3;
3816 }
3817 \f
3818 /* Undo all the modifications recorded in undobuf.  */
3819
3820 static void
3821 undo_all (void)
3822 {
3823   struct undo *undo, *next;
3824
3825   for (undo = undobuf.undos; undo; undo = next)
3826     {
3827       next = undo->next;
3828       switch (undo->kind)
3829         {
3830         case UNDO_RTX:
3831           *undo->where.r = undo->old_contents.r;
3832           break;
3833         case UNDO_INT:
3834           *undo->where.i = undo->old_contents.i;
3835           break;
3836         case UNDO_MODE:
3837           adjust_reg_mode (*undo->where.r, undo->old_contents.m);
3838           break;
3839         default:
3840           gcc_unreachable ();
3841         }
3842
3843       undo->next = undobuf.frees;
3844       undobuf.frees = undo;
3845     }
3846
3847   undobuf.undos = 0;
3848 }
3849
3850 /* We've committed to accepting the changes we made.  Move all
3851    of the undos to the free list.  */
3852
3853 static void
3854 undo_commit (void)
3855 {
3856   struct undo *undo, *next;
3857
3858   for (undo = undobuf.undos; undo; undo = next)
3859     {
3860       next = undo->next;
3861       undo->next = undobuf.frees;
3862       undobuf.frees = undo;
3863     }
3864   undobuf.undos = 0;
3865 }
3866 \f
3867 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
3868    where we have an arithmetic expression and return that point.  LOC will
3869    be inside INSN.
3870
3871    try_combine will call this function to see if an insn can be split into
3872    two insns.  */
3873
3874 static rtx *
3875 find_split_point (rtx *loc, rtx insn)
3876 {
3877   rtx x = *loc;
3878   enum rtx_code code = GET_CODE (x);
3879   rtx *split;
3880   unsigned HOST_WIDE_INT len = 0;
3881   HOST_WIDE_INT pos = 0;
3882   int unsignedp = 0;
3883   rtx inner = NULL_RTX;
3884
3885   /* First special-case some codes.  */
3886   switch (code)
3887     {
3888     case SUBREG:
3889 #ifdef INSN_SCHEDULING
3890       /* If we are making a paradoxical SUBREG invalid, it becomes a split
3891          point.  */
3892       if (MEM_P (SUBREG_REG (x)))
3893         return loc;
3894 #endif
3895       return find_split_point (&SUBREG_REG (x), insn);
3896
3897     case MEM:
3898 #ifdef HAVE_lo_sum
3899       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
3900          using LO_SUM and HIGH.  */
3901       if (GET_CODE (XEXP (x, 0)) == CONST
3902           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
3903         {
3904           SUBST (XEXP (x, 0),
3905                  gen_rtx_LO_SUM (Pmode,
3906                                  gen_rtx_HIGH (Pmode, XEXP (x, 0)),
3907                                  XEXP (x, 0)));
3908           return &XEXP (XEXP (x, 0), 0);
3909         }
3910 #endif
3911
3912       /* If we have a PLUS whose second operand is a constant and the
3913          address is not valid, perhaps will can split it up using
3914          the machine-specific way to split large constants.  We use
3915          the first pseudo-reg (one of the virtual regs) as a placeholder;
3916          it will not remain in the result.  */
3917       if (GET_CODE (XEXP (x, 0)) == PLUS
3918           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3919           && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
3920         {
3921           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
3922           rtx seq = combine_split_insns (gen_rtx_SET (VOIDmode, reg,
3923                                                       XEXP (x, 0)),
3924                                          subst_insn);
3925
3926           /* This should have produced two insns, each of which sets our
3927              placeholder.  If the source of the second is a valid address,
3928              we can make put both sources together and make a split point
3929              in the middle.  */
3930
3931           if (seq
3932               && NEXT_INSN (seq) != NULL_RTX
3933               && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
3934               && NONJUMP_INSN_P (seq)
3935               && GET_CODE (PATTERN (seq)) == SET
3936               && SET_DEST (PATTERN (seq)) == reg
3937               && ! reg_mentioned_p (reg,
3938                                     SET_SRC (PATTERN (seq)))
3939               && NONJUMP_INSN_P (NEXT_INSN (seq))
3940               && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
3941               && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
3942               && memory_address_p (GET_MODE (x),
3943                                    SET_SRC (PATTERN (NEXT_INSN (seq)))))
3944             {
3945               rtx src1 = SET_SRC (PATTERN (seq));
3946               rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
3947
3948               /* Replace the placeholder in SRC2 with SRC1.  If we can
3949                  find where in SRC2 it was placed, that can become our
3950                  split point and we can replace this address with SRC2.
3951                  Just try two obvious places.  */
3952
3953               src2 = replace_rtx (src2, reg, src1);
3954               split = 0;
3955               if (XEXP (src2, 0) == src1)
3956                 split = &XEXP (src2, 0);
3957               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
3958                        && XEXP (XEXP (src2, 0), 0) == src1)
3959                 split = &XEXP (XEXP (src2, 0), 0);
3960
3961               if (split)
3962                 {
3963                   SUBST (XEXP (x, 0), src2);
3964                   return split;
3965                 }
3966             }
3967
3968           /* If that didn't work, perhaps the first operand is complex and
3969              needs to be computed separately, so make a split point there.
3970              This will occur on machines that just support REG + CONST
3971              and have a constant moved through some previous computation.  */
3972
3973           else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
3974                    && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
3975                          && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
3976             return &XEXP (XEXP (x, 0), 0);
3977         }
3978
3979       /* If we have a PLUS whose first operand is complex, try computing it
3980          separately by making a split there.  */
3981       if (GET_CODE (XEXP (x, 0)) == PLUS
3982           && ! memory_address_p (GET_MODE (x), XEXP (x, 0))
3983           && ! OBJECT_P (XEXP (XEXP (x, 0), 0))
3984           && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
3985                 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
3986         return &XEXP (XEXP (x, 0), 0);
3987       break;
3988
3989     case SET:
3990 #ifdef HAVE_cc0
3991       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
3992          ZERO_EXTRACT, the most likely reason why this doesn't match is that
3993          we need to put the operand into a register.  So split at that
3994          point.  */
3995
3996       if (SET_DEST (x) == cc0_rtx
3997           && GET_CODE (SET_SRC (x)) != COMPARE
3998           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
3999           && !OBJECT_P (SET_SRC (x))
4000           && ! (GET_CODE (SET_SRC (x)) == SUBREG
4001                 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
4002         return &SET_SRC (x);
4003 #endif
4004
4005       /* See if we can split SET_SRC as it stands.  */
4006       split = find_split_point (&SET_SRC (x), insn);
4007       if (split && split != &SET_SRC (x))
4008         return split;
4009
4010       /* See if we can split SET_DEST as it stands.  */
4011       split = find_split_point (&SET_DEST (x), insn);
4012       if (split && split != &SET_DEST (x))
4013         return split;
4014
4015       /* See if this is a bitfield assignment with everything constant.  If
4016          so, this is an IOR of an AND, so split it into that.  */
4017       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
4018           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
4019               <= HOST_BITS_PER_WIDE_INT)
4020           && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
4021           && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
4022           && GET_CODE (SET_SRC (x)) == CONST_INT
4023           && ((INTVAL (XEXP (SET_DEST (x), 1))
4024                + INTVAL (XEXP (SET_DEST (x), 2)))
4025               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
4026           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
4027         {
4028           HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
4029           unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
4030           unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
4031           rtx dest = XEXP (SET_DEST (x), 0);
4032           enum machine_mode mode = GET_MODE (dest);
4033           unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
4034           rtx or_mask;
4035
4036           if (BITS_BIG_ENDIAN)
4037             pos = GET_MODE_BITSIZE (mode) - len - pos;
4038
4039           or_mask = gen_int_mode (src << pos, mode);
4040           if (src == mask)
4041             SUBST (SET_SRC (x),
4042                    simplify_gen_binary (IOR, mode, dest, or_mask));
4043           else
4044             {
4045               rtx negmask = gen_int_mode (~(mask << pos), mode);
4046               SUBST (SET_SRC (x),
4047                      simplify_gen_binary (IOR, mode,
4048                                           simplify_gen_binary (AND, mode,
4049                                                                dest, negmask),
4050                                           or_mask));
4051             }
4052
4053           SUBST (SET_DEST (x), dest);
4054
4055           split = find_split_point (&SET_SRC (x), insn);
4056           if (split && split != &SET_SRC (x))
4057             return split;
4058         }
4059
4060       /* Otherwise, see if this is an operation that we can split into two.
4061          If so, try to split that.  */
4062       code = GET_CODE (SET_SRC (x));
4063
4064       switch (code)
4065         {
4066         case AND:
4067           /* If we are AND'ing with a large constant that is only a single
4068              bit and the result is only being used in a context where we
4069              need to know if it is zero or nonzero, replace it with a bit
4070              extraction.  This will avoid the large constant, which might
4071              have taken more than one insn to make.  If the constant were
4072              not a valid argument to the AND but took only one insn to make,
4073              this is no worse, but if it took more than one insn, it will
4074              be better.  */
4075
4076           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
4077               && REG_P (XEXP (SET_SRC (x), 0))
4078               && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
4079               && REG_P (SET_DEST (x))
4080               && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
4081               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
4082               && XEXP (*split, 0) == SET_DEST (x)
4083               && XEXP (*split, 1) == const0_rtx)
4084             {
4085               rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
4086                                                 XEXP (SET_SRC (x), 0),
4087                                                 pos, NULL_RTX, 1, 1, 0, 0);
4088               if (extraction != 0)
4089                 {
4090                   SUBST (SET_SRC (x), extraction);
4091                   return find_split_point (loc, insn);
4092                 }
4093             }
4094           break;
4095
4096         case NE:
4097           /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
4098              is known to be on, this can be converted into a NEG of a shift.  */
4099           if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
4100               && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
4101               && 1 <= (pos = exact_log2
4102                        (nonzero_bits (XEXP (SET_SRC (x), 0),
4103                                       GET_MODE (XEXP (SET_SRC (x), 0))))))
4104             {
4105               enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
4106
4107               SUBST (SET_SRC (x),
4108                      gen_rtx_NEG (mode,
4109                                   gen_rtx_LSHIFTRT (mode,
4110                                                     XEXP (SET_SRC (x), 0),
4111                                                     GEN_INT (pos))));
4112
4113               split = find_split_point (&SET_SRC (x), insn);
4114               if (split && split != &SET_SRC (x))
4115                 return split;
4116             }
4117           break;
4118
4119         case SIGN_EXTEND:
4120           inner = XEXP (SET_SRC (x), 0);
4121
4122           /* We can't optimize if either mode is a partial integer
4123              mode as we don't know how many bits are significant
4124              in those modes.  */
4125           if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
4126               || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
4127             break;
4128
4129           pos = 0;
4130           len = GET_MODE_BITSIZE (GET_MODE (inner));
4131           unsignedp = 0;
4132           break;
4133
4134         case SIGN_EXTRACT:
4135         case ZERO_EXTRACT:
4136           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
4137               && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
4138             {
4139               inner = XEXP (SET_SRC (x), 0);
4140               len = INTVAL (XEXP (SET_SRC (x), 1));
4141               pos = INTVAL (XEXP (SET_SRC (x), 2));
4142
4143               if (BITS_BIG_ENDIAN)
4144                 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
4145               unsignedp = (code == ZERO_EXTRACT);
4146             }
4147           break;
4148
4149         default:
4150           break;
4151         }
4152
4153       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
4154         {
4155           enum machine_mode mode = GET_MODE (SET_SRC (x));
4156
4157           /* For unsigned, we have a choice of a shift followed by an
4158              AND or two shifts.  Use two shifts for field sizes where the
4159              constant might be too large.  We assume here that we can
4160              always at least get 8-bit constants in an AND insn, which is
4161              true for every current RISC.  */
4162
4163           if (unsignedp && len <= 8)
4164             {
4165               SUBST (SET_SRC (x),
4166                      gen_rtx_AND (mode,
4167                                   gen_rtx_LSHIFTRT
4168                                   (mode, gen_lowpart (mode, inner),
4169                                    GEN_INT (pos)),
4170                                   GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
4171
4172               split = find_split_point (&SET_SRC (x), insn);
4173               if (split && split != &SET_SRC (x))
4174                 return split;
4175             }
4176           else
4177             {
4178               SUBST (SET_SRC (x),
4179                      gen_rtx_fmt_ee
4180                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
4181                       gen_rtx_ASHIFT (mode,
4182                                       gen_lowpart (mode, inner),
4183                                       GEN_INT (GET_MODE_BITSIZE (mode)
4184                                                - len - pos)),
4185                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
4186
4187               split = find_split_point (&SET_SRC (x), insn);
4188               if (split && split != &SET_SRC (x))
4189                 return split;
4190             }
4191         }
4192
4193       /* See if this is a simple operation with a constant as the second
4194          operand.  It might be that this constant is out of range and hence
4195          could be used as a split point.  */
4196       if (BINARY_P (SET_SRC (x))
4197           && CONSTANT_P (XEXP (SET_SRC (x), 1))
4198           && (OBJECT_P (XEXP (SET_SRC (x), 0))
4199               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
4200                   && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
4201         return &XEXP (SET_SRC (x), 1);
4202
4203       /* Finally, see if this is a simple operation with its first operand
4204          not in a register.  The operation might require this operand in a
4205          register, so return it as a split point.  We can always do this
4206          because if the first operand were another operation, we would have
4207          already found it as a split point.  */
4208       if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
4209           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
4210         return &XEXP (SET_SRC (x), 0);
4211
4212       return 0;
4213
4214     case AND:
4215     case IOR:
4216       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
4217          it is better to write this as (not (ior A B)) so we can split it.
4218          Similarly for IOR.  */
4219       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
4220         {
4221           SUBST (*loc,
4222                  gen_rtx_NOT (GET_MODE (x),
4223                               gen_rtx_fmt_ee (code == IOR ? AND : IOR,
4224                                               GET_MODE (x),
4225                                               XEXP (XEXP (x, 0), 0),
4226                                               XEXP (XEXP (x, 1), 0))));
4227           return find_split_point (loc, insn);
4228         }
4229
4230       /* Many RISC machines have a large set of logical insns.  If the
4231          second operand is a NOT, put it first so we will try to split the
4232          other operand first.  */
4233       if (GET_CODE (XEXP (x, 1)) == NOT)
4234         {
4235           rtx tem = XEXP (x, 0);
4236           SUBST (XEXP (x, 0), XEXP (x, 1));
4237           SUBST (XEXP (x, 1), tem);
4238         }
4239       break;
4240
4241     default:
4242       break;
4243     }
4244
4245   /* Otherwise, select our actions depending on our rtx class.  */
4246   switch (GET_RTX_CLASS (code))
4247     {
4248     case RTX_BITFIELD_OPS:              /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
4249     case RTX_TERNARY:
4250       split = find_split_point (&XEXP (x, 2), insn);
4251       if (split)
4252         return split;
4253       /* ... fall through ...  */
4254     case RTX_BIN_ARITH:
4255     case RTX_COMM_ARITH:
4256     case RTX_COMPARE:
4257     case RTX_COMM_COMPARE:
4258       split = find_split_point (&XEXP (x, 1), insn);
4259       if (split)
4260         return split;
4261       /* ... fall through ...  */
4262     case RTX_UNARY:
4263       /* Some machines have (and (shift ...) ...) insns.  If X is not
4264          an AND, but XEXP (X, 0) is, use it as our split point.  */
4265       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
4266         return &XEXP (x, 0);
4267
4268       split = find_split_point (&XEXP (x, 0), insn);
4269       if (split)
4270         return split;
4271       return loc;
4272
4273     default:
4274       /* Otherwise, we don't have a split point.  */
4275       return 0;
4276     }
4277 }
4278 \f
4279 /* Throughout X, replace FROM with TO, and return the result.
4280    The result is TO if X is FROM;
4281    otherwise the result is X, but its contents may have been modified.
4282    If they were modified, a record was made in undobuf so that
4283    undo_all will (among other things) return X to its original state.
4284
4285    If the number of changes necessary is too much to record to undo,
4286    the excess changes are not made, so the result is invalid.
4287    The changes already made can still be undone.
4288    undobuf.num_undo is incremented for such changes, so by testing that
4289    the caller can tell whether the result is valid.
4290
4291    `n_occurrences' is incremented each time FROM is replaced.
4292
4293    IN_DEST is nonzero if we are processing the SET_DEST of a SET.
4294
4295    UNIQUE_COPY is nonzero if each substitution must be unique.  We do this
4296    by copying if `n_occurrences' is nonzero.  */
4297
4298 static rtx
4299 subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
4300 {
4301   enum rtx_code code = GET_CODE (x);
4302   enum machine_mode op0_mode = VOIDmode;
4303   const char *fmt;
4304   int len, i;
4305   rtx new_rtx;
4306
4307 /* Two expressions are equal if they are identical copies of a shared
4308    RTX or if they are both registers with the same register number
4309    and mode.  */
4310
4311 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
4312   ((X) == (Y)                                           \
4313    || (REG_P (X) && REG_P (Y)   \
4314        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
4315
4316   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
4317     {
4318       n_occurrences++;
4319       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
4320     }
4321
4322   /* If X and FROM are the same register but different modes, they
4323      will not have been seen as equal above.  However, the log links code
4324      will make a LOG_LINKS entry for that case.  If we do nothing, we
4325      will try to rerecognize our original insn and, when it succeeds,
4326      we will delete the feeding insn, which is incorrect.
4327
4328      So force this insn not to match in this (rare) case.  */
4329   if (! in_dest && code == REG && REG_P (from)
4330       && reg_overlap_mentioned_p (x, from))
4331     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
4332
4333   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
4334      of which may contain things that can be combined.  */
4335   if (code != MEM && code != LO_SUM && OBJECT_P (x))
4336     return x;
4337
4338   /* It is possible to have a subexpression appear twice in the insn.
4339      Suppose that FROM is a register that appears within TO.
4340      Then, after that subexpression has been scanned once by `subst',
4341      the second time it is scanned, TO may be found.  If we were
4342      to scan TO here, we would find FROM within it and create a
4343      self-referent rtl structure which is completely wrong.  */
4344   if (COMBINE_RTX_EQUAL_P (x, to))
4345     return to;
4346
4347   /* Parallel asm_operands need special attention because all of the
4348      inputs are shared across the arms.  Furthermore, unsharing the
4349      rtl results in recognition failures.  Failure to handle this case
4350      specially can result in circular rtl.
4351
4352      Solve this by doing a normal pass across the first entry of the
4353      parallel, and only processing the SET_DESTs of the subsequent
4354      entries.  Ug.  */
4355
4356   if (code == PARALLEL
4357       && GET_CODE (XVECEXP (x, 0, 0)) == SET
4358       && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
4359     {
4360       new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
4361
4362       /* If this substitution failed, this whole thing fails.  */
4363       if (GET_CODE (new_rtx) == CLOBBER
4364           && XEXP (new_rtx, 0) == const0_rtx)
4365         return new_rtx;
4366
4367       SUBST (XVECEXP (x, 0, 0), new_rtx);
4368
4369       for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
4370         {
4371           rtx dest = SET_DEST (XVECEXP (x, 0, i));
4372
4373           if (!REG_P (dest)
4374               && GET_CODE (dest) != CC0
4375               && GET_CODE (dest) != PC)
4376             {
4377               new_rtx = subst (dest, from, to, 0, unique_copy);
4378
4379               /* If this substitution failed, this whole thing fails.  */
4380               if (GET_CODE (new_rtx) == CLOBBER
4381                   && XEXP (new_rtx, 0) == const0_rtx)
4382                 return new_rtx;
4383
4384               SUBST (SET_DEST (XVECEXP (x, 0, i)), new_rtx);
4385             }
4386         }
4387     }
4388   else
4389     {
4390       len = GET_RTX_LENGTH (code);
4391       fmt = GET_RTX_FORMAT (code);
4392
4393       /* We don't need to process a SET_DEST that is a register, CC0,
4394          or PC, so set up to skip this common case.  All other cases
4395          where we want to suppress replacing something inside a
4396          SET_SRC are handled via the IN_DEST operand.  */
4397       if (code == SET
4398           && (REG_P (SET_DEST (x))
4399               || GET_CODE (SET_DEST (x)) == CC0
4400               || GET_CODE (SET_DEST (x)) == PC))
4401         fmt = "ie";
4402
4403       /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
4404          constant.  */
4405       if (fmt[0] == 'e')
4406         op0_mode = GET_MODE (XEXP (x, 0));
4407
4408       for (i = 0; i < len; i++)
4409         {
4410           if (fmt[i] == 'E')
4411             {
4412               int j;
4413               for (j = XVECLEN (x, i) - 1; j >= 0; j--)
4414                 {
4415                   if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
4416                     {
4417                       new_rtx = (unique_copy && n_occurrences
4418                              ? copy_rtx (to) : to);
4419                       n_occurrences++;
4420                     }
4421                   else
4422                     {
4423                       new_rtx = subst (XVECEXP (x, i, j), from, to, 0,
4424                                    unique_copy);
4425
4426                       /* If this substitution failed, this whole thing
4427                          fails.  */
4428                       if (GET_CODE (new_rtx) == CLOBBER
4429                           && XEXP (new_rtx, 0) == const0_rtx)
4430                         return new_rtx;
4431                     }
4432
4433                   SUBST (XVECEXP (x, i, j), new_rtx);
4434                 }
4435             }
4436           else if (fmt[i] == 'e')
4437             {
4438               /* If this is a register being set, ignore it.  */
4439               new_rtx = XEXP (x, i);
4440               if (in_dest
4441                   && i == 0
4442                   && (((code == SUBREG || code == ZERO_EXTRACT)
4443                        && REG_P (new_rtx))
4444                       || code == STRICT_LOW_PART))
4445                 ;
4446
4447               else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
4448                 {
4449                   /* In general, don't install a subreg involving two
4450                      modes not tieable.  It can worsen register
4451                      allocation, and can even make invalid reload
4452                      insns, since the reg inside may need to be copied
4453                      from in the outside mode, and that may be invalid
4454                      if it is an fp reg copied in integer mode.
4455
4456                      We allow two exceptions to this: It is valid if
4457                      it is inside another SUBREG and the mode of that
4458                      SUBREG and the mode of the inside of TO is
4459                      tieable and it is valid if X is a SET that copies
4460                      FROM to CC0.  */
4461
4462                   if (GET_CODE (to) == SUBREG
4463                       && ! MODES_TIEABLE_P (GET_MODE (to),
4464                                             GET_MODE (SUBREG_REG (to)))
4465                       && ! (code == SUBREG
4466                             && MODES_TIEABLE_P (GET_MODE (x),
4467                                                 GET_MODE (SUBREG_REG (to))))
4468 #ifdef HAVE_cc0
4469                       && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
4470 #endif
4471                       )
4472                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
4473
4474 #ifdef CANNOT_CHANGE_MODE_CLASS
4475                   if (code == SUBREG
4476                       && REG_P (to)
4477                       && REGNO (to) < FIRST_PSEUDO_REGISTER
4478                       && REG_CANNOT_CHANGE_MODE_P (REGNO (to),
4479                                                    GET_MODE (to),
4480                                                    GET_MODE (x)))
4481                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
4482 #endif
4483
4484                   new_rtx = (unique_copy && n_occurrences ? copy_rtx (to) : to);
4485                   n_occurrences++;
4486                 }
4487               else
4488                 /* If we are in a SET_DEST, suppress most cases unless we
4489                    have gone inside a MEM, in which case we want to
4490                    simplify the address.  We assume here that things that
4491                    are actually part of the destination have their inner
4492                    parts in the first expression.  This is true for SUBREG,
4493                    STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
4494                    things aside from REG and MEM that should appear in a
4495                    SET_DEST.  */
4496                 new_rtx = subst (XEXP (x, i), from, to,
4497                              (((in_dest
4498                                 && (code == SUBREG || code == STRICT_LOW_PART
4499                                     || code == ZERO_EXTRACT))
4500                                || code == SET)
4501                               && i == 0), unique_copy);
4502
4503               /* If we found that we will have to reject this combination,
4504                  indicate that by returning the CLOBBER ourselves, rather than
4505                  an expression containing it.  This will speed things up as
4506                  well as prevent accidents where two CLOBBERs are considered
4507                  to be equal, thus producing an incorrect simplification.  */
4508
4509               if (GET_CODE (new_rtx) == CLOBBER && XEXP (new_rtx, 0) == const0_rtx)
4510                 return new_rtx;
4511
4512               if (GET_CODE (x) == SUBREG
4513                   && (GET_CODE (new_rtx) == CONST_INT
4514                       || GET_CODE (new_rtx) == CONST_DOUBLE))
4515                 {
4516                   enum machine_mode mode = GET_MODE (x);
4517
4518                   x = simplify_subreg (GET_MODE (x), new_rtx,
4519                                        GET_MODE (SUBREG_REG (x)),
4520                                        SUBREG_BYTE (x));
4521                   if (! x)
4522                     x = gen_rtx_CLOBBER (mode, const0_rtx);
4523                 }
4524               else if (GET_CODE (new_rtx) == CONST_INT
4525                        && GET_CODE (x) == ZERO_EXTEND)
4526                 {
4527                   x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
4528                                                 new_rtx, GET_MODE (XEXP (x, 0)));
4529                   gcc_assert (x);
4530                 }
4531               else
4532                 SUBST (XEXP (x, i), new_rtx);
4533             }
4534         }
4535     }
4536
4537   /* Check if we are loading something from the constant pool via float
4538      extension; in this case we would undo compress_float_constant
4539      optimization and degenerate constant load to an immediate value.  */
4540   if (GET_CODE (x) == FLOAT_EXTEND
4541       && MEM_P (XEXP (x, 0))
4542       && MEM_READONLY_P (XEXP (x, 0)))
4543     {
4544       rtx tmp = avoid_constant_pool_reference (x);
4545       if (x != tmp)
4546         return x;
4547     }
4548
4549   /* Try to simplify X.  If the simplification changed the code, it is likely
4550      that further simplification will help, so loop, but limit the number
4551      of repetitions that will be performed.  */
4552
4553   for (i = 0; i < 4; i++)
4554     {
4555       /* If X is sufficiently simple, don't bother trying to do anything
4556          with it.  */
4557       if (code != CONST_INT && code != REG && code != CLOBBER)
4558         x = combine_simplify_rtx (x, op0_mode, in_dest);
4559
4560       if (GET_CODE (x) == code)
4561         break;
4562
4563       code = GET_CODE (x);
4564
4565       /* We no longer know the original mode of operand 0 since we
4566          have changed the form of X)  */
4567       op0_mode = VOIDmode;
4568     }
4569
4570   return x;
4571 }
4572 \f
4573 /* Simplify X, a piece of RTL.  We just operate on the expression at the
4574    outer level; call `subst' to simplify recursively.  Return the new
4575    expression.
4576
4577    OP0_MODE is the original mode of XEXP (x, 0).  IN_DEST is nonzero
4578    if we are inside a SET_DEST.  */
4579
4580 static rtx
4581 combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
4582 {
4583   enum rtx_code code = GET_CODE (x);
4584   enum machine_mode mode = GET_MODE (x);
4585   rtx temp;
4586   int i;
4587
4588   /* If this is a commutative operation, put a constant last and a complex
4589      expression first.  We don't need to do this for comparisons here.  */
4590   if (COMMUTATIVE_ARITH_P (x)
4591       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
4592     {
4593       temp = XEXP (x, 0);
4594       SUBST (XEXP (x, 0), XEXP (x, 1));
4595       SUBST (XEXP (x, 1), temp);
4596     }
4597
4598   /* If this is a simple operation applied to an IF_THEN_ELSE, try
4599      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
4600      things.  Check for cases where both arms are testing the same
4601      condition.
4602
4603      Don't do anything if all operands are very simple.  */
4604
4605   if ((BINARY_P (x)
4606        && ((!OBJECT_P (XEXP (x, 0))
4607             && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4608                   && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
4609            || (!OBJECT_P (XEXP (x, 1))
4610                && ! (GET_CODE (XEXP (x, 1)) == SUBREG
4611                      && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
4612       || (UNARY_P (x)
4613           && (!OBJECT_P (XEXP (x, 0))
4614                && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4615                      && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
4616     {
4617       rtx cond, true_rtx, false_rtx;
4618
4619       cond = if_then_else_cond (x, &true_rtx, &false_rtx);
4620       if (cond != 0
4621           /* If everything is a comparison, what we have is highly unlikely
4622              to be simpler, so don't use it.  */
4623           && ! (COMPARISON_P (x)
4624                 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
4625         {
4626           rtx cop1 = const0_rtx;
4627           enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
4628
4629           if (cond_code == NE && COMPARISON_P (cond))
4630             return x;
4631
4632           /* Simplify the alternative arms; this may collapse the true and
4633              false arms to store-flag values.  Be careful to use copy_rtx
4634              here since true_rtx or false_rtx might share RTL with x as a
4635              result of the if_then_else_cond call above.  */
4636           true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0);
4637           false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0);
4638
4639           /* If true_rtx and false_rtx are not general_operands, an if_then_else
4640              is unlikely to be simpler.  */
4641           if (general_operand (true_rtx, VOIDmode)
4642               && general_operand (false_rtx, VOIDmode))
4643             {
4644               enum rtx_code reversed;
4645
4646               /* Restarting if we generate a store-flag expression will cause
4647                  us to loop.  Just drop through in this case.  */
4648
4649               /* If the result values are STORE_FLAG_VALUE and zero, we can
4650                  just make the comparison operation.  */
4651               if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
4652                 x = simplify_gen_relational (cond_code, mode, VOIDmode,
4653                                              cond, cop1);
4654               else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
4655                        && ((reversed = reversed_comparison_code_parts
4656                                         (cond_code, cond, cop1, NULL))
4657                            != UNKNOWN))
4658                 x = simplify_gen_relational (reversed, mode, VOIDmode,
4659                                              cond, cop1);
4660
4661               /* Likewise, we can make the negate of a comparison operation
4662                  if the result values are - STORE_FLAG_VALUE and zero.  */
4663               else if (GET_CODE (true_rtx) == CONST_INT
4664                        && INTVAL (true_rtx) == - STORE_FLAG_VALUE
4665                        && false_rtx == const0_rtx)
4666                 x = simplify_gen_unary (NEG, mode,
4667                                         simplify_gen_relational (cond_code,
4668                                                                  mode, VOIDmode,
4669                                                                  cond, cop1),
4670                                         mode);
4671               else if (GET_CODE (false_rtx) == CONST_INT
4672                        && INTVAL (false_rtx) == - STORE_FLAG_VALUE
4673                        && true_rtx == const0_rtx
4674                        && ((reversed = reversed_comparison_code_parts
4675                                         (cond_code, cond, cop1, NULL))
4676                            != UNKNOWN))
4677                 x = simplify_gen_unary (NEG, mode,
4678                                         simplify_gen_relational (reversed,
4679                                                                  mode, VOIDmode,
4680                                                                  cond, cop1),
4681                                         mode);
4682               else
4683                 return gen_rtx_IF_THEN_ELSE (mode,
4684                                              simplify_gen_relational (cond_code,
4685                                                                       mode,
4686                                                                       VOIDmode,
4687                                                                       cond,
4688                                                                       cop1),
4689                                              true_rtx, false_rtx);
4690
4691               code = GET_CODE (x);
4692               op0_mode = VOIDmode;
4693             }
4694         }
4695     }
4696
4697   /* Try to fold this expression in case we have constants that weren't
4698      present before.  */
4699   temp = 0;
4700   switch (GET_RTX_CLASS (code))
4701     {
4702     case RTX_UNARY:
4703       if (op0_mode == VOIDmode)
4704         op0_mode = GET_MODE (XEXP (x, 0));
4705       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
4706       break;
4707     case RTX_COMPARE:
4708     case RTX_COMM_COMPARE:
4709       {
4710         enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
4711         if (cmp_mode == VOIDmode)
4712           {
4713             cmp_mode = GET_MODE (XEXP (x, 1));
4714             if (cmp_mode == VOIDmode)
4715               cmp_mode = op0_mode;
4716           }
4717         temp = simplify_relational_operation (code, mode, cmp_mode,
4718                                               XEXP (x, 0), XEXP (x, 1));
4719       }
4720       break;
4721     case RTX_COMM_ARITH:
4722     case RTX_BIN_ARITH:
4723       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
4724       break;
4725     case RTX_BITFIELD_OPS:
4726     case RTX_TERNARY:
4727       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
4728                                          XEXP (x, 1), XEXP (x, 2));
4729       break;
4730     default:
4731       break;
4732     }
4733
4734   if (temp)
4735     {
4736       x = temp;
4737       code = GET_CODE (temp);
4738       op0_mode = VOIDmode;
4739       mode = GET_MODE (temp);
4740     }
4741
4742   /* First see if we can apply the inverse distributive law.  */
4743   if (code == PLUS || code == MINUS
4744       || code == AND || code == IOR || code == XOR)
4745     {
4746       x = apply_distributive_law (x);
4747       code = GET_CODE (x);
4748       op0_mode = VOIDmode;
4749     }
4750
4751   /* If CODE is an associative operation not otherwise handled, see if we
4752      can associate some operands.  This can win if they are constants or
4753      if they are logically related (i.e. (a & b) & a).  */
4754   if ((code == PLUS || code == MINUS || code == MULT || code == DIV
4755        || code == AND || code == IOR || code == XOR
4756        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
4757       && ((INTEGRAL_MODE_P (mode) && code != DIV)
4758           || (flag_associative_math && FLOAT_MODE_P (mode))))
4759     {
4760       if (GET_CODE (XEXP (x, 0)) == code)
4761         {
4762           rtx other = XEXP (XEXP (x, 0), 0);
4763           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
4764           rtx inner_op1 = XEXP (x, 1);
4765           rtx inner;
4766
4767           /* Make sure we pass the constant operand if any as the second
4768              one if this is a commutative operation.  */
4769           if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
4770             {
4771               rtx tem = inner_op0;
4772               inner_op0 = inner_op1;
4773               inner_op1 = tem;
4774             }
4775           inner = simplify_binary_operation (code == MINUS ? PLUS
4776                                              : code == DIV ? MULT
4777                                              : code,
4778                                              mode, inner_op0, inner_op1);
4779
4780           /* For commutative operations, try the other pair if that one
4781              didn't simplify.  */
4782           if (inner == 0 && COMMUTATIVE_ARITH_P (x))
4783             {
4784               other = XEXP (XEXP (x, 0), 1);
4785               inner = simplify_binary_operation (code, mode,
4786                                                  XEXP (XEXP (x, 0), 0),
4787                                                  XEXP (x, 1));
4788             }
4789
4790           if (inner)
4791             return simplify_gen_binary (code, mode, other, inner);
4792         }
4793     }
4794
4795   /* A little bit of algebraic simplification here.  */
4796   switch (code)
4797     {
4798     case MEM:
4799       /* Ensure that our address has any ASHIFTs converted to MULT in case
4800          address-recognizing predicates are called later.  */
4801       temp = make_compound_operation (XEXP (x, 0), MEM);
4802       SUBST (XEXP (x, 0), temp);
4803       break;
4804
4805     case SUBREG:
4806       if (op0_mode == VOIDmode)
4807         op0_mode = GET_MODE (SUBREG_REG (x));
4808
4809       /* See if this can be moved to simplify_subreg.  */
4810       if (CONSTANT_P (SUBREG_REG (x))
4811           && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
4812              /* Don't call gen_lowpart if the inner mode
4813                 is VOIDmode and we cannot simplify it, as SUBREG without
4814                 inner mode is invalid.  */
4815           && (GET_MODE (SUBREG_REG (x)) != VOIDmode
4816               || gen_lowpart_common (mode, SUBREG_REG (x))))
4817         return gen_lowpart (mode, SUBREG_REG (x));
4818
4819       if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
4820         break;
4821       {
4822         rtx temp;
4823         temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
4824                                 SUBREG_BYTE (x));
4825         if (temp)
4826           return temp;
4827       }
4828
4829       /* Don't change the mode of the MEM if that would change the meaning
4830          of the address.  */
4831       if (MEM_P (SUBREG_REG (x))
4832           && (MEM_VOLATILE_P (SUBREG_REG (x))
4833               || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
4834         return gen_rtx_CLOBBER (mode, const0_rtx);
4835
4836       /* Note that we cannot do any narrowing for non-constants since
4837          we might have been counting on using the fact that some bits were
4838          zero.  We now do this in the SET.  */
4839
4840       break;
4841
4842     case NEG:
4843       temp = expand_compound_operation (XEXP (x, 0));
4844
4845       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
4846          replaced by (lshiftrt X C).  This will convert
4847          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
4848
4849       if (GET_CODE (temp) == ASHIFTRT
4850           && GET_CODE (XEXP (temp, 1)) == CONST_INT
4851           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
4852         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (temp, 0),
4853                                      INTVAL (XEXP (temp, 1)));
4854
4855       /* If X has only a single bit that might be nonzero, say, bit I, convert
4856          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
4857          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
4858          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
4859          or a SUBREG of one since we'd be making the expression more
4860          complex if it was just a register.  */
4861
4862       if (!REG_P (temp)
4863           && ! (GET_CODE (temp) == SUBREG
4864                 && REG_P (SUBREG_REG (temp)))
4865           && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
4866         {
4867           rtx temp1 = simplify_shift_const
4868             (NULL_RTX, ASHIFTRT, mode,
4869              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
4870                                    GET_MODE_BITSIZE (mode) - 1 - i),
4871              GET_MODE_BITSIZE (mode) - 1 - i);
4872
4873           /* If all we did was surround TEMP with the two shifts, we
4874              haven't improved anything, so don't use it.  Otherwise,
4875              we are better off with TEMP1.  */
4876           if (GET_CODE (temp1) != ASHIFTRT
4877               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
4878               || XEXP (XEXP (temp1, 0), 0) != temp)
4879             return temp1;
4880         }
4881       break;
4882
4883     case TRUNCATE:
4884       /* We can't handle truncation to a partial integer mode here
4885          because we don't know the real bitsize of the partial
4886          integer mode.  */
4887       if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
4888         break;
4889
4890       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4891           && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
4892                                     GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
4893         SUBST (XEXP (x, 0),
4894                force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
4895                               GET_MODE_MASK (mode), 0));
4896
4897       /* Similarly to what we do in simplify-rtx.c, a truncate of a register
4898          whose value is a comparison can be replaced with a subreg if
4899          STORE_FLAG_VALUE permits.  */
4900       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4901           && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
4902           && (temp = get_last_value (XEXP (x, 0)))
4903           && COMPARISON_P (temp))
4904         return gen_lowpart (mode, XEXP (x, 0));
4905       break;
4906
4907 #ifdef HAVE_cc0
4908     case COMPARE:
4909       /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
4910          using cc0, in which case we want to leave it as a COMPARE
4911          so we can distinguish it from a register-register-copy.  */
4912       if (XEXP (x, 1) == const0_rtx)
4913         return XEXP (x, 0);
4914
4915       /* x - 0 is the same as x unless x's mode has signed zeros and
4916          allows rounding towards -infinity.  Under those conditions,
4917          0 - 0 is -0.  */
4918       if (!(HONOR_SIGNED_ZEROS (GET_MODE (XEXP (x, 0)))
4919             && HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (XEXP (x, 0))))
4920           && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
4921         return XEXP (x, 0);
4922       break;
4923 #endif
4924
4925     case CONST:
4926       /* (const (const X)) can become (const X).  Do it this way rather than
4927          returning the inner CONST since CONST can be shared with a
4928          REG_EQUAL note.  */
4929       if (GET_CODE (XEXP (x, 0)) == CONST)
4930         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4931       break;
4932
4933 #ifdef HAVE_lo_sum
4934     case LO_SUM:
4935       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
4936          can add in an offset.  find_split_point will split this address up
4937          again if it doesn't match.  */
4938       if (GET_CODE (XEXP (x, 0)) == HIGH
4939           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
4940         return XEXP (x, 1);
4941       break;
4942 #endif
4943
4944     case PLUS:
4945       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
4946          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
4947          bit-field and can be replaced by either a sign_extend or a
4948          sign_extract.  The `and' may be a zero_extend and the two
4949          <c>, -<c> constants may be reversed.  */
4950       if (GET_CODE (XEXP (x, 0)) == XOR
4951           && GET_CODE (XEXP (x, 1)) == CONST_INT
4952           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4953           && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
4954           && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
4955               || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
4956           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4957           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
4958                && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
4959                && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
4960                    == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
4961               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
4962                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
4963                       == (unsigned int) i + 1))))
4964         return simplify_shift_const
4965           (NULL_RTX, ASHIFTRT, mode,
4966            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4967                                  XEXP (XEXP (XEXP (x, 0), 0), 0),
4968                                  GET_MODE_BITSIZE (mode) - (i + 1)),
4969            GET_MODE_BITSIZE (mode) - (i + 1));
4970
4971       /* If only the low-order bit of X is possibly nonzero, (plus x -1)
4972          can become (ashiftrt (ashift (xor x 1) C) C) where C is
4973          the bitsize of the mode - 1.  This allows simplification of
4974          "a = (b & 8) == 0;"  */
4975       if (XEXP (x, 1) == constm1_rtx
4976           && !REG_P (XEXP (x, 0))
4977           && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4978                 && REG_P (SUBREG_REG (XEXP (x, 0))))
4979           && nonzero_bits (XEXP (x, 0), mode) == 1)
4980         return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
4981            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4982                                  gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
4983                                  GET_MODE_BITSIZE (mode) - 1),
4984            GET_MODE_BITSIZE (mode) - 1);
4985
4986       /* If we are adding two things that have no bits in common, convert
4987          the addition into an IOR.  This will often be further simplified,
4988          for example in cases like ((a & 1) + (a & 2)), which can
4989          become a & 3.  */
4990
4991       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4992           && (nonzero_bits (XEXP (x, 0), mode)
4993               & nonzero_bits (XEXP (x, 1), mode)) == 0)
4994         {
4995           /* Try to simplify the expression further.  */
4996           rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
4997           temp = combine_simplify_rtx (tor, mode, in_dest);
4998
4999           /* If we could, great.  If not, do not go ahead with the IOR
5000              replacement, since PLUS appears in many special purpose
5001              address arithmetic instructions.  */
5002           if (GET_CODE (temp) != CLOBBER && temp != tor)
5003             return temp;
5004         }
5005       break;
5006
5007     case MINUS:
5008       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
5009          (and <foo> (const_int pow2-1))  */
5010       if (GET_CODE (XEXP (x, 1)) == AND
5011           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
5012           && exact_log2 (-INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
5013           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
5014         return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
5015                                        -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
5016       break;
5017
5018     case MULT:
5019       /* If we have (mult (plus A B) C), apply the distributive law and then
5020          the inverse distributive law to see if things simplify.  This
5021          occurs mostly in addresses, often when unrolling loops.  */
5022
5023       if (GET_CODE (XEXP (x, 0)) == PLUS)
5024         {
5025           rtx result = distribute_and_simplify_rtx (x, 0);
5026           if (result)
5027             return result;
5028         }
5029
5030       /* Try simplify a*(b/c) as (a*b)/c.  */
5031       if (FLOAT_MODE_P (mode) && flag_associative_math 
5032           && GET_CODE (XEXP (x, 0)) == DIV)
5033         {
5034           rtx tem = simplify_binary_operation (MULT, mode,
5035                                                XEXP (XEXP (x, 0), 0),
5036                                                XEXP (x, 1));
5037           if (tem)
5038             return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
5039         }
5040       break;
5041
5042     case UDIV:
5043       /* If this is a divide by a power of two, treat it as a shift if
5044          its first operand is a shift.  */
5045       if (GET_CODE (XEXP (x, 1)) == CONST_INT
5046           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
5047           && (GET_CODE (XEXP (x, 0)) == ASHIFT
5048               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
5049               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
5050               || GET_CODE (XEXP (x, 0)) == ROTATE
5051               || GET_CODE (XEXP (x, 0)) == ROTATERT))
5052         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
5053       break;
5054
5055     case EQ:  case NE:
5056     case GT:  case GTU:  case GE:  case GEU:
5057     case LT:  case LTU:  case LE:  case LEU:
5058     case UNEQ:  case LTGT:
5059     case UNGT:  case UNGE:
5060     case UNLT:  case UNLE:
5061     case UNORDERED: case ORDERED:
5062       /* If the first operand is a condition code, we can't do anything
5063          with it.  */
5064       if (GET_CODE (XEXP (x, 0)) == COMPARE
5065           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
5066               && ! CC0_P (XEXP (x, 0))))
5067         {
5068           rtx op0 = XEXP (x, 0);
5069           rtx op1 = XEXP (x, 1);
5070           enum rtx_code new_code;
5071
5072           if (GET_CODE (op0) == COMPARE)
5073             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
5074
5075           /* Simplify our comparison, if possible.  */
5076           new_code = simplify_comparison (code, &op0, &op1);
5077
5078           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
5079              if only the low-order bit is possibly nonzero in X (such as when
5080              X is a ZERO_EXTRACT of one bit).  Similarly, we can convert EQ to
5081              (xor X 1) or (minus 1 X); we use the former.  Finally, if X is
5082              known to be either 0 or -1, NE becomes a NEG and EQ becomes
5083              (plus X 1).
5084
5085              Remove any ZERO_EXTRACT we made when thinking this was a
5086              comparison.  It may now be simpler to use, e.g., an AND.  If a
5087              ZERO_EXTRACT is indeed appropriate, it will be placed back by
5088              the call to make_compound_operation in the SET case.  */
5089
5090           if (STORE_FLAG_VALUE == 1
5091               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5092               && op1 == const0_rtx
5093               && mode == GET_MODE (op0)
5094               && nonzero_bits (op0, mode) == 1)
5095             return gen_lowpart (mode,
5096                                 expand_compound_operation (op0));
5097
5098           else if (STORE_FLAG_VALUE == 1
5099                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5100                    && op1 == const0_rtx
5101                    && mode == GET_MODE (op0)
5102                    && (num_sign_bit_copies (op0, mode)
5103                        == GET_MODE_BITSIZE (mode)))
5104             {
5105               op0 = expand_compound_operation (op0);
5106               return simplify_gen_unary (NEG, mode,
5107                                          gen_lowpart (mode, op0),
5108                                          mode);
5109             }
5110
5111           else if (STORE_FLAG_VALUE == 1
5112                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5113                    && op1 == const0_rtx
5114                    && mode == GET_MODE (op0)
5115                    && nonzero_bits (op0, mode) == 1)
5116             {
5117               op0 = expand_compound_operation (op0);
5118               return simplify_gen_binary (XOR, mode,
5119                                           gen_lowpart (mode, op0),
5120                                           const1_rtx);
5121             }
5122
5123           else if (STORE_FLAG_VALUE == 1
5124                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5125                    && op1 == const0_rtx
5126                    && mode == GET_MODE (op0)
5127                    && (num_sign_bit_copies (op0, mode)
5128                        == GET_MODE_BITSIZE (mode)))
5129             {
5130               op0 = expand_compound_operation (op0);
5131               return plus_constant (gen_lowpart (mode, op0), 1);
5132             }
5133
5134           /* If STORE_FLAG_VALUE is -1, we have cases similar to
5135              those above.  */
5136           if (STORE_FLAG_VALUE == -1
5137               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5138               && op1 == const0_rtx
5139               && (num_sign_bit_copies (op0, mode)
5140                   == GET_MODE_BITSIZE (mode)))
5141             return gen_lowpart (mode,
5142                                 expand_compound_operation (op0));
5143
5144           else if (STORE_FLAG_VALUE == -1
5145                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5146                    && op1 == const0_rtx
5147                    && mode == GET_MODE (op0)
5148                    && nonzero_bits (op0, mode) == 1)
5149             {
5150               op0 = expand_compound_operation (op0);
5151               return simplify_gen_unary (NEG, mode,
5152                                          gen_lowpart (mode, op0),
5153                                          mode);
5154             }
5155
5156           else if (STORE_FLAG_VALUE == -1
5157                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5158                    && op1 == const0_rtx
5159                    && mode == GET_MODE (op0)
5160                    && (num_sign_bit_copies (op0, mode)
5161                        == GET_MODE_BITSIZE (mode)))
5162             {
5163               op0 = expand_compound_operation (op0);
5164               return simplify_gen_unary (NOT, mode,
5165                                          gen_lowpart (mode, op0),
5166                                          mode);
5167             }
5168
5169           /* If X is 0/1, (eq X 0) is X-1.  */
5170           else if (STORE_FLAG_VALUE == -1
5171                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5172                    && op1 == const0_rtx
5173                    && mode == GET_MODE (op0)
5174                    && nonzero_bits (op0, mode) == 1)
5175             {
5176               op0 = expand_compound_operation (op0);
5177               return plus_constant (gen_lowpart (mode, op0), -1);
5178             }
5179
5180           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
5181              one bit that might be nonzero, we can convert (ne x 0) to
5182              (ashift x c) where C puts the bit in the sign bit.  Remove any
5183              AND with STORE_FLAG_VALUE when we are done, since we are only
5184              going to test the sign bit.  */
5185           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5186               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5187               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5188                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5189               && op1 == const0_rtx
5190               && mode == GET_MODE (op0)
5191               && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
5192             {
5193               x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
5194                                         expand_compound_operation (op0),
5195                                         GET_MODE_BITSIZE (mode) - 1 - i);
5196               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
5197                 return XEXP (x, 0);
5198               else
5199                 return x;
5200             }
5201
5202           /* If the code changed, return a whole new comparison.  */
5203           if (new_code != code)
5204             return gen_rtx_fmt_ee (new_code, mode, op0, op1);
5205
5206           /* Otherwise, keep this operation, but maybe change its operands.
5207              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
5208           SUBST (XEXP (x, 0), op0);
5209           SUBST (XEXP (x, 1), op1);
5210         }
5211       break;
5212
5213     case IF_THEN_ELSE:
5214       return simplify_if_then_else (x);
5215
5216     case ZERO_EXTRACT:
5217     case SIGN_EXTRACT:
5218     case ZERO_EXTEND:
5219     case SIGN_EXTEND:
5220       /* If we are processing SET_DEST, we are done.  */
5221       if (in_dest)
5222         return x;
5223
5224       return expand_compound_operation (x);
5225
5226     case SET:
5227       return simplify_set (x);
5228
5229     case AND:
5230     case IOR:
5231       return simplify_logical (x);
5232
5233     case ASHIFT:
5234     case LSHIFTRT:
5235     case ASHIFTRT:
5236     case ROTATE:
5237     case ROTATERT:
5238       /* If this is a shift by a constant amount, simplify it.  */
5239       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
5240         return simplify_shift_const (x, code, mode, XEXP (x, 0),
5241                                      INTVAL (XEXP (x, 1)));
5242
5243       else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
5244         SUBST (XEXP (x, 1),
5245                force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
5246                               ((HOST_WIDE_INT) 1
5247                                << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
5248                               - 1,
5249                               0));
5250       break;
5251
5252     default:
5253       break;
5254     }
5255
5256   return x;
5257 }
5258 \f
5259 /* Simplify X, an IF_THEN_ELSE expression.  Return the new expression.  */
5260
5261 static rtx
5262 simplify_if_then_else (rtx x)
5263 {
5264   enum machine_mode mode = GET_MODE (x);
5265   rtx cond = XEXP (x, 0);
5266   rtx true_rtx = XEXP (x, 1);
5267   rtx false_rtx = XEXP (x, 2);
5268   enum rtx_code true_code = GET_CODE (cond);
5269   int comparison_p = COMPARISON_P (cond);
5270   rtx temp;
5271   int i;
5272   enum rtx_code false_code;
5273   rtx reversed;
5274
5275   /* Simplify storing of the truth value.  */
5276   if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
5277     return simplify_gen_relational (true_code, mode, VOIDmode,
5278                                     XEXP (cond, 0), XEXP (cond, 1));
5279
5280   /* Also when the truth value has to be reversed.  */
5281   if (comparison_p
5282       && true_rtx == const0_rtx && false_rtx == const_true_rtx
5283       && (reversed = reversed_comparison (cond, mode)))
5284     return reversed;
5285
5286   /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
5287      in it is being compared against certain values.  Get the true and false
5288      comparisons and see if that says anything about the value of each arm.  */
5289
5290   if (comparison_p
5291       && ((false_code = reversed_comparison_code (cond, NULL))
5292           != UNKNOWN)
5293       && REG_P (XEXP (cond, 0)))
5294     {
5295       HOST_WIDE_INT nzb;
5296       rtx from = XEXP (cond, 0);
5297       rtx true_val = XEXP (cond, 1);
5298       rtx false_val = true_val;
5299       int swapped = 0;
5300
5301       /* If FALSE_CODE is EQ, swap the codes and arms.  */
5302
5303       if (false_code == EQ)
5304         {
5305           swapped = 1, true_code = EQ, false_code = NE;
5306           temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5307         }
5308
5309       /* If we are comparing against zero and the expression being tested has
5310          only a single bit that might be nonzero, that is its value when it is
5311          not equal to zero.  Similarly if it is known to be -1 or 0.  */
5312
5313       if (true_code == EQ && true_val == const0_rtx
5314           && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
5315         {
5316           false_code = EQ;
5317           false_val = GEN_INT (trunc_int_for_mode (nzb, GET_MODE (from)));
5318         }
5319       else if (true_code == EQ && true_val == const0_rtx
5320                && (num_sign_bit_copies (from, GET_MODE (from))
5321                    == GET_MODE_BITSIZE (GET_MODE (from))))
5322         {
5323           false_code = EQ;
5324           false_val = constm1_rtx;
5325         }
5326
5327       /* Now simplify an arm if we know the value of the register in the
5328          branch and it is used in the arm.  Be careful due to the potential
5329          of locally-shared RTL.  */
5330
5331       if (reg_mentioned_p (from, true_rtx))
5332         true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
5333                                       from, true_val),
5334                       pc_rtx, pc_rtx, 0, 0);
5335       if (reg_mentioned_p (from, false_rtx))
5336         false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
5337                                    from, false_val),
5338                        pc_rtx, pc_rtx, 0, 0);
5339
5340       SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
5341       SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
5342
5343       true_rtx = XEXP (x, 1);
5344       false_rtx = XEXP (x, 2);
5345       true_code = GET_CODE (cond);
5346     }
5347
5348   /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
5349      reversed, do so to avoid needing two sets of patterns for
5350      subtract-and-branch insns.  Similarly if we have a constant in the true
5351      arm, the false arm is the same as the first operand of the comparison, or
5352      the false arm is more complicated than the true arm.  */
5353
5354   if (comparison_p
5355       && reversed_comparison_code (cond, NULL) != UNKNOWN
5356       && (true_rtx == pc_rtx
5357           || (CONSTANT_P (true_rtx)
5358               && GET_CODE (false_rtx) != CONST_INT && false_rtx != pc_rtx)
5359           || true_rtx == const0_rtx
5360           || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
5361           || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
5362               && !OBJECT_P (false_rtx))
5363           || reg_mentioned_p (true_rtx, false_rtx)
5364           || rtx_equal_p (false_rtx, XEXP (cond, 0))))
5365     {
5366       true_code = reversed_comparison_code (cond, NULL);
5367       SUBST (XEXP (x, 0), reversed_comparison (cond, GET_MODE (cond)));
5368       SUBST (XEXP (x, 1), false_rtx);
5369       SUBST (XEXP (x, 2), true_rtx);
5370
5371       temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5372       cond = XEXP (x, 0);
5373
5374       /* It is possible that the conditional has been simplified out.  */
5375       true_code = GET_CODE (cond);
5376       comparison_p = COMPARISON_P (cond);
5377     }
5378
5379   /* If the two arms are identical, we don't need the comparison.  */
5380
5381   if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
5382     return true_rtx;
5383
5384   /* Convert a == b ? b : a to "a".  */
5385   if (true_code == EQ && ! side_effects_p (cond)
5386       && !HONOR_NANS (mode)
5387       && rtx_equal_p (XEXP (cond, 0), false_rtx)
5388       && rtx_equal_p (XEXP (cond, 1), true_rtx))
5389     return false_rtx;
5390   else if (true_code == NE && ! side_effects_p (cond)
5391            && !HONOR_NANS (mode)
5392            && rtx_equal_p (XEXP (cond, 0), true_rtx)
5393            && rtx_equal_p (XEXP (cond, 1), false_rtx))
5394     return true_rtx;
5395
5396   /* Look for cases where we have (abs x) or (neg (abs X)).  */
5397
5398   if (GET_MODE_CLASS (mode) == MODE_INT
5399       && comparison_p
5400       && XEXP (cond, 1) == const0_rtx
5401       && GET_CODE (false_rtx) == NEG
5402       && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
5403       && rtx_equal_p (true_rtx, XEXP (cond, 0))
5404       && ! side_effects_p (true_rtx))
5405     switch (true_code)
5406       {
5407       case GT:
5408       case GE:
5409         return simplify_gen_unary (ABS, mode, true_rtx, mode);
5410       case LT:
5411       case LE:
5412         return
5413           simplify_gen_unary (NEG, mode,
5414                               simplify_gen_unary (ABS, mode, true_rtx, mode),
5415                               mode);
5416       default:
5417         break;
5418       }
5419
5420   /* Look for MIN or MAX.  */
5421
5422   if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
5423       && comparison_p
5424       && rtx_equal_p (XEXP (cond, 0), true_rtx)
5425       && rtx_equal_p (XEXP (cond, 1), false_rtx)
5426       && ! side_effects_p (cond))
5427     switch (true_code)
5428       {
5429       case GE:
5430       case GT:
5431         return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
5432       case LE:
5433       case LT:
5434         return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
5435       case GEU:
5436       case GTU:
5437         return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
5438       case LEU:
5439       case LTU:
5440         return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
5441       default:
5442         break;
5443       }
5444
5445   /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
5446      second operand is zero, this can be done as (OP Z (mult COND C2)) where
5447      C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
5448      SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
5449      We can do this kind of thing in some cases when STORE_FLAG_VALUE is
5450      neither 1 or -1, but it isn't worth checking for.  */
5451
5452   if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
5453       && comparison_p
5454       && GET_MODE_CLASS (mode) == MODE_INT
5455       && ! side_effects_p (x))
5456     {
5457       rtx t = make_compound_operation (true_rtx, SET);
5458       rtx f = make_compound_operation (false_rtx, SET);
5459       rtx cond_op0 = XEXP (cond, 0);
5460       rtx cond_op1 = XEXP (cond, 1);
5461       enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
5462       enum machine_mode m = mode;
5463       rtx z = 0, c1 = NULL_RTX;
5464
5465       if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
5466            || GET_CODE (t) == IOR || GET_CODE (t) == XOR
5467            || GET_CODE (t) == ASHIFT
5468            || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
5469           && rtx_equal_p (XEXP (t, 0), f))
5470         c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
5471
5472       /* If an identity-zero op is commutative, check whether there
5473          would be a match if we swapped the operands.  */
5474       else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
5475                 || GET_CODE (t) == XOR)
5476                && rtx_equal_p (XEXP (t, 1), f))
5477         c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
5478       else if (GET_CODE (t) == SIGN_EXTEND
5479                && (GET_CODE (XEXP (t, 0)) == PLUS
5480                    || GET_CODE (XEXP (t, 0)) == MINUS
5481                    || GET_CODE (XEXP (t, 0)) == IOR
5482                    || GET_CODE (XEXP (t, 0)) == XOR
5483                    || GET_CODE (XEXP (t, 0)) == ASHIFT
5484                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5485                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5486                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5487                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5488                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5489                && (num_sign_bit_copies (f, GET_MODE (f))
5490                    > (unsigned int)
5491                      (GET_MODE_BITSIZE (mode)
5492                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
5493         {
5494           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5495           extend_op = SIGN_EXTEND;
5496           m = GET_MODE (XEXP (t, 0));
5497         }
5498       else if (GET_CODE (t) == SIGN_EXTEND
5499                && (GET_CODE (XEXP (t, 0)) == PLUS
5500                    || GET_CODE (XEXP (t, 0)) == IOR
5501                    || GET_CODE (XEXP (t, 0)) == XOR)
5502                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5503                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5504                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5505                && (num_sign_bit_copies (f, GET_MODE (f))
5506                    > (unsigned int)
5507                      (GET_MODE_BITSIZE (mode)
5508                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
5509         {
5510           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5511           extend_op = SIGN_EXTEND;
5512           m = GET_MODE (XEXP (t, 0));
5513         }
5514       else if (GET_CODE (t) == ZERO_EXTEND
5515                && (GET_CODE (XEXP (t, 0)) == PLUS
5516                    || GET_CODE (XEXP (t, 0)) == MINUS
5517                    || GET_CODE (XEXP (t, 0)) == IOR
5518                    || GET_CODE (XEXP (t, 0)) == XOR
5519                    || GET_CODE (XEXP (t, 0)) == ASHIFT
5520                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5521                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5522                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5523                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5524                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5525                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5526                && ((nonzero_bits (f, GET_MODE (f))
5527                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
5528                    == 0))
5529         {
5530           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5531           extend_op = ZERO_EXTEND;
5532           m = GET_MODE (XEXP (t, 0));
5533         }
5534       else if (GET_CODE (t) == ZERO_EXTEND
5535                && (GET_CODE (XEXP (t, 0)) == PLUS
5536                    || GET_CODE (XEXP (t, 0)) == IOR
5537                    || GET_CODE (XEXP (t, 0)) == XOR)
5538                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5539                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5540                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5541                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5542                && ((nonzero_bits (f, GET_MODE (f))
5543                     & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
5544                    == 0))
5545         {
5546           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5547           extend_op = ZERO_EXTEND;
5548           m = GET_MODE (XEXP (t, 0));
5549         }
5550
5551       if (z)
5552         {
5553           temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
5554                                                  cond_op0, cond_op1),
5555                         pc_rtx, pc_rtx, 0, 0);
5556           temp = simplify_gen_binary (MULT, m, temp,
5557                                       simplify_gen_binary (MULT, m, c1,
5558                                                            const_true_rtx));
5559           temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
5560           temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
5561
5562           if (extend_op != UNKNOWN)
5563             temp = simplify_gen_unary (extend_op, mode, temp, m);
5564
5565           return temp;
5566         }
5567     }
5568
5569   /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
5570      1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
5571      negation of a single bit, we can convert this operation to a shift.  We
5572      can actually do this more generally, but it doesn't seem worth it.  */
5573
5574   if (true_code == NE && XEXP (cond, 1) == const0_rtx
5575       && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
5576       && ((1 == nonzero_bits (XEXP (cond, 0), mode)
5577            && (i = exact_log2 (INTVAL (true_rtx))) >= 0)
5578           || ((num_sign_bit_copies (XEXP (cond, 0), mode)
5579                == GET_MODE_BITSIZE (mode))
5580               && (i = exact_log2 (-INTVAL (true_rtx))) >= 0)))
5581     return
5582       simplify_shift_const (NULL_RTX, ASHIFT, mode,
5583                             gen_lowpart (mode, XEXP (cond, 0)), i);
5584
5585   /* (IF_THEN_ELSE (NE REG 0) (0) (8)) is REG for nonzero_bits (REG) == 8.  */
5586   if (true_code == NE && XEXP (cond, 1) == const0_rtx
5587       && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
5588       && GET_MODE (XEXP (cond, 0)) == mode
5589       && (INTVAL (true_rtx) & GET_MODE_MASK (mode))
5590           == nonzero_bits (XEXP (cond, 0), mode)
5591       && (i = exact_log2 (INTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
5592     return XEXP (cond, 0);
5593
5594   return x;
5595 }
5596 \f
5597 /* Simplify X, a SET expression.  Return the new expression.  */
5598
5599 static rtx
5600 simplify_set (rtx x)
5601 {
5602   rtx src = SET_SRC (x);
5603   rtx dest = SET_DEST (x);
5604   enum machine_mode mode
5605     = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
5606   rtx other_insn;
5607   rtx *cc_use;
5608
5609   /* (set (pc) (return)) gets written as (return).  */
5610   if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
5611     return src;
5612
5613   /* Now that we know for sure which bits of SRC we are using, see if we can
5614      simplify the expression for the object knowing that we only need the
5615      low-order bits.  */
5616
5617   if (GET_MODE_CLASS (mode) == MODE_INT
5618       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
5619     {
5620       src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, 0);
5621       SUBST (SET_SRC (x), src);
5622     }
5623
5624   /* If we are setting CC0 or if the source is a COMPARE, look for the use of
5625      the comparison result and try to simplify it unless we already have used
5626      undobuf.other_insn.  */
5627   if ((GET_MODE_CLASS (mode) == MODE_CC
5628        || GET_CODE (src) == COMPARE
5629        || CC0_P (dest))
5630       && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
5631       && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
5632       && COMPARISON_P (*cc_use)
5633       && rtx_equal_p (XEXP (*cc_use, 0), dest))
5634     {
5635       enum rtx_code old_code = GET_CODE (*cc_use);
5636       enum rtx_code new_code;
5637       rtx op0, op1, tmp;
5638       int other_changed = 0;
5639       enum machine_mode compare_mode = GET_MODE (dest);
5640
5641       if (GET_CODE (src) == COMPARE)
5642         op0 = XEXP (src, 0), op1 = XEXP (src, 1);
5643       else
5644         op0 = src, op1 = CONST0_RTX (GET_MODE (src));
5645
5646       tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
5647                                            op0, op1);
5648       if (!tmp)
5649         new_code = old_code;
5650       else if (!CONSTANT_P (tmp))
5651         {
5652           new_code = GET_CODE (tmp);
5653           op0 = XEXP (tmp, 0);
5654           op1 = XEXP (tmp, 1);
5655         }
5656       else
5657         {
5658           rtx pat = PATTERN (other_insn);
5659           undobuf.other_insn = other_insn;
5660           SUBST (*cc_use, tmp);
5661
5662           /* Attempt to simplify CC user.  */
5663           if (GET_CODE (pat) == SET)
5664             {
5665               rtx new_rtx = simplify_rtx (SET_SRC (pat));
5666               if (new_rtx != NULL_RTX)
5667                 SUBST (SET_SRC (pat), new_rtx);
5668             }
5669
5670           /* Convert X into a no-op move.  */
5671           SUBST (SET_DEST (x), pc_rtx);
5672           SUBST (SET_SRC (x), pc_rtx);
5673           return x;
5674         }
5675
5676       /* Simplify our comparison, if possible.  */
5677       new_code = simplify_comparison (new_code, &op0, &op1);
5678
5679 #ifdef SELECT_CC_MODE
5680       /* If this machine has CC modes other than CCmode, check to see if we
5681          need to use a different CC mode here.  */
5682       if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
5683         compare_mode = GET_MODE (op0);
5684       else
5685         compare_mode = SELECT_CC_MODE (new_code, op0, op1);
5686
5687 #ifndef HAVE_cc0
5688       /* If the mode changed, we have to change SET_DEST, the mode in the
5689          compare, and the mode in the place SET_DEST is used.  If SET_DEST is
5690          a hard register, just build new versions with the proper mode.  If it
5691          is a pseudo, we lose unless it is only time we set the pseudo, in
5692          which case we can safely change its mode.  */
5693       if (compare_mode != GET_MODE (dest))
5694         {
5695           if (can_change_dest_mode (dest, 0, compare_mode))
5696             {
5697               unsigned int regno = REGNO (dest);
5698               rtx new_dest;
5699
5700               if (regno < FIRST_PSEUDO_REGISTER)
5701                 new_dest = gen_rtx_REG (compare_mode, regno);
5702               else
5703                 {
5704                   SUBST_MODE (regno_reg_rtx[regno], compare_mode);
5705                   new_dest = regno_reg_rtx[regno];
5706                 }
5707
5708               SUBST (SET_DEST (x), new_dest);
5709               SUBST (XEXP (*cc_use, 0), new_dest);
5710               other_changed = 1;
5711
5712               dest = new_dest;
5713             }
5714         }
5715 #endif  /* cc0 */
5716 #endif  /* SELECT_CC_MODE */
5717
5718       /* If the code changed, we have to build a new comparison in
5719          undobuf.other_insn.  */
5720       if (new_code != old_code)
5721         {
5722           int other_changed_previously = other_changed;
5723           unsigned HOST_WIDE_INT mask;
5724           rtx old_cc_use = *cc_use;
5725
5726           SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
5727                                           dest, const0_rtx));
5728           other_changed = 1;
5729
5730           /* If the only change we made was to change an EQ into an NE or
5731              vice versa, OP0 has only one bit that might be nonzero, and OP1
5732              is zero, check if changing the user of the condition code will
5733              produce a valid insn.  If it won't, we can keep the original code
5734              in that insn by surrounding our operation with an XOR.  */
5735
5736           if (((old_code == NE && new_code == EQ)
5737                || (old_code == EQ && new_code == NE))
5738               && ! other_changed_previously && op1 == const0_rtx
5739               && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
5740               && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
5741             {
5742               rtx pat = PATTERN (other_insn), note = 0;
5743
5744               if ((recog_for_combine (&pat, other_insn, &note) < 0
5745                    && ! check_asm_operands (pat)))
5746                 {
5747                   *cc_use = old_cc_use;
5748                   other_changed = 0;
5749
5750                   op0 = simplify_gen_binary (XOR, GET_MODE (op0),
5751                                              op0, GEN_INT (mask));
5752                 }
5753             }
5754         }
5755
5756       if (other_changed)
5757         undobuf.other_insn = other_insn;
5758
5759 #ifdef HAVE_cc0
5760       /* If we are now comparing against zero, change our source if
5761          needed.  If we do not use cc0, we always have a COMPARE.  */
5762       if (op1 == const0_rtx && dest == cc0_rtx)
5763         {
5764           SUBST (SET_SRC (x), op0);
5765           src = op0;
5766         }
5767       else
5768 #endif
5769
5770       /* Otherwise, if we didn't previously have a COMPARE in the
5771          correct mode, we need one.  */
5772       if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
5773         {
5774           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
5775           src = SET_SRC (x);
5776         }
5777       else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
5778         {
5779           SUBST (SET_SRC (x), op0);
5780           src = SET_SRC (x);
5781         }
5782       /* Otherwise, update the COMPARE if needed.  */
5783       else if (XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
5784         {
5785           SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
5786           src = SET_SRC (x);
5787         }
5788     }
5789   else
5790     {
5791       /* Get SET_SRC in a form where we have placed back any
5792          compound expressions.  Then do the checks below.  */
5793       src = make_compound_operation (src, SET);
5794       SUBST (SET_SRC (x), src);
5795     }
5796
5797   /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
5798      and X being a REG or (subreg (reg)), we may be able to convert this to
5799      (set (subreg:m2 x) (op)).
5800
5801      We can always do this if M1 is narrower than M2 because that means that
5802      we only care about the low bits of the result.
5803
5804      However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
5805      perform a narrower operation than requested since the high-order bits will
5806      be undefined.  On machine where it is defined, this transformation is safe
5807      as long as M1 and M2 have the same number of words.  */
5808
5809   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5810       && !OBJECT_P (SUBREG_REG (src))
5811       && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
5812            / UNITS_PER_WORD)
5813           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5814                + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
5815 #ifndef WORD_REGISTER_OPERATIONS
5816       && (GET_MODE_SIZE (GET_MODE (src))
5817         < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5818 #endif
5819 #ifdef CANNOT_CHANGE_MODE_CLASS
5820       && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
5821             && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
5822                                          GET_MODE (SUBREG_REG (src)),
5823                                          GET_MODE (src)))
5824 #endif
5825       && (REG_P (dest)
5826           || (GET_CODE (dest) == SUBREG
5827               && REG_P (SUBREG_REG (dest)))))
5828     {
5829       SUBST (SET_DEST (x),
5830              gen_lowpart (GET_MODE (SUBREG_REG (src)),
5831                                       dest));
5832       SUBST (SET_SRC (x), SUBREG_REG (src));
5833
5834       src = SET_SRC (x), dest = SET_DEST (x);
5835     }
5836
5837 #ifdef HAVE_cc0
5838   /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
5839      in SRC.  */
5840   if (dest == cc0_rtx
5841       && GET_CODE (src) == SUBREG
5842       && subreg_lowpart_p (src)
5843       && (GET_MODE_BITSIZE (GET_MODE (src))
5844           < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
5845     {
5846       rtx inner = SUBREG_REG (src);
5847       enum machine_mode inner_mode = GET_MODE (inner);
5848
5849       /* Here we make sure that we don't have a sign bit on.  */
5850       if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
5851           && (nonzero_bits (inner, inner_mode)
5852               < ((unsigned HOST_WIDE_INT) 1
5853                  << (GET_MODE_BITSIZE (GET_MODE (src)) - 1))))
5854         {
5855           SUBST (SET_SRC (x), inner);
5856           src = SET_SRC (x);
5857         }
5858     }
5859 #endif
5860
5861 #ifdef LOAD_EXTEND_OP
5862   /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
5863      would require a paradoxical subreg.  Replace the subreg with a
5864      zero_extend to avoid the reload that would otherwise be required.  */
5865
5866   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5867       && INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (src)))
5868       && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != UNKNOWN
5869       && SUBREG_BYTE (src) == 0
5870       && (GET_MODE_SIZE (GET_MODE (src))
5871           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5872       && MEM_P (SUBREG_REG (src)))
5873     {
5874       SUBST (SET_SRC (x),
5875              gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
5876                             GET_MODE (src), SUBREG_REG (src)));
5877
5878       src = SET_SRC (x);
5879     }
5880 #endif
5881
5882   /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
5883      are comparing an item known to be 0 or -1 against 0, use a logical
5884      operation instead. Check for one of the arms being an IOR of the other
5885      arm with some value.  We compute three terms to be IOR'ed together.  In
5886      practice, at most two will be nonzero.  Then we do the IOR's.  */
5887
5888   if (GET_CODE (dest) != PC
5889       && GET_CODE (src) == IF_THEN_ELSE
5890       && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
5891       && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
5892       && XEXP (XEXP (src, 0), 1) == const0_rtx
5893       && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
5894 #ifdef HAVE_conditional_move
5895       && ! can_conditionally_move_p (GET_MODE (src))
5896 #endif
5897       && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
5898                                GET_MODE (XEXP (XEXP (src, 0), 0)))
5899           == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
5900       && ! side_effects_p (src))
5901     {
5902       rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
5903                       ? XEXP (src, 1) : XEXP (src, 2));
5904       rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
5905                    ? XEXP (src, 2) : XEXP (src, 1));
5906       rtx term1 = const0_rtx, term2, term3;
5907
5908       if (GET_CODE (true_rtx) == IOR
5909           && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
5910         term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
5911       else if (GET_CODE (true_rtx) == IOR
5912                && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
5913         term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
5914       else if (GET_CODE (false_rtx) == IOR
5915                && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
5916         term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
5917       else if (GET_CODE (false_rtx) == IOR
5918                && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
5919         term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
5920
5921       term2 = simplify_gen_binary (AND, GET_MODE (src),
5922                                    XEXP (XEXP (src, 0), 0), true_rtx);
5923       term3 = simplify_gen_binary (AND, GET_MODE (src),
5924                                    simplify_gen_unary (NOT, GET_MODE (src),
5925                                                        XEXP (XEXP (src, 0), 0),
5926                                                        GET_MODE (src)),
5927                                    false_rtx);
5928
5929       SUBST (SET_SRC (x),
5930              simplify_gen_binary (IOR, GET_MODE (src),
5931                                   simplify_gen_binary (IOR, GET_MODE (src),
5932                                                        term1, term2),
5933                                   term3));
5934
5935       src = SET_SRC (x);
5936     }
5937
5938   /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
5939      whole thing fail.  */
5940   if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
5941     return src;
5942   else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
5943     return dest;
5944   else
5945     /* Convert this into a field assignment operation, if possible.  */
5946     return make_field_assignment (x);
5947 }
5948 \f
5949 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
5950    result.  */
5951
5952 static rtx
5953 simplify_logical (rtx x)
5954 {
5955   enum machine_mode mode = GET_MODE (x);
5956   rtx op0 = XEXP (x, 0);
5957   rtx op1 = XEXP (x, 1);
5958
5959   switch (GET_CODE (x))
5960     {
5961     case AND:
5962       /* We can call simplify_and_const_int only if we don't lose
5963          any (sign) bits when converting INTVAL (op1) to
5964          "unsigned HOST_WIDE_INT".  */
5965       if (GET_CODE (op1) == CONST_INT
5966           && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5967               || INTVAL (op1) > 0))
5968         {
5969           x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
5970           if (GET_CODE (x) != AND)
5971             return x;
5972
5973           op0 = XEXP (x, 0);
5974           op1 = XEXP (x, 1);
5975         }
5976
5977       /* If we have any of (and (ior A B) C) or (and (xor A B) C),
5978          apply the distributive law and then the inverse distributive
5979          law to see if things simplify.  */
5980       if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
5981         {
5982           rtx result = distribute_and_simplify_rtx (x, 0);
5983           if (result)
5984             return result;
5985         }
5986       if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
5987         {
5988           rtx result = distribute_and_simplify_rtx (x, 1);
5989           if (result)
5990             return result;
5991         }
5992       break;
5993
5994     case IOR:
5995       /* If we have (ior (and A B) C), apply the distributive law and then
5996          the inverse distributive law to see if things simplify.  */
5997
5998       if (GET_CODE (op0) == AND)
5999         {
6000           rtx result = distribute_and_simplify_rtx (x, 0);
6001           if (result)
6002             return result;
6003         }
6004
6005       if (GET_CODE (op1) == AND)
6006         {
6007           rtx result = distribute_and_simplify_rtx (x, 1);
6008           if (result)
6009             return result;
6010         }
6011       break;
6012
6013     default:
6014       gcc_unreachable ();
6015     }
6016
6017   return x;
6018 }
6019 \f
6020 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
6021    operations" because they can be replaced with two more basic operations.
6022    ZERO_EXTEND is also considered "compound" because it can be replaced with
6023    an AND operation, which is simpler, though only one operation.
6024
6025    The function expand_compound_operation is called with an rtx expression
6026    and will convert it to the appropriate shifts and AND operations,
6027    simplifying at each stage.
6028
6029    The function make_compound_operation is called to convert an expression
6030    consisting of shifts and ANDs into the equivalent compound expression.
6031    It is the inverse of this function, loosely speaking.  */
6032
6033 static rtx
6034 expand_compound_operation (rtx x)
6035 {
6036   unsigned HOST_WIDE_INT pos = 0, len;
6037   int unsignedp = 0;
6038   unsigned int modewidth;
6039   rtx tem;
6040
6041   switch (GET_CODE (x))
6042     {
6043     case ZERO_EXTEND:
6044       unsignedp = 1;
6045     case SIGN_EXTEND:
6046       /* We can't necessarily use a const_int for a multiword mode;
6047          it depends on implicitly extending the value.
6048          Since we don't know the right way to extend it,
6049          we can't tell whether the implicit way is right.
6050
6051          Even for a mode that is no wider than a const_int,
6052          we can't win, because we need to sign extend one of its bits through
6053          the rest of it, and we don't know which bit.  */
6054       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
6055         return x;
6056
6057       /* Return if (subreg:MODE FROM 0) is not a safe replacement for
6058          (zero_extend:MODE FROM) or (sign_extend:MODE FROM).  It is for any MEM
6059          because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
6060          reloaded. If not for that, MEM's would very rarely be safe.
6061
6062          Reject MODEs bigger than a word, because we might not be able
6063          to reference a two-register group starting with an arbitrary register
6064          (and currently gen_lowpart might crash for a SUBREG).  */
6065
6066       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
6067         return x;
6068
6069       /* Reject MODEs that aren't scalar integers because turning vector
6070          or complex modes into shifts causes problems.  */
6071
6072       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6073         return x;
6074
6075       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
6076       /* If the inner object has VOIDmode (the only way this can happen
6077          is if it is an ASM_OPERANDS), we can't do anything since we don't
6078          know how much masking to do.  */
6079       if (len == 0)
6080         return x;
6081
6082       break;
6083
6084     case ZERO_EXTRACT:
6085       unsignedp = 1;
6086
6087       /* ... fall through ...  */
6088
6089     case SIGN_EXTRACT:
6090       /* If the operand is a CLOBBER, just return it.  */
6091       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
6092         return XEXP (x, 0);
6093
6094       if (GET_CODE (XEXP (x, 1)) != CONST_INT
6095           || GET_CODE (XEXP (x, 2)) != CONST_INT
6096           || GET_MODE (XEXP (x, 0)) == VOIDmode)
6097         return x;
6098
6099       /* Reject MODEs that aren't scalar integers because turning vector
6100          or complex modes into shifts causes problems.  */
6101
6102       if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6103         return x;
6104
6105       len = INTVAL (XEXP (x, 1));
6106       pos = INTVAL (XEXP (x, 2));
6107
6108       /* This should stay within the object being extracted, fail otherwise.  */
6109       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
6110         return x;
6111
6112       if (BITS_BIG_ENDIAN)
6113         pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
6114
6115       break;
6116
6117     default:
6118       return x;
6119     }
6120   /* Convert sign extension to zero extension, if we know that the high
6121      bit is not set, as this is easier to optimize.  It will be converted
6122      back to cheaper alternative in make_extraction.  */
6123   if (GET_CODE (x) == SIGN_EXTEND
6124       && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6125           && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
6126                 & ~(((unsigned HOST_WIDE_INT)
6127                       GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
6128                      >> 1))
6129                == 0)))
6130     {
6131       rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
6132       rtx temp2 = expand_compound_operation (temp);
6133
6134       /* Make sure this is a profitable operation.  */
6135       if (rtx_cost (x, SET, optimize_this_for_speed_p)
6136           > rtx_cost (temp2, SET, optimize_this_for_speed_p))
6137        return temp2;
6138       else if (rtx_cost (x, SET, optimize_this_for_speed_p)
6139                > rtx_cost (temp, SET, optimize_this_for_speed_p))
6140        return temp;
6141       else
6142        return x;
6143     }
6144
6145   /* We can optimize some special cases of ZERO_EXTEND.  */
6146   if (GET_CODE (x) == ZERO_EXTEND)
6147     {
6148       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
6149          know that the last value didn't have any inappropriate bits
6150          set.  */
6151       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6152           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6153           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6154           && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
6155               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6156         return XEXP (XEXP (x, 0), 0);
6157
6158       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
6159       if (GET_CODE (XEXP (x, 0)) == SUBREG
6160           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6161           && subreg_lowpart_p (XEXP (x, 0))
6162           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6163           && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
6164               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6165         return SUBREG_REG (XEXP (x, 0));
6166
6167       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
6168          is a comparison and STORE_FLAG_VALUE permits.  This is like
6169          the first case, but it works even when GET_MODE (x) is larger
6170          than HOST_WIDE_INT.  */
6171       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6172           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6173           && COMPARISON_P (XEXP (XEXP (x, 0), 0))
6174           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6175               <= HOST_BITS_PER_WIDE_INT)
6176           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
6177               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6178         return XEXP (XEXP (x, 0), 0);
6179
6180       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
6181       if (GET_CODE (XEXP (x, 0)) == SUBREG
6182           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6183           && subreg_lowpart_p (XEXP (x, 0))
6184           && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
6185           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6186               <= HOST_BITS_PER_WIDE_INT)
6187           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
6188               & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6189         return SUBREG_REG (XEXP (x, 0));
6190
6191     }
6192
6193   /* If we reach here, we want to return a pair of shifts.  The inner
6194      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
6195      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
6196      logical depending on the value of UNSIGNEDP.
6197
6198      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
6199      converted into an AND of a shift.
6200
6201      We must check for the case where the left shift would have a negative
6202      count.  This can happen in a case like (x >> 31) & 255 on machines
6203      that can't shift by a constant.  On those machines, we would first
6204      combine the shift with the AND to produce a variable-position
6205      extraction.  Then the constant of 31 would be substituted in to produce
6206      a such a position.  */
6207
6208   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
6209   if (modewidth + len >= pos)
6210     {
6211       enum machine_mode mode = GET_MODE (x);
6212       tem = gen_lowpart (mode, XEXP (x, 0));
6213       if (!tem || GET_CODE (tem) == CLOBBER)
6214         return x;
6215       tem = simplify_shift_const (NULL_RTX, ASHIFT, mode,
6216                                   tem, modewidth - pos - len);
6217       tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
6218                                   mode, tem, modewidth - len);
6219     }
6220   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
6221     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
6222                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
6223                                                         GET_MODE (x),
6224                                                         XEXP (x, 0), pos),
6225                                   ((HOST_WIDE_INT) 1 << len) - 1);
6226   else
6227     /* Any other cases we can't handle.  */
6228     return x;
6229
6230   /* If we couldn't do this for some reason, return the original
6231      expression.  */
6232   if (GET_CODE (tem) == CLOBBER)
6233     return x;
6234
6235   return tem;
6236 }
6237 \f
6238 /* X is a SET which contains an assignment of one object into
6239    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
6240    or certain SUBREGS). If possible, convert it into a series of
6241    logical operations.
6242
6243    We half-heartedly support variable positions, but do not at all
6244    support variable lengths.  */
6245
6246 static const_rtx
6247 expand_field_assignment (const_rtx x)
6248 {
6249   rtx inner;
6250   rtx pos;                      /* Always counts from low bit.  */
6251   int len;
6252   rtx mask, cleared, masked;
6253   enum machine_mode compute_mode;
6254
6255   /* Loop until we find something we can't simplify.  */
6256   while (1)
6257     {
6258       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
6259           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
6260         {
6261           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
6262           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
6263           pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
6264         }
6265       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
6266                && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
6267         {
6268           inner = XEXP (SET_DEST (x), 0);
6269           len = INTVAL (XEXP (SET_DEST (x), 1));
6270           pos = XEXP (SET_DEST (x), 2);
6271
6272           /* A constant position should stay within the width of INNER.  */
6273           if (GET_CODE (pos) == CONST_INT
6274               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
6275             break;
6276
6277           if (BITS_BIG_ENDIAN)
6278             {
6279               if (GET_CODE (pos) == CONST_INT)
6280                 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
6281                                - INTVAL (pos));
6282               else if (GET_CODE (pos) == MINUS
6283                        && GET_CODE (XEXP (pos, 1)) == CONST_INT
6284                        && (INTVAL (XEXP (pos, 1))
6285                            == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
6286                 /* If position is ADJUST - X, new position is X.  */
6287                 pos = XEXP (pos, 0);
6288               else
6289                 pos = simplify_gen_binary (MINUS, GET_MODE (pos),
6290                                            GEN_INT (GET_MODE_BITSIZE (
6291                                                     GET_MODE (inner))
6292                                                     - len),
6293                                            pos);
6294             }
6295         }
6296
6297       /* A SUBREG between two modes that occupy the same numbers of words
6298          can be done by moving the SUBREG to the source.  */
6299       else if (GET_CODE (SET_DEST (x)) == SUBREG
6300                /* We need SUBREGs to compute nonzero_bits properly.  */
6301                && nonzero_sign_valid
6302                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
6303                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
6304                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
6305                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
6306         {
6307           x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
6308                            gen_lowpart
6309                            (GET_MODE (SUBREG_REG (SET_DEST (x))),
6310                             SET_SRC (x)));
6311           continue;
6312         }
6313       else
6314         break;
6315
6316       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6317         inner = SUBREG_REG (inner);
6318
6319       compute_mode = GET_MODE (inner);
6320
6321       /* Don't attempt bitwise arithmetic on non scalar integer modes.  */
6322       if (! SCALAR_INT_MODE_P (compute_mode))
6323         {
6324           enum machine_mode imode;
6325
6326           /* Don't do anything for vector or complex integral types.  */
6327           if (! FLOAT_MODE_P (compute_mode))
6328             break;
6329
6330           /* Try to find an integral mode to pun with.  */
6331           imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
6332           if (imode == BLKmode)
6333             break;
6334
6335           compute_mode = imode;
6336           inner = gen_lowpart (imode, inner);
6337         }
6338
6339       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
6340       if (len >= HOST_BITS_PER_WIDE_INT)
6341         break;
6342
6343       /* Now compute the equivalent expression.  Make a copy of INNER
6344          for the SET_DEST in case it is a MEM into which we will substitute;
6345          we don't want shared RTL in that case.  */
6346       mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
6347       cleared = simplify_gen_binary (AND, compute_mode,
6348                                      simplify_gen_unary (NOT, compute_mode,
6349                                        simplify_gen_binary (ASHIFT,
6350                                                             compute_mode,
6351                                                             mask, pos),
6352                                        compute_mode),
6353                                      inner);
6354       masked = simplify_gen_binary (ASHIFT, compute_mode,
6355                                     simplify_gen_binary (
6356                                       AND, compute_mode,
6357                                       gen_lowpart (compute_mode, SET_SRC (x)),
6358                                       mask),
6359                                     pos);
6360
6361       x = gen_rtx_SET (VOIDmode, copy_rtx (inner),
6362                        simplify_gen_binary (IOR, compute_mode,
6363                                             cleared, masked));
6364     }
6365
6366   return x;
6367 }
6368 \f
6369 /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
6370    it is an RTX that represents a variable starting position; otherwise,
6371    POS is the (constant) starting bit position (counted from the LSB).
6372
6373    UNSIGNEDP is nonzero for an unsigned reference and zero for a
6374    signed reference.
6375
6376    IN_DEST is nonzero if this is a reference in the destination of a
6377    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If nonzero,
6378    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
6379    be used.
6380
6381    IN_COMPARE is nonzero if we are in a COMPARE.  This means that a
6382    ZERO_EXTRACT should be built even for bits starting at bit 0.
6383
6384    MODE is the desired mode of the result (if IN_DEST == 0).
6385
6386    The result is an RTX for the extraction or NULL_RTX if the target
6387    can't handle it.  */
6388
6389 static rtx
6390 make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
6391                  rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
6392                  int in_dest, int in_compare)
6393 {
6394   /* This mode describes the size of the storage area
6395      to fetch the overall value from.  Within that, we
6396      ignore the POS lowest bits, etc.  */
6397   enum machine_mode is_mode = GET_MODE (inner);
6398   enum machine_mode inner_mode;
6399   enum machine_mode wanted_inner_mode;
6400   enum machine_mode wanted_inner_reg_mode = word_mode;
6401   enum machine_mode pos_mode = word_mode;
6402   enum machine_mode extraction_mode = word_mode;
6403   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
6404   rtx new_rtx = 0;
6405   rtx orig_pos_rtx = pos_rtx;
6406   HOST_WIDE_INT orig_pos;
6407
6408   if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6409     {
6410       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
6411          consider just the QI as the memory to extract from.
6412          The subreg adds or removes high bits; its mode is
6413          irrelevant to the meaning of this extraction,
6414          since POS and LEN count from the lsb.  */
6415       if (MEM_P (SUBREG_REG (inner)))
6416         is_mode = GET_MODE (SUBREG_REG (inner));
6417       inner = SUBREG_REG (inner);
6418     }
6419   else if (GET_CODE (inner) == ASHIFT
6420            && GET_CODE (XEXP (inner, 1)) == CONST_INT
6421            && pos_rtx == 0 && pos == 0
6422            && len > (unsigned HOST_WIDE_INT) INTVAL (XEXP (inner, 1)))
6423     {
6424       /* We're extracting the least significant bits of an rtx
6425          (ashift X (const_int C)), where LEN > C.  Extract the
6426          least significant (LEN - C) bits of X, giving an rtx
6427          whose mode is MODE, then shift it left C times.  */
6428       new_rtx = make_extraction (mode, XEXP (inner, 0),
6429                              0, 0, len - INTVAL (XEXP (inner, 1)),
6430                              unsignedp, in_dest, in_compare);
6431       if (new_rtx != 0)
6432         return gen_rtx_ASHIFT (mode, new_rtx, XEXP (inner, 1));
6433     }
6434
6435   inner_mode = GET_MODE (inner);
6436
6437   if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
6438     pos = INTVAL (pos_rtx), pos_rtx = 0;
6439
6440   /* See if this can be done without an extraction.  We never can if the
6441      width of the field is not the same as that of some integer mode. For
6442      registers, we can only avoid the extraction if the position is at the
6443      low-order bit and this is either not in the destination or we have the
6444      appropriate STRICT_LOW_PART operation available.
6445
6446      For MEM, we can avoid an extract if the field starts on an appropriate
6447      boundary and we can change the mode of the memory reference.  */
6448
6449   if (tmode != BLKmode
6450       && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
6451            && !MEM_P (inner)
6452            && (inner_mode == tmode
6453                || !REG_P (inner)
6454                || TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode),
6455                                          GET_MODE_BITSIZE (inner_mode))
6456                || reg_truncated_to_mode (tmode, inner))
6457            && (! in_dest
6458                || (REG_P (inner)
6459                    && have_insn_for (STRICT_LOW_PART, tmode))))
6460           || (MEM_P (inner) && pos_rtx == 0
6461               && (pos
6462                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
6463                      : BITS_PER_UNIT)) == 0
6464               /* We can't do this if we are widening INNER_MODE (it
6465                  may not be aligned, for one thing).  */
6466               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
6467               && (inner_mode == tmode
6468                   || (! mode_dependent_address_p (XEXP (inner, 0))
6469                       && ! MEM_VOLATILE_P (inner))))))
6470     {
6471       /* If INNER is a MEM, make a new MEM that encompasses just the desired
6472          field.  If the original and current mode are the same, we need not
6473          adjust the offset.  Otherwise, we do if bytes big endian.
6474
6475          If INNER is not a MEM, get a piece consisting of just the field
6476          of interest (in this case POS % BITS_PER_WORD must be 0).  */
6477
6478       if (MEM_P (inner))
6479         {
6480           HOST_WIDE_INT offset;
6481
6482           /* POS counts from lsb, but make OFFSET count in memory order.  */
6483           if (BYTES_BIG_ENDIAN)
6484             offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
6485           else
6486             offset = pos / BITS_PER_UNIT;
6487
6488           new_rtx = adjust_address_nv (inner, tmode, offset);
6489         }
6490       else if (REG_P (inner))
6491         {
6492           if (tmode != inner_mode)
6493             {
6494               /* We can't call gen_lowpart in a DEST since we
6495                  always want a SUBREG (see below) and it would sometimes
6496                  return a new hard register.  */
6497               if (pos || in_dest)
6498                 {
6499                   HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
6500
6501                   if (WORDS_BIG_ENDIAN
6502                       && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
6503                     final_word = ((GET_MODE_SIZE (inner_mode)
6504                                    - GET_MODE_SIZE (tmode))
6505                                   / UNITS_PER_WORD) - final_word;
6506
6507                   final_word *= UNITS_PER_WORD;
6508                   if (BYTES_BIG_ENDIAN &&
6509                       GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
6510                     final_word += (GET_MODE_SIZE (inner_mode)
6511                                    - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
6512
6513                   /* Avoid creating invalid subregs, for example when
6514                      simplifying (x>>32)&255.  */
6515                   if (!validate_subreg (tmode, inner_mode, inner, final_word))
6516                     return NULL_RTX;
6517
6518                   new_rtx = gen_rtx_SUBREG (tmode, inner, final_word);
6519                 }
6520               else
6521                 new_rtx = gen_lowpart (tmode, inner);
6522             }
6523           else
6524             new_rtx = inner;
6525         }
6526       else
6527         new_rtx = force_to_mode (inner, tmode,
6528                              len >= HOST_BITS_PER_WIDE_INT
6529                              ? ~(unsigned HOST_WIDE_INT) 0
6530                              : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
6531                              0);
6532
6533       /* If this extraction is going into the destination of a SET,
6534          make a STRICT_LOW_PART unless we made a MEM.  */
6535
6536       if (in_dest)
6537         return (MEM_P (new_rtx) ? new_rtx
6538                 : (GET_CODE (new_rtx) != SUBREG
6539                    ? gen_rtx_CLOBBER (tmode, const0_rtx)
6540                    : gen_rtx_STRICT_LOW_PART (VOIDmode, new_rtx)));
6541
6542       if (mode == tmode)
6543         return new_rtx;
6544
6545       if (GET_CODE (new_rtx) == CONST_INT)
6546         return gen_int_mode (INTVAL (new_rtx), mode);
6547
6548       /* If we know that no extraneous bits are set, and that the high
6549          bit is not set, convert the extraction to the cheaper of
6550          sign and zero extension, that are equivalent in these cases.  */
6551       if (flag_expensive_optimizations
6552           && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
6553               && ((nonzero_bits (new_rtx, tmode)
6554                    & ~(((unsigned HOST_WIDE_INT)
6555                         GET_MODE_MASK (tmode))
6556                        >> 1))
6557                   == 0)))
6558         {
6559           rtx temp = gen_rtx_ZERO_EXTEND (mode, new_rtx);
6560           rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new_rtx);
6561
6562           /* Prefer ZERO_EXTENSION, since it gives more information to
6563              backends.  */
6564           if (rtx_cost (temp, SET, optimize_this_for_speed_p)
6565               <= rtx_cost (temp1, SET, optimize_this_for_speed_p))
6566             return temp;
6567           return temp1;
6568         }
6569
6570       /* Otherwise, sign- or zero-extend unless we already are in the
6571          proper mode.  */
6572
6573       return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
6574                              mode, new_rtx));
6575     }
6576
6577   /* Unless this is a COMPARE or we have a funny memory reference,
6578      don't do anything with zero-extending field extracts starting at
6579      the low-order bit since they are simple AND operations.  */
6580   if (pos_rtx == 0 && pos == 0 && ! in_dest
6581       && ! in_compare && unsignedp)
6582     return 0;
6583
6584   /* Unless INNER is not MEM, reject this if we would be spanning bytes or
6585      if the position is not a constant and the length is not 1.  In all
6586      other cases, we would only be going outside our object in cases when
6587      an original shift would have been undefined.  */
6588   if (MEM_P (inner)
6589       && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
6590           || (pos_rtx != 0 && len != 1)))
6591     return 0;
6592
6593   /* Get the mode to use should INNER not be a MEM, the mode for the position,
6594      and the mode for the result.  */
6595   if (in_dest && mode_for_extraction (EP_insv, -1) != MAX_MACHINE_MODE)
6596     {
6597       wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
6598       pos_mode = mode_for_extraction (EP_insv, 2);
6599       extraction_mode = mode_for_extraction (EP_insv, 3);
6600     }
6601
6602   if (! in_dest && unsignedp
6603       && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
6604     {
6605       wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
6606       pos_mode = mode_for_extraction (EP_extzv, 3);
6607       extraction_mode = mode_for_extraction (EP_extzv, 0);
6608     }
6609
6610   if (! in_dest && ! unsignedp
6611       && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
6612     {
6613       wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
6614       pos_mode = mode_for_extraction (EP_extv, 3);
6615       extraction_mode = mode_for_extraction (EP_extv, 0);
6616     }
6617
6618   /* Never narrow an object, since that might not be safe.  */
6619
6620   if (mode != VOIDmode
6621       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
6622     extraction_mode = mode;
6623
6624   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
6625       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6626     pos_mode = GET_MODE (pos_rtx);
6627
6628   /* If this is not from memory, the desired mode is the preferred mode
6629      for an extraction pattern's first input operand, or word_mode if there
6630      is none.  */
6631   if (!MEM_P (inner))
6632     wanted_inner_mode = wanted_inner_reg_mode;
6633   else
6634     {
6635       /* Be careful not to go beyond the extracted object and maintain the
6636          natural alignment of the memory.  */
6637       wanted_inner_mode = smallest_mode_for_size (len, MODE_INT);
6638       while (pos % GET_MODE_BITSIZE (wanted_inner_mode) + len
6639              > GET_MODE_BITSIZE (wanted_inner_mode))
6640         {
6641           wanted_inner_mode = GET_MODE_WIDER_MODE (wanted_inner_mode);
6642           gcc_assert (wanted_inner_mode != VOIDmode);
6643         }
6644
6645       /* If we have to change the mode of memory and cannot, the desired mode
6646          is EXTRACTION_MODE.  */
6647       if (inner_mode != wanted_inner_mode
6648           && (mode_dependent_address_p (XEXP (inner, 0))
6649               || MEM_VOLATILE_P (inner)
6650               || pos_rtx))
6651         wanted_inner_mode = extraction_mode;
6652     }
6653
6654   orig_pos = pos;
6655
6656   if (BITS_BIG_ENDIAN)
6657     {
6658       /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
6659          BITS_BIG_ENDIAN style.  If position is constant, compute new
6660          position.  Otherwise, build subtraction.
6661          Note that POS is relative to the mode of the original argument.
6662          If it's a MEM we need to recompute POS relative to that.
6663          However, if we're extracting from (or inserting into) a register,
6664          we want to recompute POS relative to wanted_inner_mode.  */
6665       int width = (MEM_P (inner)
6666                    ? GET_MODE_BITSIZE (is_mode)
6667                    : GET_MODE_BITSIZE (wanted_inner_mode));
6668
6669       if (pos_rtx == 0)
6670         pos = width - len - pos;
6671       else
6672         pos_rtx
6673           = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
6674       /* POS may be less than 0 now, but we check for that below.
6675          Note that it can only be less than 0 if !MEM_P (inner).  */
6676     }
6677
6678   /* If INNER has a wider mode, and this is a constant extraction, try to
6679      make it smaller and adjust the byte to point to the byte containing
6680      the value.  */
6681   if (wanted_inner_mode != VOIDmode
6682       && inner_mode != wanted_inner_mode
6683       && ! pos_rtx
6684       && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
6685       && MEM_P (inner)
6686       && ! mode_dependent_address_p (XEXP (inner, 0))
6687       && ! MEM_VOLATILE_P (inner))
6688     {
6689       int offset = 0;
6690
6691       /* The computations below will be correct if the machine is big
6692          endian in both bits and bytes or little endian in bits and bytes.
6693          If it is mixed, we must adjust.  */
6694
6695       /* If bytes are big endian and we had a paradoxical SUBREG, we must
6696          adjust OFFSET to compensate.  */
6697       if (BYTES_BIG_ENDIAN
6698           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
6699         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
6700
6701       /* We can now move to the desired byte.  */
6702       offset += (pos / GET_MODE_BITSIZE (wanted_inner_mode))
6703                 * GET_MODE_SIZE (wanted_inner_mode);
6704       pos %= GET_MODE_BITSIZE (wanted_inner_mode);
6705
6706       if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
6707           && is_mode != wanted_inner_mode)
6708         offset = (GET_MODE_SIZE (is_mode)
6709                   - GET_MODE_SIZE (wanted_inner_mode) - offset);
6710
6711       inner = adjust_address_nv (inner, wanted_inner_mode, offset);
6712     }
6713
6714   /* If INNER is not memory, we can always get it into the proper mode.  If we
6715      are changing its mode, POS must be a constant and smaller than the size
6716      of the new mode.  */
6717   else if (!MEM_P (inner))
6718     {
6719       if (GET_MODE (inner) != wanted_inner_mode
6720           && (pos_rtx != 0
6721               || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
6722         return 0;
6723
6724       if (orig_pos < 0)
6725         return 0;
6726
6727       inner = force_to_mode (inner, wanted_inner_mode,
6728                              pos_rtx
6729                              || len + orig_pos >= HOST_BITS_PER_WIDE_INT
6730                              ? ~(unsigned HOST_WIDE_INT) 0
6731                              : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
6732                                 << orig_pos),
6733                              0);
6734     }
6735
6736   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
6737      have to zero extend.  Otherwise, we can just use a SUBREG.  */
6738   if (pos_rtx != 0
6739       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
6740     {
6741       rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
6742
6743       /* If we know that no extraneous bits are set, and that the high
6744          bit is not set, convert extraction to cheaper one - either
6745          SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
6746          cases.  */
6747       if (flag_expensive_optimizations
6748           && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
6749               && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
6750                    & ~(((unsigned HOST_WIDE_INT)
6751                         GET_MODE_MASK (GET_MODE (pos_rtx)))
6752                        >> 1))
6753                   == 0)))
6754         {
6755           rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
6756
6757           /* Prefer ZERO_EXTENSION, since it gives more information to
6758              backends.  */
6759           if (rtx_cost (temp1, SET, optimize_this_for_speed_p)
6760               < rtx_cost (temp, SET, optimize_this_for_speed_p))
6761             temp = temp1;
6762         }
6763       pos_rtx = temp;
6764     }
6765   else if (pos_rtx != 0
6766            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6767     pos_rtx = gen_lowpart (pos_mode, pos_rtx);
6768
6769   /* Make POS_RTX unless we already have it and it is correct.  If we don't
6770      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
6771      be a CONST_INT.  */
6772   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
6773     pos_rtx = orig_pos_rtx;
6774
6775   else if (pos_rtx == 0)
6776     pos_rtx = GEN_INT (pos);
6777
6778   /* Make the required operation.  See if we can use existing rtx.  */
6779   new_rtx = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
6780                          extraction_mode, inner, GEN_INT (len), pos_rtx);
6781   if (! in_dest)
6782     new_rtx = gen_lowpart (mode, new_rtx);
6783
6784   return new_rtx;
6785 }
6786 \f
6787 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
6788    with any other operations in X.  Return X without that shift if so.  */
6789
6790 static rtx
6791 extract_left_shift (rtx x, int count)
6792 {
6793   enum rtx_code code = GET_CODE (x);
6794   enum machine_mode mode = GET_MODE (x);
6795   rtx tem;
6796
6797   switch (code)
6798     {
6799     case ASHIFT:
6800       /* This is the shift itself.  If it is wide enough, we will return
6801          either the value being shifted if the shift count is equal to
6802          COUNT or a shift for the difference.  */
6803       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6804           && INTVAL (XEXP (x, 1)) >= count)
6805         return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
6806                                      INTVAL (XEXP (x, 1)) - count);
6807       break;
6808
6809     case NEG:  case NOT:
6810       if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6811         return simplify_gen_unary (code, mode, tem, mode);
6812
6813       break;
6814
6815     case PLUS:  case IOR:  case XOR:  case AND:
6816       /* If we can safely shift this constant and we find the inner shift,
6817          make a new operation.  */
6818       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6819           && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
6820           && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6821         return simplify_gen_binary (code, mode, tem,
6822                                     GEN_INT (INTVAL (XEXP (x, 1)) >> count));
6823
6824       break;
6825
6826     default:
6827       break;
6828     }
6829
6830   return 0;
6831 }
6832 \f
6833 /* Look at the expression rooted at X.  Look for expressions
6834    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
6835    Form these expressions.
6836
6837    Return the new rtx, usually just X.
6838
6839    Also, for machines like the VAX that don't have logical shift insns,
6840    try to convert logical to arithmetic shift operations in cases where
6841    they are equivalent.  This undoes the canonicalizations to logical
6842    shifts done elsewhere.
6843
6844    We try, as much as possible, to re-use rtl expressions to save memory.
6845
6846    IN_CODE says what kind of expression we are processing.  Normally, it is
6847    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
6848    being kludges), it is MEM.  When processing the arguments of a comparison
6849    or a COMPARE against zero, it is COMPARE.  */
6850
6851 static rtx
6852 make_compound_operation (rtx x, enum rtx_code in_code)
6853 {
6854   enum rtx_code code = GET_CODE (x);
6855   enum machine_mode mode = GET_MODE (x);
6856   int mode_width = GET_MODE_BITSIZE (mode);
6857   rtx rhs, lhs;
6858   enum rtx_code next_code;
6859   int i, j;
6860   rtx new_rtx = 0;
6861   rtx tem;
6862   const char *fmt;
6863
6864   /* Select the code to be used in recursive calls.  Once we are inside an
6865      address, we stay there.  If we have a comparison, set to COMPARE,
6866      but once inside, go back to our default of SET.  */
6867
6868   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
6869                : ((code == COMPARE || COMPARISON_P (x))
6870                   && XEXP (x, 1) == const0_rtx) ? COMPARE
6871                : in_code == COMPARE ? SET : in_code);
6872
6873   /* Process depending on the code of this operation.  If NEW is set
6874      nonzero, it will be returned.  */
6875
6876   switch (code)
6877     {
6878     case ASHIFT:
6879       /* Convert shifts by constants into multiplications if inside
6880          an address.  */
6881       if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
6882           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6883           && INTVAL (XEXP (x, 1)) >= 0)
6884         {
6885           new_rtx = make_compound_operation (XEXP (x, 0), next_code);
6886           new_rtx = gen_rtx_MULT (mode, new_rtx,
6887                               GEN_INT ((HOST_WIDE_INT) 1
6888                                        << INTVAL (XEXP (x, 1))));
6889         }
6890       break;
6891
6892     case AND:
6893       /* If the second operand is not a constant, we can't do anything
6894          with it.  */
6895       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6896         break;
6897
6898       /* If the constant is a power of two minus one and the first operand
6899          is a logical right shift, make an extraction.  */
6900       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6901           && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6902         {
6903           new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6904           new_rtx = make_extraction (mode, new_rtx, 0, XEXP (XEXP (x, 0), 1), i, 1,
6905                                  0, in_code == COMPARE);
6906         }
6907
6908       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
6909       else if (GET_CODE (XEXP (x, 0)) == SUBREG
6910                && subreg_lowpart_p (XEXP (x, 0))
6911                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
6912                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6913         {
6914           new_rtx = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
6915                                          next_code);
6916           new_rtx = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new_rtx, 0,
6917                                  XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
6918                                  0, in_code == COMPARE);
6919         }
6920       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
6921       else if ((GET_CODE (XEXP (x, 0)) == XOR
6922                 || GET_CODE (XEXP (x, 0)) == IOR)
6923                && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
6924                && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
6925                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6926         {
6927           /* Apply the distributive law, and then try to make extractions.  */
6928           new_rtx = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
6929                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
6930                                              XEXP (x, 1)),
6931                                 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
6932                                              XEXP (x, 1)));
6933           new_rtx = make_compound_operation (new_rtx, in_code);
6934         }
6935
6936       /* If we are have (and (rotate X C) M) and C is larger than the number
6937          of bits in M, this is an extraction.  */
6938
6939       else if (GET_CODE (XEXP (x, 0)) == ROTATE
6940                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6941                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
6942                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
6943         {
6944           new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6945           new_rtx = make_extraction (mode, new_rtx,
6946                                  (GET_MODE_BITSIZE (mode)
6947                                   - INTVAL (XEXP (XEXP (x, 0), 1))),
6948                                  NULL_RTX, i, 1, 0, in_code == COMPARE);
6949         }
6950
6951       /* On machines without logical shifts, if the operand of the AND is
6952          a logical shift and our mask turns off all the propagated sign
6953          bits, we can replace the logical shift with an arithmetic shift.  */
6954       else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6955                && !have_insn_for (LSHIFTRT, mode)
6956                && have_insn_for (ASHIFTRT, mode)
6957                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6958                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6959                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6960                && mode_width <= HOST_BITS_PER_WIDE_INT)
6961         {
6962           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
6963
6964           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
6965           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
6966             SUBST (XEXP (x, 0),
6967                    gen_rtx_ASHIFTRT (mode,
6968                                      make_compound_operation
6969                                      (XEXP (XEXP (x, 0), 0), next_code),
6970                                      XEXP (XEXP (x, 0), 1)));
6971         }
6972
6973       /* If the constant is one less than a power of two, this might be
6974          representable by an extraction even if no shift is present.
6975          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
6976          we are in a COMPARE.  */
6977       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6978         new_rtx = make_extraction (mode,
6979                                make_compound_operation (XEXP (x, 0),
6980                                                         next_code),
6981                                0, NULL_RTX, i, 1, 0, in_code == COMPARE);
6982
6983       /* If we are in a comparison and this is an AND with a power of two,
6984          convert this into the appropriate bit extract.  */
6985       else if (in_code == COMPARE
6986                && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
6987         new_rtx = make_extraction (mode,
6988                                make_compound_operation (XEXP (x, 0),
6989                                                         next_code),
6990                                i, NULL_RTX, 1, 1, 0, 1);
6991
6992       break;
6993
6994     case LSHIFTRT:
6995       /* If the sign bit is known to be zero, replace this with an
6996          arithmetic shift.  */
6997       if (have_insn_for (ASHIFTRT, mode)
6998           && ! have_insn_for (LSHIFTRT, mode)
6999           && mode_width <= HOST_BITS_PER_WIDE_INT
7000           && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
7001         {
7002           new_rtx = gen_rtx_ASHIFTRT (mode,
7003                                   make_compound_operation (XEXP (x, 0),
7004                                                            next_code),
7005                                   XEXP (x, 1));
7006           break;
7007         }
7008
7009       /* ... fall through ...  */
7010
7011     case ASHIFTRT:
7012       lhs = XEXP (x, 0);
7013       rhs = XEXP (x, 1);
7014
7015       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
7016          this is a SIGN_EXTRACT.  */
7017       if (GET_CODE (rhs) == CONST_INT
7018           && GET_CODE (lhs) == ASHIFT
7019           && GET_CODE (XEXP (lhs, 1)) == CONST_INT
7020           && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))
7021           && INTVAL (rhs) < mode_width)
7022         {
7023           new_rtx = make_compound_operation (XEXP (lhs, 0), next_code);
7024           new_rtx = make_extraction (mode, new_rtx,
7025                                  INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
7026                                  NULL_RTX, mode_width - INTVAL (rhs),
7027                                  code == LSHIFTRT, 0, in_code == COMPARE);
7028           break;
7029         }
7030
7031       /* See if we have operations between an ASHIFTRT and an ASHIFT.
7032          If so, try to merge the shifts into a SIGN_EXTEND.  We could
7033          also do this for some cases of SIGN_EXTRACT, but it doesn't
7034          seem worth the effort; the case checked for occurs on Alpha.  */
7035
7036       if (!OBJECT_P (lhs)
7037           && ! (GET_CODE (lhs) == SUBREG
7038                 && (OBJECT_P (SUBREG_REG (lhs))))
7039           && GET_CODE (rhs) == CONST_INT
7040           && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
7041           && INTVAL (rhs) < mode_width
7042           && (new_rtx = extract_left_shift (lhs, INTVAL (rhs))) != 0)
7043         new_rtx = make_extraction (mode, make_compound_operation (new_rtx, next_code),
7044                                0, NULL_RTX, mode_width - INTVAL (rhs),
7045                                code == LSHIFTRT, 0, in_code == COMPARE);
7046
7047       break;
7048
7049     case SUBREG:
7050       /* Call ourselves recursively on the inner expression.  If we are
7051          narrowing the object and it has a different RTL code from
7052          what it originally did, do this SUBREG as a force_to_mode.  */
7053
7054       tem = make_compound_operation (SUBREG_REG (x), in_code);
7055
7056       {
7057         rtx simplified;
7058         simplified = simplify_subreg (GET_MODE (x), tem, GET_MODE (tem),
7059                                       SUBREG_BYTE (x));
7060
7061         if (simplified)
7062           tem = simplified;
7063
7064         if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
7065             && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
7066             && subreg_lowpart_p (x))
7067           {
7068             rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
7069                                        0);
7070
7071             /* If we have something other than a SUBREG, we might have
7072                done an expansion, so rerun ourselves.  */
7073             if (GET_CODE (newer) != SUBREG)
7074               newer = make_compound_operation (newer, in_code);
7075
7076             return newer;
7077           }
7078
7079         if (simplified)
7080           return tem;
7081       }
7082       break;
7083
7084     default:
7085       break;
7086     }
7087
7088   if (new_rtx)
7089     {
7090       x = gen_lowpart (mode, new_rtx);
7091       code = GET_CODE (x);
7092     }
7093
7094   /* Now recursively process each operand of this operation.  */
7095   fmt = GET_RTX_FORMAT (code);
7096   for (i = 0; i < GET_RTX_LENGTH (code); i++)
7097     if (fmt[i] == 'e')
7098       {
7099         new_rtx = make_compound_operation (XEXP (x, i), next_code);
7100         SUBST (XEXP (x, i), new_rtx);
7101       }
7102     else if (fmt[i] == 'E')
7103       for (j = 0; j < XVECLEN (x, i); j++)
7104         {
7105           new_rtx = make_compound_operation (XVECEXP (x, i, j), next_code);
7106           SUBST (XVECEXP (x, i, j), new_rtx);
7107         }
7108
7109   /* If this is a commutative operation, the changes to the operands
7110      may have made it noncanonical.  */
7111   if (COMMUTATIVE_ARITH_P (x)
7112       && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
7113     {
7114       tem = XEXP (x, 0);
7115       SUBST (XEXP (x, 0), XEXP (x, 1));
7116       SUBST (XEXP (x, 1), tem);
7117     }
7118
7119   return x;
7120 }
7121 \f
7122 /* Given M see if it is a value that would select a field of bits
7123    within an item, but not the entire word.  Return -1 if not.
7124    Otherwise, return the starting position of the field, where 0 is the
7125    low-order bit.
7126
7127    *PLEN is set to the length of the field.  */
7128
7129 static int
7130 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
7131 {
7132   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
7133   int pos = exact_log2 (m & -m);
7134   int len = 0;
7135
7136   if (pos >= 0)
7137     /* Now shift off the low-order zero bits and see if we have a
7138        power of two minus 1.  */
7139     len = exact_log2 ((m >> pos) + 1);
7140
7141   if (len <= 0)
7142     pos = -1;
7143
7144   *plen = len;
7145   return pos;
7146 }
7147 \f
7148 /* If X refers to a register that equals REG in value, replace these
7149    references with REG.  */
7150 static rtx
7151 canon_reg_for_combine (rtx x, rtx reg)
7152 {
7153   rtx op0, op1, op2;
7154   const char *fmt;
7155   int i;
7156   bool copied;
7157
7158   enum rtx_code code = GET_CODE (x);
7159   switch (GET_RTX_CLASS (code))
7160     {
7161     case RTX_UNARY:
7162       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7163       if (op0 != XEXP (x, 0))
7164         return simplify_gen_unary (GET_CODE (x), GET_MODE (x), op0,
7165                                    GET_MODE (reg));
7166       break;
7167
7168     case RTX_BIN_ARITH:
7169     case RTX_COMM_ARITH:
7170       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7171       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7172       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7173         return simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
7174       break;
7175
7176     case RTX_COMPARE:
7177     case RTX_COMM_COMPARE:
7178       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7179       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7180       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7181         return simplify_gen_relational (GET_CODE (x), GET_MODE (x),
7182                                         GET_MODE (op0), op0, op1);
7183       break;
7184
7185     case RTX_TERNARY:
7186     case RTX_BITFIELD_OPS:
7187       op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7188       op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7189       op2 = canon_reg_for_combine (XEXP (x, 2), reg);
7190       if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1) || op2 != XEXP (x, 2))
7191         return simplify_gen_ternary (GET_CODE (x), GET_MODE (x),
7192                                      GET_MODE (op0), op0, op1, op2);
7193
7194     case RTX_OBJ:
7195       if (REG_P (x))
7196         {
7197           if (rtx_equal_p (get_last_value (reg), x)
7198               || rtx_equal_p (reg, get_last_value (x)))
7199             return reg;
7200           else
7201             break;
7202         }
7203
7204       /* fall through */
7205
7206     default:
7207       fmt = GET_RTX_FORMAT (code);
7208       copied = false;
7209       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7210         if (fmt[i] == 'e')
7211           {
7212             rtx op = canon_reg_for_combine (XEXP (x, i), reg);
7213             if (op != XEXP (x, i))
7214               {
7215                 if (!copied)
7216                   {
7217                     copied = true;
7218                     x = copy_rtx (x);
7219                   }
7220                 XEXP (x, i) = op;
7221               }
7222           }
7223         else if (fmt[i] == 'E')
7224           {
7225             int j;
7226             for (j = 0; j < XVECLEN (x, i); j++)
7227               {
7228                 rtx op = canon_reg_for_combine (XVECEXP (x, i, j), reg);
7229                 if (op != XVECEXP (x, i, j))
7230                   {
7231                     if (!copied)
7232                       {
7233                         copied = true;
7234                         x = copy_rtx (x);
7235                       }
7236                     XVECEXP (x, i, j) = op;
7237                   }
7238               }
7239           }
7240
7241       break;
7242     }
7243
7244   return x;
7245 }
7246
7247 /* Return X converted to MODE.  If the value is already truncated to
7248    MODE we can just return a subreg even though in the general case we
7249    would need an explicit truncation.  */
7250
7251 static rtx
7252 gen_lowpart_or_truncate (enum machine_mode mode, rtx x)
7253 {
7254   if (GET_MODE_SIZE (GET_MODE (x)) <= GET_MODE_SIZE (mode)
7255       || TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
7256                                 GET_MODE_BITSIZE (GET_MODE (x)))
7257       || (REG_P (x) && reg_truncated_to_mode (mode, x)))
7258     return gen_lowpart (mode, x);
7259   else
7260     return simplify_gen_unary (TRUNCATE, mode, x, GET_MODE (x));
7261 }
7262
7263 /* See if X can be simplified knowing that we will only refer to it in
7264    MODE and will only refer to those bits that are nonzero in MASK.
7265    If other bits are being computed or if masking operations are done
7266    that select a superset of the bits in MASK, they can sometimes be
7267    ignored.
7268
7269    Return a possibly simplified expression, but always convert X to
7270    MODE.  If X is a CONST_INT, AND the CONST_INT with MASK.
7271
7272    If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
7273    are all off in X.  This is used when X will be complemented, by either
7274    NOT, NEG, or XOR.  */
7275
7276 static rtx
7277 force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
7278                int just_select)
7279 {
7280   enum rtx_code code = GET_CODE (x);
7281   int next_select = just_select || code == XOR || code == NOT || code == NEG;
7282   enum machine_mode op_mode;
7283   unsigned HOST_WIDE_INT fuller_mask, nonzero;
7284   rtx op0, op1, temp;
7285
7286   /* If this is a CALL or ASM_OPERANDS, don't do anything.  Some of the
7287      code below will do the wrong thing since the mode of such an
7288      expression is VOIDmode.
7289
7290      Also do nothing if X is a CLOBBER; this can happen if X was
7291      the return value from a call to gen_lowpart.  */
7292   if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
7293     return x;
7294
7295   /* We want to perform the operation is its present mode unless we know
7296      that the operation is valid in MODE, in which case we do the operation
7297      in MODE.  */
7298   op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
7299               && have_insn_for (code, mode))
7300              ? mode : GET_MODE (x));
7301
7302   /* It is not valid to do a right-shift in a narrower mode
7303      than the one it came in with.  */
7304   if ((code == LSHIFTRT || code == ASHIFTRT)
7305       && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
7306     op_mode = GET_MODE (x);
7307
7308   /* Truncate MASK to fit OP_MODE.  */
7309   if (op_mode)
7310     mask &= GET_MODE_MASK (op_mode);
7311
7312   /* When we have an arithmetic operation, or a shift whose count we
7313      do not know, we need to assume that all bits up to the highest-order
7314      bit in MASK will be needed.  This is how we form such a mask.  */
7315   if (mask & ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
7316     fuller_mask = ~(unsigned HOST_WIDE_INT) 0;
7317   else
7318     fuller_mask = (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
7319                    - 1);
7320
7321   /* Determine what bits of X are guaranteed to be (non)zero.  */
7322   nonzero = nonzero_bits (x, mode);
7323
7324   /* If none of the bits in X are needed, return a zero.  */
7325   if (!just_select && (nonzero & mask) == 0 && !side_effects_p (x))
7326     x = const0_rtx;
7327
7328   /* If X is a CONST_INT, return a new one.  Do this here since the
7329      test below will fail.  */
7330   if (GET_CODE (x) == CONST_INT)
7331     {
7332       if (SCALAR_INT_MODE_P (mode))
7333         return gen_int_mode (INTVAL (x) & mask, mode);
7334       else
7335         {
7336           x = GEN_INT (INTVAL (x) & mask);
7337           return gen_lowpart_common (mode, x);
7338         }
7339     }
7340
7341   /* If X is narrower than MODE and we want all the bits in X's mode, just
7342      get X in the proper mode.  */
7343   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
7344       && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
7345     return gen_lowpart (mode, x);
7346
7347   /* The arithmetic simplifications here do the wrong thing on vector modes.  */
7348   if (VECTOR_MODE_P (mode) || VECTOR_MODE_P (GET_MODE (x)))
7349       return gen_lowpart (mode, x);
7350
7351   switch (code)
7352     {
7353     case CLOBBER:
7354       /* If X is a (clobber (const_int)), return it since we know we are
7355          generating something that won't match.  */
7356       return x;
7357
7358     case SIGN_EXTEND:
7359     case ZERO_EXTEND:
7360     case ZERO_EXTRACT:
7361     case SIGN_EXTRACT:
7362       x = expand_compound_operation (x);
7363       if (GET_CODE (x) != code)
7364         return force_to_mode (x, mode, mask, next_select);
7365       break;
7366
7367     case SUBREG:
7368       if (subreg_lowpart_p (x)
7369           /* We can ignore the effect of this SUBREG if it narrows the mode or
7370              if the constant masks to zero all the bits the mode doesn't
7371              have.  */
7372           && ((GET_MODE_SIZE (GET_MODE (x))
7373                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
7374               || (0 == (mask
7375                         & GET_MODE_MASK (GET_MODE (x))
7376                         & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
7377         return force_to_mode (SUBREG_REG (x), mode, mask, next_select);
7378       break;
7379
7380     case AND:
7381       /* If this is an AND with a constant, convert it into an AND
7382          whose constant is the AND of that constant with MASK.  If it
7383          remains an AND of MASK, delete it since it is redundant.  */
7384
7385       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
7386         {
7387           x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
7388                                       mask & INTVAL (XEXP (x, 1)));
7389
7390           /* If X is still an AND, see if it is an AND with a mask that
7391              is just some low-order bits.  If so, and it is MASK, we don't
7392              need it.  */
7393
7394           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
7395               && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
7396                   == mask))
7397             x = XEXP (x, 0);
7398
7399           /* If it remains an AND, try making another AND with the bits
7400              in the mode mask that aren't in MASK turned on.  If the
7401              constant in the AND is wide enough, this might make a
7402              cheaper constant.  */
7403
7404           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
7405               && GET_MODE_MASK (GET_MODE (x)) != mask
7406               && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
7407             {
7408               HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
7409                                     | (GET_MODE_MASK (GET_MODE (x)) & ~mask));
7410               int width = GET_MODE_BITSIZE (GET_MODE (x));
7411               rtx y;
7412
7413               /* If MODE is narrower than HOST_WIDE_INT and CVAL is a negative
7414                  number, sign extend it.  */
7415               if (width > 0 && width < HOST_BITS_PER_WIDE_INT
7416                   && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7417                 cval |= (HOST_WIDE_INT) -1 << width;
7418
7419               y = simplify_gen_binary (AND, GET_MODE (x),
7420                                        XEXP (x, 0), GEN_INT (cval));
7421               if (rtx_cost (y, SET, optimize_this_for_speed_p)
7422                   < rtx_cost (x, SET, optimize_this_for_speed_p))
7423                 x = y;
7424             }
7425
7426           break;
7427         }
7428
7429       goto binop;
7430
7431     case PLUS:
7432       /* In (and (plus FOO C1) M), if M is a mask that just turns off
7433          low-order bits (as in an alignment operation) and FOO is already
7434          aligned to that boundary, mask C1 to that boundary as well.
7435          This may eliminate that PLUS and, later, the AND.  */
7436
7437       {
7438         unsigned int width = GET_MODE_BITSIZE (mode);
7439         unsigned HOST_WIDE_INT smask = mask;
7440
7441         /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
7442            number, sign extend it.  */
7443
7444         if (width < HOST_BITS_PER_WIDE_INT
7445             && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7446           smask |= (HOST_WIDE_INT) -1 << width;
7447
7448         if (GET_CODE (XEXP (x, 1)) == CONST_INT
7449             && exact_log2 (- smask) >= 0
7450             && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
7451             && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
7452           return force_to_mode (plus_constant (XEXP (x, 0),
7453                                                (INTVAL (XEXP (x, 1)) & smask)),
7454                                 mode, smask, next_select);
7455       }
7456
7457       /* ... fall through ...  */
7458
7459     case MULT:
7460       /* For PLUS, MINUS and MULT, we need any bits less significant than the
7461          most significant bit in MASK since carries from those bits will
7462          affect the bits we are interested in.  */
7463       mask = fuller_mask;
7464       goto binop;
7465
7466     case MINUS:
7467       /* If X is (minus C Y) where C's least set bit is larger than any bit
7468          in the mask, then we may replace with (neg Y).  */
7469       if (GET_CODE (XEXP (x, 0)) == CONST_INT
7470           && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
7471                                         & -INTVAL (XEXP (x, 0))))
7472               > mask))
7473         {
7474           x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
7475                                   GET_MODE (x));
7476           return force_to_mode (x, mode, mask, next_select);
7477         }
7478
7479       /* Similarly, if C contains every bit in the fuller_mask, then we may
7480          replace with (not Y).  */
7481       if (GET_CODE (XEXP (x, 0)) == CONST_INT
7482           && ((INTVAL (XEXP (x, 0)) | (HOST_WIDE_INT) fuller_mask)
7483               == INTVAL (XEXP (x, 0))))
7484         {
7485           x = simplify_gen_unary (NOT, GET_MODE (x),
7486                                   XEXP (x, 1), GET_MODE (x));
7487           return force_to_mode (x, mode, mask, next_select);
7488         }
7489
7490       mask = fuller_mask;
7491       goto binop;
7492
7493     case IOR:
7494     case XOR:
7495       /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
7496          LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
7497          operation which may be a bitfield extraction.  Ensure that the
7498          constant we form is not wider than the mode of X.  */
7499
7500       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7501           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7502           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7503           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7504           && GET_CODE (XEXP (x, 1)) == CONST_INT
7505           && ((INTVAL (XEXP (XEXP (x, 0), 1))
7506                + floor_log2 (INTVAL (XEXP (x, 1))))
7507               < GET_MODE_BITSIZE (GET_MODE (x)))
7508           && (INTVAL (XEXP (x, 1))
7509               & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
7510         {
7511           temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
7512                           << INTVAL (XEXP (XEXP (x, 0), 1)));
7513           temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
7514                                       XEXP (XEXP (x, 0), 0), temp);
7515           x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
7516                                    XEXP (XEXP (x, 0), 1));
7517           return force_to_mode (x, mode, mask, next_select);
7518         }
7519
7520     binop:
7521       /* For most binary operations, just propagate into the operation and
7522          change the mode if we have an operation of that mode.  */
7523
7524       op0 = gen_lowpart_or_truncate (op_mode,
7525                                      force_to_mode (XEXP (x, 0), mode, mask,
7526                                                     next_select));
7527       op1 = gen_lowpart_or_truncate (op_mode,
7528                                      force_to_mode (XEXP (x, 1), mode, mask,
7529                                         next_select));
7530
7531       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7532         x = simplify_gen_binary (code, op_mode, op0, op1);
7533       break;
7534
7535     case ASHIFT:
7536       /* For left shifts, do the same, but just for the first operand.
7537          However, we cannot do anything with shifts where we cannot
7538          guarantee that the counts are smaller than the size of the mode
7539          because such a count will have a different meaning in a
7540          wider mode.  */
7541
7542       if (! (GET_CODE (XEXP (x, 1)) == CONST_INT
7543              && INTVAL (XEXP (x, 1)) >= 0
7544              && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
7545           && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
7546                 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
7547                     < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
7548         break;
7549
7550       /* If the shift count is a constant and we can do arithmetic in
7551          the mode of the shift, refine which bits we need.  Otherwise, use the
7552          conservative form of the mask.  */
7553       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7554           && INTVAL (XEXP (x, 1)) >= 0
7555           && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
7556           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7557         mask >>= INTVAL (XEXP (x, 1));
7558       else
7559         mask = fuller_mask;
7560
7561       op0 = gen_lowpart_or_truncate (op_mode,
7562                                      force_to_mode (XEXP (x, 0), op_mode,
7563                                                     mask, next_select));
7564
7565       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7566         x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
7567       break;
7568
7569     case LSHIFTRT:
7570       /* Here we can only do something if the shift count is a constant,
7571          this shift constant is valid for the host, and we can do arithmetic
7572          in OP_MODE.  */
7573
7574       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7575           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7576           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7577         {
7578           rtx inner = XEXP (x, 0);
7579           unsigned HOST_WIDE_INT inner_mask;
7580
7581           /* Select the mask of the bits we need for the shift operand.  */
7582           inner_mask = mask << INTVAL (XEXP (x, 1));
7583
7584           /* We can only change the mode of the shift if we can do arithmetic
7585              in the mode of the shift and INNER_MASK is no wider than the
7586              width of X's mode.  */
7587           if ((inner_mask & ~GET_MODE_MASK (GET_MODE (x))) != 0)
7588             op_mode = GET_MODE (x);
7589
7590           inner = force_to_mode (inner, op_mode, inner_mask, next_select);
7591
7592           if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
7593             x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
7594         }
7595
7596       /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
7597          shift and AND produces only copies of the sign bit (C2 is one less
7598          than a power of two), we can do this with just a shift.  */
7599
7600       if (GET_CODE (x) == LSHIFTRT
7601           && GET_CODE (XEXP (x, 1)) == CONST_INT
7602           /* The shift puts one of the sign bit copies in the least significant
7603              bit.  */
7604           && ((INTVAL (XEXP (x, 1))
7605                + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
7606               >= GET_MODE_BITSIZE (GET_MODE (x)))
7607           && exact_log2 (mask + 1) >= 0
7608           /* Number of bits left after the shift must be more than the mask
7609              needs.  */
7610           && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
7611               <= GET_MODE_BITSIZE (GET_MODE (x)))
7612           /* Must be more sign bit copies than the mask needs.  */
7613           && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
7614               >= exact_log2 (mask + 1)))
7615         x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7616                                  GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
7617                                           - exact_log2 (mask + 1)));
7618
7619       goto shiftrt;
7620
7621     case ASHIFTRT:
7622       /* If we are just looking for the sign bit, we don't need this shift at
7623          all, even if it has a variable count.  */
7624       if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
7625           && (mask == ((unsigned HOST_WIDE_INT) 1
7626                        << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
7627         return force_to_mode (XEXP (x, 0), mode, mask, next_select);
7628
7629       /* If this is a shift by a constant, get a mask that contains those bits
7630          that are not copies of the sign bit.  We then have two cases:  If
7631          MASK only includes those bits, this can be a logical shift, which may
7632          allow simplifications.  If MASK is a single-bit field not within
7633          those bits, we are requesting a copy of the sign bit and hence can
7634          shift the sign bit to the appropriate location.  */
7635
7636       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0
7637           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7638         {
7639           int i;
7640
7641           /* If the considered data is wider than HOST_WIDE_INT, we can't
7642              represent a mask for all its bits in a single scalar.
7643              But we only care about the lower bits, so calculate these.  */
7644
7645           if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
7646             {
7647               nonzero = ~(HOST_WIDE_INT) 0;
7648
7649               /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7650                  is the number of bits a full-width mask would have set.
7651                  We need only shift if these are fewer than nonzero can
7652                  hold.  If not, we must keep all bits set in nonzero.  */
7653
7654               if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7655                   < HOST_BITS_PER_WIDE_INT)
7656                 nonzero >>= INTVAL (XEXP (x, 1))
7657                             + HOST_BITS_PER_WIDE_INT
7658                             - GET_MODE_BITSIZE (GET_MODE (x)) ;
7659             }
7660           else
7661             {
7662               nonzero = GET_MODE_MASK (GET_MODE (x));
7663               nonzero >>= INTVAL (XEXP (x, 1));
7664             }
7665
7666           if ((mask & ~nonzero) == 0)
7667             {
7668               x = simplify_shift_const (NULL_RTX, LSHIFTRT, GET_MODE (x),
7669                                         XEXP (x, 0), INTVAL (XEXP (x, 1)));
7670               if (GET_CODE (x) != ASHIFTRT)
7671                 return force_to_mode (x, mode, mask, next_select);
7672             }
7673
7674           else if ((i = exact_log2 (mask)) >= 0)
7675             {
7676               x = simplify_shift_const
7677                   (NULL_RTX, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7678                    GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
7679
7680               if (GET_CODE (x) != ASHIFTRT)
7681                 return force_to_mode (x, mode, mask, next_select);
7682             }
7683         }
7684
7685       /* If MASK is 1, convert this to an LSHIFTRT.  This can be done
7686          even if the shift count isn't a constant.  */
7687       if (mask == 1)
7688         x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
7689                                  XEXP (x, 0), XEXP (x, 1));
7690
7691     shiftrt:
7692
7693       /* If this is a zero- or sign-extension operation that just affects bits
7694          we don't care about, remove it.  Be sure the call above returned
7695          something that is still a shift.  */
7696
7697       if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
7698           && GET_CODE (XEXP (x, 1)) == CONST_INT
7699           && INTVAL (XEXP (x, 1)) >= 0
7700           && (INTVAL (XEXP (x, 1))
7701               <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
7702           && GET_CODE (XEXP (x, 0)) == ASHIFT
7703           && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
7704         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
7705                               next_select);
7706
7707       break;
7708
7709     case ROTATE:
7710     case ROTATERT:
7711       /* If the shift count is constant and we can do computations
7712          in the mode of X, compute where the bits we care about are.
7713          Otherwise, we can't do anything.  Don't change the mode of
7714          the shift or propagate MODE into the shift, though.  */
7715       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7716           && INTVAL (XEXP (x, 1)) >= 0)
7717         {
7718           temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
7719                                             GET_MODE (x), GEN_INT (mask),
7720                                             XEXP (x, 1));
7721           if (temp && GET_CODE (temp) == CONST_INT)
7722             SUBST (XEXP (x, 0),
7723                    force_to_mode (XEXP (x, 0), GET_MODE (x),
7724                                   INTVAL (temp), next_select));
7725         }
7726       break;
7727
7728     case NEG:
7729       /* If we just want the low-order bit, the NEG isn't needed since it
7730          won't change the low-order bit.  */
7731       if (mask == 1)
7732         return force_to_mode (XEXP (x, 0), mode, mask, just_select);
7733
7734       /* We need any bits less significant than the most significant bit in
7735          MASK since carries from those bits will affect the bits we are
7736          interested in.  */
7737       mask = fuller_mask;
7738       goto unop;
7739
7740     case NOT:
7741       /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
7742          same as the XOR case above.  Ensure that the constant we form is not
7743          wider than the mode of X.  */
7744
7745       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7746           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7747           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7748           && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
7749               < GET_MODE_BITSIZE (GET_MODE (x)))
7750           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
7751         {
7752           temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
7753                                GET_MODE (x));
7754           temp = simplify_gen_binary (XOR, GET_MODE (x),
7755                                       XEXP (XEXP (x, 0), 0), temp);
7756           x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
7757                                    temp, XEXP (XEXP (x, 0), 1));
7758
7759           return force_to_mode (x, mode, mask, next_select);
7760         }
7761
7762       /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
7763          use the full mask inside the NOT.  */
7764       mask = fuller_mask;
7765
7766     unop:
7767       op0 = gen_lowpart_or_truncate (op_mode,
7768                                      force_to_mode (XEXP (x, 0), mode, mask,
7769                                                     next_select));
7770       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7771         x = simplify_gen_unary (code, op_mode, op0, op_mode);
7772       break;
7773
7774     case NE:
7775       /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
7776          in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
7777          which is equal to STORE_FLAG_VALUE.  */
7778       if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
7779           && GET_MODE (XEXP (x, 0)) == mode
7780           && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
7781           && (nonzero_bits (XEXP (x, 0), mode)
7782               == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
7783         return force_to_mode (XEXP (x, 0), mode, mask, next_select);
7784
7785       break;
7786
7787     case IF_THEN_ELSE:
7788       /* We have no way of knowing if the IF_THEN_ELSE can itself be
7789          written in a narrower mode.  We play it safe and do not do so.  */
7790
7791       SUBST (XEXP (x, 1),
7792              gen_lowpart_or_truncate (GET_MODE (x),
7793                                       force_to_mode (XEXP (x, 1), mode,
7794                                                      mask, next_select)));
7795       SUBST (XEXP (x, 2),
7796              gen_lowpart_or_truncate (GET_MODE (x),
7797                                       force_to_mode (XEXP (x, 2), mode,
7798                                                      mask, next_select)));
7799       break;
7800
7801     default:
7802       break;
7803     }
7804
7805   /* Ensure we return a value of the proper mode.  */
7806   return gen_lowpart_or_truncate (mode, x);
7807 }
7808 \f
7809 /* Return nonzero if X is an expression that has one of two values depending on
7810    whether some other value is zero or nonzero.  In that case, we return the
7811    value that is being tested, *PTRUE is set to the value if the rtx being
7812    returned has a nonzero value, and *PFALSE is set to the other alternative.
7813
7814    If we return zero, we set *PTRUE and *PFALSE to X.  */
7815
7816 static rtx
7817 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
7818 {
7819   enum machine_mode mode = GET_MODE (x);
7820   enum rtx_code code = GET_CODE (x);
7821   rtx cond0, cond1, true0, true1, false0, false1;
7822   unsigned HOST_WIDE_INT nz;
7823
7824   /* If we are comparing a value against zero, we are done.  */
7825   if ((code == NE || code == EQ)
7826       && XEXP (x, 1) == const0_rtx)
7827     {
7828       *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
7829       *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
7830       return XEXP (x, 0);
7831     }
7832
7833   /* If this is a unary operation whose operand has one of two values, apply
7834      our opcode to compute those values.  */
7835   else if (UNARY_P (x)
7836            && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
7837     {
7838       *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
7839       *pfalse = simplify_gen_unary (code, mode, false0,
7840                                     GET_MODE (XEXP (x, 0)));
7841       return cond0;
7842     }
7843
7844   /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
7845      make can't possibly match and would suppress other optimizations.  */
7846   else if (code == COMPARE)
7847     ;
7848
7849   /* If this is a binary operation, see if either side has only one of two
7850      values.  If either one does or if both do and they are conditional on
7851      the same value, compute the new true and false values.  */
7852   else if (BINARY_P (x))
7853     {
7854       cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
7855       cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
7856
7857       if ((cond0 != 0 || cond1 != 0)
7858           && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
7859         {
7860           /* If if_then_else_cond returned zero, then true/false are the
7861              same rtl.  We must copy one of them to prevent invalid rtl
7862              sharing.  */
7863           if (cond0 == 0)
7864             true0 = copy_rtx (true0);
7865           else if (cond1 == 0)
7866             true1 = copy_rtx (true1);
7867
7868           if (COMPARISON_P (x))
7869             {
7870               *ptrue = simplify_gen_relational (code, mode, VOIDmode,
7871                                                 true0, true1);
7872               *pfalse = simplify_gen_relational (code, mode, VOIDmode,
7873                                                  false0, false1);
7874              }
7875           else
7876             {
7877               *ptrue = simplify_gen_binary (code, mode, true0, true1);
7878               *pfalse = simplify_gen_binary (code, mode, false0, false1);
7879             }
7880
7881           return cond0 ? cond0 : cond1;
7882         }
7883
7884       /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
7885          operands is zero when the other is nonzero, and vice-versa,
7886          and STORE_FLAG_VALUE is 1 or -1.  */
7887
7888       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7889           && (code == PLUS || code == IOR || code == XOR || code == MINUS
7890               || code == UMAX)
7891           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7892         {
7893           rtx op0 = XEXP (XEXP (x, 0), 1);
7894           rtx op1 = XEXP (XEXP (x, 1), 1);
7895
7896           cond0 = XEXP (XEXP (x, 0), 0);
7897           cond1 = XEXP (XEXP (x, 1), 0);
7898
7899           if (COMPARISON_P (cond0)
7900               && COMPARISON_P (cond1)
7901               && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
7902                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7903                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7904                   || ((swap_condition (GET_CODE (cond0))
7905                        == reversed_comparison_code (cond1, NULL))
7906                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7907                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7908               && ! side_effects_p (x))
7909             {
7910               *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
7911               *pfalse = simplify_gen_binary (MULT, mode,
7912                                              (code == MINUS
7913                                               ? simplify_gen_unary (NEG, mode,
7914                                                                     op1, mode)
7915                                               : op1),
7916                                               const_true_rtx);
7917               return cond0;
7918             }
7919         }
7920
7921       /* Similarly for MULT, AND and UMIN, except that for these the result
7922          is always zero.  */
7923       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7924           && (code == MULT || code == AND || code == UMIN)
7925           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7926         {
7927           cond0 = XEXP (XEXP (x, 0), 0);
7928           cond1 = XEXP (XEXP (x, 1), 0);
7929
7930           if (COMPARISON_P (cond0)
7931               && COMPARISON_P (cond1)
7932               && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
7933                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7934                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7935                   || ((swap_condition (GET_CODE (cond0))
7936                        == reversed_comparison_code (cond1, NULL))
7937                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7938                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7939               && ! side_effects_p (x))
7940             {
7941               *ptrue = *pfalse = const0_rtx;
7942               return cond0;
7943             }
7944         }
7945     }
7946
7947   else if (code == IF_THEN_ELSE)
7948     {
7949       /* If we have IF_THEN_ELSE already, extract the condition and
7950          canonicalize it if it is NE or EQ.  */
7951       cond0 = XEXP (x, 0);
7952       *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
7953       if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
7954         return XEXP (cond0, 0);
7955       else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
7956         {
7957           *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
7958           return XEXP (cond0, 0);
7959         }
7960       else
7961         return cond0;
7962     }
7963
7964   /* If X is a SUBREG, we can narrow both the true and false values
7965      if the inner expression, if there is a condition.  */
7966   else if (code == SUBREG
7967            && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
7968                                                &true0, &false0)))
7969     {
7970       true0 = simplify_gen_subreg (mode, true0,
7971                                    GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7972       false0 = simplify_gen_subreg (mode, false0,
7973                                     GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7974       if (true0 && false0)
7975         {
7976           *ptrue = true0;
7977           *pfalse = false0;
7978           return cond0;
7979         }
7980     }
7981
7982   /* If X is a constant, this isn't special and will cause confusions
7983      if we treat it as such.  Likewise if it is equivalent to a constant.  */
7984   else if (CONSTANT_P (x)
7985            || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
7986     ;
7987
7988   /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
7989      will be least confusing to the rest of the compiler.  */
7990   else if (mode == BImode)
7991     {
7992       *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
7993       return x;
7994     }
7995
7996   /* If X is known to be either 0 or -1, those are the true and
7997      false values when testing X.  */
7998   else if (x == constm1_rtx || x == const0_rtx
7999            || (mode != VOIDmode
8000                && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
8001     {
8002       *ptrue = constm1_rtx, *pfalse = const0_rtx;
8003       return x;
8004     }
8005
8006   /* Likewise for 0 or a single bit.  */
8007   else if (SCALAR_INT_MODE_P (mode)
8008            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8009            && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
8010     {
8011       *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
8012       return x;
8013     }
8014
8015   /* Otherwise fail; show no condition with true and false values the same.  */
8016   *ptrue = *pfalse = x;
8017   return 0;
8018 }
8019 \f
8020 /* Return the value of expression X given the fact that condition COND
8021    is known to be true when applied to REG as its first operand and VAL
8022    as its second.  X is known to not be shared and so can be modified in
8023    place.
8024
8025    We only handle the simplest cases, and specifically those cases that
8026    arise with IF_THEN_ELSE expressions.  */
8027
8028 static rtx
8029 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
8030 {
8031   enum rtx_code code = GET_CODE (x);
8032   rtx temp;
8033   const char *fmt;
8034   int i, j;
8035
8036   if (side_effects_p (x))
8037     return x;
8038
8039   /* If either operand of the condition is a floating point value,
8040      then we have to avoid collapsing an EQ comparison.  */
8041   if (cond == EQ
8042       && rtx_equal_p (x, reg)
8043       && ! FLOAT_MODE_P (GET_MODE (x))
8044       && ! FLOAT_MODE_P (GET_MODE (val)))
8045     return val;
8046
8047   if (cond == UNEQ && rtx_equal_p (x, reg))
8048     return val;
8049
8050   /* If X is (abs REG) and we know something about REG's relationship
8051      with zero, we may be able to simplify this.  */
8052
8053   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
8054     switch (cond)
8055       {
8056       case GE:  case GT:  case EQ:
8057         return XEXP (x, 0);
8058       case LT:  case LE:
8059         return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
8060                                    XEXP (x, 0),
8061                                    GET_MODE (XEXP (x, 0)));
8062       default:
8063         break;
8064       }
8065
8066   /* The only other cases we handle are MIN, MAX, and comparisons if the
8067      operands are the same as REG and VAL.  */
8068
8069   else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
8070     {
8071       if (rtx_equal_p (XEXP (x, 0), val))
8072         cond = swap_condition (cond), temp = val, val = reg, reg = temp;
8073
8074       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
8075         {
8076           if (COMPARISON_P (x))
8077             {
8078               if (comparison_dominates_p (cond, code))
8079                 return const_true_rtx;
8080
8081               code = reversed_comparison_code (x, NULL);
8082               if (code != UNKNOWN
8083                   && comparison_dominates_p (cond, code))
8084                 return const0_rtx;
8085               else
8086                 return x;
8087             }
8088           else if (code == SMAX || code == SMIN
8089                    || code == UMIN || code == UMAX)
8090             {
8091               int unsignedp = (code == UMIN || code == UMAX);
8092
8093               /* Do not reverse the condition when it is NE or EQ.
8094                  This is because we cannot conclude anything about
8095                  the value of 'SMAX (x, y)' when x is not equal to y,
8096                  but we can when x equals y.  */
8097               if ((code == SMAX || code == UMAX)
8098                   && ! (cond == EQ || cond == NE))
8099                 cond = reverse_condition (cond);
8100
8101               switch (cond)
8102                 {
8103                 case GE:   case GT:
8104                   return unsignedp ? x : XEXP (x, 1);
8105                 case LE:   case LT:
8106                   return unsignedp ? x : XEXP (x, 0);
8107                 case GEU:  case GTU:
8108                   return unsignedp ? XEXP (x, 1) : x;
8109                 case LEU:  case LTU:
8110                   return unsignedp ? XEXP (x, 0) : x;
8111                 default:
8112                   break;
8113                 }
8114             }
8115         }
8116     }
8117   else if (code == SUBREG)
8118     {
8119       enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
8120       rtx new_rtx, r = known_cond (SUBREG_REG (x), cond, reg, val);
8121
8122       if (SUBREG_REG (x) != r)
8123         {
8124           /* We must simplify subreg here, before we lose track of the
8125              original inner_mode.  */
8126           new_rtx = simplify_subreg (GET_MODE (x), r,
8127                                  inner_mode, SUBREG_BYTE (x));
8128           if (new_rtx)
8129             return new_rtx;
8130           else
8131             SUBST (SUBREG_REG (x), r);
8132         }
8133
8134       return x;
8135     }
8136   /* We don't have to handle SIGN_EXTEND here, because even in the
8137      case of replacing something with a modeless CONST_INT, a
8138      CONST_INT is already (supposed to be) a valid sign extension for
8139      its narrower mode, which implies it's already properly
8140      sign-extended for the wider mode.  Now, for ZERO_EXTEND, the
8141      story is different.  */
8142   else if (code == ZERO_EXTEND)
8143     {
8144       enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
8145       rtx new_rtx, r = known_cond (XEXP (x, 0), cond, reg, val);
8146
8147       if (XEXP (x, 0) != r)
8148         {
8149           /* We must simplify the zero_extend here, before we lose
8150              track of the original inner_mode.  */
8151           new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
8152                                           r, inner_mode);
8153           if (new_rtx)
8154             return new_rtx;
8155           else
8156             SUBST (XEXP (x, 0), r);
8157         }
8158
8159       return x;
8160     }
8161
8162   fmt = GET_RTX_FORMAT (code);
8163   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8164     {
8165       if (fmt[i] == 'e')
8166         SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
8167       else if (fmt[i] == 'E')
8168         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8169           SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
8170                                                 cond, reg, val));
8171     }
8172
8173   return x;
8174 }
8175 \f
8176 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
8177    assignment as a field assignment.  */
8178
8179 static int
8180 rtx_equal_for_field_assignment_p (rtx x, rtx y)
8181 {
8182   if (x == y || rtx_equal_p (x, y))
8183     return 1;
8184
8185   if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
8186     return 0;
8187
8188   /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
8189      Note that all SUBREGs of MEM are paradoxical; otherwise they
8190      would have been rewritten.  */
8191   if (MEM_P (x) && GET_CODE (y) == SUBREG
8192       && MEM_P (SUBREG_REG (y))
8193       && rtx_equal_p (SUBREG_REG (y),
8194                       gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
8195     return 1;
8196
8197   if (MEM_P (y) && GET_CODE (x) == SUBREG
8198       && MEM_P (SUBREG_REG (x))
8199       && rtx_equal_p (SUBREG_REG (x),
8200                       gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
8201     return 1;
8202
8203   /* We used to see if get_last_value of X and Y were the same but that's
8204      not correct.  In one direction, we'll cause the assignment to have
8205      the wrong destination and in the case, we'll import a register into this
8206      insn that might have already have been dead.   So fail if none of the
8207      above cases are true.  */
8208   return 0;
8209 }
8210 \f
8211 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
8212    Return that assignment if so.
8213
8214    We only handle the most common cases.  */
8215
8216 static rtx
8217 make_field_assignment (rtx x)
8218 {
8219   rtx dest = SET_DEST (x);
8220   rtx src = SET_SRC (x);
8221   rtx assign;
8222   rtx rhs, lhs;
8223   HOST_WIDE_INT c1;
8224   HOST_WIDE_INT pos;
8225   unsigned HOST_WIDE_INT len;
8226   rtx other;
8227   enum machine_mode mode;
8228
8229   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
8230      a clear of a one-bit field.  We will have changed it to
8231      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
8232      for a SUBREG.  */
8233
8234   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
8235       && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
8236       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
8237       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8238     {
8239       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8240                                 1, 1, 1, 0);
8241       if (assign != 0)
8242         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8243       return x;
8244     }
8245
8246   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
8247       && subreg_lowpart_p (XEXP (src, 0))
8248       && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
8249           < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
8250       && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
8251       && GET_CODE (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == CONST_INT
8252       && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
8253       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8254     {
8255       assign = make_extraction (VOIDmode, dest, 0,
8256                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
8257                                 1, 1, 1, 0);
8258       if (assign != 0)
8259         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8260       return x;
8261     }
8262
8263   /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
8264      one-bit field.  */
8265   if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
8266       && XEXP (XEXP (src, 0), 0) == const1_rtx
8267       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8268     {
8269       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8270                                 1, 1, 1, 0);
8271       if (assign != 0)
8272         return gen_rtx_SET (VOIDmode, assign, const1_rtx);
8273       return x;
8274     }
8275
8276   /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
8277      SRC is an AND with all bits of that field set, then we can discard
8278      the AND.  */
8279   if (GET_CODE (dest) == ZERO_EXTRACT
8280       && GET_CODE (XEXP (dest, 1)) == CONST_INT
8281       && GET_CODE (src) == AND
8282       && GET_CODE (XEXP (src, 1)) == CONST_INT)
8283     {
8284       HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
8285       unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
8286       unsigned HOST_WIDE_INT ze_mask;
8287
8288       if (width >= HOST_BITS_PER_WIDE_INT)
8289         ze_mask = -1;
8290       else
8291         ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
8292
8293       /* Complete overlap.  We can remove the source AND.  */
8294       if ((and_mask & ze_mask) == ze_mask)
8295         return gen_rtx_SET (VOIDmode, dest, XEXP (src, 0));
8296
8297       /* Partial overlap.  We can reduce the source AND.  */
8298       if ((and_mask & ze_mask) != and_mask)
8299         {
8300           mode = GET_MODE (src);
8301           src = gen_rtx_AND (mode, XEXP (src, 0),
8302                              gen_int_mode (and_mask & ze_mask, mode));
8303           return gen_rtx_SET (VOIDmode, dest, src);
8304         }
8305     }
8306
8307   /* The other case we handle is assignments into a constant-position
8308      field.  They look like (ior/xor (and DEST C1) OTHER).  If C1 represents
8309      a mask that has all one bits except for a group of zero bits and
8310      OTHER is known to have zeros where C1 has ones, this is such an
8311      assignment.  Compute the position and length from C1.  Shift OTHER
8312      to the appropriate position, force it to the required mode, and
8313      make the extraction.  Check for the AND in both operands.  */
8314
8315   if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
8316     return x;
8317
8318   rhs = expand_compound_operation (XEXP (src, 0));
8319   lhs = expand_compound_operation (XEXP (src, 1));
8320
8321   if (GET_CODE (rhs) == AND
8322       && GET_CODE (XEXP (rhs, 1)) == CONST_INT
8323       && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
8324     c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
8325   else if (GET_CODE (lhs) == AND
8326            && GET_CODE (XEXP (lhs, 1)) == CONST_INT
8327            && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
8328     c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
8329   else
8330     return x;
8331
8332   pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
8333   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
8334       || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
8335       || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
8336     return x;
8337
8338   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
8339   if (assign == 0)
8340     return x;
8341
8342   /* The mode to use for the source is the mode of the assignment, or of
8343      what is inside a possible STRICT_LOW_PART.  */
8344   mode = (GET_CODE (assign) == STRICT_LOW_PART
8345           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
8346
8347   /* Shift OTHER right POS places and make it the source, restricting it
8348      to the proper length and mode.  */
8349
8350   src = canon_reg_for_combine (simplify_shift_const (NULL_RTX, LSHIFTRT,
8351                                                      GET_MODE (src),
8352                                                      other, pos),
8353                                dest);
8354   src = force_to_mode (src, mode,
8355                        GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
8356                        ? ~(unsigned HOST_WIDE_INT) 0
8357                        : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
8358                        0);
8359
8360   /* If SRC is masked by an AND that does not make a difference in
8361      the value being stored, strip it.  */
8362   if (GET_CODE (assign) == ZERO_EXTRACT
8363       && GET_CODE (XEXP (assign, 1)) == CONST_INT
8364       && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
8365       && GET_CODE (src) == AND
8366       && GET_CODE (XEXP (src, 1)) == CONST_INT
8367       && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (src, 1))
8368           == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1))
8369     src = XEXP (src, 0);
8370
8371   return gen_rtx_SET (VOIDmode, assign, src);
8372 }
8373 \f
8374 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
8375    if so.  */
8376
8377 static rtx
8378 apply_distributive_law (rtx x)
8379 {
8380   enum rtx_code code = GET_CODE (x);
8381   enum rtx_code inner_code;
8382   rtx lhs, rhs, other;
8383   rtx tem;
8384
8385   /* Distributivity is not true for floating point as it can change the
8386      value.  So we don't do it unless -funsafe-math-optimizations.  */
8387   if (FLOAT_MODE_P (GET_MODE (x))
8388       && ! flag_unsafe_math_optimizations)
8389     return x;
8390
8391   /* The outer operation can only be one of the following:  */
8392   if (code != IOR && code != AND && code != XOR
8393       && code != PLUS && code != MINUS)
8394     return x;
8395
8396   lhs = XEXP (x, 0);
8397   rhs = XEXP (x, 1);
8398
8399   /* If either operand is a primitive we can't do anything, so get out
8400      fast.  */
8401   if (OBJECT_P (lhs) || OBJECT_P (rhs))
8402     return x;
8403
8404   lhs = expand_compound_operation (lhs);
8405   rhs = expand_compound_operation (rhs);
8406   inner_code = GET_CODE (lhs);
8407   if (inner_code != GET_CODE (rhs))
8408     return x;
8409
8410   /* See if the inner and outer operations distribute.  */
8411   switch (inner_code)
8412     {
8413     case LSHIFTRT:
8414     case ASHIFTRT:
8415     case AND:
8416     case IOR:
8417       /* These all distribute except over PLUS.  */
8418       if (code == PLUS || code == MINUS)
8419         return x;
8420       break;
8421
8422     case MULT:
8423       if (code != PLUS && code != MINUS)
8424         return x;
8425       break;
8426
8427     case ASHIFT:
8428       /* This is also a multiply, so it distributes over everything.  */
8429       break;
8430
8431     case SUBREG:
8432       /* Non-paradoxical SUBREGs distributes over all operations,
8433          provided the inner modes and byte offsets are the same, this
8434          is an extraction of a low-order part, we don't convert an fp
8435          operation to int or vice versa, this is not a vector mode,
8436          and we would not be converting a single-word operation into a
8437          multi-word operation.  The latter test is not required, but
8438          it prevents generating unneeded multi-word operations.  Some
8439          of the previous tests are redundant given the latter test,
8440          but are retained because they are required for correctness.
8441
8442          We produce the result slightly differently in this case.  */
8443
8444       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
8445           || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
8446           || ! subreg_lowpart_p (lhs)
8447           || (GET_MODE_CLASS (GET_MODE (lhs))
8448               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
8449           || (GET_MODE_SIZE (GET_MODE (lhs))
8450               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
8451           || VECTOR_MODE_P (GET_MODE (lhs))
8452           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD
8453           /* Result might need to be truncated.  Don't change mode if
8454              explicit truncation is needed.  */
8455           || !TRULY_NOOP_TRUNCATION
8456                (GET_MODE_BITSIZE (GET_MODE (x)),
8457                 GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (lhs)))))
8458         return x;
8459
8460       tem = simplify_gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
8461                                  SUBREG_REG (lhs), SUBREG_REG (rhs));
8462       return gen_lowpart (GET_MODE (x), tem);
8463
8464     default:
8465       return x;
8466     }
8467
8468   /* Set LHS and RHS to the inner operands (A and B in the example
8469      above) and set OTHER to the common operand (C in the example).
8470      There is only one way to do this unless the inner operation is
8471      commutative.  */
8472   if (COMMUTATIVE_ARITH_P (lhs)
8473       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
8474     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
8475   else if (COMMUTATIVE_ARITH_P (lhs)
8476            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
8477     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
8478   else if (COMMUTATIVE_ARITH_P (lhs)
8479            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
8480     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
8481   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
8482     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
8483   else
8484     return x;
8485
8486   /* Form the new inner operation, seeing if it simplifies first.  */
8487   tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
8488
8489   /* There is one exception to the general way of distributing:
8490      (a | c) ^ (b | c) -> (a ^ b) & ~c  */
8491   if (code == XOR && inner_code == IOR)
8492     {
8493       inner_code = AND;
8494       other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
8495     }
8496
8497   /* We may be able to continuing distributing the result, so call
8498      ourselves recursively on the inner operation before forming the
8499      outer operation, which we return.  */
8500   return simplify_gen_binary (inner_code, GET_MODE (x),
8501                               apply_distributive_law (tem), other);
8502 }
8503
8504 /* See if X is of the form (* (+ A B) C), and if so convert to
8505    (+ (* A C) (* B C)) and try to simplify.
8506
8507    Most of the time, this results in no change.  However, if some of
8508    the operands are the same or inverses of each other, simplifications
8509    will result.
8510
8511    For example, (and (ior A B) (not B)) can occur as the result of
8512    expanding a bit field assignment.  When we apply the distributive
8513    law to this, we get (ior (and (A (not B))) (and (B (not B)))),
8514    which then simplifies to (and (A (not B))).
8515
8516    Note that no checks happen on the validity of applying the inverse
8517    distributive law.  This is pointless since we can do it in the
8518    few places where this routine is called.
8519
8520    N is the index of the term that is decomposed (the arithmetic operation,
8521    i.e. (+ A B) in the first example above).  !N is the index of the term that
8522    is distributed, i.e. of C in the first example above.  */
8523 static rtx
8524 distribute_and_simplify_rtx (rtx x, int n)
8525 {
8526   enum machine_mode mode;
8527   enum rtx_code outer_code, inner_code;
8528   rtx decomposed, distributed, inner_op0, inner_op1, new_op0, new_op1, tmp;
8529
8530   decomposed = XEXP (x, n);
8531   if (!ARITHMETIC_P (decomposed))
8532     return NULL_RTX;
8533
8534   mode = GET_MODE (x);
8535   outer_code = GET_CODE (x);
8536   distributed = XEXP (x, !n);
8537
8538   inner_code = GET_CODE (decomposed);
8539   inner_op0 = XEXP (decomposed, 0);
8540   inner_op1 = XEXP (decomposed, 1);
8541
8542   /* Special case (and (xor B C) (not A)), which is equivalent to
8543      (xor (ior A B) (ior A C))  */
8544   if (outer_code == AND && inner_code == XOR && GET_CODE (distributed) == NOT)
8545     {
8546       distributed = XEXP (distributed, 0);
8547       outer_code = IOR;
8548     }
8549
8550   if (n == 0)
8551     {
8552       /* Distribute the second term.  */
8553       new_op0 = simplify_gen_binary (outer_code, mode, inner_op0, distributed);
8554       new_op1 = simplify_gen_binary (outer_code, mode, inner_op1, distributed);
8555     }
8556   else
8557     {
8558       /* Distribute the first term.  */
8559       new_op0 = simplify_gen_binary (outer_code, mode, distributed, inner_op0);
8560       new_op1 = simplify_gen_binary (outer_code, mode, distributed, inner_op1);
8561     }
8562
8563   tmp = apply_distributive_law (simplify_gen_binary (inner_code, mode,
8564                                                      new_op0, new_op1));
8565   if (GET_CODE (tmp) != outer_code
8566       && rtx_cost (tmp, SET, optimize_this_for_speed_p)
8567          < rtx_cost (x, SET, optimize_this_for_speed_p))
8568     return tmp;
8569
8570   return NULL_RTX;
8571 }
8572 \f
8573 /* Simplify a logical `and' of VAROP with the constant CONSTOP, to be done
8574    in MODE.  Return an equivalent form, if different from (and VAROP
8575    (const_int CONSTOP)).  Otherwise, return NULL_RTX.  */
8576
8577 static rtx
8578 simplify_and_const_int_1 (enum machine_mode mode, rtx varop,
8579                           unsigned HOST_WIDE_INT constop)
8580 {
8581   unsigned HOST_WIDE_INT nonzero;
8582   unsigned HOST_WIDE_INT orig_constop;
8583   rtx orig_varop;
8584   int i;
8585
8586   orig_varop = varop;
8587   orig_constop = constop;
8588   if (GET_CODE (varop) == CLOBBER)
8589     return NULL_RTX;
8590
8591   /* Simplify VAROP knowing that we will be only looking at some of the
8592      bits in it.
8593
8594      Note by passing in CONSTOP, we guarantee that the bits not set in
8595      CONSTOP are not significant and will never be examined.  We must
8596      ensure that is the case by explicitly masking out those bits
8597      before returning.  */
8598   varop = force_to_mode (varop, mode, constop, 0);
8599
8600   /* If VAROP is a CLOBBER, we will fail so return it.  */
8601   if (GET_CODE (varop) == CLOBBER)
8602     return varop;
8603
8604   /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
8605      to VAROP and return the new constant.  */
8606   if (GET_CODE (varop) == CONST_INT)
8607     return gen_int_mode (INTVAL (varop) & constop, mode);
8608
8609   /* See what bits may be nonzero in VAROP.  Unlike the general case of
8610      a call to nonzero_bits, here we don't care about bits outside
8611      MODE.  */
8612
8613   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
8614
8615   /* Turn off all bits in the constant that are known to already be zero.
8616      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
8617      which is tested below.  */
8618
8619   constop &= nonzero;
8620
8621   /* If we don't have any bits left, return zero.  */
8622   if (constop == 0)
8623     return const0_rtx;
8624
8625   /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
8626      a power of two, we can replace this with an ASHIFT.  */
8627   if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
8628       && (i = exact_log2 (constop)) >= 0)
8629     return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
8630
8631   /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
8632      or XOR, then try to apply the distributive law.  This may eliminate
8633      operations if either branch can be simplified because of the AND.
8634      It may also make some cases more complex, but those cases probably
8635      won't match a pattern either with or without this.  */
8636
8637   if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
8638     return
8639       gen_lowpart
8640         (mode,
8641          apply_distributive_law
8642          (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
8643                                simplify_and_const_int (NULL_RTX,
8644                                                        GET_MODE (varop),
8645                                                        XEXP (varop, 0),
8646                                                        constop),
8647                                simplify_and_const_int (NULL_RTX,
8648                                                        GET_MODE (varop),
8649                                                        XEXP (varop, 1),
8650                                                        constop))));
8651
8652   /* If VAROP is PLUS, and the constant is a mask of low bits, distribute
8653      the AND and see if one of the operands simplifies to zero.  If so, we
8654      may eliminate it.  */
8655
8656   if (GET_CODE (varop) == PLUS
8657       && exact_log2 (constop + 1) >= 0)
8658     {
8659       rtx o0, o1;
8660
8661       o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
8662       o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
8663       if (o0 == const0_rtx)
8664         return o1;
8665       if (o1 == const0_rtx)
8666         return o0;
8667     }
8668
8669   /* Make a SUBREG if necessary.  If we can't make it, fail.  */
8670   varop = gen_lowpart (mode, varop);
8671   if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
8672     return NULL_RTX;
8673
8674   /* If we are only masking insignificant bits, return VAROP.  */
8675   if (constop == nonzero)
8676     return varop;
8677
8678   if (varop == orig_varop && constop == orig_constop)
8679     return NULL_RTX;
8680
8681   /* Otherwise, return an AND.  */
8682   return simplify_gen_binary (AND, mode, varop, gen_int_mode (constop, mode));
8683 }
8684
8685
8686 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
8687    in MODE.
8688
8689    Return an equivalent form, if different from X.  Otherwise, return X.  If
8690    X is zero, we are to always construct the equivalent form.  */
8691
8692 static rtx
8693 simplify_and_const_int (rtx x, enum machine_mode mode, rtx varop,
8694                         unsigned HOST_WIDE_INT constop)
8695 {
8696   rtx tem = simplify_and_const_int_1 (mode, varop, constop);
8697   if (tem)
8698     return tem;
8699
8700   if (!x)
8701     x = simplify_gen_binary (AND, GET_MODE (varop), varop,
8702                              gen_int_mode (constop, mode));
8703   if (GET_MODE (x) != mode)
8704     x = gen_lowpart (mode, x);
8705   return x;
8706 }
8707 \f
8708 /* Given a REG, X, compute which bits in X can be nonzero.
8709    We don't care about bits outside of those defined in MODE.
8710
8711    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
8712    a shift, AND, or zero_extract, we can do better.  */
8713
8714 static rtx
8715 reg_nonzero_bits_for_combine (const_rtx x, enum machine_mode mode,
8716                               const_rtx known_x ATTRIBUTE_UNUSED,
8717                               enum machine_mode known_mode ATTRIBUTE_UNUSED,
8718                               unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
8719                               unsigned HOST_WIDE_INT *nonzero)
8720 {
8721   rtx tem;
8722   reg_stat_type *rsp;
8723
8724   /* If X is a register whose nonzero bits value is current, use it.
8725      Otherwise, if X is a register whose value we can find, use that
8726      value.  Otherwise, use the previously-computed global nonzero bits
8727      for this register.  */
8728
8729   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
8730   if (rsp->last_set_value != 0
8731       && (rsp->last_set_mode == mode
8732           || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
8733               && GET_MODE_CLASS (mode) == MODE_INT))
8734       && ((rsp->last_set_label >= label_tick_ebb_start
8735            && rsp->last_set_label < label_tick)
8736           || (rsp->last_set_label == label_tick
8737               && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
8738           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8739               && REG_N_SETS (REGNO (x)) == 1
8740               && !REGNO_REG_SET_P
8741                   (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x)))))
8742     {
8743       *nonzero &= rsp->last_set_nonzero_bits;
8744       return NULL;
8745     }
8746
8747   tem = get_last_value (x);
8748
8749   if (tem)
8750     {
8751 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
8752       /* If X is narrower than MODE and TEM is a non-negative
8753          constant that would appear negative in the mode of X,
8754          sign-extend it for use in reg_nonzero_bits because some
8755          machines (maybe most) will actually do the sign-extension
8756          and this is the conservative approach.
8757
8758          ??? For 2.5, try to tighten up the MD files in this regard
8759          instead of this kludge.  */
8760
8761       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode)
8762           && GET_CODE (tem) == CONST_INT
8763           && INTVAL (tem) > 0
8764           && 0 != (INTVAL (tem)
8765                    & ((HOST_WIDE_INT) 1
8766                       << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
8767         tem = GEN_INT (INTVAL (tem)
8768                        | ((HOST_WIDE_INT) (-1)
8769                           << GET_MODE_BITSIZE (GET_MODE (x))));
8770 #endif
8771       return tem;
8772     }
8773   else if (nonzero_sign_valid && rsp->nonzero_bits)
8774     {
8775       unsigned HOST_WIDE_INT mask = rsp->nonzero_bits;
8776
8777       if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode))
8778         /* We don't know anything about the upper bits.  */
8779         mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
8780       *nonzero &= mask;
8781     }
8782
8783   return NULL;
8784 }
8785
8786 /* Return the number of bits at the high-order end of X that are known to
8787    be equal to the sign bit.  X will be used in mode MODE; if MODE is
8788    VOIDmode, X will be used in its own mode.  The returned value  will always
8789    be between 1 and the number of bits in MODE.  */
8790
8791 static rtx
8792 reg_num_sign_bit_copies_for_combine (const_rtx x, enum machine_mode mode,
8793                                      const_rtx known_x ATTRIBUTE_UNUSED,
8794                                      enum machine_mode known_mode
8795                                      ATTRIBUTE_UNUSED,
8796                                      unsigned int known_ret ATTRIBUTE_UNUSED,
8797                                      unsigned int *result)
8798 {
8799   rtx tem;
8800   reg_stat_type *rsp;
8801
8802   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
8803   if (rsp->last_set_value != 0
8804       && rsp->last_set_mode == mode
8805       && ((rsp->last_set_label >= label_tick_ebb_start
8806            && rsp->last_set_label < label_tick)
8807           || (rsp->last_set_label == label_tick
8808               && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
8809           || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8810               && REG_N_SETS (REGNO (x)) == 1
8811               && !REGNO_REG_SET_P
8812                   (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), REGNO (x)))))
8813     {
8814       *result = rsp->last_set_sign_bit_copies;
8815       return NULL;
8816     }
8817
8818   tem = get_last_value (x);
8819   if (tem != 0)
8820     return tem;
8821
8822   if (nonzero_sign_valid && rsp->sign_bit_copies != 0
8823       && GET_MODE_BITSIZE (GET_MODE (x)) == GET_MODE_BITSIZE (mode))
8824     *result = rsp->sign_bit_copies;
8825
8826   return NULL;
8827 }
8828 \f
8829 /* Return the number of "extended" bits there are in X, when interpreted
8830    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
8831    unsigned quantities, this is the number of high-order zero bits.
8832    For signed quantities, this is the number of copies of the sign bit
8833    minus 1.  In both case, this function returns the number of "spare"
8834    bits.  For example, if two quantities for which this function returns
8835    at least 1 are added, the addition is known not to overflow.
8836
8837    This function will always return 0 unless called during combine, which
8838    implies that it must be called from a define_split.  */
8839
8840 unsigned int
8841 extended_count (const_rtx x, enum machine_mode mode, int unsignedp)
8842 {
8843   if (nonzero_sign_valid == 0)
8844     return 0;
8845
8846   return (unsignedp
8847           ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8848              ? (unsigned int) (GET_MODE_BITSIZE (mode) - 1
8849                                - floor_log2 (nonzero_bits (x, mode)))
8850              : 0)
8851           : num_sign_bit_copies (x, mode) - 1);
8852 }
8853 \f
8854 /* This function is called from `simplify_shift_const' to merge two
8855    outer operations.  Specifically, we have already found that we need
8856    to perform operation *POP0 with constant *PCONST0 at the outermost
8857    position.  We would now like to also perform OP1 with constant CONST1
8858    (with *POP0 being done last).
8859
8860    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
8861    the resulting operation.  *PCOMP_P is set to 1 if we would need to
8862    complement the innermost operand, otherwise it is unchanged.
8863
8864    MODE is the mode in which the operation will be done.  No bits outside
8865    the width of this mode matter.  It is assumed that the width of this mode
8866    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
8867
8868    If *POP0 or OP1 are UNKNOWN, it means no operation is required.  Only NEG, PLUS,
8869    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
8870    result is simply *PCONST0.
8871
8872    If the resulting operation cannot be expressed as one operation, we
8873    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
8874
8875 static int
8876 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)
8877 {
8878   enum rtx_code op0 = *pop0;
8879   HOST_WIDE_INT const0 = *pconst0;
8880
8881   const0 &= GET_MODE_MASK (mode);
8882   const1 &= GET_MODE_MASK (mode);
8883
8884   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
8885   if (op0 == AND)
8886     const1 &= const0;
8887
8888   /* If OP0 or OP1 is UNKNOWN, this is easy.  Similarly if they are the same or
8889      if OP0 is SET.  */
8890
8891   if (op1 == UNKNOWN || op0 == SET)
8892     return 1;
8893
8894   else if (op0 == UNKNOWN)
8895     op0 = op1, const0 = const1;
8896
8897   else if (op0 == op1)
8898     {
8899       switch (op0)
8900         {
8901         case AND:
8902           const0 &= const1;
8903           break;
8904         case IOR:
8905           const0 |= const1;
8906           break;
8907         case XOR:
8908           const0 ^= const1;
8909           break;
8910         case PLUS:
8911           const0 += const1;
8912           break;
8913         case NEG:
8914           op0 = UNKNOWN;
8915           break;
8916         default:
8917           break;
8918         }
8919     }
8920
8921   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
8922   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
8923     return 0;
8924
8925   /* If the two constants aren't the same, we can't do anything.  The
8926      remaining six cases can all be done.  */
8927   else if (const0 != const1)
8928     return 0;
8929
8930   else
8931     switch (op0)
8932       {
8933       case IOR:
8934         if (op1 == AND)
8935           /* (a & b) | b == b */
8936           op0 = SET;
8937         else /* op1 == XOR */
8938           /* (a ^ b) | b == a | b */
8939           {;}
8940         break;
8941
8942       case XOR:
8943         if (op1 == AND)
8944           /* (a & b) ^ b == (~a) & b */
8945           op0 = AND, *pcomp_p = 1;
8946         else /* op1 == IOR */
8947           /* (a | b) ^ b == a & ~b */
8948           op0 = AND, const0 = ~const0;
8949         break;
8950
8951       case AND:
8952         if (op1 == IOR)
8953           /* (a | b) & b == b */
8954         op0 = SET;
8955         else /* op1 == XOR */
8956           /* (a ^ b) & b) == (~a) & b */
8957           *pcomp_p = 1;
8958         break;
8959       default:
8960         break;
8961       }
8962
8963   /* Check for NO-OP cases.  */
8964   const0 &= GET_MODE_MASK (mode);
8965   if (const0 == 0
8966       && (op0 == IOR || op0 == XOR || op0 == PLUS))
8967     op0 = UNKNOWN;
8968   else if (const0 == 0 && op0 == AND)
8969     op0 = SET;
8970   else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
8971            && op0 == AND)
8972     op0 = UNKNOWN;
8973
8974   /* ??? Slightly redundant with the above mask, but not entirely.
8975      Moving this above means we'd have to sign-extend the mode mask
8976      for the final test.  */
8977   const0 = trunc_int_for_mode (const0, mode);
8978
8979   *pop0 = op0;
8980   *pconst0 = const0;
8981
8982   return 1;
8983 }
8984 \f
8985 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
8986    The result of the shift is RESULT_MODE.  Return NULL_RTX if we cannot
8987    simplify it.  Otherwise, return a simplified value.
8988
8989    The shift is normally computed in the widest mode we find in VAROP, as
8990    long as it isn't a different number of words than RESULT_MODE.  Exceptions
8991    are ASHIFTRT and ROTATE, which are always done in their original mode.  */
8992
8993 static rtx
8994 simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode,
8995                         rtx varop, int orig_count)
8996 {
8997   enum rtx_code orig_code = code;
8998   rtx orig_varop = varop;
8999   int count;
9000   enum machine_mode mode = result_mode;
9001   enum machine_mode shift_mode, tmode;
9002   unsigned int mode_words
9003     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
9004   /* We form (outer_op (code varop count) (outer_const)).  */
9005   enum rtx_code outer_op = UNKNOWN;
9006   HOST_WIDE_INT outer_const = 0;
9007   int complement_p = 0;
9008   rtx new_rtx, x;
9009
9010   /* Make sure and truncate the "natural" shift on the way in.  We don't
9011      want to do this inside the loop as it makes it more difficult to
9012      combine shifts.  */
9013   if (SHIFT_COUNT_TRUNCATED)
9014     orig_count &= GET_MODE_BITSIZE (mode) - 1;
9015
9016   /* If we were given an invalid count, don't do anything except exactly
9017      what was requested.  */
9018
9019   if (orig_count < 0 || orig_count >= (int) GET_MODE_BITSIZE (mode))
9020     return NULL_RTX;
9021
9022   count = orig_count;
9023
9024   /* Unless one of the branches of the `if' in this loop does a `continue',
9025      we will `break' the loop after the `if'.  */
9026
9027   while (count != 0)
9028     {
9029       /* If we have an operand of (clobber (const_int 0)), fail.  */
9030       if (GET_CODE (varop) == CLOBBER)
9031         return NULL_RTX;
9032
9033       /* Convert ROTATERT to ROTATE.  */
9034       if (code == ROTATERT)
9035         {
9036           unsigned int bitsize = GET_MODE_BITSIZE (result_mode);;
9037           code = ROTATE;
9038           if (VECTOR_MODE_P (result_mode))
9039             count = bitsize / GET_MODE_NUNITS (result_mode) - count;
9040           else
9041             count = bitsize - count;
9042         }
9043
9044       /* We need to determine what mode we will do the shift in.  If the
9045          shift is a right shift or a ROTATE, we must always do it in the mode
9046          it was originally done in.  Otherwise, we can do it in MODE, the
9047          widest mode encountered.  */
9048       shift_mode
9049         = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9050            ? result_mode : mode);
9051
9052       /* Handle cases where the count is greater than the size of the mode
9053          minus 1.  For ASHIFT, use the size minus one as the count (this can
9054          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
9055          take the count modulo the size.  For other shifts, the result is
9056          zero.
9057
9058          Since these shifts are being produced by the compiler by combining
9059          multiple operations, each of which are defined, we know what the
9060          result is supposed to be.  */
9061
9062       if (count > (GET_MODE_BITSIZE (shift_mode) - 1))
9063         {
9064           if (code == ASHIFTRT)
9065             count = GET_MODE_BITSIZE (shift_mode) - 1;
9066           else if (code == ROTATE || code == ROTATERT)
9067             count %= GET_MODE_BITSIZE (shift_mode);
9068           else
9069             {
9070               /* We can't simply return zero because there may be an
9071                  outer op.  */
9072               varop = const0_rtx;
9073               count = 0;
9074               break;
9075             }
9076         }
9077
9078       /* If we discovered we had to complement VAROP, leave.  Making a NOT
9079          here would cause an infinite loop.  */
9080       if (complement_p)
9081         break;
9082
9083       /* An arithmetic right shift of a quantity known to be -1 or 0
9084          is a no-op.  */
9085       if (code == ASHIFTRT
9086           && (num_sign_bit_copies (varop, shift_mode)
9087               == GET_MODE_BITSIZE (shift_mode)))
9088         {
9089           count = 0;
9090           break;
9091         }
9092
9093       /* If we are doing an arithmetic right shift and discarding all but
9094          the sign bit copies, this is equivalent to doing a shift by the
9095          bitsize minus one.  Convert it into that shift because it will often
9096          allow other simplifications.  */
9097
9098       if (code == ASHIFTRT
9099           && (count + num_sign_bit_copies (varop, shift_mode)
9100               >= GET_MODE_BITSIZE (shift_mode)))
9101         count = GET_MODE_BITSIZE (shift_mode) - 1;
9102
9103       /* We simplify the tests below and elsewhere by converting
9104          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
9105          `make_compound_operation' will convert it to an ASHIFTRT for
9106          those machines (such as VAX) that don't have an LSHIFTRT.  */
9107       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9108           && code == ASHIFTRT
9109           && ((nonzero_bits (varop, shift_mode)
9110                & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
9111               == 0))
9112         code = LSHIFTRT;
9113
9114       if (((code == LSHIFTRT
9115             && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9116             && !(nonzero_bits (varop, shift_mode) >> count))
9117            || (code == ASHIFT
9118                && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
9119                && !((nonzero_bits (varop, shift_mode) << count)
9120                     & GET_MODE_MASK (shift_mode))))
9121           && !side_effects_p (varop))
9122         varop = const0_rtx;
9123
9124       switch (GET_CODE (varop))
9125         {
9126         case SIGN_EXTEND:
9127         case ZERO_EXTEND:
9128         case SIGN_EXTRACT:
9129         case ZERO_EXTRACT:
9130           new_rtx = expand_compound_operation (varop);
9131           if (new_rtx != varop)
9132             {
9133               varop = new_rtx;
9134               continue;
9135             }
9136           break;
9137
9138         case MEM:
9139           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
9140              minus the width of a smaller mode, we can do this with a
9141              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
9142           if ((code == ASHIFTRT || code == LSHIFTRT)
9143               && ! mode_dependent_address_p (XEXP (varop, 0))
9144               && ! MEM_VOLATILE_P (varop)
9145               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9146                                          MODE_INT, 1)) != BLKmode)
9147             {
9148               new_rtx = adjust_address_nv (varop, tmode,
9149                                        BYTES_BIG_ENDIAN ? 0
9150                                        : count / BITS_PER_UNIT);
9151
9152               varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9153                                      : ZERO_EXTEND, mode, new_rtx);
9154               count = 0;
9155               continue;
9156             }
9157           break;
9158
9159         case SUBREG:
9160           /* If VAROP is a SUBREG, strip it as long as the inner operand has
9161              the same number of words as what we've seen so far.  Then store
9162              the widest mode in MODE.  */
9163           if (subreg_lowpart_p (varop)
9164               && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9165                   > GET_MODE_SIZE (GET_MODE (varop)))
9166               && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9167                                   + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
9168                  == mode_words)
9169             {
9170               varop = SUBREG_REG (varop);
9171               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
9172                 mode = GET_MODE (varop);
9173               continue;
9174             }
9175           break;
9176
9177         case MULT:
9178           /* Some machines use MULT instead of ASHIFT because MULT
9179              is cheaper.  But it is still better on those machines to
9180              merge two shifts into one.  */
9181           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9182               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9183             {
9184               varop
9185                 = simplify_gen_binary (ASHIFT, GET_MODE (varop),
9186                                        XEXP (varop, 0),
9187                                        GEN_INT (exact_log2 (
9188                                                 INTVAL (XEXP (varop, 1)))));
9189               continue;
9190             }
9191           break;
9192
9193         case UDIV:
9194           /* Similar, for when divides are cheaper.  */
9195           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9196               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9197             {
9198               varop
9199                 = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
9200                                        XEXP (varop, 0),
9201                                        GEN_INT (exact_log2 (
9202                                                 INTVAL (XEXP (varop, 1)))));
9203               continue;
9204             }
9205           break;
9206
9207         case ASHIFTRT:
9208           /* If we are extracting just the sign bit of an arithmetic
9209              right shift, that shift is not needed.  However, the sign
9210              bit of a wider mode may be different from what would be
9211              interpreted as the sign bit in a narrower mode, so, if
9212              the result is narrower, don't discard the shift.  */
9213           if (code == LSHIFTRT
9214               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9215               && (GET_MODE_BITSIZE (result_mode)
9216                   >= GET_MODE_BITSIZE (GET_MODE (varop))))
9217             {
9218               varop = XEXP (varop, 0);
9219               continue;
9220             }
9221
9222           /* ... fall through ...  */
9223
9224         case LSHIFTRT:
9225         case ASHIFT:
9226         case ROTATE:
9227           /* Here we have two nested shifts.  The result is usually the
9228              AND of a new shift with a mask.  We compute the result below.  */
9229           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9230               && INTVAL (XEXP (varop, 1)) >= 0
9231               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
9232               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9233               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9234               && !VECTOR_MODE_P (result_mode))
9235             {
9236               enum rtx_code first_code = GET_CODE (varop);
9237               unsigned int first_count = INTVAL (XEXP (varop, 1));
9238               unsigned HOST_WIDE_INT mask;
9239               rtx mask_rtx;
9240
9241               /* We have one common special case.  We can't do any merging if
9242                  the inner code is an ASHIFTRT of a smaller mode.  However, if
9243                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
9244                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
9245                  we can convert it to
9246                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
9247                  This simplifies certain SIGN_EXTEND operations.  */
9248               if (code == ASHIFT && first_code == ASHIFTRT
9249                   && count == (GET_MODE_BITSIZE (result_mode)
9250                                - GET_MODE_BITSIZE (GET_MODE (varop))))
9251                 {
9252                   /* C3 has the low-order C1 bits zero.  */
9253
9254                   mask = (GET_MODE_MASK (mode)
9255                           & ~(((HOST_WIDE_INT) 1 << first_count) - 1));
9256
9257                   varop = simplify_and_const_int (NULL_RTX, result_mode,
9258                                                   XEXP (varop, 0), mask);
9259                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
9260                                                 varop, count);
9261                   count = first_count;
9262                   code = ASHIFTRT;
9263                   continue;
9264                 }
9265
9266               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
9267                  than C1 high-order bits equal to the sign bit, we can convert
9268                  this to either an ASHIFT or an ASHIFTRT depending on the
9269                  two counts.
9270
9271                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
9272
9273               if (code == ASHIFTRT && first_code == ASHIFT
9274                   && GET_MODE (varop) == shift_mode
9275                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
9276                       > first_count))
9277                 {
9278                   varop = XEXP (varop, 0);
9279                   count -= first_count;
9280                   if (count < 0)
9281                     {
9282                       count = -count;
9283                       code = ASHIFT;
9284                     }
9285
9286                   continue;
9287                 }
9288
9289               /* There are some cases we can't do.  If CODE is ASHIFTRT,
9290                  we can only do this if FIRST_CODE is also ASHIFTRT.
9291
9292                  We can't do the case when CODE is ROTATE and FIRST_CODE is
9293                  ASHIFTRT.
9294
9295                  If the mode of this shift is not the mode of the outer shift,
9296                  we can't do this if either shift is a right shift or ROTATE.
9297
9298                  Finally, we can't do any of these if the mode is too wide
9299                  unless the codes are the same.
9300
9301                  Handle the case where the shift codes are the same
9302                  first.  */
9303
9304               if (code == first_code)
9305                 {
9306                   if (GET_MODE (varop) != result_mode
9307                       && (code == ASHIFTRT || code == LSHIFTRT
9308                           || code == ROTATE))
9309                     break;
9310
9311                   count += first_count;
9312                   varop = XEXP (varop, 0);
9313                   continue;
9314                 }
9315
9316               if (code == ASHIFTRT
9317                   || (code == ROTATE && first_code == ASHIFTRT)
9318                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
9319                   || (GET_MODE (varop) != result_mode
9320                       && (first_code == ASHIFTRT || first_code == LSHIFTRT
9321                           || first_code == ROTATE
9322                           || code == ROTATE)))
9323                 break;
9324
9325               /* To compute the mask to apply after the shift, shift the
9326                  nonzero bits of the inner shift the same way the
9327                  outer shift will.  */
9328
9329               mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
9330
9331               mask_rtx
9332                 = simplify_const_binary_operation (code, result_mode, mask_rtx,
9333                                                    GEN_INT (count));
9334
9335               /* Give up if we can't compute an outer operation to use.  */
9336               if (mask_rtx == 0
9337                   || GET_CODE (mask_rtx) != CONST_INT
9338                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
9339                                         INTVAL (mask_rtx),
9340                                         result_mode, &complement_p))
9341                 break;
9342
9343               /* If the shifts are in the same direction, we add the
9344                  counts.  Otherwise, we subtract them.  */
9345               if ((code == ASHIFTRT || code == LSHIFTRT)
9346                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
9347                 count += first_count;
9348               else
9349                 count -= first_count;
9350
9351               /* If COUNT is positive, the new shift is usually CODE,
9352                  except for the two exceptions below, in which case it is
9353                  FIRST_CODE.  If the count is negative, FIRST_CODE should
9354                  always be used  */
9355               if (count > 0
9356                   && ((first_code == ROTATE && code == ASHIFT)
9357                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
9358                 code = first_code;
9359               else if (count < 0)
9360                 code = first_code, count = -count;
9361
9362               varop = XEXP (varop, 0);
9363               continue;
9364             }
9365
9366           /* If we have (A << B << C) for any shift, we can convert this to
9367              (A << C << B).  This wins if A is a constant.  Only try this if
9368              B is not a constant.  */
9369
9370           else if (GET_CODE (varop) == code
9371                    && GET_CODE (XEXP (varop, 0)) == CONST_INT
9372                    && GET_CODE (XEXP (varop, 1)) != CONST_INT)
9373             {
9374               rtx new_rtx = simplify_const_binary_operation (code, mode,
9375                                                          XEXP (varop, 0),
9376                                                          GEN_INT (count));
9377               varop = gen_rtx_fmt_ee (code, mode, new_rtx, XEXP (varop, 1));
9378               count = 0;
9379               continue;
9380             }
9381           break;
9382
9383         case NOT:
9384           if (VECTOR_MODE_P (mode))
9385             break;
9386
9387           /* Make this fit the case below.  */
9388           varop = gen_rtx_XOR (mode, XEXP (varop, 0),
9389                                GEN_INT (GET_MODE_MASK (mode)));
9390           continue;
9391
9392         case IOR:
9393         case AND:
9394         case XOR:
9395           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
9396              with C the size of VAROP - 1 and the shift is logical if
9397              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9398              we have an (le X 0) operation.   If we have an arithmetic shift
9399              and STORE_FLAG_VALUE is 1 or we have a logical shift with
9400              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
9401
9402           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
9403               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
9404               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9405               && (code == LSHIFTRT || code == ASHIFTRT)
9406               && count == (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9407               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9408             {
9409               count = 0;
9410               varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
9411                                   const0_rtx);
9412
9413               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9414                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9415
9416               continue;
9417             }
9418
9419           /* If we have (shift (logical)), move the logical to the outside
9420              to allow it to possibly combine with another logical and the
9421              shift to combine with another shift.  This also canonicalizes to
9422              what a ZERO_EXTRACT looks like.  Also, some machines have
9423              (and (shift)) insns.  */
9424
9425           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9426               /* We can't do this if we have (ashiftrt (xor))  and the
9427                  constant has its sign bit set in shift_mode.  */
9428               && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9429                    && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9430                                               shift_mode))
9431               && (new_rtx = simplify_const_binary_operation (code, result_mode,
9432                                                          XEXP (varop, 1),
9433                                                          GEN_INT (count))) != 0
9434               && GET_CODE (new_rtx) == CONST_INT
9435               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
9436                                   INTVAL (new_rtx), result_mode, &complement_p))
9437             {
9438               varop = XEXP (varop, 0);
9439               continue;
9440             }
9441
9442           /* If we can't do that, try to simplify the shift in each arm of the
9443              logical expression, make a new logical expression, and apply
9444              the inverse distributive law.  This also can't be done
9445              for some (ashiftrt (xor)).  */
9446           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9447              && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9448                   && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9449                                              shift_mode)))
9450             {
9451               rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9452                                               XEXP (varop, 0), count);
9453               rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9454                                               XEXP (varop, 1), count);
9455
9456               varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
9457                                            lhs, rhs);
9458               varop = apply_distributive_law (varop);
9459
9460               count = 0;
9461               continue;
9462             }
9463           break;
9464
9465         case EQ:
9466           /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
9467              says that the sign bit can be tested, FOO has mode MODE, C is
9468              GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
9469              that may be nonzero.  */
9470           if (code == LSHIFTRT
9471               && XEXP (varop, 1) == const0_rtx
9472               && GET_MODE (XEXP (varop, 0)) == result_mode
9473               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9474               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9475               && STORE_FLAG_VALUE == -1
9476               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9477               && merge_outer_ops (&outer_op, &outer_const, XOR,
9478                                   (HOST_WIDE_INT) 1, result_mode,
9479                                   &complement_p))
9480             {
9481               varop = XEXP (varop, 0);
9482               count = 0;
9483               continue;
9484             }
9485           break;
9486
9487         case NEG:
9488           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
9489              than the number of bits in the mode is equivalent to A.  */
9490           if (code == LSHIFTRT
9491               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9492               && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
9493             {
9494               varop = XEXP (varop, 0);
9495               count = 0;
9496               continue;
9497             }
9498
9499           /* NEG commutes with ASHIFT since it is multiplication.  Move the
9500              NEG outside to allow shifts to combine.  */
9501           if (code == ASHIFT
9502               && merge_outer_ops (&outer_op, &outer_const, NEG,
9503                                   (HOST_WIDE_INT) 0, result_mode,
9504                                   &complement_p))
9505             {
9506               varop = XEXP (varop, 0);
9507               continue;
9508             }
9509           break;
9510
9511         case PLUS:
9512           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
9513              is one less than the number of bits in the mode is
9514              equivalent to (xor A 1).  */
9515           if (code == LSHIFTRT
9516               && count == (GET_MODE_BITSIZE (result_mode) - 1)
9517               && XEXP (varop, 1) == constm1_rtx
9518               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9519               && merge_outer_ops (&outer_op, &outer_const, XOR,
9520                                   (HOST_WIDE_INT) 1, result_mode,
9521                                   &complement_p))
9522             {
9523               count = 0;
9524               varop = XEXP (varop, 0);
9525               continue;
9526             }
9527
9528           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
9529              that might be nonzero in BAR are those being shifted out and those
9530              bits are known zero in FOO, we can replace the PLUS with FOO.
9531              Similarly in the other operand order.  This code occurs when
9532              we are computing the size of a variable-size array.  */
9533
9534           if ((code == ASHIFTRT || code == LSHIFTRT)
9535               && count < HOST_BITS_PER_WIDE_INT
9536               && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9537               && (nonzero_bits (XEXP (varop, 1), result_mode)
9538                   & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
9539             {
9540               varop = XEXP (varop, 0);
9541               continue;
9542             }
9543           else if ((code == ASHIFTRT || code == LSHIFTRT)
9544                    && count < HOST_BITS_PER_WIDE_INT
9545                    && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9546                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9547                             >> count)
9548                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9549                             & nonzero_bits (XEXP (varop, 1),
9550                                                  result_mode)))
9551             {
9552               varop = XEXP (varop, 1);
9553               continue;
9554             }
9555
9556           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
9557           if (code == ASHIFT
9558               && GET_CODE (XEXP (varop, 1)) == CONST_INT
9559               && (new_rtx = simplify_const_binary_operation (ASHIFT, result_mode,
9560                                                          XEXP (varop, 1),
9561                                                          GEN_INT (count))) != 0
9562               && GET_CODE (new_rtx) == CONST_INT
9563               && merge_outer_ops (&outer_op, &outer_const, PLUS,
9564                                   INTVAL (new_rtx), result_mode, &complement_p))
9565             {
9566               varop = XEXP (varop, 0);
9567               continue;
9568             }
9569
9570           /* Check for 'PLUS signbit', which is the canonical form of 'XOR
9571              signbit', and attempt to change the PLUS to an XOR and move it to
9572              the outer operation as is done above in the AND/IOR/XOR case
9573              leg for shift(logical). See details in logical handling above
9574              for reasoning in doing so.  */
9575           if (code == LSHIFTRT
9576               && GET_CODE (XEXP (varop, 1)) == CONST_INT
9577               && mode_signbit_p (result_mode, XEXP (varop, 1))
9578               && (new_rtx = simplify_const_binary_operation (code, result_mode,
9579                                                          XEXP (varop, 1),
9580                                                          GEN_INT (count))) != 0
9581               && GET_CODE (new_rtx) == CONST_INT
9582               && merge_outer_ops (&outer_op, &outer_const, XOR,
9583                                   INTVAL (new_rtx), result_mode, &complement_p))
9584             {
9585               varop = XEXP (varop, 0);
9586               continue;
9587             }
9588
9589           break;
9590
9591         case MINUS:
9592           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9593              with C the size of VAROP - 1 and the shift is logical if
9594              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9595              we have a (gt X 0) operation.  If the shift is arithmetic with
9596              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9597              we have a (neg (gt X 0)) operation.  */
9598
9599           if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9600               && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
9601               && count == (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9602               && (code == LSHIFTRT || code == ASHIFTRT)
9603               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9604               && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
9605               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9606             {
9607               count = 0;
9608               varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
9609                                   const0_rtx);
9610
9611               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9612                 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9613
9614               continue;
9615             }
9616           break;
9617
9618         case TRUNCATE:
9619           /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
9620              if the truncate does not affect the value.  */
9621           if (code == LSHIFTRT
9622               && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
9623               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9624               && (INTVAL (XEXP (XEXP (varop, 0), 1))
9625                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
9626                       - GET_MODE_BITSIZE (GET_MODE (varop)))))
9627             {
9628               rtx varop_inner = XEXP (varop, 0);
9629
9630               varop_inner
9631                 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
9632                                     XEXP (varop_inner, 0),
9633                                     GEN_INT
9634                                     (count + INTVAL (XEXP (varop_inner, 1))));
9635               varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
9636               count = 0;
9637               continue;
9638             }
9639           break;
9640
9641         default:
9642           break;
9643         }
9644
9645       break;
9646     }
9647
9648   /* We need to determine what mode to do the shift in.  If the shift is
9649      a right shift or ROTATE, we must always do it in the mode it was
9650      originally done in.  Otherwise, we can do it in MODE, the widest mode
9651      encountered.  The code we care about is that of the shift that will
9652      actually be done, not the shift that was originally requested.  */
9653   shift_mode
9654     = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9655        ? result_mode : mode);
9656
9657   /* We have now finished analyzing the shift.  The result should be
9658      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
9659      OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
9660      to the result of the shift.  OUTER_CONST is the relevant constant,
9661      but we must turn off all bits turned off in the shift.  */
9662
9663   if (outer_op == UNKNOWN
9664       && orig_code == code && orig_count == count
9665       && varop == orig_varop
9666       && shift_mode == GET_MODE (varop))
9667     return NULL_RTX;
9668
9669   /* Make a SUBREG if necessary.  If we can't make it, fail.  */
9670   varop = gen_lowpart (shift_mode, varop);
9671   if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
9672     return NULL_RTX;
9673
9674   /* If we have an outer operation and we just made a shift, it is
9675      possible that we could have simplified the shift were it not
9676      for the outer operation.  So try to do the simplification
9677      recursively.  */
9678
9679   if (outer_op != UNKNOWN)
9680     x = simplify_shift_const_1 (code, shift_mode, varop, count);
9681   else
9682     x = NULL_RTX;
9683
9684   if (x == NULL_RTX)
9685     x = simplify_gen_binary (code, shift_mode, varop, GEN_INT (count));
9686
9687   /* If we were doing an LSHIFTRT in a wider mode than it was originally,
9688      turn off all the bits that the shift would have turned off.  */
9689   if (orig_code == LSHIFTRT && result_mode != shift_mode)
9690     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
9691                                 GET_MODE_MASK (result_mode) >> orig_count);
9692
9693   /* Do the remainder of the processing in RESULT_MODE.  */
9694   x = gen_lowpart_or_truncate (result_mode, x);
9695
9696   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
9697      operation.  */
9698   if (complement_p)
9699     x = simplify_gen_unary (NOT, result_mode, x, result_mode);
9700
9701   if (outer_op != UNKNOWN)
9702     {
9703       if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
9704         outer_const = trunc_int_for_mode (outer_const, result_mode);
9705
9706       if (outer_op == AND)
9707         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
9708       else if (outer_op == SET)
9709         {
9710           /* This means that we have determined that the result is
9711              equivalent to a constant.  This should be rare.  */
9712           if (!side_effects_p (x))
9713             x = GEN_INT (outer_const);
9714         }
9715       else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
9716         x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
9717       else
9718         x = simplify_gen_binary (outer_op, result_mode, x,
9719                                  GEN_INT (outer_const));
9720     }
9721
9722   return x;
9723 }
9724
9725 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
9726    The result of the shift is RESULT_MODE.  If we cannot simplify it,
9727    return X or, if it is NULL, synthesize the expression with
9728    simplify_gen_binary.  Otherwise, return a simplified value.
9729
9730    The shift is normally computed in the widest mode we find in VAROP, as
9731    long as it isn't a different number of words than RESULT_MODE.  Exceptions
9732    are ASHIFTRT and ROTATE, which are always done in their original mode.  */
9733
9734 static rtx
9735 simplify_shift_const (rtx x, enum rtx_code code, enum machine_mode result_mode,
9736                       rtx varop, int count)
9737 {
9738   rtx tem = simplify_shift_const_1 (code, result_mode, varop, count);
9739   if (tem)
9740     return tem;
9741
9742   if (!x)
9743     x = simplify_gen_binary (code, GET_MODE (varop), varop, GEN_INT (count));
9744   if (GET_MODE (x) != result_mode)
9745     x = gen_lowpart (result_mode, x);
9746   return x;
9747 }
9748
9749 \f
9750 /* Like recog, but we receive the address of a pointer to a new pattern.
9751    We try to match the rtx that the pointer points to.
9752    If that fails, we may try to modify or replace the pattern,
9753    storing the replacement into the same pointer object.
9754
9755    Modifications include deletion or addition of CLOBBERs.
9756
9757    PNOTES is a pointer to a location where any REG_UNUSED notes added for
9758    the CLOBBERs are placed.
9759
9760    The value is the final insn code from the pattern ultimately matched,
9761    or -1.  */
9762
9763 static int
9764 recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
9765 {
9766   rtx pat = *pnewpat;
9767   int insn_code_number;
9768   int num_clobbers_to_add = 0;
9769   int i;
9770   rtx notes = 0;
9771   rtx old_notes, old_pat;
9772
9773   /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
9774      we use to indicate that something didn't match.  If we find such a
9775      thing, force rejection.  */
9776   if (GET_CODE (pat) == PARALLEL)
9777     for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
9778       if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
9779           && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
9780         return -1;
9781
9782   old_pat = PATTERN (insn);
9783   old_notes = REG_NOTES (insn);
9784   PATTERN (insn) = pat;
9785   REG_NOTES (insn) = 0;
9786
9787   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9788   if (dump_file && (dump_flags & TDF_DETAILS))
9789     {
9790       if (insn_code_number < 0)
9791         fputs ("Failed to match this instruction:\n", dump_file);
9792       else
9793         fputs ("Successfully matched this instruction:\n", dump_file);
9794       print_rtl_single (dump_file, pat);
9795     }
9796
9797   /* If it isn't, there is the possibility that we previously had an insn
9798      that clobbered some register as a side effect, but the combined
9799      insn doesn't need to do that.  So try once more without the clobbers
9800      unless this represents an ASM insn.  */
9801
9802   if (insn_code_number < 0 && ! check_asm_operands (pat)
9803       && GET_CODE (pat) == PARALLEL)
9804     {
9805       int pos;
9806
9807       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
9808         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
9809           {
9810             if (i != pos)
9811               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
9812             pos++;
9813           }
9814
9815       SUBST_INT (XVECLEN (pat, 0), pos);
9816
9817       if (pos == 1)
9818         pat = XVECEXP (pat, 0, 0);
9819
9820       PATTERN (insn) = pat;
9821       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9822       if (dump_file && (dump_flags & TDF_DETAILS))
9823         {
9824           if (insn_code_number < 0)
9825             fputs ("Failed to match this instruction:\n", dump_file);
9826           else
9827             fputs ("Successfully matched this instruction:\n", dump_file);
9828           print_rtl_single (dump_file, pat);
9829         }
9830     }
9831   PATTERN (insn) = old_pat;
9832   REG_NOTES (insn) = old_notes;
9833
9834   /* Recognize all noop sets, these will be killed by followup pass.  */
9835   if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
9836     insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
9837
9838   /* If we had any clobbers to add, make a new pattern than contains
9839      them.  Then check to make sure that all of them are dead.  */
9840   if (num_clobbers_to_add)
9841     {
9842       rtx newpat = gen_rtx_PARALLEL (VOIDmode,
9843                                      rtvec_alloc (GET_CODE (pat) == PARALLEL
9844                                                   ? (XVECLEN (pat, 0)
9845                                                      + num_clobbers_to_add)
9846                                                   : num_clobbers_to_add + 1));
9847
9848       if (GET_CODE (pat) == PARALLEL)
9849         for (i = 0; i < XVECLEN (pat, 0); i++)
9850           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
9851       else
9852         XVECEXP (newpat, 0, 0) = pat;
9853
9854       add_clobbers (newpat, insn_code_number);
9855
9856       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
9857            i < XVECLEN (newpat, 0); i++)
9858         {
9859           if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
9860               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
9861             return -1;
9862           if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) != SCRATCH) 
9863             {
9864               gcc_assert (REG_P (XEXP (XVECEXP (newpat, 0, i), 0)));
9865               notes = gen_rtx_EXPR_LIST (REG_UNUSED,
9866                                          XEXP (XVECEXP (newpat, 0, i), 0), notes);
9867             }
9868         }
9869       pat = newpat;
9870     }
9871
9872   *pnewpat = pat;
9873   *pnotes = notes;
9874
9875   return insn_code_number;
9876 }
9877 \f
9878 /* Like gen_lowpart_general but for use by combine.  In combine it
9879    is not possible to create any new pseudoregs.  However, it is
9880    safe to create invalid memory addresses, because combine will
9881    try to recognize them and all they will do is make the combine
9882    attempt fail.
9883
9884    If for some reason this cannot do its job, an rtx
9885    (clobber (const_int 0)) is returned.
9886    An insn containing that will not be recognized.  */
9887
9888 static rtx
9889 gen_lowpart_for_combine (enum machine_mode omode, rtx x)
9890 {
9891   enum machine_mode imode = GET_MODE (x);
9892   unsigned int osize = GET_MODE_SIZE (omode);
9893   unsigned int isize = GET_MODE_SIZE (imode);
9894   rtx result;
9895
9896   if (omode == imode)
9897     return x;
9898
9899   /* Return identity if this is a CONST or symbolic reference.  */
9900   if (omode == Pmode
9901       && (GET_CODE (x) == CONST
9902           || GET_CODE (x) == SYMBOL_REF
9903           || GET_CODE (x) == LABEL_REF))
9904     return x;
9905
9906   /* We can only support MODE being wider than a word if X is a
9907      constant integer or has a mode the same size.  */
9908   if (GET_MODE_SIZE (omode) > UNITS_PER_WORD
9909       && ! ((imode == VOIDmode
9910              && (GET_CODE (x) == CONST_INT
9911                  || GET_CODE (x) == CONST_DOUBLE))
9912             || isize == osize))
9913     goto fail;
9914
9915   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
9916      won't know what to do.  So we will strip off the SUBREG here and
9917      process normally.  */
9918   if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
9919     {
9920       x = SUBREG_REG (x);
9921
9922       /* For use in case we fall down into the address adjustments
9923          further below, we need to adjust the known mode and size of
9924          x; imode and isize, since we just adjusted x.  */
9925       imode = GET_MODE (x);
9926
9927       if (imode == omode)
9928         return x;
9929
9930       isize = GET_MODE_SIZE (imode);
9931     }
9932
9933   result = gen_lowpart_common (omode, x);
9934
9935   if (result)
9936     return result;
9937
9938   if (MEM_P (x))
9939     {
9940       int offset = 0;
9941
9942       /* Refuse to work on a volatile memory ref or one with a mode-dependent
9943          address.  */
9944       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
9945         goto fail;
9946
9947       /* If we want to refer to something bigger than the original memref,
9948          generate a paradoxical subreg instead.  That will force a reload
9949          of the original memref X.  */
9950       if (isize < osize)
9951         return gen_rtx_SUBREG (omode, x, 0);
9952
9953       if (WORDS_BIG_ENDIAN)
9954         offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
9955
9956       /* Adjust the address so that the address-after-the-data is
9957          unchanged.  */
9958       if (BYTES_BIG_ENDIAN)
9959         offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
9960
9961       return adjust_address_nv (x, omode, offset);
9962     }
9963
9964   /* If X is a comparison operator, rewrite it in a new mode.  This
9965      probably won't match, but may allow further simplifications.  */
9966   else if (COMPARISON_P (x))
9967     return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
9968
9969   /* If we couldn't simplify X any other way, just enclose it in a
9970      SUBREG.  Normally, this SUBREG won't match, but some patterns may
9971      include an explicit SUBREG or we may simplify it further in combine.  */
9972   else
9973     {
9974       int offset = 0;
9975       rtx res;
9976
9977       offset = subreg_lowpart_offset (omode, imode);
9978       if (imode == VOIDmode)
9979         {
9980           imode = int_mode_for_mode (omode);
9981           x = gen_lowpart_common (imode, x);
9982           if (x == NULL)
9983             goto fail;
9984         }
9985       res = simplify_gen_subreg (omode, x, imode, offset);
9986       if (res)
9987         return res;
9988     }
9989
9990  fail:
9991   return gen_rtx_CLOBBER (omode, const0_rtx);
9992 }
9993 \f
9994 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
9995    comparison code that will be tested.
9996
9997    The result is a possibly different comparison code to use.  *POP0 and
9998    *POP1 may be updated.
9999
10000    It is possible that we might detect that a comparison is either always
10001    true or always false.  However, we do not perform general constant
10002    folding in combine, so this knowledge isn't useful.  Such tautologies
10003    should have been detected earlier.  Hence we ignore all such cases.  */
10004
10005 static enum rtx_code
10006 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
10007 {
10008   rtx op0 = *pop0;
10009   rtx op1 = *pop1;
10010   rtx tem, tem1;
10011   int i;
10012   enum machine_mode mode, tmode;
10013
10014   /* Try a few ways of applying the same transformation to both operands.  */
10015   while (1)
10016     {
10017 #ifndef WORD_REGISTER_OPERATIONS
10018       /* The test below this one won't handle SIGN_EXTENDs on these machines,
10019          so check specially.  */
10020       if (code != GTU && code != GEU && code != LTU && code != LEU
10021           && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
10022           && GET_CODE (XEXP (op0, 0)) == ASHIFT
10023           && GET_CODE (XEXP (op1, 0)) == ASHIFT
10024           && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
10025           && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
10026           && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
10027               == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
10028           && GET_CODE (XEXP (op0, 1)) == CONST_INT
10029           && XEXP (op0, 1) == XEXP (op1, 1)
10030           && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10031           && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
10032           && (INTVAL (XEXP (op0, 1))
10033               == (GET_MODE_BITSIZE (GET_MODE (op0))
10034                   - (GET_MODE_BITSIZE
10035                      (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
10036         {
10037           op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
10038           op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
10039         }
10040 #endif
10041
10042       /* If both operands are the same constant shift, see if we can ignore the
10043          shift.  We can if the shift is a rotate or if the bits shifted out of
10044          this shift are known to be zero for both inputs and if the type of
10045          comparison is compatible with the shift.  */
10046       if (GET_CODE (op0) == GET_CODE (op1)
10047           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10048           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
10049               || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
10050                   && (code != GT && code != LT && code != GE && code != LE))
10051               || (GET_CODE (op0) == ASHIFTRT
10052                   && (code != GTU && code != LTU
10053                       && code != GEU && code != LEU)))
10054           && GET_CODE (XEXP (op0, 1)) == CONST_INT
10055           && INTVAL (XEXP (op0, 1)) >= 0
10056           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10057           && XEXP (op0, 1) == XEXP (op1, 1))
10058         {
10059           enum machine_mode mode = GET_MODE (op0);
10060           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10061           int shift_count = INTVAL (XEXP (op0, 1));
10062
10063           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
10064             mask &= (mask >> shift_count) << shift_count;
10065           else if (GET_CODE (op0) == ASHIFT)
10066             mask = (mask & (mask << shift_count)) >> shift_count;
10067
10068           if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
10069               && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
10070             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
10071           else
10072             break;
10073         }
10074
10075       /* If both operands are AND's of a paradoxical SUBREG by constant, the
10076          SUBREGs are of the same mode, and, in both cases, the AND would
10077          be redundant if the comparison was done in the narrower mode,
10078          do the comparison in the narrower mode (e.g., we are AND'ing with 1
10079          and the operand's possibly nonzero bits are 0xffffff01; in that case
10080          if we only care about QImode, we don't need the AND).  This case
10081          occurs if the output mode of an scc insn is not SImode and
10082          STORE_FLAG_VALUE == 1 (e.g., the 386).
10083
10084          Similarly, check for a case where the AND's are ZERO_EXTEND
10085          operations from some narrower mode even though a SUBREG is not
10086          present.  */
10087
10088       else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
10089                && GET_CODE (XEXP (op0, 1)) == CONST_INT
10090                && GET_CODE (XEXP (op1, 1)) == CONST_INT)
10091         {
10092           rtx inner_op0 = XEXP (op0, 0);
10093           rtx inner_op1 = XEXP (op1, 0);
10094           HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
10095           HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
10096           int changed = 0;
10097
10098           if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
10099               && (GET_MODE_SIZE (GET_MODE (inner_op0))
10100                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
10101               && (GET_MODE (SUBREG_REG (inner_op0))
10102                   == GET_MODE (SUBREG_REG (inner_op1)))
10103               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
10104                   <= HOST_BITS_PER_WIDE_INT)
10105               && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
10106                                              GET_MODE (SUBREG_REG (inner_op0)))))
10107               && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
10108                                              GET_MODE (SUBREG_REG (inner_op1))))))
10109             {
10110               op0 = SUBREG_REG (inner_op0);
10111               op1 = SUBREG_REG (inner_op1);
10112
10113               /* The resulting comparison is always unsigned since we masked
10114                  off the original sign bit.  */
10115               code = unsigned_condition (code);
10116
10117               changed = 1;
10118             }
10119
10120           else if (c0 == c1)
10121             for (tmode = GET_CLASS_NARROWEST_MODE
10122                  (GET_MODE_CLASS (GET_MODE (op0)));
10123                  tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
10124               if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
10125                 {
10126                   op0 = gen_lowpart (tmode, inner_op0);
10127                   op1 = gen_lowpart (tmode, inner_op1);
10128                   code = unsigned_condition (code);
10129                   changed = 1;
10130                   break;
10131                 }
10132
10133           if (! changed)
10134             break;
10135         }
10136
10137       /* If both operands are NOT, we can strip off the outer operation
10138          and adjust the comparison code for swapped operands; similarly for
10139          NEG, except that this must be an equality comparison.  */
10140       else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
10141                || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
10142                    && (code == EQ || code == NE)))
10143         op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
10144
10145       else
10146         break;
10147     }
10148
10149   /* If the first operand is a constant, swap the operands and adjust the
10150      comparison code appropriately, but don't do this if the second operand
10151      is already a constant integer.  */
10152   if (swap_commutative_operands_p (op0, op1))
10153     {
10154       tem = op0, op0 = op1, op1 = tem;
10155       code = swap_condition (code);
10156     }
10157
10158   /* We now enter a loop during which we will try to simplify the comparison.
10159      For the most part, we only are concerned with comparisons with zero,
10160      but some things may really be comparisons with zero but not start
10161      out looking that way.  */
10162
10163   while (GET_CODE (op1) == CONST_INT)
10164     {
10165       enum machine_mode mode = GET_MODE (op0);
10166       unsigned int mode_width = GET_MODE_BITSIZE (mode);
10167       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
10168       int equality_comparison_p;
10169       int sign_bit_comparison_p;
10170       int unsigned_comparison_p;
10171       HOST_WIDE_INT const_op;
10172
10173       /* We only want to handle integral modes.  This catches VOIDmode,
10174          CCmode, and the floating-point modes.  An exception is that we
10175          can handle VOIDmode if OP0 is a COMPARE or a comparison
10176          operation.  */
10177
10178       if (GET_MODE_CLASS (mode) != MODE_INT
10179           && ! (mode == VOIDmode
10180                 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
10181         break;
10182
10183       /* Get the constant we are comparing against and turn off all bits
10184          not on in our mode.  */
10185       const_op = INTVAL (op1);
10186       if (mode != VOIDmode)
10187         const_op = trunc_int_for_mode (const_op, mode);
10188       op1 = GEN_INT (const_op);
10189
10190       /* If we are comparing against a constant power of two and the value
10191          being compared can only have that single bit nonzero (e.g., it was
10192          `and'ed with that bit), we can replace this with a comparison
10193          with zero.  */
10194       if (const_op
10195           && (code == EQ || code == NE || code == GE || code == GEU
10196               || code == LT || code == LTU)
10197           && mode_width <= HOST_BITS_PER_WIDE_INT
10198           && exact_log2 (const_op) >= 0
10199           && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
10200         {
10201           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
10202           op1 = const0_rtx, const_op = 0;
10203         }
10204
10205       /* Similarly, if we are comparing a value known to be either -1 or
10206          0 with -1, change it to the opposite comparison against zero.  */
10207
10208       if (const_op == -1
10209           && (code == EQ || code == NE || code == GT || code == LE
10210               || code == GEU || code == LTU)
10211           && num_sign_bit_copies (op0, mode) == mode_width)
10212         {
10213           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
10214           op1 = const0_rtx, const_op = 0;
10215         }
10216
10217       /* Do some canonicalizations based on the comparison code.  We prefer
10218          comparisons against zero and then prefer equality comparisons.
10219          If we can reduce the size of a constant, we will do that too.  */
10220
10221       switch (code)
10222         {
10223         case LT:
10224           /* < C is equivalent to <= (C - 1) */
10225           if (const_op > 0)
10226             {
10227               const_op -= 1;
10228               op1 = GEN_INT (const_op);
10229               code = LE;
10230               /* ... fall through to LE case below.  */
10231             }
10232           else
10233             break;
10234
10235         case LE:
10236           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
10237           if (const_op < 0)
10238             {
10239               const_op += 1;
10240               op1 = GEN_INT (const_op);
10241               code = LT;
10242             }
10243
10244           /* If we are doing a <= 0 comparison on a value known to have
10245              a zero sign bit, we can replace this with == 0.  */
10246           else if (const_op == 0
10247                    && mode_width <= HOST_BITS_PER_WIDE_INT
10248                    && (nonzero_bits (op0, mode)
10249                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10250             code = EQ;
10251           break;
10252
10253         case GE:
10254           /* >= C is equivalent to > (C - 1).  */
10255           if (const_op > 0)
10256             {
10257               const_op -= 1;
10258               op1 = GEN_INT (const_op);
10259               code = GT;
10260               /* ... fall through to GT below.  */
10261             }
10262           else
10263             break;
10264
10265         case GT:
10266           /* > C is equivalent to >= (C + 1); we do this for C < 0.  */
10267           if (const_op < 0)
10268             {
10269               const_op += 1;
10270               op1 = GEN_INT (const_op);
10271               code = GE;
10272             }
10273
10274           /* If we are doing a > 0 comparison on a value known to have
10275              a zero sign bit, we can replace this with != 0.  */
10276           else if (const_op == 0
10277                    && mode_width <= HOST_BITS_PER_WIDE_INT
10278                    && (nonzero_bits (op0, mode)
10279                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
10280             code = NE;
10281           break;
10282
10283         case LTU:
10284           /* < C is equivalent to <= (C - 1).  */
10285           if (const_op > 0)
10286             {
10287               const_op -= 1;
10288               op1 = GEN_INT (const_op);
10289               code = LEU;
10290               /* ... fall through ...  */
10291             }
10292
10293           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
10294           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10295                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10296             {
10297               const_op = 0, op1 = const0_rtx;
10298               code = GE;
10299               break;
10300             }
10301           else
10302             break;
10303
10304         case LEU:
10305           /* unsigned <= 0 is equivalent to == 0 */
10306           if (const_op == 0)
10307             code = EQ;
10308
10309           /* (unsigned) <= 0x7fffffff is equivalent to >= 0.  */
10310           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10311                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10312             {
10313               const_op = 0, op1 = const0_rtx;
10314               code = GE;
10315             }
10316           break;
10317
10318         case GEU:
10319           /* >= C is equivalent to > (C - 1).  */
10320           if (const_op > 1)
10321             {
10322               const_op -= 1;
10323               op1 = GEN_INT (const_op);
10324               code = GTU;
10325               /* ... fall through ...  */
10326             }
10327
10328           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
10329           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10330                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10331             {
10332               const_op = 0, op1 = const0_rtx;
10333               code = LT;
10334               break;
10335             }
10336           else
10337             break;
10338
10339         case GTU:
10340           /* unsigned > 0 is equivalent to != 0 */
10341           if (const_op == 0)
10342             code = NE;
10343
10344           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
10345           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10346                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10347             {
10348               const_op = 0, op1 = const0_rtx;
10349               code = LT;
10350             }
10351           break;
10352
10353         default:
10354           break;
10355         }
10356
10357       /* Compute some predicates to simplify code below.  */
10358
10359       equality_comparison_p = (code == EQ || code == NE);
10360       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
10361       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
10362                                || code == GEU);
10363
10364       /* If this is a sign bit comparison and we can do arithmetic in
10365          MODE, say that we will only be needing the sign bit of OP0.  */
10366       if (sign_bit_comparison_p
10367           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10368         op0 = force_to_mode (op0, mode,
10369                              ((HOST_WIDE_INT) 1
10370                               << (GET_MODE_BITSIZE (mode) - 1)),
10371                              0);
10372
10373       /* Now try cases based on the opcode of OP0.  If none of the cases
10374          does a "continue", we exit this loop immediately after the
10375          switch.  */
10376
10377       switch (GET_CODE (op0))
10378         {
10379         case ZERO_EXTRACT:
10380           /* If we are extracting a single bit from a variable position in
10381              a constant that has only a single bit set and are comparing it
10382              with zero, we can convert this into an equality comparison
10383              between the position and the location of the single bit.  */
10384           /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
10385              have already reduced the shift count modulo the word size.  */
10386           if (!SHIFT_COUNT_TRUNCATED
10387               && GET_CODE (XEXP (op0, 0)) == CONST_INT
10388               && XEXP (op0, 1) == const1_rtx
10389               && equality_comparison_p && const_op == 0
10390               && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
10391             {
10392               if (BITS_BIG_ENDIAN)
10393                 {
10394                   enum machine_mode new_mode
10395                     = mode_for_extraction (EP_extzv, 1);
10396                   if (new_mode == MAX_MACHINE_MODE)
10397                     i = BITS_PER_WORD - 1 - i;
10398                   else
10399                     {
10400                       mode = new_mode;
10401                       i = (GET_MODE_BITSIZE (mode) - 1 - i);
10402                     }
10403                 }
10404
10405               op0 = XEXP (op0, 2);
10406               op1 = GEN_INT (i);
10407               const_op = i;
10408
10409               /* Result is nonzero iff shift count is equal to I.  */
10410               code = reverse_condition (code);
10411               continue;
10412             }
10413
10414           /* ... fall through ...  */
10415
10416         case SIGN_EXTRACT:
10417           tem = expand_compound_operation (op0);
10418           if (tem != op0)
10419             {
10420               op0 = tem;
10421               continue;
10422             }
10423           break;
10424
10425         case NOT:
10426           /* If testing for equality, we can take the NOT of the constant.  */
10427           if (equality_comparison_p
10428               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
10429             {
10430               op0 = XEXP (op0, 0);
10431               op1 = tem;
10432               continue;
10433             }
10434
10435           /* If just looking at the sign bit, reverse the sense of the
10436              comparison.  */
10437           if (sign_bit_comparison_p)
10438             {
10439               op0 = XEXP (op0, 0);
10440               code = (code == GE ? LT : GE);
10441               continue;
10442             }
10443           break;
10444
10445         case NEG:
10446           /* If testing for equality, we can take the NEG of the constant.  */
10447           if (equality_comparison_p
10448               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
10449             {
10450               op0 = XEXP (op0, 0);
10451               op1 = tem;
10452               continue;
10453             }
10454
10455           /* The remaining cases only apply to comparisons with zero.  */
10456           if (const_op != 0)
10457             break;
10458
10459           /* When X is ABS or is known positive,
10460              (neg X) is < 0 if and only if X != 0.  */
10461
10462           if (sign_bit_comparison_p
10463               && (GET_CODE (XEXP (op0, 0)) == ABS
10464                   || (mode_width <= HOST_BITS_PER_WIDE_INT
10465                       && (nonzero_bits (XEXP (op0, 0), mode)
10466                           & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
10467             {
10468               op0 = XEXP (op0, 0);
10469               code = (code == LT ? NE : EQ);
10470               continue;
10471             }
10472
10473           /* If we have NEG of something whose two high-order bits are the
10474              same, we know that "(-a) < 0" is equivalent to "a > 0".  */
10475           if (num_sign_bit_copies (op0, mode) >= 2)
10476             {
10477               op0 = XEXP (op0, 0);
10478               code = swap_condition (code);
10479               continue;
10480             }
10481           break;
10482
10483         case ROTATE:
10484           /* If we are testing equality and our count is a constant, we
10485              can perform the inverse operation on our RHS.  */
10486           if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10487               && (tem = simplify_binary_operation (ROTATERT, mode,
10488                                                    op1, XEXP (op0, 1))) != 0)
10489             {
10490               op0 = XEXP (op0, 0);
10491               op1 = tem;
10492               continue;
10493             }
10494
10495           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10496              a particular bit.  Convert it to an AND of a constant of that
10497              bit.  This will be converted into a ZERO_EXTRACT.  */
10498           if (const_op == 0 && sign_bit_comparison_p
10499               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10500               && mode_width <= HOST_BITS_PER_WIDE_INT)
10501             {
10502               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10503                                             ((HOST_WIDE_INT) 1
10504                                              << (mode_width - 1
10505                                                  - INTVAL (XEXP (op0, 1)))));
10506               code = (code == LT ? NE : EQ);
10507               continue;
10508             }
10509
10510           /* Fall through.  */
10511
10512         case ABS:
10513           /* ABS is ignorable inside an equality comparison with zero.  */
10514           if (const_op == 0 && equality_comparison_p)
10515             {
10516               op0 = XEXP (op0, 0);
10517               continue;
10518             }
10519           break;
10520
10521         case SIGN_EXTEND:
10522           /* Can simplify (compare (zero/sign_extend FOO) CONST) to
10523              (compare FOO CONST) if CONST fits in FOO's mode and we
10524              are either testing inequality or have an unsigned
10525              comparison with ZERO_EXTEND or a signed comparison with
10526              SIGN_EXTEND.  But don't do it if we don't have a compare
10527              insn of the given mode, since we'd have to revert it
10528              later on, and then we wouldn't know whether to sign- or
10529              zero-extend.  */
10530           mode = GET_MODE (XEXP (op0, 0));
10531           if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10532               && ! unsigned_comparison_p
10533               && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10534               && ((unsigned HOST_WIDE_INT) const_op
10535                   < (((unsigned HOST_WIDE_INT) 1
10536                       << (GET_MODE_BITSIZE (mode) - 1))))
10537               && have_insn_for (COMPARE, mode))
10538             {
10539               op0 = XEXP (op0, 0);
10540               continue;
10541             }
10542           break;
10543
10544         case SUBREG:
10545           /* Check for the case where we are comparing A - C1 with C2, that is
10546
10547                (subreg:MODE (plus (A) (-C1))) op (C2)
10548
10549              with C1 a constant, and try to lift the SUBREG, i.e. to do the
10550              comparison in the wider mode.  One of the following two conditions
10551              must be true in order for this to be valid:
10552
10553                1. The mode extension results in the same bit pattern being added
10554                   on both sides and the comparison is equality or unsigned.  As
10555                   C2 has been truncated to fit in MODE, the pattern can only be
10556                   all 0s or all 1s.
10557
10558                2. The mode extension results in the sign bit being copied on
10559                   each side.
10560
10561              The difficulty here is that we have predicates for A but not for
10562              (A - C1) so we need to check that C1 is within proper bounds so
10563              as to perturbate A as little as possible.  */
10564
10565           if (mode_width <= HOST_BITS_PER_WIDE_INT
10566               && subreg_lowpart_p (op0)
10567               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) > mode_width
10568               && GET_CODE (SUBREG_REG (op0)) == PLUS
10569               && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT)
10570             {
10571               enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
10572               rtx a = XEXP (SUBREG_REG (op0), 0);
10573               HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
10574
10575               if ((c1 > 0
10576                    && (unsigned HOST_WIDE_INT) c1
10577                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)
10578                    && (equality_comparison_p || unsigned_comparison_p)
10579                    /* (A - C1) zero-extends if it is positive and sign-extends
10580                       if it is negative, C2 both zero- and sign-extends.  */
10581                    && ((0 == (nonzero_bits (a, inner_mode)
10582                               & ~GET_MODE_MASK (mode))
10583                         && const_op >= 0)
10584                        /* (A - C1) sign-extends if it is positive and 1-extends
10585                           if it is negative, C2 both sign- and 1-extends.  */
10586                        || (num_sign_bit_copies (a, inner_mode)
10587                            > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10588                                              - mode_width)
10589                            && const_op < 0)))
10590                   || ((unsigned HOST_WIDE_INT) c1
10591                        < (unsigned HOST_WIDE_INT) 1 << (mode_width - 2)
10592                       /* (A - C1) always sign-extends, like C2.  */
10593                       && num_sign_bit_copies (a, inner_mode)
10594                          > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10595                                            - (mode_width - 1))))
10596                 {
10597                   op0 = SUBREG_REG (op0);
10598                   continue;
10599                 }
10600             }
10601
10602           /* If the inner mode is narrower and we are extracting the low part,
10603              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
10604           if (subreg_lowpart_p (op0)
10605               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10606             /* Fall through */ ;
10607           else
10608             break;
10609
10610           /* ... fall through ...  */
10611
10612         case ZERO_EXTEND:
10613           mode = GET_MODE (XEXP (op0, 0));
10614           if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10615               && (unsigned_comparison_p || equality_comparison_p)
10616               && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10617               && ((unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode))
10618               && have_insn_for (COMPARE, mode))
10619             {
10620               op0 = XEXP (op0, 0);
10621               continue;
10622             }
10623           break;
10624
10625         case PLUS:
10626           /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
10627              this for equality comparisons due to pathological cases involving
10628              overflows.  */
10629           if (equality_comparison_p
10630               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10631                                                         op1, XEXP (op0, 1))))
10632             {
10633               op0 = XEXP (op0, 0);
10634               op1 = tem;
10635               continue;
10636             }
10637
10638           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
10639           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
10640               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
10641             {
10642               op0 = XEXP (XEXP (op0, 0), 0);
10643               code = (code == LT ? EQ : NE);
10644               continue;
10645             }
10646           break;
10647
10648         case MINUS:
10649           /* We used to optimize signed comparisons against zero, but that
10650              was incorrect.  Unsigned comparisons against zero (GTU, LEU)
10651              arrive here as equality comparisons, or (GEU, LTU) are
10652              optimized away.  No need to special-case them.  */
10653
10654           /* (eq (minus A B) C) -> (eq A (plus B C)) or
10655              (eq B (minus A C)), whichever simplifies.  We can only do
10656              this for equality comparisons due to pathological cases involving
10657              overflows.  */
10658           if (equality_comparison_p
10659               && 0 != (tem = simplify_binary_operation (PLUS, mode,
10660                                                         XEXP (op0, 1), op1)))
10661             {
10662               op0 = XEXP (op0, 0);
10663               op1 = tem;
10664               continue;
10665             }
10666
10667           if (equality_comparison_p
10668               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10669                                                         XEXP (op0, 0), op1)))
10670             {
10671               op0 = XEXP (op0, 1);
10672               op1 = tem;
10673               continue;
10674             }
10675
10676           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
10677              of bits in X minus 1, is one iff X > 0.  */
10678           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
10679               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10680               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (op0, 0), 1))
10681                  == mode_width - 1
10682               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10683             {
10684               op0 = XEXP (op0, 1);
10685               code = (code == GE ? LE : GT);
10686               continue;
10687             }
10688           break;
10689
10690         case XOR:
10691           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
10692              if C is zero or B is a constant.  */
10693           if (equality_comparison_p
10694               && 0 != (tem = simplify_binary_operation (XOR, mode,
10695                                                         XEXP (op0, 1), op1)))
10696             {
10697               op0 = XEXP (op0, 0);
10698               op1 = tem;
10699               continue;
10700             }
10701           break;
10702
10703         case EQ:  case NE:
10704         case UNEQ:  case LTGT:
10705         case LT:  case LTU:  case UNLT:  case LE:  case LEU:  case UNLE:
10706         case GT:  case GTU:  case UNGT:  case GE:  case GEU:  case UNGE:
10707         case UNORDERED: case ORDERED:
10708           /* We can't do anything if OP0 is a condition code value, rather
10709              than an actual data value.  */
10710           if (const_op != 0
10711               || CC0_P (XEXP (op0, 0))
10712               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
10713             break;
10714
10715           /* Get the two operands being compared.  */
10716           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
10717             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
10718           else
10719             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
10720
10721           /* Check for the cases where we simply want the result of the
10722              earlier test or the opposite of that result.  */
10723           if (code == NE || code == EQ
10724               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10725                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10726                   && (STORE_FLAG_VALUE
10727                       & (((HOST_WIDE_INT) 1
10728                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
10729                   && (code == LT || code == GE)))
10730             {
10731               enum rtx_code new_code;
10732               if (code == LT || code == NE)
10733                 new_code = GET_CODE (op0);
10734               else
10735                 new_code = reversed_comparison_code (op0, NULL);
10736
10737               if (new_code != UNKNOWN)
10738                 {
10739                   code = new_code;
10740                   op0 = tem;
10741                   op1 = tem1;
10742                   continue;
10743                 }
10744             }
10745           break;
10746
10747         case IOR:
10748           /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
10749              iff X <= 0.  */
10750           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
10751               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
10752               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10753             {
10754               op0 = XEXP (op0, 1);
10755               code = (code == GE ? GT : LE);
10756               continue;
10757             }
10758           break;
10759
10760         case AND:
10761           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
10762              will be converted to a ZERO_EXTRACT later.  */
10763           if (const_op == 0 && equality_comparison_p
10764               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10765               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
10766             {
10767               op0 = simplify_and_const_int
10768                 (NULL_RTX, mode, gen_rtx_LSHIFTRT (mode,
10769                                                    XEXP (op0, 1),
10770                                                    XEXP (XEXP (op0, 0), 1)),
10771                  (HOST_WIDE_INT) 1);
10772               continue;
10773             }
10774
10775           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
10776              zero and X is a comparison and C1 and C2 describe only bits set
10777              in STORE_FLAG_VALUE, we can compare with X.  */
10778           if (const_op == 0 && equality_comparison_p
10779               && mode_width <= HOST_BITS_PER_WIDE_INT
10780               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10781               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10782               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10783               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
10784               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
10785             {
10786               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10787                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
10788               if ((~STORE_FLAG_VALUE & mask) == 0
10789                   && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
10790                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
10791                           && COMPARISON_P (tem))))
10792                 {
10793                   op0 = XEXP (XEXP (op0, 0), 0);
10794                   continue;
10795                 }
10796             }
10797
10798           /* If we are doing an equality comparison of an AND of a bit equal
10799              to the sign bit, replace this with a LT or GE comparison of
10800              the underlying value.  */
10801           if (equality_comparison_p
10802               && const_op == 0
10803               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10804               && mode_width <= HOST_BITS_PER_WIDE_INT
10805               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10806                   == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10807             {
10808               op0 = XEXP (op0, 0);
10809               code = (code == EQ ? GE : LT);
10810               continue;
10811             }
10812
10813           /* If this AND operation is really a ZERO_EXTEND from a narrower
10814              mode, the constant fits within that mode, and this is either an
10815              equality or unsigned comparison, try to do this comparison in
10816              the narrower mode.
10817
10818              Note that in:
10819
10820              (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
10821              -> (ne:DI (reg:SI 4) (const_int 0))
10822
10823              unless TRULY_NOOP_TRUNCATION allows it or the register is
10824              known to hold a value of the required mode the
10825              transformation is invalid.  */
10826           if ((equality_comparison_p || unsigned_comparison_p)
10827               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10828               && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
10829                                    & GET_MODE_MASK (mode))
10830                                   + 1)) >= 0
10831               && const_op >> i == 0
10832               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode
10833               && (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode),
10834                                          GET_MODE_BITSIZE (GET_MODE (op0)))
10835                   || (REG_P (XEXP (op0, 0))
10836                       && reg_truncated_to_mode (tmode, XEXP (op0, 0)))))
10837             {
10838               op0 = gen_lowpart (tmode, XEXP (op0, 0));
10839               continue;
10840             }
10841
10842           /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1
10843              fits in both M1 and M2 and the SUBREG is either paradoxical
10844              or represents the low part, permute the SUBREG and the AND
10845              and try again.  */
10846           if (GET_CODE (XEXP (op0, 0)) == SUBREG)
10847             {
10848               unsigned HOST_WIDE_INT c1;
10849               tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0)));
10850               /* Require an integral mode, to avoid creating something like
10851                  (AND:SF ...).  */
10852               if (SCALAR_INT_MODE_P (tmode)
10853                   /* It is unsafe to commute the AND into the SUBREG if the
10854                      SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
10855                      not defined.  As originally written the upper bits
10856                      have a defined value due to the AND operation.
10857                      However, if we commute the AND inside the SUBREG then
10858                      they no longer have defined values and the meaning of
10859                      the code has been changed.  */
10860                   && (0
10861 #ifdef WORD_REGISTER_OPERATIONS
10862                       || (mode_width > GET_MODE_BITSIZE (tmode)
10863                           && mode_width <= BITS_PER_WORD)
10864 #endif
10865                       || (mode_width <= GET_MODE_BITSIZE (tmode)
10866                           && subreg_lowpart_p (XEXP (op0, 0))))
10867                   && GET_CODE (XEXP (op0, 1)) == CONST_INT
10868                   && mode_width <= HOST_BITS_PER_WIDE_INT
10869                   && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
10870                   && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0
10871                   && (c1 & ~GET_MODE_MASK (tmode)) == 0
10872                   && c1 != mask
10873                   && c1 != GET_MODE_MASK (tmode))
10874                 {
10875                   op0 = simplify_gen_binary (AND, tmode,
10876                                              SUBREG_REG (XEXP (op0, 0)),
10877                                              gen_int_mode (c1, tmode));
10878                   op0 = gen_lowpart (mode, op0);
10879                   continue;
10880                 }
10881             }
10882
10883           /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0).  */
10884           if (const_op == 0 && equality_comparison_p
10885               && XEXP (op0, 1) == const1_rtx
10886               && GET_CODE (XEXP (op0, 0)) == NOT)
10887             {
10888               op0 = simplify_and_const_int
10889                 (NULL_RTX, mode, XEXP (XEXP (op0, 0), 0), (HOST_WIDE_INT) 1);
10890               code = (code == NE ? EQ : NE);
10891               continue;
10892             }
10893
10894           /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
10895              (eq (and (lshiftrt X) 1) 0).
10896              Also handle the case where (not X) is expressed using xor.  */
10897           if (const_op == 0 && equality_comparison_p
10898               && XEXP (op0, 1) == const1_rtx
10899               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
10900             {
10901               rtx shift_op = XEXP (XEXP (op0, 0), 0);
10902               rtx shift_count = XEXP (XEXP (op0, 0), 1);
10903
10904               if (GET_CODE (shift_op) == NOT
10905                   || (GET_CODE (shift_op) == XOR
10906                       && GET_CODE (XEXP (shift_op, 1)) == CONST_INT
10907                       && GET_CODE (shift_count) == CONST_INT
10908                       && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
10909                       && (INTVAL (XEXP (shift_op, 1))
10910                           == (HOST_WIDE_INT) 1 << INTVAL (shift_count))))
10911                 {
10912                   op0 = simplify_and_const_int
10913                     (NULL_RTX, mode,
10914                      gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count),
10915                      (HOST_WIDE_INT) 1);
10916                   code = (code == NE ? EQ : NE);
10917                   continue;
10918                 }
10919             }
10920           break;
10921
10922         case ASHIFT:
10923           /* If we have (compare (ashift FOO N) (const_int C)) and
10924              the high order N bits of FOO (N+1 if an inequality comparison)
10925              are known to be zero, we can do this by comparing FOO with C
10926              shifted right N bits so long as the low-order N bits of C are
10927              zero.  */
10928           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10929               && INTVAL (XEXP (op0, 1)) >= 0
10930               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
10931                   < HOST_BITS_PER_WIDE_INT)
10932               && ((const_op
10933                    & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
10934               && mode_width <= HOST_BITS_PER_WIDE_INT
10935               && (nonzero_bits (XEXP (op0, 0), mode)
10936                   & ~(mask >> (INTVAL (XEXP (op0, 1))
10937                                + ! equality_comparison_p))) == 0)
10938             {
10939               /* We must perform a logical shift, not an arithmetic one,
10940                  as we want the top N bits of C to be zero.  */
10941               unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
10942
10943               temp >>= INTVAL (XEXP (op0, 1));
10944               op1 = gen_int_mode (temp, mode);
10945               op0 = XEXP (op0, 0);
10946               continue;
10947             }
10948
10949           /* If we are doing a sign bit comparison, it means we are testing
10950              a particular bit.  Convert it to the appropriate AND.  */
10951           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10952               && mode_width <= HOST_BITS_PER_WIDE_INT)
10953             {
10954               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10955                                             ((HOST_WIDE_INT) 1
10956                                              << (mode_width - 1
10957                                                  - INTVAL (XEXP (op0, 1)))));
10958               code = (code == LT ? NE : EQ);
10959               continue;
10960             }
10961
10962           /* If this an equality comparison with zero and we are shifting
10963              the low bit to the sign bit, we can convert this to an AND of the
10964              low-order bit.  */
10965           if (const_op == 0 && equality_comparison_p
10966               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10967               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
10968                  == mode_width - 1)
10969             {
10970               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10971                                             (HOST_WIDE_INT) 1);
10972               continue;
10973             }
10974           break;
10975
10976         case ASHIFTRT:
10977           /* If this is an equality comparison with zero, we can do this
10978              as a logical shift, which might be much simpler.  */
10979           if (equality_comparison_p && const_op == 0
10980               && GET_CODE (XEXP (op0, 1)) == CONST_INT)
10981             {
10982               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
10983                                           XEXP (op0, 0),
10984                                           INTVAL (XEXP (op0, 1)));
10985               continue;
10986             }
10987
10988           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
10989              do the comparison in a narrower mode.  */
10990           if (! unsigned_comparison_p
10991               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10992               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10993               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10994               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10995                                          MODE_INT, 1)) != BLKmode
10996               && (((unsigned HOST_WIDE_INT) const_op
10997                    + (GET_MODE_MASK (tmode) >> 1) + 1)
10998                   <= GET_MODE_MASK (tmode)))
10999             {
11000               op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
11001               continue;
11002             }
11003
11004           /* Likewise if OP0 is a PLUS of a sign extension with a
11005              constant, which is usually represented with the PLUS
11006              between the shifts.  */
11007           if (! unsigned_comparison_p
11008               && GET_CODE (XEXP (op0, 1)) == CONST_INT
11009               && GET_CODE (XEXP (op0, 0)) == PLUS
11010               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
11011               && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
11012               && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
11013               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11014                                          MODE_INT, 1)) != BLKmode
11015               && (((unsigned HOST_WIDE_INT) const_op
11016                    + (GET_MODE_MASK (tmode) >> 1) + 1)
11017                   <= GET_MODE_MASK (tmode)))
11018             {
11019               rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
11020               rtx add_const = XEXP (XEXP (op0, 0), 1);
11021               rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
11022                                                    add_const, XEXP (op0, 1));
11023
11024               op0 = simplify_gen_binary (PLUS, tmode,
11025                                          gen_lowpart (tmode, inner),
11026                                          new_const);
11027               continue;
11028             }
11029
11030           /* ... fall through ...  */
11031         case LSHIFTRT:
11032           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
11033              the low order N bits of FOO are known to be zero, we can do this
11034              by comparing FOO with C shifted left N bits so long as no
11035              overflow occurs.  */
11036           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
11037               && INTVAL (XEXP (op0, 1)) >= 0
11038               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
11039               && mode_width <= HOST_BITS_PER_WIDE_INT
11040               && (nonzero_bits (XEXP (op0, 0), mode)
11041                   & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
11042               && (((unsigned HOST_WIDE_INT) const_op
11043                    + (GET_CODE (op0) != LSHIFTRT
11044                       ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
11045                          + 1)
11046                       : 0))
11047                   <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
11048             {
11049               /* If the shift was logical, then we must make the condition
11050                  unsigned.  */
11051               if (GET_CODE (op0) == LSHIFTRT)
11052                 code = unsigned_condition (code);
11053
11054               const_op <<= INTVAL (XEXP (op0, 1));
11055               op1 = GEN_INT (const_op);
11056               op0 = XEXP (op0, 0);
11057               continue;
11058             }
11059
11060           /* If we are using this shift to extract just the sign bit, we
11061              can replace this with an LT or GE comparison.  */
11062           if (const_op == 0
11063               && (equality_comparison_p || sign_bit_comparison_p)
11064               && GET_CODE (XEXP (op0, 1)) == CONST_INT
11065               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
11066                  == mode_width - 1)
11067             {
11068               op0 = XEXP (op0, 0);
11069               code = (code == NE || code == GT ? LT : GE);
11070               continue;
11071             }
11072           break;
11073
11074         default:
11075           break;
11076         }
11077
11078       break;
11079     }
11080
11081   /* Now make any compound operations involved in this comparison.  Then,
11082      check for an outmost SUBREG on OP0 that is not doing anything or is
11083      paradoxical.  The latter transformation must only be performed when
11084      it is known that the "extra" bits will be the same in op0 and op1 or
11085      that they don't matter.  There are three cases to consider:
11086
11087      1. SUBREG_REG (op0) is a register.  In this case the bits are don't
11088      care bits and we can assume they have any convenient value.  So
11089      making the transformation is safe.
11090
11091      2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
11092      In this case the upper bits of op0 are undefined.  We should not make
11093      the simplification in that case as we do not know the contents of
11094      those bits.
11095
11096      3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
11097      UNKNOWN.  In that case we know those bits are zeros or ones.  We must
11098      also be sure that they are the same as the upper bits of op1.
11099
11100      We can never remove a SUBREG for a non-equality comparison because
11101      the sign bit is in a different place in the underlying object.  */
11102
11103   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
11104   op1 = make_compound_operation (op1, SET);
11105
11106   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
11107       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11108       && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
11109       && (code == NE || code == EQ))
11110     {
11111       if (GET_MODE_SIZE (GET_MODE (op0))
11112           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
11113         {
11114           /* For paradoxical subregs, allow case 1 as above.  Case 3 isn't
11115              implemented.  */
11116           if (REG_P (SUBREG_REG (op0)))
11117             {
11118               op0 = SUBREG_REG (op0);
11119               op1 = gen_lowpart (GET_MODE (op0), op1);
11120             }
11121         }
11122       else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
11123                 <= HOST_BITS_PER_WIDE_INT)
11124                && (nonzero_bits (SUBREG_REG (op0),
11125                                  GET_MODE (SUBREG_REG (op0)))
11126                    & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11127         {
11128           tem = gen_lowpart (GET_MODE (SUBREG_REG (op0)), op1);
11129
11130           if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
11131                & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11132             op0 = SUBREG_REG (op0), op1 = tem;
11133         }
11134     }
11135
11136   /* We now do the opposite procedure: Some machines don't have compare
11137      insns in all modes.  If OP0's mode is an integer mode smaller than a
11138      word and we can't do a compare in that mode, see if there is a larger
11139      mode for which we can do the compare.  There are a number of cases in
11140      which we can use the wider mode.  */
11141
11142   mode = GET_MODE (op0);
11143   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11144       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
11145       && ! have_insn_for (COMPARE, mode))
11146     for (tmode = GET_MODE_WIDER_MODE (mode);
11147          (tmode != VOIDmode
11148           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
11149          tmode = GET_MODE_WIDER_MODE (tmode))
11150       if (have_insn_for (COMPARE, tmode))
11151         {
11152           int zero_extended;
11153
11154           /* If the only nonzero bits in OP0 and OP1 are those in the
11155              narrower mode and this is an equality or unsigned comparison,
11156              we can use the wider mode.  Similarly for sign-extended
11157              values, in which case it is true for all comparisons.  */
11158           zero_extended = ((code == EQ || code == NE
11159                             || code == GEU || code == GTU
11160                             || code == LEU || code == LTU)
11161                            && (nonzero_bits (op0, tmode)
11162                                & ~GET_MODE_MASK (mode)) == 0
11163                            && ((GET_CODE (op1) == CONST_INT
11164                                 || (nonzero_bits (op1, tmode)
11165                                     & ~GET_MODE_MASK (mode)) == 0)));
11166
11167           if (zero_extended
11168               || ((num_sign_bit_copies (op0, tmode)
11169                    > (unsigned int) (GET_MODE_BITSIZE (tmode)
11170                                      - GET_MODE_BITSIZE (mode)))
11171                   && (num_sign_bit_copies (op1, tmode)
11172                       > (unsigned int) (GET_MODE_BITSIZE (tmode)
11173                                         - GET_MODE_BITSIZE (mode)))))
11174             {
11175               /* If OP0 is an AND and we don't have an AND in MODE either,
11176                  make a new AND in the proper mode.  */
11177               if (GET_CODE (op0) == AND
11178                   && !have_insn_for (AND, mode))
11179                 op0 = simplify_gen_binary (AND, tmode,
11180                                            gen_lowpart (tmode,
11181                                                         XEXP (op0, 0)),
11182                                            gen_lowpart (tmode,
11183                                                         XEXP (op0, 1)));
11184
11185               op0 = gen_lowpart (tmode, op0);
11186               if (zero_extended && GET_CODE (op1) == CONST_INT)
11187                 op1 = GEN_INT (INTVAL (op1) & GET_MODE_MASK (mode));
11188               op1 = gen_lowpart (tmode, op1);
11189               break;
11190             }
11191
11192           /* If this is a test for negative, we can make an explicit
11193              test of the sign bit.  */
11194
11195           if (op1 == const0_rtx && (code == LT || code == GE)
11196               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11197             {
11198               op0 = simplify_gen_binary (AND, tmode,
11199                                          gen_lowpart (tmode, op0),
11200                                          GEN_INT ((HOST_WIDE_INT) 1
11201                                                   << (GET_MODE_BITSIZE (mode)
11202                                                       - 1)));
11203               code = (code == LT) ? NE : EQ;
11204               break;
11205             }
11206         }
11207
11208 #ifdef CANONICALIZE_COMPARISON
11209   /* If this machine only supports a subset of valid comparisons, see if we
11210      can convert an unsupported one into a supported one.  */
11211   CANONICALIZE_COMPARISON (code, op0, op1);
11212 #endif
11213
11214   *pop0 = op0;
11215   *pop1 = op1;
11216
11217   return code;
11218 }
11219 \f
11220 /* Utility function for record_value_for_reg.  Count number of
11221    rtxs in X.  */
11222 static int
11223 count_rtxs (rtx x)
11224 {
11225   enum rtx_code code = GET_CODE (x);
11226   const char *fmt;
11227   int i, j, ret = 1;
11228
11229   if (GET_RTX_CLASS (code) == '2'
11230       || GET_RTX_CLASS (code) == 'c')
11231     {
11232       rtx x0 = XEXP (x, 0);
11233       rtx x1 = XEXP (x, 1);
11234
11235       if (x0 == x1)
11236         return 1 + 2 * count_rtxs (x0);
11237
11238       if ((GET_RTX_CLASS (GET_CODE (x1)) == '2'
11239            || GET_RTX_CLASS (GET_CODE (x1)) == 'c')
11240           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11241         return 2 + 2 * count_rtxs (x0)
11242                + count_rtxs (x == XEXP (x1, 0)
11243                              ? XEXP (x1, 1) : XEXP (x1, 0));
11244
11245       if ((GET_RTX_CLASS (GET_CODE (x0)) == '2'
11246            || GET_RTX_CLASS (GET_CODE (x0)) == 'c')
11247           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11248         return 2 + 2 * count_rtxs (x1)
11249                + count_rtxs (x == XEXP (x0, 0)
11250                              ? XEXP (x0, 1) : XEXP (x0, 0));
11251     }
11252
11253   fmt = GET_RTX_FORMAT (code);
11254   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11255     if (fmt[i] == 'e')
11256       ret += count_rtxs (XEXP (x, i));
11257     else if (fmt[i] == 'E')
11258       for (j = 0; j < XVECLEN (x, i); j++)
11259         ret += count_rtxs (XVECEXP (x, i, j));
11260
11261   return ret;
11262 }
11263 \f
11264 /* Utility function for following routine.  Called when X is part of a value
11265    being stored into last_set_value.  Sets last_set_table_tick
11266    for each register mentioned.  Similar to mention_regs in cse.c  */
11267
11268 static void
11269 update_table_tick (rtx x)
11270 {
11271   enum rtx_code code = GET_CODE (x);
11272   const char *fmt = GET_RTX_FORMAT (code);
11273   int i, j;
11274
11275   if (code == REG)
11276     {
11277       unsigned int regno = REGNO (x);
11278       unsigned int endregno = END_REGNO (x);
11279       unsigned int r;
11280
11281       for (r = regno; r < endregno; r++)
11282         {
11283           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, r);
11284           rsp->last_set_table_tick = label_tick;
11285         }
11286
11287       return;
11288     }
11289
11290   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11291     if (fmt[i] == 'e')
11292       {
11293         /* Check for identical subexpressions.  If x contains
11294            identical subexpression we only have to traverse one of
11295            them.  */
11296         if (i == 0 && ARITHMETIC_P (x))
11297           {
11298             /* Note that at this point x1 has already been
11299                processed.  */
11300             rtx x0 = XEXP (x, 0);
11301             rtx x1 = XEXP (x, 1);
11302
11303             /* If x0 and x1 are identical then there is no need to
11304                process x0.  */
11305             if (x0 == x1)
11306               break;
11307
11308             /* If x0 is identical to a subexpression of x1 then while
11309                processing x1, x0 has already been processed.  Thus we
11310                are done with x.  */
11311             if (ARITHMETIC_P (x1)
11312                 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11313               break;
11314
11315             /* If x1 is identical to a subexpression of x0 then we
11316                still have to process the rest of x0.  */
11317             if (ARITHMETIC_P (x0)
11318                 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11319               {
11320                 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
11321                 break;
11322               }
11323           }
11324
11325         update_table_tick (XEXP (x, i));
11326       }
11327     else if (fmt[i] == 'E')
11328       for (j = 0; j < XVECLEN (x, i); j++)
11329         update_table_tick (XVECEXP (x, i, j));
11330 }
11331
11332 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
11333    are saying that the register is clobbered and we no longer know its
11334    value.  If INSN is zero, don't update reg_stat[].last_set; this is
11335    only permitted with VALUE also zero and is used to invalidate the
11336    register.  */
11337
11338 static void
11339 record_value_for_reg (rtx reg, rtx insn, rtx value)
11340 {
11341   unsigned int regno = REGNO (reg);
11342   unsigned int endregno = END_REGNO (reg);
11343   unsigned int i;
11344   reg_stat_type *rsp;
11345
11346   /* If VALUE contains REG and we have a previous value for REG, substitute
11347      the previous value.  */
11348   if (value && insn && reg_overlap_mentioned_p (reg, value))
11349     {
11350       rtx tem;
11351
11352       /* Set things up so get_last_value is allowed to see anything set up to
11353          our insn.  */
11354       subst_low_luid = DF_INSN_LUID (insn);
11355       tem = get_last_value (reg);
11356
11357       /* If TEM is simply a binary operation with two CLOBBERs as operands,
11358          it isn't going to be useful and will take a lot of time to process,
11359          so just use the CLOBBER.  */
11360
11361       if (tem)
11362         {
11363           if (ARITHMETIC_P (tem)
11364               && GET_CODE (XEXP (tem, 0)) == CLOBBER
11365               && GET_CODE (XEXP (tem, 1)) == CLOBBER)
11366             tem = XEXP (tem, 0);
11367           else if (count_occurrences (value, reg, 1) >= 2)
11368             {
11369               /* If there are two or more occurrences of REG in VALUE,
11370                  prevent the value from growing too much.  */
11371               if (count_rtxs (tem) > MAX_LAST_VALUE_RTL)
11372                 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
11373             }
11374
11375           value = replace_rtx (copy_rtx (value), reg, tem);
11376         }
11377     }
11378
11379   /* For each register modified, show we don't know its value, that
11380      we don't know about its bitwise content, that its value has been
11381      updated, and that we don't know the location of the death of the
11382      register.  */
11383   for (i = regno; i < endregno; i++)
11384     {
11385       rsp = VEC_index (reg_stat_type, reg_stat, i);
11386
11387       if (insn)
11388         rsp->last_set = insn;
11389
11390       rsp->last_set_value = 0;
11391       rsp->last_set_mode = 0;
11392       rsp->last_set_nonzero_bits = 0;
11393       rsp->last_set_sign_bit_copies = 0;
11394       rsp->last_death = 0;
11395       rsp->truncated_to_mode = 0;
11396     }
11397
11398   /* Mark registers that are being referenced in this value.  */
11399   if (value)
11400     update_table_tick (value);
11401
11402   /* Now update the status of each register being set.
11403      If someone is using this register in this block, set this register
11404      to invalid since we will get confused between the two lives in this
11405      basic block.  This makes using this register always invalid.  In cse, we
11406      scan the table to invalidate all entries using this register, but this
11407      is too much work for us.  */
11408
11409   for (i = regno; i < endregno; i++)
11410     {
11411       rsp = VEC_index (reg_stat_type, reg_stat, i);
11412       rsp->last_set_label = label_tick;
11413       if (!insn
11414           || (value && rsp->last_set_table_tick >= label_tick_ebb_start))
11415         rsp->last_set_invalid = 1;
11416       else
11417         rsp->last_set_invalid = 0;
11418     }
11419
11420   /* The value being assigned might refer to X (like in "x++;").  In that
11421      case, we must replace it with (clobber (const_int 0)) to prevent
11422      infinite loops.  */
11423   rsp = VEC_index (reg_stat_type, reg_stat, regno);
11424   if (value && ! get_last_value_validate (&value, insn,
11425                                           rsp->last_set_label, 0))
11426     {
11427       value = copy_rtx (value);
11428       if (! get_last_value_validate (&value, insn,
11429                                      rsp->last_set_label, 1))
11430         value = 0;
11431     }
11432
11433   /* For the main register being modified, update the value, the mode, the
11434      nonzero bits, and the number of sign bit copies.  */
11435
11436   rsp->last_set_value = value;
11437
11438   if (value)
11439     {
11440       enum machine_mode mode = GET_MODE (reg);
11441       subst_low_luid = DF_INSN_LUID (insn);
11442       rsp->last_set_mode = mode;
11443       if (GET_MODE_CLASS (mode) == MODE_INT
11444           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11445         mode = nonzero_bits_mode;
11446       rsp->last_set_nonzero_bits = nonzero_bits (value, mode);
11447       rsp->last_set_sign_bit_copies
11448         = num_sign_bit_copies (value, GET_MODE (reg));
11449     }
11450 }
11451
11452 /* Called via note_stores from record_dead_and_set_regs to handle one
11453    SET or CLOBBER in an insn.  DATA is the instruction in which the
11454    set is occurring.  */
11455
11456 static void
11457 record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data)
11458 {
11459   rtx record_dead_insn = (rtx) data;
11460
11461   if (GET_CODE (dest) == SUBREG)
11462     dest = SUBREG_REG (dest);
11463
11464   if (!record_dead_insn)
11465     {
11466       if (REG_P (dest))
11467         record_value_for_reg (dest, NULL_RTX, NULL_RTX);
11468       return;
11469     }
11470
11471   if (REG_P (dest))
11472     {
11473       /* If we are setting the whole register, we know its value.  Otherwise
11474          show that we don't know the value.  We can handle SUBREG in
11475          some cases.  */
11476       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
11477         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
11478       else if (GET_CODE (setter) == SET
11479                && GET_CODE (SET_DEST (setter)) == SUBREG
11480                && SUBREG_REG (SET_DEST (setter)) == dest
11481                && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
11482                && subreg_lowpart_p (SET_DEST (setter)))
11483         record_value_for_reg (dest, record_dead_insn,
11484                               gen_lowpart (GET_MODE (dest),
11485                                                        SET_SRC (setter)));
11486       else
11487         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
11488     }
11489   else if (MEM_P (dest)
11490            /* Ignore pushes, they clobber nothing.  */
11491            && ! push_operand (dest, GET_MODE (dest)))
11492     mem_last_set = DF_INSN_LUID (record_dead_insn);
11493 }
11494
11495 /* Update the records of when each REG was most recently set or killed
11496    for the things done by INSN.  This is the last thing done in processing
11497    INSN in the combiner loop.
11498
11499    We update reg_stat[], in particular fields last_set, last_set_value,
11500    last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
11501    last_death, and also the similar information mem_last_set (which insn
11502    most recently modified memory) and last_call_luid (which insn was the
11503    most recent subroutine call).  */
11504
11505 static void
11506 record_dead_and_set_regs (rtx insn)
11507 {
11508   rtx link;
11509   unsigned int i;
11510
11511   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
11512     {
11513       if (REG_NOTE_KIND (link) == REG_DEAD
11514           && REG_P (XEXP (link, 0)))
11515         {
11516           unsigned int regno = REGNO (XEXP (link, 0));
11517           unsigned int endregno = END_REGNO (XEXP (link, 0));
11518
11519           for (i = regno; i < endregno; i++)
11520             {
11521               reg_stat_type *rsp;
11522
11523               rsp = VEC_index (reg_stat_type, reg_stat, i);
11524               rsp->last_death = insn;
11525             }
11526         }
11527       else if (REG_NOTE_KIND (link) == REG_INC)
11528         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
11529     }
11530
11531   if (CALL_P (insn))
11532     {
11533       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
11534         if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
11535           {
11536             reg_stat_type *rsp;
11537
11538             rsp = VEC_index (reg_stat_type, reg_stat, i);
11539             rsp->last_set_invalid = 1;
11540             rsp->last_set = insn;
11541             rsp->last_set_value = 0;
11542             rsp->last_set_mode = 0;
11543             rsp->last_set_nonzero_bits = 0;
11544             rsp->last_set_sign_bit_copies = 0;
11545             rsp->last_death = 0;
11546             rsp->truncated_to_mode = 0;
11547           }
11548
11549       last_call_luid = mem_last_set = DF_INSN_LUID (insn);
11550
11551       /* We can't combine into a call pattern.  Remember, though, that
11552          the return value register is set at this LUID.  We could
11553          still replace a register with the return value from the
11554          wrong subroutine call!  */
11555       note_stores (PATTERN (insn), record_dead_and_set_regs_1, NULL_RTX);
11556     }
11557   else
11558     note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
11559 }
11560
11561 /* If a SUBREG has the promoted bit set, it is in fact a property of the
11562    register present in the SUBREG, so for each such SUBREG go back and
11563    adjust nonzero and sign bit information of the registers that are
11564    known to have some zero/sign bits set.
11565
11566    This is needed because when combine blows the SUBREGs away, the
11567    information on zero/sign bits is lost and further combines can be
11568    missed because of that.  */
11569
11570 static void
11571 record_promoted_value (rtx insn, rtx subreg)
11572 {
11573   rtx links, set;
11574   unsigned int regno = REGNO (SUBREG_REG (subreg));
11575   enum machine_mode mode = GET_MODE (subreg);
11576
11577   if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
11578     return;
11579
11580   for (links = LOG_LINKS (insn); links;)
11581     {
11582       reg_stat_type *rsp;
11583
11584       insn = XEXP (links, 0);
11585       set = single_set (insn);
11586
11587       if (! set || !REG_P (SET_DEST (set))
11588           || REGNO (SET_DEST (set)) != regno
11589           || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
11590         {
11591           links = XEXP (links, 1);
11592           continue;
11593         }
11594
11595       rsp = VEC_index (reg_stat_type, reg_stat, regno);
11596       if (rsp->last_set == insn)
11597         {
11598           if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
11599             rsp->last_set_nonzero_bits &= GET_MODE_MASK (mode);
11600         }
11601
11602       if (REG_P (SET_SRC (set)))
11603         {
11604           regno = REGNO (SET_SRC (set));
11605           links = LOG_LINKS (insn);
11606         }
11607       else
11608         break;
11609     }
11610 }
11611
11612 /* Check if X, a register, is known to contain a value already
11613    truncated to MODE.  In this case we can use a subreg to refer to
11614    the truncated value even though in the generic case we would need
11615    an explicit truncation.  */
11616
11617 static bool
11618 reg_truncated_to_mode (enum machine_mode mode, const_rtx x)
11619 {
11620   reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
11621   enum machine_mode truncated = rsp->truncated_to_mode;
11622
11623   if (truncated == 0
11624       || rsp->truncation_label < label_tick_ebb_start)
11625     return false;
11626   if (GET_MODE_SIZE (truncated) <= GET_MODE_SIZE (mode))
11627     return true;
11628   if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
11629                              GET_MODE_BITSIZE (truncated)))
11630     return true;
11631   return false;
11632 }
11633
11634 /* Callback for for_each_rtx.  If *P is a hard reg or a subreg record the mode
11635    that the register is accessed in.  For non-TRULY_NOOP_TRUNCATION targets we
11636    might be able to turn a truncate into a subreg using this information.
11637    Return -1 if traversing *P is complete or 0 otherwise.  */
11638
11639 static int
11640 record_truncated_value (rtx *p, void *data ATTRIBUTE_UNUSED)
11641 {
11642   rtx x = *p;
11643   enum machine_mode truncated_mode;
11644   reg_stat_type *rsp;
11645
11646   if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x)))
11647     {
11648       enum machine_mode original_mode = GET_MODE (SUBREG_REG (x));
11649       truncated_mode = GET_MODE (x);
11650
11651       if (GET_MODE_SIZE (original_mode) <= GET_MODE_SIZE (truncated_mode))
11652         return -1;
11653
11654       if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (truncated_mode),
11655                                  GET_MODE_BITSIZE (original_mode)))
11656         return -1;
11657
11658       x = SUBREG_REG (x);
11659     }
11660   /* ??? For hard-regs we now record everything.  We might be able to
11661      optimize this using last_set_mode.  */
11662   else if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
11663     truncated_mode = GET_MODE (x);
11664   else
11665     return 0;
11666
11667   rsp = VEC_index (reg_stat_type, reg_stat, REGNO (x));
11668   if (rsp->truncated_to_mode == 0
11669       || rsp->truncation_label < label_tick_ebb_start
11670       || (GET_MODE_SIZE (truncated_mode)
11671           < GET_MODE_SIZE (rsp->truncated_to_mode)))
11672     {
11673       rsp->truncated_to_mode = truncated_mode;
11674       rsp->truncation_label = label_tick;
11675     }
11676
11677   return -1;
11678 }
11679
11680 /* Callback for note_uses.  Find hardregs and subregs of pseudos and
11681    the modes they are used in.  This can help truning TRUNCATEs into
11682    SUBREGs.  */
11683
11684 static void
11685 record_truncated_values (rtx *x, void *data ATTRIBUTE_UNUSED)
11686 {
11687   for_each_rtx (x, record_truncated_value, NULL);
11688 }
11689
11690 /* Scan X for promoted SUBREGs.  For each one found,
11691    note what it implies to the registers used in it.  */
11692
11693 static void
11694 check_promoted_subreg (rtx insn, rtx x)
11695 {
11696   if (GET_CODE (x) == SUBREG
11697       && SUBREG_PROMOTED_VAR_P (x)
11698       && REG_P (SUBREG_REG (x)))
11699     record_promoted_value (insn, x);
11700   else
11701     {
11702       const char *format = GET_RTX_FORMAT (GET_CODE (x));
11703       int i, j;
11704
11705       for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
11706         switch (format[i])
11707           {
11708           case 'e':
11709             check_promoted_subreg (insn, XEXP (x, i));
11710             break;
11711           case 'V':
11712           case 'E':
11713             if (XVEC (x, i) != 0)
11714               for (j = 0; j < XVECLEN (x, i); j++)
11715                 check_promoted_subreg (insn, XVECEXP (x, i, j));
11716             break;
11717           }
11718     }
11719 }
11720 \f
11721 /* Utility routine for the following function.  Verify that all the registers
11722    mentioned in *LOC are valid when *LOC was part of a value set when
11723    label_tick == TICK.  Return 0 if some are not.
11724
11725    If REPLACE is nonzero, replace the invalid reference with
11726    (clobber (const_int 0)) and return 1.  This replacement is useful because
11727    we often can get useful information about the form of a value (e.g., if
11728    it was produced by a shift that always produces -1 or 0) even though
11729    we don't know exactly what registers it was produced from.  */
11730
11731 static int
11732 get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
11733 {
11734   rtx x = *loc;
11735   const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
11736   int len = GET_RTX_LENGTH (GET_CODE (x));
11737   int i, j;
11738
11739   if (REG_P (x))
11740     {
11741       unsigned int regno = REGNO (x);
11742       unsigned int endregno = END_REGNO (x);
11743       unsigned int j;
11744
11745       for (j = regno; j < endregno; j++)
11746         {
11747           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, j);
11748           if (rsp->last_set_invalid
11749               /* If this is a pseudo-register that was only set once and not
11750                  live at the beginning of the function, it is always valid.  */
11751               || (! (regno >= FIRST_PSEUDO_REGISTER
11752                      && REG_N_SETS (regno) == 1
11753                      && (!REGNO_REG_SET_P
11754                          (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), regno)))
11755                   && rsp->last_set_label > tick))
11756           {
11757             if (replace)
11758               *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11759             return replace;
11760           }
11761         }
11762
11763       return 1;
11764     }
11765   /* If this is a memory reference, make sure that there were
11766      no stores after it that might have clobbered the value.  We don't
11767      have alias info, so we assume any store invalidates it.  */
11768   else if (MEM_P (x) && !MEM_READONLY_P (x)
11769            && DF_INSN_LUID (insn) <= mem_last_set)
11770     {
11771       if (replace)
11772         *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11773       return replace;
11774     }
11775
11776   for (i = 0; i < len; i++)
11777     {
11778       if (fmt[i] == 'e')
11779         {
11780           /* Check for identical subexpressions.  If x contains
11781              identical subexpression we only have to traverse one of
11782              them.  */
11783           if (i == 1 && ARITHMETIC_P (x))
11784             {
11785               /* Note that at this point x0 has already been checked
11786                  and found valid.  */
11787               rtx x0 = XEXP (x, 0);
11788               rtx x1 = XEXP (x, 1);
11789
11790               /* If x0 and x1 are identical then x is also valid.  */
11791               if (x0 == x1)
11792                 return 1;
11793
11794               /* If x1 is identical to a subexpression of x0 then
11795                  while checking x0, x1 has already been checked.  Thus
11796                  it is valid and so as x.  */
11797               if (ARITHMETIC_P (x0)
11798                   && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11799                 return 1;
11800
11801               /* If x0 is identical to a subexpression of x1 then x is
11802                  valid iff the rest of x1 is valid.  */
11803               if (ARITHMETIC_P (x1)
11804                   && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11805                 return
11806                   get_last_value_validate (&XEXP (x1,
11807                                                   x0 == XEXP (x1, 0) ? 1 : 0),
11808                                            insn, tick, replace);
11809             }
11810
11811           if (get_last_value_validate (&XEXP (x, i), insn, tick,
11812                                        replace) == 0)
11813             return 0;
11814         }
11815       else if (fmt[i] == 'E')
11816         for (j = 0; j < XVECLEN (x, i); j++)
11817           if (get_last_value_validate (&XVECEXP (x, i, j),
11818                                        insn, tick, replace) == 0)
11819             return 0;
11820     }
11821
11822   /* If we haven't found a reason for it to be invalid, it is valid.  */
11823   return 1;
11824 }
11825
11826 /* Get the last value assigned to X, if known.  Some registers
11827    in the value may be replaced with (clobber (const_int 0)) if their value
11828    is known longer known reliably.  */
11829
11830 static rtx
11831 get_last_value (const_rtx x)
11832 {
11833   unsigned int regno;
11834   rtx value;
11835   reg_stat_type *rsp;
11836
11837   /* If this is a non-paradoxical SUBREG, get the value of its operand and
11838      then convert it to the desired mode.  If this is a paradoxical SUBREG,
11839      we cannot predict what values the "extra" bits might have.  */
11840   if (GET_CODE (x) == SUBREG
11841       && subreg_lowpart_p (x)
11842       && (GET_MODE_SIZE (GET_MODE (x))
11843           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
11844       && (value = get_last_value (SUBREG_REG (x))) != 0)
11845     return gen_lowpart (GET_MODE (x), value);
11846
11847   if (!REG_P (x))
11848     return 0;
11849
11850   regno = REGNO (x);
11851   rsp = VEC_index (reg_stat_type, reg_stat, regno);
11852   value = rsp->last_set_value;
11853
11854   /* If we don't have a value, or if it isn't for this basic block and
11855      it's either a hard register, set more than once, or it's a live
11856      at the beginning of the function, return 0.
11857
11858      Because if it's not live at the beginning of the function then the reg
11859      is always set before being used (is never used without being set).
11860      And, if it's set only once, and it's always set before use, then all
11861      uses must have the same last value, even if it's not from this basic
11862      block.  */
11863
11864   if (value == 0
11865       || (rsp->last_set_label < label_tick_ebb_start
11866           && (regno < FIRST_PSEUDO_REGISTER
11867               || REG_N_SETS (regno) != 1
11868               || REGNO_REG_SET_P
11869                  (DF_LR_IN (ENTRY_BLOCK_PTR->next_bb), regno))))
11870     return 0;
11871
11872   /* If the value was set in a later insn than the ones we are processing,
11873      we can't use it even if the register was only set once.  */
11874   if (rsp->last_set_label == label_tick
11875       && DF_INSN_LUID (rsp->last_set) >= subst_low_luid)
11876     return 0;
11877
11878   /* If the value has all its registers valid, return it.  */
11879   if (get_last_value_validate (&value, rsp->last_set,
11880                                rsp->last_set_label, 0))
11881     return value;
11882
11883   /* Otherwise, make a copy and replace any invalid register with
11884      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
11885
11886   value = copy_rtx (value);
11887   if (get_last_value_validate (&value, rsp->last_set,
11888                                rsp->last_set_label, 1))
11889     return value;
11890
11891   return 0;
11892 }
11893 \f
11894 /* Return nonzero if expression X refers to a REG or to memory
11895    that is set in an instruction more recent than FROM_LUID.  */
11896
11897 static int
11898 use_crosses_set_p (const_rtx x, int from_luid)
11899 {
11900   const char *fmt;
11901   int i;
11902   enum rtx_code code = GET_CODE (x);
11903
11904   if (code == REG)
11905     {
11906       unsigned int regno = REGNO (x);
11907       unsigned endreg = END_REGNO (x);
11908
11909 #ifdef PUSH_ROUNDING
11910       /* Don't allow uses of the stack pointer to be moved,
11911          because we don't know whether the move crosses a push insn.  */
11912       if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
11913         return 1;
11914 #endif
11915       for (; regno < endreg; regno++)
11916         {
11917           reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, regno);
11918           if (rsp->last_set
11919               && rsp->last_set_label == label_tick
11920               && DF_INSN_LUID (rsp->last_set) > from_luid)
11921             return 1;
11922         }
11923       return 0;
11924     }
11925
11926   if (code == MEM && mem_last_set > from_luid)
11927     return 1;
11928
11929   fmt = GET_RTX_FORMAT (code);
11930
11931   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11932     {
11933       if (fmt[i] == 'E')
11934         {
11935           int j;
11936           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11937             if (use_crosses_set_p (XVECEXP (x, i, j), from_luid))
11938               return 1;
11939         }
11940       else if (fmt[i] == 'e'
11941                && use_crosses_set_p (XEXP (x, i), from_luid))
11942         return 1;
11943     }
11944   return 0;
11945 }
11946 \f
11947 /* Define three variables used for communication between the following
11948    routines.  */
11949
11950 static unsigned int reg_dead_regno, reg_dead_endregno;
11951 static int reg_dead_flag;
11952
11953 /* Function called via note_stores from reg_dead_at_p.
11954
11955    If DEST is within [reg_dead_regno, reg_dead_endregno), set
11956    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
11957
11958 static void
11959 reg_dead_at_p_1 (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
11960 {
11961   unsigned int regno, endregno;
11962
11963   if (!REG_P (dest))
11964     return;
11965
11966   regno = REGNO (dest);
11967   endregno = END_REGNO (dest);
11968   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
11969     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
11970 }
11971
11972 /* Return nonzero if REG is known to be dead at INSN.
11973
11974    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
11975    referencing REG, it is dead.  If we hit a SET referencing REG, it is
11976    live.  Otherwise, see if it is live or dead at the start of the basic
11977    block we are in.  Hard regs marked as being live in NEWPAT_USED_REGS
11978    must be assumed to be always live.  */
11979
11980 static int
11981 reg_dead_at_p (rtx reg, rtx insn)
11982 {
11983   basic_block block;
11984   unsigned int i;
11985
11986   /* Set variables for reg_dead_at_p_1.  */
11987   reg_dead_regno = REGNO (reg);
11988   reg_dead_endregno = END_REGNO (reg);
11989
11990   reg_dead_flag = 0;
11991
11992   /* Check that reg isn't mentioned in NEWPAT_USED_REGS.  For fixed registers
11993      we allow the machine description to decide whether use-and-clobber
11994      patterns are OK.  */
11995   if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
11996     {
11997       for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11998         if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
11999           return 0;
12000     }
12001
12002   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, or
12003      beginning of basic block.  */
12004   block = BLOCK_FOR_INSN (insn);
12005   for (;;)
12006     {
12007       if (INSN_P (insn))
12008         {
12009           note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
12010           if (reg_dead_flag)
12011             return reg_dead_flag == 1 ? 1 : 0;
12012
12013           if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
12014             return 1;
12015         }
12016
12017       if (insn == BB_HEAD (block))
12018         break;
12019
12020       insn = PREV_INSN (insn);
12021     }
12022
12023   /* Look at live-in sets for the basic block that we were in.  */
12024   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12025     if (REGNO_REG_SET_P (df_get_live_in (block), i))
12026       return 0;
12027
12028   return 1;
12029 }
12030 \f
12031 /* Note hard registers in X that are used.  */
12032
12033 static void
12034 mark_used_regs_combine (rtx x)
12035 {
12036   RTX_CODE code = GET_CODE (x);
12037   unsigned int regno;
12038   int i;
12039
12040   switch (code)
12041     {
12042     case LABEL_REF:
12043     case SYMBOL_REF:
12044     case CONST_INT:
12045     case CONST:
12046     case CONST_DOUBLE:
12047     case CONST_VECTOR:
12048     case PC:
12049     case ADDR_VEC:
12050     case ADDR_DIFF_VEC:
12051     case ASM_INPUT:
12052 #ifdef HAVE_cc0
12053     /* CC0 must die in the insn after it is set, so we don't need to take
12054        special note of it here.  */
12055     case CC0:
12056 #endif
12057       return;
12058
12059     case CLOBBER:
12060       /* If we are clobbering a MEM, mark any hard registers inside the
12061          address as used.  */
12062       if (MEM_P (XEXP (x, 0)))
12063         mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
12064       return;
12065
12066     case REG:
12067       regno = REGNO (x);
12068       /* A hard reg in a wide mode may really be multiple registers.
12069          If so, mark all of them just like the first.  */
12070       if (regno < FIRST_PSEUDO_REGISTER)
12071         {
12072           /* None of this applies to the stack, frame or arg pointers.  */
12073           if (regno == STACK_POINTER_REGNUM
12074 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
12075               || regno == HARD_FRAME_POINTER_REGNUM
12076 #endif
12077 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
12078               || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
12079 #endif
12080               || regno == FRAME_POINTER_REGNUM)
12081             return;
12082
12083           add_to_hard_reg_set (&newpat_used_regs, GET_MODE (x), regno);
12084         }
12085       return;
12086
12087     case SET:
12088       {
12089         /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
12090            the address.  */
12091         rtx testreg = SET_DEST (x);
12092
12093         while (GET_CODE (testreg) == SUBREG
12094                || GET_CODE (testreg) == ZERO_EXTRACT
12095                || GET_CODE (testreg) == STRICT_LOW_PART)
12096           testreg = XEXP (testreg, 0);
12097
12098         if (MEM_P (testreg))
12099           mark_used_regs_combine (XEXP (testreg, 0));
12100
12101         mark_used_regs_combine (SET_SRC (x));
12102       }
12103       return;
12104
12105     default:
12106       break;
12107     }
12108
12109   /* Recursively scan the operands of this expression.  */
12110
12111   {
12112     const char *fmt = GET_RTX_FORMAT (code);
12113
12114     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12115       {
12116         if (fmt[i] == 'e')
12117           mark_used_regs_combine (XEXP (x, i));
12118         else if (fmt[i] == 'E')
12119           {
12120             int j;
12121
12122             for (j = 0; j < XVECLEN (x, i); j++)
12123               mark_used_regs_combine (XVECEXP (x, i, j));
12124           }
12125       }
12126   }
12127 }
12128 \f
12129 /* Remove register number REGNO from the dead registers list of INSN.
12130
12131    Return the note used to record the death, if there was one.  */
12132
12133 rtx
12134 remove_death (unsigned int regno, rtx insn)
12135 {
12136   rtx note = find_regno_note (insn, REG_DEAD, regno);
12137
12138   if (note)
12139     remove_note (insn, note);
12140
12141   return note;
12142 }
12143
12144 /* For each register (hardware or pseudo) used within expression X, if its
12145    death is in an instruction with luid between FROM_LUID (inclusive) and
12146    TO_INSN (exclusive), put a REG_DEAD note for that register in the
12147    list headed by PNOTES.
12148
12149    That said, don't move registers killed by maybe_kill_insn.
12150
12151    This is done when X is being merged by combination into TO_INSN.  These
12152    notes will then be distributed as needed.  */
12153
12154 static void
12155 move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx to_insn,
12156              rtx *pnotes)
12157 {
12158   const char *fmt;
12159   int len, i;
12160   enum rtx_code code = GET_CODE (x);
12161
12162   if (code == REG)
12163     {
12164       unsigned int regno = REGNO (x);
12165       rtx where_dead = VEC_index (reg_stat_type, reg_stat, regno)->last_death;
12166
12167       /* Don't move the register if it gets killed in between from and to.  */
12168       if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
12169           && ! reg_referenced_p (x, maybe_kill_insn))
12170         return;
12171
12172       if (where_dead
12173           && DF_INSN_LUID (where_dead) >= from_luid
12174           && DF_INSN_LUID (where_dead) < DF_INSN_LUID (to_insn))
12175         {
12176           rtx note = remove_death (regno, where_dead);
12177
12178           /* It is possible for the call above to return 0.  This can occur
12179              when last_death points to I2 or I1 that we combined with.
12180              In that case make a new note.
12181
12182              We must also check for the case where X is a hard register
12183              and NOTE is a death note for a range of hard registers
12184              including X.  In that case, we must put REG_DEAD notes for
12185              the remaining registers in place of NOTE.  */
12186
12187           if (note != 0 && regno < FIRST_PSEUDO_REGISTER
12188               && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12189                   > GET_MODE_SIZE (GET_MODE (x))))
12190             {
12191               unsigned int deadregno = REGNO (XEXP (note, 0));
12192               unsigned int deadend = END_HARD_REGNO (XEXP (note, 0));
12193               unsigned int ourend = END_HARD_REGNO (x);
12194               unsigned int i;
12195
12196               for (i = deadregno; i < deadend; i++)
12197                 if (i < regno || i >= ourend)
12198                   add_reg_note (where_dead, REG_DEAD, regno_reg_rtx[i]);
12199             }
12200
12201           /* If we didn't find any note, or if we found a REG_DEAD note that
12202              covers only part of the given reg, and we have a multi-reg hard
12203              register, then to be safe we must check for REG_DEAD notes
12204              for each register other than the first.  They could have
12205              their own REG_DEAD notes lying around.  */
12206           else if ((note == 0
12207                     || (note != 0
12208                         && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
12209                             < GET_MODE_SIZE (GET_MODE (x)))))
12210                    && regno < FIRST_PSEUDO_REGISTER
12211                    && hard_regno_nregs[regno][GET_MODE (x)] > 1)
12212             {
12213               unsigned int ourend = END_HARD_REGNO (x);
12214               unsigned int i, offset;
12215               rtx oldnotes = 0;
12216
12217               if (note)
12218                 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
12219               else
12220                 offset = 1;
12221
12222               for (i = regno + offset; i < ourend; i++)
12223                 move_deaths (regno_reg_rtx[i],
12224                              maybe_kill_insn, from_luid, to_insn, &oldnotes);
12225             }
12226
12227           if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
12228             {
12229               XEXP (note, 1) = *pnotes;
12230               *pnotes = note;
12231             }
12232           else
12233             *pnotes = gen_rtx_EXPR_LIST (REG_DEAD, x, *pnotes);
12234         }
12235
12236       return;
12237     }
12238
12239   else if (GET_CODE (x) == SET)
12240     {
12241       rtx dest = SET_DEST (x);
12242
12243       move_deaths (SET_SRC (x), maybe_kill_insn, from_luid, to_insn, pnotes);
12244
12245       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
12246          that accesses one word of a multi-word item, some
12247          piece of everything register in the expression is used by
12248          this insn, so remove any old death.  */
12249       /* ??? So why do we test for equality of the sizes?  */
12250
12251       if (GET_CODE (dest) == ZERO_EXTRACT
12252           || GET_CODE (dest) == STRICT_LOW_PART
12253           || (GET_CODE (dest) == SUBREG
12254               && (((GET_MODE_SIZE (GET_MODE (dest))
12255                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
12256                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
12257                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
12258         {
12259           move_deaths (dest, maybe_kill_insn, from_luid, to_insn, pnotes);
12260           return;
12261         }
12262
12263       /* If this is some other SUBREG, we know it replaces the entire
12264          value, so use that as the destination.  */
12265       if (GET_CODE (dest) == SUBREG)
12266         dest = SUBREG_REG (dest);
12267
12268       /* If this is a MEM, adjust deaths of anything used in the address.
12269          For a REG (the only other possibility), the entire value is
12270          being replaced so the old value is not used in this insn.  */
12271
12272       if (MEM_P (dest))
12273         move_deaths (XEXP (dest, 0), maybe_kill_insn, from_luid,
12274                      to_insn, pnotes);
12275       return;
12276     }
12277
12278   else if (GET_CODE (x) == CLOBBER)
12279     return;
12280
12281   len = GET_RTX_LENGTH (code);
12282   fmt = GET_RTX_FORMAT (code);
12283
12284   for (i = 0; i < len; i++)
12285     {
12286       if (fmt[i] == 'E')
12287         {
12288           int j;
12289           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12290             move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_luid,
12291                          to_insn, pnotes);
12292         }
12293       else if (fmt[i] == 'e')
12294         move_deaths (XEXP (x, i), maybe_kill_insn, from_luid, to_insn, pnotes);
12295     }
12296 }
12297 \f
12298 /* Return 1 if X is the target of a bit-field assignment in BODY, the
12299    pattern of an insn.  X must be a REG.  */
12300
12301 static int
12302 reg_bitfield_target_p (rtx x, rtx body)
12303 {
12304   int i;
12305
12306   if (GET_CODE (body) == SET)
12307     {
12308       rtx dest = SET_DEST (body);
12309       rtx target;
12310       unsigned int regno, tregno, endregno, endtregno;
12311
12312       if (GET_CODE (dest) == ZERO_EXTRACT)
12313         target = XEXP (dest, 0);
12314       else if (GET_CODE (dest) == STRICT_LOW_PART)
12315         target = SUBREG_REG (XEXP (dest, 0));
12316       else
12317         return 0;
12318
12319       if (GET_CODE (target) == SUBREG)
12320         target = SUBREG_REG (target);
12321
12322       if (!REG_P (target))
12323         return 0;
12324
12325       tregno = REGNO (target), regno = REGNO (x);
12326       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
12327         return target == x;
12328
12329       endtregno = end_hard_regno (GET_MODE (target), tregno);
12330       endregno = end_hard_regno (GET_MODE (x), regno);
12331
12332       return endregno > tregno && regno < endtregno;
12333     }
12334
12335   else if (GET_CODE (body) == PARALLEL)
12336     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
12337       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
12338         return 1;
12339
12340   return 0;
12341 }
12342 \f
12343 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
12344    as appropriate.  I3 and I2 are the insns resulting from the combination
12345    insns including FROM (I2 may be zero).
12346
12347    ELIM_I2 and ELIM_I1 are either zero or registers that we know will
12348    not need REG_DEAD notes because they are being substituted for.  This
12349    saves searching in the most common cases.
12350
12351    Each note in the list is either ignored or placed on some insns, depending
12352    on the type of note.  */
12353
12354 static void
12355 distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
12356                   rtx elim_i1)
12357 {
12358   rtx note, next_note;
12359   rtx tem;
12360
12361   for (note = notes; note; note = next_note)
12362     {
12363       rtx place = 0, place2 = 0;
12364
12365       next_note = XEXP (note, 1);
12366       switch (REG_NOTE_KIND (note))
12367         {
12368         case REG_BR_PROB:
12369         case REG_BR_PRED:
12370           /* Doesn't matter much where we put this, as long as it's somewhere.
12371              It is preferable to keep these notes on branches, which is most
12372              likely to be i3.  */
12373           place = i3;
12374           break;
12375
12376         case REG_VALUE_PROFILE:
12377           /* Just get rid of this note, as it is unused later anyway.  */
12378           break;
12379
12380         case REG_NON_LOCAL_GOTO:
12381           if (JUMP_P (i3))
12382             place = i3;
12383           else
12384             {
12385               gcc_assert (i2 && JUMP_P (i2));
12386               place = i2;
12387             }
12388           break;
12389
12390         case REG_EH_REGION:
12391           /* These notes must remain with the call or trapping instruction.  */
12392           if (CALL_P (i3))
12393             place = i3;
12394           else if (i2 && CALL_P (i2))
12395             place = i2;
12396           else
12397             {
12398               gcc_assert (flag_non_call_exceptions);
12399               if (may_trap_p (i3))
12400                 place = i3;
12401               else if (i2 && may_trap_p (i2))
12402                 place = i2;
12403               /* ??? Otherwise assume we've combined things such that we
12404                  can now prove that the instructions can't trap.  Drop the
12405                  note in this case.  */
12406             }
12407           break;
12408
12409         case REG_NORETURN:
12410         case REG_SETJMP:
12411           /* These notes must remain with the call.  It should not be
12412              possible for both I2 and I3 to be a call.  */
12413           if (CALL_P (i3))
12414             place = i3;
12415           else
12416             {
12417               gcc_assert (i2 && CALL_P (i2));
12418               place = i2;
12419             }
12420           break;
12421
12422         case REG_UNUSED:
12423           /* Any clobbers for i3 may still exist, and so we must process
12424              REG_UNUSED notes from that insn.
12425
12426              Any clobbers from i2 or i1 can only exist if they were added by
12427              recog_for_combine.  In that case, recog_for_combine created the
12428              necessary REG_UNUSED notes.  Trying to keep any original
12429              REG_UNUSED notes from these insns can cause incorrect output
12430              if it is for the same register as the original i3 dest.
12431              In that case, we will notice that the register is set in i3,
12432              and then add a REG_UNUSED note for the destination of i3, which
12433              is wrong.  However, it is possible to have REG_UNUSED notes from
12434              i2 or i1 for register which were both used and clobbered, so
12435              we keep notes from i2 or i1 if they will turn into REG_DEAD
12436              notes.  */
12437
12438           /* If this register is set or clobbered in I3, put the note there
12439              unless there is one already.  */
12440           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
12441             {
12442               if (from_insn != i3)
12443                 break;
12444
12445               if (! (REG_P (XEXP (note, 0))
12446                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
12447                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
12448                 place = i3;
12449             }
12450           /* Otherwise, if this register is used by I3, then this register
12451              now dies here, so we must put a REG_DEAD note here unless there
12452              is one already.  */
12453           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
12454                    && ! (REG_P (XEXP (note, 0))
12455                          ? find_regno_note (i3, REG_DEAD,
12456                                             REGNO (XEXP (note, 0)))
12457                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
12458             {
12459               PUT_REG_NOTE_KIND (note, REG_DEAD);
12460               place = i3;
12461             }
12462           break;
12463
12464         case REG_EQUAL:
12465         case REG_EQUIV:
12466         case REG_NOALIAS:
12467           /* These notes say something about results of an insn.  We can
12468              only support them if they used to be on I3 in which case they
12469              remain on I3.  Otherwise they are ignored.
12470
12471              If the note refers to an expression that is not a constant, we
12472              must also ignore the note since we cannot tell whether the
12473              equivalence is still true.  It might be possible to do
12474              slightly better than this (we only have a problem if I2DEST
12475              or I1DEST is present in the expression), but it doesn't
12476              seem worth the trouble.  */
12477
12478           if (from_insn == i3
12479               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
12480             place = i3;
12481           break;
12482
12483         case REG_INC:
12484           /* These notes say something about how a register is used.  They must
12485              be present on any use of the register in I2 or I3.  */
12486           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
12487             place = i3;
12488
12489           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
12490             {
12491               if (place)
12492                 place2 = i2;
12493               else
12494                 place = i2;
12495             }
12496           break;
12497
12498         case REG_LABEL_TARGET:
12499         case REG_LABEL_OPERAND:
12500           /* This can show up in several ways -- either directly in the
12501              pattern, or hidden off in the constant pool with (or without?)
12502              a REG_EQUAL note.  */
12503           /* ??? Ignore the without-reg_equal-note problem for now.  */
12504           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
12505               || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
12506                   && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12507                   && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
12508             place = i3;
12509
12510           if (i2
12511               && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
12512                   || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
12513                       && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12514                       && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
12515             {
12516               if (place)
12517                 place2 = i2;
12518               else
12519                 place = i2;
12520             }
12521
12522           /* For REG_LABEL_TARGET on a JUMP_P, we prefer to put the note
12523              as a JUMP_LABEL or decrement LABEL_NUSES if it's already
12524              there.  */
12525           if (place && JUMP_P (place)
12526               && REG_NOTE_KIND (note) == REG_LABEL_TARGET
12527               && (JUMP_LABEL (place) == NULL
12528                   || JUMP_LABEL (place) == XEXP (note, 0)))
12529             {
12530               rtx label = JUMP_LABEL (place);
12531
12532               if (!label)
12533                 JUMP_LABEL (place) = XEXP (note, 0);
12534               else if (LABEL_P (label))
12535                 LABEL_NUSES (label)--;
12536             }
12537
12538           if (place2 && JUMP_P (place2)
12539               && REG_NOTE_KIND (note) == REG_LABEL_TARGET
12540               && (JUMP_LABEL (place2) == NULL
12541                   || JUMP_LABEL (place2) == XEXP (note, 0)))
12542             {
12543               rtx label = JUMP_LABEL (place2);
12544
12545               if (!label)
12546                 JUMP_LABEL (place2) = XEXP (note, 0);
12547               else if (LABEL_P (label))
12548                 LABEL_NUSES (label)--;
12549               place2 = 0;
12550             }
12551           break;
12552
12553         case REG_NONNEG:
12554           /* This note says something about the value of a register prior
12555              to the execution of an insn.  It is too much trouble to see
12556              if the note is still correct in all situations.  It is better
12557              to simply delete it.  */
12558           break;
12559
12560         case REG_DEAD:
12561           /* If we replaced the right hand side of FROM_INSN with a
12562              REG_EQUAL note, the original use of the dying register
12563              will not have been combined into I3 and I2.  In such cases,
12564              FROM_INSN is guaranteed to be the first of the combined
12565              instructions, so we simply need to search back before
12566              FROM_INSN for the previous use or set of this register,
12567              then alter the notes there appropriately.
12568
12569              If the register is used as an input in I3, it dies there.
12570              Similarly for I2, if it is nonzero and adjacent to I3.
12571
12572              If the register is not used as an input in either I3 or I2
12573              and it is not one of the registers we were supposed to eliminate,
12574              there are two possibilities.  We might have a non-adjacent I2
12575              or we might have somehow eliminated an additional register
12576              from a computation.  For example, we might have had A & B where
12577              we discover that B will always be zero.  In this case we will
12578              eliminate the reference to A.
12579
12580              In both cases, we must search to see if we can find a previous
12581              use of A and put the death note there.  */
12582
12583           if (from_insn
12584               && from_insn == i2mod
12585               && !reg_overlap_mentioned_p (XEXP (note, 0), i2mod_new_rhs))
12586             tem = from_insn;
12587           else
12588             {
12589               if (from_insn
12590                   && CALL_P (from_insn)
12591                   && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
12592                 place = from_insn;
12593               else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
12594                 place = i3;
12595               else if (i2 != 0 && next_nonnote_insn (i2) == i3
12596                        && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12597                 place = i2;
12598               else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
12599                         && !(i2mod
12600                              && reg_overlap_mentioned_p (XEXP (note, 0),
12601                                                          i2mod_old_rhs)))
12602                        || rtx_equal_p (XEXP (note, 0), elim_i1))
12603                 break;
12604               tem = i3;
12605             }
12606
12607           if (place == 0)
12608             {
12609               basic_block bb = this_basic_block;
12610
12611               for (tem = PREV_INSN (tem); place == 0; tem = PREV_INSN (tem))
12612                 {
12613                   if (! INSN_P (tem))
12614                     {
12615                       if (tem == BB_HEAD (bb))
12616                         break;
12617                       continue;
12618                     }
12619
12620                   /* If the register is being set at TEM, see if that is all
12621                      TEM is doing.  If so, delete TEM.  Otherwise, make this
12622                      into a REG_UNUSED note instead. Don't delete sets to
12623                      global register vars.  */
12624                   if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
12625                        || !global_regs[REGNO (XEXP (note, 0))])
12626                       && reg_set_p (XEXP (note, 0), PATTERN (tem)))
12627                     {
12628                       rtx set = single_set (tem);
12629                       rtx inner_dest = 0;
12630 #ifdef HAVE_cc0
12631                       rtx cc0_setter = NULL_RTX;
12632 #endif
12633
12634                       if (set != 0)
12635                         for (inner_dest = SET_DEST (set);
12636                              (GET_CODE (inner_dest) == STRICT_LOW_PART
12637                               || GET_CODE (inner_dest) == SUBREG
12638                               || GET_CODE (inner_dest) == ZERO_EXTRACT);
12639                              inner_dest = XEXP (inner_dest, 0))
12640                           ;
12641
12642                       /* Verify that it was the set, and not a clobber that
12643                          modified the register.
12644
12645                          CC0 targets must be careful to maintain setter/user
12646                          pairs.  If we cannot delete the setter due to side
12647                          effects, mark the user with an UNUSED note instead
12648                          of deleting it.  */
12649
12650                       if (set != 0 && ! side_effects_p (SET_SRC (set))
12651                           && rtx_equal_p (XEXP (note, 0), inner_dest)
12652 #ifdef HAVE_cc0
12653                           && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
12654                               || ((cc0_setter = prev_cc0_setter (tem)) != NULL
12655                                   && sets_cc0_p (PATTERN (cc0_setter)) > 0))
12656 #endif
12657                           )
12658                         {
12659                           /* Move the notes and links of TEM elsewhere.
12660                              This might delete other dead insns recursively.
12661                              First set the pattern to something that won't use
12662                              any register.  */
12663                           rtx old_notes = REG_NOTES (tem);
12664
12665                           PATTERN (tem) = pc_rtx;
12666                           REG_NOTES (tem) = NULL;
12667
12668                           distribute_notes (old_notes, tem, tem, NULL_RTX,
12669                                             NULL_RTX, NULL_RTX);
12670                           distribute_links (LOG_LINKS (tem));
12671
12672                           SET_INSN_DELETED (tem);
12673                           if (tem == i2)
12674                             i2 = NULL_RTX;
12675
12676 #ifdef HAVE_cc0
12677                           /* Delete the setter too.  */
12678                           if (cc0_setter)
12679                             {
12680                               PATTERN (cc0_setter) = pc_rtx;
12681                               old_notes = REG_NOTES (cc0_setter);
12682                               REG_NOTES (cc0_setter) = NULL;
12683
12684                               distribute_notes (old_notes, cc0_setter,
12685                                                 cc0_setter, NULL_RTX,
12686                                                 NULL_RTX, NULL_RTX);
12687                               distribute_links (LOG_LINKS (cc0_setter));
12688
12689                               SET_INSN_DELETED (cc0_setter);
12690                               if (cc0_setter == i2)
12691                                 i2 = NULL_RTX;
12692                             }
12693 #endif
12694                         }
12695                       else
12696                         {
12697                           PUT_REG_NOTE_KIND (note, REG_UNUSED);
12698
12699                           /*  If there isn't already a REG_UNUSED note, put one
12700                               here.  Do not place a REG_DEAD note, even if
12701                               the register is also used here; that would not
12702                               match the algorithm used in lifetime analysis
12703                               and can cause the consistency check in the
12704                               scheduler to fail.  */
12705                           if (! find_regno_note (tem, REG_UNUSED,
12706                                                  REGNO (XEXP (note, 0))))
12707                             place = tem;
12708                           break;
12709                         }
12710                     }
12711                   else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
12712                            || (CALL_P (tem)
12713                                && find_reg_fusage (tem, USE, XEXP (note, 0))))
12714                     {
12715                       place = tem;
12716
12717                       /* If we are doing a 3->2 combination, and we have a
12718                          register which formerly died in i3 and was not used
12719                          by i2, which now no longer dies in i3 and is used in
12720                          i2 but does not die in i2, and place is between i2
12721                          and i3, then we may need to move a link from place to
12722                          i2.  */
12723                       if (i2 && DF_INSN_LUID (place) > DF_INSN_LUID (i2)
12724                           && from_insn
12725                           && DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2)
12726                           && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12727                         {
12728                           rtx links = LOG_LINKS (place);
12729                           LOG_LINKS (place) = 0;
12730                           distribute_links (links);
12731                         }
12732                       break;
12733                     }
12734
12735                   if (tem == BB_HEAD (bb))
12736                     break;
12737                 }
12738
12739             }
12740
12741           /* If the register is set or already dead at PLACE, we needn't do
12742              anything with this note if it is still a REG_DEAD note.
12743              We check here if it is set at all, not if is it totally replaced,
12744              which is what `dead_or_set_p' checks, so also check for it being
12745              set partially.  */
12746
12747           if (place && REG_NOTE_KIND (note) == REG_DEAD)
12748             {
12749               unsigned int regno = REGNO (XEXP (note, 0));
12750               reg_stat_type *rsp = VEC_index (reg_stat_type, reg_stat, regno);
12751
12752               if (dead_or_set_p (place, XEXP (note, 0))
12753                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
12754                 {
12755                   /* Unless the register previously died in PLACE, clear
12756                      last_death.  [I no longer understand why this is
12757                      being done.] */
12758                   if (rsp->last_death != place)
12759                     rsp->last_death = 0;
12760                   place = 0;
12761                 }
12762               else
12763                 rsp->last_death = place;
12764
12765               /* If this is a death note for a hard reg that is occupying
12766                  multiple registers, ensure that we are still using all
12767                  parts of the object.  If we find a piece of the object
12768                  that is unused, we must arrange for an appropriate REG_DEAD
12769                  note to be added for it.  However, we can't just emit a USE
12770                  and tag the note to it, since the register might actually
12771                  be dead; so we recourse, and the recursive call then finds
12772                  the previous insn that used this register.  */
12773
12774               if (place && regno < FIRST_PSEUDO_REGISTER
12775                   && hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))] > 1)
12776                 {
12777                   unsigned int endregno = END_HARD_REGNO (XEXP (note, 0));
12778                   int all_used = 1;
12779                   unsigned int i;
12780
12781                   for (i = regno; i < endregno; i++)
12782                     if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
12783                          && ! find_regno_fusage (place, USE, i))
12784                         || dead_or_set_regno_p (place, i))
12785                       all_used = 0;
12786
12787                   if (! all_used)
12788                     {
12789                       /* Put only REG_DEAD notes for pieces that are
12790                          not already dead or set.  */
12791
12792                       for (i = regno; i < endregno;
12793                            i += hard_regno_nregs[i][reg_raw_mode[i]])
12794                         {
12795                           rtx piece = regno_reg_rtx[i];
12796                           basic_block bb = this_basic_block;
12797
12798                           if (! dead_or_set_p (place, piece)
12799                               && ! reg_bitfield_target_p (piece,
12800                                                           PATTERN (place)))
12801                             {
12802                               rtx new_note
12803                                 = gen_rtx_EXPR_LIST (REG_DEAD, piece, NULL_RTX);
12804
12805                               distribute_notes (new_note, place, place,
12806                                                 NULL_RTX, NULL_RTX, NULL_RTX);
12807                             }
12808                           else if (! refers_to_regno_p (i, i + 1,
12809                                                         PATTERN (place), 0)
12810                                    && ! find_regno_fusage (place, USE, i))
12811                             for (tem = PREV_INSN (place); ;
12812                                  tem = PREV_INSN (tem))
12813                               {
12814                                 if (! INSN_P (tem))
12815                                   {
12816                                     if (tem == BB_HEAD (bb))
12817                                       break;
12818                                     continue;
12819                                   }
12820                                 if (dead_or_set_p (tem, piece)
12821                                     || reg_bitfield_target_p (piece,
12822                                                               PATTERN (tem)))
12823                                   {
12824                                     add_reg_note (tem, REG_UNUSED, piece);
12825                                     break;
12826                                   }
12827                               }
12828
12829                         }
12830
12831                       place = 0;
12832                     }
12833                 }
12834             }
12835           break;
12836
12837         default:
12838           /* Any other notes should not be present at this point in the
12839              compilation.  */
12840           gcc_unreachable ();
12841         }
12842
12843       if (place)
12844         {
12845           XEXP (note, 1) = REG_NOTES (place);
12846           REG_NOTES (place) = note;
12847         }
12848
12849       if (place2)
12850         REG_NOTES (place2) 
12851           = gen_rtx_fmt_ee (GET_CODE (note), REG_NOTE_KIND (note),
12852                             XEXP (note, 0), REG_NOTES (place2));
12853     }
12854 }
12855 \f
12856 /* Similarly to above, distribute the LOG_LINKS that used to be present on
12857    I3, I2, and I1 to new locations.  This is also called to add a link
12858    pointing at I3 when I3's destination is changed.  */
12859
12860 static void
12861 distribute_links (rtx links)
12862 {
12863   rtx link, next_link;
12864
12865   for (link = links; link; link = next_link)
12866     {
12867       rtx place = 0;
12868       rtx insn;
12869       rtx set, reg;
12870
12871       next_link = XEXP (link, 1);
12872
12873       /* If the insn that this link points to is a NOTE or isn't a single
12874          set, ignore it.  In the latter case, it isn't clear what we
12875          can do other than ignore the link, since we can't tell which
12876          register it was for.  Such links wouldn't be used by combine
12877          anyway.
12878
12879          It is not possible for the destination of the target of the link to
12880          have been changed by combine.  The only potential of this is if we
12881          replace I3, I2, and I1 by I3 and I2.  But in that case the
12882          destination of I2 also remains unchanged.  */
12883
12884       if (NOTE_P (XEXP (link, 0))
12885           || (set = single_set (XEXP (link, 0))) == 0)
12886         continue;
12887
12888       reg = SET_DEST (set);
12889       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
12890              || GET_CODE (reg) == STRICT_LOW_PART)
12891         reg = XEXP (reg, 0);
12892
12893       /* A LOG_LINK is defined as being placed on the first insn that uses
12894          a register and points to the insn that sets the register.  Start
12895          searching at the next insn after the target of the link and stop
12896          when we reach a set of the register or the end of the basic block.
12897
12898          Note that this correctly handles the link that used to point from
12899          I3 to I2.  Also note that not much searching is typically done here
12900          since most links don't point very far away.  */
12901
12902       for (insn = NEXT_INSN (XEXP (link, 0));
12903            (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
12904                      || BB_HEAD (this_basic_block->next_bb) != insn));
12905            insn = NEXT_INSN (insn))
12906         if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
12907           {
12908             if (reg_referenced_p (reg, PATTERN (insn)))
12909               place = insn;
12910             break;
12911           }
12912         else if (CALL_P (insn)
12913                  && find_reg_fusage (insn, USE, reg))
12914           {
12915             place = insn;
12916             break;
12917           }
12918         else if (INSN_P (insn) && reg_set_p (reg, insn))
12919           break;
12920
12921       /* If we found a place to put the link, place it there unless there
12922          is already a link to the same insn as LINK at that point.  */
12923
12924       if (place)
12925         {
12926           rtx link2;
12927
12928           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
12929             if (XEXP (link2, 0) == XEXP (link, 0))
12930               break;
12931
12932           if (link2 == 0)
12933             {
12934               XEXP (link, 1) = LOG_LINKS (place);
12935               LOG_LINKS (place) = link;
12936
12937               /* Set added_links_insn to the earliest insn we added a
12938                  link to.  */
12939               if (added_links_insn == 0
12940                   || DF_INSN_LUID (added_links_insn) > DF_INSN_LUID (place))
12941                 added_links_insn = place;
12942             }
12943         }
12944     }
12945 }
12946 \f
12947 /* Subroutine of unmentioned_reg_p and callback from for_each_rtx.
12948    Check whether the expression pointer to by LOC is a register or
12949    memory, and if so return 1 if it isn't mentioned in the rtx EXPR.
12950    Otherwise return zero.  */
12951
12952 static int
12953 unmentioned_reg_p_1 (rtx *loc, void *expr)
12954 {
12955   rtx x = *loc;
12956
12957   if (x != NULL_RTX
12958       && (REG_P (x) || MEM_P (x))
12959       && ! reg_mentioned_p (x, (rtx) expr))
12960     return 1;
12961   return 0;
12962 }
12963
12964 /* Check for any register or memory mentioned in EQUIV that is not
12965    mentioned in EXPR.  This is used to restrict EQUIV to "specializations"
12966    of EXPR where some registers may have been replaced by constants.  */
12967
12968 static bool
12969 unmentioned_reg_p (rtx equiv, rtx expr)
12970 {
12971   return for_each_rtx (&equiv, unmentioned_reg_p_1, expr);
12972 }
12973 \f
12974 void
12975 dump_combine_stats (FILE *file)
12976 {
12977   fprintf
12978     (file,
12979      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
12980      combine_attempts, combine_merges, combine_extras, combine_successes);
12981 }
12982
12983 void
12984 dump_combine_total_stats (FILE *file)
12985 {
12986   fprintf
12987     (file,
12988      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
12989      total_attempts, total_merges, total_extras, total_successes);
12990 }
12991 \f
12992 static bool
12993 gate_handle_combine (void)
12994 {
12995   return (optimize > 0);
12996 }
12997
12998 /* Try combining insns through substitution.  */
12999 static unsigned int
13000 rest_of_handle_combine (void)
13001 {
13002   int rebuild_jump_labels_after_combine;
13003
13004   df_set_flags (DF_LR_RUN_DCE + DF_DEFER_INSN_RESCAN);
13005   df_note_add_problem ();
13006   df_analyze ();
13007
13008   regstat_init_n_sets_and_refs ();
13009
13010   rebuild_jump_labels_after_combine
13011     = combine_instructions (get_insns (), max_reg_num ());
13012
13013   /* Combining insns may have turned an indirect jump into a
13014      direct jump.  Rebuild the JUMP_LABEL fields of jumping
13015      instructions.  */
13016   if (rebuild_jump_labels_after_combine)
13017     {
13018       timevar_push (TV_JUMP);
13019       rebuild_jump_labels (get_insns ());
13020       cleanup_cfg (0);
13021       timevar_pop (TV_JUMP);
13022     }
13023
13024   regstat_free_n_sets_and_refs ();
13025   return 0;
13026 }
13027
13028 struct rtl_opt_pass pass_combine =
13029 {
13030  {
13031   RTL_PASS,
13032   "combine",                            /* name */
13033   gate_handle_combine,                  /* gate */
13034   rest_of_handle_combine,               /* execute */
13035   NULL,                                 /* sub */
13036   NULL,                                 /* next */
13037   0,                                    /* static_pass_number */
13038   TV_COMBINE,                           /* tv_id */
13039   PROP_cfglayout,                       /* properties_required */
13040   0,                                    /* properties_provided */
13041   0,                                    /* properties_destroyed */
13042   0,                                    /* todo_flags_start */
13043   TODO_dump_func |
13044   TODO_df_finish | TODO_verify_rtl_sharing |
13045   TODO_ggc_collect,                     /* todo_flags_finish */
13046  }
13047 };
13048