]> gcc.gnu.org Git - gcc.git/blame - gcc/combine.c
fix
[gcc.git] / gcc / combine.c
CommitLineData
230d793d 1/* Optimize by combining instructions for GNU compiler.
3c71940f 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
8f8d8d6e 3 1999, 2000, 2001 Free Software Foundation, Inc.
230d793d 4
1322177d 5This file is part of GCC.
230d793d 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
230d793d 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
230d793d
RS
16
17You should have received a copy of the GNU General Public License
1322177d
LB
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA. */
230d793d 21
230d793d
RS
22/* This module is essentially the "combiner" phase of the U. of Arizona
23 Portable Optimizer, but redone to work on our list-structured
24 representation for RTL instead of their string representation.
25
26 The LOG_LINKS of each insn identify the most recent assignment
27 to each REG used in the insn. It is a list of previous insns,
28 each of which contains a SET for a REG that is used in this insn
29 and not used or set in between. LOG_LINKs never cross basic blocks.
30 They were set up by the preceding pass (lifetime analysis).
31
32 We try to combine each pair of insns joined by a logical link.
33 We also try to combine triples of insns A, B and C when
34 C has a link back to B and B has a link back to A.
35
36 LOG_LINKS does not have links for use of the CC0. They don't
37 need to, because the insn that sets the CC0 is always immediately
38 before the insn that tests it. So we always regard a branch
39 insn as having a logical link to the preceding insn. The same is true
40 for an insn explicitly using CC0.
41
42 We check (with use_crosses_set_p) to avoid combining in such a way
43 as to move a computation to a place where its value would be different.
44
45 Combination is done by mathematically substituting the previous
46 insn(s) values for the regs they set into the expressions in
47 the later insns that refer to these regs. If the result is a valid insn
48 for our target machine, according to the machine description,
49 we install it, delete the earlier insns, and update the data flow
50 information (LOG_LINKS and REG_NOTES) for what we did.
51
52 There are a few exceptions where the dataflow information created by
53 flow.c aren't completely updated:
54
55 - reg_live_length is not updated
56 - reg_n_refs is not adjusted in the rare case when a register is
57 no longer required in a computation
58 - there are extremely rare cases (see distribute_regnotes) when a
59 REG_DEAD note is lost
60 - a LOG_LINKS entry that refers to an insn with multiple SETs may be
663522cb 61 removed because there is no way to know which register it was
230d793d
RS
62 linking
63
64 To simplify substitution, we combine only when the earlier insn(s)
65 consist of only a single assignment. To simplify updating afterward,
66 we never combine when a subroutine call appears in the middle.
67
68 Since we do not represent assignments to CC0 explicitly except when that
69 is all an insn does, there is no LOG_LINKS entry in an insn that uses
70 the condition code for the insn that set the condition code.
71 Fortunately, these two insns must be consecutive.
72 Therefore, every JUMP_INSN is taken to have an implicit logical link
73 to the preceding insn. This is not quite right, since non-jumps can
74 also use the condition code; but in practice such insns would not
75 combine anyway. */
76
230d793d 77#include "config.h"
670ee920 78#include "system.h"
c5c76735 79#include "rtl.h"
a091679a 80#include "tm_p.h"
230d793d
RS
81#include "flags.h"
82#include "regs.h"
55310dad 83#include "hard-reg-set.h"
230d793d
RS
84#include "basic-block.h"
85#include "insn-config.h"
49ad7cfa 86#include "function.h"
ec5c56db 87/* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
d6f4ec51 88#include "expr.h"
230d793d
RS
89#include "insn-attr.h"
90#include "recog.h"
91#include "real.h"
2e107e9e 92#include "toplev.h"
f73ad30e 93
230d793d
RS
94/* It is not safe to use ordinary gen_lowpart in combine.
95 Use gen_lowpart_for_combine instead. See comments there. */
96#define gen_lowpart dont_use_gen_lowpart_you_dummy
97
98/* Number of attempts to combine instructions in this function. */
99
100static int combine_attempts;
101
102/* Number of attempts that got as far as substitution in this function. */
103
104static int combine_merges;
105
106/* Number of instructions combined with added SETs in this function. */
107
108static int combine_extras;
109
110/* Number of instructions combined in this function. */
111
112static int combine_successes;
113
114/* Totals over entire compilation. */
115
116static int total_attempts, total_merges, total_extras, total_successes;
9210df58 117
230d793d
RS
118\f
119/* Vector mapping INSN_UIDs to cuids.
5089e22e 120 The cuids are like uids but increase monotonically always.
230d793d
RS
121 Combine always uses cuids so that it can compare them.
122 But actually renumbering the uids, which we used to do,
123 proves to be a bad idea because it makes it hard to compare
124 the dumps produced by earlier passes with those from later passes. */
125
126static int *uid_cuid;
4255220d 127static int max_uid_cuid;
230d793d
RS
128
129/* Get the cuid of an insn. */
130
1427d6d2
RK
131#define INSN_CUID(INSN) \
132(INSN_UID (INSN) > max_uid_cuid ? insn_cuid (INSN) : uid_cuid[INSN_UID (INSN)])
230d793d 133
42a6ff51
AO
134/* In case BITS_PER_WORD == HOST_BITS_PER_WIDE_INT, shifting by
135 BITS_PER_WORD would invoke undefined behavior. Work around it. */
136
137#define UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD(val) \
138 (((unsigned HOST_WIDE_INT)(val) << (BITS_PER_WORD - 1)) << 1)
139
230d793d
RS
140/* Maximum register number, which is the size of the tables below. */
141
770ae6cc 142static unsigned int combine_max_regno;
230d793d
RS
143
144/* Record last point of death of (hard or pseudo) register n. */
145
146static rtx *reg_last_death;
147
148/* Record last point of modification of (hard or pseudo) register n. */
149
150static rtx *reg_last_set;
151
152/* Record the cuid of the last insn that invalidated memory
153 (anything that writes memory, and subroutine calls, but not pushes). */
154
155static int mem_last_set;
156
157/* Record the cuid of the last CALL_INSN
158 so we can tell whether a potential combination crosses any calls. */
159
160static int last_call_cuid;
161
162/* When `subst' is called, this is the insn that is being modified
163 (by combining in a previous insn). The PATTERN of this insn
164 is still the old pattern partially modified and it should not be
165 looked at, but this may be used to examine the successors of the insn
166 to judge whether a simplification is valid. */
167
168static rtx subst_insn;
169
0d9641d1
JW
170/* This is an insn that belongs before subst_insn, but is not currently
171 on the insn chain. */
172
173static rtx subst_prev_insn;
174
230d793d
RS
175/* This is the lowest CUID that `subst' is currently dealing with.
176 get_last_value will not return a value if the register was set at or
177 after this CUID. If not for this mechanism, we could get confused if
178 I2 or I1 in try_combine were an insn that used the old value of a register
179 to obtain a new value. In that case, we might erroneously get the
180 new value of the register when we wanted the old one. */
181
182static int subst_low_cuid;
183
6e25d159
RK
184/* This contains any hard registers that are used in newpat; reg_dead_at_p
185 must consider all these registers to be always live. */
186
187static HARD_REG_SET newpat_used_regs;
188
abe6e52f
RK
189/* This is an insn to which a LOG_LINKS entry has been added. If this
190 insn is the earlier than I2 or I3, combine should rescan starting at
191 that location. */
192
193static rtx added_links_insn;
194
0d4d42c3
RK
195/* Basic block number of the block in which we are performing combines. */
196static int this_basic_block;
715e7fbc 197
663522cb
KH
198/* A bitmap indicating which blocks had registers go dead at entry.
199 After combine, we'll need to re-do global life analysis with
715e7fbc
RH
200 those blocks as starting points. */
201static sbitmap refresh_blocks;
202static int need_refresh;
230d793d
RS
203\f
204/* The next group of arrays allows the recording of the last value assigned
205 to (hard or pseudo) register n. We use this information to see if a
5089e22e 206 operation being processed is redundant given a prior operation performed
230d793d
RS
207 on the register. For example, an `and' with a constant is redundant if
208 all the zero bits are already known to be turned off.
209
210 We use an approach similar to that used by cse, but change it in the
211 following ways:
212
213 (1) We do not want to reinitialize at each label.
214 (2) It is useful, but not critical, to know the actual value assigned
215 to a register. Often just its form is helpful.
216
217 Therefore, we maintain the following arrays:
218
219 reg_last_set_value the last value assigned
220 reg_last_set_label records the value of label_tick when the
221 register was assigned
222 reg_last_set_table_tick records the value of label_tick when a
223 value using the register is assigned
224 reg_last_set_invalid set to non-zero when it is not valid
225 to use the value of this register in some
226 register's value
227
228 To understand the usage of these tables, it is important to understand
229 the distinction between the value in reg_last_set_value being valid
230 and the register being validly contained in some other expression in the
231 table.
232
233 Entry I in reg_last_set_value is valid if it is non-zero, and either
234 reg_n_sets[i] is 1 or reg_last_set_label[i] == label_tick.
235
236 Register I may validly appear in any expression returned for the value
237 of another register if reg_n_sets[i] is 1. It may also appear in the
238 value for register J if reg_last_set_label[i] < reg_last_set_label[j] or
239 reg_last_set_invalid[j] is zero.
240
241 If an expression is found in the table containing a register which may
242 not validly appear in an expression, the register is replaced by
243 something that won't match, (clobber (const_int 0)).
244
245 reg_last_set_invalid[i] is set non-zero when register I is being assigned
246 to and reg_last_set_table_tick[i] == label_tick. */
247
0f41302f 248/* Record last value assigned to (hard or pseudo) register n. */
230d793d
RS
249
250static rtx *reg_last_set_value;
251
252/* Record the value of label_tick when the value for register n is placed in
253 reg_last_set_value[n]. */
254
568356af 255static int *reg_last_set_label;
230d793d
RS
256
257/* Record the value of label_tick when an expression involving register n
0f41302f 258 is placed in reg_last_set_value. */
230d793d 259
568356af 260static int *reg_last_set_table_tick;
230d793d
RS
261
262/* Set non-zero if references to register n in expressions should not be
263 used. */
264
265static char *reg_last_set_invalid;
266
0f41302f 267/* Incremented for each label. */
230d793d 268
568356af 269static int label_tick;
230d793d
RS
270
271/* Some registers that are set more than once and used in more than one
272 basic block are nevertheless always set in similar ways. For example,
273 a QImode register may be loaded from memory in two places on a machine
274 where byte loads zero extend.
275
951553af 276 We record in the following array what we know about the nonzero
230d793d
RS
277 bits of a register, specifically which bits are known to be zero.
278
279 If an entry is zero, it means that we don't know anything special. */
280
55310dad 281static unsigned HOST_WIDE_INT *reg_nonzero_bits;
230d793d 282
951553af 283/* Mode used to compute significance in reg_nonzero_bits. It is the largest
5f4f0e22 284 integer mode that can fit in HOST_BITS_PER_WIDE_INT. */
230d793d 285
951553af 286static enum machine_mode nonzero_bits_mode;
230d793d 287
d0ab8cd3
RK
288/* Nonzero if we know that a register has some leading bits that are always
289 equal to the sign bit. */
290
770ae6cc 291static unsigned char *reg_sign_bit_copies;
d0ab8cd3 292
951553af 293/* Nonzero when reg_nonzero_bits and reg_sign_bit_copies can be safely used.
1a26b032
RK
294 It is zero while computing them and after combine has completed. This
295 former test prevents propagating values based on previously set values,
296 which can be incorrect if a variable is modified in a loop. */
230d793d 297
951553af 298static int nonzero_sign_valid;
55310dad
RK
299
300/* These arrays are maintained in parallel with reg_last_set_value
301 and are used to store the mode in which the register was last set,
302 the bits that were known to be zero when it was last set, and the
303 number of sign bits copies it was known to have when it was last set. */
304
305static enum machine_mode *reg_last_set_mode;
306static unsigned HOST_WIDE_INT *reg_last_set_nonzero_bits;
307static char *reg_last_set_sign_bit_copies;
230d793d
RS
308\f
309/* Record one modification to rtl structure
310 to be undone by storing old_contents into *where.
311 is_int is 1 if the contents are an int. */
312
313struct undo
314{
241cea85 315 struct undo *next;
230d793d 316 int is_int;
0345195a
RK
317 union {rtx r; unsigned int i;} old_contents;
318 union {rtx *r; unsigned int *i;} where;
230d793d
RS
319};
320
321/* Record a bunch of changes to be undone, up to MAX_UNDO of them.
322 num_undo says how many are currently recorded.
323
230d793d 324 other_insn is nonzero if we have modified some other insn in the process
f1c6ba8b 325 of working on subst_insn. It must be verified too. */
230d793d
RS
326
327struct undobuf
328{
241cea85
RK
329 struct undo *undos;
330 struct undo *frees;
230d793d
RS
331 rtx other_insn;
332};
333
334static struct undobuf undobuf;
335
230d793d
RS
336/* Number of times the pseudo being substituted for
337 was found and replaced. */
338
339static int n_occurrences;
340
83d2b3b9 341static void do_SUBST PARAMS ((rtx *, rtx));
0345195a
RK
342static void do_SUBST_INT PARAMS ((unsigned int *,
343 unsigned int));
83d2b3b9
KG
344static void init_reg_last_arrays PARAMS ((void));
345static void setup_incoming_promotions PARAMS ((void));
346static void set_nonzero_bits_and_sign_copies PARAMS ((rtx, rtx, void *));
c3410241 347static int cant_combine_insn_p PARAMS ((rtx));
83d2b3b9
KG
348static int can_combine_p PARAMS ((rtx, rtx, rtx, rtx, rtx *, rtx *));
349static int sets_function_arg_p PARAMS ((rtx));
350static int combinable_i3pat PARAMS ((rtx, rtx *, rtx, rtx, int, rtx *));
351static int contains_muldiv PARAMS ((rtx));
44a76fc8 352static rtx try_combine PARAMS ((rtx, rtx, rtx, int *));
83d2b3b9
KG
353static void undo_all PARAMS ((void));
354static void undo_commit PARAMS ((void));
355static rtx *find_split_point PARAMS ((rtx *, rtx));
356static rtx subst PARAMS ((rtx, rtx, rtx, int, int));
357static rtx combine_simplify_rtx PARAMS ((rtx, enum machine_mode, int, int));
358static rtx simplify_if_then_else PARAMS ((rtx));
359static rtx simplify_set PARAMS ((rtx));
360static rtx simplify_logical PARAMS ((rtx, int));
361static rtx expand_compound_operation PARAMS ((rtx));
362static rtx expand_field_assignment PARAMS ((rtx));
770ae6cc
RK
363static rtx make_extraction PARAMS ((enum machine_mode, rtx, HOST_WIDE_INT,
364 rtx, unsigned HOST_WIDE_INT, int,
365 int, int));
83d2b3b9
KG
366static rtx extract_left_shift PARAMS ((rtx, int));
367static rtx make_compound_operation PARAMS ((rtx, enum rtx_code));
770ae6cc
RK
368static int get_pos_from_mask PARAMS ((unsigned HOST_WIDE_INT,
369 unsigned HOST_WIDE_INT *));
83d2b3b9
KG
370static rtx force_to_mode PARAMS ((rtx, enum machine_mode,
371 unsigned HOST_WIDE_INT, rtx, int));
372static rtx if_then_else_cond PARAMS ((rtx, rtx *, rtx *));
373static rtx known_cond PARAMS ((rtx, enum rtx_code, rtx, rtx));
374static int rtx_equal_for_field_assignment_p PARAMS ((rtx, rtx));
375static rtx make_field_assignment PARAMS ((rtx));
376static rtx apply_distributive_law PARAMS ((rtx));
377static rtx simplify_and_const_int PARAMS ((rtx, enum machine_mode, rtx,
378 unsigned HOST_WIDE_INT));
379static unsigned HOST_WIDE_INT nonzero_bits PARAMS ((rtx, enum machine_mode));
770ae6cc 380static unsigned int num_sign_bit_copies PARAMS ((rtx, enum machine_mode));
83d2b3b9
KG
381static int merge_outer_ops PARAMS ((enum rtx_code *, HOST_WIDE_INT *,
382 enum rtx_code, HOST_WIDE_INT,
383 enum machine_mode, int *));
384static rtx simplify_shift_const PARAMS ((rtx, enum rtx_code, enum machine_mode,
385 rtx, int));
386static int recog_for_combine PARAMS ((rtx *, rtx, rtx *));
387static rtx gen_lowpart_for_combine PARAMS ((enum machine_mode, rtx));
83d2b3b9
KG
388static rtx gen_binary PARAMS ((enum rtx_code, enum machine_mode,
389 rtx, rtx));
83d2b3b9 390static enum rtx_code simplify_comparison PARAMS ((enum rtx_code, rtx *, rtx *));
83d2b3b9
KG
391static void update_table_tick PARAMS ((rtx));
392static void record_value_for_reg PARAMS ((rtx, rtx, rtx));
393static void check_promoted_subreg PARAMS ((rtx, rtx));
394static void record_dead_and_set_regs_1 PARAMS ((rtx, rtx, void *));
395static void record_dead_and_set_regs PARAMS ((rtx));
396static int get_last_value_validate PARAMS ((rtx *, rtx, int, int));
397static rtx get_last_value PARAMS ((rtx));
398static int use_crosses_set_p PARAMS ((rtx, int));
399static void reg_dead_at_p_1 PARAMS ((rtx, rtx, void *));
400static int reg_dead_at_p PARAMS ((rtx, rtx));
401static void move_deaths PARAMS ((rtx, rtx, int, rtx, rtx *));
402static int reg_bitfield_target_p PARAMS ((rtx, rtx));
403static void distribute_notes PARAMS ((rtx, rtx, rtx, rtx, rtx, rtx));
404static void distribute_links PARAMS ((rtx));
405static void mark_used_regs_combine PARAMS ((rtx));
406static int insn_cuid PARAMS ((rtx));
c6991660 407static void record_promoted_value PARAMS ((rtx, rtx));
9a915772
JH
408static rtx reversed_comparison PARAMS ((rtx, enum machine_mode, rtx, rtx));
409static enum rtx_code combine_reversed_comparison_code PARAMS ((rtx));
230d793d 410\f
76095e2f
RH
411/* Substitute NEWVAL, an rtx expression, into INTO, a place in some
412 insn. The substitution can be undone by undo_all. If INTO is already
413 set to NEWVAL, do not record this change. Because computing NEWVAL might
414 also call SUBST, we have to compute it before we put anything into
415 the undo table. */
416
417static void
663522cb 418do_SUBST (into, newval)
76095e2f
RH
419 rtx *into, newval;
420{
421 struct undo *buf;
422 rtx oldval = *into;
423
424 if (oldval == newval)
425 return;
426
427 if (undobuf.frees)
428 buf = undobuf.frees, undobuf.frees = buf->next;
429 else
430 buf = (struct undo *) xmalloc (sizeof (struct undo));
431
432 buf->is_int = 0;
433 buf->where.r = into;
434 buf->old_contents.r = oldval;
435 *into = newval;
436
437 buf->next = undobuf.undos, undobuf.undos = buf;
438}
439
440#define SUBST(INTO, NEWVAL) do_SUBST(&(INTO), (NEWVAL))
441
442/* Similar to SUBST, but NEWVAL is an int expression. Note that substitution
443 for the value of a HOST_WIDE_INT value (including CONST_INT) is
444 not safe. */
445
446static void
663522cb 447do_SUBST_INT (into, newval)
0345195a 448 unsigned int *into, newval;
76095e2f
RH
449{
450 struct undo *buf;
0345195a 451 unsigned int oldval = *into;
76095e2f
RH
452
453 if (oldval == newval)
454 return;
455
456 if (undobuf.frees)
457 buf = undobuf.frees, undobuf.frees = buf->next;
458 else
459 buf = (struct undo *) xmalloc (sizeof (struct undo));
460
461 buf->is_int = 1;
462 buf->where.i = into;
463 buf->old_contents.i = oldval;
464 *into = newval;
465
466 buf->next = undobuf.undos, undobuf.undos = buf;
467}
468
469#define SUBST_INT(INTO, NEWVAL) do_SUBST_INT(&(INTO), (NEWVAL))
470\f
230d793d 471/* Main entry point for combiner. F is the first insn of the function.
663522cb 472 NREGS is the first unused pseudo-reg number.
230d793d 473
44a76fc8
AG
474 Return non-zero if the combiner has turned an indirect jump
475 instruction into a direct jump. */
476int
230d793d
RS
477combine_instructions (f, nregs)
478 rtx f;
770ae6cc 479 unsigned int nregs;
230d793d 480{
b729186a
JL
481 register rtx insn, next;
482#ifdef HAVE_cc0
483 register rtx prev;
484#endif
230d793d
RS
485 register int i;
486 register rtx links, nextlinks;
487
44a76fc8
AG
488 int new_direct_jump_p = 0;
489
230d793d
RS
490 combine_attempts = 0;
491 combine_merges = 0;
492 combine_extras = 0;
493 combine_successes = 0;
494
495 combine_max_regno = nregs;
496
663522cb 497 reg_nonzero_bits = ((unsigned HOST_WIDE_INT *)
c05ddfa7 498 xcalloc (nregs, sizeof (unsigned HOST_WIDE_INT)));
770ae6cc
RK
499 reg_sign_bit_copies
500 = (unsigned char *) xcalloc (nregs, sizeof (unsigned char));
c05ddfa7
MM
501
502 reg_last_death = (rtx *) xmalloc (nregs * sizeof (rtx));
503 reg_last_set = (rtx *) xmalloc (nregs * sizeof (rtx));
504 reg_last_set_value = (rtx *) xmalloc (nregs * sizeof (rtx));
505 reg_last_set_table_tick = (int *) xmalloc (nregs * sizeof (int));
506 reg_last_set_label = (int *) xmalloc (nregs * sizeof (int));
507 reg_last_set_invalid = (char *) xmalloc (nregs * sizeof (char));
55310dad 508 reg_last_set_mode
c05ddfa7 509 = (enum machine_mode *) xmalloc (nregs * sizeof (enum machine_mode));
55310dad 510 reg_last_set_nonzero_bits
c05ddfa7 511 = (unsigned HOST_WIDE_INT *) xmalloc (nregs * sizeof (HOST_WIDE_INT));
55310dad 512 reg_last_set_sign_bit_copies
c05ddfa7 513 = (char *) xmalloc (nregs * sizeof (char));
55310dad 514
ef026f91 515 init_reg_last_arrays ();
230d793d
RS
516
517 init_recog_no_volatile ();
518
519 /* Compute maximum uid value so uid_cuid can be allocated. */
520
521 for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
522 if (INSN_UID (insn) > i)
523 i = INSN_UID (insn);
524
c05ddfa7 525 uid_cuid = (int *) xmalloc ((i + 1) * sizeof (int));
4255220d 526 max_uid_cuid = i;
230d793d 527
951553af 528 nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
230d793d 529
951553af 530 /* Don't use reg_nonzero_bits when computing it. This can cause problems
230d793d
RS
531 when, for example, we have j <<= 1 in a loop. */
532
951553af 533 nonzero_sign_valid = 0;
230d793d
RS
534
535 /* Compute the mapping from uids to cuids.
536 Cuids are numbers assigned to insns, like uids,
663522cb 537 except that cuids increase monotonically through the code.
230d793d
RS
538
539 Scan all SETs and see if we can deduce anything about what
951553af 540 bits are known to be zero for some registers and how many copies
d79f08e0
RK
541 of the sign bit are known to exist for those registers.
542
543 Also set any known values so that we can use it while searching
544 for what bits are known to be set. */
545
546 label_tick = 1;
230d793d 547
bcd49eb7
JW
548 /* We need to initialize it here, because record_dead_and_set_regs may call
549 get_last_value. */
550 subst_prev_insn = NULL_RTX;
551
7988fd36
RK
552 setup_incoming_promotions ();
553
715e7fbc
RH
554 refresh_blocks = sbitmap_alloc (n_basic_blocks);
555 sbitmap_zero (refresh_blocks);
556 need_refresh = 0;
557
230d793d
RS
558 for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
559 {
4255220d 560 uid_cuid[INSN_UID (insn)] = ++i;
d79f08e0
RK
561 subst_low_cuid = i;
562 subst_insn = insn;
563
2c3c49de 564 if (INSN_P (insn))
d79f08e0 565 {
663522cb 566 note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
84832317 567 NULL);
d79f08e0 568 record_dead_and_set_regs (insn);
2dab894a
RK
569
570#ifdef AUTO_INC_DEC
571 for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
572 if (REG_NOTE_KIND (links) == REG_INC)
84832317
MM
573 set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
574 NULL);
2dab894a 575#endif
d79f08e0
RK
576 }
577
578 if (GET_CODE (insn) == CODE_LABEL)
579 label_tick++;
230d793d
RS
580 }
581
951553af 582 nonzero_sign_valid = 1;
230d793d
RS
583
584 /* Now scan all the insns in forward order. */
585
0d4d42c3 586 this_basic_block = -1;
230d793d
RS
587 label_tick = 1;
588 last_call_cuid = 0;
589 mem_last_set = 0;
ef026f91 590 init_reg_last_arrays ();
7988fd36
RK
591 setup_incoming_promotions ();
592
230d793d
RS
593 for (insn = f; insn; insn = next ? next : NEXT_INSN (insn))
594 {
595 next = 0;
596
0d4d42c3 597 /* If INSN starts a new basic block, update our basic block number. */
f085c9cd 598 if (this_basic_block + 1 < n_basic_blocks
3b413743 599 && BLOCK_HEAD (this_basic_block + 1) == insn)
0d4d42c3
RK
600 this_basic_block++;
601
230d793d
RS
602 if (GET_CODE (insn) == CODE_LABEL)
603 label_tick++;
604
2c3c49de 605 else if (INSN_P (insn))
230d793d 606 {
732f2ac9
JJ
607 /* See if we know about function return values before this
608 insn based upon SUBREG flags. */
609 check_promoted_subreg (insn, PATTERN (insn));
732f2ac9 610
230d793d
RS
611 /* Try this insn with each insn it links back to. */
612
613 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
663522cb 614 if ((next = try_combine (insn, XEXP (links, 0),
44a76fc8 615 NULL_RTX, &new_direct_jump_p)) != 0)
230d793d
RS
616 goto retry;
617
618 /* Try each sequence of three linked insns ending with this one. */
619
620 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
aabb6c74
NC
621 {
622 rtx link = XEXP (links, 0);
623
624 /* If the linked insn has been replaced by a note, then there
625 is no point in persuing this chain any further. */
626 if (GET_CODE (link) == NOTE)
627 break;
628
629 for (nextlinks = LOG_LINKS (link);
630 nextlinks;
631 nextlinks = XEXP (nextlinks, 1))
632 if ((next = try_combine (insn, XEXP (links, 0),
865f50c5
RH
633 XEXP (nextlinks, 0),
634 &new_direct_jump_p)) != 0)
aabb6c74
NC
635 goto retry;
636 }
230d793d
RS
637
638#ifdef HAVE_cc0
639 /* Try to combine a jump insn that uses CC0
640 with a preceding insn that sets CC0, and maybe with its
641 logical predecessor as well.
642 This is how we make decrement-and-branch insns.
643 We need this special code because data flow connections
644 via CC0 do not get entered in LOG_LINKS. */
645
646 if (GET_CODE (insn) == JUMP_INSN
647 && (prev = prev_nonnote_insn (insn)) != 0
648 && GET_CODE (prev) == INSN
649 && sets_cc0_p (PATTERN (prev)))
650 {
663522cb 651 if ((next = try_combine (insn, prev,
44a76fc8 652 NULL_RTX, &new_direct_jump_p)) != 0)
230d793d
RS
653 goto retry;
654
655 for (nextlinks = LOG_LINKS (prev); nextlinks;
656 nextlinks = XEXP (nextlinks, 1))
657 if ((next = try_combine (insn, prev,
44a76fc8
AG
658 XEXP (nextlinks, 0),
659 &new_direct_jump_p)) != 0)
230d793d
RS
660 goto retry;
661 }
662
663 /* Do the same for an insn that explicitly references CC0. */
664 if (GET_CODE (insn) == INSN
665 && (prev = prev_nonnote_insn (insn)) != 0
666 && GET_CODE (prev) == INSN
667 && sets_cc0_p (PATTERN (prev))
668 && GET_CODE (PATTERN (insn)) == SET
669 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
670 {
663522cb 671 if ((next = try_combine (insn, prev,
44a76fc8 672 NULL_RTX, &new_direct_jump_p)) != 0)
230d793d
RS
673 goto retry;
674
675 for (nextlinks = LOG_LINKS (prev); nextlinks;
676 nextlinks = XEXP (nextlinks, 1))
677 if ((next = try_combine (insn, prev,
44a76fc8
AG
678 XEXP (nextlinks, 0),
679 &new_direct_jump_p)) != 0)
230d793d
RS
680 goto retry;
681 }
682
683 /* Finally, see if any of the insns that this insn links to
684 explicitly references CC0. If so, try this insn, that insn,
5089e22e 685 and its predecessor if it sets CC0. */
230d793d
RS
686 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
687 if (GET_CODE (XEXP (links, 0)) == INSN
688 && GET_CODE (PATTERN (XEXP (links, 0))) == SET
689 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
690 && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
691 && GET_CODE (prev) == INSN
692 && sets_cc0_p (PATTERN (prev))
663522cb 693 && (next = try_combine (insn, XEXP (links, 0),
44a76fc8 694 prev, &new_direct_jump_p)) != 0)
230d793d
RS
695 goto retry;
696#endif
697
698 /* Try combining an insn with two different insns whose results it
699 uses. */
700 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
701 for (nextlinks = XEXP (links, 1); nextlinks;
702 nextlinks = XEXP (nextlinks, 1))
703 if ((next = try_combine (insn, XEXP (links, 0),
44a76fc8
AG
704 XEXP (nextlinks, 0),
705 &new_direct_jump_p)) != 0)
230d793d
RS
706 goto retry;
707
708 if (GET_CODE (insn) != NOTE)
709 record_dead_and_set_regs (insn);
710
711 retry:
712 ;
713 }
714 }
715
0005550b
JH
716 delete_noop_moves (f);
717
715e7fbc 718 if (need_refresh)
49c3bb12
RH
719 {
720 compute_bb_for_insn (get_max_uid ());
721 update_life_info (refresh_blocks, UPDATE_LIFE_GLOBAL_RM_NOTES,
663522cb 722 PROP_DEATH_NOTES);
49c3bb12 723 }
c05ddfa7
MM
724
725 /* Clean up. */
715e7fbc 726 sbitmap_free (refresh_blocks);
c05ddfa7
MM
727 free (reg_nonzero_bits);
728 free (reg_sign_bit_copies);
729 free (reg_last_death);
730 free (reg_last_set);
731 free (reg_last_set_value);
732 free (reg_last_set_table_tick);
733 free (reg_last_set_label);
734 free (reg_last_set_invalid);
735 free (reg_last_set_mode);
736 free (reg_last_set_nonzero_bits);
737 free (reg_last_set_sign_bit_copies);
738 free (uid_cuid);
715e7fbc 739
e7749837
RH
740 {
741 struct undo *undo, *next;
742 for (undo = undobuf.frees; undo; undo = next)
743 {
744 next = undo->next;
745 free (undo);
746 }
747 undobuf.frees = 0;
748 }
749
230d793d
RS
750 total_attempts += combine_attempts;
751 total_merges += combine_merges;
752 total_extras += combine_extras;
753 total_successes += combine_successes;
1a26b032 754
951553af 755 nonzero_sign_valid = 0;
972b320c
R
756
757 /* Make recognizer allow volatile MEMs again. */
758 init_recog ();
44a76fc8
AG
759
760 return new_direct_jump_p;
230d793d 761}
ef026f91
RS
762
763/* Wipe the reg_last_xxx arrays in preparation for another pass. */
764
765static void
766init_reg_last_arrays ()
767{
770ae6cc 768 unsigned int nregs = combine_max_regno;
ef026f91 769
961192e1
JM
770 memset ((char *) reg_last_death, 0, nregs * sizeof (rtx));
771 memset ((char *) reg_last_set, 0, nregs * sizeof (rtx));
772 memset ((char *) reg_last_set_value, 0, nregs * sizeof (rtx));
773 memset ((char *) reg_last_set_table_tick, 0, nregs * sizeof (int));
774 memset ((char *) reg_last_set_label, 0, nregs * sizeof (int));
775 memset (reg_last_set_invalid, 0, nregs * sizeof (char));
776 memset ((char *) reg_last_set_mode, 0, nregs * sizeof (enum machine_mode));
777 memset ((char *) reg_last_set_nonzero_bits, 0, nregs * sizeof (HOST_WIDE_INT));
778 memset (reg_last_set_sign_bit_copies, 0, nregs * sizeof (char));
ef026f91 779}
230d793d 780\f
7988fd36
RK
781/* Set up any promoted values for incoming argument registers. */
782
ee791cc3 783static void
7988fd36
RK
784setup_incoming_promotions ()
785{
786#ifdef PROMOTE_FUNCTION_ARGS
770ae6cc 787 unsigned int regno;
7988fd36
RK
788 rtx reg;
789 enum machine_mode mode;
790 int unsignedp;
791 rtx first = get_insns ();
792
c285f57a
JJ
793#ifndef OUTGOING_REGNO
794#define OUTGOING_REGNO(N) N
795#endif
7988fd36 796 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
c285f57a
JJ
797 /* Check whether this register can hold an incoming pointer
798 argument. FUNCTION_ARG_REGNO_P tests outgoing register
799 numbers, so translate if necessary due to register windows. */
800 if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (regno))
7988fd36 801 && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0)
38a448ca
RH
802 {
803 record_value_for_reg
804 (reg, first, gen_rtx_fmt_e ((unsignedp ? ZERO_EXTEND
805 : SIGN_EXTEND),
806 GET_MODE (reg),
807 gen_rtx_CLOBBER (mode, const0_rtx)));
808 }
7988fd36
RK
809#endif
810}
811\f
91102d5a
RK
812/* Called via note_stores. If X is a pseudo that is narrower than
813 HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
230d793d
RS
814
815 If we are setting only a portion of X and we can't figure out what
816 portion, assume all bits will be used since we don't know what will
d0ab8cd3
RK
817 be happening.
818
819 Similarly, set how many bits of X are known to be copies of the sign bit
663522cb 820 at all locations in the function. This is the smallest number implied
d0ab8cd3 821 by any set of X. */
230d793d
RS
822
823static void
84832317 824set_nonzero_bits_and_sign_copies (x, set, data)
230d793d
RS
825 rtx x;
826 rtx set;
84832317 827 void *data ATTRIBUTE_UNUSED;
230d793d 828{
770ae6cc 829 unsigned int num;
d0ab8cd3 830
230d793d
RS
831 if (GET_CODE (x) == REG
832 && REGNO (x) >= FIRST_PSEUDO_REGISTER
e8095e80
RK
833 /* If this register is undefined at the start of the file, we can't
834 say what its contents were. */
e881bb1b 835 && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, REGNO (x))
5f4f0e22 836 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
230d793d 837 {
2dab894a 838 if (set == 0 || GET_CODE (set) == CLOBBER)
e8095e80
RK
839 {
840 reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
88306d12 841 reg_sign_bit_copies[REGNO (x)] = 1;
e8095e80
RK
842 return;
843 }
230d793d
RS
844
845 /* If this is a complex assignment, see if we can convert it into a
5089e22e 846 simple assignment. */
230d793d 847 set = expand_field_assignment (set);
d79f08e0
RK
848
849 /* If this is a simple assignment, or we have a paradoxical SUBREG,
850 set what we know about X. */
851
852 if (SET_DEST (set) == x
853 || (GET_CODE (SET_DEST (set)) == SUBREG
705c7b3b
JW
854 && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
855 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
d79f08e0 856 && SUBREG_REG (SET_DEST (set)) == x))
d0ab8cd3 857 {
9afa3d54
RK
858 rtx src = SET_SRC (set);
859
860#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
861 /* If X is narrower than a word and SRC is a non-negative
862 constant that would appear negative in the mode of X,
863 sign-extend it for use in reg_nonzero_bits because some
864 machines (maybe most) will actually do the sign-extension
663522cb 865 and this is the conservative approach.
9afa3d54
RK
866
867 ??? For 2.5, try to tighten up the MD files in this regard
868 instead of this kludge. */
869
870 if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
871 && GET_CODE (src) == CONST_INT
872 && INTVAL (src) > 0
873 && 0 != (INTVAL (src)
874 & ((HOST_WIDE_INT) 1
9e69be8c 875 << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
9afa3d54
RK
876 src = GEN_INT (INTVAL (src)
877 | ((HOST_WIDE_INT) (-1)
878 << GET_MODE_BITSIZE (GET_MODE (x))));
879#endif
880
951553af 881 reg_nonzero_bits[REGNO (x)]
9afa3d54 882 |= nonzero_bits (src, nonzero_bits_mode);
d0ab8cd3
RK
883 num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
884 if (reg_sign_bit_copies[REGNO (x)] == 0
885 || reg_sign_bit_copies[REGNO (x)] > num)
886 reg_sign_bit_copies[REGNO (x)] = num;
887 }
230d793d 888 else
d0ab8cd3 889 {
951553af 890 reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
88306d12 891 reg_sign_bit_copies[REGNO (x)] = 1;
d0ab8cd3 892 }
230d793d
RS
893 }
894}
895\f
896/* See if INSN can be combined into I3. PRED and SUCC are optionally
897 insns that were previously combined into I3 or that will be combined
898 into the merger of INSN and I3.
899
900 Return 0 if the combination is not allowed for any reason.
901
663522cb 902 If the combination is allowed, *PDEST will be set to the single
230d793d
RS
903 destination of INSN and *PSRC to the single source, and this function
904 will return 1. */
905
906static int
907can_combine_p (insn, i3, pred, succ, pdest, psrc)
908 rtx insn;
909 rtx i3;
e51712db
KG
910 rtx pred ATTRIBUTE_UNUSED;
911 rtx succ;
230d793d
RS
912 rtx *pdest, *psrc;
913{
914 int i;
915 rtx set = 0, src, dest;
b729186a
JL
916 rtx p;
917#ifdef AUTO_INC_DEC
76d31c63 918 rtx link;
b729186a 919#endif
230d793d
RS
920 int all_adjacent = (succ ? (next_active_insn (insn) == succ
921 && next_active_insn (succ) == i3)
922 : next_active_insn (insn) == i3);
923
924 /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
663522cb 925 or a PARALLEL consisting of such a SET and CLOBBERs.
230d793d
RS
926
927 If INSN has CLOBBER parallel parts, ignore them for our processing.
928 By definition, these happen during the execution of the insn. When it
929 is merged with another insn, all bets are off. If they are, in fact,
930 needed and aren't also supplied in I3, they may be added by
663522cb 931 recog_for_combine. Otherwise, it won't match.
230d793d
RS
932
933 We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
934 note.
935
663522cb 936 Get the source and destination of INSN. If more than one, can't
230d793d 937 combine. */
663522cb 938
230d793d
RS
939 if (GET_CODE (PATTERN (insn)) == SET)
940 set = PATTERN (insn);
941 else if (GET_CODE (PATTERN (insn)) == PARALLEL
942 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
943 {
944 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
945 {
946 rtx elt = XVECEXP (PATTERN (insn), 0, i);
947
948 switch (GET_CODE (elt))
949 {
e3258cef
R
950 /* This is important to combine floating point insns
951 for the SH4 port. */
952 case USE:
953 /* Combining an isolated USE doesn't make sense.
954 We depend here on combinable_i3_pat to reject them. */
955 /* The code below this loop only verifies that the inputs of
956 the SET in INSN do not change. We call reg_set_between_p
957 to verify that the REG in the USE does not change betweeen
958 I3 and INSN.
959 If the USE in INSN was for a pseudo register, the matching
960 insn pattern will likely match any register; combining this
961 with any other USE would only be safe if we knew that the
962 used registers have identical values, or if there was
963 something to tell them apart, e.g. different modes. For
964 now, we forgo such compilcated tests and simply disallow
965 combining of USES of pseudo registers with any other USE. */
966 if (GET_CODE (XEXP (elt, 0)) == REG
967 && GET_CODE (PATTERN (i3)) == PARALLEL)
968 {
969 rtx i3pat = PATTERN (i3);
970 int i = XVECLEN (i3pat, 0) - 1;
770ae6cc
RK
971 unsigned int regno = REGNO (XEXP (elt, 0));
972
e3258cef
R
973 do
974 {
975 rtx i3elt = XVECEXP (i3pat, 0, i);
770ae6cc 976
e3258cef
R
977 if (GET_CODE (i3elt) == USE
978 && GET_CODE (XEXP (i3elt, 0)) == REG
979 && (REGNO (XEXP (i3elt, 0)) == regno
980 ? reg_set_between_p (XEXP (elt, 0),
981 PREV_INSN (insn), i3)
982 : regno >= FIRST_PSEUDO_REGISTER))
983 return 0;
984 }
985 while (--i >= 0);
986 }
987 break;
988
230d793d
RS
989 /* We can ignore CLOBBERs. */
990 case CLOBBER:
991 break;
992
993 case SET:
994 /* Ignore SETs whose result isn't used but not those that
995 have side-effects. */
996 if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
997 && ! side_effects_p (elt))
998 break;
999
1000 /* If we have already found a SET, this is a second one and
1001 so we cannot combine with this insn. */
1002 if (set)
1003 return 0;
1004
1005 set = elt;
1006 break;
1007
1008 default:
1009 /* Anything else means we can't combine. */
1010 return 0;
1011 }
1012 }
1013
1014 if (set == 0
1015 /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1016 so don't do anything with it. */
1017 || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1018 return 0;
1019 }
1020 else
1021 return 0;
1022
1023 if (set == 0)
1024 return 0;
1025
1026 set = expand_field_assignment (set);
1027 src = SET_SRC (set), dest = SET_DEST (set);
1028
1029 /* Don't eliminate a store in the stack pointer. */
1030 if (dest == stack_pointer_rtx
230d793d
RS
1031 /* If we couldn't eliminate a field assignment, we can't combine. */
1032 || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == STRICT_LOW_PART
1033 /* Don't combine with an insn that sets a register to itself if it has
1034 a REG_EQUAL note. This may be part of a REG_NO_CONFLICT sequence. */
5f4f0e22 1035 || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
62f7f1f5
GK
1036 /* Can't merge an ASM_OPERANDS. */
1037 || GET_CODE (src) == ASM_OPERANDS
230d793d
RS
1038 /* Can't merge a function call. */
1039 || GET_CODE (src) == CALL
cd5e8f1f 1040 /* Don't eliminate a function call argument. */
4dca5ec5
RK
1041 || (GET_CODE (i3) == CALL_INSN
1042 && (find_reg_fusage (i3, USE, dest)
1043 || (GET_CODE (dest) == REG
1044 && REGNO (dest) < FIRST_PSEUDO_REGISTER
1045 && global_regs[REGNO (dest)])))
230d793d
RS
1046 /* Don't substitute into an incremented register. */
1047 || FIND_REG_INC_NOTE (i3, dest)
1048 || (succ && FIND_REG_INC_NOTE (succ, dest))
ec35104c 1049#if 0
230d793d 1050 /* Don't combine the end of a libcall into anything. */
ec35104c
JL
1051 /* ??? This gives worse code, and appears to be unnecessary, since no
1052 pass after flow uses REG_LIBCALL/REG_RETVAL notes. Local-alloc does
1053 use REG_RETVAL notes for noconflict blocks, but other code here
1054 makes sure that those insns don't disappear. */
5f4f0e22 1055 || find_reg_note (insn, REG_RETVAL, NULL_RTX)
ec35104c 1056#endif
230d793d
RS
1057 /* Make sure that DEST is not used after SUCC but before I3. */
1058 || (succ && ! all_adjacent
1059 && reg_used_between_p (dest, succ, i3))
1060 /* Make sure that the value that is to be substituted for the register
1061 does not use any registers whose values alter in between. However,
1062 If the insns are adjacent, a use can't cross a set even though we
1063 think it might (this can happen for a sequence of insns each setting
1064 the same destination; reg_last_set of that register might point to
d81481d3
RK
1065 a NOTE). If INSN has a REG_EQUIV note, the register is always
1066 equivalent to the memory so the substitution is valid even if there
1067 are intervening stores. Also, don't move a volatile asm or
1068 UNSPEC_VOLATILE across any other insns. */
230d793d 1069 || (! all_adjacent
d81481d3
RK
1070 && (((GET_CODE (src) != MEM
1071 || ! find_reg_note (insn, REG_EQUIV, src))
1072 && use_crosses_set_p (src, INSN_CUID (insn)))
a66a10c7
RS
1073 || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1074 || GET_CODE (src) == UNSPEC_VOLATILE))
230d793d
RS
1075 /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get
1076 better register allocation by not doing the combine. */
1077 || find_reg_note (i3, REG_NO_CONFLICT, dest)
1078 || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest))
1079 /* Don't combine across a CALL_INSN, because that would possibly
1080 change whether the life span of some REGs crosses calls or not,
1081 and it is a pain to update that information.
1082 Exception: if source is a constant, moving it later can't hurt.
1083 Accept that special case, because it helps -fforce-addr a lot. */
1084 || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src)))
1085 return 0;
1086
1087 /* DEST must either be a REG or CC0. */
1088 if (GET_CODE (dest) == REG)
1089 {
1090 /* If register alignment is being enforced for multi-word items in all
1091 cases except for parameters, it is possible to have a register copy
1092 insn referencing a hard register that is not allowed to contain the
1093 mode being copied and which would not be valid as an operand of most
1094 insns. Eliminate this problem by not combining with such an insn.
1095
1096 Also, on some machines we don't want to extend the life of a hard
53895717 1097 register. */
230d793d
RS
1098
1099 if (GET_CODE (src) == REG
1100 && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1101 && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
c448a43e
RK
1102 /* Don't extend the life of a hard register unless it is
1103 user variable (if we have few registers) or it can't
1104 fit into the desired register (meaning something special
ecd40809
RK
1105 is going on).
1106 Also avoid substituting a return register into I3, because
1107 reload can't handle a conflict with constraints of other
1108 inputs. */
230d793d 1109 || (REGNO (src) < FIRST_PSEUDO_REGISTER
53895717 1110 && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
230d793d
RS
1111 return 0;
1112 }
1113 else if (GET_CODE (dest) != CC0)
1114 return 0;
1115
5f96750d
RS
1116 /* Don't substitute for a register intended as a clobberable operand.
1117 Similarly, don't substitute an expression containing a register that
1118 will be clobbered in I3. */
230d793d
RS
1119 if (GET_CODE (PATTERN (i3)) == PARALLEL)
1120 for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1121 if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER
5f96750d
RS
1122 && (reg_overlap_mentioned_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0),
1123 src)
1124 || rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest)))
230d793d
RS
1125 return 0;
1126
1127 /* If INSN contains anything volatile, or is an `asm' (whether volatile
d276f2bb 1128 or not), reject, unless nothing volatile comes between it and I3 */
230d793d
RS
1129
1130 if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
d276f2bb
CM
1131 {
1132 /* Make sure succ doesn't contain a volatile reference. */
1133 if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1134 return 0;
663522cb 1135
d276f2bb 1136 for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
2c3c49de 1137 if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
23190837 1138 return 0;
d276f2bb 1139 }
230d793d 1140
b79ee7eb
RH
1141 /* If INSN is an asm, and DEST is a hard register, reject, since it has
1142 to be an explicit register variable, and was chosen for a reason. */
1143
1144 if (GET_CODE (src) == ASM_OPERANDS
1145 && GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1146 return 0;
1147
4b2cb4a2
RS
1148 /* If there are any volatile insns between INSN and I3, reject, because
1149 they might affect machine state. */
1150
1151 for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
2c3c49de 1152 if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
4b2cb4a2
RS
1153 return 0;
1154
230d793d
RS
1155 /* If INSN or I2 contains an autoincrement or autodecrement,
1156 make sure that register is not used between there and I3,
1157 and not already used in I3 either.
1158 Also insist that I3 not be a jump; if it were one
1159 and the incremented register were spilled, we would lose. */
1160
1161#ifdef AUTO_INC_DEC
1162 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1163 if (REG_NOTE_KIND (link) == REG_INC
1164 && (GET_CODE (i3) == JUMP_INSN
1165 || reg_used_between_p (XEXP (link, 0), insn, i3)
1166 || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1167 return 0;
1168#endif
1169
1170#ifdef HAVE_cc0
1171 /* Don't combine an insn that follows a CC0-setting insn.
1172 An insn that uses CC0 must not be separated from the one that sets it.
1173 We do, however, allow I2 to follow a CC0-setting insn if that insn
1174 is passed as I1; in that case it will be deleted also.
1175 We also allow combining in this case if all the insns are adjacent
1176 because that would leave the two CC0 insns adjacent as well.
1177 It would be more logical to test whether CC0 occurs inside I1 or I2,
1178 but that would be much slower, and this ought to be equivalent. */
1179
1180 p = prev_nonnote_insn (insn);
1181 if (p && p != pred && GET_CODE (p) == INSN && sets_cc0_p (PATTERN (p))
1182 && ! all_adjacent)
1183 return 0;
1184#endif
1185
1186 /* If we get here, we have passed all the tests and the combination is
1187 to be allowed. */
1188
1189 *pdest = dest;
1190 *psrc = src;
1191
1192 return 1;
1193}
1194\f
956d6950
JL
1195/* Check if PAT is an insn - or a part of it - used to set up an
1196 argument for a function in a hard register. */
1197
1198static int
1199sets_function_arg_p (pat)
1200 rtx pat;
1201{
1202 int i;
1203 rtx inner_dest;
1204
1205 switch (GET_CODE (pat))
1206 {
1207 case INSN:
1208 return sets_function_arg_p (PATTERN (pat));
1209
1210 case PARALLEL:
1211 for (i = XVECLEN (pat, 0); --i >= 0;)
1212 if (sets_function_arg_p (XVECEXP (pat, 0, i)))
1213 return 1;
1214
1215 break;
1216
1217 case SET:
1218 inner_dest = SET_DEST (pat);
1219 while (GET_CODE (inner_dest) == STRICT_LOW_PART
1220 || GET_CODE (inner_dest) == SUBREG
1221 || GET_CODE (inner_dest) == ZERO_EXTRACT)
1222 inner_dest = XEXP (inner_dest, 0);
1223
1224 return (GET_CODE (inner_dest) == REG
1225 && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1226 && FUNCTION_ARG_REGNO_P (REGNO (inner_dest)));
1d300e19
KG
1227
1228 default:
1229 break;
956d6950
JL
1230 }
1231
1232 return 0;
1233}
1234
230d793d
RS
1235/* LOC is the location within I3 that contains its pattern or the component
1236 of a PARALLEL of the pattern. We validate that it is valid for combining.
1237
1238 One problem is if I3 modifies its output, as opposed to replacing it
1239 entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1240 so would produce an insn that is not equivalent to the original insns.
1241
1242 Consider:
1243
1244 (set (reg:DI 101) (reg:DI 100))
1245 (set (subreg:SI (reg:DI 101) 0) <foo>)
1246
1247 This is NOT equivalent to:
1248
1249 (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
23190837 1250 (set (reg:DI 101) (reg:DI 100))])
230d793d
RS
1251
1252 Not only does this modify 100 (in which case it might still be valid
663522cb 1253 if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
230d793d
RS
1254
1255 We can also run into a problem if I2 sets a register that I1
1256 uses and I1 gets directly substituted into I3 (not via I2). In that
1257 case, we would be getting the wrong value of I2DEST into I3, so we
1258 must reject the combination. This case occurs when I2 and I1 both
1259 feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1260 If I1_NOT_IN_SRC is non-zero, it means that finding I1 in the source
1261 of a SET must prevent combination from occurring.
1262
230d793d
RS
1263 Before doing the above check, we first try to expand a field assignment
1264 into a set of logical operations.
1265
1266 If PI3_DEST_KILLED is non-zero, it is a pointer to a location in which
1267 we place a register that is both set and used within I3. If more than one
1268 such register is detected, we fail.
1269
1270 Return 1 if the combination is valid, zero otherwise. */
1271
1272static int
1273combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed)
1274 rtx i3;
1275 rtx *loc;
1276 rtx i2dest;
1277 rtx i1dest;
1278 int i1_not_in_src;
1279 rtx *pi3dest_killed;
1280{
1281 rtx x = *loc;
1282
1283 if (GET_CODE (x) == SET)
1284 {
1285 rtx set = expand_field_assignment (x);
1286 rtx dest = SET_DEST (set);
1287 rtx src = SET_SRC (set);
29a82058 1288 rtx inner_dest = dest;
663522cb 1289
29a82058
JL
1290#if 0
1291 rtx inner_src = src;
1292#endif
230d793d
RS
1293
1294 SUBST (*loc, set);
1295
1296 while (GET_CODE (inner_dest) == STRICT_LOW_PART
1297 || GET_CODE (inner_dest) == SUBREG
1298 || GET_CODE (inner_dest) == ZERO_EXTRACT)
1299 inner_dest = XEXP (inner_dest, 0);
1300
1301 /* We probably don't need this any more now that LIMIT_RELOAD_CLASS
1302 was added. */
1303#if 0
1304 while (GET_CODE (inner_src) == STRICT_LOW_PART
1305 || GET_CODE (inner_src) == SUBREG
1306 || GET_CODE (inner_src) == ZERO_EXTRACT)
1307 inner_src = XEXP (inner_src, 0);
1308
1309 /* If it is better that two different modes keep two different pseudos,
1310 avoid combining them. This avoids producing the following pattern
1311 on a 386:
1312 (set (subreg:SI (reg/v:QI 21) 0)
1313 (lshiftrt:SI (reg/v:SI 20)
1314 (const_int 24)))
1315 If that were made, reload could not handle the pair of
1316 reg 20/21, since it would try to get any GENERAL_REGS
1317 but some of them don't handle QImode. */
1318
1319 if (rtx_equal_p (inner_src, i2dest)
1320 && GET_CODE (inner_dest) == REG
1321 && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (inner_dest)))
1322 return 0;
1323#endif
1324
1325 /* Check for the case where I3 modifies its output, as
1326 discussed above. */
1327 if ((inner_dest != dest
1328 && (reg_overlap_mentioned_p (i2dest, inner_dest)
1329 || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
956d6950 1330
53895717
BS
1331 /* This is the same test done in can_combine_p except we can't test
1332 all_adjacent; we don't have to, since this instruction will stay
1333 in place, thus we are not considering increasing the lifetime of
1334 INNER_DEST.
956d6950
JL
1335
1336 Also, if this insn sets a function argument, combining it with
1337 something that might need a spill could clobber a previous
1338 function argument; the all_adjacent test in can_combine_p also
1339 checks this; here, we do a more specific test for this case. */
663522cb 1340
230d793d 1341 || (GET_CODE (inner_dest) == REG
dfbe1b2f 1342 && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
c448a43e 1343 && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
53895717 1344 GET_MODE (inner_dest))))
230d793d
RS
1345 || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1346 return 0;
1347
1348 /* If DEST is used in I3, it is being killed in this insn,
663522cb 1349 so record that for later.
36a9c2e9
JL
1350 Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1351 STACK_POINTER_REGNUM, since these are always considered to be
1352 live. Similarly for ARG_POINTER_REGNUM if it is fixed. */
230d793d 1353 if (pi3dest_killed && GET_CODE (dest) == REG
36a9c2e9
JL
1354 && reg_referenced_p (dest, PATTERN (i3))
1355 && REGNO (dest) != FRAME_POINTER_REGNUM
6d7096b0
DE
1356#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1357 && REGNO (dest) != HARD_FRAME_POINTER_REGNUM
1358#endif
36a9c2e9
JL
1359#if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1360 && (REGNO (dest) != ARG_POINTER_REGNUM
1361 || ! fixed_regs [REGNO (dest)])
1362#endif
1363 && REGNO (dest) != STACK_POINTER_REGNUM)
230d793d
RS
1364 {
1365 if (*pi3dest_killed)
1366 return 0;
1367
1368 *pi3dest_killed = dest;
1369 }
1370 }
1371
1372 else if (GET_CODE (x) == PARALLEL)
1373 {
1374 int i;
1375
1376 for (i = 0; i < XVECLEN (x, 0); i++)
1377 if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1378 i1_not_in_src, pi3dest_killed))
1379 return 0;
1380 }
1381
1382 return 1;
1383}
1384\f
14a774a9
RK
1385/* Return 1 if X is an arithmetic expression that contains a multiplication
1386 and division. We don't count multiplications by powers of two here. */
1387
1388static int
1389contains_muldiv (x)
1390 rtx x;
1391{
1392 switch (GET_CODE (x))
1393 {
1394 case MOD: case DIV: case UMOD: case UDIV:
1395 return 1;
1396
1397 case MULT:
1398 return ! (GET_CODE (XEXP (x, 1)) == CONST_INT
1399 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0);
1400 default:
1401 switch (GET_RTX_CLASS (GET_CODE (x)))
1402 {
1403 case 'c': case '<': case '2':
1404 return contains_muldiv (XEXP (x, 0))
1405 || contains_muldiv (XEXP (x, 1));
1406
1407 case '1':
1408 return contains_muldiv (XEXP (x, 0));
1409
1410 default:
1411 return 0;
1412 }
1413 }
1414}
1415\f
c3410241
BS
1416/* Determine whether INSN can be used in a combination. Return nonzero if
1417 not. This is used in try_combine to detect early some cases where we
1418 can't perform combinations. */
1419
1420static int
1421cant_combine_insn_p (insn)
1422 rtx insn;
1423{
1424 rtx set;
1425 rtx src, dest;
23190837 1426
c3410241
BS
1427 /* If this isn't really an insn, we can't do anything.
1428 This can occur when flow deletes an insn that it has merged into an
1429 auto-increment address. */
1430 if (! INSN_P (insn))
1431 return 1;
1432
1433 /* Never combine loads and stores involving hard regs. The register
1434 allocator can usually handle such reg-reg moves by tying. If we allow
1435 the combiner to make substitutions of hard regs, we risk aborting in
1436 reload on machines that have SMALL_REGISTER_CLASSES.
1437 As an exception, we allow combinations involving fixed regs; these are
1438 not available to the register allocator so there's no risk involved. */
1439
1440 set = single_set (insn);
1441 if (! set)
1442 return 0;
1443 src = SET_SRC (set);
1444 dest = SET_DEST (set);
ad334b51
JH
1445 if (GET_CODE (src) == SUBREG)
1446 src = SUBREG_REG (src);
1447 if (GET_CODE (dest) == SUBREG)
1448 dest = SUBREG_REG (dest);
53895717
BS
1449 if (REG_P (src) && REG_P (dest)
1450 && ((REGNO (src) < FIRST_PSEUDO_REGISTER
1451 && ! fixed_regs[REGNO (src)])
1452 || (REGNO (dest) < FIRST_PSEUDO_REGISTER
1453 && ! fixed_regs[REGNO (dest)])))
c3410241 1454 return 1;
53895717 1455
c3410241
BS
1456 return 0;
1457}
1458
230d793d
RS
1459/* Try to combine the insns I1 and I2 into I3.
1460 Here I1 and I2 appear earlier than I3.
1461 I1 can be zero; then we combine just I2 into I3.
663522cb 1462
04956a1a 1463 If we are combining three insns and the resulting insn is not recognized,
230d793d
RS
1464 try splitting it into two insns. If that happens, I2 and I3 are retained
1465 and I1 is pseudo-deleted by turning it into a NOTE. Otherwise, I1 and I2
1466 are pseudo-deleted.
1467
663522cb 1468 Return 0 if the combination does not work. Then nothing is changed.
abe6e52f 1469 If we did the combination, return the insn at which combine should
663522cb
KH
1470 resume scanning.
1471
44a76fc8
AG
1472 Set NEW_DIRECT_JUMP_P to a non-zero value if try_combine creates a
1473 new direct jump instruction. */
230d793d
RS
1474
1475static rtx
44a76fc8 1476try_combine (i3, i2, i1, new_direct_jump_p)
230d793d 1477 register rtx i3, i2, i1;
44a76fc8 1478 register int *new_direct_jump_p;
230d793d 1479{
02359929 1480 /* New patterns for I3 and I2, respectively. */
230d793d
RS
1481 rtx newpat, newi2pat = 0;
1482 /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead. */
1483 int added_sets_1, added_sets_2;
1484 /* Total number of SETs to put into I3. */
1485 int total_sets;
1486 /* Nonzero is I2's body now appears in I3. */
1487 int i2_is_used;
1488 /* INSN_CODEs for new I3, new I2, and user of condition code. */
6a651371 1489 int insn_code_number, i2_code_number = 0, other_code_number = 0;
230d793d
RS
1490 /* Contains I3 if the destination of I3 is used in its source, which means
1491 that the old life of I3 is being killed. If that usage is placed into
1492 I2 and not in I3, a REG_DEAD note must be made. */
1493 rtx i3dest_killed = 0;
1494 /* SET_DEST and SET_SRC of I2 and I1. */
1495 rtx i2dest, i2src, i1dest = 0, i1src = 0;
1496 /* PATTERN (I2), or a copy of it in certain cases. */
1497 rtx i2pat;
1498 /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC. */
c4e861e8 1499 int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
230d793d
RS
1500 int i1_feeds_i3 = 0;
1501 /* Notes that must be added to REG_NOTES in I3 and I2. */
1502 rtx new_i3_notes, new_i2_notes;
176c9e6b
JW
1503 /* Notes that we substituted I3 into I2 instead of the normal case. */
1504 int i3_subst_into_i2 = 0;
df7d75de
RK
1505 /* Notes that I1, I2 or I3 is a MULT operation. */
1506 int have_mult = 0;
230d793d
RS
1507
1508 int maxreg;
1509 rtx temp;
1510 register rtx link;
1511 int i;
1512
c3410241
BS
1513 /* Exit early if one of the insns involved can't be used for
1514 combinations. */
1515 if (cant_combine_insn_p (i3)
1516 || cant_combine_insn_p (i2)
1517 || (i1 && cant_combine_insn_p (i1))
1518 /* We also can't do anything if I3 has a
1519 REG_LIBCALL note since we don't want to disrupt the contiguity of a
1520 libcall. */
ec35104c
JL
1521#if 0
1522 /* ??? This gives worse code, and appears to be unnecessary, since no
1523 pass after flow uses REG_LIBCALL/REG_RETVAL notes. */
1524 || find_reg_note (i3, REG_LIBCALL, NULL_RTX)
1525#endif
663522cb 1526 )
230d793d
RS
1527 return 0;
1528
1529 combine_attempts++;
230d793d
RS
1530 undobuf.other_insn = 0;
1531
6e25d159
RK
1532 /* Reset the hard register usage information. */
1533 CLEAR_HARD_REG_SET (newpat_used_regs);
1534
230d793d
RS
1535 /* If I1 and I2 both feed I3, they can be in any order. To simplify the
1536 code below, set I1 to be the earlier of the two insns. */
1537 if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
1538 temp = i1, i1 = i2, i2 = temp;
1539
abe6e52f 1540 added_links_insn = 0;
137e889e 1541
230d793d 1542 /* First check for one important special-case that the code below will
c7be4f66 1543 not handle. Namely, the case where I1 is zero, I2 is a PARALLEL
230d793d
RS
1544 and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case,
1545 we may be able to replace that destination with the destination of I3.
1546 This occurs in the common code where we compute both a quotient and
1547 remainder into a structure, in which case we want to do the computation
1548 directly into the structure to avoid register-register copies.
1549
c7be4f66
RK
1550 Note that this case handles both multiple sets in I2 and also
1551 cases where I2 has a number of CLOBBER or PARALLELs.
1552
230d793d
RS
1553 We make very conservative checks below and only try to handle the
1554 most common cases of this. For example, we only handle the case
1555 where I2 and I3 are adjacent to avoid making difficult register
1556 usage tests. */
1557
1558 if (i1 == 0 && GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET
1559 && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1560 && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
230d793d
RS
1561 && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
1562 && GET_CODE (PATTERN (i2)) == PARALLEL
1563 && ! side_effects_p (SET_DEST (PATTERN (i3)))
5089e22e
RS
1564 /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
1565 below would need to check what is inside (and reg_overlap_mentioned_p
1566 doesn't support those codes anyway). Don't allow those destinations;
1567 the resulting insn isn't likely to be recognized anyway. */
1568 && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
1569 && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
230d793d
RS
1570 && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
1571 SET_DEST (PATTERN (i3)))
1572 && next_real_insn (i2) == i3)
5089e22e
RS
1573 {
1574 rtx p2 = PATTERN (i2);
1575
1576 /* Make sure that the destination of I3,
1577 which we are going to substitute into one output of I2,
1578 is not used within another output of I2. We must avoid making this:
1579 (parallel [(set (mem (reg 69)) ...)
1580 (set (reg 69) ...)])
1581 which is not well-defined as to order of actions.
1582 (Besides, reload can't handle output reloads for this.)
1583
1584 The problem can also happen if the dest of I3 is a memory ref,
1585 if another dest in I2 is an indirect memory ref. */
1586 for (i = 0; i < XVECLEN (p2, 0); i++)
7ca919b7
RK
1587 if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1588 || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
5089e22e
RS
1589 && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
1590 SET_DEST (XVECEXP (p2, 0, i))))
1591 break;
230d793d 1592
5089e22e
RS
1593 if (i == XVECLEN (p2, 0))
1594 for (i = 0; i < XVECLEN (p2, 0); i++)
481c7efa
FS
1595 if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1596 || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1597 && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
5089e22e
RS
1598 {
1599 combine_merges++;
230d793d 1600
5089e22e
RS
1601 subst_insn = i3;
1602 subst_low_cuid = INSN_CUID (i2);
230d793d 1603
c4e861e8 1604 added_sets_2 = added_sets_1 = 0;
5089e22e 1605 i2dest = SET_SRC (PATTERN (i3));
230d793d 1606
5089e22e
RS
1607 /* Replace the dest in I2 with our dest and make the resulting
1608 insn the new pattern for I3. Then skip to where we
1609 validate the pattern. Everything was set up above. */
663522cb 1610 SUBST (SET_DEST (XVECEXP (p2, 0, i)),
5089e22e
RS
1611 SET_DEST (PATTERN (i3)));
1612
1613 newpat = p2;
176c9e6b 1614 i3_subst_into_i2 = 1;
5089e22e
RS
1615 goto validate_replacement;
1616 }
1617 }
230d793d 1618
667c1c2c
RK
1619 /* If I2 is setting a double-word pseudo to a constant and I3 is setting
1620 one of those words to another constant, merge them by making a new
1621 constant. */
1622 if (i1 == 0
1623 && (temp = single_set (i2)) != 0
1624 && (GET_CODE (SET_SRC (temp)) == CONST_INT
1625 || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
1626 && GET_CODE (SET_DEST (temp)) == REG
1627 && GET_MODE_CLASS (GET_MODE (SET_DEST (temp))) == MODE_INT
1628 && GET_MODE_SIZE (GET_MODE (SET_DEST (temp))) == 2 * UNITS_PER_WORD
1629 && GET_CODE (PATTERN (i3)) == SET
1630 && GET_CODE (SET_DEST (PATTERN (i3))) == SUBREG
1631 && SUBREG_REG (SET_DEST (PATTERN (i3))) == SET_DEST (temp)
1632 && GET_MODE_CLASS (GET_MODE (SET_DEST (PATTERN (i3)))) == MODE_INT
1633 && GET_MODE_SIZE (GET_MODE (SET_DEST (PATTERN (i3)))) == UNITS_PER_WORD
1634 && GET_CODE (SET_SRC (PATTERN (i3))) == CONST_INT)
1635 {
1636 HOST_WIDE_INT lo, hi;
1637
1638 if (GET_CODE (SET_SRC (temp)) == CONST_INT)
1639 lo = INTVAL (SET_SRC (temp)), hi = lo < 0 ? -1 : 0;
1640 else
1641 {
1642 lo = CONST_DOUBLE_LOW (SET_SRC (temp));
1643 hi = CONST_DOUBLE_HIGH (SET_SRC (temp));
1644 }
1645
1646 if (subreg_lowpart_p (SET_DEST (PATTERN (i3))))
48b4d901
AO
1647 {
1648 /* We don't handle the case of the target word being wider
1649 than a host wide int. */
1650 if (HOST_BITS_PER_WIDE_INT < BITS_PER_WORD)
1651 abort ();
1652
42a6ff51 1653 lo &= ~(UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1);
48b4d901
AO
1654 lo |= INTVAL (SET_SRC (PATTERN (i3)));
1655 }
1656 else if (HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
667c1c2c 1657 hi = INTVAL (SET_SRC (PATTERN (i3)));
48b4d901
AO
1658 else if (HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD)
1659 {
1660 int sign = -(int) ((unsigned HOST_WIDE_INT) lo
1661 >> (HOST_BITS_PER_WIDE_INT - 1));
1662
42a6ff51
AO
1663 lo &= ~ (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1664 (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1665 lo |= (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1666 (INTVAL (SET_SRC (PATTERN (i3)))));
48b4d901
AO
1667 if (hi == sign)
1668 hi = lo < 0 ? -1 : 0;
1669 }
1670 else
1671 /* We don't handle the case of the higher word not fitting
1672 entirely in either hi or lo. */
1673 abort ();
667c1c2c
RK
1674
1675 combine_merges++;
1676 subst_insn = i3;
1677 subst_low_cuid = INSN_CUID (i2);
1678 added_sets_2 = added_sets_1 = 0;
1679 i2dest = SET_DEST (temp);
1680
1681 SUBST (SET_SRC (temp),
1682 immed_double_const (lo, hi, GET_MODE (SET_DEST (temp))));
1683
1684 newpat = PATTERN (i2);
667c1c2c
RK
1685 goto validate_replacement;
1686 }
1687
230d793d
RS
1688#ifndef HAVE_cc0
1689 /* If we have no I1 and I2 looks like:
1690 (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
1691 (set Y OP)])
1692 make up a dummy I1 that is
1693 (set Y OP)
1694 and change I2 to be
1695 (set (reg:CC X) (compare:CC Y (const_int 0)))
1696
1697 (We can ignore any trailing CLOBBERs.)
1698
1699 This undoes a previous combination and allows us to match a branch-and-
1700 decrement insn. */
1701
1702 if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
1703 && XVECLEN (PATTERN (i2), 0) >= 2
1704 && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
1705 && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
1706 == MODE_CC)
1707 && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
1708 && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
1709 && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
1710 && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 1))) == REG
1711 && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
1712 SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
1713 {
663522cb 1714 for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
230d793d
RS
1715 if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
1716 break;
1717
1718 if (i == 1)
1719 {
1720 /* We make I1 with the same INSN_UID as I2. This gives it
1721 the same INSN_CUID for value tracking. Our fake I1 will
1722 never appear in the insn stream so giving it the same INSN_UID
1723 as I2 will not cause a problem. */
1724
0d9641d1 1725 subst_prev_insn = i1
38a448ca
RH
1726 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
1727 XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
1728 NULL_RTX);
230d793d
RS
1729
1730 SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
1731 SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
1732 SET_DEST (PATTERN (i1)));
1733 }
1734 }
1735#endif
1736
1737 /* Verify that I2 and I1 are valid for combining. */
5f4f0e22
CH
1738 if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
1739 || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
230d793d
RS
1740 {
1741 undo_all ();
1742 return 0;
1743 }
1744
1745 /* Record whether I2DEST is used in I2SRC and similarly for the other
1746 cases. Knowing this will help in register status updating below. */
1747 i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
1748 i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
1749 i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
1750
916f14f1 1751 /* See if I1 directly feeds into I3. It does if I1DEST is not used
230d793d
RS
1752 in I2SRC. */
1753 i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
1754
1755 /* Ensure that I3's pattern can be the destination of combines. */
1756 if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
1757 i1 && i2dest_in_i1src && i1_feeds_i3,
1758 &i3dest_killed))
1759 {
1760 undo_all ();
1761 return 0;
1762 }
1763
df7d75de
RK
1764 /* See if any of the insns is a MULT operation. Unless one is, we will
1765 reject a combination that is, since it must be slower. Be conservative
1766 here. */
1767 if (GET_CODE (i2src) == MULT
1768 || (i1 != 0 && GET_CODE (i1src) == MULT)
1769 || (GET_CODE (PATTERN (i3)) == SET
1770 && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
1771 have_mult = 1;
1772
230d793d
RS
1773 /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
1774 We used to do this EXCEPT in one case: I3 has a post-inc in an
1775 output operand. However, that exception can give rise to insns like
23190837 1776 mov r3,(r3)+
230d793d 1777 which is a famous insn on the PDP-11 where the value of r3 used as the
5089e22e 1778 source was model-dependent. Avoid this sort of thing. */
230d793d
RS
1779
1780#if 0
1781 if (!(GET_CODE (PATTERN (i3)) == SET
1782 && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1783 && GET_CODE (SET_DEST (PATTERN (i3))) == MEM
1784 && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
1785 || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
1786 /* It's not the exception. */
1787#endif
1788#ifdef AUTO_INC_DEC
1789 for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
1790 if (REG_NOTE_KIND (link) == REG_INC
1791 && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
1792 || (i1 != 0
1793 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
1794 {
1795 undo_all ();
1796 return 0;
1797 }
1798#endif
1799
1800 /* See if the SETs in I1 or I2 need to be kept around in the merged
1801 instruction: whenever the value set there is still needed past I3.
1802 For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
1803
1804 For the SET in I1, we have two cases: If I1 and I2 independently
1805 feed into I3, the set in I1 needs to be kept around if I1DEST dies
1806 or is set in I3. Otherwise (if I1 feeds I2 which feeds I3), the set
1807 in I1 needs to be kept around unless I1DEST dies or is set in either
1808 I2 or I3. We can distinguish these cases by seeing if I2SRC mentions
1809 I1DEST. If so, we know I1 feeds into I2. */
1810
1811 added_sets_2 = ! dead_or_set_p (i3, i2dest);
1812
1813 added_sets_1
1814 = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
1815 : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
1816
1817 /* If the set in I2 needs to be kept around, we must make a copy of
1818 PATTERN (I2), so that when we substitute I1SRC for I1DEST in
5089e22e 1819 PATTERN (I2), we are only substituting for the original I1DEST, not into
230d793d
RS
1820 an already-substituted copy. This also prevents making self-referential
1821 rtx. If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
1822 I2DEST. */
1823
1824 i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL
38a448ca 1825 ? gen_rtx_SET (VOIDmode, i2dest, i2src)
230d793d
RS
1826 : PATTERN (i2));
1827
1828 if (added_sets_2)
1829 i2pat = copy_rtx (i2pat);
1830
1831 combine_merges++;
1832
1833 /* Substitute in the latest insn for the regs set by the earlier ones. */
1834
1835 maxreg = max_reg_num ();
1836
1837 subst_insn = i3;
230d793d
RS
1838
1839 /* It is possible that the source of I2 or I1 may be performing an
1840 unneeded operation, such as a ZERO_EXTEND of something that is known
1841 to have the high part zero. Handle that case by letting subst look at
1842 the innermost one of them.
1843
1844 Another way to do this would be to have a function that tries to
1845 simplify a single insn instead of merging two or more insns. We don't
1846 do this because of the potential of infinite loops and because
1847 of the potential extra memory required. However, doing it the way
1848 we are is a bit of a kludge and doesn't catch all cases.
1849
1850 But only do this if -fexpensive-optimizations since it slows things down
1851 and doesn't usually win. */
1852
1853 if (flag_expensive_optimizations)
1854 {
1855 /* Pass pc_rtx so no substitutions are done, just simplifications.
1856 The cases that we are interested in here do not involve the few
1857 cases were is_replaced is checked. */
1858 if (i1)
d0ab8cd3
RK
1859 {
1860 subst_low_cuid = INSN_CUID (i1);
1861 i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
1862 }
230d793d 1863 else
d0ab8cd3
RK
1864 {
1865 subst_low_cuid = INSN_CUID (i2);
1866 i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
1867 }
230d793d
RS
1868 }
1869
1870#ifndef HAVE_cc0
1871 /* Many machines that don't use CC0 have insns that can both perform an
1872 arithmetic operation and set the condition code. These operations will
1873 be represented as a PARALLEL with the first element of the vector
1874 being a COMPARE of an arithmetic operation with the constant zero.
1875 The second element of the vector will set some pseudo to the result
1876 of the same arithmetic operation. If we simplify the COMPARE, we won't
1877 match such a pattern and so will generate an extra insn. Here we test
1878 for this case, where both the comparison and the operation result are
1879 needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
1880 I2SRC. Later we will make the PARALLEL that contains I2. */
1881
1882 if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
1883 && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
1884 && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
1885 && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
1886 {
081f5e7e 1887#ifdef EXTRA_CC_MODES
230d793d
RS
1888 rtx *cc_use;
1889 enum machine_mode compare_mode;
081f5e7e 1890#endif
230d793d
RS
1891
1892 newpat = PATTERN (i3);
1893 SUBST (XEXP (SET_SRC (newpat), 0), i2src);
1894
1895 i2_is_used = 1;
1896
1897#ifdef EXTRA_CC_MODES
1898 /* See if a COMPARE with the operand we substituted in should be done
1899 with the mode that is currently being used. If not, do the same
1900 processing we do in `subst' for a SET; namely, if the destination
1901 is used only once, try to replace it with a register of the proper
1902 mode and also replace the COMPARE. */
1903 if (undobuf.other_insn == 0
1904 && (cc_use = find_single_use (SET_DEST (newpat), i3,
1905 &undobuf.other_insn))
77fa0940
RK
1906 && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
1907 i2src, const0_rtx))
230d793d
RS
1908 != GET_MODE (SET_DEST (newpat))))
1909 {
770ae6cc 1910 unsigned int regno = REGNO (SET_DEST (newpat));
38a448ca 1911 rtx new_dest = gen_rtx_REG (compare_mode, regno);
230d793d
RS
1912
1913 if (regno < FIRST_PSEUDO_REGISTER
b1f21e0a 1914 || (REG_N_SETS (regno) == 1 && ! added_sets_2
230d793d
RS
1915 && ! REG_USERVAR_P (SET_DEST (newpat))))
1916 {
1917 if (regno >= FIRST_PSEUDO_REGISTER)
1918 SUBST (regno_reg_rtx[regno], new_dest);
1919
1920 SUBST (SET_DEST (newpat), new_dest);
1921 SUBST (XEXP (*cc_use, 0), new_dest);
1922 SUBST (SET_SRC (newpat),
f1c6ba8b 1923 gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
230d793d
RS
1924 }
1925 else
1926 undobuf.other_insn = 0;
1927 }
663522cb 1928#endif
230d793d
RS
1929 }
1930 else
1931#endif
1932 {
1933 n_occurrences = 0; /* `subst' counts here */
1934
1935 /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
1936 need to make a unique copy of I2SRC each time we substitute it
1937 to avoid self-referential rtl. */
1938
d0ab8cd3 1939 subst_low_cuid = INSN_CUID (i2);
230d793d
RS
1940 newpat = subst (PATTERN (i3), i2dest, i2src, 0,
1941 ! i1_feeds_i3 && i1dest_in_i1src);
230d793d
RS
1942
1943 /* Record whether i2's body now appears within i3's body. */
1944 i2_is_used = n_occurrences;
1945 }
1946
1947 /* If we already got a failure, don't try to do more. Otherwise,
1948 try to substitute in I1 if we have it. */
1949
1950 if (i1 && GET_CODE (newpat) != CLOBBER)
1951 {
1952 /* Before we can do this substitution, we must redo the test done
1953 above (see detailed comments there) that ensures that I1DEST
0f41302f 1954 isn't mentioned in any SETs in NEWPAT that are field assignments. */
230d793d 1955
5f4f0e22 1956 if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
6496a589 1957 0, (rtx*)0))
230d793d
RS
1958 {
1959 undo_all ();
1960 return 0;
1961 }
1962
1963 n_occurrences = 0;
d0ab8cd3 1964 subst_low_cuid = INSN_CUID (i1);
230d793d 1965 newpat = subst (newpat, i1dest, i1src, 0, 0);
230d793d
RS
1966 }
1967
916f14f1
RK
1968 /* Fail if an autoincrement side-effect has been duplicated. Be careful
1969 to count all the ways that I2SRC and I1SRC can be used. */
5f4f0e22 1970 if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
916f14f1 1971 && i2_is_used + added_sets_2 > 1)
5f4f0e22 1972 || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
916f14f1
RK
1973 && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
1974 > 1))
230d793d
RS
1975 /* Fail if we tried to make a new register (we used to abort, but there's
1976 really no reason to). */
1977 || max_reg_num () != maxreg
1978 /* Fail if we couldn't do something and have a CLOBBER. */
df7d75de
RK
1979 || GET_CODE (newpat) == CLOBBER
1980 /* Fail if this new pattern is a MULT and we didn't have one before
1981 at the outer level. */
1982 || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
1983 && ! have_mult))
230d793d
RS
1984 {
1985 undo_all ();
1986 return 0;
1987 }
1988
1989 /* If the actions of the earlier insns must be kept
1990 in addition to substituting them into the latest one,
1991 we must make a new PARALLEL for the latest insn
1992 to hold additional the SETs. */
1993
1994 if (added_sets_1 || added_sets_2)
1995 {
1996 combine_extras++;
1997
1998 if (GET_CODE (newpat) == PARALLEL)
1999 {
2000 rtvec old = XVEC (newpat, 0);
2001 total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
38a448ca 2002 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
d38a30c9
KG
2003 memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
2004 sizeof (old->elem[0]) * old->num_elem);
230d793d
RS
2005 }
2006 else
2007 {
2008 rtx old = newpat;
2009 total_sets = 1 + added_sets_1 + added_sets_2;
38a448ca 2010 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
230d793d
RS
2011 XVECEXP (newpat, 0, 0) = old;
2012 }
2013
2014 if (added_sets_1)
2015 XVECEXP (newpat, 0, --total_sets)
2016 = (GET_CODE (PATTERN (i1)) == PARALLEL
38a448ca 2017 ? gen_rtx_SET (VOIDmode, i1dest, i1src) : PATTERN (i1));
230d793d
RS
2018
2019 if (added_sets_2)
c5c76735
JL
2020 {
2021 /* If there is no I1, use I2's body as is. We used to also not do
2022 the subst call below if I2 was substituted into I3,
2023 but that could lose a simplification. */
2024 if (i1 == 0)
2025 XVECEXP (newpat, 0, --total_sets) = i2pat;
2026 else
2027 /* See comment where i2pat is assigned. */
2028 XVECEXP (newpat, 0, --total_sets)
2029 = subst (i2pat, i1dest, i1src, 0, 0);
2030 }
230d793d
RS
2031 }
2032
2033 /* We come here when we are replacing a destination in I2 with the
2034 destination of I3. */
2035 validate_replacement:
2036
6e25d159
RK
2037 /* Note which hard regs this insn has as inputs. */
2038 mark_used_regs_combine (newpat);
2039
230d793d 2040 /* Is the result of combination a valid instruction? */
8e2f6e35 2041 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
230d793d
RS
2042
2043 /* If the result isn't valid, see if it is a PARALLEL of two SETs where
2044 the second SET's destination is a register that is unused. In that case,
2045 we just need the first SET. This can occur when simplifying a divmod
2046 insn. We *must* test for this case here because the code below that
2047 splits two independent SETs doesn't handle this case correctly when it
2048 updates the register status. Also check the case where the first
2049 SET's destination is unused. That would not cause incorrect code, but
2050 does cause an unneeded insn to remain. */
2051
2052 if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
2053 && XVECLEN (newpat, 0) == 2
2054 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2055 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2056 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == REG
2057 && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 1)))
2058 && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 1)))
2059 && asm_noperands (newpat) < 0)
2060 {
2061 newpat = XVECEXP (newpat, 0, 0);
8e2f6e35 2062 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
230d793d
RS
2063 }
2064
2065 else if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
2066 && XVECLEN (newpat, 0) == 2
2067 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2068 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2069 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) == REG
2070 && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 0)))
2071 && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 0)))
2072 && asm_noperands (newpat) < 0)
2073 {
2074 newpat = XVECEXP (newpat, 0, 1);
8e2f6e35 2075 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
230d793d
RS
2076 }
2077
2078 /* If we were combining three insns and the result is a simple SET
2079 with no ASM_OPERANDS that wasn't recognized, try to split it into two
663522cb 2080 insns. There are two ways to do this. It can be split using a
916f14f1
RK
2081 machine-specific method (like when you have an addition of a large
2082 constant) or by combine in the function find_split_point. */
2083
230d793d
RS
2084 if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
2085 && asm_noperands (newpat) < 0)
2086 {
916f14f1 2087 rtx m_split, *split;
42495ca0 2088 rtx ni2dest = i2dest;
916f14f1
RK
2089
2090 /* See if the MD file can split NEWPAT. If it can't, see if letting it
42495ca0
RK
2091 use I2DEST as a scratch register will help. In the latter case,
2092 convert I2DEST to the mode of the source of NEWPAT if we can. */
916f14f1
RK
2093
2094 m_split = split_insns (newpat, i3);
a70c61d9
JW
2095
2096 /* We can only use I2DEST as a scratch reg if it doesn't overlap any
2097 inputs of NEWPAT. */
2098
2099 /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
2100 possible to try that as a scratch reg. This would require adding
2101 more code to make it work though. */
2102
2103 if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat))
42495ca0
RK
2104 {
2105 /* If I2DEST is a hard register or the only use of a pseudo,
2106 we can change its mode. */
2107 if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest)
02f4ada4 2108 && GET_MODE (SET_DEST (newpat)) != VOIDmode
60654f77 2109 && GET_CODE (i2dest) == REG
42495ca0 2110 && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
b1f21e0a 2111 || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
42495ca0 2112 && ! REG_USERVAR_P (i2dest))))
38a448ca 2113 ni2dest = gen_rtx_REG (GET_MODE (SET_DEST (newpat)),
c5c76735
JL
2114 REGNO (i2dest));
2115
2116 m_split = split_insns (gen_rtx_PARALLEL
2117 (VOIDmode,
2118 gen_rtvec (2, newpat,
2119 gen_rtx_CLOBBER (VOIDmode,
2120 ni2dest))),
2121 i3);
5dd3e650
R
2122 /* If the split with the mode-changed register didn't work, try
2123 the original register. */
2124 if (! m_split && ni2dest != i2dest)
c7ca5912
RK
2125 {
2126 ni2dest = i2dest;
2127 m_split = split_insns (gen_rtx_PARALLEL
2128 (VOIDmode,
2129 gen_rtvec (2, newpat,
2130 gen_rtx_CLOBBER (VOIDmode,
2131 i2dest))),
2132 i3);
2133 }
42495ca0 2134 }
916f14f1 2135
d340408c
RH
2136 if (m_split && GET_CODE (m_split) != SEQUENCE)
2137 {
2138 insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
2139 if (insn_code_number >= 0)
2140 newpat = m_split;
23190837 2141 }
d340408c
RH
2142 else if (m_split && GET_CODE (m_split) == SEQUENCE
2143 && XVECLEN (m_split, 0) == 2
2144 && (next_real_insn (i2) == i3
2145 || ! use_crosses_set_p (PATTERN (XVECEXP (m_split, 0, 0)),
2146 INSN_CUID (i2))))
916f14f1 2147 {
1a26b032 2148 rtx i2set, i3set;
d0ab8cd3 2149 rtx newi3pat = PATTERN (XVECEXP (m_split, 0, 1));
916f14f1 2150 newi2pat = PATTERN (XVECEXP (m_split, 0, 0));
916f14f1 2151
e4ba89be
RK
2152 i3set = single_set (XVECEXP (m_split, 0, 1));
2153 i2set = single_set (XVECEXP (m_split, 0, 0));
1a26b032 2154
42495ca0
RK
2155 /* In case we changed the mode of I2DEST, replace it in the
2156 pseudo-register table here. We can't do it above in case this
2157 code doesn't get executed and we do a split the other way. */
2158
2159 if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2160 SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest);
2161
8e2f6e35 2162 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
1a26b032
RK
2163
2164 /* If I2 or I3 has multiple SETs, we won't know how to track
9cc96794
RK
2165 register status, so don't use these insns. If I2's destination
2166 is used between I2 and I3, we also can't use these insns. */
1a26b032 2167
9cc96794
RK
2168 if (i2_code_number >= 0 && i2set && i3set
2169 && (next_real_insn (i2) == i3
2170 || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
8e2f6e35
BS
2171 insn_code_number = recog_for_combine (&newi3pat, i3,
2172 &new_i3_notes);
d0ab8cd3
RK
2173 if (insn_code_number >= 0)
2174 newpat = newi3pat;
2175
c767f54b 2176 /* It is possible that both insns now set the destination of I3.
22609cbf 2177 If so, we must show an extra use of it. */
c767f54b 2178
393de53f
RK
2179 if (insn_code_number >= 0)
2180 {
2181 rtx new_i3_dest = SET_DEST (i3set);
2182 rtx new_i2_dest = SET_DEST (i2set);
2183
2184 while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
2185 || GET_CODE (new_i3_dest) == STRICT_LOW_PART
2186 || GET_CODE (new_i3_dest) == SUBREG)
2187 new_i3_dest = XEXP (new_i3_dest, 0);
2188
d4096689
RK
2189 while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
2190 || GET_CODE (new_i2_dest) == STRICT_LOW_PART
2191 || GET_CODE (new_i2_dest) == SUBREG)
2192 new_i2_dest = XEXP (new_i2_dest, 0);
2193
393de53f
RK
2194 if (GET_CODE (new_i3_dest) == REG
2195 && GET_CODE (new_i2_dest) == REG
2196 && REGNO (new_i3_dest) == REGNO (new_i2_dest))
b1f21e0a 2197 REG_N_SETS (REGNO (new_i2_dest))++;
393de53f 2198 }
916f14f1 2199 }
230d793d
RS
2200
2201 /* If we can split it and use I2DEST, go ahead and see if that
2202 helps things be recognized. Verify that none of the registers
2203 are set between I2 and I3. */
d0ab8cd3 2204 if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
230d793d
RS
2205#ifdef HAVE_cc0
2206 && GET_CODE (i2dest) == REG
2207#endif
2208 /* We need I2DEST in the proper mode. If it is a hard register
2209 or the only use of a pseudo, we can change its mode. */
2210 && (GET_MODE (*split) == GET_MODE (i2dest)
2211 || GET_MODE (*split) == VOIDmode
2212 || REGNO (i2dest) < FIRST_PSEUDO_REGISTER
b1f21e0a 2213 || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
230d793d
RS
2214 && ! REG_USERVAR_P (i2dest)))
2215 && (next_real_insn (i2) == i3
2216 || ! use_crosses_set_p (*split, INSN_CUID (i2)))
2217 /* We can't overwrite I2DEST if its value is still used by
2218 NEWPAT. */
2219 && ! reg_referenced_p (i2dest, newpat))
2220 {
2221 rtx newdest = i2dest;
df7d75de
RK
2222 enum rtx_code split_code = GET_CODE (*split);
2223 enum machine_mode split_mode = GET_MODE (*split);
230d793d
RS
2224
2225 /* Get NEWDEST as a register in the proper mode. We have already
2226 validated that we can do this. */
df7d75de 2227 if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
230d793d 2228 {
38a448ca 2229 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
230d793d
RS
2230
2231 if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2232 SUBST (regno_reg_rtx[REGNO (i2dest)], newdest);
2233 }
2234
2235 /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
2236 an ASHIFT. This can occur if it was inside a PLUS and hence
2237 appeared to be a memory address. This is a kludge. */
df7d75de 2238 if (split_code == MULT
230d793d 2239 && GET_CODE (XEXP (*split, 1)) == CONST_INT
1568d79b 2240 && INTVAL (XEXP (*split, 1)) > 0
230d793d 2241 && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
1dc8a823 2242 {
f1c6ba8b
RK
2243 SUBST (*split, gen_rtx_ASHIFT (split_mode,
2244 XEXP (*split, 0), GEN_INT (i)));
1dc8a823
JW
2245 /* Update split_code because we may not have a multiply
2246 anymore. */
2247 split_code = GET_CODE (*split);
2248 }
230d793d
RS
2249
2250#ifdef INSN_SCHEDULING
2251 /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
2252 be written as a ZERO_EXTEND. */
df7d75de 2253 if (split_code == SUBREG && GET_CODE (SUBREG_REG (*split)) == MEM)
f1c6ba8b 2254 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
ddef6bc7 2255 SUBREG_REG (*split)));
230d793d
RS
2256#endif
2257
f1c6ba8b 2258 newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
230d793d 2259 SUBST (*split, newdest);
8e2f6e35 2260 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
df7d75de
RK
2261
2262 /* If the split point was a MULT and we didn't have one before,
2263 don't use one now. */
2264 if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
8e2f6e35 2265 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
230d793d
RS
2266 }
2267 }
2268
2269 /* Check for a case where we loaded from memory in a narrow mode and
2270 then sign extended it, but we need both registers. In that case,
2271 we have a PARALLEL with both loads from the same memory location.
2272 We can split this into a load from memory followed by a register-register
2273 copy. This saves at least one insn, more if register allocation can
f0343c74
RK
2274 eliminate the copy.
2275
2276 We cannot do this if the destination of the second assignment is
2277 a register that we have already assumed is zero-extended. Similarly
2278 for a SUBREG of such a register. */
230d793d
RS
2279
2280 else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2281 && GET_CODE (newpat) == PARALLEL
2282 && XVECLEN (newpat, 0) == 2
2283 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2284 && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
2285 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2286 && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2287 XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
2288 && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2289 INSN_CUID (i2))
2290 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2291 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
f0343c74
RK
2292 && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
2293 (GET_CODE (temp) == REG
2294 && reg_nonzero_bits[REGNO (temp)] != 0
2295 && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2296 && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2297 && (reg_nonzero_bits[REGNO (temp)]
2298 != GET_MODE_MASK (word_mode))))
2299 && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
2300 && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
2301 (GET_CODE (temp) == REG
2302 && reg_nonzero_bits[REGNO (temp)] != 0
2303 && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2304 && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2305 && (reg_nonzero_bits[REGNO (temp)]
2306 != GET_MODE_MASK (word_mode)))))
230d793d
RS
2307 && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2308 SET_SRC (XVECEXP (newpat, 0, 1)))
2309 && ! find_reg_note (i3, REG_UNUSED,
2310 SET_DEST (XVECEXP (newpat, 0, 0))))
2311 {
472fbdd1
RK
2312 rtx ni2dest;
2313
230d793d 2314 newi2pat = XVECEXP (newpat, 0, 0);
472fbdd1 2315 ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
230d793d
RS
2316 newpat = XVECEXP (newpat, 0, 1);
2317 SUBST (SET_SRC (newpat),
472fbdd1 2318 gen_lowpart_for_combine (GET_MODE (SET_SRC (newpat)), ni2dest));
8e2f6e35 2319 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
a29ca9db 2320
230d793d 2321 if (i2_code_number >= 0)
8e2f6e35 2322 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
5089e22e
RS
2323
2324 if (insn_code_number >= 0)
2325 {
2326 rtx insn;
2327 rtx link;
2328
2329 /* If we will be able to accept this, we have made a change to the
2330 destination of I3. This can invalidate a LOG_LINKS pointing
2331 to I3. No other part of combine.c makes such a transformation.
2332
2333 The new I3 will have a destination that was previously the
2334 destination of I1 or I2 and which was used in i2 or I3. Call
2335 distribute_links to make a LOG_LINK from the next use of
2336 that destination. */
2337
2338 PATTERN (i3) = newpat;
38a448ca 2339 distribute_links (gen_rtx_INSN_LIST (VOIDmode, i3, NULL_RTX));
5089e22e
RS
2340
2341 /* I3 now uses what used to be its destination and which is
2342 now I2's destination. That means we need a LOG_LINK from
2343 I3 to I2. But we used to have one, so we still will.
2344
2345 However, some later insn might be using I2's dest and have
2346 a LOG_LINK pointing at I3. We must remove this link.
2347 The simplest way to remove the link is to point it at I1,
2348 which we know will be a NOTE. */
2349
2350 for (insn = NEXT_INSN (i3);
0d4d42c3 2351 insn && (this_basic_block == n_basic_blocks - 1
3b413743 2352 || insn != BLOCK_HEAD (this_basic_block + 1));
5089e22e
RS
2353 insn = NEXT_INSN (insn))
2354 {
2c3c49de 2355 if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
5089e22e
RS
2356 {
2357 for (link = LOG_LINKS (insn); link;
2358 link = XEXP (link, 1))
2359 if (XEXP (link, 0) == i3)
2360 XEXP (link, 0) = i1;
2361
2362 break;
2363 }
2364 }
2365 }
230d793d 2366 }
663522cb 2367
230d793d
RS
2368 /* Similarly, check for a case where we have a PARALLEL of two independent
2369 SETs but we started with three insns. In this case, we can do the sets
2370 as two separate insns. This case occurs when some SET allows two
2371 other insns to combine, but the destination of that SET is still live. */
2372
2373 else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2374 && GET_CODE (newpat) == PARALLEL
2375 && XVECLEN (newpat, 0) == 2
2376 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2377 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
2378 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
2379 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2380 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2381 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2382 && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2383 INSN_CUID (i2))
2384 /* Don't pass sets with (USE (MEM ...)) dests to the following. */
2385 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE
2386 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE
2387 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2388 XVECEXP (newpat, 0, 0))
2389 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
14a774a9
RK
2390 XVECEXP (newpat, 0, 1))
2391 && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
2392 && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
230d793d 2393 {
e9a25f70
JL
2394 /* Normally, it doesn't matter which of the two is done first,
2395 but it does if one references cc0. In that case, it has to
2396 be first. */
2397#ifdef HAVE_cc0
2398 if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
2399 {
2400 newi2pat = XVECEXP (newpat, 0, 0);
2401 newpat = XVECEXP (newpat, 0, 1);
2402 }
2403 else
2404#endif
2405 {
2406 newi2pat = XVECEXP (newpat, 0, 1);
2407 newpat = XVECEXP (newpat, 0, 0);
2408 }
230d793d 2409
8e2f6e35 2410 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
a29ca9db 2411
230d793d 2412 if (i2_code_number >= 0)
8e2f6e35 2413 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
230d793d
RS
2414 }
2415
2416 /* If it still isn't recognized, fail and change things back the way they
2417 were. */
2418 if ((insn_code_number < 0
2419 /* Is the result a reasonable ASM_OPERANDS? */
2420 && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
2421 {
2422 undo_all ();
2423 return 0;
2424 }
2425
2426 /* If we had to change another insn, make sure it is valid also. */
2427 if (undobuf.other_insn)
2428 {
230d793d
RS
2429 rtx other_pat = PATTERN (undobuf.other_insn);
2430 rtx new_other_notes;
2431 rtx note, next;
2432
6e25d159
RK
2433 CLEAR_HARD_REG_SET (newpat_used_regs);
2434
8e2f6e35
BS
2435 other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
2436 &new_other_notes);
230d793d
RS
2437
2438 if (other_code_number < 0 && ! check_asm_operands (other_pat))
2439 {
2440 undo_all ();
2441 return 0;
2442 }
2443
2444 PATTERN (undobuf.other_insn) = other_pat;
2445
2446 /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
2447 are still valid. Then add any non-duplicate notes added by
2448 recog_for_combine. */
2449 for (note = REG_NOTES (undobuf.other_insn); note; note = next)
2450 {
2451 next = XEXP (note, 1);
2452
2453 if (REG_NOTE_KIND (note) == REG_UNUSED
2454 && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
1a26b032
RK
2455 {
2456 if (GET_CODE (XEXP (note, 0)) == REG)
b1f21e0a 2457 REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
1a26b032
RK
2458
2459 remove_note (undobuf.other_insn, note);
2460 }
230d793d
RS
2461 }
2462
1a26b032
RK
2463 for (note = new_other_notes; note; note = XEXP (note, 1))
2464 if (GET_CODE (XEXP (note, 0)) == REG)
b1f21e0a 2465 REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
1a26b032 2466
230d793d 2467 distribute_notes (new_other_notes, undobuf.other_insn,
5f4f0e22 2468 undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
230d793d 2469 }
5ef17dd2 2470#ifdef HAVE_cc0
663522cb 2471 /* If I2 is the setter CC0 and I3 is the user CC0 then check whether
ec5c56db 2472 they are adjacent to each other or not. */
5ef17dd2
CC
2473 {
2474 rtx p = prev_nonnote_insn (i3);
663522cb
KH
2475 if (p && p != i2 && GET_CODE (p) == INSN && newi2pat
2476 && sets_cc0_p (newi2pat))
5ef17dd2 2477 {
663522cb
KH
2478 undo_all ();
2479 return 0;
5ef17dd2 2480 }
663522cb
KH
2481 }
2482#endif
230d793d 2483
663522cb 2484 /* We now know that we can do this combination. Merge the insns and
230d793d
RS
2485 update the status of registers and LOG_LINKS. */
2486
2487 {
2488 rtx i3notes, i2notes, i1notes = 0;
2489 rtx i3links, i2links, i1links = 0;
2490 rtx midnotes = 0;
770ae6cc 2491 unsigned int regno;
ff3467a9
JW
2492 /* Compute which registers we expect to eliminate. newi2pat may be setting
2493 either i3dest or i2dest, so we must check it. Also, i1dest may be the
2494 same as i3dest, in which case newi2pat may be setting i1dest. */
2495 rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
2496 || i2dest_in_i2src || i2dest_in_i1src
230d793d 2497 ? 0 : i2dest);
ff3467a9
JW
2498 rtx elim_i1 = (i1 == 0 || i1dest_in_i1src
2499 || (newi2pat && reg_set_p (i1dest, newi2pat))
2500 ? 0 : i1dest);
230d793d
RS
2501
2502 /* Get the old REG_NOTES and LOG_LINKS from all our insns and
2503 clear them. */
2504 i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
2505 i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
2506 if (i1)
2507 i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
2508
2509 /* Ensure that we do not have something that should not be shared but
2510 occurs multiple times in the new insns. Check this by first
5089e22e 2511 resetting all the `used' flags and then copying anything is shared. */
230d793d
RS
2512
2513 reset_used_flags (i3notes);
2514 reset_used_flags (i2notes);
2515 reset_used_flags (i1notes);
2516 reset_used_flags (newpat);
2517 reset_used_flags (newi2pat);
2518 if (undobuf.other_insn)
2519 reset_used_flags (PATTERN (undobuf.other_insn));
2520
2521 i3notes = copy_rtx_if_shared (i3notes);
2522 i2notes = copy_rtx_if_shared (i2notes);
2523 i1notes = copy_rtx_if_shared (i1notes);
2524 newpat = copy_rtx_if_shared (newpat);
2525 newi2pat = copy_rtx_if_shared (newi2pat);
2526 if (undobuf.other_insn)
2527 reset_used_flags (PATTERN (undobuf.other_insn));
2528
2529 INSN_CODE (i3) = insn_code_number;
2530 PATTERN (i3) = newpat;
2531 if (undobuf.other_insn)
2532 INSN_CODE (undobuf.other_insn) = other_code_number;
2533
2534 /* We had one special case above where I2 had more than one set and
2535 we replaced a destination of one of those sets with the destination
2536 of I3. In that case, we have to update LOG_LINKS of insns later
176c9e6b
JW
2537 in this basic block. Note that this (expensive) case is rare.
2538
2539 Also, in this case, we must pretend that all REG_NOTEs for I2
2540 actually came from I3, so that REG_UNUSED notes from I2 will be
2541 properly handled. */
2542
c7be4f66 2543 if (i3_subst_into_i2)
176c9e6b 2544 {
1786009e 2545 for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
95ac07b0
AO
2546 if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != USE
2547 && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, i))) == REG
1786009e
ZW
2548 && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
2549 && ! find_reg_note (i2, REG_UNUSED,
2550 SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
2551 for (temp = NEXT_INSN (i2);
2552 temp && (this_basic_block == n_basic_blocks - 1
2553 || BLOCK_HEAD (this_basic_block) != temp);
2554 temp = NEXT_INSN (temp))
2555 if (temp != i3 && INSN_P (temp))
2556 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
2557 if (XEXP (link, 0) == i2)
2558 XEXP (link, 0) = i3;
176c9e6b
JW
2559
2560 if (i3notes)
2561 {
2562 rtx link = i3notes;
2563 while (XEXP (link, 1))
2564 link = XEXP (link, 1);
2565 XEXP (link, 1) = i2notes;
2566 }
2567 else
2568 i3notes = i2notes;
2569 i2notes = 0;
2570 }
230d793d
RS
2571
2572 LOG_LINKS (i3) = 0;
2573 REG_NOTES (i3) = 0;
2574 LOG_LINKS (i2) = 0;
2575 REG_NOTES (i2) = 0;
2576
2577 if (newi2pat)
2578 {
2579 INSN_CODE (i2) = i2_code_number;
2580 PATTERN (i2) = newi2pat;
2581 }
2582 else
2583 {
2584 PUT_CODE (i2, NOTE);
2585 NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED;
2586 NOTE_SOURCE_FILE (i2) = 0;
2587 }
2588
2589 if (i1)
2590 {
2591 LOG_LINKS (i1) = 0;
2592 REG_NOTES (i1) = 0;
2593 PUT_CODE (i1, NOTE);
2594 NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED;
2595 NOTE_SOURCE_FILE (i1) = 0;
2596 }
2597
2598 /* Get death notes for everything that is now used in either I3 or
663522cb 2599 I2 and used to die in a previous insn. If we built two new
6eb12cef
RK
2600 patterns, move from I1 to I2 then I2 to I3 so that we get the
2601 proper movement on registers that I2 modifies. */
230d793d 2602
230d793d 2603 if (newi2pat)
6eb12cef
RK
2604 {
2605 move_deaths (newi2pat, NULL_RTX, INSN_CUID (i1), i2, &midnotes);
2606 move_deaths (newpat, newi2pat, INSN_CUID (i1), i3, &midnotes);
2607 }
2608 else
2609 move_deaths (newpat, NULL_RTX, i1 ? INSN_CUID (i1) : INSN_CUID (i2),
2610 i3, &midnotes);
230d793d
RS
2611
2612 /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */
2613 if (i3notes)
5f4f0e22
CH
2614 distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
2615 elim_i2, elim_i1);
230d793d 2616 if (i2notes)
5f4f0e22
CH
2617 distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
2618 elim_i2, elim_i1);
230d793d 2619 if (i1notes)
5f4f0e22
CH
2620 distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
2621 elim_i2, elim_i1);
230d793d 2622 if (midnotes)
5f4f0e22
CH
2623 distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2624 elim_i2, elim_i1);
230d793d
RS
2625
2626 /* Distribute any notes added to I2 or I3 by recog_for_combine. We
2627 know these are REG_UNUSED and want them to go to the desired insn,
663522cb 2628 so we always pass it as i3. We have not counted the notes in
1a26b032
RK
2629 reg_n_deaths yet, so we need to do so now. */
2630
230d793d 2631 if (newi2pat && new_i2_notes)
1a26b032
RK
2632 {
2633 for (temp = new_i2_notes; temp; temp = XEXP (temp, 1))
2634 if (GET_CODE (XEXP (temp, 0)) == REG)
b1f21e0a 2635 REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
663522cb 2636
1a26b032
RK
2637 distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2638 }
2639
230d793d 2640 if (new_i3_notes)
1a26b032
RK
2641 {
2642 for (temp = new_i3_notes; temp; temp = XEXP (temp, 1))
2643 if (GET_CODE (XEXP (temp, 0)) == REG)
b1f21e0a 2644 REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
663522cb 2645
1a26b032
RK
2646 distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
2647 }
230d793d
RS
2648
2649 /* If I3DEST was used in I3SRC, it really died in I3. We may need to
e9a25f70
JL
2650 put a REG_DEAD note for it somewhere. If NEWI2PAT exists and sets
2651 I3DEST, the death must be somewhere before I2, not I3. If we passed I3
2652 in that case, it might delete I2. Similarly for I2 and I1.
1a26b032
RK
2653 Show an additional death due to the REG_DEAD note we make here. If
2654 we discard it in distribute_notes, we will decrement it again. */
d0ab8cd3 2655
230d793d 2656 if (i3dest_killed)
1a26b032
RK
2657 {
2658 if (GET_CODE (i3dest_killed) == REG)
b1f21e0a 2659 REG_N_DEATHS (REGNO (i3dest_killed))++;
1a26b032 2660
e9a25f70 2661 if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
38a448ca
RH
2662 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2663 NULL_RTX),
ff3467a9 2664 NULL_RTX, i2, NULL_RTX, elim_i2, elim_i1);
e9a25f70 2665 else
38a448ca
RH
2666 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2667 NULL_RTX),
e9a25f70 2668 NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
ff3467a9 2669 elim_i2, elim_i1);
1a26b032 2670 }
58c8c593 2671
230d793d 2672 if (i2dest_in_i2src)
58c8c593 2673 {
1a26b032 2674 if (GET_CODE (i2dest) == REG)
b1f21e0a 2675 REG_N_DEATHS (REGNO (i2dest))++;
1a26b032 2676
58c8c593 2677 if (newi2pat && reg_set_p (i2dest, newi2pat))
38a448ca 2678 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
58c8c593
RK
2679 NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2680 else
38a448ca 2681 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
58c8c593
RK
2682 NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2683 NULL_RTX, NULL_RTX);
2684 }
2685
230d793d 2686 if (i1dest_in_i1src)
58c8c593 2687 {
1a26b032 2688 if (GET_CODE (i1dest) == REG)
b1f21e0a 2689 REG_N_DEATHS (REGNO (i1dest))++;
1a26b032 2690
58c8c593 2691 if (newi2pat && reg_set_p (i1dest, newi2pat))
38a448ca 2692 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
58c8c593
RK
2693 NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2694 else
38a448ca 2695 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
58c8c593
RK
2696 NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2697 NULL_RTX, NULL_RTX);
2698 }
230d793d
RS
2699
2700 distribute_links (i3links);
2701 distribute_links (i2links);
2702 distribute_links (i1links);
2703
2704 if (GET_CODE (i2dest) == REG)
2705 {
d0ab8cd3
RK
2706 rtx link;
2707 rtx i2_insn = 0, i2_val = 0, set;
2708
2709 /* The insn that used to set this register doesn't exist, and
2710 this life of the register may not exist either. See if one of
663522cb 2711 I3's links points to an insn that sets I2DEST. If it does,
d0ab8cd3
RK
2712 that is now the last known value for I2DEST. If we don't update
2713 this and I2 set the register to a value that depended on its old
230d793d
RS
2714 contents, we will get confused. If this insn is used, thing
2715 will be set correctly in combine_instructions. */
d0ab8cd3
RK
2716
2717 for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2718 if ((set = single_set (XEXP (link, 0))) != 0
2719 && rtx_equal_p (i2dest, SET_DEST (set)))
2720 i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
2721
2722 record_value_for_reg (i2dest, i2_insn, i2_val);
230d793d
RS
2723
2724 /* If the reg formerly set in I2 died only once and that was in I3,
2725 zero its use count so it won't make `reload' do any work. */
538fe8cd
ILT
2726 if (! added_sets_2
2727 && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
2728 && ! i2dest_in_i2src)
230d793d
RS
2729 {
2730 regno = REGNO (i2dest);
b1f21e0a 2731 REG_N_SETS (regno)--;
230d793d
RS
2732 }
2733 }
2734
2735 if (i1 && GET_CODE (i1dest) == REG)
2736 {
d0ab8cd3
RK
2737 rtx link;
2738 rtx i1_insn = 0, i1_val = 0, set;
2739
2740 for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2741 if ((set = single_set (XEXP (link, 0))) != 0
2742 && rtx_equal_p (i1dest, SET_DEST (set)))
2743 i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
2744
2745 record_value_for_reg (i1dest, i1_insn, i1_val);
2746
230d793d 2747 regno = REGNO (i1dest);
5af91171 2748 if (! added_sets_1 && ! i1dest_in_i1src)
770ae6cc 2749 REG_N_SETS (regno)--;
230d793d
RS
2750 }
2751
951553af 2752 /* Update reg_nonzero_bits et al for any changes that may have been made
663522cb 2753 to this insn. The order of set_nonzero_bits_and_sign_copies() is
5fb7c247 2754 important. Because newi2pat can affect nonzero_bits of newpat */
22609cbf 2755 if (newi2pat)
84832317 2756 note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
5fb7c247 2757 note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
22609cbf 2758
44a76fc8
AG
2759 /* Set new_direct_jump_p if a new return or simple jump instruction
2760 has been created.
2761
663522cb 2762 If I3 is now an unconditional jump, ensure that it has a
230d793d 2763 BARRIER following it since it may have initially been a
381ee8af 2764 conditional jump. It may also be the last nonnote insn. */
663522cb 2765
592a6d1d 2766 if (GET_CODE (newpat) == RETURN || any_uncondjump_p (i3))
44a76fc8
AG
2767 {
2768 *new_direct_jump_p = 1;
230d793d 2769
44a76fc8
AG
2770 if ((temp = next_nonnote_insn (i3)) == NULL_RTX
2771 || GET_CODE (temp) != BARRIER)
2772 emit_barrier_after (i3);
2773 }
592a6d1d
JH
2774 /* An NOOP jump does not need barrier, but it does need cleaning up
2775 of CFG. */
2776 if (GET_CODE (newpat) == SET
2777 && SET_SRC (newpat) == pc_rtx
2778 && SET_DEST (newpat) == pc_rtx)
2779 *new_direct_jump_p = 1;
230d793d
RS
2780 }
2781
2782 combine_successes++;
e7749837 2783 undo_commit ();
230d793d 2784
bcd49eb7
JW
2785 /* Clear this here, so that subsequent get_last_value calls are not
2786 affected. */
2787 subst_prev_insn = NULL_RTX;
2788
abe6e52f
RK
2789 if (added_links_insn
2790 && (newi2pat == 0 || INSN_CUID (added_links_insn) < INSN_CUID (i2))
2791 && INSN_CUID (added_links_insn) < INSN_CUID (i3))
2792 return added_links_insn;
2793 else
2794 return newi2pat ? i2 : i3;
230d793d
RS
2795}
2796\f
2797/* Undo all the modifications recorded in undobuf. */
2798
2799static void
2800undo_all ()
2801{
241cea85
RK
2802 struct undo *undo, *next;
2803
2804 for (undo = undobuf.undos; undo; undo = next)
7c046e4e 2805 {
241cea85
RK
2806 next = undo->next;
2807 if (undo->is_int)
2808 *undo->where.i = undo->old_contents.i;
7c046e4e 2809 else
241cea85
RK
2810 *undo->where.r = undo->old_contents.r;
2811
2812 undo->next = undobuf.frees;
2813 undobuf.frees = undo;
7c046e4e 2814 }
230d793d 2815
f1c6ba8b 2816 undobuf.undos = 0;
bcd49eb7
JW
2817
2818 /* Clear this here, so that subsequent get_last_value calls are not
2819 affected. */
2820 subst_prev_insn = NULL_RTX;
230d793d 2821}
e7749837
RH
2822
2823/* We've committed to accepting the changes we made. Move all
2824 of the undos to the free list. */
2825
2826static void
2827undo_commit ()
2828{
2829 struct undo *undo, *next;
2830
2831 for (undo = undobuf.undos; undo; undo = next)
2832 {
2833 next = undo->next;
2834 undo->next = undobuf.frees;
2835 undobuf.frees = undo;
2836 }
f1c6ba8b 2837 undobuf.undos = 0;
e7749837
RH
2838}
2839
230d793d
RS
2840\f
2841/* Find the innermost point within the rtx at LOC, possibly LOC itself,
d0ab8cd3
RK
2842 where we have an arithmetic expression and return that point. LOC will
2843 be inside INSN.
230d793d
RS
2844
2845 try_combine will call this function to see if an insn can be split into
2846 two insns. */
2847
2848static rtx *
d0ab8cd3 2849find_split_point (loc, insn)
230d793d 2850 rtx *loc;
d0ab8cd3 2851 rtx insn;
230d793d
RS
2852{
2853 rtx x = *loc;
2854 enum rtx_code code = GET_CODE (x);
2855 rtx *split;
770ae6cc
RK
2856 unsigned HOST_WIDE_INT len = 0;
2857 HOST_WIDE_INT pos = 0;
2858 int unsignedp = 0;
6a651371 2859 rtx inner = NULL_RTX;
230d793d
RS
2860
2861 /* First special-case some codes. */
2862 switch (code)
2863 {
2864 case SUBREG:
2865#ifdef INSN_SCHEDULING
2866 /* If we are making a paradoxical SUBREG invalid, it becomes a split
2867 point. */
2868 if (GET_CODE (SUBREG_REG (x)) == MEM)
2869 return loc;
2870#endif
d0ab8cd3 2871 return find_split_point (&SUBREG_REG (x), insn);
230d793d 2872
230d793d 2873 case MEM:
916f14f1 2874#ifdef HAVE_lo_sum
230d793d
RS
2875 /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
2876 using LO_SUM and HIGH. */
2877 if (GET_CODE (XEXP (x, 0)) == CONST
2878 || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
2879 {
2880 SUBST (XEXP (x, 0),
f1c6ba8b
RK
2881 gen_rtx_LO_SUM (Pmode,
2882 gen_rtx_HIGH (Pmode, XEXP (x, 0)),
2883 XEXP (x, 0)));
230d793d
RS
2884 return &XEXP (XEXP (x, 0), 0);
2885 }
230d793d
RS
2886#endif
2887
916f14f1
RK
2888 /* If we have a PLUS whose second operand is a constant and the
2889 address is not valid, perhaps will can split it up using
2890 the machine-specific way to split large constants. We use
ddd5a7c1 2891 the first pseudo-reg (one of the virtual regs) as a placeholder;
916f14f1
RK
2892 it will not remain in the result. */
2893 if (GET_CODE (XEXP (x, 0)) == PLUS
2894 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2895 && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
2896 {
2897 rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
38a448ca 2898 rtx seq = split_insns (gen_rtx_SET (VOIDmode, reg, XEXP (x, 0)),
916f14f1
RK
2899 subst_insn);
2900
2901 /* This should have produced two insns, each of which sets our
2902 placeholder. If the source of the second is a valid address,
2903 we can make put both sources together and make a split point
2904 in the middle. */
2905
2906 if (seq && XVECLEN (seq, 0) == 2
2907 && GET_CODE (XVECEXP (seq, 0, 0)) == INSN
2908 && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) == SET
2909 && SET_DEST (PATTERN (XVECEXP (seq, 0, 0))) == reg
2910 && ! reg_mentioned_p (reg,
2911 SET_SRC (PATTERN (XVECEXP (seq, 0, 0))))
2912 && GET_CODE (XVECEXP (seq, 0, 1)) == INSN
2913 && GET_CODE (PATTERN (XVECEXP (seq, 0, 1))) == SET
2914 && SET_DEST (PATTERN (XVECEXP (seq, 0, 1))) == reg
2915 && memory_address_p (GET_MODE (x),
2916 SET_SRC (PATTERN (XVECEXP (seq, 0, 1)))))
2917 {
2918 rtx src1 = SET_SRC (PATTERN (XVECEXP (seq, 0, 0)));
2919 rtx src2 = SET_SRC (PATTERN (XVECEXP (seq, 0, 1)));
2920
2921 /* Replace the placeholder in SRC2 with SRC1. If we can
2922 find where in SRC2 it was placed, that can become our
2923 split point and we can replace this address with SRC2.
2924 Just try two obvious places. */
2925
2926 src2 = replace_rtx (src2, reg, src1);
2927 split = 0;
2928 if (XEXP (src2, 0) == src1)
2929 split = &XEXP (src2, 0);
2930 else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
2931 && XEXP (XEXP (src2, 0), 0) == src1)
2932 split = &XEXP (XEXP (src2, 0), 0);
2933
2934 if (split)
2935 {
2936 SUBST (XEXP (x, 0), src2);
2937 return split;
2938 }
2939 }
663522cb 2940
1a26b032
RK
2941 /* If that didn't work, perhaps the first operand is complex and
2942 needs to be computed separately, so make a split point there.
2943 This will occur on machines that just support REG + CONST
2944 and have a constant moved through some previous computation. */
2945
2946 else if (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) != 'o'
2947 && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
2948 && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (XEXP (x, 0), 0))))
2949 == 'o')))
2950 return &XEXP (XEXP (x, 0), 0);
916f14f1
RK
2951 }
2952 break;
2953
230d793d
RS
2954 case SET:
2955#ifdef HAVE_cc0
2956 /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
2957 ZERO_EXTRACT, the most likely reason why this doesn't match is that
2958 we need to put the operand into a register. So split at that
2959 point. */
2960
2961 if (SET_DEST (x) == cc0_rtx
2962 && GET_CODE (SET_SRC (x)) != COMPARE
2963 && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
2964 && GET_RTX_CLASS (GET_CODE (SET_SRC (x))) != 'o'
2965 && ! (GET_CODE (SET_SRC (x)) == SUBREG
2966 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) == 'o'))
2967 return &SET_SRC (x);
2968#endif
2969
2970 /* See if we can split SET_SRC as it stands. */
d0ab8cd3 2971 split = find_split_point (&SET_SRC (x), insn);
230d793d
RS
2972 if (split && split != &SET_SRC (x))
2973 return split;
2974
041d7180
JL
2975 /* See if we can split SET_DEST as it stands. */
2976 split = find_split_point (&SET_DEST (x), insn);
2977 if (split && split != &SET_DEST (x))
2978 return split;
2979
230d793d
RS
2980 /* See if this is a bitfield assignment with everything constant. If
2981 so, this is an IOR of an AND, so split it into that. */
2982 if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
2983 && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
5f4f0e22 2984 <= HOST_BITS_PER_WIDE_INT)
230d793d
RS
2985 && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
2986 && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
2987 && GET_CODE (SET_SRC (x)) == CONST_INT
2988 && ((INTVAL (XEXP (SET_DEST (x), 1))
2989 + INTVAL (XEXP (SET_DEST (x), 2)))
2990 <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
2991 && ! side_effects_p (XEXP (SET_DEST (x), 0)))
2992 {
770ae6cc
RK
2993 HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
2994 unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
2995 unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
230d793d
RS
2996 rtx dest = XEXP (SET_DEST (x), 0);
2997 enum machine_mode mode = GET_MODE (dest);
5f4f0e22 2998 unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
230d793d 2999
f76b9db2
ILT
3000 if (BITS_BIG_ENDIAN)
3001 pos = GET_MODE_BITSIZE (mode) - len - pos;
230d793d 3002
770ae6cc 3003 if (src == mask)
230d793d 3004 SUBST (SET_SRC (x),
5f4f0e22 3005 gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
230d793d
RS
3006 else
3007 SUBST (SET_SRC (x),
3008 gen_binary (IOR, mode,
663522cb
KH
3009 gen_binary (AND, mode, dest,
3010 GEN_INT (~(mask << pos)
5f4f0e22
CH
3011 & GET_MODE_MASK (mode))),
3012 GEN_INT (src << pos)));
230d793d
RS
3013
3014 SUBST (SET_DEST (x), dest);
3015
d0ab8cd3 3016 split = find_split_point (&SET_SRC (x), insn);
230d793d
RS
3017 if (split && split != &SET_SRC (x))
3018 return split;
3019 }
3020
3021 /* Otherwise, see if this is an operation that we can split into two.
3022 If so, try to split that. */
3023 code = GET_CODE (SET_SRC (x));
3024
3025 switch (code)
3026 {
d0ab8cd3
RK
3027 case AND:
3028 /* If we are AND'ing with a large constant that is only a single
3029 bit and the result is only being used in a context where we
3030 need to know if it is zero or non-zero, replace it with a bit
3031 extraction. This will avoid the large constant, which might
3032 have taken more than one insn to make. If the constant were
3033 not a valid argument to the AND but took only one insn to make,
3034 this is no worse, but if it took more than one insn, it will
3035 be better. */
3036
3037 if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3038 && GET_CODE (XEXP (SET_SRC (x), 0)) == REG
3039 && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
3040 && GET_CODE (SET_DEST (x)) == REG
6496a589 3041 && (split = find_single_use (SET_DEST (x), insn, (rtx*)0)) != 0
d0ab8cd3
RK
3042 && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
3043 && XEXP (*split, 0) == SET_DEST (x)
3044 && XEXP (*split, 1) == const0_rtx)
3045 {
76184def
DE
3046 rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
3047 XEXP (SET_SRC (x), 0),
3048 pos, NULL_RTX, 1, 1, 0, 0);
3049 if (extraction != 0)
3050 {
3051 SUBST (SET_SRC (x), extraction);
3052 return find_split_point (loc, insn);
3053 }
d0ab8cd3
RK
3054 }
3055 break;
3056
1a6ec070
RK
3057 case NE:
3058 /* if STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
ec5c56db 3059 is known to be on, this can be converted into a NEG of a shift. */
1a6ec070
RK
3060 if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
3061 && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
4eb2cb10 3062 && 1 <= (pos = exact_log2
1a6ec070
RK
3063 (nonzero_bits (XEXP (SET_SRC (x), 0),
3064 GET_MODE (XEXP (SET_SRC (x), 0))))))
3065 {
3066 enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
3067
3068 SUBST (SET_SRC (x),
f1c6ba8b
RK
3069 gen_rtx_NEG (mode,
3070 gen_rtx_LSHIFTRT (mode,
3071 XEXP (SET_SRC (x), 0),
3072 GEN_INT (pos))));
1a6ec070
RK
3073
3074 split = find_split_point (&SET_SRC (x), insn);
3075 if (split && split != &SET_SRC (x))
3076 return split;
3077 }
3078 break;
3079
230d793d
RS
3080 case SIGN_EXTEND:
3081 inner = XEXP (SET_SRC (x), 0);
101c1a3d
JL
3082
3083 /* We can't optimize if either mode is a partial integer
3084 mode as we don't know how many bits are significant
3085 in those modes. */
3086 if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
3087 || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
3088 break;
3089
230d793d
RS
3090 pos = 0;
3091 len = GET_MODE_BITSIZE (GET_MODE (inner));
3092 unsignedp = 0;
3093 break;
3094
3095 case SIGN_EXTRACT:
3096 case ZERO_EXTRACT:
3097 if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3098 && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
3099 {
3100 inner = XEXP (SET_SRC (x), 0);
3101 len = INTVAL (XEXP (SET_SRC (x), 1));
3102 pos = INTVAL (XEXP (SET_SRC (x), 2));
3103
f76b9db2
ILT
3104 if (BITS_BIG_ENDIAN)
3105 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
230d793d
RS
3106 unsignedp = (code == ZERO_EXTRACT);
3107 }
3108 break;
e9a25f70
JL
3109
3110 default:
3111 break;
230d793d
RS
3112 }
3113
3114 if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
3115 {
3116 enum machine_mode mode = GET_MODE (SET_SRC (x));
3117
d0ab8cd3
RK
3118 /* For unsigned, we have a choice of a shift followed by an
3119 AND or two shifts. Use two shifts for field sizes where the
3120 constant might be too large. We assume here that we can
3121 always at least get 8-bit constants in an AND insn, which is
3122 true for every current RISC. */
3123
3124 if (unsignedp && len <= 8)
230d793d
RS
3125 {
3126 SUBST (SET_SRC (x),
f1c6ba8b
RK
3127 gen_rtx_AND (mode,
3128 gen_rtx_LSHIFTRT
3129 (mode, gen_lowpart_for_combine (mode, inner),
3130 GEN_INT (pos)),
3131 GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
230d793d 3132
d0ab8cd3 3133 split = find_split_point (&SET_SRC (x), insn);
230d793d
RS
3134 if (split && split != &SET_SRC (x))
3135 return split;
3136 }
3137 else
3138 {
3139 SUBST (SET_SRC (x),
f1c6ba8b 3140 gen_rtx_fmt_ee
d0ab8cd3 3141 (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
f1c6ba8b
RK
3142 gen_rtx_ASHIFT (mode,
3143 gen_lowpart_for_combine (mode, inner),
3144 GEN_INT (GET_MODE_BITSIZE (mode)
3145 - len - pos)),
5f4f0e22 3146 GEN_INT (GET_MODE_BITSIZE (mode) - len)));
230d793d 3147
d0ab8cd3 3148 split = find_split_point (&SET_SRC (x), insn);
230d793d
RS
3149 if (split && split != &SET_SRC (x))
3150 return split;
3151 }
3152 }
3153
3154 /* See if this is a simple operation with a constant as the second
3155 operand. It might be that this constant is out of range and hence
3156 could be used as a split point. */
3157 if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
3158 || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
3159 || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<')
3160 && CONSTANT_P (XEXP (SET_SRC (x), 1))
3161 && (GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (x), 0))) == 'o'
3162 || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
3163 && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (SET_SRC (x), 0))))
3164 == 'o'))))
3165 return &XEXP (SET_SRC (x), 1);
3166
3167 /* Finally, see if this is a simple operation with its first operand
3168 not in a register. The operation might require this operand in a
3169 register, so return it as a split point. We can always do this
3170 because if the first operand were another operation, we would have
3171 already found it as a split point. */
3172 if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
3173 || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
3174 || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<'
3175 || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '1')
3176 && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
3177 return &XEXP (SET_SRC (x), 0);
3178
3179 return 0;
3180
3181 case AND:
3182 case IOR:
3183 /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
3184 it is better to write this as (not (ior A B)) so we can split it.
3185 Similarly for IOR. */
3186 if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
3187 {
3188 SUBST (*loc,
f1c6ba8b
RK
3189 gen_rtx_NOT (GET_MODE (x),
3190 gen_rtx_fmt_ee (code == IOR ? AND : IOR,
3191 GET_MODE (x),
3192 XEXP (XEXP (x, 0), 0),
3193 XEXP (XEXP (x, 1), 0))));
d0ab8cd3 3194 return find_split_point (loc, insn);
230d793d
RS
3195 }
3196
3197 /* Many RISC machines have a large set of logical insns. If the
3198 second operand is a NOT, put it first so we will try to split the
3199 other operand first. */
3200 if (GET_CODE (XEXP (x, 1)) == NOT)
3201 {
3202 rtx tem = XEXP (x, 0);
3203 SUBST (XEXP (x, 0), XEXP (x, 1));
3204 SUBST (XEXP (x, 1), tem);
3205 }
3206 break;
e9a25f70
JL
3207
3208 default:
3209 break;
230d793d
RS
3210 }
3211
3212 /* Otherwise, select our actions depending on our rtx class. */
3213 switch (GET_RTX_CLASS (code))
3214 {
3215 case 'b': /* This is ZERO_EXTRACT and SIGN_EXTRACT. */
3216 case '3':
d0ab8cd3 3217 split = find_split_point (&XEXP (x, 2), insn);
230d793d
RS
3218 if (split)
3219 return split;
0f41302f 3220 /* ... fall through ... */
230d793d
RS
3221 case '2':
3222 case 'c':
3223 case '<':
d0ab8cd3 3224 split = find_split_point (&XEXP (x, 1), insn);
230d793d
RS
3225 if (split)
3226 return split;
0f41302f 3227 /* ... fall through ... */
230d793d
RS
3228 case '1':
3229 /* Some machines have (and (shift ...) ...) insns. If X is not
3230 an AND, but XEXP (X, 0) is, use it as our split point. */
3231 if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
3232 return &XEXP (x, 0);
3233
d0ab8cd3 3234 split = find_split_point (&XEXP (x, 0), insn);
230d793d
RS
3235 if (split)
3236 return split;
3237 return loc;
3238 }
3239
3240 /* Otherwise, we don't have a split point. */
3241 return 0;
3242}
3243\f
3244/* Throughout X, replace FROM with TO, and return the result.
3245 The result is TO if X is FROM;
3246 otherwise the result is X, but its contents may have been modified.
3247 If they were modified, a record was made in undobuf so that
3248 undo_all will (among other things) return X to its original state.
3249
3250 If the number of changes necessary is too much to record to undo,
3251 the excess changes are not made, so the result is invalid.
3252 The changes already made can still be undone.
3253 undobuf.num_undo is incremented for such changes, so by testing that
3254 the caller can tell whether the result is valid.
3255
3256 `n_occurrences' is incremented each time FROM is replaced.
663522cb 3257
230d793d
RS
3258 IN_DEST is non-zero if we are processing the SET_DEST of a SET.
3259
5089e22e 3260 UNIQUE_COPY is non-zero if each substitution must be unique. We do this
230d793d
RS
3261 by copying if `n_occurrences' is non-zero. */
3262
3263static rtx
3264subst (x, from, to, in_dest, unique_copy)
3265 register rtx x, from, to;
3266 int in_dest;
3267 int unique_copy;
3268{
f24ad0e4 3269 register enum rtx_code code = GET_CODE (x);
230d793d 3270 enum machine_mode op0_mode = VOIDmode;
6f7d635c 3271 register const char *fmt;
8079805d
RK
3272 register int len, i;
3273 rtx new;
230d793d
RS
3274
3275/* Two expressions are equal if they are identical copies of a shared
3276 RTX or if they are both registers with the same register number
3277 and mode. */
3278
3279#define COMBINE_RTX_EQUAL_P(X,Y) \
3280 ((X) == (Y) \
3281 || (GET_CODE (X) == REG && GET_CODE (Y) == REG \
3282 && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
3283
3284 if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
3285 {
3286 n_occurrences++;
3287 return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
3288 }
3289
3290 /* If X and FROM are the same register but different modes, they will
663522cb 3291 not have been seen as equal above. However, flow.c will make a
230d793d
RS
3292 LOG_LINKS entry for that case. If we do nothing, we will try to
3293 rerecognize our original insn and, when it succeeds, we will
3294 delete the feeding insn, which is incorrect.
3295
3296 So force this insn not to match in this (rare) case. */
3297 if (! in_dest && code == REG && GET_CODE (from) == REG
3298 && REGNO (x) == REGNO (from))
38a448ca 3299 return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
230d793d
RS
3300
3301 /* If this is an object, we are done unless it is a MEM or LO_SUM, both
3302 of which may contain things that can be combined. */
3303 if (code != MEM && code != LO_SUM && GET_RTX_CLASS (code) == 'o')
3304 return x;
3305
3306 /* It is possible to have a subexpression appear twice in the insn.
3307 Suppose that FROM is a register that appears within TO.
3308 Then, after that subexpression has been scanned once by `subst',
3309 the second time it is scanned, TO may be found. If we were
3310 to scan TO here, we would find FROM within it and create a
3311 self-referent rtl structure which is completely wrong. */
3312 if (COMBINE_RTX_EQUAL_P (x, to))
3313 return to;
3314
4f4b3679
RH
3315 /* Parallel asm_operands need special attention because all of the
3316 inputs are shared across the arms. Furthermore, unsharing the
3317 rtl results in recognition failures. Failure to handle this case
3318 specially can result in circular rtl.
3319
3320 Solve this by doing a normal pass across the first entry of the
3321 parallel, and only processing the SET_DESTs of the subsequent
3322 entries. Ug. */
3323
3324 if (code == PARALLEL
3325 && GET_CODE (XVECEXP (x, 0, 0)) == SET
3326 && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
230d793d 3327 {
4f4b3679
RH
3328 new = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
3329
3330 /* If this substitution failed, this whole thing fails. */
3331 if (GET_CODE (new) == CLOBBER
3332 && XEXP (new, 0) == const0_rtx)
3333 return new;
3334
3335 SUBST (XVECEXP (x, 0, 0), new);
3336
3337 for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
230d793d 3338 {
4f4b3679 3339 rtx dest = SET_DEST (XVECEXP (x, 0, i));
663522cb 3340
4f4b3679
RH
3341 if (GET_CODE (dest) != REG
3342 && GET_CODE (dest) != CC0
3343 && GET_CODE (dest) != PC)
230d793d 3344 {
4f4b3679 3345 new = subst (dest, from, to, 0, unique_copy);
230d793d 3346
4f4b3679
RH
3347 /* If this substitution failed, this whole thing fails. */
3348 if (GET_CODE (new) == CLOBBER
3349 && XEXP (new, 0) == const0_rtx)
3350 return new;
230d793d 3351
4f4b3679 3352 SUBST (SET_DEST (XVECEXP (x, 0, i)), new);
230d793d
RS
3353 }
3354 }
4f4b3679
RH
3355 }
3356 else
3357 {
3358 len = GET_RTX_LENGTH (code);
3359 fmt = GET_RTX_FORMAT (code);
3360
3361 /* We don't need to process a SET_DEST that is a register, CC0,
3362 or PC, so set up to skip this common case. All other cases
3363 where we want to suppress replacing something inside a
3364 SET_SRC are handled via the IN_DEST operand. */
3365 if (code == SET
3366 && (GET_CODE (SET_DEST (x)) == REG
3367 || GET_CODE (SET_DEST (x)) == CC0
3368 || GET_CODE (SET_DEST (x)) == PC))
3369 fmt = "ie";
3370
3371 /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
3372 constant. */
3373 if (fmt[0] == 'e')
3374 op0_mode = GET_MODE (XEXP (x, 0));
3375
3376 for (i = 0; i < len; i++)
230d793d 3377 {
4f4b3679 3378 if (fmt[i] == 'E')
230d793d 3379 {
4f4b3679
RH
3380 register int j;
3381 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3382 {
3383 if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
3384 {
3385 new = (unique_copy && n_occurrences
3386 ? copy_rtx (to) : to);
3387 n_occurrences++;
3388 }
3389 else
3390 {
3391 new = subst (XVECEXP (x, i, j), from, to, 0,
3392 unique_copy);
3393
3394 /* If this substitution failed, this whole thing
3395 fails. */
3396 if (GET_CODE (new) == CLOBBER
3397 && XEXP (new, 0) == const0_rtx)
3398 return new;
3399 }
3400
3401 SUBST (XVECEXP (x, i, j), new);
3402 }
3403 }
3404 else if (fmt[i] == 'e')
3405 {
0a33d11e
RH
3406 /* If this is a register being set, ignore it. */
3407 new = XEXP (x, i);
3408 if (in_dest
3409 && (code == SUBREG || code == STRICT_LOW_PART
3410 || code == ZERO_EXTRACT)
3411 && i == 0
3412 && GET_CODE (new) == REG)
3413 ;
3414
3415 else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
4f4b3679
RH
3416 {
3417 /* In general, don't install a subreg involving two
3418 modes not tieable. It can worsen register
3419 allocation, and can even make invalid reload
3420 insns, since the reg inside may need to be copied
3421 from in the outside mode, and that may be invalid
3422 if it is an fp reg copied in integer mode.
3423
3424 We allow two exceptions to this: It is valid if
3425 it is inside another SUBREG and the mode of that
3426 SUBREG and the mode of the inside of TO is
3427 tieable and it is valid if X is a SET that copies
3428 FROM to CC0. */
3429
3430 if (GET_CODE (to) == SUBREG
3431 && ! MODES_TIEABLE_P (GET_MODE (to),
3432 GET_MODE (SUBREG_REG (to)))
3433 && ! (code == SUBREG
3434 && MODES_TIEABLE_P (GET_MODE (x),
3435 GET_MODE (SUBREG_REG (to))))
42301240 3436#ifdef HAVE_cc0
4f4b3679 3437 && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
42301240 3438#endif
4f4b3679
RH
3439 )
3440 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
42301240 3441
02188693 3442#ifdef CLASS_CANNOT_CHANGE_MODE
ed8afe3a
GK
3443 if (code == SUBREG
3444 && GET_CODE (to) == REG
3445 && REGNO (to) < FIRST_PSEUDO_REGISTER
3446 && (TEST_HARD_REG_BIT
02188693 3447 (reg_class_contents[(int) CLASS_CANNOT_CHANGE_MODE],
ed8afe3a 3448 REGNO (to)))
02188693
RH
3449 && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (to),
3450 GET_MODE (x)))
ed8afe3a
GK
3451 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3452#endif
3453
4f4b3679
RH
3454 new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
3455 n_occurrences++;
3456 }
3457 else
3458 /* If we are in a SET_DEST, suppress most cases unless we
3459 have gone inside a MEM, in which case we want to
3460 simplify the address. We assume here that things that
3461 are actually part of the destination have their inner
663522cb 3462 parts in the first expression. This is true for SUBREG,
4f4b3679
RH
3463 STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
3464 things aside from REG and MEM that should appear in a
3465 SET_DEST. */
3466 new = subst (XEXP (x, i), from, to,
3467 (((in_dest
3468 && (code == SUBREG || code == STRICT_LOW_PART
3469 || code == ZERO_EXTRACT))
3470 || code == SET)
3471 && i == 0), unique_copy);
3472
3473 /* If we found that we will have to reject this combination,
3474 indicate that by returning the CLOBBER ourselves, rather than
3475 an expression containing it. This will speed things up as
3476 well as prevent accidents where two CLOBBERs are considered
3477 to be equal, thus producing an incorrect simplification. */
3478
3479 if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
3480 return new;
3481
3482 SUBST (XEXP (x, i), new);
230d793d 3483 }
230d793d
RS
3484 }
3485 }
3486
8079805d
RK
3487 /* Try to simplify X. If the simplification changed the code, it is likely
3488 that further simplification will help, so loop, but limit the number
3489 of repetitions that will be performed. */
3490
3491 for (i = 0; i < 4; i++)
3492 {
3493 /* If X is sufficiently simple, don't bother trying to do anything
3494 with it. */
3495 if (code != CONST_INT && code != REG && code != CLOBBER)
31ec4e5e 3496 x = combine_simplify_rtx (x, op0_mode, i == 3, in_dest);
d0ab8cd3 3497
8079805d
RK
3498 if (GET_CODE (x) == code)
3499 break;
d0ab8cd3 3500
8079805d 3501 code = GET_CODE (x);
eeb43d32 3502
8079805d
RK
3503 /* We no longer know the original mode of operand 0 since we
3504 have changed the form of X) */
3505 op0_mode = VOIDmode;
3506 }
eeb43d32 3507
8079805d
RK
3508 return x;
3509}
3510\f
3511/* Simplify X, a piece of RTL. We just operate on the expression at the
3512 outer level; call `subst' to simplify recursively. Return the new
3513 expression.
3514
3515 OP0_MODE is the original mode of XEXP (x, 0); LAST is nonzero if this
3516 will be the iteration even if an expression with a code different from
3517 X is returned; IN_DEST is nonzero if we are inside a SET_DEST. */
eeb43d32 3518
8079805d 3519static rtx
31ec4e5e 3520combine_simplify_rtx (x, op0_mode, last, in_dest)
8079805d
RK
3521 rtx x;
3522 enum machine_mode op0_mode;
3523 int last;
3524 int in_dest;
3525{
3526 enum rtx_code code = GET_CODE (x);
3527 enum machine_mode mode = GET_MODE (x);
3528 rtx temp;
9a915772 3529 rtx reversed;
8079805d 3530 int i;
d0ab8cd3 3531
230d793d
RS
3532 /* If this is a commutative operation, put a constant last and a complex
3533 expression first. We don't need to do this for comparisons here. */
3534 if (GET_RTX_CLASS (code) == 'c'
e5c56fd9 3535 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
230d793d
RS
3536 {
3537 temp = XEXP (x, 0);
3538 SUBST (XEXP (x, 0), XEXP (x, 1));
3539 SUBST (XEXP (x, 1), temp);
3540 }
3541
22609cbf
RK
3542 /* If this is a PLUS, MINUS, or MULT, and the first operand is the
3543 sign extension of a PLUS with a constant, reverse the order of the sign
3544 extension and the addition. Note that this not the same as the original
3545 code, but overflow is undefined for signed values. Also note that the
3546 PLUS will have been partially moved "inside" the sign-extension, so that
3547 the first operand of X will really look like:
3548 (ashiftrt (plus (ashift A C4) C5) C4).
3549 We convert this to
3550 (plus (ashiftrt (ashift A C4) C2) C4)
3551 and replace the first operand of X with that expression. Later parts
3552 of this function may simplify the expression further.
3553
3554 For example, if we start with (mult (sign_extend (plus A C1)) C2),
3555 we swap the SIGN_EXTEND and PLUS. Later code will apply the
3556 distributive law to produce (plus (mult (sign_extend X) C1) C3).
3557
3558 We do this to simplify address expressions. */
3559
3560 if ((code == PLUS || code == MINUS || code == MULT)
3561 && GET_CODE (XEXP (x, 0)) == ASHIFTRT
3562 && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
3563 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ASHIFT
3564 && GET_CODE (XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1)) == CONST_INT
3565 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3566 && XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1) == XEXP (XEXP (x, 0), 1)
3567 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
3568 && (temp = simplify_binary_operation (ASHIFTRT, mode,
3569 XEXP (XEXP (XEXP (x, 0), 0), 1),
3570 XEXP (XEXP (x, 0), 1))) != 0)
3571 {
3572 rtx new
3573 = simplify_shift_const (NULL_RTX, ASHIFT, mode,
3574 XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 0),
3575 INTVAL (XEXP (XEXP (x, 0), 1)));
3576
3577 new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
3578 INTVAL (XEXP (XEXP (x, 0), 1)));
3579
3580 SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp));
3581 }
3582
663522cb 3583 /* If this is a simple operation applied to an IF_THEN_ELSE, try
d0ab8cd3 3584 applying it to the arms of the IF_THEN_ELSE. This often simplifies
abe6e52f
RK
3585 things. Check for cases where both arms are testing the same
3586 condition.
3587
3588 Don't do anything if all operands are very simple. */
3589
3590 if (((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c'
3591 || GET_RTX_CLASS (code) == '<')
3592 && ((GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o'
3593 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3594 && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0))))
3595 == 'o')))
3596 || (GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o'
3597 && ! (GET_CODE (XEXP (x, 1)) == SUBREG
3598 && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 1))))
3599 == 'o')))))
3600 || (GET_RTX_CLASS (code) == '1'
3601 && ((GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o'
3602 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3603 && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0))))
3604 == 'o'))))))
d0ab8cd3 3605 {
d6edb99e 3606 rtx cond, true_rtx, false_rtx;
abe6e52f 3607
d6edb99e 3608 cond = if_then_else_cond (x, &true_rtx, &false_rtx);
0802d516
RK
3609 if (cond != 0
3610 /* If everything is a comparison, what we have is highly unlikely
3611 to be simpler, so don't use it. */
3612 && ! (GET_RTX_CLASS (code) == '<'
d6edb99e
ZW
3613 && (GET_RTX_CLASS (GET_CODE (true_rtx)) == '<'
3614 || GET_RTX_CLASS (GET_CODE (false_rtx)) == '<')))
abe6e52f
RK
3615 {
3616 rtx cop1 = const0_rtx;
3617 enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
3618
15448afc
RK
3619 if (cond_code == NE && GET_RTX_CLASS (GET_CODE (cond)) == '<')
3620 return x;
3621
663522cb 3622 /* Simplify the alternative arms; this may collapse the true and
9210df58 3623 false arms to store-flag values. */
d6edb99e
ZW
3624 true_rtx = subst (true_rtx, pc_rtx, pc_rtx, 0, 0);
3625 false_rtx = subst (false_rtx, pc_rtx, pc_rtx, 0, 0);
9210df58 3626
d6edb99e 3627 /* If true_rtx and false_rtx are not general_operands, an if_then_else
085f1714 3628 is unlikely to be simpler. */
d6edb99e
ZW
3629 if (general_operand (true_rtx, VOIDmode)
3630 && general_operand (false_rtx, VOIDmode))
085f1714
RH
3631 {
3632 /* Restarting if we generate a store-flag expression will cause
3633 us to loop. Just drop through in this case. */
3634
3635 /* If the result values are STORE_FLAG_VALUE and zero, we can
3636 just make the comparison operation. */
d6edb99e 3637 if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
085f1714 3638 x = gen_binary (cond_code, mode, cond, cop1);
d6edb99e 3639 else if (true_rtx == const0_rtx && false_rtx == const_true_rtx)
085f1714
RH
3640 x = gen_binary (reverse_condition (cond_code),
3641 mode, cond, cop1);
3642
3643 /* Likewise, we can make the negate of a comparison operation
3644 if the result values are - STORE_FLAG_VALUE and zero. */
d6edb99e
ZW
3645 else if (GET_CODE (true_rtx) == CONST_INT
3646 && INTVAL (true_rtx) == - STORE_FLAG_VALUE
3647 && false_rtx == const0_rtx)
f1c6ba8b
RK
3648 x = simplify_gen_unary (NEG, mode,
3649 gen_binary (cond_code, mode, cond,
3650 cop1),
3651 mode);
d6edb99e
ZW
3652 else if (GET_CODE (false_rtx) == CONST_INT
3653 && INTVAL (false_rtx) == - STORE_FLAG_VALUE
3654 && true_rtx == const0_rtx)
f1c6ba8b
RK
3655 x = simplify_gen_unary (NEG, mode,
3656 gen_binary (reverse_condition
3657 (cond_code),
3658 mode, cond, cop1),
3659 mode);
085f1714
RH
3660 else
3661 return gen_rtx_IF_THEN_ELSE (mode,
3662 gen_binary (cond_code, VOIDmode,
3663 cond, cop1),
d6edb99e 3664 true_rtx, false_rtx);
5109d49f 3665
085f1714
RH
3666 code = GET_CODE (x);
3667 op0_mode = VOIDmode;
3668 }
abe6e52f 3669 }
d0ab8cd3
RK
3670 }
3671
230d793d
RS
3672 /* Try to fold this expression in case we have constants that weren't
3673 present before. */
3674 temp = 0;
3675 switch (GET_RTX_CLASS (code))
3676 {
3677 case '1':
3678 temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
3679 break;
3680 case '<':
47b1e19b
JH
3681 {
3682 enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
3683 if (cmp_mode == VOIDmode)
1cac8785
DD
3684 {
3685 cmp_mode = GET_MODE (XEXP (x, 1));
3686 if (cmp_mode == VOIDmode)
3687 cmp_mode = op0_mode;
3688 }
47b1e19b
JH
3689 temp = simplify_relational_operation (code, cmp_mode,
3690 XEXP (x, 0), XEXP (x, 1));
3691 }
77fa0940 3692#ifdef FLOAT_STORE_FLAG_VALUE
12530dbe
RH
3693 if (temp != 0 && GET_MODE_CLASS (mode) == MODE_FLOAT)
3694 {
3695 if (temp == const0_rtx)
3696 temp = CONST0_RTX (mode);
3697 else
3698 temp = immed_real_const_1 (FLOAT_STORE_FLAG_VALUE (mode), mode);
3699 }
77fa0940 3700#endif
230d793d
RS
3701 break;
3702 case 'c':
3703 case '2':
3704 temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
3705 break;
3706 case 'b':
3707 case '3':
3708 temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
3709 XEXP (x, 1), XEXP (x, 2));
3710 break;
3711 }
3712
3713 if (temp)
4531c1c7
DN
3714 {
3715 x = temp;
3716 code = GET_CODE (temp);
3717 op0_mode = VOIDmode;
3718 mode = GET_MODE (temp);
3719 }
230d793d 3720
230d793d 3721 /* First see if we can apply the inverse distributive law. */
224eeff2
RK
3722 if (code == PLUS || code == MINUS
3723 || code == AND || code == IOR || code == XOR)
230d793d
RS
3724 {
3725 x = apply_distributive_law (x);
3726 code = GET_CODE (x);
6e20204f 3727 op0_mode = VOIDmode;
230d793d
RS
3728 }
3729
3730 /* If CODE is an associative operation not otherwise handled, see if we
3731 can associate some operands. This can win if they are constants or
e0e08ac2 3732 if they are logically related (i.e. (a & b) & a). */
493efd37
TM
3733 if ((code == PLUS || code == MINUS || code == MULT || code == DIV
3734 || code == AND || code == IOR || code == XOR
230d793d 3735 || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
493efd37 3736 && ((INTEGRAL_MODE_P (mode) && code != DIV)
4ba5f925 3737 || (flag_unsafe_math_optimizations && FLOAT_MODE_P (mode))))
230d793d
RS
3738 {
3739 if (GET_CODE (XEXP (x, 0)) == code)
3740 {
3741 rtx other = XEXP (XEXP (x, 0), 0);
3742 rtx inner_op0 = XEXP (XEXP (x, 0), 1);
3743 rtx inner_op1 = XEXP (x, 1);
3744 rtx inner;
663522cb 3745
230d793d
RS
3746 /* Make sure we pass the constant operand if any as the second
3747 one if this is a commutative operation. */
3748 if (CONSTANT_P (inner_op0) && GET_RTX_CLASS (code) == 'c')
3749 {
3750 rtx tem = inner_op0;
3751 inner_op0 = inner_op1;
3752 inner_op1 = tem;
3753 }
3754 inner = simplify_binary_operation (code == MINUS ? PLUS
3755 : code == DIV ? MULT
230d793d
RS
3756 : code,
3757 mode, inner_op0, inner_op1);
3758
3759 /* For commutative operations, try the other pair if that one
3760 didn't simplify. */
3761 if (inner == 0 && GET_RTX_CLASS (code) == 'c')
3762 {
3763 other = XEXP (XEXP (x, 0), 1);
3764 inner = simplify_binary_operation (code, mode,
3765 XEXP (XEXP (x, 0), 0),
3766 XEXP (x, 1));
3767 }
3768
3769 if (inner)
8079805d 3770 return gen_binary (code, mode, other, inner);
230d793d
RS
3771 }
3772 }
3773
3774 /* A little bit of algebraic simplification here. */
3775 switch (code)
3776 {
3777 case MEM:
3778 /* Ensure that our address has any ASHIFTs converted to MULT in case
3779 address-recognizing predicates are called later. */
3780 temp = make_compound_operation (XEXP (x, 0), MEM);
3781 SUBST (XEXP (x, 0), temp);
3782 break;
3783
3784 case SUBREG:
eea50aa0
JH
3785 if (op0_mode == VOIDmode)
3786 op0_mode = GET_MODE (SUBREG_REG (x));
230d793d 3787
eea50aa0 3788 /* simplify_subreg can't use gen_lowpart_for_combine. */
3c99d5ff 3789 if (CONSTANT_P (SUBREG_REG (x))
e0e08ac2 3790 && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x))
230d793d
RS
3791 return gen_lowpart_for_combine (mode, SUBREG_REG (x));
3792
eea50aa0
JH
3793 {
3794 rtx temp;
3795 temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
23190837 3796 SUBREG_BYTE (x));
eea50aa0
JH
3797 if (temp)
3798 return temp;
3799 }
b65c1b5b 3800
87e3e0c1
RK
3801 /* Note that we cannot do any narrowing for non-constants since
3802 we might have been counting on using the fact that some bits were
3803 zero. We now do this in the SET. */
3804
230d793d
RS
3805 break;
3806
3807 case NOT:
3808 /* (not (plus X -1)) can become (neg X). */
3809 if (GET_CODE (XEXP (x, 0)) == PLUS
3810 && XEXP (XEXP (x, 0), 1) == constm1_rtx)
f1c6ba8b 3811 return gen_rtx_NEG (mode, XEXP (XEXP (x, 0), 0));
230d793d
RS
3812
3813 /* Similarly, (not (neg X)) is (plus X -1). */
3814 if (GET_CODE (XEXP (x, 0)) == NEG)
f1c6ba8b 3815 return gen_rtx_PLUS (mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
230d793d 3816
663522cb 3817 /* (not (xor X C)) for C constant is (xor X D) with D = ~C. */
d0ab8cd3
RK
3818 if (GET_CODE (XEXP (x, 0)) == XOR
3819 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3820 && (temp = simplify_unary_operation (NOT, mode,
3821 XEXP (XEXP (x, 0), 1),
3822 mode)) != 0)
787745f5 3823 return gen_binary (XOR, mode, XEXP (XEXP (x, 0), 0), temp);
663522cb 3824
230d793d
RS
3825 /* (not (ashift 1 X)) is (rotate ~1 X). We used to do this for operands
3826 other than 1, but that is not valid. We could do a similar
3827 simplification for (not (lshiftrt C X)) where C is just the sign bit,
3828 but this doesn't seem common enough to bother with. */
3829 if (GET_CODE (XEXP (x, 0)) == ASHIFT
3830 && XEXP (XEXP (x, 0), 0) == const1_rtx)
f1c6ba8b
RK
3831 return gen_rtx_ROTATE (mode, simplify_gen_unary (NOT, mode,
3832 const1_rtx, mode),
38a448ca 3833 XEXP (XEXP (x, 0), 1));
663522cb 3834
230d793d
RS
3835 if (GET_CODE (XEXP (x, 0)) == SUBREG
3836 && subreg_lowpart_p (XEXP (x, 0))
3837 && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0)))
3838 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0)))))
3839 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT
3840 && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx)
3841 {
3842 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0)));
3843
38a448ca 3844 x = gen_rtx_ROTATE (inner_mode,
f1c6ba8b
RK
3845 simplify_gen_unary (NOT, inner_mode, const1_rtx,
3846 inner_mode),
38a448ca 3847 XEXP (SUBREG_REG (XEXP (x, 0)), 1));
8079805d 3848 return gen_lowpart_for_combine (mode, x);
230d793d 3849 }
663522cb 3850
0802d516
RK
3851 /* If STORE_FLAG_VALUE is -1, (not (comparison foo bar)) can be done by
3852 reversing the comparison code if valid. */
3853 if (STORE_FLAG_VALUE == -1
3854 && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
9a915772
JH
3855 && (reversed = reversed_comparison (x, mode, XEXP (XEXP (x, 0), 0),
3856 XEXP (XEXP (x, 0), 1))))
3857 return reversed;
500c518b 3858
e61465ed
GS
3859 /* (not (ashiftrt foo C)) where C is the number of bits in FOO minus 1
3860 is (ge foo (const_int 0)) if STORE_FLAG_VALUE is -1, so we can
0802d516 3861 perform the above simplification. */
500c518b 3862
0802d516 3863 if (STORE_FLAG_VALUE == -1
500c518b
RK
3864 && GET_CODE (XEXP (x, 0)) == ASHIFTRT
3865 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3866 && INTVAL (XEXP (XEXP (x, 0), 1)) == GET_MODE_BITSIZE (mode) - 1)
f1c6ba8b 3867 return gen_rtx_GE (mode, XEXP (XEXP (x, 0), 0), const0_rtx);
230d793d
RS
3868
3869 /* Apply De Morgan's laws to reduce number of patterns for machines
23190837
AJ
3870 with negating logical insns (and-not, nand, etc.). If result has
3871 only one NOT, put it first, since that is how the patterns are
3872 coded. */
230d793d
RS
3873
3874 if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
23190837 3875 {
663522cb 3876 rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
5bd60ce6 3877 enum machine_mode op_mode;
230d793d 3878
5bd60ce6 3879 op_mode = GET_MODE (in1);
f1c6ba8b 3880 in1 = simplify_gen_unary (NOT, op_mode, in1, op_mode);
230d793d 3881
5bd60ce6
RH
3882 op_mode = GET_MODE (in2);
3883 if (op_mode == VOIDmode)
3884 op_mode = mode;
f1c6ba8b 3885 in2 = simplify_gen_unary (NOT, op_mode, in2, op_mode);
663522cb 3886
5bd60ce6 3887 if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT)
663522cb
KH
3888 {
3889 rtx tem = in2;
3890 in2 = in1; in1 = tem;
3891 }
3892
f1c6ba8b
RK
3893 return gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR,
3894 mode, in1, in2);
663522cb 3895 }
230d793d
RS
3896 break;
3897
3898 case NEG:
3899 /* (neg (plus X 1)) can become (not X). */
3900 if (GET_CODE (XEXP (x, 0)) == PLUS
3901 && XEXP (XEXP (x, 0), 1) == const1_rtx)
f1c6ba8b 3902 return gen_rtx_NOT (mode, XEXP (XEXP (x, 0), 0));
230d793d
RS
3903
3904 /* Similarly, (neg (not X)) is (plus X 1). */
3905 if (GET_CODE (XEXP (x, 0)) == NOT)
8079805d 3906 return plus_constant (XEXP (XEXP (x, 0), 0), 1);
230d793d 3907
230d793d
RS
3908 /* (neg (minus X Y)) can become (minus Y X). */
3909 if (GET_CODE (XEXP (x, 0)) == MINUS
3ad2180a 3910 && (! FLOAT_MODE_P (mode)
0f41302f 3911 /* x-y != -(y-x) with IEEE floating point. */
7e2a0d8e 3912 || TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
de6c5979 3913 || flag_unsafe_math_optimizations))
8079805d
RK
3914 return gen_binary (MINUS, mode, XEXP (XEXP (x, 0), 1),
3915 XEXP (XEXP (x, 0), 0));
230d793d 3916
0f41302f 3917 /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */
d0ab8cd3 3918 if (GET_CODE (XEXP (x, 0)) == XOR && XEXP (XEXP (x, 0), 1) == const1_rtx
951553af 3919 && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
8079805d 3920 return gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
d0ab8cd3 3921
230d793d
RS
3922 /* NEG commutes with ASHIFT since it is multiplication. Only do this
3923 if we can then eliminate the NEG (e.g.,
3924 if the operand is a constant). */
3925
3926 if (GET_CODE (XEXP (x, 0)) == ASHIFT)
3927 {
3928 temp = simplify_unary_operation (NEG, mode,
3929 XEXP (XEXP (x, 0), 0), mode);
3930 if (temp)
9def18da 3931 return gen_binary (ASHIFT, mode, temp, XEXP (XEXP (x, 0), 1));
230d793d
RS
3932 }
3933
3934 temp = expand_compound_operation (XEXP (x, 0));
3935
3936 /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
23190837 3937 replaced by (lshiftrt X C). This will convert
230d793d
RS
3938 (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */
3939
3940 if (GET_CODE (temp) == ASHIFTRT
3941 && GET_CODE (XEXP (temp, 1)) == CONST_INT
3942 && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
8079805d
RK
3943 return simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0),
3944 INTVAL (XEXP (temp, 1)));
230d793d 3945
951553af 3946 /* If X has only a single bit that might be nonzero, say, bit I, convert
230d793d
RS
3947 (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
3948 MODE minus 1. This will convert (neg (zero_extract X 1 Y)) to
3949 (sign_extract X 1 Y). But only do this if TEMP isn't a register
3950 or a SUBREG of one since we'd be making the expression more
3951 complex if it was just a register. */
3952
3953 if (GET_CODE (temp) != REG
3954 && ! (GET_CODE (temp) == SUBREG
3955 && GET_CODE (SUBREG_REG (temp)) == REG)
951553af 3956 && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
230d793d
RS
3957 {
3958 rtx temp1 = simplify_shift_const
5f4f0e22
CH
3959 (NULL_RTX, ASHIFTRT, mode,
3960 simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
230d793d
RS
3961 GET_MODE_BITSIZE (mode) - 1 - i),
3962 GET_MODE_BITSIZE (mode) - 1 - i);
3963
3964 /* If all we did was surround TEMP with the two shifts, we
3965 haven't improved anything, so don't use it. Otherwise,
3966 we are better off with TEMP1. */
3967 if (GET_CODE (temp1) != ASHIFTRT
3968 || GET_CODE (XEXP (temp1, 0)) != ASHIFT
3969 || XEXP (XEXP (temp1, 0), 0) != temp)
8079805d 3970 return temp1;
230d793d
RS
3971 }
3972 break;
3973
2ca9ae17 3974 case TRUNCATE:
e30fb98f
JL
3975 /* We can't handle truncation to a partial integer mode here
3976 because we don't know the real bitsize of the partial
3977 integer mode. */
3978 if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
3979 break;
3980
80608e27
JL
3981 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3982 && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
3983 GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
2ca9ae17
JW
3984 SUBST (XEXP (x, 0),
3985 force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
3986 GET_MODE_MASK (mode), NULL_RTX, 0));
0f13a422
ILT
3987
3988 /* (truncate:SI ({sign,zero}_extend:DI foo:SI)) == foo:SI. */
3989 if ((GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
3990 || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
3991 && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
3992 return XEXP (XEXP (x, 0), 0);
3993
3994 /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
3995 (OP:SI foo:SI) if OP is NEG or ABS. */
3996 if ((GET_CODE (XEXP (x, 0)) == ABS
3997 || GET_CODE (XEXP (x, 0)) == NEG)
3998 && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SIGN_EXTEND
3999 || GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND)
4000 && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
f1c6ba8b
RK
4001 return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4002 XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
0f13a422
ILT
4003
4004 /* (truncate:SI (subreg:DI (truncate:SI X) 0)) is
4005 (truncate:SI x). */
4006 if (GET_CODE (XEXP (x, 0)) == SUBREG
4007 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == TRUNCATE
4008 && subreg_lowpart_p (XEXP (x, 0)))
4009 return SUBREG_REG (XEXP (x, 0));
4010
4011 /* If we know that the value is already truncated, we can
14a774a9
RK
4012 replace the TRUNCATE with a SUBREG if TRULY_NOOP_TRUNCATION
4013 is nonzero for the corresponding modes. But don't do this
4014 for an (LSHIFTRT (MULT ...)) since this will cause problems
4015 with the umulXi3_highpart patterns. */
6a992214
JL
4016 if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
4017 GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
4018 && num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
14a774a9
RK
4019 >= GET_MODE_BITSIZE (mode) + 1
4020 && ! (GET_CODE (XEXP (x, 0)) == LSHIFTRT
23190837 4021 && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT))
0f13a422
ILT
4022 return gen_lowpart_for_combine (mode, XEXP (x, 0));
4023
4024 /* A truncate of a comparison can be replaced with a subreg if
4025 STORE_FLAG_VALUE permits. This is like the previous test,
4026 but it works even if the comparison is done in a mode larger
4027 than HOST_BITS_PER_WIDE_INT. */
4028 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4029 && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
663522cb 4030 && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0)
0f13a422
ILT
4031 return gen_lowpart_for_combine (mode, XEXP (x, 0));
4032
4033 /* Similarly, a truncate of a register whose value is a
4034 comparison can be replaced with a subreg if STORE_FLAG_VALUE
4035 permits. */
4036 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
663522cb 4037 && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
0f13a422
ILT
4038 && (temp = get_last_value (XEXP (x, 0)))
4039 && GET_RTX_CLASS (GET_CODE (temp)) == '<')
4040 return gen_lowpart_for_combine (mode, XEXP (x, 0));
4041
2ca9ae17
JW
4042 break;
4043
230d793d
RS
4044 case FLOAT_TRUNCATE:
4045 /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF. */
4046 if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
4047 && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
663522cb 4048 return XEXP (XEXP (x, 0), 0);
4635f748
RK
4049
4050 /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
4051 (OP:SF foo:SF) if OP is NEG or ABS. */
4052 if ((GET_CODE (XEXP (x, 0)) == ABS
4053 || GET_CODE (XEXP (x, 0)) == NEG)
4054 && GET_CODE (XEXP (XEXP (x, 0), 0)) == FLOAT_EXTEND
4055 && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
f1c6ba8b
RK
4056 return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4057 XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
1d12df72
RK
4058
4059 /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
4060 is (float_truncate:SF x). */
4061 if (GET_CODE (XEXP (x, 0)) == SUBREG
4062 && subreg_lowpart_p (XEXP (x, 0))
4063 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == FLOAT_TRUNCATE)
4064 return SUBREG_REG (XEXP (x, 0));
663522cb 4065 break;
230d793d
RS
4066
4067#ifdef HAVE_cc0
4068 case COMPARE:
4069 /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
4070 using cc0, in which case we want to leave it as a COMPARE
4071 so we can distinguish it from a register-register-copy. */
4072 if (XEXP (x, 1) == const0_rtx)
4073 return XEXP (x, 0);
4074
4075 /* In IEEE floating point, x-0 is not the same as x. */
4076 if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
7e2a0d8e 4077 || ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0)))
de6c5979 4078 || flag_unsafe_math_optimizations)
230d793d
RS
4079 && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
4080 return XEXP (x, 0);
4081 break;
4082#endif
4083
4084 case CONST:
4085 /* (const (const X)) can become (const X). Do it this way rather than
4086 returning the inner CONST since CONST can be shared with a
4087 REG_EQUAL note. */
4088 if (GET_CODE (XEXP (x, 0)) == CONST)
4089 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4090 break;
4091
4092#ifdef HAVE_lo_sum
4093 case LO_SUM:
4094 /* Convert (lo_sum (high FOO) FOO) to FOO. This is necessary so we
4095 can add in an offset. find_split_point will split this address up
4096 again if it doesn't match. */
4097 if (GET_CODE (XEXP (x, 0)) == HIGH
4098 && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
4099 return XEXP (x, 1);
4100 break;
4101#endif
4102
4103 case PLUS:
4104 /* If we have (plus (plus (A const) B)), associate it so that CONST is
4105 outermost. That's because that's the way indexed addresses are
4106 supposed to appear. This code used to check many more cases, but
4107 they are now checked elsewhere. */
4108 if (GET_CODE (XEXP (x, 0)) == PLUS
4109 && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
4110 return gen_binary (PLUS, mode,
4111 gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
4112 XEXP (x, 1)),
4113 XEXP (XEXP (x, 0), 1));
4114
4115 /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
4116 when c is (const_int (pow2 + 1) / 2) is a sign extension of a
4117 bit-field and can be replaced by either a sign_extend or a
e6380233
JL
4118 sign_extract. The `and' may be a zero_extend and the two
4119 <c>, -<c> constants may be reversed. */
230d793d
RS
4120 if (GET_CODE (XEXP (x, 0)) == XOR
4121 && GET_CODE (XEXP (x, 1)) == CONST_INT
4122 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
663522cb 4123 && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
e6380233
JL
4124 && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
4125 || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
5f4f0e22 4126 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
230d793d
RS
4127 && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
4128 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
4129 && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
5f4f0e22 4130 == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
230d793d
RS
4131 || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
4132 && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
770ae6cc 4133 == (unsigned int) i + 1))))
8079805d
RK
4134 return simplify_shift_const
4135 (NULL_RTX, ASHIFTRT, mode,
4136 simplify_shift_const (NULL_RTX, ASHIFT, mode,
4137 XEXP (XEXP (XEXP (x, 0), 0), 0),
4138 GET_MODE_BITSIZE (mode) - (i + 1)),
4139 GET_MODE_BITSIZE (mode) - (i + 1));
230d793d 4140
bc0776c6
RK
4141 /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
4142 C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
4143 is 1. This produces better code than the alternative immediately
4144 below. */
4145 if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
bc0776c6 4146 && ((STORE_FLAG_VALUE == -1 && XEXP (x, 1) == const1_rtx)
9a915772
JH
4147 || (STORE_FLAG_VALUE == 1 && XEXP (x, 1) == constm1_rtx))
4148 && (reversed = reversed_comparison (XEXP (x, 0), mode,
4149 XEXP (XEXP (x, 0), 0),
4150 XEXP (XEXP (x, 0), 1))))
8079805d 4151 return
f1c6ba8b 4152 simplify_gen_unary (NEG, mode, reversed, mode);
bc0776c6
RK
4153
4154 /* If only the low-order bit of X is possibly nonzero, (plus x -1)
230d793d
RS
4155 can become (ashiftrt (ashift (xor x 1) C) C) where C is
4156 the bitsize of the mode - 1. This allows simplification of
4157 "a = (b & 8) == 0;" */
4158 if (XEXP (x, 1) == constm1_rtx
4159 && GET_CODE (XEXP (x, 0)) != REG
4160 && ! (GET_CODE (XEXP (x,0)) == SUBREG
4161 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG)
951553af 4162 && nonzero_bits (XEXP (x, 0), mode) == 1)
8079805d
RK
4163 return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
4164 simplify_shift_const (NULL_RTX, ASHIFT, mode,
f1c6ba8b 4165 gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
8079805d
RK
4166 GET_MODE_BITSIZE (mode) - 1),
4167 GET_MODE_BITSIZE (mode) - 1);
02f4ada4
RK
4168
4169 /* If we are adding two things that have no bits in common, convert
4170 the addition into an IOR. This will often be further simplified,
4171 for example in cases like ((a & 1) + (a & 2)), which can
4172 become a & 3. */
4173
ac49a949 4174 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
951553af
RK
4175 && (nonzero_bits (XEXP (x, 0), mode)
4176 & nonzero_bits (XEXP (x, 1), mode)) == 0)
085f1714
RH
4177 {
4178 /* Try to simplify the expression further. */
4179 rtx tor = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
4180 temp = combine_simplify_rtx (tor, mode, last, in_dest);
4181
4182 /* If we could, great. If not, do not go ahead with the IOR
4183 replacement, since PLUS appears in many special purpose
4184 address arithmetic instructions. */
4185 if (GET_CODE (temp) != CLOBBER && temp != tor)
4186 return temp;
4187 }
230d793d
RS
4188 break;
4189
4190 case MINUS:
0802d516
RK
4191 /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
4192 by reversing the comparison code if valid. */
4193 if (STORE_FLAG_VALUE == 1
4194 && XEXP (x, 0) == const1_rtx
5109d49f 4195 && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) == '<'
9a915772
JH
4196 && (reversed = reversed_comparison (XEXP (x, 1), mode,
4197 XEXP (XEXP (x, 1), 0),
4198 XEXP (XEXP (x, 1), 1))))
4199 return reversed;
5109d49f 4200
230d793d
RS
4201 /* (minus <foo> (and <foo> (const_int -pow2))) becomes
4202 (and <foo> (const_int pow2-1)) */
4203 if (GET_CODE (XEXP (x, 1)) == AND
4204 && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
663522cb 4205 && exact_log2 (-INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
230d793d 4206 && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
8079805d 4207 return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
663522cb 4208 -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
7bef8680
RK
4209
4210 /* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
4211 integers. */
4212 if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
8079805d
RK
4213 return gen_binary (MINUS, mode,
4214 gen_binary (MINUS, mode, XEXP (x, 0),
4215 XEXP (XEXP (x, 1), 0)),
4216 XEXP (XEXP (x, 1), 1));
230d793d
RS
4217 break;
4218
4219 case MULT:
4220 /* If we have (mult (plus A B) C), apply the distributive law and then
4221 the inverse distributive law to see if things simplify. This
4222 occurs mostly in addresses, often when unrolling loops. */
4223
4224 if (GET_CODE (XEXP (x, 0)) == PLUS)
4225 {
4226 x = apply_distributive_law
4227 (gen_binary (PLUS, mode,
4228 gen_binary (MULT, mode,
4229 XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
4230 gen_binary (MULT, mode,
3749f4ca
BS
4231 XEXP (XEXP (x, 0), 1),
4232 copy_rtx (XEXP (x, 1)))));
230d793d
RS
4233
4234 if (GET_CODE (x) != MULT)
8079805d 4235 return x;
230d793d 4236 }
4ba5f925
JH
4237 /* Try simplify a*(b/c) as (a*b)/c. */
4238 if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
4239 && GET_CODE (XEXP (x, 0)) == DIV)
4240 {
4241 rtx tem = simplify_binary_operation (MULT, mode,
4242 XEXP (XEXP (x, 0), 0),
4243 XEXP (x, 1));
4244 if (tem)
4245 return gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
4246 }
230d793d
RS
4247 break;
4248
4249 case UDIV:
4250 /* If this is a divide by a power of two, treat it as a shift if
4251 its first operand is a shift. */
4252 if (GET_CODE (XEXP (x, 1)) == CONST_INT
4253 && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
4254 && (GET_CODE (XEXP (x, 0)) == ASHIFT
4255 || GET_CODE (XEXP (x, 0)) == LSHIFTRT
4256 || GET_CODE (XEXP (x, 0)) == ASHIFTRT
4257 || GET_CODE (XEXP (x, 0)) == ROTATE
4258 || GET_CODE (XEXP (x, 0)) == ROTATERT))
8079805d 4259 return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
230d793d
RS
4260 break;
4261
4262 case EQ: case NE:
4263 case GT: case GTU: case GE: case GEU:
4264 case LT: case LTU: case LE: case LEU:
69bc0a1f 4265 case UNEQ: case LTGT:
23190837
AJ
4266 case UNGT: case UNGE:
4267 case UNLT: case UNLE:
69bc0a1f 4268 case UNORDERED: case ORDERED:
230d793d
RS
4269 /* If the first operand is a condition code, we can't do anything
4270 with it. */
4271 if (GET_CODE (XEXP (x, 0)) == COMPARE
4272 || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
4273#ifdef HAVE_cc0
4274 && XEXP (x, 0) != cc0_rtx
4275#endif
663522cb 4276 ))
230d793d
RS
4277 {
4278 rtx op0 = XEXP (x, 0);
4279 rtx op1 = XEXP (x, 1);
4280 enum rtx_code new_code;
4281
4282 if (GET_CODE (op0) == COMPARE)
4283 op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
4284
4285 /* Simplify our comparison, if possible. */
4286 new_code = simplify_comparison (code, &op0, &op1);
4287
230d793d 4288 /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
951553af 4289 if only the low-order bit is possibly nonzero in X (such as when
5109d49f
RK
4290 X is a ZERO_EXTRACT of one bit). Similarly, we can convert EQ to
4291 (xor X 1) or (minus 1 X); we use the former. Finally, if X is
4292 known to be either 0 or -1, NE becomes a NEG and EQ becomes
4293 (plus X 1).
4294
4295 Remove any ZERO_EXTRACT we made when thinking this was a
4296 comparison. It may now be simpler to use, e.g., an AND. If a
4297 ZERO_EXTRACT is indeed appropriate, it will be placed back by
4298 the call to make_compound_operation in the SET case. */
4299
0802d516
RK
4300 if (STORE_FLAG_VALUE == 1
4301 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
a191f0ee
RH
4302 && op1 == const0_rtx
4303 && mode == GET_MODE (op0)
4304 && nonzero_bits (op0, mode) == 1)
818b11b9
RK
4305 return gen_lowpart_for_combine (mode,
4306 expand_compound_operation (op0));
5109d49f 4307
0802d516
RK
4308 else if (STORE_FLAG_VALUE == 1
4309 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5109d49f 4310 && op1 == const0_rtx
a191f0ee 4311 && mode == GET_MODE (op0)
5109d49f
RK
4312 && (num_sign_bit_copies (op0, mode)
4313 == GET_MODE_BITSIZE (mode)))
4314 {
4315 op0 = expand_compound_operation (op0);
f1c6ba8b
RK
4316 return simplify_gen_unary (NEG, mode,
4317 gen_lowpart_for_combine (mode, op0),
4318 mode);
5109d49f
RK
4319 }
4320
0802d516
RK
4321 else if (STORE_FLAG_VALUE == 1
4322 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
230d793d 4323 && op1 == const0_rtx
a191f0ee 4324 && mode == GET_MODE (op0)
5109d49f 4325 && nonzero_bits (op0, mode) == 1)
818b11b9
RK
4326 {
4327 op0 = expand_compound_operation (op0);
8079805d
RK
4328 return gen_binary (XOR, mode,
4329 gen_lowpart_for_combine (mode, op0),
4330 const1_rtx);
5109d49f 4331 }
818b11b9 4332
0802d516
RK
4333 else if (STORE_FLAG_VALUE == 1
4334 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5109d49f 4335 && op1 == const0_rtx
a191f0ee 4336 && mode == GET_MODE (op0)
5109d49f
RK
4337 && (num_sign_bit_copies (op0, mode)
4338 == GET_MODE_BITSIZE (mode)))
4339 {
4340 op0 = expand_compound_operation (op0);
8079805d 4341 return plus_constant (gen_lowpart_for_combine (mode, op0), 1);
818b11b9 4342 }
230d793d 4343
5109d49f
RK
4344 /* If STORE_FLAG_VALUE is -1, we have cases similar to
4345 those above. */
0802d516
RK
4346 if (STORE_FLAG_VALUE == -1
4347 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
230d793d 4348 && op1 == const0_rtx
5109d49f
RK
4349 && (num_sign_bit_copies (op0, mode)
4350 == GET_MODE_BITSIZE (mode)))
4351 return gen_lowpart_for_combine (mode,
4352 expand_compound_operation (op0));
4353
0802d516
RK
4354 else if (STORE_FLAG_VALUE == -1
4355 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5109d49f 4356 && op1 == const0_rtx
a191f0ee 4357 && mode == GET_MODE (op0)
5109d49f
RK
4358 && nonzero_bits (op0, mode) == 1)
4359 {
4360 op0 = expand_compound_operation (op0);
f1c6ba8b
RK
4361 return simplify_gen_unary (NEG, mode,
4362 gen_lowpart_for_combine (mode, op0),
4363 mode);
5109d49f
RK
4364 }
4365
0802d516
RK
4366 else if (STORE_FLAG_VALUE == -1
4367 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5109d49f 4368 && op1 == const0_rtx
a191f0ee 4369 && mode == GET_MODE (op0)
5109d49f
RK
4370 && (num_sign_bit_copies (op0, mode)
4371 == GET_MODE_BITSIZE (mode)))
230d793d 4372 {
818b11b9 4373 op0 = expand_compound_operation (op0);
f1c6ba8b
RK
4374 return simplify_gen_unary (NOT, mode,
4375 gen_lowpart_for_combine (mode, op0),
4376 mode);
5109d49f
RK
4377 }
4378
4379 /* If X is 0/1, (eq X 0) is X-1. */
0802d516
RK
4380 else if (STORE_FLAG_VALUE == -1
4381 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5109d49f 4382 && op1 == const0_rtx
a191f0ee 4383 && mode == GET_MODE (op0)
5109d49f
RK
4384 && nonzero_bits (op0, mode) == 1)
4385 {
4386 op0 = expand_compound_operation (op0);
8079805d 4387 return plus_constant (gen_lowpart_for_combine (mode, op0), -1);
230d793d 4388 }
230d793d
RS
4389
4390 /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
951553af
RK
4391 one bit that might be nonzero, we can convert (ne x 0) to
4392 (ashift x c) where C puts the bit in the sign bit. Remove any
4393 AND with STORE_FLAG_VALUE when we are done, since we are only
4394 going to test the sign bit. */
3f508eca 4395 if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5f4f0e22 4396 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
0802d516 4397 && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
e51712db 4398 == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE(mode)-1))
230d793d
RS
4399 && op1 == const0_rtx
4400 && mode == GET_MODE (op0)
5109d49f 4401 && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
230d793d 4402 {
818b11b9
RK
4403 x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
4404 expand_compound_operation (op0),
230d793d
RS
4405 GET_MODE_BITSIZE (mode) - 1 - i);
4406 if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
4407 return XEXP (x, 0);
4408 else
4409 return x;
4410 }
4411
4412 /* If the code changed, return a whole new comparison. */
4413 if (new_code != code)
f1c6ba8b 4414 return gen_rtx_fmt_ee (new_code, mode, op0, op1);
230d793d 4415
663522cb 4416 /* Otherwise, keep this operation, but maybe change its operands.
230d793d
RS
4417 This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR). */
4418 SUBST (XEXP (x, 0), op0);
4419 SUBST (XEXP (x, 1), op1);
4420 }
4421 break;
663522cb 4422
230d793d 4423 case IF_THEN_ELSE:
8079805d 4424 return simplify_if_then_else (x);
9210df58 4425
8079805d
RK
4426 case ZERO_EXTRACT:
4427 case SIGN_EXTRACT:
4428 case ZERO_EXTEND:
4429 case SIGN_EXTEND:
0f41302f 4430 /* If we are processing SET_DEST, we are done. */
8079805d
RK
4431 if (in_dest)
4432 return x;
d0ab8cd3 4433
8079805d 4434 return expand_compound_operation (x);
d0ab8cd3 4435
8079805d
RK
4436 case SET:
4437 return simplify_set (x);
1a26b032 4438
8079805d
RK
4439 case AND:
4440 case IOR:
4441 case XOR:
4442 return simplify_logical (x, last);
d0ab8cd3 4443
663522cb 4444 case ABS:
8079805d
RK
4445 /* (abs (neg <foo>)) -> (abs <foo>) */
4446 if (GET_CODE (XEXP (x, 0)) == NEG)
4447 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
1a26b032 4448
b472527b
JL
4449 /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
4450 do nothing. */
4451 if (GET_MODE (XEXP (x, 0)) == VOIDmode)
4452 break;
f40421ce 4453
8079805d
RK
4454 /* If operand is something known to be positive, ignore the ABS. */
4455 if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS
4456 || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4457 <= HOST_BITS_PER_WIDE_INT)
4458 && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4459 & ((HOST_WIDE_INT) 1
4460 << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))
4461 == 0)))
4462 return XEXP (x, 0);
1a26b032 4463
8079805d
RK
4464 /* If operand is known to be only -1 or 0, convert ABS to NEG. */
4465 if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode))
f1c6ba8b 4466 return gen_rtx_NEG (mode, XEXP (x, 0));
1a26b032 4467
8079805d 4468 break;
1a26b032 4469
8079805d
RK
4470 case FFS:
4471 /* (ffs (*_extend <X>)) = (ffs <X>) */
4472 if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4473 || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4474 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4475 break;
1a26b032 4476
8079805d
RK
4477 case FLOAT:
4478 /* (float (sign_extend <X>)) = (float <X>). */
4479 if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
4480 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4481 break;
1a26b032 4482
8079805d
RK
4483 case ASHIFT:
4484 case LSHIFTRT:
4485 case ASHIFTRT:
4486 case ROTATE:
4487 case ROTATERT:
4488 /* If this is a shift by a constant amount, simplify it. */
4489 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
663522cb 4490 return simplify_shift_const (x, code, mode, XEXP (x, 0),
8079805d
RK
4491 INTVAL (XEXP (x, 1)));
4492
4493#ifdef SHIFT_COUNT_TRUNCATED
4494 else if (SHIFT_COUNT_TRUNCATED && GET_CODE (XEXP (x, 1)) != REG)
4495 SUBST (XEXP (x, 1),
4496 force_to_mode (XEXP (x, 1), GET_MODE (x),
663522cb 4497 ((HOST_WIDE_INT) 1
8079805d
RK
4498 << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
4499 - 1,
4500 NULL_RTX, 0));
4501#endif
4502
4503 break;
e9a25f70 4504
82be40f7
BS
4505 case VEC_SELECT:
4506 {
4507 rtx op0 = XEXP (x, 0);
4508 rtx op1 = XEXP (x, 1);
4509 int len;
4510
4511 if (GET_CODE (op1) != PARALLEL)
4512 abort ();
4513 len = XVECLEN (op1, 0);
4514 if (len == 1
4515 && GET_CODE (XVECEXP (op1, 0, 0)) == CONST_INT
4516 && GET_CODE (op0) == VEC_CONCAT)
4517 {
4518 int offset = INTVAL (XVECEXP (op1, 0, 0)) * GET_MODE_SIZE (GET_MODE (x));
4519
4520 /* Try to find the element in the VEC_CONCAT. */
4521 for (;;)
4522 {
4523 if (GET_MODE (op0) == GET_MODE (x))
4524 return op0;
4525 if (GET_CODE (op0) == VEC_CONCAT)
4526 {
4527 HOST_WIDE_INT op0_size = GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)));
4528 if (op0_size < offset)
4529 op0 = XEXP (op0, 0);
4530 else
4531 {
4532 offset -= op0_size;
4533 op0 = XEXP (op0, 1);
4534 }
4535 }
4536 else
4537 break;
4538 }
4539 }
4540 }
4541
4542 break;
23190837 4543
e9a25f70
JL
4544 default:
4545 break;
8079805d
RK
4546 }
4547
4548 return x;
4549}
4550\f
4551/* Simplify X, an IF_THEN_ELSE expression. Return the new expression. */
5109d49f 4552
8079805d
RK
4553static rtx
4554simplify_if_then_else (x)
4555 rtx x;
4556{
4557 enum machine_mode mode = GET_MODE (x);
4558 rtx cond = XEXP (x, 0);
d6edb99e
ZW
4559 rtx true_rtx = XEXP (x, 1);
4560 rtx false_rtx = XEXP (x, 2);
8079805d
RK
4561 enum rtx_code true_code = GET_CODE (cond);
4562 int comparison_p = GET_RTX_CLASS (true_code) == '<';
4563 rtx temp;
4564 int i;
9a915772
JH
4565 enum rtx_code false_code;
4566 rtx reversed;
8079805d 4567
0f41302f 4568 /* Simplify storing of the truth value. */
d6edb99e 4569 if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
8079805d 4570 return gen_binary (true_code, mode, XEXP (cond, 0), XEXP (cond, 1));
663522cb 4571
0f41302f 4572 /* Also when the truth value has to be reversed. */
9a915772 4573 if (comparison_p
d6edb99e 4574 && true_rtx == const0_rtx && false_rtx == const_true_rtx
9a915772
JH
4575 && (reversed = reversed_comparison (cond, mode, XEXP (cond, 0),
4576 XEXP (cond, 1))))
4577 return reversed;
8079805d
RK
4578
4579 /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
4580 in it is being compared against certain values. Get the true and false
4581 comparisons and see if that says anything about the value of each arm. */
4582
9a915772
JH
4583 if (comparison_p
4584 && ((false_code = combine_reversed_comparison_code (cond))
4585 != UNKNOWN)
8079805d
RK
4586 && GET_CODE (XEXP (cond, 0)) == REG)
4587 {
4588 HOST_WIDE_INT nzb;
4589 rtx from = XEXP (cond, 0);
8079805d
RK
4590 rtx true_val = XEXP (cond, 1);
4591 rtx false_val = true_val;
4592 int swapped = 0;
9210df58 4593
8079805d 4594 /* If FALSE_CODE is EQ, swap the codes and arms. */
5109d49f 4595
8079805d 4596 if (false_code == EQ)
1a26b032 4597 {
8079805d 4598 swapped = 1, true_code = EQ, false_code = NE;
d6edb99e 4599 temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
8079805d 4600 }
5109d49f 4601
8079805d
RK
4602 /* If we are comparing against zero and the expression being tested has
4603 only a single bit that might be nonzero, that is its value when it is
4604 not equal to zero. Similarly if it is known to be -1 or 0. */
4605
4606 if (true_code == EQ && true_val == const0_rtx
4607 && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
4608 false_code = EQ, false_val = GEN_INT (nzb);
4609 else if (true_code == EQ && true_val == const0_rtx
4610 && (num_sign_bit_copies (from, GET_MODE (from))
4611 == GET_MODE_BITSIZE (GET_MODE (from))))
4612 false_code = EQ, false_val = constm1_rtx;
4613
4614 /* Now simplify an arm if we know the value of the register in the
4615 branch and it is used in the arm. Be careful due to the potential
4616 of locally-shared RTL. */
4617
d6edb99e
ZW
4618 if (reg_mentioned_p (from, true_rtx))
4619 true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
4620 from, true_val),
8079805d 4621 pc_rtx, pc_rtx, 0, 0);
d6edb99e
ZW
4622 if (reg_mentioned_p (from, false_rtx))
4623 false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
8079805d
RK
4624 from, false_val),
4625 pc_rtx, pc_rtx, 0, 0);
4626
d6edb99e
ZW
4627 SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
4628 SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
8079805d 4629
d6edb99e
ZW
4630 true_rtx = XEXP (x, 1);
4631 false_rtx = XEXP (x, 2);
4632 true_code = GET_CODE (cond);
8079805d 4633 }
5109d49f 4634
8079805d
RK
4635 /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
4636 reversed, do so to avoid needing two sets of patterns for
4637 subtract-and-branch insns. Similarly if we have a constant in the true
4638 arm, the false arm is the same as the first operand of the comparison, or
4639 the false arm is more complicated than the true arm. */
4640
9a915772
JH
4641 if (comparison_p
4642 && combine_reversed_comparison_code (cond) != UNKNOWN
d6edb99e
ZW
4643 && (true_rtx == pc_rtx
4644 || (CONSTANT_P (true_rtx)
4645 && GET_CODE (false_rtx) != CONST_INT && false_rtx != pc_rtx)
4646 || true_rtx == const0_rtx
4647 || (GET_RTX_CLASS (GET_CODE (true_rtx)) == 'o'
4648 && GET_RTX_CLASS (GET_CODE (false_rtx)) != 'o')
4649 || (GET_CODE (true_rtx) == SUBREG
4650 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (true_rtx))) == 'o'
4651 && GET_RTX_CLASS (GET_CODE (false_rtx)) != 'o')
4652 || reg_mentioned_p (true_rtx, false_rtx)
4653 || rtx_equal_p (false_rtx, XEXP (cond, 0))))
8079805d 4654 {
9a915772 4655 true_code = reversed_comparison_code (cond, NULL);
8079805d 4656 SUBST (XEXP (x, 0),
9a915772
JH
4657 reversed_comparison (cond, GET_MODE (cond), XEXP (cond, 0),
4658 XEXP (cond, 1)));
5109d49f 4659
d6edb99e
ZW
4660 SUBST (XEXP (x, 1), false_rtx);
4661 SUBST (XEXP (x, 2), true_rtx);
1a26b032 4662
d6edb99e
ZW
4663 temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
4664 cond = XEXP (x, 0);
bb821298 4665
0f41302f 4666 /* It is possible that the conditional has been simplified out. */
bb821298
RK
4667 true_code = GET_CODE (cond);
4668 comparison_p = GET_RTX_CLASS (true_code) == '<';
8079805d 4669 }
abe6e52f 4670
8079805d 4671 /* If the two arms are identical, we don't need the comparison. */
1a26b032 4672
d6edb99e
ZW
4673 if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
4674 return true_rtx;
1a26b032 4675
5be669c7
RK
4676 /* Convert a == b ? b : a to "a". */
4677 if (true_code == EQ && ! side_effects_p (cond)
de6c5979 4678 && (! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
d6edb99e
ZW
4679 && rtx_equal_p (XEXP (cond, 0), false_rtx)
4680 && rtx_equal_p (XEXP (cond, 1), true_rtx))
4681 return false_rtx;
5be669c7 4682 else if (true_code == NE && ! side_effects_p (cond)
de6c5979 4683 && (! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
d6edb99e
ZW
4684 && rtx_equal_p (XEXP (cond, 0), true_rtx)
4685 && rtx_equal_p (XEXP (cond, 1), false_rtx))
4686 return true_rtx;
5be669c7 4687
8079805d
RK
4688 /* Look for cases where we have (abs x) or (neg (abs X)). */
4689
4690 if (GET_MODE_CLASS (mode) == MODE_INT
d6edb99e
ZW
4691 && GET_CODE (false_rtx) == NEG
4692 && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
8079805d 4693 && comparison_p
d6edb99e
ZW
4694 && rtx_equal_p (true_rtx, XEXP (cond, 0))
4695 && ! side_effects_p (true_rtx))
8079805d
RK
4696 switch (true_code)
4697 {
4698 case GT:
4699 case GE:
f1c6ba8b 4700 return simplify_gen_unary (ABS, mode, true_rtx, mode);
8079805d
RK
4701 case LT:
4702 case LE:
f1c6ba8b
RK
4703 return
4704 simplify_gen_unary (NEG, mode,
4705 simplify_gen_unary (ABS, mode, true_rtx, mode),
4706 mode);
e9a25f70
JL
4707 default:
4708 break;
8079805d
RK
4709 }
4710
4711 /* Look for MIN or MAX. */
4712
de6c5979 4713 if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
8079805d 4714 && comparison_p
d6edb99e
ZW
4715 && rtx_equal_p (XEXP (cond, 0), true_rtx)
4716 && rtx_equal_p (XEXP (cond, 1), false_rtx)
8079805d
RK
4717 && ! side_effects_p (cond))
4718 switch (true_code)
4719 {
4720 case GE:
4721 case GT:
d6edb99e 4722 return gen_binary (SMAX, mode, true_rtx, false_rtx);
8079805d
RK
4723 case LE:
4724 case LT:
d6edb99e 4725 return gen_binary (SMIN, mode, true_rtx, false_rtx);
8079805d
RK
4726 case GEU:
4727 case GTU:
d6edb99e 4728 return gen_binary (UMAX, mode, true_rtx, false_rtx);
8079805d
RK
4729 case LEU:
4730 case LTU:
d6edb99e 4731 return gen_binary (UMIN, mode, true_rtx, false_rtx);
e9a25f70
JL
4732 default:
4733 break;
8079805d 4734 }
663522cb 4735
8079805d
RK
4736 /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
4737 second operand is zero, this can be done as (OP Z (mult COND C2)) where
4738 C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
4739 SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
4740 We can do this kind of thing in some cases when STORE_FLAG_VALUE is
0802d516 4741 neither 1 or -1, but it isn't worth checking for. */
8079805d 4742
0802d516
RK
4743 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
4744 && comparison_p && mode != VOIDmode && ! side_effects_p (x))
8079805d 4745 {
d6edb99e
ZW
4746 rtx t = make_compound_operation (true_rtx, SET);
4747 rtx f = make_compound_operation (false_rtx, SET);
8079805d
RK
4748 rtx cond_op0 = XEXP (cond, 0);
4749 rtx cond_op1 = XEXP (cond, 1);
6a651371 4750 enum rtx_code op = NIL, extend_op = NIL;
8079805d 4751 enum machine_mode m = mode;
6a651371 4752 rtx z = 0, c1 = NULL_RTX;
8079805d 4753
8079805d
RK
4754 if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
4755 || GET_CODE (t) == IOR || GET_CODE (t) == XOR
4756 || GET_CODE (t) == ASHIFT
4757 || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
4758 && rtx_equal_p (XEXP (t, 0), f))
4759 c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
4760
4761 /* If an identity-zero op is commutative, check whether there
0f41302f 4762 would be a match if we swapped the operands. */
8079805d
RK
4763 else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
4764 || GET_CODE (t) == XOR)
4765 && rtx_equal_p (XEXP (t, 1), f))
4766 c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
4767 else if (GET_CODE (t) == SIGN_EXTEND
4768 && (GET_CODE (XEXP (t, 0)) == PLUS
4769 || GET_CODE (XEXP (t, 0)) == MINUS
4770 || GET_CODE (XEXP (t, 0)) == IOR
4771 || GET_CODE (XEXP (t, 0)) == XOR
4772 || GET_CODE (XEXP (t, 0)) == ASHIFT
4773 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4774 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4775 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4776 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4777 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4778 && (num_sign_bit_copies (f, GET_MODE (f))
4779 > (GET_MODE_BITSIZE (mode)
4780 - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
4781 {
4782 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4783 extend_op = SIGN_EXTEND;
4784 m = GET_MODE (XEXP (t, 0));
1a26b032 4785 }
8079805d
RK
4786 else if (GET_CODE (t) == SIGN_EXTEND
4787 && (GET_CODE (XEXP (t, 0)) == PLUS
4788 || GET_CODE (XEXP (t, 0)) == IOR
4789 || GET_CODE (XEXP (t, 0)) == XOR)
4790 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4791 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4792 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4793 && (num_sign_bit_copies (f, GET_MODE (f))
4794 > (GET_MODE_BITSIZE (mode)
4795 - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
4796 {
4797 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
4798 extend_op = SIGN_EXTEND;
4799 m = GET_MODE (XEXP (t, 0));
4800 }
4801 else if (GET_CODE (t) == ZERO_EXTEND
4802 && (GET_CODE (XEXP (t, 0)) == PLUS
4803 || GET_CODE (XEXP (t, 0)) == MINUS
4804 || GET_CODE (XEXP (t, 0)) == IOR
4805 || GET_CODE (XEXP (t, 0)) == XOR
4806 || GET_CODE (XEXP (t, 0)) == ASHIFT
4807 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4808 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4809 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4810 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4811 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4812 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4813 && ((nonzero_bits (f, GET_MODE (f))
663522cb 4814 & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
8079805d
RK
4815 == 0))
4816 {
4817 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4818 extend_op = ZERO_EXTEND;
4819 m = GET_MODE (XEXP (t, 0));
4820 }
4821 else if (GET_CODE (t) == ZERO_EXTEND
4822 && (GET_CODE (XEXP (t, 0)) == PLUS
4823 || GET_CODE (XEXP (t, 0)) == IOR
4824 || GET_CODE (XEXP (t, 0)) == XOR)
4825 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4826 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4827 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4828 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4829 && ((nonzero_bits (f, GET_MODE (f))
663522cb 4830 & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
8079805d
RK
4831 == 0))
4832 {
4833 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
4834 extend_op = ZERO_EXTEND;
4835 m = GET_MODE (XEXP (t, 0));
4836 }
663522cb 4837
8079805d
RK
4838 if (z)
4839 {
4840 temp = subst (gen_binary (true_code, m, cond_op0, cond_op1),
4841 pc_rtx, pc_rtx, 0, 0);
4842 temp = gen_binary (MULT, m, temp,
4843 gen_binary (MULT, m, c1, const_true_rtx));
4844 temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
4845 temp = gen_binary (op, m, gen_lowpart_for_combine (m, z), temp);
4846
4847 if (extend_op != NIL)
f1c6ba8b 4848 temp = simplify_gen_unary (extend_op, mode, temp, m);
8079805d
RK
4849
4850 return temp;
4851 }
4852 }
224eeff2 4853
8079805d
RK
4854 /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
4855 1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
4856 negation of a single bit, we can convert this operation to a shift. We
4857 can actually do this more generally, but it doesn't seem worth it. */
4858
4859 if (true_code == NE && XEXP (cond, 1) == const0_rtx
d6edb99e 4860 && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
8079805d 4861 && ((1 == nonzero_bits (XEXP (cond, 0), mode)
d6edb99e 4862 && (i = exact_log2 (INTVAL (true_rtx))) >= 0)
8079805d
RK
4863 || ((num_sign_bit_copies (XEXP (cond, 0), mode)
4864 == GET_MODE_BITSIZE (mode))
d6edb99e 4865 && (i = exact_log2 (-INTVAL (true_rtx))) >= 0)))
8079805d
RK
4866 return
4867 simplify_shift_const (NULL_RTX, ASHIFT, mode,
4868 gen_lowpart_for_combine (mode, XEXP (cond, 0)), i);
230d793d 4869
8079805d
RK
4870 return x;
4871}
4872\f
4873/* Simplify X, a SET expression. Return the new expression. */
230d793d 4874
8079805d
RK
4875static rtx
4876simplify_set (x)
4877 rtx x;
4878{
4879 rtx src = SET_SRC (x);
4880 rtx dest = SET_DEST (x);
4881 enum machine_mode mode
4882 = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
4883 rtx other_insn;
4884 rtx *cc_use;
4885
4886 /* (set (pc) (return)) gets written as (return). */
4887 if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
4888 return src;
230d793d 4889
87e3e0c1
RK
4890 /* Now that we know for sure which bits of SRC we are using, see if we can
4891 simplify the expression for the object knowing that we only need the
4892 low-order bits. */
4893
4894 if (GET_MODE_CLASS (mode) == MODE_INT)
c5c76735 4895 {
e8dc6d50 4896 src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, NULL_RTX, 0);
c5c76735
JL
4897 SUBST (SET_SRC (x), src);
4898 }
87e3e0c1 4899
8079805d
RK
4900 /* If we are setting CC0 or if the source is a COMPARE, look for the use of
4901 the comparison result and try to simplify it unless we already have used
4902 undobuf.other_insn. */
4903 if ((GET_CODE (src) == COMPARE
230d793d 4904#ifdef HAVE_cc0
8079805d 4905 || dest == cc0_rtx
230d793d 4906#endif
8079805d
RK
4907 )
4908 && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
4909 && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
4910 && GET_RTX_CLASS (GET_CODE (*cc_use)) == '<'
c0d3ac4d 4911 && rtx_equal_p (XEXP (*cc_use, 0), dest))
8079805d
RK
4912 {
4913 enum rtx_code old_code = GET_CODE (*cc_use);
4914 enum rtx_code new_code;
4915 rtx op0, op1;
4916 int other_changed = 0;
4917 enum machine_mode compare_mode = GET_MODE (dest);
4918
4919 if (GET_CODE (src) == COMPARE)
4920 op0 = XEXP (src, 0), op1 = XEXP (src, 1);
4921 else
4922 op0 = src, op1 = const0_rtx;
230d793d 4923
8079805d
RK
4924 /* Simplify our comparison, if possible. */
4925 new_code = simplify_comparison (old_code, &op0, &op1);
230d793d 4926
c141a106 4927#ifdef EXTRA_CC_MODES
8079805d
RK
4928 /* If this machine has CC modes other than CCmode, check to see if we
4929 need to use a different CC mode here. */
4930 compare_mode = SELECT_CC_MODE (new_code, op0, op1);
c141a106 4931#endif /* EXTRA_CC_MODES */
230d793d 4932
c141a106 4933#if !defined (HAVE_cc0) && defined (EXTRA_CC_MODES)
8079805d
RK
4934 /* If the mode changed, we have to change SET_DEST, the mode in the
4935 compare, and the mode in the place SET_DEST is used. If SET_DEST is
4936 a hard register, just build new versions with the proper mode. If it
4937 is a pseudo, we lose unless it is only time we set the pseudo, in
4938 which case we can safely change its mode. */
4939 if (compare_mode != GET_MODE (dest))
4940 {
770ae6cc 4941 unsigned int regno = REGNO (dest);
38a448ca 4942 rtx new_dest = gen_rtx_REG (compare_mode, regno);
8079805d
RK
4943
4944 if (regno < FIRST_PSEUDO_REGISTER
b1f21e0a 4945 || (REG_N_SETS (regno) == 1 && ! REG_USERVAR_P (dest)))
230d793d 4946 {
8079805d
RK
4947 if (regno >= FIRST_PSEUDO_REGISTER)
4948 SUBST (regno_reg_rtx[regno], new_dest);
230d793d 4949
8079805d
RK
4950 SUBST (SET_DEST (x), new_dest);
4951 SUBST (XEXP (*cc_use, 0), new_dest);
4952 other_changed = 1;
230d793d 4953
8079805d 4954 dest = new_dest;
230d793d 4955 }
8079805d 4956 }
230d793d
RS
4957#endif
4958
8079805d
RK
4959 /* If the code changed, we have to build a new comparison in
4960 undobuf.other_insn. */
4961 if (new_code != old_code)
4962 {
4963 unsigned HOST_WIDE_INT mask;
4964
f1c6ba8b
RK
4965 SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
4966 dest, const0_rtx));
8079805d
RK
4967
4968 /* If the only change we made was to change an EQ into an NE or
4969 vice versa, OP0 has only one bit that might be nonzero, and OP1
4970 is zero, check if changing the user of the condition code will
4971 produce a valid insn. If it won't, we can keep the original code
4972 in that insn by surrounding our operation with an XOR. */
4973
4974 if (((old_code == NE && new_code == EQ)
4975 || (old_code == EQ && new_code == NE))
4976 && ! other_changed && op1 == const0_rtx
4977 && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
4978 && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
230d793d 4979 {
8079805d 4980 rtx pat = PATTERN (other_insn), note = 0;
230d793d 4981
8e2f6e35 4982 if ((recog_for_combine (&pat, other_insn, &note) < 0
8079805d
RK
4983 && ! check_asm_operands (pat)))
4984 {
4985 PUT_CODE (*cc_use, old_code);
4986 other_insn = 0;
230d793d 4987
8079805d 4988 op0 = gen_binary (XOR, GET_MODE (op0), op0, GEN_INT (mask));
230d793d 4989 }
230d793d
RS
4990 }
4991
8079805d
RK
4992 other_changed = 1;
4993 }
4994
4995 if (other_changed)
4996 undobuf.other_insn = other_insn;
230d793d
RS
4997
4998#ifdef HAVE_cc0
8079805d
RK
4999 /* If we are now comparing against zero, change our source if
5000 needed. If we do not use cc0, we always have a COMPARE. */
5001 if (op1 == const0_rtx && dest == cc0_rtx)
5002 {
5003 SUBST (SET_SRC (x), op0);
5004 src = op0;
5005 }
5006 else
230d793d
RS
5007#endif
5008
8079805d
RK
5009 /* Otherwise, if we didn't previously have a COMPARE in the
5010 correct mode, we need one. */
5011 if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
5012 {
f1c6ba8b 5013 SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
8079805d 5014 src = SET_SRC (x);
230d793d
RS
5015 }
5016 else
5017 {
8079805d
RK
5018 /* Otherwise, update the COMPARE if needed. */
5019 SUBST (XEXP (src, 0), op0);
5020 SUBST (XEXP (src, 1), op1);
230d793d 5021 }
8079805d
RK
5022 }
5023 else
5024 {
5025 /* Get SET_SRC in a form where we have placed back any
5026 compound expressions. Then do the checks below. */
5027 src = make_compound_operation (src, SET);
5028 SUBST (SET_SRC (x), src);
5029 }
230d793d 5030
8079805d
RK
5031 /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
5032 and X being a REG or (subreg (reg)), we may be able to convert this to
663522cb 5033 (set (subreg:m2 x) (op)).
df62f951 5034
8079805d
RK
5035 We can always do this if M1 is narrower than M2 because that means that
5036 we only care about the low bits of the result.
df62f951 5037
8079805d 5038 However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
9ec36da5 5039 perform a narrower operation than requested since the high-order bits will
8079805d
RK
5040 be undefined. On machine where it is defined, this transformation is safe
5041 as long as M1 and M2 have the same number of words. */
663522cb 5042
8079805d
RK
5043 if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5044 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (src))) != 'o'
5045 && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
5046 / UNITS_PER_WORD)
5047 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5048 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
8baf60bb 5049#ifndef WORD_REGISTER_OPERATIONS
8079805d
RK
5050 && (GET_MODE_SIZE (GET_MODE (src))
5051 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
df62f951 5052#endif
02188693 5053#ifdef CLASS_CANNOT_CHANGE_MODE
f507a070
RK
5054 && ! (GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER
5055 && (TEST_HARD_REG_BIT
02188693 5056 (reg_class_contents[(int) CLASS_CANNOT_CHANGE_MODE],
f507a070 5057 REGNO (dest)))
02188693
RH
5058 && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (src),
5059 GET_MODE (SUBREG_REG (src))))
663522cb 5060#endif
8079805d
RK
5061 && (GET_CODE (dest) == REG
5062 || (GET_CODE (dest) == SUBREG
5063 && GET_CODE (SUBREG_REG (dest)) == REG)))
5064 {
5065 SUBST (SET_DEST (x),
5066 gen_lowpart_for_combine (GET_MODE (SUBREG_REG (src)),
5067 dest));
5068 SUBST (SET_SRC (x), SUBREG_REG (src));
5069
5070 src = SET_SRC (x), dest = SET_DEST (x);
5071 }
df62f951 5072
8baf60bb 5073#ifdef LOAD_EXTEND_OP
8079805d
RK
5074 /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
5075 would require a paradoxical subreg. Replace the subreg with a
0f41302f 5076 zero_extend to avoid the reload that would otherwise be required. */
8079805d
RK
5077
5078 if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5079 && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != NIL
ddef6bc7 5080 && SUBREG_BYTE (src) == 0
8079805d
RK
5081 && (GET_MODE_SIZE (GET_MODE (src))
5082 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5083 && GET_CODE (SUBREG_REG (src)) == MEM)
5084 {
5085 SUBST (SET_SRC (x),
f1c6ba8b 5086 gen_rtx (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
ddef6bc7 5087 GET_MODE (src), SUBREG_REG (src)));
8079805d
RK
5088
5089 src = SET_SRC (x);
5090 }
230d793d
RS
5091#endif
5092
8079805d
RK
5093 /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
5094 are comparing an item known to be 0 or -1 against 0, use a logical
5095 operation instead. Check for one of the arms being an IOR of the other
5096 arm with some value. We compute three terms to be IOR'ed together. In
5097 practice, at most two will be nonzero. Then we do the IOR's. */
5098
5099 if (GET_CODE (dest) != PC
5100 && GET_CODE (src) == IF_THEN_ELSE
36b8d792 5101 && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
8079805d
RK
5102 && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
5103 && XEXP (XEXP (src, 0), 1) == const0_rtx
6dd49058 5104 && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
ea414472
DE
5105#ifdef HAVE_conditional_move
5106 && ! can_conditionally_move_p (GET_MODE (src))
5107#endif
8079805d
RK
5108 && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
5109 GET_MODE (XEXP (XEXP (src, 0), 0)))
5110 == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
5111 && ! side_effects_p (src))
5112 {
d6edb99e 5113 rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
8079805d 5114 ? XEXP (src, 1) : XEXP (src, 2));
d6edb99e 5115 rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
8079805d
RK
5116 ? XEXP (src, 2) : XEXP (src, 1));
5117 rtx term1 = const0_rtx, term2, term3;
5118
d6edb99e
ZW
5119 if (GET_CODE (true_rtx) == IOR
5120 && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
5121 term1 = false_rtx, true_rtx = XEXP(true_rtx, 1), false_rtx = const0_rtx;
5122 else if (GET_CODE (true_rtx) == IOR
5123 && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
5124 term1 = false_rtx, true_rtx = XEXP(true_rtx, 0), false_rtx = const0_rtx;
5125 else if (GET_CODE (false_rtx) == IOR
5126 && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
5127 term1 = true_rtx, false_rtx = XEXP(false_rtx, 1), true_rtx = const0_rtx;
5128 else if (GET_CODE (false_rtx) == IOR
5129 && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
5130 term1 = true_rtx, false_rtx = XEXP(false_rtx, 0), true_rtx = const0_rtx;
5131
5132 term2 = gen_binary (AND, GET_MODE (src),
5133 XEXP (XEXP (src, 0), 0), true_rtx);
8079805d 5134 term3 = gen_binary (AND, GET_MODE (src),
f1c6ba8b
RK
5135 simplify_gen_unary (NOT, GET_MODE (src),
5136 XEXP (XEXP (src, 0), 0),
5137 GET_MODE (src)),
d6edb99e 5138 false_rtx);
8079805d
RK
5139
5140 SUBST (SET_SRC (x),
5141 gen_binary (IOR, GET_MODE (src),
5142 gen_binary (IOR, GET_MODE (src), term1, term2),
5143 term3));
5144
5145 src = SET_SRC (x);
5146 }
230d793d 5147
246e00f2
RK
5148 /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
5149 whole thing fail. */
5150 if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
5151 return src;
5152 else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
5153 return dest;
5154 else
5155 /* Convert this into a field assignment operation, if possible. */
5156 return make_field_assignment (x);
8079805d
RK
5157}
5158\f
5159/* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
5160 result. LAST is nonzero if this is the last retry. */
5161
5162static rtx
5163simplify_logical (x, last)
5164 rtx x;
5165 int last;
5166{
5167 enum machine_mode mode = GET_MODE (x);
5168 rtx op0 = XEXP (x, 0);
5169 rtx op1 = XEXP (x, 1);
9a915772 5170 rtx reversed;
8079805d
RK
5171
5172 switch (GET_CODE (x))
5173 {
230d793d 5174 case AND:
663522cb 5175 /* Convert (A ^ B) & A to A & (~B) since the latter is often a single
8079805d
RK
5176 insn (and may simplify more). */
5177 if (GET_CODE (op0) == XOR
5178 && rtx_equal_p (XEXP (op0, 0), op1)
5179 && ! side_effects_p (op1))
0c1c8ea6 5180 x = gen_binary (AND, mode,
f1c6ba8b
RK
5181 simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
5182 op1);
8079805d
RK
5183
5184 if (GET_CODE (op0) == XOR
5185 && rtx_equal_p (XEXP (op0, 1), op1)
5186 && ! side_effects_p (op1))
0c1c8ea6 5187 x = gen_binary (AND, mode,
f1c6ba8b
RK
5188 simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
5189 op1);
8079805d 5190
663522cb 5191 /* Similarly for (~(A ^ B)) & A. */
8079805d
RK
5192 if (GET_CODE (op0) == NOT
5193 && GET_CODE (XEXP (op0, 0)) == XOR
5194 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
5195 && ! side_effects_p (op1))
5196 x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
5197
5198 if (GET_CODE (op0) == NOT
5199 && GET_CODE (XEXP (op0, 0)) == XOR
5200 && rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
5201 && ! side_effects_p (op1))
5202 x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
5203
2e8f9abf
DM
5204 /* We can call simplify_and_const_int only if we don't lose
5205 any (sign) bits when converting INTVAL (op1) to
5206 "unsigned HOST_WIDE_INT". */
5207 if (GET_CODE (op1) == CONST_INT
5208 && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5209 || INTVAL (op1) > 0))
230d793d 5210 {
8079805d 5211 x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
230d793d
RS
5212
5213 /* If we have (ior (and (X C1) C2)) and the next restart would be
5214 the last, simplify this by making C1 as small as possible
0f41302f 5215 and then exit. */
8079805d
RK
5216 if (last
5217 && GET_CODE (x) == IOR && GET_CODE (op0) == AND
5218 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5219 && GET_CODE (op1) == CONST_INT)
5220 return gen_binary (IOR, mode,
5221 gen_binary (AND, mode, XEXP (op0, 0),
5222 GEN_INT (INTVAL (XEXP (op0, 1))
663522cb 5223 & ~INTVAL (op1))), op1);
230d793d
RS
5224
5225 if (GET_CODE (x) != AND)
8079805d 5226 return x;
0e32506c 5227
663522cb 5228 if (GET_RTX_CLASS (GET_CODE (x)) == 'c'
0e32506c
RK
5229 || GET_RTX_CLASS (GET_CODE (x)) == '2')
5230 op0 = XEXP (x, 0), op1 = XEXP (x, 1);
230d793d
RS
5231 }
5232
5233 /* Convert (A | B) & A to A. */
8079805d
RK
5234 if (GET_CODE (op0) == IOR
5235 && (rtx_equal_p (XEXP (op0, 0), op1)
5236 || rtx_equal_p (XEXP (op0, 1), op1))
5237 && ! side_effects_p (XEXP (op0, 0))
5238 && ! side_effects_p (XEXP (op0, 1)))
5239 return op1;
230d793d 5240
d0ab8cd3 5241 /* In the following group of tests (and those in case IOR below),
230d793d
RS
5242 we start with some combination of logical operations and apply
5243 the distributive law followed by the inverse distributive law.
5244 Most of the time, this results in no change. However, if some of
5245 the operands are the same or inverses of each other, simplifications
5246 will result.
5247
5248 For example, (and (ior A B) (not B)) can occur as the result of
5249 expanding a bit field assignment. When we apply the distributive
5250 law to this, we get (ior (and (A (not B))) (and (B (not B)))),
663522cb 5251 which then simplifies to (and (A (not B))).
230d793d 5252
8079805d 5253 If we have (and (ior A B) C), apply the distributive law and then
230d793d
RS
5254 the inverse distributive law to see if things simplify. */
5255
8079805d 5256 if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
230d793d
RS
5257 {
5258 x = apply_distributive_law
8079805d
RK
5259 (gen_binary (GET_CODE (op0), mode,
5260 gen_binary (AND, mode, XEXP (op0, 0), op1),
3749f4ca
BS
5261 gen_binary (AND, mode, XEXP (op0, 1),
5262 copy_rtx (op1))));
230d793d 5263 if (GET_CODE (x) != AND)
8079805d 5264 return x;
230d793d
RS
5265 }
5266
8079805d
RK
5267 if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
5268 return apply_distributive_law
5269 (gen_binary (GET_CODE (op1), mode,
5270 gen_binary (AND, mode, XEXP (op1, 0), op0),
3749f4ca
BS
5271 gen_binary (AND, mode, XEXP (op1, 1),
5272 copy_rtx (op0))));
230d793d
RS
5273
5274 /* Similarly, taking advantage of the fact that
5275 (and (not A) (xor B C)) == (xor (ior A B) (ior A C)) */
5276
8079805d
RK
5277 if (GET_CODE (op0) == NOT && GET_CODE (op1) == XOR)
5278 return apply_distributive_law
5279 (gen_binary (XOR, mode,
5280 gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 0)),
3749f4ca
BS
5281 gen_binary (IOR, mode, copy_rtx (XEXP (op0, 0)),
5282 XEXP (op1, 1))));
663522cb 5283
8079805d
RK
5284 else if (GET_CODE (op1) == NOT && GET_CODE (op0) == XOR)
5285 return apply_distributive_law
5286 (gen_binary (XOR, mode,
5287 gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 0)),
3749f4ca 5288 gen_binary (IOR, mode, copy_rtx (XEXP (op1, 0)), XEXP (op0, 1))));
230d793d
RS
5289 break;
5290
5291 case IOR:
951553af 5292 /* (ior A C) is C if all bits of A that might be nonzero are on in C. */
8079805d 5293 if (GET_CODE (op1) == CONST_INT
ac49a949 5294 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
663522cb 5295 && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
8079805d 5296 return op1;
d0ab8cd3 5297
230d793d 5298 /* Convert (A & B) | A to A. */
8079805d
RK
5299 if (GET_CODE (op0) == AND
5300 && (rtx_equal_p (XEXP (op0, 0), op1)
5301 || rtx_equal_p (XEXP (op0, 1), op1))
5302 && ! side_effects_p (XEXP (op0, 0))
5303 && ! side_effects_p (XEXP (op0, 1)))
5304 return op1;
230d793d
RS
5305
5306 /* If we have (ior (and A B) C), apply the distributive law and then
5307 the inverse distributive law to see if things simplify. */
5308
8079805d 5309 if (GET_CODE (op0) == AND)
230d793d
RS
5310 {
5311 x = apply_distributive_law
5312 (gen_binary (AND, mode,
8079805d 5313 gen_binary (IOR, mode, XEXP (op0, 0), op1),
3749f4ca
BS
5314 gen_binary (IOR, mode, XEXP (op0, 1),
5315 copy_rtx (op1))));
230d793d
RS
5316
5317 if (GET_CODE (x) != IOR)
8079805d 5318 return x;
230d793d
RS
5319 }
5320
8079805d 5321 if (GET_CODE (op1) == AND)
230d793d
RS
5322 {
5323 x = apply_distributive_law
5324 (gen_binary (AND, mode,
8079805d 5325 gen_binary (IOR, mode, XEXP (op1, 0), op0),
3749f4ca
BS
5326 gen_binary (IOR, mode, XEXP (op1, 1),
5327 copy_rtx (op0))));
230d793d
RS
5328
5329 if (GET_CODE (x) != IOR)
8079805d 5330 return x;
230d793d
RS
5331 }
5332
5333 /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
5334 mode size to (rotate A CX). */
5335
8079805d
RK
5336 if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT)
5337 || (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT))
5338 && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
5339 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5340 && GET_CODE (XEXP (op1, 1)) == CONST_INT
5341 && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1))
230d793d 5342 == GET_MODE_BITSIZE (mode)))
38a448ca
RH
5343 return gen_rtx_ROTATE (mode, XEXP (op0, 0),
5344 (GET_CODE (op0) == ASHIFT
5345 ? XEXP (op0, 1) : XEXP (op1, 1)));
230d793d 5346
71923da7
RK
5347 /* If OP0 is (ashiftrt (plus ...) C), it might actually be
5348 a (sign_extend (plus ...)). If so, OP1 is a CONST_INT, and the PLUS
5349 does not affect any of the bits in OP1, it can really be done
5350 as a PLUS and we can associate. We do this by seeing if OP1
5351 can be safely shifted left C bits. */
5352 if (GET_CODE (op1) == CONST_INT && GET_CODE (op0) == ASHIFTRT
5353 && GET_CODE (XEXP (op0, 0)) == PLUS
5354 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
5355 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5356 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT)
5357 {
5358 int count = INTVAL (XEXP (op0, 1));
5359 HOST_WIDE_INT mask = INTVAL (op1) << count;
5360
5361 if (mask >> count == INTVAL (op1)
5362 && (mask & nonzero_bits (XEXP (op0, 0), mode)) == 0)
5363 {
5364 SUBST (XEXP (XEXP (op0, 0), 1),
5365 GEN_INT (INTVAL (XEXP (XEXP (op0, 0), 1)) | mask));
5366 return op0;
5367 }
5368 }
230d793d
RS
5369 break;
5370
5371 case XOR:
79e8185c
JH
5372 /* If we are XORing two things that have no bits in common,
5373 convert them into an IOR. This helps to detect rotation encoded
5374 using those methods and possibly other simplifications. */
5375
5376 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5377 && (nonzero_bits (op0, mode)
5378 & nonzero_bits (op1, mode)) == 0)
5379 return (gen_binary (IOR, mode, op0, op1));
5380
230d793d
RS
5381 /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
5382 Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
5383 (NOT y). */
5384 {
5385 int num_negated = 0;
230d793d 5386
8079805d
RK
5387 if (GET_CODE (op0) == NOT)
5388 num_negated++, op0 = XEXP (op0, 0);
5389 if (GET_CODE (op1) == NOT)
5390 num_negated++, op1 = XEXP (op1, 0);
230d793d
RS
5391
5392 if (num_negated == 2)
5393 {
8079805d
RK
5394 SUBST (XEXP (x, 0), op0);
5395 SUBST (XEXP (x, 1), op1);
230d793d
RS
5396 }
5397 else if (num_negated == 1)
f1c6ba8b
RK
5398 return
5399 simplify_gen_unary (NOT, mode, gen_binary (XOR, mode, op0, op1),
5400 mode);
230d793d
RS
5401 }
5402
5403 /* Convert (xor (and A B) B) to (and (not A) B). The latter may
5404 correspond to a machine insn or result in further simplifications
5405 if B is a constant. */
5406
8079805d
RK
5407 if (GET_CODE (op0) == AND
5408 && rtx_equal_p (XEXP (op0, 1), op1)
5409 && ! side_effects_p (op1))
0c1c8ea6 5410 return gen_binary (AND, mode,
f1c6ba8b 5411 simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
8079805d 5412 op1);
230d793d 5413
8079805d
RK
5414 else if (GET_CODE (op0) == AND
5415 && rtx_equal_p (XEXP (op0, 0), op1)
5416 && ! side_effects_p (op1))
0c1c8ea6 5417 return gen_binary (AND, mode,
f1c6ba8b 5418 simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
8079805d 5419 op1);
230d793d 5420
230d793d 5421 /* (xor (comparison foo bar) (const_int 1)) can become the reversed
0802d516
RK
5422 comparison if STORE_FLAG_VALUE is 1. */
5423 if (STORE_FLAG_VALUE == 1
5424 && op1 == const1_rtx
8079805d 5425 && GET_RTX_CLASS (GET_CODE (op0)) == '<'
9a915772
JH
5426 && (reversed = reversed_comparison (op0, mode, XEXP (op0, 0),
5427 XEXP (op0, 1))))
5428 return reversed;
500c518b
RK
5429
5430 /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
5431 is (lt foo (const_int 0)), so we can perform the above
0802d516 5432 simplification if STORE_FLAG_VALUE is 1. */
500c518b 5433
0802d516
RK
5434 if (STORE_FLAG_VALUE == 1
5435 && op1 == const1_rtx
8079805d
RK
5436 && GET_CODE (op0) == LSHIFTRT
5437 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5438 && INTVAL (XEXP (op0, 1)) == GET_MODE_BITSIZE (mode) - 1)
f1c6ba8b 5439 return gen_rtx_GE (mode, XEXP (op0, 0), const0_rtx);
230d793d
RS
5440
5441 /* (xor (comparison foo bar) (const_int sign-bit))
5442 when STORE_FLAG_VALUE is the sign bit. */
5f4f0e22 5443 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
0802d516 5444 && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
e51712db 5445 == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
8079805d
RK
5446 && op1 == const_true_rtx
5447 && GET_RTX_CLASS (GET_CODE (op0)) == '<'
9a915772
JH
5448 && (reversed = reversed_comparison (op0, mode, XEXP (op0, 0),
5449 XEXP (op0, 1))))
5450 return reversed;
0918eca0 5451
230d793d 5452 break;
e9a25f70
JL
5453
5454 default:
5455 abort ();
230d793d
RS
5456 }
5457
5458 return x;
5459}
5460\f
5461/* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
5462 operations" because they can be replaced with two more basic operations.
5463 ZERO_EXTEND is also considered "compound" because it can be replaced with
5464 an AND operation, which is simpler, though only one operation.
5465
5466 The function expand_compound_operation is called with an rtx expression
663522cb 5467 and will convert it to the appropriate shifts and AND operations,
230d793d
RS
5468 simplifying at each stage.
5469
5470 The function make_compound_operation is called to convert an expression
5471 consisting of shifts and ANDs into the equivalent compound expression.
5472 It is the inverse of this function, loosely speaking. */
5473
5474static rtx
5475expand_compound_operation (x)
5476 rtx x;
5477{
770ae6cc 5478 unsigned HOST_WIDE_INT pos = 0, len;
230d793d 5479 int unsignedp = 0;
770ae6cc 5480 unsigned int modewidth;
230d793d
RS
5481 rtx tem;
5482
5483 switch (GET_CODE (x))
5484 {
5485 case ZERO_EXTEND:
5486 unsignedp = 1;
5487 case SIGN_EXTEND:
75473182
RS
5488 /* We can't necessarily use a const_int for a multiword mode;
5489 it depends on implicitly extending the value.
5490 Since we don't know the right way to extend it,
5491 we can't tell whether the implicit way is right.
5492
5493 Even for a mode that is no wider than a const_int,
5494 we can't win, because we need to sign extend one of its bits through
5495 the rest of it, and we don't know which bit. */
230d793d 5496 if (GET_CODE (XEXP (x, 0)) == CONST_INT)
75473182 5497 return x;
230d793d 5498
8079805d
RK
5499 /* Return if (subreg:MODE FROM 0) is not a safe replacement for
5500 (zero_extend:MODE FROM) or (sign_extend:MODE FROM). It is for any MEM
5501 because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
5502 reloaded. If not for that, MEM's would very rarely be safe.
5503
5504 Reject MODEs bigger than a word, because we might not be able
5505 to reference a two-register group starting with an arbitrary register
5506 (and currently gen_lowpart might crash for a SUBREG). */
663522cb 5507
8079805d 5508 if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
230d793d
RS
5509 return x;
5510
5511 len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
5512 /* If the inner object has VOIDmode (the only way this can happen
5513 is if it is a ASM_OPERANDS), we can't do anything since we don't
5514 know how much masking to do. */
5515 if (len == 0)
5516 return x;
5517
5518 break;
5519
5520 case ZERO_EXTRACT:
5521 unsignedp = 1;
5522 case SIGN_EXTRACT:
5523 /* If the operand is a CLOBBER, just return it. */
5524 if (GET_CODE (XEXP (x, 0)) == CLOBBER)
5525 return XEXP (x, 0);
5526
5527 if (GET_CODE (XEXP (x, 1)) != CONST_INT
5528 || GET_CODE (XEXP (x, 2)) != CONST_INT
5529 || GET_MODE (XEXP (x, 0)) == VOIDmode)
5530 return x;
5531
5532 len = INTVAL (XEXP (x, 1));
5533 pos = INTVAL (XEXP (x, 2));
5534
5535 /* If this goes outside the object being extracted, replace the object
5536 with a (use (mem ...)) construct that only combine understands
5537 and is used only for this purpose. */
5538 if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
38a448ca 5539 SUBST (XEXP (x, 0), gen_rtx_USE (GET_MODE (x), XEXP (x, 0)));
230d793d 5540
f76b9db2
ILT
5541 if (BITS_BIG_ENDIAN)
5542 pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
5543
230d793d
RS
5544 break;
5545
5546 default:
5547 return x;
5548 }
0f808b6f
JH
5549 /* Convert sign extension to zero extension, if we know that the high
5550 bit is not set, as this is easier to optimize. It will be converted
5551 back to cheaper alternative in make_extraction. */
5552 if (GET_CODE (x) == SIGN_EXTEND
5553 && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5554 && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
663522cb 5555 & ~(((unsigned HOST_WIDE_INT)
0f808b6f
JH
5556 GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
5557 >> 1))
5558 == 0)))
5559 {
5560 rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
5561 return expand_compound_operation (temp);
5562 }
230d793d 5563
0f13a422
ILT
5564 /* We can optimize some special cases of ZERO_EXTEND. */
5565 if (GET_CODE (x) == ZERO_EXTEND)
5566 {
5567 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
5568 know that the last value didn't have any inappropriate bits
5569 set. */
5570 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5571 && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5572 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5573 && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
663522cb 5574 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
0f13a422
ILT
5575 return XEXP (XEXP (x, 0), 0);
5576
5577 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
5578 if (GET_CODE (XEXP (x, 0)) == SUBREG
5579 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5580 && subreg_lowpart_p (XEXP (x, 0))
5581 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5582 && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
663522cb 5583 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
0f13a422
ILT
5584 return SUBREG_REG (XEXP (x, 0));
5585
5586 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
5587 is a comparison and STORE_FLAG_VALUE permits. This is like
5588 the first case, but it works even when GET_MODE (x) is larger
5589 than HOST_WIDE_INT. */
5590 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5591 && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5592 && GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) == '<'
5593 && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5594 <= HOST_BITS_PER_WIDE_INT)
23190837 5595 && ((HOST_WIDE_INT) STORE_FLAG_VALUE
663522cb 5596 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
0f13a422
ILT
5597 return XEXP (XEXP (x, 0), 0);
5598
5599 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
5600 if (GET_CODE (XEXP (x, 0)) == SUBREG
5601 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5602 && subreg_lowpart_p (XEXP (x, 0))
5603 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == '<'
5604 && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5605 <= HOST_BITS_PER_WIDE_INT)
5606 && ((HOST_WIDE_INT) STORE_FLAG_VALUE
663522cb 5607 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
0f13a422
ILT
5608 return SUBREG_REG (XEXP (x, 0));
5609
0f13a422
ILT
5610 }
5611
230d793d
RS
5612 /* If we reach here, we want to return a pair of shifts. The inner
5613 shift is a left shift of BITSIZE - POS - LEN bits. The outer
5614 shift is a right shift of BITSIZE - LEN bits. It is arithmetic or
5615 logical depending on the value of UNSIGNEDP.
5616
5617 If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
5618 converted into an AND of a shift.
5619
5620 We must check for the case where the left shift would have a negative
5621 count. This can happen in a case like (x >> 31) & 255 on machines
5622 that can't shift by a constant. On those machines, we would first
663522cb 5623 combine the shift with the AND to produce a variable-position
230d793d
RS
5624 extraction. Then the constant of 31 would be substituted in to produce
5625 a such a position. */
5626
5627 modewidth = GET_MODE_BITSIZE (GET_MODE (x));
770ae6cc 5628 if (modewidth + len >= pos)
5f4f0e22 5629 tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
230d793d 5630 GET_MODE (x),
5f4f0e22
CH
5631 simplify_shift_const (NULL_RTX, ASHIFT,
5632 GET_MODE (x),
230d793d
RS
5633 XEXP (x, 0),
5634 modewidth - pos - len),
5635 modewidth - len);
5636
5f4f0e22
CH
5637 else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
5638 tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
5639 simplify_shift_const (NULL_RTX, LSHIFTRT,
230d793d
RS
5640 GET_MODE (x),
5641 XEXP (x, 0), pos),
5f4f0e22 5642 ((HOST_WIDE_INT) 1 << len) - 1);
230d793d
RS
5643 else
5644 /* Any other cases we can't handle. */
5645 return x;
230d793d
RS
5646
5647 /* If we couldn't do this for some reason, return the original
5648 expression. */
5649 if (GET_CODE (tem) == CLOBBER)
5650 return x;
5651
5652 return tem;
5653}
5654\f
5655/* X is a SET which contains an assignment of one object into
5656 a part of another (such as a bit-field assignment, STRICT_LOW_PART,
5657 or certain SUBREGS). If possible, convert it into a series of
5658 logical operations.
5659
5660 We half-heartedly support variable positions, but do not at all
5661 support variable lengths. */
5662
5663static rtx
5664expand_field_assignment (x)
5665 rtx x;
5666{
5667 rtx inner;
0f41302f 5668 rtx pos; /* Always counts from low bit. */
230d793d
RS
5669 int len;
5670 rtx mask;
5671 enum machine_mode compute_mode;
5672
5673 /* Loop until we find something we can't simplify. */
5674 while (1)
5675 {
5676 if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
5677 && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
5678 {
ddef6bc7
JJ
5679 int byte_offset = SUBREG_BYTE (XEXP (SET_DEST (x), 0));
5680
230d793d
RS
5681 inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
5682 len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
ddef6bc7 5683 pos = GEN_INT (BITS_PER_WORD * (byte_offset / UNITS_PER_WORD));
230d793d
RS
5684 }
5685 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
5686 && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
5687 {
5688 inner = XEXP (SET_DEST (x), 0);
5689 len = INTVAL (XEXP (SET_DEST (x), 1));
5690 pos = XEXP (SET_DEST (x), 2);
5691
5692 /* If the position is constant and spans the width of INNER,
5693 surround INNER with a USE to indicate this. */
5694 if (GET_CODE (pos) == CONST_INT
5695 && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
38a448ca 5696 inner = gen_rtx_USE (GET_MODE (SET_DEST (x)), inner);
230d793d 5697
f76b9db2
ILT
5698 if (BITS_BIG_ENDIAN)
5699 {
5700 if (GET_CODE (pos) == CONST_INT)
5701 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
5702 - INTVAL (pos));
5703 else if (GET_CODE (pos) == MINUS
5704 && GET_CODE (XEXP (pos, 1)) == CONST_INT
5705 && (INTVAL (XEXP (pos, 1))
5706 == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
5707 /* If position is ADJUST - X, new position is X. */
5708 pos = XEXP (pos, 0);
5709 else
5710 pos = gen_binary (MINUS, GET_MODE (pos),
5711 GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
5712 - len),
5713 pos);
5714 }
230d793d
RS
5715 }
5716
5717 /* A SUBREG between two modes that occupy the same numbers of words
5718 can be done by moving the SUBREG to the source. */
5719 else if (GET_CODE (SET_DEST (x)) == SUBREG
b1e9c8a9
AO
5720 /* We need SUBREGs to compute nonzero_bits properly. */
5721 && nonzero_sign_valid
230d793d
RS
5722 && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
5723 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
5724 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
5725 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
5726 {
38a448ca 5727 x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
c5c76735
JL
5728 gen_lowpart_for_combine
5729 (GET_MODE (SUBREG_REG (SET_DEST (x))),
5730 SET_SRC (x)));
230d793d
RS
5731 continue;
5732 }
5733 else
5734 break;
5735
5736 while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
5737 inner = SUBREG_REG (inner);
5738
5739 compute_mode = GET_MODE (inner);
5740
861556b4
RH
5741 /* Don't attempt bitwise arithmetic on non-integral modes. */
5742 if (! INTEGRAL_MODE_P (compute_mode))
5743 {
5744 enum machine_mode imode;
5745
5746 /* Something is probably seriously wrong if this matches. */
5747 if (! FLOAT_MODE_P (compute_mode))
5748 break;
5749
5750 /* Try to find an integral mode to pun with. */
5751 imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
5752 if (imode == BLKmode)
5753 break;
5754
5755 compute_mode = imode;
5756 inner = gen_lowpart_for_combine (imode, inner);
5757 }
5758
230d793d 5759 /* Compute a mask of LEN bits, if we can do this on the host machine. */
5f4f0e22
CH
5760 if (len < HOST_BITS_PER_WIDE_INT)
5761 mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
230d793d
RS
5762 else
5763 break;
5764
5765 /* Now compute the equivalent expression. Make a copy of INNER
5766 for the SET_DEST in case it is a MEM into which we will substitute;
5767 we don't want shared RTL in that case. */
c5c76735
JL
5768 x = gen_rtx_SET
5769 (VOIDmode, copy_rtx (inner),
5770 gen_binary (IOR, compute_mode,
5771 gen_binary (AND, compute_mode,
f1c6ba8b
RK
5772 simplify_gen_unary (NOT, compute_mode,
5773 gen_binary (ASHIFT,
5774 compute_mode,
5775 mask, pos),
5776 compute_mode),
c5c76735
JL
5777 inner),
5778 gen_binary (ASHIFT, compute_mode,
5779 gen_binary (AND, compute_mode,
5780 gen_lowpart_for_combine
5781 (compute_mode, SET_SRC (x)),
5782 mask),
5783 pos)));
230d793d
RS
5784 }
5785
5786 return x;
5787}
5788\f
8999a12e
RK
5789/* Return an RTX for a reference to LEN bits of INNER. If POS_RTX is nonzero,
5790 it is an RTX that represents a variable starting position; otherwise,
5791 POS is the (constant) starting bit position (counted from the LSB).
230d793d
RS
5792
5793 INNER may be a USE. This will occur when we started with a bitfield
5794 that went outside the boundary of the object in memory, which is
5795 allowed on most machines. To isolate this case, we produce a USE
5796 whose mode is wide enough and surround the MEM with it. The only
5797 code that understands the USE is this routine. If it is not removed,
5798 it will cause the resulting insn not to match.
5799
663522cb 5800 UNSIGNEDP is non-zero for an unsigned reference and zero for a
230d793d
RS
5801 signed reference.
5802
5803 IN_DEST is non-zero if this is a reference in the destination of a
5804 SET. This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If non-zero,
5805 a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
5806 be used.
5807
5808 IN_COMPARE is non-zero if we are in a COMPARE. This means that a
5809 ZERO_EXTRACT should be built even for bits starting at bit 0.
5810
76184def
DE
5811 MODE is the desired mode of the result (if IN_DEST == 0).
5812
5813 The result is an RTX for the extraction or NULL_RTX if the target
5814 can't handle it. */
230d793d
RS
5815
5816static rtx
5817make_extraction (mode, inner, pos, pos_rtx, len,
5818 unsignedp, in_dest, in_compare)
5819 enum machine_mode mode;
5820 rtx inner;
770ae6cc 5821 HOST_WIDE_INT pos;
230d793d 5822 rtx pos_rtx;
770ae6cc 5823 unsigned HOST_WIDE_INT len;
230d793d
RS
5824 int unsignedp;
5825 int in_dest, in_compare;
5826{
94b4b17a
RS
5827 /* This mode describes the size of the storage area
5828 to fetch the overall value from. Within that, we
5829 ignore the POS lowest bits, etc. */
230d793d
RS
5830 enum machine_mode is_mode = GET_MODE (inner);
5831 enum machine_mode inner_mode;
d7cd794f
RK
5832 enum machine_mode wanted_inner_mode = byte_mode;
5833 enum machine_mode wanted_inner_reg_mode = word_mode;
230d793d
RS
5834 enum machine_mode pos_mode = word_mode;
5835 enum machine_mode extraction_mode = word_mode;
5836 enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
5837 int spans_byte = 0;
5838 rtx new = 0;
8999a12e 5839 rtx orig_pos_rtx = pos_rtx;
770ae6cc 5840 HOST_WIDE_INT orig_pos;
230d793d
RS
5841
5842 /* Get some information about INNER and get the innermost object. */
5843 if (GET_CODE (inner) == USE)
94b4b17a 5844 /* (use:SI (mem:QI foo)) stands for (mem:SI foo). */
230d793d
RS
5845 /* We don't need to adjust the position because we set up the USE
5846 to pretend that it was a full-word object. */
5847 spans_byte = 1, inner = XEXP (inner, 0);
5848 else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
94b4b17a
RS
5849 {
5850 /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
5851 consider just the QI as the memory to extract from.
5852 The subreg adds or removes high bits; its mode is
5853 irrelevant to the meaning of this extraction,
5854 since POS and LEN count from the lsb. */
5855 if (GET_CODE (SUBREG_REG (inner)) == MEM)
5856 is_mode = GET_MODE (SUBREG_REG (inner));
5857 inner = SUBREG_REG (inner);
5858 }
230d793d
RS
5859
5860 inner_mode = GET_MODE (inner);
5861
5862 if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
8999a12e 5863 pos = INTVAL (pos_rtx), pos_rtx = 0;
230d793d
RS
5864
5865 /* See if this can be done without an extraction. We never can if the
5866 width of the field is not the same as that of some integer mode. For
5867 registers, we can only avoid the extraction if the position is at the
5868 low-order bit and this is either not in the destination or we have the
5869 appropriate STRICT_LOW_PART operation available.
5870
5871 For MEM, we can avoid an extract if the field starts on an appropriate
5872 boundary and we can change the mode of the memory reference. However,
5873 we cannot directly access the MEM if we have a USE and the underlying
5874 MEM is not TMODE. This combination means that MEM was being used in a
5875 context where bits outside its mode were being referenced; that is only
5876 valid in bit-field insns. */
5877
5878 if (tmode != BLKmode
5879 && ! (spans_byte && inner_mode != tmode)
4d9cfc7b
RK
5880 && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
5881 && GET_CODE (inner) != MEM
230d793d 5882 && (! in_dest
df62f951 5883 || (GET_CODE (inner) == REG
ef89d648 5884 && have_insn_for (STRICT_LOW_PART, tmode))))
8999a12e 5885 || (GET_CODE (inner) == MEM && pos_rtx == 0
dfbe1b2f
RK
5886 && (pos
5887 % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
5888 : BITS_PER_UNIT)) == 0
230d793d
RS
5889 /* We can't do this if we are widening INNER_MODE (it
5890 may not be aligned, for one thing). */
5891 && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
5892 && (inner_mode == tmode
5893 || (! mode_dependent_address_p (XEXP (inner, 0))
5894 && ! MEM_VOLATILE_P (inner))))))
5895 {
230d793d
RS
5896 /* If INNER is a MEM, make a new MEM that encompasses just the desired
5897 field. If the original and current mode are the same, we need not
663522cb 5898 adjust the offset. Otherwise, we do if bytes big endian.
230d793d 5899
4d9cfc7b
RK
5900 If INNER is not a MEM, get a piece consisting of just the field
5901 of interest (in this case POS % BITS_PER_WORD must be 0). */
230d793d
RS
5902
5903 if (GET_CODE (inner) == MEM)
5904 {
f1ec5147
RK
5905 HOST_WIDE_INT offset;
5906
94b4b17a
RS
5907 /* POS counts from lsb, but make OFFSET count in memory order. */
5908 if (BYTES_BIG_ENDIAN)
5909 offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
5910 else
5911 offset = pos / BITS_PER_UNIT;
230d793d 5912
f1ec5147 5913 new = adjust_address_nv (inner, tmode, offset);
230d793d 5914 }
df62f951 5915 else if (GET_CODE (inner) == REG)
c0d3ac4d
RK
5916 {
5917 /* We can't call gen_lowpart_for_combine here since we always want
5918 a SUBREG and it would sometimes return a new hard register. */
5919 if (tmode != inner_mode)
ddef6bc7 5920 {
f1ec5147 5921 HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
ddef6bc7
JJ
5922
5923 if (WORDS_BIG_ENDIAN
5924 && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
5925 final_word = ((GET_MODE_SIZE (inner_mode)
5926 - GET_MODE_SIZE (tmode))
5927 / UNITS_PER_WORD) - final_word;
5928
5929 final_word *= UNITS_PER_WORD;
5930 if (BYTES_BIG_ENDIAN &&
5931 GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
5932 final_word += (GET_MODE_SIZE (inner_mode)
5933 - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
5934
5935 new = gen_rtx_SUBREG (tmode, inner, final_word);
5936 }
23190837
AJ
5937 else
5938 new = inner;
5939 }
230d793d 5940 else
6139ff20
RK
5941 new = force_to_mode (inner, tmode,
5942 len >= HOST_BITS_PER_WIDE_INT
0345195a 5943 ? ~(unsigned HOST_WIDE_INT) 0
729a2125 5944 : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
e3d616e3 5945 NULL_RTX, 0);
230d793d 5946
663522cb 5947 /* If this extraction is going into the destination of a SET,
230d793d
RS
5948 make a STRICT_LOW_PART unless we made a MEM. */
5949
5950 if (in_dest)
5951 return (GET_CODE (new) == MEM ? new
77fa0940 5952 : (GET_CODE (new) != SUBREG
38a448ca 5953 ? gen_rtx_CLOBBER (tmode, const0_rtx)
f1c6ba8b 5954 : gen_rtx_STRICT_LOW_PART (VOIDmode, new)));
230d793d 5955
0f808b6f
JH
5956 if (mode == tmode)
5957 return new;
5958
5959 /* If we know that no extraneous bits are set, and that the high
5960 bit is not set, convert the extraction to the cheaper of
5961 sign and zero extension, that are equivalent in these cases. */
5962 if (flag_expensive_optimizations
5963 && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
5964 && ((nonzero_bits (new, tmode)
663522cb
KH
5965 & ~(((unsigned HOST_WIDE_INT)
5966 GET_MODE_MASK (tmode))
5967 >> 1))
0f808b6f
JH
5968 == 0)))
5969 {
5970 rtx temp = gen_rtx_ZERO_EXTEND (mode, new);
5971 rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new);
5972
5973 /* Prefer ZERO_EXTENSION, since it gives more information to
5974 backends. */
25ffb1f6 5975 if (rtx_cost (temp, SET) <= rtx_cost (temp1, SET))
0f808b6f
JH
5976 return temp;
5977 return temp1;
5978 }
5979
230d793d
RS
5980 /* Otherwise, sign- or zero-extend unless we already are in the
5981 proper mode. */
5982
f1c6ba8b
RK
5983 return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
5984 mode, new));
230d793d
RS
5985 }
5986
cc471082
RS
5987 /* Unless this is a COMPARE or we have a funny memory reference,
5988 don't do anything with zero-extending field extracts starting at
5989 the low-order bit since they are simple AND operations. */
8999a12e
RK
5990 if (pos_rtx == 0 && pos == 0 && ! in_dest
5991 && ! in_compare && ! spans_byte && unsignedp)
230d793d
RS
5992 return 0;
5993
c5c76735
JL
5994 /* Unless we are allowed to span bytes or INNER is not MEM, reject this if
5995 we would be spanning bytes or if the position is not a constant and the
5996 length is not 1. In all other cases, we would only be going outside
5997 our object in cases when an original shift would have been
e7373556 5998 undefined. */
c5c76735 5999 if (! spans_byte && GET_CODE (inner) == MEM
e7373556
RK
6000 && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
6001 || (pos_rtx != 0 && len != 1)))
6002 return 0;
6003
d7cd794f 6004 /* Get the mode to use should INNER not be a MEM, the mode for the position,
230d793d 6005 and the mode for the result. */
da920570 6006 if (in_dest && mode_for_extraction(EP_insv, -1) != MAX_MACHINE_MODE)
230d793d 6007 {
da920570
ZW
6008 wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
6009 pos_mode = mode_for_extraction (EP_insv, 2);
6010 extraction_mode = mode_for_extraction (EP_insv, 3);
230d793d 6011 }
230d793d 6012
da920570
ZW
6013 if (! in_dest && unsignedp
6014 && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
230d793d 6015 {
da920570
ZW
6016 wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
6017 pos_mode = mode_for_extraction (EP_extzv, 3);
6018 extraction_mode = mode_for_extraction (EP_extzv, 0);
230d793d 6019 }
230d793d 6020
da920570
ZW
6021 if (! in_dest && ! unsignedp
6022 && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
230d793d 6023 {
da920570
ZW
6024 wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
6025 pos_mode = mode_for_extraction (EP_extv, 3);
6026 extraction_mode = mode_for_extraction (EP_extv, 0);
230d793d 6027 }
230d793d
RS
6028
6029 /* Never narrow an object, since that might not be safe. */
6030
6031 if (mode != VOIDmode
6032 && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
6033 extraction_mode = mode;
6034
6035 if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
6036 && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6037 pos_mode = GET_MODE (pos_rtx);
6038
d7cd794f
RK
6039 /* If this is not from memory, the desired mode is wanted_inner_reg_mode;
6040 if we have to change the mode of memory and cannot, the desired mode is
6041 EXTRACTION_MODE. */
6042 if (GET_CODE (inner) != MEM)
6043 wanted_inner_mode = wanted_inner_reg_mode;
6044 else if (inner_mode != wanted_inner_mode
6045 && (mode_dependent_address_p (XEXP (inner, 0))
6046 || MEM_VOLATILE_P (inner)))
6047 wanted_inner_mode = extraction_mode;
230d793d 6048
6139ff20
RK
6049 orig_pos = pos;
6050
f76b9db2
ILT
6051 if (BITS_BIG_ENDIAN)
6052 {
cf54c2cd
DE
6053 /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
6054 BITS_BIG_ENDIAN style. If position is constant, compute new
6055 position. Otherwise, build subtraction.
6056 Note that POS is relative to the mode of the original argument.
6057 If it's a MEM we need to recompute POS relative to that.
6058 However, if we're extracting from (or inserting into) a register,
6059 we want to recompute POS relative to wanted_inner_mode. */
6060 int width = (GET_CODE (inner) == MEM
6061 ? GET_MODE_BITSIZE (is_mode)
6062 : GET_MODE_BITSIZE (wanted_inner_mode));
6063
f76b9db2 6064 if (pos_rtx == 0)
cf54c2cd 6065 pos = width - len - pos;
f76b9db2
ILT
6066 else
6067 pos_rtx
f1c6ba8b 6068 = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
cf54c2cd
DE
6069 /* POS may be less than 0 now, but we check for that below.
6070 Note that it can only be less than 0 if GET_CODE (inner) != MEM. */
f76b9db2 6071 }
230d793d
RS
6072
6073 /* If INNER has a wider mode, make it smaller. If this is a constant
6074 extract, try to adjust the byte to point to the byte containing
6075 the value. */
d7cd794f
RK
6076 if (wanted_inner_mode != VOIDmode
6077 && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
230d793d 6078 && ((GET_CODE (inner) == MEM
d7cd794f 6079 && (inner_mode == wanted_inner_mode
230d793d
RS
6080 || (! mode_dependent_address_p (XEXP (inner, 0))
6081 && ! MEM_VOLATILE_P (inner))))))
6082 {
6083 int offset = 0;
6084
6085 /* The computations below will be correct if the machine is big
6086 endian in both bits and bytes or little endian in bits and bytes.
6087 If it is mixed, we must adjust. */
663522cb 6088
230d793d 6089 /* If bytes are big endian and we had a paradoxical SUBREG, we must
0f41302f 6090 adjust OFFSET to compensate. */
f76b9db2
ILT
6091 if (BYTES_BIG_ENDIAN
6092 && ! spans_byte
230d793d
RS
6093 && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
6094 offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
230d793d
RS
6095
6096 /* If this is a constant position, we can move to the desired byte. */
8999a12e 6097 if (pos_rtx == 0)
230d793d
RS
6098 {
6099 offset += pos / BITS_PER_UNIT;
d7cd794f 6100 pos %= GET_MODE_BITSIZE (wanted_inner_mode);
230d793d
RS
6101 }
6102
f76b9db2
ILT
6103 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
6104 && ! spans_byte
d7cd794f 6105 && is_mode != wanted_inner_mode)
c6b3f1f2 6106 offset = (GET_MODE_SIZE (is_mode)
d7cd794f 6107 - GET_MODE_SIZE (wanted_inner_mode) - offset);
c6b3f1f2 6108
d7cd794f 6109 if (offset != 0 || inner_mode != wanted_inner_mode)
f1ec5147 6110 inner = adjust_address_nv (inner, wanted_inner_mode, offset);
230d793d
RS
6111 }
6112
9e74dc41
RK
6113 /* If INNER is not memory, we can always get it into the proper mode. If we
6114 are changing its mode, POS must be a constant and smaller than the size
6115 of the new mode. */
230d793d 6116 else if (GET_CODE (inner) != MEM)
9e74dc41
RK
6117 {
6118 if (GET_MODE (inner) != wanted_inner_mode
6119 && (pos_rtx != 0
6120 || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
6121 return 0;
6122
6123 inner = force_to_mode (inner, wanted_inner_mode,
6124 pos_rtx
6125 || len + orig_pos >= HOST_BITS_PER_WIDE_INT
0345195a 6126 ? ~(unsigned HOST_WIDE_INT) 0
729a2125
RK
6127 : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
6128 << orig_pos),
9e74dc41
RK
6129 NULL_RTX, 0);
6130 }
230d793d
RS
6131
6132 /* Adjust mode of POS_RTX, if needed. If we want a wider mode, we
6133 have to zero extend. Otherwise, we can just use a SUBREG. */
8999a12e 6134 if (pos_rtx != 0
230d793d 6135 && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
0f808b6f 6136 {
f1c6ba8b 6137 rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
0f808b6f
JH
6138
6139 /* If we know that no extraneous bits are set, and that the high
6140 bit is not set, convert extraction to cheaper one - eighter
6141 SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
6142 cases. */
6143 if (flag_expensive_optimizations
6144 && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
6145 && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
663522cb
KH
6146 & ~(((unsigned HOST_WIDE_INT)
6147 GET_MODE_MASK (GET_MODE (pos_rtx)))
6148 >> 1))
0f808b6f
JH
6149 == 0)))
6150 {
6151 rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
6152
25ffb1f6 6153 /* Prefer ZERO_EXTENSION, since it gives more information to
0f808b6f
JH
6154 backends. */
6155 if (rtx_cost (temp1, SET) < rtx_cost (temp, SET))
6156 temp = temp1;
6157 }
6158 pos_rtx = temp;
6159 }
8999a12e 6160 else if (pos_rtx != 0
230d793d
RS
6161 && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6162 pos_rtx = gen_lowpart_for_combine (pos_mode, pos_rtx);
6163
8999a12e
RK
6164 /* Make POS_RTX unless we already have it and it is correct. If we don't
6165 have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
0f41302f 6166 be a CONST_INT. */
8999a12e
RK
6167 if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
6168 pos_rtx = orig_pos_rtx;
6169
6170 else if (pos_rtx == 0)
5f4f0e22 6171 pos_rtx = GEN_INT (pos);
230d793d
RS
6172
6173 /* Make the required operation. See if we can use existing rtx. */
f1c6ba8b 6174 new = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
5f4f0e22 6175 extraction_mode, inner, GEN_INT (len), pos_rtx);
230d793d
RS
6176 if (! in_dest)
6177 new = gen_lowpart_for_combine (mode, new);
6178
6179 return new;
6180}
6181\f
71923da7
RK
6182/* See if X contains an ASHIFT of COUNT or more bits that can be commuted
6183 with any other operations in X. Return X without that shift if so. */
6184
6185static rtx
6186extract_left_shift (x, count)
6187 rtx x;
6188 int count;
6189{
6190 enum rtx_code code = GET_CODE (x);
6191 enum machine_mode mode = GET_MODE (x);
6192 rtx tem;
6193
6194 switch (code)
6195 {
6196 case ASHIFT:
6197 /* This is the shift itself. If it is wide enough, we will return
6198 either the value being shifted if the shift count is equal to
6199 COUNT or a shift for the difference. */
6200 if (GET_CODE (XEXP (x, 1)) == CONST_INT
6201 && INTVAL (XEXP (x, 1)) >= count)
6202 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
6203 INTVAL (XEXP (x, 1)) - count);
6204 break;
6205
6206 case NEG: case NOT:
6207 if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
f1c6ba8b 6208 return simplify_gen_unary (code, mode, tem, mode);
71923da7
RK
6209
6210 break;
6211
6212 case PLUS: case IOR: case XOR: case AND:
6213 /* If we can safely shift this constant and we find the inner shift,
6214 make a new operation. */
6215 if (GET_CODE (XEXP (x,1)) == CONST_INT
b729186a 6216 && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
71923da7 6217 && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
663522cb 6218 return gen_binary (code, mode, tem,
71923da7
RK
6219 GEN_INT (INTVAL (XEXP (x, 1)) >> count));
6220
6221 break;
663522cb 6222
e9a25f70
JL
6223 default:
6224 break;
71923da7
RK
6225 }
6226
6227 return 0;
6228}
6229\f
230d793d
RS
6230/* Look at the expression rooted at X. Look for expressions
6231 equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
6232 Form these expressions.
6233
6234 Return the new rtx, usually just X.
6235
8aeea6e6 6236 Also, for machines like the VAX that don't have logical shift insns,
230d793d
RS
6237 try to convert logical to arithmetic shift operations in cases where
6238 they are equivalent. This undoes the canonicalizations to logical
6239 shifts done elsewhere.
6240
6241 We try, as much as possible, to re-use rtl expressions to save memory.
6242
6243 IN_CODE says what kind of expression we are processing. Normally, it is
42495ca0
RK
6244 SET. In a memory address (inside a MEM, PLUS or minus, the latter two
6245 being kludges), it is MEM. When processing the arguments of a comparison
230d793d
RS
6246 or a COMPARE against zero, it is COMPARE. */
6247
6248static rtx
6249make_compound_operation (x, in_code)
6250 rtx x;
6251 enum rtx_code in_code;
6252{
6253 enum rtx_code code = GET_CODE (x);
6254 enum machine_mode mode = GET_MODE (x);
6255 int mode_width = GET_MODE_BITSIZE (mode);
71923da7 6256 rtx rhs, lhs;
230d793d 6257 enum rtx_code next_code;
f24ad0e4 6258 int i;
230d793d 6259 rtx new = 0;
280f58ba 6260 rtx tem;
6f7d635c 6261 const char *fmt;
230d793d
RS
6262
6263 /* Select the code to be used in recursive calls. Once we are inside an
6264 address, we stay there. If we have a comparison, set to COMPARE,
6265 but once inside, go back to our default of SET. */
6266
42495ca0 6267 next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
230d793d
RS
6268 : ((code == COMPARE || GET_RTX_CLASS (code) == '<')
6269 && XEXP (x, 1) == const0_rtx) ? COMPARE
6270 : in_code == COMPARE ? SET : in_code);
6271
6272 /* Process depending on the code of this operation. If NEW is set
6273 non-zero, it will be returned. */
6274
6275 switch (code)
6276 {
6277 case ASHIFT:
230d793d
RS
6278 /* Convert shifts by constants into multiplications if inside
6279 an address. */
6280 if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
5f4f0e22 6281 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
230d793d 6282 && INTVAL (XEXP (x, 1)) >= 0)
280f58ba
RK
6283 {
6284 new = make_compound_operation (XEXP (x, 0), next_code);
f1c6ba8b
RK
6285 new = gen_rtx_MULT (mode, new,
6286 GEN_INT ((HOST_WIDE_INT) 1
6287 << INTVAL (XEXP (x, 1))));
280f58ba 6288 }
230d793d
RS
6289 break;
6290
6291 case AND:
6292 /* If the second operand is not a constant, we can't do anything
6293 with it. */
6294 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6295 break;
6296
6297 /* If the constant is a power of two minus one and the first operand
6298 is a logical right shift, make an extraction. */
6299 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6300 && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
280f58ba
RK
6301 {
6302 new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6303 new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1,
6304 0, in_code == COMPARE);
6305 }
dfbe1b2f 6306
230d793d
RS
6307 /* Same as previous, but for (subreg (lshiftrt ...)) in first op. */
6308 else if (GET_CODE (XEXP (x, 0)) == SUBREG
6309 && subreg_lowpart_p (XEXP (x, 0))
6310 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
6311 && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
280f58ba
RK
6312 {
6313 new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
6314 next_code);
2f99f437 6315 new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0,
280f58ba
RK
6316 XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
6317 0, in_code == COMPARE);
6318 }
45620ed4 6319 /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)). */
c2f9f64e
JW
6320 else if ((GET_CODE (XEXP (x, 0)) == XOR
6321 || GET_CODE (XEXP (x, 0)) == IOR)
6322 && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
6323 && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
6324 && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6325 {
6326 /* Apply the distributive law, and then try to make extractions. */
f1c6ba8b
RK
6327 new = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
6328 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
6329 XEXP (x, 1)),
6330 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
6331 XEXP (x, 1)));
c2f9f64e
JW
6332 new = make_compound_operation (new, in_code);
6333 }
a7c99304
RK
6334
6335 /* If we are have (and (rotate X C) M) and C is larger than the number
6336 of bits in M, this is an extraction. */
6337
6338 else if (GET_CODE (XEXP (x, 0)) == ROTATE
6339 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6340 && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
6341 && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
280f58ba
RK
6342 {
6343 new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6344 new = make_extraction (mode, new,
6345 (GET_MODE_BITSIZE (mode)
6346 - INTVAL (XEXP (XEXP (x, 0), 1))),
6347 NULL_RTX, i, 1, 0, in_code == COMPARE);
6348 }
a7c99304
RK
6349
6350 /* On machines without logical shifts, if the operand of the AND is
230d793d
RS
6351 a logical shift and our mask turns off all the propagated sign
6352 bits, we can replace the logical shift with an arithmetic shift. */
ef89d648
ZW
6353 else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6354 && !have_insn_for (LSHIFTRT, mode)
6355 && have_insn_for (ASHIFTRT, mode)
230d793d
RS
6356 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6357 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
5f4f0e22
CH
6358 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6359 && mode_width <= HOST_BITS_PER_WIDE_INT)
230d793d 6360 {
5f4f0e22 6361 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
230d793d
RS
6362
6363 mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
6364 if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
6365 SUBST (XEXP (x, 0),
f1c6ba8b
RK
6366 gen_rtx_ASHIFTRT (mode,
6367 make_compound_operation
6368 (XEXP (XEXP (x, 0), 0), next_code),
6369 XEXP (XEXP (x, 0), 1)));
230d793d
RS
6370 }
6371
6372 /* If the constant is one less than a power of two, this might be
6373 representable by an extraction even if no shift is present.
6374 If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
6375 we are in a COMPARE. */
6376 else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
280f58ba
RK
6377 new = make_extraction (mode,
6378 make_compound_operation (XEXP (x, 0),
6379 next_code),
6380 0, NULL_RTX, i, 1, 0, in_code == COMPARE);
230d793d
RS
6381
6382 /* If we are in a comparison and this is an AND with a power of two,
6383 convert this into the appropriate bit extract. */
6384 else if (in_code == COMPARE
6385 && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
280f58ba
RK
6386 new = make_extraction (mode,
6387 make_compound_operation (XEXP (x, 0),
6388 next_code),
6389 i, NULL_RTX, 1, 1, 0, 1);
230d793d
RS
6390
6391 break;
6392
6393 case LSHIFTRT:
6394 /* If the sign bit is known to be zero, replace this with an
6395 arithmetic shift. */
ef89d648
ZW
6396 if (have_insn_for (ASHIFTRT, mode)
6397 && ! have_insn_for (LSHIFTRT, mode)
5f4f0e22 6398 && mode_width <= HOST_BITS_PER_WIDE_INT
951553af 6399 && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
230d793d 6400 {
f1c6ba8b
RK
6401 new = gen_rtx_ASHIFTRT (mode,
6402 make_compound_operation (XEXP (x, 0),
6403 next_code),
6404 XEXP (x, 1));
230d793d
RS
6405 break;
6406 }
6407
0f41302f 6408 /* ... fall through ... */
230d793d
RS
6409
6410 case ASHIFTRT:
71923da7
RK
6411 lhs = XEXP (x, 0);
6412 rhs = XEXP (x, 1);
6413
230d793d
RS
6414 /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
6415 this is a SIGN_EXTRACT. */
71923da7
RK
6416 if (GET_CODE (rhs) == CONST_INT
6417 && GET_CODE (lhs) == ASHIFT
6418 && GET_CODE (XEXP (lhs, 1)) == CONST_INT
6419 && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1)))
280f58ba 6420 {
71923da7 6421 new = make_compound_operation (XEXP (lhs, 0), next_code);
280f58ba 6422 new = make_extraction (mode, new,
71923da7
RK
6423 INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
6424 NULL_RTX, mode_width - INTVAL (rhs),
d0ab8cd3 6425 code == LSHIFTRT, 0, in_code == COMPARE);
8231ad94 6426 break;
d0ab8cd3
RK
6427 }
6428
71923da7
RK
6429 /* See if we have operations between an ASHIFTRT and an ASHIFT.
6430 If so, try to merge the shifts into a SIGN_EXTEND. We could
6431 also do this for some cases of SIGN_EXTRACT, but it doesn't
6432 seem worth the effort; the case checked for occurs on Alpha. */
663522cb 6433
71923da7
RK
6434 if (GET_RTX_CLASS (GET_CODE (lhs)) != 'o'
6435 && ! (GET_CODE (lhs) == SUBREG
6436 && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (lhs))) == 'o'))
6437 && GET_CODE (rhs) == CONST_INT
6438 && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
6439 && (new = extract_left_shift (lhs, INTVAL (rhs))) != 0)
6440 new = make_extraction (mode, make_compound_operation (new, next_code),
6441 0, NULL_RTX, mode_width - INTVAL (rhs),
6442 code == LSHIFTRT, 0, in_code == COMPARE);
663522cb 6443
230d793d 6444 break;
280f58ba
RK
6445
6446 case SUBREG:
6447 /* Call ourselves recursively on the inner expression. If we are
6448 narrowing the object and it has a different RTL code from
6449 what it originally did, do this SUBREG as a force_to_mode. */
6450
0a5cbff6 6451 tem = make_compound_operation (SUBREG_REG (x), in_code);
280f58ba
RK
6452 if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
6453 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
6454 && subreg_lowpart_p (x))
0a5cbff6 6455 {
e8dc6d50
JH
6456 rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
6457 NULL_RTX, 0);
0a5cbff6
RK
6458
6459 /* If we have something other than a SUBREG, we might have
6460 done an expansion, so rerun outselves. */
6461 if (GET_CODE (newer) != SUBREG)
6462 newer = make_compound_operation (newer, in_code);
6463
6464 return newer;
6465 }
6f28d3e9
RH
6466
6467 /* If this is a paradoxical subreg, and the new code is a sign or
6468 zero extension, omit the subreg and widen the extension. If it
6469 is a regular subreg, we can still get rid of the subreg by not
6470 widening so much, or in fact removing the extension entirely. */
6471 if ((GET_CODE (tem) == SIGN_EXTEND
6472 || GET_CODE (tem) == ZERO_EXTEND)
6473 && subreg_lowpart_p (x))
6474 {
6475 if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem))
6476 || (GET_MODE_SIZE (mode) >
6477 GET_MODE_SIZE (GET_MODE (XEXP (tem, 0)))))
f1c6ba8b 6478 tem = gen_rtx_fmt_e (GET_CODE (tem), mode, XEXP (tem, 0));
6f28d3e9
RH
6479 else
6480 tem = gen_lowpart_for_combine (mode, XEXP (tem, 0));
6481 return tem;
6482 }
e9a25f70 6483 break;
663522cb 6484
e9a25f70
JL
6485 default:
6486 break;
230d793d
RS
6487 }
6488
6489 if (new)
6490 {
df62f951 6491 x = gen_lowpart_for_combine (mode, new);
230d793d
RS
6492 code = GET_CODE (x);
6493 }
6494
6495 /* Now recursively process each operand of this operation. */
6496 fmt = GET_RTX_FORMAT (code);
6497 for (i = 0; i < GET_RTX_LENGTH (code); i++)
6498 if (fmt[i] == 'e')
6499 {
6500 new = make_compound_operation (XEXP (x, i), next_code);
6501 SUBST (XEXP (x, i), new);
6502 }
6503
6504 return x;
6505}
6506\f
6507/* Given M see if it is a value that would select a field of bits
663522cb
KH
6508 within an item, but not the entire word. Return -1 if not.
6509 Otherwise, return the starting position of the field, where 0 is the
6510 low-order bit.
230d793d
RS
6511
6512 *PLEN is set to the length of the field. */
6513
6514static int
6515get_pos_from_mask (m, plen)
5f4f0e22 6516 unsigned HOST_WIDE_INT m;
770ae6cc 6517 unsigned HOST_WIDE_INT *plen;
230d793d
RS
6518{
6519 /* Get the bit number of the first 1 bit from the right, -1 if none. */
663522cb 6520 int pos = exact_log2 (m & -m);
d3bc8938 6521 int len;
230d793d
RS
6522
6523 if (pos < 0)
6524 return -1;
6525
6526 /* Now shift off the low-order zero bits and see if we have a power of
6527 two minus 1. */
d3bc8938 6528 len = exact_log2 ((m >> pos) + 1);
230d793d 6529
d3bc8938 6530 if (len <= 0)
230d793d
RS
6531 return -1;
6532
d3bc8938 6533 *plen = len;
230d793d
RS
6534 return pos;
6535}
6536\f
6139ff20
RK
6537/* See if X can be simplified knowing that we will only refer to it in
6538 MODE and will only refer to those bits that are nonzero in MASK.
6539 If other bits are being computed or if masking operations are done
6540 that select a superset of the bits in MASK, they can sometimes be
6541 ignored.
6542
6543 Return a possibly simplified expression, but always convert X to
6544 MODE. If X is a CONST_INT, AND the CONST_INT with MASK.
dfbe1b2f 6545
663522cb 6546 Also, if REG is non-zero and X is a register equal in value to REG,
e3d616e3
RK
6547 replace X with REG.
6548
6549 If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
6550 are all off in X. This is used when X will be complemented, by either
180b8e4b 6551 NOT, NEG, or XOR. */
dfbe1b2f
RK
6552
6553static rtx
e3d616e3 6554force_to_mode (x, mode, mask, reg, just_select)
dfbe1b2f
RK
6555 rtx x;
6556 enum machine_mode mode;
6139ff20 6557 unsigned HOST_WIDE_INT mask;
dfbe1b2f 6558 rtx reg;
e3d616e3 6559 int just_select;
dfbe1b2f
RK
6560{
6561 enum rtx_code code = GET_CODE (x);
180b8e4b 6562 int next_select = just_select || code == XOR || code == NOT || code == NEG;
ef026f91
RS
6563 enum machine_mode op_mode;
6564 unsigned HOST_WIDE_INT fuller_mask, nonzero;
6139ff20
RK
6565 rtx op0, op1, temp;
6566
132d2040
RK
6567 /* If this is a CALL or ASM_OPERANDS, don't do anything. Some of the
6568 code below will do the wrong thing since the mode of such an
663522cb 6569 expression is VOIDmode.
be3d27d6
CI
6570
6571 Also do nothing if X is a CLOBBER; this can happen if X was
6572 the return value from a call to gen_lowpart_for_combine. */
6573 if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
246e00f2
RK
6574 return x;
6575
6139ff20
RK
6576 /* We want to perform the operation is its present mode unless we know
6577 that the operation is valid in MODE, in which case we do the operation
6578 in MODE. */
1c75dfa4 6579 op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
ef89d648 6580 && have_insn_for (code, mode))
ef026f91 6581 ? mode : GET_MODE (x));
e3d616e3 6582
aa988991
RS
6583 /* It is not valid to do a right-shift in a narrower mode
6584 than the one it came in with. */
6585 if ((code == LSHIFTRT || code == ASHIFTRT)
6586 && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
6587 op_mode = GET_MODE (x);
ef026f91
RS
6588
6589 /* Truncate MASK to fit OP_MODE. */
6590 if (op_mode)
6591 mask &= GET_MODE_MASK (op_mode);
6139ff20
RK
6592
6593 /* When we have an arithmetic operation, or a shift whose count we
6594 do not know, we need to assume that all bit the up to the highest-order
6595 bit in MASK will be needed. This is how we form such a mask. */
ef026f91
RS
6596 if (op_mode)
6597 fuller_mask = (GET_MODE_BITSIZE (op_mode) >= HOST_BITS_PER_WIDE_INT
6598 ? GET_MODE_MASK (op_mode)
729a2125
RK
6599 : (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
6600 - 1));
ef026f91 6601 else
663522cb 6602 fuller_mask = ~(HOST_WIDE_INT) 0;
ef026f91
RS
6603
6604 /* Determine what bits of X are guaranteed to be (non)zero. */
6605 nonzero = nonzero_bits (x, mode);
6139ff20
RK
6606
6607 /* If none of the bits in X are needed, return a zero. */
e3d616e3 6608 if (! just_select && (nonzero & mask) == 0)
6139ff20 6609 return const0_rtx;
dfbe1b2f 6610
6139ff20
RK
6611 /* If X is a CONST_INT, return a new one. Do this here since the
6612 test below will fail. */
6613 if (GET_CODE (x) == CONST_INT)
ceb7983c
RK
6614 {
6615 HOST_WIDE_INT cval = INTVAL (x) & mask;
6616 int width = GET_MODE_BITSIZE (mode);
6617
6618 /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative
6619 number, sign extend it. */
6620 if (width > 0 && width < HOST_BITS_PER_WIDE_INT
6621 && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6622 cval |= (HOST_WIDE_INT) -1 << width;
663522cb 6623
ceb7983c
RK
6624 return GEN_INT (cval);
6625 }
dfbe1b2f 6626
180b8e4b
RK
6627 /* If X is narrower than MODE and we want all the bits in X's mode, just
6628 get X in the proper mode. */
6629 if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
663522cb 6630 && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
dfbe1b2f
RK
6631 return gen_lowpart_for_combine (mode, x);
6632
71923da7
RK
6633 /* If we aren't changing the mode, X is not a SUBREG, and all zero bits in
6634 MASK are already known to be zero in X, we need not do anything. */
663522cb 6635 if (GET_MODE (x) == mode && code != SUBREG && (~mask & nonzero) == 0)
6139ff20
RK
6636 return x;
6637
dfbe1b2f
RK
6638 switch (code)
6639 {
6139ff20
RK
6640 case CLOBBER:
6641 /* If X is a (clobber (const_int)), return it since we know we are
0f41302f 6642 generating something that won't match. */
6139ff20
RK
6643 return x;
6644
6139ff20
RK
6645 case USE:
6646 /* X is a (use (mem ..)) that was made from a bit-field extraction that
6647 spanned the boundary of the MEM. If we are now masking so it is
6648 within that boundary, we don't need the USE any more. */
f76b9db2 6649 if (! BITS_BIG_ENDIAN
663522cb 6650 && (mask & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
e3d616e3 6651 return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
f76b9db2 6652 break;
6139ff20 6653
dfbe1b2f
RK
6654 case SIGN_EXTEND:
6655 case ZERO_EXTEND:
6656 case ZERO_EXTRACT:
6657 case SIGN_EXTRACT:
6658 x = expand_compound_operation (x);
6659 if (GET_CODE (x) != code)
e3d616e3 6660 return force_to_mode (x, mode, mask, reg, next_select);
dfbe1b2f
RK
6661 break;
6662
6663 case REG:
6664 if (reg != 0 && (rtx_equal_p (get_last_value (reg), x)
6665 || rtx_equal_p (reg, get_last_value (x))))
6666 x = reg;
6667 break;
6668
dfbe1b2f 6669 case SUBREG:
6139ff20 6670 if (subreg_lowpart_p (x)
180b8e4b
RK
6671 /* We can ignore the effect of this SUBREG if it narrows the mode or
6672 if the constant masks to zero all the bits the mode doesn't
6673 have. */
6139ff20
RK
6674 && ((GET_MODE_SIZE (GET_MODE (x))
6675 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
6139ff20
RK
6676 || (0 == (mask
6677 & GET_MODE_MASK (GET_MODE (x))
663522cb 6678 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
e3d616e3 6679 return force_to_mode (SUBREG_REG (x), mode, mask, reg, next_select);
dfbe1b2f
RK
6680 break;
6681
6682 case AND:
6139ff20
RK
6683 /* If this is an AND with a constant, convert it into an AND
6684 whose constant is the AND of that constant with MASK. If it
6685 remains an AND of MASK, delete it since it is redundant. */
dfbe1b2f 6686
2ca9ae17 6687 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
dfbe1b2f 6688 {
6139ff20
RK
6689 x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
6690 mask & INTVAL (XEXP (x, 1)));
dfbe1b2f
RK
6691
6692 /* If X is still an AND, see if it is an AND with a mask that
71923da7
RK
6693 is just some low-order bits. If so, and it is MASK, we don't
6694 need it. */
dfbe1b2f
RK
6695
6696 if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
e51712db 6697 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) == mask)
dfbe1b2f 6698 x = XEXP (x, 0);
d0ab8cd3 6699
71923da7
RK
6700 /* If it remains an AND, try making another AND with the bits
6701 in the mode mask that aren't in MASK turned on. If the
6702 constant in the AND is wide enough, this might make a
6703 cheaper constant. */
6704
6705 if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
2ca9ae17
JW
6706 && GET_MODE_MASK (GET_MODE (x)) != mask
6707 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
71923da7
RK
6708 {
6709 HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
663522cb 6710 | (GET_MODE_MASK (GET_MODE (x)) & ~mask));
71923da7
RK
6711 int width = GET_MODE_BITSIZE (GET_MODE (x));
6712 rtx y;
6713
6714 /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative
6715 number, sign extend it. */
6716 if (width > 0 && width < HOST_BITS_PER_WIDE_INT
6717 && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6718 cval |= (HOST_WIDE_INT) -1 << width;
6719
6720 y = gen_binary (AND, GET_MODE (x), XEXP (x, 0), GEN_INT (cval));
6721 if (rtx_cost (y, SET) < rtx_cost (x, SET))
6722 x = y;
6723 }
6724
d0ab8cd3 6725 break;
dfbe1b2f
RK
6726 }
6727
6139ff20 6728 goto binop;
dfbe1b2f
RK
6729
6730 case PLUS:
6139ff20
RK
6731 /* In (and (plus FOO C1) M), if M is a mask that just turns off
6732 low-order bits (as in an alignment operation) and FOO is already
6733 aligned to that boundary, mask C1 to that boundary as well.
6734 This may eliminate that PLUS and, later, the AND. */
9fa6d012
TG
6735
6736 {
770ae6cc 6737 unsigned int width = GET_MODE_BITSIZE (mode);
9fa6d012
TG
6738 unsigned HOST_WIDE_INT smask = mask;
6739
6740 /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
6741 number, sign extend it. */
6742
6743 if (width < HOST_BITS_PER_WIDE_INT
6744 && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6745 smask |= (HOST_WIDE_INT) -1 << width;
6746
6747 if (GET_CODE (XEXP (x, 1)) == CONST_INT
0e9ff885
DM
6748 && exact_log2 (- smask) >= 0)
6749 {
6750#ifdef STACK_BIAS
6751 if (STACK_BIAS
6752 && (XEXP (x, 0) == stack_pointer_rtx
6753 || XEXP (x, 0) == frame_pointer_rtx))
6754 {
663522cb
KH
6755 int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
6756 unsigned HOST_WIDE_INT sp_mask = GET_MODE_MASK (mode);
6757
6758 sp_mask &= ~(sp_alignment - 1);
6759 if ((sp_mask & ~smask) == 0
6760 && ((INTVAL (XEXP (x, 1)) - STACK_BIAS) & ~smask) != 0)
0e9ff885 6761 return force_to_mode (plus_constant (XEXP (x, 0),
663522cb 6762 ((INTVAL (XEXP (x, 1)) -
835c8e04 6763 STACK_BIAS) & smask)
0e9ff885 6764 + STACK_BIAS),
663522cb
KH
6765 mode, smask, reg, next_select);
6766 }
0e9ff885 6767#endif
663522cb
KH
6768 if ((nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
6769 && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
0e9ff885 6770 return force_to_mode (plus_constant (XEXP (x, 0),
663522cb 6771 (INTVAL (XEXP (x, 1))
835c8e04
DT
6772 & smask)),
6773 mode, smask, reg, next_select);
0e9ff885 6774 }
9fa6d012 6775 }
6139ff20 6776
0f41302f 6777 /* ... fall through ... */
6139ff20 6778
dfbe1b2f 6779 case MULT:
6139ff20
RK
6780 /* For PLUS, MINUS and MULT, we need any bits less significant than the
6781 most significant bit in MASK since carries from those bits will
6782 affect the bits we are interested in. */
6783 mask = fuller_mask;
6784 goto binop;
6785
d41638e4
RH
6786 case MINUS:
6787 /* If X is (minus C Y) where C's least set bit is larger than any bit
6788 in the mask, then we may replace with (neg Y). */
6789 if (GET_CODE (XEXP (x, 0)) == CONST_INT
0345195a
RK
6790 && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
6791 & -INTVAL (XEXP (x, 0))))
6792 > mask))
d41638e4 6793 {
f1c6ba8b
RK
6794 x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
6795 GET_MODE (x));
d41638e4
RH
6796 return force_to_mode (x, mode, mask, reg, next_select);
6797 }
6798
6799 /* Similarly, if C contains every bit in the mask, then we may
6800 replace with (not Y). */
6801 if (GET_CODE (XEXP (x, 0)) == CONST_INT
0345195a
RK
6802 && ((INTVAL (XEXP (x, 0)) | (HOST_WIDE_INT) mask)
6803 == INTVAL (XEXP (x, 0))))
d41638e4 6804 {
f1c6ba8b
RK
6805 x = simplify_gen_unary (NOT, GET_MODE (x),
6806 XEXP (x, 1), GET_MODE (x));
d41638e4
RH
6807 return force_to_mode (x, mode, mask, reg, next_select);
6808 }
6809
6810 mask = fuller_mask;
6811 goto binop;
6812
dfbe1b2f
RK
6813 case IOR:
6814 case XOR:
6139ff20
RK
6815 /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
6816 LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
6817 operation which may be a bitfield extraction. Ensure that the
6818 constant we form is not wider than the mode of X. */
6819
6820 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6821 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6822 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6823 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6824 && GET_CODE (XEXP (x, 1)) == CONST_INT
6825 && ((INTVAL (XEXP (XEXP (x, 0), 1))
6826 + floor_log2 (INTVAL (XEXP (x, 1))))
6827 < GET_MODE_BITSIZE (GET_MODE (x)))
6828 && (INTVAL (XEXP (x, 1))
663522cb 6829 & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
6139ff20
RK
6830 {
6831 temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
663522cb 6832 << INTVAL (XEXP (XEXP (x, 0), 1)));
6139ff20
RK
6833 temp = gen_binary (GET_CODE (x), GET_MODE (x),
6834 XEXP (XEXP (x, 0), 0), temp);
d4d2b13f
RK
6835 x = gen_binary (LSHIFTRT, GET_MODE (x), temp,
6836 XEXP (XEXP (x, 0), 1));
e3d616e3 6837 return force_to_mode (x, mode, mask, reg, next_select);
6139ff20
RK
6838 }
6839
6840 binop:
dfbe1b2f 6841 /* For most binary operations, just propagate into the operation and
6139ff20
RK
6842 change the mode if we have an operation of that mode. */
6843
e3d616e3
RK
6844 op0 = gen_lowpart_for_combine (op_mode,
6845 force_to_mode (XEXP (x, 0), mode, mask,
6846 reg, next_select));
6847 op1 = gen_lowpart_for_combine (op_mode,
6848 force_to_mode (XEXP (x, 1), mode, mask,
6849 reg, next_select));
6139ff20 6850
2dd484ed
RK
6851 /* If OP1 is a CONST_INT and X is an IOR or XOR, clear bits outside
6852 MASK since OP1 might have been sign-extended but we never want
6853 to turn on extra bits, since combine might have previously relied
6854 on them being off. */
6855 if (GET_CODE (op1) == CONST_INT && (code == IOR || code == XOR)
6856 && (INTVAL (op1) & mask) != 0)
6857 op1 = GEN_INT (INTVAL (op1) & mask);
663522cb 6858
6139ff20
RK
6859 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
6860 x = gen_binary (code, op_mode, op0, op1);
d0ab8cd3 6861 break;
dfbe1b2f
RK
6862
6863 case ASHIFT:
dfbe1b2f 6864 /* For left shifts, do the same, but just for the first operand.
f6785026
RK
6865 However, we cannot do anything with shifts where we cannot
6866 guarantee that the counts are smaller than the size of the mode
6867 because such a count will have a different meaning in a
6139ff20 6868 wider mode. */
f6785026
RK
6869
6870 if (! (GET_CODE (XEXP (x, 1)) == CONST_INT
6139ff20 6871 && INTVAL (XEXP (x, 1)) >= 0
f6785026
RK
6872 && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
6873 && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
6874 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
adb7a1cb 6875 < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
f6785026 6876 break;
663522cb 6877
6139ff20
RK
6878 /* If the shift count is a constant and we can do arithmetic in
6879 the mode of the shift, refine which bits we need. Otherwise, use the
6880 conservative form of the mask. */
6881 if (GET_CODE (XEXP (x, 1)) == CONST_INT
6882 && INTVAL (XEXP (x, 1)) >= 0
6883 && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
6884 && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
6885 mask >>= INTVAL (XEXP (x, 1));
6886 else
6887 mask = fuller_mask;
6888
6889 op0 = gen_lowpart_for_combine (op_mode,
6890 force_to_mode (XEXP (x, 0), op_mode,
e3d616e3 6891 mask, reg, next_select));
6139ff20
RK
6892
6893 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
663522cb 6894 x = gen_binary (code, op_mode, op0, XEXP (x, 1));
d0ab8cd3 6895 break;
dfbe1b2f
RK
6896
6897 case LSHIFTRT:
1347292b
JW
6898 /* Here we can only do something if the shift count is a constant,
6899 this shift constant is valid for the host, and we can do arithmetic
6900 in OP_MODE. */
dfbe1b2f
RK
6901
6902 if (GET_CODE (XEXP (x, 1)) == CONST_INT
1347292b 6903 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6139ff20 6904 && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
d0ab8cd3 6905 {
6139ff20 6906 rtx inner = XEXP (x, 0);
402b6c2a 6907 unsigned HOST_WIDE_INT inner_mask;
6139ff20
RK
6908
6909 /* Select the mask of the bits we need for the shift operand. */
402b6c2a 6910 inner_mask = mask << INTVAL (XEXP (x, 1));
d0ab8cd3 6911
6139ff20 6912 /* We can only change the mode of the shift if we can do arithmetic
402b6c2a
JW
6913 in the mode of the shift and INNER_MASK is no wider than the
6914 width of OP_MODE. */
6139ff20 6915 if (GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT
663522cb 6916 || (inner_mask & ~GET_MODE_MASK (op_mode)) != 0)
d0ab8cd3
RK
6917 op_mode = GET_MODE (x);
6918
402b6c2a 6919 inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
6139ff20
RK
6920
6921 if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
6922 x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
d0ab8cd3 6923 }
6139ff20
RK
6924
6925 /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
6926 shift and AND produces only copies of the sign bit (C2 is one less
6927 than a power of two), we can do this with just a shift. */
6928
6929 if (GET_CODE (x) == LSHIFTRT
6930 && GET_CODE (XEXP (x, 1)) == CONST_INT
cfff35c1
JW
6931 /* The shift puts one of the sign bit copies in the least significant
6932 bit. */
6139ff20
RK
6933 && ((INTVAL (XEXP (x, 1))
6934 + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
6935 >= GET_MODE_BITSIZE (GET_MODE (x)))
6936 && exact_log2 (mask + 1) >= 0
cfff35c1
JW
6937 /* Number of bits left after the shift must be more than the mask
6938 needs. */
6939 && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
6940 <= GET_MODE_BITSIZE (GET_MODE (x)))
6941 /* Must be more sign bit copies than the mask needs. */
770ae6cc 6942 && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
6139ff20
RK
6943 >= exact_log2 (mask + 1)))
6944 x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
6945 GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
6946 - exact_log2 (mask + 1)));
fae2db47
JW
6947
6948 goto shiftrt;
d0ab8cd3
RK
6949
6950 case ASHIFTRT:
6139ff20
RK
6951 /* If we are just looking for the sign bit, we don't need this shift at
6952 all, even if it has a variable count. */
9bf22b75 6953 if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
e51712db 6954 && (mask == ((unsigned HOST_WIDE_INT) 1
9bf22b75 6955 << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
e3d616e3 6956 return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
6139ff20
RK
6957
6958 /* If this is a shift by a constant, get a mask that contains those bits
6959 that are not copies of the sign bit. We then have two cases: If
6960 MASK only includes those bits, this can be a logical shift, which may
6961 allow simplifications. If MASK is a single-bit field not within
6962 those bits, we are requesting a copy of the sign bit and hence can
6963 shift the sign bit to the appropriate location. */
6964
6965 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0
6966 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
6967 {
6968 int i = -1;
6969
b69960ac
RK
6970 /* If the considered data is wider then HOST_WIDE_INT, we can't
6971 represent a mask for all its bits in a single scalar.
6972 But we only care about the lower bits, so calculate these. */
6973
6a11342f 6974 if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
b69960ac 6975 {
663522cb 6976 nonzero = ~(HOST_WIDE_INT) 0;
b69960ac
RK
6977
6978 /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
6979 is the number of bits a full-width mask would have set.
6980 We need only shift if these are fewer than nonzero can
6981 hold. If not, we must keep all bits set in nonzero. */
6982
6983 if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
6984 < HOST_BITS_PER_WIDE_INT)
6985 nonzero >>= INTVAL (XEXP (x, 1))
6986 + HOST_BITS_PER_WIDE_INT
6987 - GET_MODE_BITSIZE (GET_MODE (x)) ;
6988 }
6989 else
6990 {
6991 nonzero = GET_MODE_MASK (GET_MODE (x));
6992 nonzero >>= INTVAL (XEXP (x, 1));
6993 }
6139ff20 6994
663522cb 6995 if ((mask & ~nonzero) == 0
6139ff20
RK
6996 || (i = exact_log2 (mask)) >= 0)
6997 {
6998 x = simplify_shift_const
6999 (x, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7000 i < 0 ? INTVAL (XEXP (x, 1))
7001 : GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
7002
7003 if (GET_CODE (x) != ASHIFTRT)
e3d616e3 7004 return force_to_mode (x, mode, mask, reg, next_select);
6139ff20
RK
7005 }
7006 }
7007
7008 /* If MASK is 1, convert this to a LSHIFTRT. This can be done
7009 even if the shift count isn't a constant. */
7010 if (mask == 1)
7011 x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1));
7012
fae2db47
JW
7013 shiftrt:
7014
7015 /* If this is a zero- or sign-extension operation that just affects bits
4c002f29
RK
7016 we don't care about, remove it. Be sure the call above returned
7017 something that is still a shift. */
d0ab8cd3 7018
4c002f29
RK
7019 if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
7020 && GET_CODE (XEXP (x, 1)) == CONST_INT
d0ab8cd3 7021 && INTVAL (XEXP (x, 1)) >= 0
6139ff20
RK
7022 && (INTVAL (XEXP (x, 1))
7023 <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
d0ab8cd3
RK
7024 && GET_CODE (XEXP (x, 0)) == ASHIFT
7025 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7026 && INTVAL (XEXP (XEXP (x, 0), 1)) == INTVAL (XEXP (x, 1)))
e3d616e3
RK
7027 return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
7028 reg, next_select);
6139ff20 7029
dfbe1b2f
RK
7030 break;
7031
6139ff20
RK
7032 case ROTATE:
7033 case ROTATERT:
7034 /* If the shift count is constant and we can do computations
7035 in the mode of X, compute where the bits we care about are.
7036 Otherwise, we can't do anything. Don't change the mode of
7037 the shift or propagate MODE into the shift, though. */
7038 if (GET_CODE (XEXP (x, 1)) == CONST_INT
7039 && INTVAL (XEXP (x, 1)) >= 0)
7040 {
7041 temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
7042 GET_MODE (x), GEN_INT (mask),
7043 XEXP (x, 1));
7d171a1e 7044 if (temp && GET_CODE(temp) == CONST_INT)
6139ff20
RK
7045 SUBST (XEXP (x, 0),
7046 force_to_mode (XEXP (x, 0), GET_MODE (x),
e3d616e3 7047 INTVAL (temp), reg, next_select));
6139ff20
RK
7048 }
7049 break;
663522cb 7050
dfbe1b2f 7051 case NEG:
180b8e4b
RK
7052 /* If we just want the low-order bit, the NEG isn't needed since it
7053 won't change the low-order bit. */
7054 if (mask == 1)
7055 return force_to_mode (XEXP (x, 0), mode, mask, reg, just_select);
7056
6139ff20
RK
7057 /* We need any bits less significant than the most significant bit in
7058 MASK since carries from those bits will affect the bits we are
7059 interested in. */
7060 mask = fuller_mask;
7061 goto unop;
7062
dfbe1b2f 7063 case NOT:
6139ff20
RK
7064 /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
7065 same as the XOR case above. Ensure that the constant we form is not
7066 wider than the mode of X. */
7067
7068 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7069 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7070 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7071 && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
7072 < GET_MODE_BITSIZE (GET_MODE (x)))
7073 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
7074 {
7075 temp = GEN_INT (mask << INTVAL (XEXP (XEXP (x, 0), 1)));
7076 temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp);
7077 x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1));
7078
e3d616e3 7079 return force_to_mode (x, mode, mask, reg, next_select);
6139ff20
RK
7080 }
7081
f82da7d2
JW
7082 /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
7083 use the full mask inside the NOT. */
7084 mask = fuller_mask;
7085
6139ff20 7086 unop:
e3d616e3
RK
7087 op0 = gen_lowpart_for_combine (op_mode,
7088 force_to_mode (XEXP (x, 0), mode, mask,
7089 reg, next_select));
6139ff20 7090 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
f1c6ba8b 7091 x = simplify_gen_unary (code, op_mode, op0, op_mode);
6139ff20
RK
7092 break;
7093
7094 case NE:
7095 /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
3aceff0d 7096 in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
1a6ec070 7097 which is equal to STORE_FLAG_VALUE. */
663522cb 7098 if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
3aceff0d 7099 && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
1a6ec070 7100 && nonzero_bits (XEXP (x, 0), mode) == STORE_FLAG_VALUE)
e3d616e3 7101 return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
6139ff20 7102
d0ab8cd3
RK
7103 break;
7104
7105 case IF_THEN_ELSE:
7106 /* We have no way of knowing if the IF_THEN_ELSE can itself be
7107 written in a narrower mode. We play it safe and do not do so. */
7108
7109 SUBST (XEXP (x, 1),
7110 gen_lowpart_for_combine (GET_MODE (x),
7111 force_to_mode (XEXP (x, 1), mode,
e3d616e3 7112 mask, reg, next_select)));
d0ab8cd3
RK
7113 SUBST (XEXP (x, 2),
7114 gen_lowpart_for_combine (GET_MODE (x),
7115 force_to_mode (XEXP (x, 2), mode,
e3d616e3 7116 mask, reg,next_select)));
d0ab8cd3 7117 break;
663522cb 7118
e9a25f70
JL
7119 default:
7120 break;
dfbe1b2f
RK
7121 }
7122
d0ab8cd3 7123 /* Ensure we return a value of the proper mode. */
dfbe1b2f
RK
7124 return gen_lowpart_for_combine (mode, x);
7125}
7126\f
abe6e52f
RK
7127/* Return nonzero if X is an expression that has one of two values depending on
7128 whether some other value is zero or nonzero. In that case, we return the
7129 value that is being tested, *PTRUE is set to the value if the rtx being
7130 returned has a nonzero value, and *PFALSE is set to the other alternative.
7131
7132 If we return zero, we set *PTRUE and *PFALSE to X. */
7133
7134static rtx
7135if_then_else_cond (x, ptrue, pfalse)
7136 rtx x;
7137 rtx *ptrue, *pfalse;
7138{
7139 enum machine_mode mode = GET_MODE (x);
7140 enum rtx_code code = GET_CODE (x);
abe6e52f
RK
7141 rtx cond0, cond1, true0, true1, false0, false1;
7142 unsigned HOST_WIDE_INT nz;
7143
14a774a9
RK
7144 /* If we are comparing a value against zero, we are done. */
7145 if ((code == NE || code == EQ)
7146 && GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) == 0)
7147 {
e8758a3a
JL
7148 *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
7149 *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
14a774a9
RK
7150 return XEXP (x, 0);
7151 }
7152
abe6e52f
RK
7153 /* If this is a unary operation whose operand has one of two values, apply
7154 our opcode to compute those values. */
14a774a9
RK
7155 else if (GET_RTX_CLASS (code) == '1'
7156 && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
abe6e52f 7157 {
f1c6ba8b
RK
7158 *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
7159 *pfalse = simplify_gen_unary (code, mode, false0,
7160 GET_MODE (XEXP (x, 0)));
abe6e52f
RK
7161 return cond0;
7162 }
7163
3a19aabc 7164 /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
ddd5a7c1 7165 make can't possibly match and would suppress other optimizations. */
3a19aabc
RK
7166 else if (code == COMPARE)
7167 ;
7168
abe6e52f
RK
7169 /* If this is a binary operation, see if either side has only one of two
7170 values. If either one does or if both do and they are conditional on
7171 the same value, compute the new true and false values. */
7172 else if (GET_RTX_CLASS (code) == 'c' || GET_RTX_CLASS (code) == '2'
7173 || GET_RTX_CLASS (code) == '<')
7174 {
7175 cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
7176 cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
7177
7178 if ((cond0 != 0 || cond1 != 0)
7179 && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
7180 {
987e845a
JW
7181 /* If if_then_else_cond returned zero, then true/false are the
7182 same rtl. We must copy one of them to prevent invalid rtl
7183 sharing. */
7184 if (cond0 == 0)
7185 true0 = copy_rtx (true0);
7186 else if (cond1 == 0)
7187 true1 = copy_rtx (true1);
7188
abe6e52f
RK
7189 *ptrue = gen_binary (code, mode, true0, true1);
7190 *pfalse = gen_binary (code, mode, false0, false1);
7191 return cond0 ? cond0 : cond1;
7192 }
9210df58 7193
9210df58 7194 /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
0802d516
RK
7195 operands is zero when the other is non-zero, and vice-versa,
7196 and STORE_FLAG_VALUE is 1 or -1. */
9210df58 7197
0802d516
RK
7198 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7199 && (code == PLUS || code == IOR || code == XOR || code == MINUS
663522cb 7200 || code == UMAX)
9210df58
RK
7201 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7202 {
7203 rtx op0 = XEXP (XEXP (x, 0), 1);
7204 rtx op1 = XEXP (XEXP (x, 1), 1);
7205
7206 cond0 = XEXP (XEXP (x, 0), 0);
7207 cond1 = XEXP (XEXP (x, 1), 0);
7208
7209 if (GET_RTX_CLASS (GET_CODE (cond0)) == '<'
7210 && GET_RTX_CLASS (GET_CODE (cond1)) == '<'
9a915772 7211 && ((GET_CODE (cond0) == combine_reversed_comparison_code (cond1)
9210df58
RK
7212 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7213 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7214 || ((swap_condition (GET_CODE (cond0))
9a915772 7215 == combine_reversed_comparison_code (cond1))
9210df58
RK
7216 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7217 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7218 && ! side_effects_p (x))
7219 {
7220 *ptrue = gen_binary (MULT, mode, op0, const_true_rtx);
663522cb
KH
7221 *pfalse = gen_binary (MULT, mode,
7222 (code == MINUS
f1c6ba8b
RK
7223 ? simplify_gen_unary (NEG, mode, op1,
7224 mode)
7225 : op1),
9210df58
RK
7226 const_true_rtx);
7227 return cond0;
7228 }
7229 }
7230
7231 /* Similarly for MULT, AND and UMIN, execpt that for these the result
7232 is always zero. */
0802d516
RK
7233 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7234 && (code == MULT || code == AND || code == UMIN)
9210df58
RK
7235 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7236 {
7237 cond0 = XEXP (XEXP (x, 0), 0);
7238 cond1 = XEXP (XEXP (x, 1), 0);
7239
7240 if (GET_RTX_CLASS (GET_CODE (cond0)) == '<'
7241 && GET_RTX_CLASS (GET_CODE (cond1)) == '<'
9a915772 7242 && ((GET_CODE (cond0) == combine_reversed_comparison_code (cond1)
9210df58
RK
7243 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7244 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7245 || ((swap_condition (GET_CODE (cond0))
9a915772 7246 == combine_reversed_comparison_code (cond1))
9210df58
RK
7247 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7248 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7249 && ! side_effects_p (x))
7250 {
7251 *ptrue = *pfalse = const0_rtx;
7252 return cond0;
7253 }
7254 }
abe6e52f
RK
7255 }
7256
7257 else if (code == IF_THEN_ELSE)
7258 {
7259 /* If we have IF_THEN_ELSE already, extract the condition and
7260 canonicalize it if it is NE or EQ. */
7261 cond0 = XEXP (x, 0);
7262 *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
7263 if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
7264 return XEXP (cond0, 0);
7265 else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
7266 {
7267 *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
7268 return XEXP (cond0, 0);
7269 }
7270 else
7271 return cond0;
7272 }
7273
0631e0bf
JH
7274 /* If X is a SUBREG, we can narrow both the true and false values
7275 if the inner expression, if there is a condition. */
7276 else if (code == SUBREG
abe6e52f
RK
7277 && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
7278 &true0, &false0)))
7279 {
0631e0bf
JH
7280 *ptrue = simplify_gen_subreg (mode, true0,
7281 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7282 *pfalse = simplify_gen_subreg (mode, false0,
7283 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
abe6e52f 7284
abe6e52f
RK
7285 return cond0;
7286 }
7287
7288 /* If X is a constant, this isn't special and will cause confusions
7289 if we treat it as such. Likewise if it is equivalent to a constant. */
7290 else if (CONSTANT_P (x)
7291 || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
7292 ;
7293
1f3f36d1
RH
7294 /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
7295 will be least confusing to the rest of the compiler. */
7296 else if (mode == BImode)
7297 {
7298 *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
7299 return x;
7300 }
7301
663522cb 7302 /* If X is known to be either 0 or -1, those are the true and
abe6e52f 7303 false values when testing X. */
49219895
JH
7304 else if (x == constm1_rtx || x == const0_rtx
7305 || (mode != VOIDmode
7306 && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
abe6e52f
RK
7307 {
7308 *ptrue = constm1_rtx, *pfalse = const0_rtx;
7309 return x;
7310 }
7311
7312 /* Likewise for 0 or a single bit. */
49219895
JH
7313 else if (mode != VOIDmode
7314 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7315 && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
abe6e52f
RK
7316 {
7317 *ptrue = GEN_INT (nz), *pfalse = const0_rtx;
7318 return x;
7319 }
7320
7321 /* Otherwise fail; show no condition with true and false values the same. */
7322 *ptrue = *pfalse = x;
7323 return 0;
7324}
7325\f
1a26b032
RK
7326/* Return the value of expression X given the fact that condition COND
7327 is known to be true when applied to REG as its first operand and VAL
7328 as its second. X is known to not be shared and so can be modified in
7329 place.
7330
7331 We only handle the simplest cases, and specifically those cases that
7332 arise with IF_THEN_ELSE expressions. */
7333
7334static rtx
7335known_cond (x, cond, reg, val)
7336 rtx x;
7337 enum rtx_code cond;
7338 rtx reg, val;
7339{
7340 enum rtx_code code = GET_CODE (x);
f24ad0e4 7341 rtx temp;
6f7d635c 7342 const char *fmt;
1a26b032
RK
7343 int i, j;
7344
7345 if (side_effects_p (x))
7346 return x;
7347
69bc0a1f
JH
7348 if (cond == EQ && rtx_equal_p (x, reg) && !FLOAT_MODE_P (cond))
7349 return val;
7350 if (cond == UNEQ && rtx_equal_p (x, reg))
1a26b032
RK
7351 return val;
7352
7353 /* If X is (abs REG) and we know something about REG's relationship
7354 with zero, we may be able to simplify this. */
7355
7356 if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
7357 switch (cond)
7358 {
7359 case GE: case GT: case EQ:
7360 return XEXP (x, 0);
7361 case LT: case LE:
f1c6ba8b
RK
7362 return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
7363 XEXP (x, 0),
7364 GET_MODE (XEXP (x, 0)));
e9a25f70
JL
7365 default:
7366 break;
1a26b032
RK
7367 }
7368
7369 /* The only other cases we handle are MIN, MAX, and comparisons if the
7370 operands are the same as REG and VAL. */
7371
7372 else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == 'c')
7373 {
7374 if (rtx_equal_p (XEXP (x, 0), val))
7375 cond = swap_condition (cond), temp = val, val = reg, reg = temp;
7376
7377 if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
7378 {
7379 if (GET_RTX_CLASS (code) == '<')
1eb8759b
RH
7380 {
7381 if (comparison_dominates_p (cond, code))
7382 return const_true_rtx;
1a26b032 7383
9a915772 7384 code = combine_reversed_comparison_code (x);
1eb8759b
RH
7385 if (code != UNKNOWN
7386 && comparison_dominates_p (cond, code))
7387 return const0_rtx;
7388 else
7389 return x;
7390 }
1a26b032
RK
7391 else if (code == SMAX || code == SMIN
7392 || code == UMIN || code == UMAX)
7393 {
7394 int unsignedp = (code == UMIN || code == UMAX);
7395
ac4cdf40
JE
7396 /* Do not reverse the condition when it is NE or EQ.
7397 This is because we cannot conclude anything about
7398 the value of 'SMAX (x, y)' when x is not equal to y,
23190837 7399 but we can when x equals y. */
ac4cdf40
JE
7400 if ((code == SMAX || code == UMAX)
7401 && ! (cond == EQ || cond == NE))
1a26b032
RK
7402 cond = reverse_condition (cond);
7403
7404 switch (cond)
7405 {
7406 case GE: case GT:
7407 return unsignedp ? x : XEXP (x, 1);
7408 case LE: case LT:
7409 return unsignedp ? x : XEXP (x, 0);
7410 case GEU: case GTU:
7411 return unsignedp ? XEXP (x, 1) : x;
7412 case LEU: case LTU:
7413 return unsignedp ? XEXP (x, 0) : x;
e9a25f70
JL
7414 default:
7415 break;
1a26b032
RK
7416 }
7417 }
7418 }
7419 }
7420
7421 fmt = GET_RTX_FORMAT (code);
7422 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7423 {
7424 if (fmt[i] == 'e')
7425 SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
7426 else if (fmt[i] == 'E')
7427 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7428 SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
7429 cond, reg, val));
7430 }
7431
7432 return x;
7433}
7434\f
e11fa86f
RK
7435/* See if X and Y are equal for the purposes of seeing if we can rewrite an
7436 assignment as a field assignment. */
7437
7438static int
7439rtx_equal_for_field_assignment_p (x, y)
7440 rtx x;
7441 rtx y;
7442{
e11fa86f
RK
7443 if (x == y || rtx_equal_p (x, y))
7444 return 1;
7445
7446 if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
7447 return 0;
7448
7449 /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
7450 Note that all SUBREGs of MEM are paradoxical; otherwise they
7451 would have been rewritten. */
7452 if (GET_CODE (x) == MEM && GET_CODE (y) == SUBREG
7453 && GET_CODE (SUBREG_REG (y)) == MEM
7454 && rtx_equal_p (SUBREG_REG (y),
7455 gen_lowpart_for_combine (GET_MODE (SUBREG_REG (y)), x)))
7456 return 1;
7457
7458 if (GET_CODE (y) == MEM && GET_CODE (x) == SUBREG
7459 && GET_CODE (SUBREG_REG (x)) == MEM
7460 && rtx_equal_p (SUBREG_REG (x),
7461 gen_lowpart_for_combine (GET_MODE (SUBREG_REG (x)), y)))
7462 return 1;
7463
9ec36da5
JL
7464 /* We used to see if get_last_value of X and Y were the same but that's
7465 not correct. In one direction, we'll cause the assignment to have
7466 the wrong destination and in the case, we'll import a register into this
7467 insn that might have already have been dead. So fail if none of the
7468 above cases are true. */
7469 return 0;
e11fa86f
RK
7470}
7471\f
230d793d
RS
7472/* See if X, a SET operation, can be rewritten as a bit-field assignment.
7473 Return that assignment if so.
7474
7475 We only handle the most common cases. */
7476
7477static rtx
7478make_field_assignment (x)
7479 rtx x;
7480{
7481 rtx dest = SET_DEST (x);
7482 rtx src = SET_SRC (x);
dfbe1b2f 7483 rtx assign;
e11fa86f 7484 rtx rhs, lhs;
5f4f0e22 7485 HOST_WIDE_INT c1;
770ae6cc
RK
7486 HOST_WIDE_INT pos;
7487 unsigned HOST_WIDE_INT len;
dfbe1b2f
RK
7488 rtx other;
7489 enum machine_mode mode;
230d793d
RS
7490
7491 /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
7492 a clear of a one-bit field. We will have changed it to
7493 (and (rotate (const_int -2) POS) DEST), so check for that. Also check
7494 for a SUBREG. */
7495
7496 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
7497 && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
7498 && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
e11fa86f 7499 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
230d793d 7500 {
8999a12e 7501 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
230d793d 7502 1, 1, 1, 0);
76184def 7503 if (assign != 0)
38a448ca 7504 return gen_rtx_SET (VOIDmode, assign, const0_rtx);
76184def 7505 return x;
230d793d
RS
7506 }
7507
7508 else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
7509 && subreg_lowpart_p (XEXP (src, 0))
663522cb 7510 && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
230d793d
RS
7511 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
7512 && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
7513 && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
e11fa86f 7514 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
230d793d 7515 {
8999a12e 7516 assign = make_extraction (VOIDmode, dest, 0,
230d793d
RS
7517 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
7518 1, 1, 1, 0);
76184def 7519 if (assign != 0)
38a448ca 7520 return gen_rtx_SET (VOIDmode, assign, const0_rtx);
76184def 7521 return x;
230d793d
RS
7522 }
7523
9dd11dcb 7524 /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
230d793d
RS
7525 one-bit field. */
7526 else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
7527 && XEXP (XEXP (src, 0), 0) == const1_rtx
e11fa86f 7528 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
230d793d 7529 {
8999a12e 7530 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
230d793d 7531 1, 1, 1, 0);
76184def 7532 if (assign != 0)
38a448ca 7533 return gen_rtx_SET (VOIDmode, assign, const1_rtx);
76184def 7534 return x;
230d793d
RS
7535 }
7536
dfbe1b2f 7537 /* The other case we handle is assignments into a constant-position
9dd11dcb 7538 field. They look like (ior/xor (and DEST C1) OTHER). If C1 represents
dfbe1b2f
RK
7539 a mask that has all one bits except for a group of zero bits and
7540 OTHER is known to have zeros where C1 has ones, this is such an
7541 assignment. Compute the position and length from C1. Shift OTHER
7542 to the appropriate position, force it to the required mode, and
7543 make the extraction. Check for the AND in both operands. */
7544
9dd11dcb 7545 if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
e11fa86f
RK
7546 return x;
7547
7548 rhs = expand_compound_operation (XEXP (src, 0));
7549 lhs = expand_compound_operation (XEXP (src, 1));
7550
7551 if (GET_CODE (rhs) == AND
7552 && GET_CODE (XEXP (rhs, 1)) == CONST_INT
7553 && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
7554 c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
7555 else if (GET_CODE (lhs) == AND
7556 && GET_CODE (XEXP (lhs, 1)) == CONST_INT
7557 && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
7558 c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
dfbe1b2f
RK
7559 else
7560 return x;
230d793d 7561
663522cb 7562 pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
dfbe1b2f 7563 if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
e5e809f4
JL
7564 || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
7565 || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
dfbe1b2f 7566 return x;
230d793d 7567
5f4f0e22 7568 assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
76184def
DE
7569 if (assign == 0)
7570 return x;
230d793d 7571
dfbe1b2f
RK
7572 /* The mode to use for the source is the mode of the assignment, or of
7573 what is inside a possible STRICT_LOW_PART. */
663522cb 7574 mode = (GET_CODE (assign) == STRICT_LOW_PART
dfbe1b2f 7575 ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
230d793d 7576
dfbe1b2f
RK
7577 /* Shift OTHER right POS places and make it the source, restricting it
7578 to the proper length and mode. */
230d793d 7579
5f4f0e22
CH
7580 src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT,
7581 GET_MODE (src), other, pos),
6139ff20
RK
7582 mode,
7583 GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
0345195a 7584 ? ~(unsigned HOST_WIDE_INT) 0
729a2125 7585 : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
e3d616e3 7586 dest, 0);
230d793d 7587
f1c6ba8b 7588 return gen_rtx_SET (VOIDmode, assign, src);
230d793d
RS
7589}
7590\f
7591/* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
7592 if so. */
7593
7594static rtx
7595apply_distributive_law (x)
7596 rtx x;
7597{
7598 enum rtx_code code = GET_CODE (x);
7599 rtx lhs, rhs, other;
7600 rtx tem;
7601 enum rtx_code inner_code;
7602
d8a8a4da
RS
7603 /* Distributivity is not true for floating point.
7604 It can change the value. So don't do it.
7605 -- rms and moshier@world.std.com. */
3ad2180a 7606 if (FLOAT_MODE_P (GET_MODE (x)))
d8a8a4da
RS
7607 return x;
7608
230d793d
RS
7609 /* The outer operation can only be one of the following: */
7610 if (code != IOR && code != AND && code != XOR
7611 && code != PLUS && code != MINUS)
7612 return x;
7613
7614 lhs = XEXP (x, 0), rhs = XEXP (x, 1);
7615
0f41302f
MS
7616 /* If either operand is a primitive we can't do anything, so get out
7617 fast. */
230d793d 7618 if (GET_RTX_CLASS (GET_CODE (lhs)) == 'o'
dfbe1b2f 7619 || GET_RTX_CLASS (GET_CODE (rhs)) == 'o')
230d793d
RS
7620 return x;
7621
7622 lhs = expand_compound_operation (lhs);
7623 rhs = expand_compound_operation (rhs);
7624 inner_code = GET_CODE (lhs);
7625 if (inner_code != GET_CODE (rhs))
7626 return x;
7627
7628 /* See if the inner and outer operations distribute. */
7629 switch (inner_code)
7630 {
7631 case LSHIFTRT:
7632 case ASHIFTRT:
7633 case AND:
7634 case IOR:
7635 /* These all distribute except over PLUS. */
7636 if (code == PLUS || code == MINUS)
7637 return x;
7638 break;
7639
7640 case MULT:
7641 if (code != PLUS && code != MINUS)
7642 return x;
7643 break;
7644
7645 case ASHIFT:
45620ed4 7646 /* This is also a multiply, so it distributes over everything. */
230d793d
RS
7647 break;
7648
7649 case SUBREG:
dfbe1b2f 7650 /* Non-paradoxical SUBREGs distributes over all operations, provided
ddef6bc7 7651 the inner modes and byte offsets are the same, this is an extraction
2b4bd1bc
JW
7652 of a low-order part, we don't convert an fp operation to int or
7653 vice versa, and we would not be converting a single-word
dfbe1b2f 7654 operation into a multi-word operation. The latter test is not
2b4bd1bc 7655 required, but it prevents generating unneeded multi-word operations.
dfbe1b2f
RK
7656 Some of the previous tests are redundant given the latter test, but
7657 are retained because they are required for correctness.
7658
7659 We produce the result slightly differently in this case. */
7660
7661 if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
ddef6bc7 7662 || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
dfbe1b2f 7663 || ! subreg_lowpart_p (lhs)
2b4bd1bc
JW
7664 || (GET_MODE_CLASS (GET_MODE (lhs))
7665 != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
dfbe1b2f 7666 || (GET_MODE_SIZE (GET_MODE (lhs))
8af24e26 7667 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
dfbe1b2f 7668 || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
230d793d
RS
7669 return x;
7670
7671 tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
7672 SUBREG_REG (lhs), SUBREG_REG (rhs));
7673 return gen_lowpart_for_combine (GET_MODE (x), tem);
7674
7675 default:
7676 return x;
7677 }
7678
7679 /* Set LHS and RHS to the inner operands (A and B in the example
7680 above) and set OTHER to the common operand (C in the example).
7681 These is only one way to do this unless the inner operation is
7682 commutative. */
7683 if (GET_RTX_CLASS (inner_code) == 'c'
7684 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
7685 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
7686 else if (GET_RTX_CLASS (inner_code) == 'c'
7687 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
7688 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
7689 else if (GET_RTX_CLASS (inner_code) == 'c'
7690 && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
7691 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
7692 else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
7693 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
7694 else
7695 return x;
7696
7697 /* Form the new inner operation, seeing if it simplifies first. */
7698 tem = gen_binary (code, GET_MODE (x), lhs, rhs);
7699
7700 /* There is one exception to the general way of distributing:
7701 (a ^ b) | (a ^ c) -> (~a) & (b ^ c) */
7702 if (code == XOR && inner_code == IOR)
7703 {
7704 inner_code = AND;
f1c6ba8b 7705 other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
230d793d
RS
7706 }
7707
7708 /* We may be able to continuing distributing the result, so call
7709 ourselves recursively on the inner operation before forming the
7710 outer operation, which we return. */
7711 return gen_binary (inner_code, GET_MODE (x),
7712 apply_distributive_law (tem), other);
7713}
7714\f
7715/* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
7716 in MODE.
7717
7718 Return an equivalent form, if different from X. Otherwise, return X. If
7719 X is zero, we are to always construct the equivalent form. */
7720
7721static rtx
7722simplify_and_const_int (x, mode, varop, constop)
7723 rtx x;
7724 enum machine_mode mode;
7725 rtx varop;
5f4f0e22 7726 unsigned HOST_WIDE_INT constop;
230d793d 7727{
951553af 7728 unsigned HOST_WIDE_INT nonzero;
42301240 7729 int i;
230d793d 7730
6139ff20
RK
7731 /* Simplify VAROP knowing that we will be only looking at some of the
7732 bits in it. */
e3d616e3 7733 varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
230d793d 7734
6139ff20
RK
7735 /* If VAROP is a CLOBBER, we will fail so return it; if it is a
7736 CONST_INT, we are done. */
7737 if (GET_CODE (varop) == CLOBBER || GET_CODE (varop) == CONST_INT)
7738 return varop;
230d793d 7739
fc06d7aa
RK
7740 /* See what bits may be nonzero in VAROP. Unlike the general case of
7741 a call to nonzero_bits, here we don't care about bits outside
7742 MODE. */
7743
7744 nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
7e4ce834 7745 nonzero = trunc_int_for_mode (nonzero, mode);
9fa6d012 7746
230d793d 7747 /* Turn off all bits in the constant that are known to already be zero.
951553af 7748 Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
230d793d
RS
7749 which is tested below. */
7750
951553af 7751 constop &= nonzero;
230d793d
RS
7752
7753 /* If we don't have any bits left, return zero. */
7754 if (constop == 0)
7755 return const0_rtx;
7756
42301240
RK
7757 /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
7758 a power of two, we can replace this with a ASHIFT. */
7759 if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
7760 && (i = exact_log2 (constop)) >= 0)
7761 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
663522cb 7762
6139ff20
RK
7763 /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
7764 or XOR, then try to apply the distributive law. This may eliminate
7765 operations if either branch can be simplified because of the AND.
7766 It may also make some cases more complex, but those cases probably
7767 won't match a pattern either with or without this. */
7768
7769 if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
7770 return
7771 gen_lowpart_for_combine
7772 (mode,
7773 apply_distributive_law
7774 (gen_binary (GET_CODE (varop), GET_MODE (varop),
7775 simplify_and_const_int (NULL_RTX, GET_MODE (varop),
7776 XEXP (varop, 0), constop),
7777 simplify_and_const_int (NULL_RTX, GET_MODE (varop),
7778 XEXP (varop, 1), constop))));
7779
230d793d
RS
7780 /* Get VAROP in MODE. Try to get a SUBREG if not. Don't make a new SUBREG
7781 if we already had one (just check for the simplest cases). */
7782 if (x && GET_CODE (XEXP (x, 0)) == SUBREG
7783 && GET_MODE (XEXP (x, 0)) == mode
7784 && SUBREG_REG (XEXP (x, 0)) == varop)
7785 varop = XEXP (x, 0);
7786 else
7787 varop = gen_lowpart_for_combine (mode, varop);
7788
0f41302f 7789 /* If we can't make the SUBREG, try to return what we were given. */
230d793d
RS
7790 if (GET_CODE (varop) == CLOBBER)
7791 return x ? x : varop;
7792
7793 /* If we are only masking insignificant bits, return VAROP. */
951553af 7794 if (constop == nonzero)
230d793d
RS
7795 x = varop;
7796
7797 /* Otherwise, return an AND. See how much, if any, of X we can use. */
7798 else if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
6139ff20 7799 x = gen_binary (AND, mode, varop, GEN_INT (constop));
230d793d
RS
7800
7801 else
7802 {
7803 if (GET_CODE (XEXP (x, 1)) != CONST_INT
e51712db 7804 || (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) != constop)
5f4f0e22 7805 SUBST (XEXP (x, 1), GEN_INT (constop));
230d793d
RS
7806
7807 SUBST (XEXP (x, 0), varop);
7808 }
7809
7810 return x;
7811}
7812\f
b3728b0e
JW
7813/* We let num_sign_bit_copies recur into nonzero_bits as that is useful.
7814 We don't let nonzero_bits recur into num_sign_bit_copies, because that
7815 is less useful. We can't allow both, because that results in exponential
956d6950 7816 run time recursion. There is a nullstone testcase that triggered
b3728b0e
JW
7817 this. This macro avoids accidental uses of num_sign_bit_copies. */
7818#define num_sign_bit_copies()
7819
230d793d
RS
7820/* Given an expression, X, compute which bits in X can be non-zero.
7821 We don't care about bits outside of those defined in MODE.
7822
7823 For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
7824 a shift, AND, or zero_extract, we can do better. */
7825
5f4f0e22 7826static unsigned HOST_WIDE_INT
951553af 7827nonzero_bits (x, mode)
230d793d
RS
7828 rtx x;
7829 enum machine_mode mode;
7830{
951553af
RK
7831 unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode);
7832 unsigned HOST_WIDE_INT inner_nz;
230d793d 7833 enum rtx_code code;
770ae6cc 7834 unsigned int mode_width = GET_MODE_BITSIZE (mode);
230d793d
RS
7835 rtx tem;
7836
1c75dfa4
RK
7837 /* For floating-point values, assume all bits are needed. */
7838 if (FLOAT_MODE_P (GET_MODE (x)) || FLOAT_MODE_P (mode))
7839 return nonzero;
7840
230d793d
RS
7841 /* If X is wider than MODE, use its mode instead. */
7842 if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width)
7843 {
7844 mode = GET_MODE (x);
951553af 7845 nonzero = GET_MODE_MASK (mode);
230d793d
RS
7846 mode_width = GET_MODE_BITSIZE (mode);
7847 }
7848
5f4f0e22 7849 if (mode_width > HOST_BITS_PER_WIDE_INT)
230d793d
RS
7850 /* Our only callers in this case look for single bit values. So
7851 just return the mode mask. Those tests will then be false. */
951553af 7852 return nonzero;
230d793d 7853
8baf60bb 7854#ifndef WORD_REGISTER_OPERATIONS
c6965c0f 7855 /* If MODE is wider than X, but both are a single word for both the host
663522cb 7856 and target machines, we can compute this from which bits of the
0840fd91
RK
7857 object might be nonzero in its own mode, taking into account the fact
7858 that on many CISC machines, accessing an object in a wider mode
7859 causes the high-order bits to become undefined. So they are
7860 not known to be zero. */
7861
7862 if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode
7863 && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD
7864 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
c6965c0f 7865 && GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (GET_MODE (x)))
0840fd91
RK
7866 {
7867 nonzero &= nonzero_bits (x, GET_MODE (x));
663522cb 7868 nonzero |= GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x));
0840fd91
RK
7869 return nonzero;
7870 }
7871#endif
7872
230d793d
RS
7873 code = GET_CODE (x);
7874 switch (code)
7875 {
7876 case REG:
6dd12198 7877#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
320dd7a7
RK
7878 /* If pointers extend unsigned and this is a pointer in Pmode, say that
7879 all the bits above ptr_mode are known to be zero. */
7880 if (POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
3502dc9c 7881 && REG_POINTER (x))
320dd7a7
RK
7882 nonzero &= GET_MODE_MASK (ptr_mode);
7883#endif
7884
b0d71df9
RK
7885#ifdef STACK_BOUNDARY
7886 /* If this is the stack pointer, we may know something about its
7887 alignment. If PUSH_ROUNDING is defined, it is possible for the
230d793d
RS
7888 stack to be momentarily aligned only to that amount, so we pick
7889 the least alignment. */
7890
ee49a9c7
JW
7891 /* We can't check for arg_pointer_rtx here, because it is not
7892 guaranteed to have as much alignment as the stack pointer.
7893 In particular, in the Irix6 n64 ABI, the stack has 128 bit
7894 alignment but the argument pointer has only 64 bit alignment. */
7895
0e9ff885
DM
7896 if ((x == frame_pointer_rtx
7897 || x == stack_pointer_rtx
7898 || x == hard_frame_pointer_rtx
7899 || (REGNO (x) >= FIRST_VIRTUAL_REGISTER
7900 && REGNO (x) <= LAST_VIRTUAL_REGISTER))
7901#ifdef STACK_BIAS
7902 && !STACK_BIAS
663522cb 7903#endif
0e9ff885 7904 )
230d793d 7905 {
b0d71df9 7906 int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
230d793d
RS
7907
7908#ifdef PUSH_ROUNDING
f73ad30e 7909 if (REGNO (x) == STACK_POINTER_REGNUM && PUSH_ARGS)
b0d71df9 7910 sp_alignment = MIN (PUSH_ROUNDING (1), sp_alignment);
230d793d
RS
7911#endif
7912
320dd7a7
RK
7913 /* We must return here, otherwise we may get a worse result from
7914 one of the choices below. There is nothing useful below as
7915 far as the stack pointer is concerned. */
663522cb 7916 return nonzero &= ~(sp_alignment - 1);
230d793d 7917 }
b0d71df9 7918#endif
230d793d 7919
55310dad
RK
7920 /* If X is a register whose nonzero bits value is current, use it.
7921 Otherwise, if X is a register whose value we can find, use that
7922 value. Otherwise, use the previously-computed global nonzero bits
7923 for this register. */
7924
7925 if (reg_last_set_value[REGNO (x)] != 0
7926 && reg_last_set_mode[REGNO (x)] == mode
57cf50a4
GRK
7927 && (reg_last_set_label[REGNO (x)] == label_tick
7928 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
7929 && REG_N_SETS (REGNO (x)) == 1
663522cb 7930 && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start,
57cf50a4 7931 REGNO (x))))
55310dad
RK
7932 && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
7933 return reg_last_set_nonzero_bits[REGNO (x)];
230d793d
RS
7934
7935 tem = get_last_value (x);
9afa3d54 7936
230d793d 7937 if (tem)
9afa3d54
RK
7938 {
7939#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
7940 /* If X is narrower than MODE and TEM is a non-negative
7941 constant that would appear negative in the mode of X,
7942 sign-extend it for use in reg_nonzero_bits because some
7943 machines (maybe most) will actually do the sign-extension
663522cb 7944 and this is the conservative approach.
9afa3d54
RK
7945
7946 ??? For 2.5, try to tighten up the MD files in this regard
7947 instead of this kludge. */
7948
7949 if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width
7950 && GET_CODE (tem) == CONST_INT
7951 && INTVAL (tem) > 0
7952 && 0 != (INTVAL (tem)
7953 & ((HOST_WIDE_INT) 1
9e69be8c 7954 << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
9afa3d54
RK
7955 tem = GEN_INT (INTVAL (tem)
7956 | ((HOST_WIDE_INT) (-1)
7957 << GET_MODE_BITSIZE (GET_MODE (x))));
7958#endif
7959 return nonzero_bits (tem, mode);
7960 }
951553af
RK
7961 else if (nonzero_sign_valid && reg_nonzero_bits[REGNO (x)])
7962 return reg_nonzero_bits[REGNO (x)] & nonzero;
230d793d 7963 else
951553af 7964 return nonzero;
230d793d
RS
7965
7966 case CONST_INT:
9afa3d54
RK
7967#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
7968 /* If X is negative in MODE, sign-extend the value. */
9e69be8c
RK
7969 if (INTVAL (x) > 0 && mode_width < BITS_PER_WORD
7970 && 0 != (INTVAL (x) & ((HOST_WIDE_INT) 1 << (mode_width - 1))))
7971 return (INTVAL (x) | ((HOST_WIDE_INT) (-1) << mode_width));
9afa3d54
RK
7972#endif
7973
230d793d
RS
7974 return INTVAL (x);
7975
230d793d 7976 case MEM:
8baf60bb 7977#ifdef LOAD_EXTEND_OP
230d793d
RS
7978 /* In many, if not most, RISC machines, reading a byte from memory
7979 zeros the rest of the register. Noticing that fact saves a lot
7980 of extra zero-extends. */
8baf60bb
RK
7981 if (LOAD_EXTEND_OP (GET_MODE (x)) == ZERO_EXTEND)
7982 nonzero &= GET_MODE_MASK (GET_MODE (x));
230d793d 7983#endif
8baf60bb 7984 break;
230d793d 7985
230d793d 7986 case EQ: case NE:
69bc0a1f
JH
7987 case UNEQ: case LTGT:
7988 case GT: case GTU: case UNGT:
7989 case LT: case LTU: case UNLT:
7990 case GE: case GEU: case UNGE:
7991 case LE: case LEU: case UNLE:
7992 case UNORDERED: case ORDERED:
3f508eca 7993
c6965c0f
RK
7994 /* If this produces an integer result, we know which bits are set.
7995 Code here used to clear bits outside the mode of X, but that is
7996 now done above. */
230d793d 7997
c6965c0f
RK
7998 if (GET_MODE_CLASS (mode) == MODE_INT
7999 && mode_width <= HOST_BITS_PER_WIDE_INT)
8000 nonzero = STORE_FLAG_VALUE;
230d793d 8001 break;
230d793d 8002
230d793d 8003 case NEG:
b3728b0e
JW
8004#if 0
8005 /* Disabled to avoid exponential mutual recursion between nonzero_bits
8006 and num_sign_bit_copies. */
d0ab8cd3
RK
8007 if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
8008 == GET_MODE_BITSIZE (GET_MODE (x)))
951553af 8009 nonzero = 1;
b3728b0e 8010#endif
230d793d
RS
8011
8012 if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
663522cb 8013 nonzero |= (GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x)));
230d793d 8014 break;
d0ab8cd3
RK
8015
8016 case ABS:
b3728b0e
JW
8017#if 0
8018 /* Disabled to avoid exponential mutual recursion between nonzero_bits
8019 and num_sign_bit_copies. */
d0ab8cd3
RK
8020 if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
8021 == GET_MODE_BITSIZE (GET_MODE (x)))
951553af 8022 nonzero = 1;
b3728b0e 8023#endif
d0ab8cd3 8024 break;
230d793d
RS
8025
8026 case TRUNCATE:
951553af 8027 nonzero &= (nonzero_bits (XEXP (x, 0), mode) & GET_MODE_MASK (mode));
230d793d
RS
8028 break;
8029
8030 case ZERO_EXTEND:
951553af 8031 nonzero &= nonzero_bits (XEXP (x, 0), mode);
230d793d 8032 if (GET_MODE (XEXP (x, 0)) != VOIDmode)
951553af 8033 nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
230d793d
RS
8034 break;
8035
8036 case SIGN_EXTEND:
8037 /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
8038 Otherwise, show all the bits in the outer mode but not the inner
8039 may be non-zero. */
951553af 8040 inner_nz = nonzero_bits (XEXP (x, 0), mode);
230d793d
RS
8041 if (GET_MODE (XEXP (x, 0)) != VOIDmode)
8042 {
951553af 8043 inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
e3da301d
MS
8044 if (inner_nz
8045 & (((HOST_WIDE_INT) 1
8046 << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))))
951553af 8047 inner_nz |= (GET_MODE_MASK (mode)
663522cb 8048 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0))));
230d793d
RS
8049 }
8050
951553af 8051 nonzero &= inner_nz;
230d793d
RS
8052 break;
8053
8054 case AND:
951553af
RK
8055 nonzero &= (nonzero_bits (XEXP (x, 0), mode)
8056 & nonzero_bits (XEXP (x, 1), mode));
230d793d
RS
8057 break;
8058
d0ab8cd3
RK
8059 case XOR: case IOR:
8060 case UMIN: case UMAX: case SMIN: case SMAX:
951553af
RK
8061 nonzero &= (nonzero_bits (XEXP (x, 0), mode)
8062 | nonzero_bits (XEXP (x, 1), mode));
230d793d
RS
8063 break;
8064
8065 case PLUS: case MINUS:
8066 case MULT:
8067 case DIV: case UDIV:
8068 case MOD: case UMOD:
8069 /* We can apply the rules of arithmetic to compute the number of
8070 high- and low-order zero bits of these operations. We start by
8071 computing the width (position of the highest-order non-zero bit)
8072 and the number of low-order zero bits for each value. */
8073 {
951553af
RK
8074 unsigned HOST_WIDE_INT nz0 = nonzero_bits (XEXP (x, 0), mode);
8075 unsigned HOST_WIDE_INT nz1 = nonzero_bits (XEXP (x, 1), mode);
8076 int width0 = floor_log2 (nz0) + 1;
8077 int width1 = floor_log2 (nz1) + 1;
8078 int low0 = floor_log2 (nz0 & -nz0);
8079 int low1 = floor_log2 (nz1 & -nz1);
318b149c
RK
8080 HOST_WIDE_INT op0_maybe_minusp
8081 = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1)));
8082 HOST_WIDE_INT op1_maybe_minusp
8083 = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1)));
770ae6cc 8084 unsigned int result_width = mode_width;
230d793d
RS
8085 int result_low = 0;
8086
8087 switch (code)
8088 {
8089 case PLUS:
0e9ff885
DM
8090#ifdef STACK_BIAS
8091 if (STACK_BIAS
663522cb
KH
8092 && (XEXP (x, 0) == stack_pointer_rtx
8093 || XEXP (x, 0) == frame_pointer_rtx)
8094 && GET_CODE (XEXP (x, 1)) == CONST_INT)
0e9ff885
DM
8095 {
8096 int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
8097
663522cb
KH
8098 nz0 = (GET_MODE_MASK (mode) & ~(sp_alignment - 1));
8099 nz1 = INTVAL (XEXP (x, 1)) - STACK_BIAS;
8100 width0 = floor_log2 (nz0) + 1;
8101 width1 = floor_log2 (nz1) + 1;
8102 low0 = floor_log2 (nz0 & -nz0);
8103 low1 = floor_log2 (nz1 & -nz1);
0e9ff885 8104 }
663522cb 8105#endif
230d793d
RS
8106 result_width = MAX (width0, width1) + 1;
8107 result_low = MIN (low0, low1);
8108 break;
8109 case MINUS:
8110 result_low = MIN (low0, low1);
8111 break;
8112 case MULT:
8113 result_width = width0 + width1;
8114 result_low = low0 + low1;
8115 break;
8116 case DIV:
2a8bb5cf
AH
8117 if (width1 == 0)
8118 break;
230d793d
RS
8119 if (! op0_maybe_minusp && ! op1_maybe_minusp)
8120 result_width = width0;
8121 break;
8122 case UDIV:
2a8bb5cf
AH
8123 if (width1 == 0)
8124 break;
230d793d
RS
8125 result_width = width0;
8126 break;
8127 case MOD:
2a8bb5cf
AH
8128 if (width1 == 0)
8129 break;
230d793d
RS
8130 if (! op0_maybe_minusp && ! op1_maybe_minusp)
8131 result_width = MIN (width0, width1);
8132 result_low = MIN (low0, low1);
8133 break;
8134 case UMOD:
2a8bb5cf
AH
8135 if (width1 == 0)
8136 break;
230d793d
RS
8137 result_width = MIN (width0, width1);
8138 result_low = MIN (low0, low1);
8139 break;
e9a25f70
JL
8140 default:
8141 abort ();
230d793d
RS
8142 }
8143
8144 if (result_width < mode_width)
951553af 8145 nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1;
230d793d
RS
8146
8147 if (result_low > 0)
663522cb 8148 nonzero &= ~(((HOST_WIDE_INT) 1 << result_low) - 1);
d1405722
RK
8149
8150#ifdef POINTERS_EXTEND_UNSIGNED
8151 /* If pointers extend unsigned and this is an addition or subtraction
8152 to a pointer in Pmode, all the bits above ptr_mode are known to be
8153 zero. */
6dd12198 8154 if (POINTERS_EXTEND_UNSIGNED > 0 && GET_MODE (x) == Pmode
d1405722
RK
8155 && (code == PLUS || code == MINUS)
8156 && GET_CODE (XEXP (x, 0)) == REG && REG_POINTER (XEXP (x, 0)))
8157 nonzero &= GET_MODE_MASK (ptr_mode);
8158#endif
230d793d
RS
8159 }
8160 break;
8161
8162 case ZERO_EXTRACT:
8163 if (GET_CODE (XEXP (x, 1)) == CONST_INT
5f4f0e22 8164 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
951553af 8165 nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1;
230d793d
RS
8166 break;
8167
8168 case SUBREG:
c3c2cb37
RK
8169 /* If this is a SUBREG formed for a promoted variable that has
8170 been zero-extended, we know that at least the high-order bits
8171 are zero, though others might be too. */
8172
8173 if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x))
951553af
RK
8174 nonzero = (GET_MODE_MASK (GET_MODE (x))
8175 & nonzero_bits (SUBREG_REG (x), GET_MODE (x)));
c3c2cb37 8176
230d793d
RS
8177 /* If the inner mode is a single word for both the host and target
8178 machines, we can compute this from which bits of the inner
951553af 8179 object might be nonzero. */
230d793d 8180 if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD
5f4f0e22
CH
8181 && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
8182 <= HOST_BITS_PER_WIDE_INT))
230d793d 8183 {
951553af 8184 nonzero &= nonzero_bits (SUBREG_REG (x), mode);
8baf60bb 8185
b52ce03d
R
8186#if defined (WORD_REGISTER_OPERATIONS) && defined (LOAD_EXTEND_OP)
8187 /* If this is a typical RISC machine, we only have to worry
8188 about the way loads are extended. */
8189 if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
729a2125
RK
8190 ? (((nonzero
8191 & (((unsigned HOST_WIDE_INT) 1
8192 << (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) - 1))))
8193 != 0))
b52ce03d 8194 : LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) != ZERO_EXTEND)
230d793d 8195#endif
b52ce03d
R
8196 {
8197 /* On many CISC machines, accessing an object in a wider mode
8198 causes the high-order bits to become undefined. So they are
8199 not known to be zero. */
8200 if (GET_MODE_SIZE (GET_MODE (x))
8201 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8202 nonzero |= (GET_MODE_MASK (GET_MODE (x))
663522cb 8203 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x))));
b52ce03d 8204 }
230d793d
RS
8205 }
8206 break;
8207
8208 case ASHIFTRT:
8209 case LSHIFTRT:
8210 case ASHIFT:
230d793d 8211 case ROTATE:
951553af 8212 /* The nonzero bits are in two classes: any bits within MODE
230d793d 8213 that aren't in GET_MODE (x) are always significant. The rest of the
951553af 8214 nonzero bits are those that are significant in the operand of
230d793d
RS
8215 the shift when shifted the appropriate number of bits. This
8216 shows that high-order bits are cleared by the right shift and
8217 low-order bits by left shifts. */
8218 if (GET_CODE (XEXP (x, 1)) == CONST_INT
8219 && INTVAL (XEXP (x, 1)) >= 0
5f4f0e22 8220 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
230d793d
RS
8221 {
8222 enum machine_mode inner_mode = GET_MODE (x);
770ae6cc 8223 unsigned int width = GET_MODE_BITSIZE (inner_mode);
230d793d 8224 int count = INTVAL (XEXP (x, 1));
5f4f0e22 8225 unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode);
951553af
RK
8226 unsigned HOST_WIDE_INT op_nonzero = nonzero_bits (XEXP (x, 0), mode);
8227 unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask;
5f4f0e22 8228 unsigned HOST_WIDE_INT outer = 0;
230d793d
RS
8229
8230 if (mode_width > width)
663522cb 8231 outer = (op_nonzero & nonzero & ~mode_mask);
230d793d
RS
8232
8233 if (code == LSHIFTRT)
8234 inner >>= count;
8235 else if (code == ASHIFTRT)
8236 {
8237 inner >>= count;
8238
951553af 8239 /* If the sign bit may have been nonzero before the shift, we
230d793d 8240 need to mark all the places it could have been copied to
951553af 8241 by the shift as possibly nonzero. */
5f4f0e22
CH
8242 if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count)))
8243 inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count);
230d793d 8244 }
45620ed4 8245 else if (code == ASHIFT)
230d793d
RS
8246 inner <<= count;
8247 else
8248 inner = ((inner << (count % width)
8249 | (inner >> (width - (count % width)))) & mode_mask);
8250
951553af 8251 nonzero &= (outer | inner);
230d793d
RS
8252 }
8253 break;
8254
8255 case FFS:
8256 /* This is at most the number of bits in the mode. */
951553af 8257 nonzero = ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width) + 1)) - 1;
230d793d 8258 break;
d0ab8cd3
RK
8259
8260 case IF_THEN_ELSE:
951553af
RK
8261 nonzero &= (nonzero_bits (XEXP (x, 1), mode)
8262 | nonzero_bits (XEXP (x, 2), mode));
d0ab8cd3 8263 break;
663522cb 8264
e9a25f70
JL
8265 default:
8266 break;
230d793d
RS
8267 }
8268
951553af 8269 return nonzero;
230d793d 8270}
b3728b0e
JW
8271
8272/* See the macro definition above. */
8273#undef num_sign_bit_copies
230d793d 8274\f
d0ab8cd3 8275/* Return the number of bits at the high-order end of X that are known to
5109d49f
RK
8276 be equal to the sign bit. X will be used in mode MODE; if MODE is
8277 VOIDmode, X will be used in its own mode. The returned value will always
8278 be between 1 and the number of bits in MODE. */
d0ab8cd3 8279
770ae6cc 8280static unsigned int
d0ab8cd3
RK
8281num_sign_bit_copies (x, mode)
8282 rtx x;
8283 enum machine_mode mode;
8284{
8285 enum rtx_code code = GET_CODE (x);
770ae6cc 8286 unsigned int bitwidth;
d0ab8cd3 8287 int num0, num1, result;
951553af 8288 unsigned HOST_WIDE_INT nonzero;
d0ab8cd3
RK
8289 rtx tem;
8290
8291 /* If we weren't given a mode, use the mode of X. If the mode is still
1c75dfa4
RK
8292 VOIDmode, we don't know anything. Likewise if one of the modes is
8293 floating-point. */
d0ab8cd3
RK
8294
8295 if (mode == VOIDmode)
8296 mode = GET_MODE (x);
8297
1c75dfa4 8298 if (mode == VOIDmode || FLOAT_MODE_P (mode) || FLOAT_MODE_P (GET_MODE (x)))
6752e8d2 8299 return 1;
d0ab8cd3
RK
8300
8301 bitwidth = GET_MODE_BITSIZE (mode);
8302
0f41302f 8303 /* For a smaller object, just ignore the high bits. */
312def2e 8304 if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x)))
770ae6cc
RK
8305 {
8306 num0 = num_sign_bit_copies (x, GET_MODE (x));
8307 return MAX (1,
8308 num0 - (int) (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth));
8309 }
663522cb 8310
e9a25f70
JL
8311 if (GET_MODE (x) != VOIDmode && bitwidth > GET_MODE_BITSIZE (GET_MODE (x)))
8312 {
0c314d1a
RK
8313#ifndef WORD_REGISTER_OPERATIONS
8314 /* If this machine does not do all register operations on the entire
8315 register and MODE is wider than the mode of X, we can say nothing
8316 at all about the high-order bits. */
e9a25f70
JL
8317 return 1;
8318#else
8319 /* Likewise on machines that do, if the mode of the object is smaller
8320 than a word and loads of that size don't sign extend, we can say
8321 nothing about the high order bits. */
8322 if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
8323#ifdef LOAD_EXTEND_OP
8324 && LOAD_EXTEND_OP (GET_MODE (x)) != SIGN_EXTEND
8325#endif
8326 )
8327 return 1;
0c314d1a 8328#endif
e9a25f70 8329 }
0c314d1a 8330
d0ab8cd3
RK
8331 switch (code)
8332 {
8333 case REG:
55310dad 8334
6dd12198 8335#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
ff0dbdd1
RK
8336 /* If pointers extend signed and this is a pointer in Pmode, say that
8337 all the bits above ptr_mode are known to be sign bit copies. */
8338 if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode && mode == Pmode
3502dc9c 8339 && REG_POINTER (x))
ff0dbdd1
RK
8340 return GET_MODE_BITSIZE (Pmode) - GET_MODE_BITSIZE (ptr_mode) + 1;
8341#endif
8342
55310dad
RK
8343 if (reg_last_set_value[REGNO (x)] != 0
8344 && reg_last_set_mode[REGNO (x)] == mode
57cf50a4
GRK
8345 && (reg_last_set_label[REGNO (x)] == label_tick
8346 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8347 && REG_N_SETS (REGNO (x)) == 1
8348 && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start,
8349 REGNO (x))))
55310dad
RK
8350 && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
8351 return reg_last_set_sign_bit_copies[REGNO (x)];
d0ab8cd3 8352
663522cb 8353 tem = get_last_value (x);
d0ab8cd3
RK
8354 if (tem != 0)
8355 return num_sign_bit_copies (tem, mode);
55310dad
RK
8356
8357 if (nonzero_sign_valid && reg_sign_bit_copies[REGNO (x)] != 0)
8358 return reg_sign_bit_copies[REGNO (x)];
d0ab8cd3
RK
8359 break;
8360
457816e2 8361 case MEM:
8baf60bb 8362#ifdef LOAD_EXTEND_OP
457816e2 8363 /* Some RISC machines sign-extend all loads of smaller than a word. */
8baf60bb 8364 if (LOAD_EXTEND_OP (GET_MODE (x)) == SIGN_EXTEND)
770ae6cc
RK
8365 return MAX (1, ((int) bitwidth
8366 - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1));
457816e2 8367#endif
8baf60bb 8368 break;
457816e2 8369
d0ab8cd3
RK
8370 case CONST_INT:
8371 /* If the constant is negative, take its 1's complement and remask.
8372 Then see how many zero bits we have. */
951553af 8373 nonzero = INTVAL (x) & GET_MODE_MASK (mode);
ac49a949 8374 if (bitwidth <= HOST_BITS_PER_WIDE_INT
951553af 8375 && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
663522cb 8376 nonzero = (~nonzero) & GET_MODE_MASK (mode);
d0ab8cd3 8377
951553af 8378 return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
d0ab8cd3
RK
8379
8380 case SUBREG:
c3c2cb37
RK
8381 /* If this is a SUBREG for a promoted object that is sign-extended
8382 and we are looking at it in a wider mode, we know that at least the
8383 high-order bits are known to be sign bit copies. */
8384
8385 if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x))
770ae6cc
RK
8386 {
8387 num0 = num_sign_bit_copies (SUBREG_REG (x), mode);
8388 return MAX ((int) bitwidth
8389 - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1,
8390 num0);
8391 }
663522cb 8392
0f41302f 8393 /* For a smaller object, just ignore the high bits. */
d0ab8cd3
RK
8394 if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))))
8395 {
8396 num0 = num_sign_bit_copies (SUBREG_REG (x), VOIDmode);
8397 return MAX (1, (num0
770ae6cc
RK
8398 - (int) (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
8399 - bitwidth)));
d0ab8cd3 8400 }
457816e2 8401
8baf60bb 8402#ifdef WORD_REGISTER_OPERATIONS
2aec5b7a 8403#ifdef LOAD_EXTEND_OP
8baf60bb
RK
8404 /* For paradoxical SUBREGs on machines where all register operations
8405 affect the entire register, just look inside. Note that we are
8406 passing MODE to the recursive call, so the number of sign bit copies
8407 will remain relative to that mode, not the inner mode. */
457816e2 8408
2aec5b7a
JW
8409 /* This works only if loads sign extend. Otherwise, if we get a
8410 reload for the inner part, it may be loaded from the stack, and
8411 then we lose all sign bit copies that existed before the store
8412 to the stack. */
8413
8414 if ((GET_MODE_SIZE (GET_MODE (x))
8415 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8416 && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND)
457816e2 8417 return num_sign_bit_copies (SUBREG_REG (x), mode);
2aec5b7a 8418#endif
457816e2 8419#endif
d0ab8cd3
RK
8420 break;
8421
8422 case SIGN_EXTRACT:
8423 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
770ae6cc 8424 return MAX (1, (int) bitwidth - INTVAL (XEXP (x, 1)));
d0ab8cd3
RK
8425 break;
8426
663522cb 8427 case SIGN_EXTEND:
d0ab8cd3
RK
8428 return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
8429 + num_sign_bit_copies (XEXP (x, 0), VOIDmode));
8430
8431 case TRUNCATE:
0f41302f 8432 /* For a smaller object, just ignore the high bits. */
d0ab8cd3 8433 num0 = num_sign_bit_copies (XEXP (x, 0), VOIDmode);
770ae6cc
RK
8434 return MAX (1, (num0 - (int) (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
8435 - bitwidth)));
d0ab8cd3
RK
8436
8437 case NOT:
8438 return num_sign_bit_copies (XEXP (x, 0), mode);
8439
8440 case ROTATE: case ROTATERT:
8441 /* If we are rotating left by a number of bits less than the number
8442 of sign bit copies, we can just subtract that amount from the
8443 number. */
8444 if (GET_CODE (XEXP (x, 1)) == CONST_INT
ae0ed63a
JM
8445 && INTVAL (XEXP (x, 1)) >= 0
8446 && INTVAL (XEXP (x, 1)) < (int) bitwidth)
d0ab8cd3
RK
8447 {
8448 num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8449 return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1))
770ae6cc 8450 : (int) bitwidth - INTVAL (XEXP (x, 1))));
d0ab8cd3
RK
8451 }
8452 break;
8453
8454 case NEG:
8455 /* In general, this subtracts one sign bit copy. But if the value
8456 is known to be positive, the number of sign bit copies is the
951553af
RK
8457 same as that of the input. Finally, if the input has just one bit
8458 that might be nonzero, all the bits are copies of the sign bit. */
70186b34
BS
8459 num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8460 if (bitwidth > HOST_BITS_PER_WIDE_INT)
8461 return num0 > 1 ? num0 - 1 : 1;
8462
951553af
RK
8463 nonzero = nonzero_bits (XEXP (x, 0), mode);
8464 if (nonzero == 1)
d0ab8cd3
RK
8465 return bitwidth;
8466
d0ab8cd3 8467 if (num0 > 1
951553af 8468 && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero))
d0ab8cd3
RK
8469 num0--;
8470
8471 return num0;
8472
8473 case IOR: case AND: case XOR:
8474 case SMIN: case SMAX: case UMIN: case UMAX:
8475 /* Logical operations will preserve the number of sign-bit copies.
8476 MIN and MAX operations always return one of the operands. */
8477 num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8478 num1 = num_sign_bit_copies (XEXP (x, 1), mode);
8479 return MIN (num0, num1);
8480
8481 case PLUS: case MINUS:
8482 /* For addition and subtraction, we can have a 1-bit carry. However,
8483 if we are subtracting 1 from a positive number, there will not
8484 be such a carry. Furthermore, if the positive number is known to
8485 be 0 or 1, we know the result is either -1 or 0. */
8486
3e3ea975 8487 if (code == PLUS && XEXP (x, 1) == constm1_rtx
9295e6af 8488 && bitwidth <= HOST_BITS_PER_WIDE_INT)
d0ab8cd3 8489 {
951553af
RK
8490 nonzero = nonzero_bits (XEXP (x, 0), mode);
8491 if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0)
8492 return (nonzero == 1 || nonzero == 0 ? bitwidth
8493 : bitwidth - floor_log2 (nonzero) - 1);
d0ab8cd3
RK
8494 }
8495
8496 num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8497 num1 = num_sign_bit_copies (XEXP (x, 1), mode);
d1405722
RK
8498 result = MAX (1, MIN (num0, num1) - 1);
8499
8500#ifdef POINTERS_EXTEND_UNSIGNED
8501 /* If pointers extend signed and this is an addition or subtraction
8502 to a pointer in Pmode, all the bits above ptr_mode are known to be
8503 sign bit copies. */
8504 if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
8505 && (code == PLUS || code == MINUS)
8506 && GET_CODE (XEXP (x, 0)) == REG && REG_POINTER (XEXP (x, 0)))
8507 result = MAX ((GET_MODE_BITSIZE (Pmode)
8508 - GET_MODE_BITSIZE (ptr_mode) + 1),
8509 result);
8510#endif
8511 return result;
663522cb 8512
d0ab8cd3
RK
8513 case MULT:
8514 /* The number of bits of the product is the sum of the number of
8515 bits of both terms. However, unless one of the terms if known
8516 to be positive, we must allow for an additional bit since negating
8517 a negative number can remove one sign bit copy. */
8518
8519 num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8520 num1 = num_sign_bit_copies (XEXP (x, 1), mode);
8521
8522 result = bitwidth - (bitwidth - num0) - (bitwidth - num1);
8523 if (result > 0
70186b34
BS
8524 && (bitwidth > HOST_BITS_PER_WIDE_INT
8525 || (((nonzero_bits (XEXP (x, 0), mode)
8526 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8527 && ((nonzero_bits (XEXP (x, 1), mode)
8528 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))))
d0ab8cd3
RK
8529 result--;
8530
8531 return MAX (1, result);
8532
8533 case UDIV:
70186b34
BS
8534 /* The result must be <= the first operand. If the first operand
8535 has the high bit set, we know nothing about the number of sign
8536 bit copies. */
8537 if (bitwidth > HOST_BITS_PER_WIDE_INT)
8538 return 1;
8539 else if ((nonzero_bits (XEXP (x, 0), mode)
8540 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8541 return 1;
8542 else
8543 return num_sign_bit_copies (XEXP (x, 0), mode);
663522cb 8544
d0ab8cd3
RK
8545 case UMOD:
8546 /* The result must be <= the scond operand. */
8547 return num_sign_bit_copies (XEXP (x, 1), mode);
8548
8549 case DIV:
8550 /* Similar to unsigned division, except that we have to worry about
8551 the case where the divisor is negative, in which case we have
8552 to add 1. */
8553 result = num_sign_bit_copies (XEXP (x, 0), mode);
8554 if (result > 1
70186b34
BS
8555 && (bitwidth > HOST_BITS_PER_WIDE_INT
8556 || (nonzero_bits (XEXP (x, 1), mode)
8557 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
8558 result--;
d0ab8cd3
RK
8559
8560 return result;
8561
8562 case MOD:
8563 result = num_sign_bit_copies (XEXP (x, 1), mode);
8564 if (result > 1
70186b34
BS
8565 && (bitwidth > HOST_BITS_PER_WIDE_INT
8566 || (nonzero_bits (XEXP (x, 1), mode)
8567 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
8568 result--;
d0ab8cd3
RK
8569
8570 return result;
8571
8572 case ASHIFTRT:
8573 /* Shifts by a constant add to the number of bits equal to the
8574 sign bit. */
8575 num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8576 if (GET_CODE (XEXP (x, 1)) == CONST_INT
8577 && INTVAL (XEXP (x, 1)) > 0)
ae0ed63a 8578 num0 = MIN ((int) bitwidth, num0 + INTVAL (XEXP (x, 1)));
d0ab8cd3
RK
8579
8580 return num0;
8581
8582 case ASHIFT:
d0ab8cd3
RK
8583 /* Left shifts destroy copies. */
8584 if (GET_CODE (XEXP (x, 1)) != CONST_INT
8585 || INTVAL (XEXP (x, 1)) < 0
ae0ed63a 8586 || INTVAL (XEXP (x, 1)) >= (int) bitwidth)
d0ab8cd3
RK
8587 return 1;
8588
8589 num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8590 return MAX (1, num0 - INTVAL (XEXP (x, 1)));
8591
8592 case IF_THEN_ELSE:
8593 num0 = num_sign_bit_copies (XEXP (x, 1), mode);
8594 num1 = num_sign_bit_copies (XEXP (x, 2), mode);
8595 return MIN (num0, num1);
8596
d0ab8cd3 8597 case EQ: case NE: case GE: case GT: case LE: case LT:
69bc0a1f 8598 case UNEQ: case LTGT: case UNGE: case UNGT: case UNLE: case UNLT:
d0ab8cd3 8599 case GEU: case GTU: case LEU: case LTU:
69bc0a1f
JH
8600 case UNORDERED: case ORDERED:
8601 /* If the constant is negative, take its 1's complement and remask.
8602 Then see how many zero bits we have. */
8603 nonzero = STORE_FLAG_VALUE;
8604 if (bitwidth <= HOST_BITS_PER_WIDE_INT
8605 && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8606 nonzero = (~nonzero) & GET_MODE_MASK (mode);
8607
8608 return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
e9a25f70 8609 break;
663522cb 8610
e9a25f70
JL
8611 default:
8612 break;
d0ab8cd3
RK
8613 }
8614
8615 /* If we haven't been able to figure it out by one of the above rules,
8616 see if some of the high-order bits are known to be zero. If so,
ac49a949
RS
8617 count those bits and return one less than that amount. If we can't
8618 safely compute the mask for this mode, always return BITWIDTH. */
8619
8620 if (bitwidth > HOST_BITS_PER_WIDE_INT)
6752e8d2 8621 return 1;
d0ab8cd3 8622
951553af 8623 nonzero = nonzero_bits (x, mode);
df6f4086 8624 return (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))
951553af 8625 ? 1 : bitwidth - floor_log2 (nonzero) - 1);
d0ab8cd3
RK
8626}
8627\f
1a26b032
RK
8628/* Return the number of "extended" bits there are in X, when interpreted
8629 as a quantity in MODE whose signedness is indicated by UNSIGNEDP. For
8630 unsigned quantities, this is the number of high-order zero bits.
8631 For signed quantities, this is the number of copies of the sign bit
8632 minus 1. In both case, this function returns the number of "spare"
8633 bits. For example, if two quantities for which this function returns
8634 at least 1 are added, the addition is known not to overflow.
8635
8636 This function will always return 0 unless called during combine, which
8637 implies that it must be called from a define_split. */
8638
770ae6cc 8639unsigned int
1a26b032
RK
8640extended_count (x, mode, unsignedp)
8641 rtx x;
8642 enum machine_mode mode;
8643 int unsignedp;
8644{
951553af 8645 if (nonzero_sign_valid == 0)
1a26b032
RK
8646 return 0;
8647
8648 return (unsignedp
ac49a949 8649 ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
770ae6cc
RK
8650 ? (GET_MODE_BITSIZE (mode) - 1
8651 - floor_log2 (nonzero_bits (x, mode)))
8652 : 0)
1a26b032
RK
8653 : num_sign_bit_copies (x, mode) - 1);
8654}
8655\f
230d793d
RS
8656/* This function is called from `simplify_shift_const' to merge two
8657 outer operations. Specifically, we have already found that we need
8658 to perform operation *POP0 with constant *PCONST0 at the outermost
8659 position. We would now like to also perform OP1 with constant CONST1
8660 (with *POP0 being done last).
8661
8662 Return 1 if we can do the operation and update *POP0 and *PCONST0 with
663522cb 8663 the resulting operation. *PCOMP_P is set to 1 if we would need to
230d793d
RS
8664 complement the innermost operand, otherwise it is unchanged.
8665
8666 MODE is the mode in which the operation will be done. No bits outside
8667 the width of this mode matter. It is assumed that the width of this mode
5f4f0e22 8668 is smaller than or equal to HOST_BITS_PER_WIDE_INT.
230d793d
RS
8669
8670 If *POP0 or OP1 are NIL, it means no operation is required. Only NEG, PLUS,
8671 IOR, XOR, and AND are supported. We may set *POP0 to SET if the proper
8672 result is simply *PCONST0.
8673
8674 If the resulting operation cannot be expressed as one operation, we
8675 return 0 and do not change *POP0, *PCONST0, and *PCOMP_P. */
8676
8677static int
8678merge_outer_ops (pop0, pconst0, op1, const1, mode, pcomp_p)
8679 enum rtx_code *pop0;
5f4f0e22 8680 HOST_WIDE_INT *pconst0;
230d793d 8681 enum rtx_code op1;
5f4f0e22 8682 HOST_WIDE_INT const1;
230d793d
RS
8683 enum machine_mode mode;
8684 int *pcomp_p;
8685{
8686 enum rtx_code op0 = *pop0;
5f4f0e22 8687 HOST_WIDE_INT const0 = *pconst0;
230d793d
RS
8688
8689 const0 &= GET_MODE_MASK (mode);
8690 const1 &= GET_MODE_MASK (mode);
8691
8692 /* If OP0 is an AND, clear unimportant bits in CONST1. */
8693 if (op0 == AND)
8694 const1 &= const0;
8695
8696 /* If OP0 or OP1 is NIL, this is easy. Similarly if they are the same or
8697 if OP0 is SET. */
8698
8699 if (op1 == NIL || op0 == SET)
8700 return 1;
8701
8702 else if (op0 == NIL)
8703 op0 = op1, const0 = const1;
8704
8705 else if (op0 == op1)
8706 {
8707 switch (op0)
8708 {
8709 case AND:
8710 const0 &= const1;
8711 break;
8712 case IOR:
8713 const0 |= const1;
8714 break;
8715 case XOR:
8716 const0 ^= const1;
8717 break;
8718 case PLUS:
8719 const0 += const1;
8720 break;
8721 case NEG:
8722 op0 = NIL;
8723 break;
e9a25f70
JL
8724 default:
8725 break;
230d793d
RS
8726 }
8727 }
8728
8729 /* Otherwise, if either is a PLUS or NEG, we can't do anything. */
8730 else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
8731 return 0;
8732
8733 /* If the two constants aren't the same, we can't do anything. The
8734 remaining six cases can all be done. */
8735 else if (const0 != const1)
8736 return 0;
8737
8738 else
8739 switch (op0)
8740 {
8741 case IOR:
8742 if (op1 == AND)
8743 /* (a & b) | b == b */
8744 op0 = SET;
8745 else /* op1 == XOR */
8746 /* (a ^ b) | b == a | b */
b729186a 8747 {;}
230d793d
RS
8748 break;
8749
8750 case XOR:
8751 if (op1 == AND)
8752 /* (a & b) ^ b == (~a) & b */
8753 op0 = AND, *pcomp_p = 1;
8754 else /* op1 == IOR */
8755 /* (a | b) ^ b == a & ~b */
663522cb 8756 op0 = AND, *pconst0 = ~const0;
230d793d
RS
8757 break;
8758
8759 case AND:
8760 if (op1 == IOR)
8761 /* (a | b) & b == b */
8762 op0 = SET;
8763 else /* op1 == XOR */
8764 /* (a ^ b) & b) == (~a) & b */
8765 *pcomp_p = 1;
8766 break;
e9a25f70
JL
8767 default:
8768 break;
230d793d
RS
8769 }
8770
8771 /* Check for NO-OP cases. */
8772 const0 &= GET_MODE_MASK (mode);
8773 if (const0 == 0
8774 && (op0 == IOR || op0 == XOR || op0 == PLUS))
8775 op0 = NIL;
8776 else if (const0 == 0 && op0 == AND)
8777 op0 = SET;
e51712db
KG
8778 else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
8779 && op0 == AND)
230d793d
RS
8780 op0 = NIL;
8781
7e4ce834
RH
8782 /* ??? Slightly redundant with the above mask, but not entirely.
8783 Moving this above means we'd have to sign-extend the mode mask
8784 for the final test. */
8785 const0 = trunc_int_for_mode (const0, mode);
9fa6d012 8786
230d793d
RS
8787 *pop0 = op0;
8788 *pconst0 = const0;
8789
8790 return 1;
8791}
8792\f
8793/* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift.
8794 The result of the shift is RESULT_MODE. X, if non-zero, is an expression
8795 that we started with.
8796
8797 The shift is normally computed in the widest mode we find in VAROP, as
8798 long as it isn't a different number of words than RESULT_MODE. Exceptions
8799 are ASHIFTRT and ROTATE, which are always done in their original mode, */
8800
8801static rtx
770ae6cc 8802simplify_shift_const (x, code, result_mode, varop, input_count)
230d793d
RS
8803 rtx x;
8804 enum rtx_code code;
8805 enum machine_mode result_mode;
8806 rtx varop;
770ae6cc 8807 int input_count;
230d793d
RS
8808{
8809 enum rtx_code orig_code = code;
770ae6cc
RK
8810 int orig_count = input_count;
8811 unsigned int count;
8812 int signed_count;
230d793d
RS
8813 enum machine_mode mode = result_mode;
8814 enum machine_mode shift_mode, tmode;
770ae6cc 8815 unsigned int mode_words
230d793d
RS
8816 = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
8817 /* We form (outer_op (code varop count) (outer_const)). */
8818 enum rtx_code outer_op = NIL;
c4e861e8 8819 HOST_WIDE_INT outer_const = 0;
230d793d
RS
8820 rtx const_rtx;
8821 int complement_p = 0;
8822 rtx new;
8823
8824 /* If we were given an invalid count, don't do anything except exactly
8825 what was requested. */
8826
770ae6cc 8827 if (input_count < 0 || input_count > (int) GET_MODE_BITSIZE (mode))
230d793d
RS
8828 {
8829 if (x)
8830 return x;
8831
770ae6cc 8832 return gen_rtx_fmt_ee (code, mode, varop, GEN_INT (input_count));
230d793d
RS
8833 }
8834
770ae6cc
RK
8835 count = input_count;
8836
853d8828
RH
8837 /* Make sure and truncate the "natural" shift on the way in. We don't
8838 want to do this inside the loop as it makes it more difficult to
8839 combine shifts. */
8840#ifdef SHIFT_COUNT_TRUNCATED
8841 if (SHIFT_COUNT_TRUNCATED)
8842 count %= GET_MODE_BITSIZE (mode);
8843#endif
8844
230d793d
RS
8845 /* Unless one of the branches of the `if' in this loop does a `continue',
8846 we will `break' the loop after the `if'. */
8847
8848 while (count != 0)
8849 {
8850 /* If we have an operand of (clobber (const_int 0)), just return that
8851 value. */
8852 if (GET_CODE (varop) == CLOBBER)
8853 return varop;
8854
8855 /* If we discovered we had to complement VAROP, leave. Making a NOT
8856 here would cause an infinite loop. */
8857 if (complement_p)
8858 break;
8859
abc95ed3 8860 /* Convert ROTATERT to ROTATE. */
230d793d
RS
8861 if (code == ROTATERT)
8862 code = ROTATE, count = GET_MODE_BITSIZE (result_mode) - count;
8863
230d793d 8864 /* We need to determine what mode we will do the shift in. If the
f6789c77
RK
8865 shift is a right shift or a ROTATE, we must always do it in the mode
8866 it was originally done in. Otherwise, we can do it in MODE, the
0f41302f 8867 widest mode encountered. */
f6789c77
RK
8868 shift_mode
8869 = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
8870 ? result_mode : mode);
230d793d
RS
8871
8872 /* Handle cases where the count is greater than the size of the mode
853d8828
RH
8873 minus 1. For ASHIFT, use the size minus one as the count (this can
8874 occur when simplifying (lshiftrt (ashiftrt ..))). For rotates,
8875 take the count modulo the size. For other shifts, the result is
8876 zero.
230d793d
RS
8877
8878 Since these shifts are being produced by the compiler by combining
8879 multiple operations, each of which are defined, we know what the
8880 result is supposed to be. */
663522cb 8881
230d793d
RS
8882 if (count > GET_MODE_BITSIZE (shift_mode) - 1)
8883 {
8884 if (code == ASHIFTRT)
8885 count = GET_MODE_BITSIZE (shift_mode) - 1;
8886 else if (code == ROTATE || code == ROTATERT)
8887 count %= GET_MODE_BITSIZE (shift_mode);
8888 else
8889 {
8890 /* We can't simply return zero because there may be an
8891 outer op. */
8892 varop = const0_rtx;
8893 count = 0;
8894 break;
8895 }
8896 }
8897
312def2e
RK
8898 /* An arithmetic right shift of a quantity known to be -1 or 0
8899 is a no-op. */
8900 if (code == ASHIFTRT
8901 && (num_sign_bit_copies (varop, shift_mode)
8902 == GET_MODE_BITSIZE (shift_mode)))
d0ab8cd3 8903 {
312def2e
RK
8904 count = 0;
8905 break;
8906 }
d0ab8cd3 8907
312def2e
RK
8908 /* If we are doing an arithmetic right shift and discarding all but
8909 the sign bit copies, this is equivalent to doing a shift by the
8910 bitsize minus one. Convert it into that shift because it will often
8911 allow other simplifications. */
500c518b 8912
312def2e
RK
8913 if (code == ASHIFTRT
8914 && (count + num_sign_bit_copies (varop, shift_mode)
8915 >= GET_MODE_BITSIZE (shift_mode)))
8916 count = GET_MODE_BITSIZE (shift_mode) - 1;
500c518b 8917
230d793d
RS
8918 /* We simplify the tests below and elsewhere by converting
8919 ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
8920 `make_compound_operation' will convert it to a ASHIFTRT for
8aeea6e6 8921 those machines (such as VAX) that don't have a LSHIFTRT. */
5f4f0e22 8922 if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
230d793d 8923 && code == ASHIFTRT
951553af 8924 && ((nonzero_bits (varop, shift_mode)
5f4f0e22
CH
8925 & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
8926 == 0))
230d793d
RS
8927 code = LSHIFTRT;
8928
8929 switch (GET_CODE (varop))
8930 {
8931 case SIGN_EXTEND:
8932 case ZERO_EXTEND:
8933 case SIGN_EXTRACT:
8934 case ZERO_EXTRACT:
8935 new = expand_compound_operation (varop);
8936 if (new != varop)
8937 {
8938 varop = new;
8939 continue;
8940 }
8941 break;
8942
8943 case MEM:
8944 /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
8945 minus the width of a smaller mode, we can do this with a
8946 SIGN_EXTEND or ZERO_EXTEND from the narrower memory location. */
8947 if ((code == ASHIFTRT || code == LSHIFTRT)
8948 && ! mode_dependent_address_p (XEXP (varop, 0))
8949 && ! MEM_VOLATILE_P (varop)
8950 && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
8951 MODE_INT, 1)) != BLKmode)
8952 {
f1ec5147
RK
8953 new = adjust_address_nv (varop, tmode,
8954 BYTES_BIG_ENDIAN ? 0
8955 : count / BITS_PER_UNIT);
bf49b139 8956
f1c6ba8b
RK
8957 varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
8958 : ZERO_EXTEND, mode, new);
230d793d
RS
8959 count = 0;
8960 continue;
8961 }
8962 break;
8963
8964 case USE:
8965 /* Similar to the case above, except that we can only do this if
8966 the resulting mode is the same as that of the underlying
8967 MEM and adjust the address depending on the *bits* endianness
8968 because of the way that bit-field extract insns are defined. */
8969 if ((code == ASHIFTRT || code == LSHIFTRT)
8970 && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
8971 MODE_INT, 1)) != BLKmode
8972 && tmode == GET_MODE (XEXP (varop, 0)))
8973 {
f76b9db2
ILT
8974 if (BITS_BIG_ENDIAN)
8975 new = XEXP (varop, 0);
8976 else
8977 {
8978 new = copy_rtx (XEXP (varop, 0));
663522cb 8979 SUBST (XEXP (new, 0),
f76b9db2
ILT
8980 plus_constant (XEXP (new, 0),
8981 count / BITS_PER_UNIT));
8982 }
230d793d 8983
f1c6ba8b
RK
8984 varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
8985 : ZERO_EXTEND, mode, new);
230d793d
RS
8986 count = 0;
8987 continue;
8988 }
8989 break;
8990
8991 case SUBREG:
8992 /* If VAROP is a SUBREG, strip it as long as the inner operand has
8993 the same number of words as what we've seen so far. Then store
8994 the widest mode in MODE. */
f9e67232
RS
8995 if (subreg_lowpart_p (varop)
8996 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
8997 > GET_MODE_SIZE (GET_MODE (varop)))
230d793d
RS
8998 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
8999 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
9000 == mode_words))
9001 {
9002 varop = SUBREG_REG (varop);
9003 if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
9004 mode = GET_MODE (varop);
9005 continue;
9006 }
9007 break;
9008
9009 case MULT:
9010 /* Some machines use MULT instead of ASHIFT because MULT
9011 is cheaper. But it is still better on those machines to
9012 merge two shifts into one. */
9013 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9014 && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9015 {
770ae6cc
RK
9016 varop
9017 = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
9018 GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
230d793d
RS
9019 continue;
9020 }
9021 break;
9022
9023 case UDIV:
9024 /* Similar, for when divides are cheaper. */
9025 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9026 && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
9027 {
770ae6cc
RK
9028 varop
9029 = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
9030 GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
230d793d
RS
9031 continue;
9032 }
9033 break;
9034
9035 case ASHIFTRT:
8f8d8d6e
AO
9036 /* If we are extracting just the sign bit of an arithmetic
9037 right shift, that shift is not needed. However, the sign
9038 bit of a wider mode may be different from what would be
9039 interpreted as the sign bit in a narrower mode, so, if
9040 the result is narrower, don't discard the shift. */
9041 if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
9042 && (GET_MODE_BITSIZE (result_mode)
9043 >= GET_MODE_BITSIZE (GET_MODE (varop))))
230d793d
RS
9044 {
9045 varop = XEXP (varop, 0);
9046 continue;
9047 }
9048
0f41302f 9049 /* ... fall through ... */
230d793d
RS
9050
9051 case LSHIFTRT:
9052 case ASHIFT:
230d793d
RS
9053 case ROTATE:
9054 /* Here we have two nested shifts. The result is usually the
9055 AND of a new shift with a mask. We compute the result below. */
9056 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9057 && INTVAL (XEXP (varop, 1)) >= 0
9058 && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
5f4f0e22
CH
9059 && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9060 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
230d793d
RS
9061 {
9062 enum rtx_code first_code = GET_CODE (varop);
770ae6cc 9063 unsigned int first_count = INTVAL (XEXP (varop, 1));
5f4f0e22 9064 unsigned HOST_WIDE_INT mask;
230d793d 9065 rtx mask_rtx;
230d793d 9066
230d793d
RS
9067 /* We have one common special case. We can't do any merging if
9068 the inner code is an ASHIFTRT of a smaller mode. However, if
9069 we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
9070 with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
9071 we can convert it to
9072 (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
9073 This simplifies certain SIGN_EXTEND operations. */
9074 if (code == ASHIFT && first_code == ASHIFTRT
9075 && (GET_MODE_BITSIZE (result_mode)
9076 - GET_MODE_BITSIZE (GET_MODE (varop))) == count)
9077 {
9078 /* C3 has the low-order C1 bits zero. */
663522cb 9079
5f4f0e22 9080 mask = (GET_MODE_MASK (mode)
663522cb 9081 & ~(((HOST_WIDE_INT) 1 << first_count) - 1));
230d793d 9082
5f4f0e22 9083 varop = simplify_and_const_int (NULL_RTX, result_mode,
230d793d 9084 XEXP (varop, 0), mask);
5f4f0e22 9085 varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
230d793d
RS
9086 varop, count);
9087 count = first_count;
9088 code = ASHIFTRT;
9089 continue;
9090 }
663522cb 9091
d0ab8cd3
RK
9092 /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
9093 than C1 high-order bits equal to the sign bit, we can convert
9094 this to either an ASHIFT or a ASHIFTRT depending on the
663522cb 9095 two counts.
230d793d
RS
9096
9097 We cannot do this if VAROP's mode is not SHIFT_MODE. */
9098
9099 if (code == ASHIFTRT && first_code == ASHIFT
9100 && GET_MODE (varop) == shift_mode
d0ab8cd3
RK
9101 && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
9102 > first_count))
230d793d 9103 {
d0ab8cd3 9104 varop = XEXP (varop, 0);
770ae6cc
RK
9105
9106 signed_count = count - first_count;
9107 if (signed_count < 0)
663522cb 9108 count = -signed_count, code = ASHIFT;
770ae6cc
RK
9109 else
9110 count = signed_count;
9111
d0ab8cd3 9112 continue;
230d793d
RS
9113 }
9114
9115 /* There are some cases we can't do. If CODE is ASHIFTRT,
9116 we can only do this if FIRST_CODE is also ASHIFTRT.
9117
9118 We can't do the case when CODE is ROTATE and FIRST_CODE is
9119 ASHIFTRT.
9120
9121 If the mode of this shift is not the mode of the outer shift,
bdaae9a0 9122 we can't do this if either shift is a right shift or ROTATE.
230d793d
RS
9123
9124 Finally, we can't do any of these if the mode is too wide
9125 unless the codes are the same.
9126
9127 Handle the case where the shift codes are the same
9128 first. */
9129
9130 if (code == first_code)
9131 {
9132 if (GET_MODE (varop) != result_mode
bdaae9a0
RK
9133 && (code == ASHIFTRT || code == LSHIFTRT
9134 || code == ROTATE))
230d793d
RS
9135 break;
9136
9137 count += first_count;
9138 varop = XEXP (varop, 0);
9139 continue;
9140 }
9141
9142 if (code == ASHIFTRT
9143 || (code == ROTATE && first_code == ASHIFTRT)
5f4f0e22 9144 || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
230d793d 9145 || (GET_MODE (varop) != result_mode
bdaae9a0
RK
9146 && (first_code == ASHIFTRT || first_code == LSHIFTRT
9147 || first_code == ROTATE
230d793d
RS
9148 || code == ROTATE)))
9149 break;
9150
9151 /* To compute the mask to apply after the shift, shift the
663522cb 9152 nonzero bits of the inner shift the same way the
230d793d
RS
9153 outer shift will. */
9154
951553af 9155 mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
230d793d
RS
9156
9157 mask_rtx
9158 = simplify_binary_operation (code, result_mode, mask_rtx,
5f4f0e22 9159 GEN_INT (count));
663522cb 9160
230d793d
RS
9161 /* Give up if we can't compute an outer operation to use. */
9162 if (mask_rtx == 0
9163 || GET_CODE (mask_rtx) != CONST_INT
9164 || ! merge_outer_ops (&outer_op, &outer_const, AND,
9165 INTVAL (mask_rtx),
9166 result_mode, &complement_p))
9167 break;
9168
9169 /* If the shifts are in the same direction, we add the
9170 counts. Otherwise, we subtract them. */
770ae6cc 9171 signed_count = count;
230d793d
RS
9172 if ((code == ASHIFTRT || code == LSHIFTRT)
9173 == (first_code == ASHIFTRT || first_code == LSHIFTRT))
770ae6cc 9174 signed_count += first_count;
230d793d 9175 else
770ae6cc 9176 signed_count -= first_count;
230d793d 9177
663522cb 9178 /* If COUNT is positive, the new shift is usually CODE,
230d793d
RS
9179 except for the two exceptions below, in which case it is
9180 FIRST_CODE. If the count is negative, FIRST_CODE should
9181 always be used */
770ae6cc 9182 if (signed_count > 0
230d793d
RS
9183 && ((first_code == ROTATE && code == ASHIFT)
9184 || (first_code == ASHIFTRT && code == LSHIFTRT)))
770ae6cc
RK
9185 code = first_code, count = signed_count;
9186 else if (signed_count < 0)
663522cb 9187 code = first_code, count = -signed_count;
770ae6cc
RK
9188 else
9189 count = signed_count;
230d793d
RS
9190
9191 varop = XEXP (varop, 0);
9192 continue;
9193 }
9194
9195 /* If we have (A << B << C) for any shift, we can convert this to
9196 (A << C << B). This wins if A is a constant. Only try this if
9197 B is not a constant. */
9198
9199 else if (GET_CODE (varop) == code
9200 && GET_CODE (XEXP (varop, 1)) != CONST_INT
9201 && 0 != (new
9202 = simplify_binary_operation (code, mode,
9203 XEXP (varop, 0),
5f4f0e22 9204 GEN_INT (count))))
230d793d 9205 {
f1c6ba8b 9206 varop = gen_rtx_fmt_ee (code, mode, new, XEXP (varop, 1));
230d793d
RS
9207 count = 0;
9208 continue;
9209 }
9210 break;
9211
9212 case NOT:
9213 /* Make this fit the case below. */
f1c6ba8b
RK
9214 varop = gen_rtx_XOR (mode, XEXP (varop, 0),
9215 GEN_INT (GET_MODE_MASK (mode)));
230d793d
RS
9216 continue;
9217
9218 case IOR:
9219 case AND:
9220 case XOR:
9221 /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
9222 with C the size of VAROP - 1 and the shift is logical if
9223 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9224 we have an (le X 0) operation. If we have an arithmetic shift
9225 and STORE_FLAG_VALUE is 1 or we have a logical shift with
9226 STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation. */
9227
9228 if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
9229 && XEXP (XEXP (varop, 0), 1) == constm1_rtx
9230 && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9231 && (code == LSHIFTRT || code == ASHIFTRT)
9232 && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
9233 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9234 {
9235 count = 0;
f1c6ba8b
RK
9236 varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
9237 const0_rtx);
230d793d
RS
9238
9239 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
f1c6ba8b 9240 varop = gen_rtx_NEG (GET_MODE (varop), varop);
230d793d
RS
9241
9242 continue;
9243 }
9244
9245 /* If we have (shift (logical)), move the logical to the outside
9246 to allow it to possibly combine with another logical and the
9247 shift to combine with another shift. This also canonicalizes to
9248 what a ZERO_EXTRACT looks like. Also, some machines have
9249 (and (shift)) insns. */
9250
9251 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9252 && (new = simplify_binary_operation (code, result_mode,
9253 XEXP (varop, 1),
5f4f0e22 9254 GEN_INT (count))) != 0
663522cb 9255 && GET_CODE (new) == CONST_INT
230d793d
RS
9256 && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
9257 INTVAL (new), result_mode, &complement_p))
9258 {
9259 varop = XEXP (varop, 0);
9260 continue;
9261 }
9262
9263 /* If we can't do that, try to simplify the shift in each arm of the
9264 logical expression, make a new logical expression, and apply
9265 the inverse distributive law. */
9266 {
00d4ca1c 9267 rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
230d793d 9268 XEXP (varop, 0), count);
00d4ca1c 9269 rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
230d793d
RS
9270 XEXP (varop, 1), count);
9271
21a64bf1 9272 varop = gen_binary (GET_CODE (varop), shift_mode, lhs, rhs);
230d793d
RS
9273 varop = apply_distributive_law (varop);
9274
9275 count = 0;
9276 }
9277 break;
9278
9279 case EQ:
45620ed4 9280 /* convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
230d793d 9281 says that the sign bit can be tested, FOO has mode MODE, C is
45620ed4
RK
9282 GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
9283 that may be nonzero. */
9284 if (code == LSHIFTRT
230d793d
RS
9285 && XEXP (varop, 1) == const0_rtx
9286 && GET_MODE (XEXP (varop, 0)) == result_mode
9287 && count == GET_MODE_BITSIZE (result_mode) - 1
5f4f0e22 9288 && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
230d793d 9289 && ((STORE_FLAG_VALUE
663522cb 9290 & ((HOST_WIDE_INT) 1
770ae6cc 9291 < (GET_MODE_BITSIZE (result_mode) - 1))))
951553af 9292 && nonzero_bits (XEXP (varop, 0), result_mode) == 1
5f4f0e22
CH
9293 && merge_outer_ops (&outer_op, &outer_const, XOR,
9294 (HOST_WIDE_INT) 1, result_mode,
9295 &complement_p))
230d793d
RS
9296 {
9297 varop = XEXP (varop, 0);
9298 count = 0;
9299 continue;
9300 }
9301 break;
9302
9303 case NEG:
d0ab8cd3
RK
9304 /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
9305 than the number of bits in the mode is equivalent to A. */
9306 if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
951553af 9307 && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
230d793d 9308 {
d0ab8cd3 9309 varop = XEXP (varop, 0);
230d793d
RS
9310 count = 0;
9311 continue;
9312 }
9313
9314 /* NEG commutes with ASHIFT since it is multiplication. Move the
9315 NEG outside to allow shifts to combine. */
9316 if (code == ASHIFT
5f4f0e22
CH
9317 && merge_outer_ops (&outer_op, &outer_const, NEG,
9318 (HOST_WIDE_INT) 0, result_mode,
9319 &complement_p))
230d793d
RS
9320 {
9321 varop = XEXP (varop, 0);
9322 continue;
9323 }
9324 break;
9325
9326 case PLUS:
d0ab8cd3
RK
9327 /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
9328 is one less than the number of bits in the mode is
9329 equivalent to (xor A 1). */
230d793d
RS
9330 if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
9331 && XEXP (varop, 1) == constm1_rtx
951553af 9332 && nonzero_bits (XEXP (varop, 0), result_mode) == 1
5f4f0e22
CH
9333 && merge_outer_ops (&outer_op, &outer_const, XOR,
9334 (HOST_WIDE_INT) 1, result_mode,
9335 &complement_p))
230d793d
RS
9336 {
9337 count = 0;
9338 varop = XEXP (varop, 0);
9339 continue;
9340 }
9341
3f508eca 9342 /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
951553af 9343 that might be nonzero in BAR are those being shifted out and those
3f508eca
RK
9344 bits are known zero in FOO, we can replace the PLUS with FOO.
9345 Similarly in the other operand order. This code occurs when
9346 we are computing the size of a variable-size array. */
9347
9348 if ((code == ASHIFTRT || code == LSHIFTRT)
5f4f0e22 9349 && count < HOST_BITS_PER_WIDE_INT
951553af
RK
9350 && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9351 && (nonzero_bits (XEXP (varop, 1), result_mode)
9352 & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
3f508eca
RK
9353 {
9354 varop = XEXP (varop, 0);
9355 continue;
9356 }
9357 else if ((code == ASHIFTRT || code == LSHIFTRT)
5f4f0e22 9358 && count < HOST_BITS_PER_WIDE_INT
ac49a949 9359 && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
951553af 9360 && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
3f508eca 9361 >> count)
951553af
RK
9362 && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9363 & nonzero_bits (XEXP (varop, 1),
3f508eca
RK
9364 result_mode)))
9365 {
9366 varop = XEXP (varop, 1);
9367 continue;
9368 }
9369
230d793d
RS
9370 /* (ashift (plus foo C) N) is (plus (ashift foo N) C'). */
9371 if (code == ASHIFT
9372 && GET_CODE (XEXP (varop, 1)) == CONST_INT
9373 && (new = simplify_binary_operation (ASHIFT, result_mode,
9374 XEXP (varop, 1),
5f4f0e22 9375 GEN_INT (count))) != 0
770ae6cc 9376 && GET_CODE (new) == CONST_INT
230d793d
RS
9377 && merge_outer_ops (&outer_op, &outer_const, PLUS,
9378 INTVAL (new), result_mode, &complement_p))
9379 {
9380 varop = XEXP (varop, 0);
9381 continue;
9382 }
9383 break;
9384
9385 case MINUS:
9386 /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9387 with C the size of VAROP - 1 and the shift is logical if
9388 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9389 we have a (gt X 0) operation. If the shift is arithmetic with
9390 STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9391 we have a (neg (gt X 0)) operation. */
9392
0802d516
RK
9393 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9394 && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
230d793d 9395 && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
230d793d
RS
9396 && (code == LSHIFTRT || code == ASHIFTRT)
9397 && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9398 && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
9399 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9400 {
9401 count = 0;
f1c6ba8b
RK
9402 varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
9403 const0_rtx);
230d793d
RS
9404
9405 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
f1c6ba8b 9406 varop = gen_rtx_NEG (GET_MODE (varop), varop);
230d793d
RS
9407
9408 continue;
9409 }
9410 break;
6e0ef100
JC
9411
9412 case TRUNCATE:
9413 /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
9414 if the truncate does not affect the value. */
9415 if (code == LSHIFTRT
9416 && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
9417 && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9418 && (INTVAL (XEXP (XEXP (varop, 0), 1))
b577a8ff
JL
9419 >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
9420 - GET_MODE_BITSIZE (GET_MODE (varop)))))
6e0ef100
JC
9421 {
9422 rtx varop_inner = XEXP (varop, 0);
9423
770ae6cc 9424 varop_inner
f1c6ba8b
RK
9425 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
9426 XEXP (varop_inner, 0),
9427 GEN_INT
9428 (count + INTVAL (XEXP (varop_inner, 1))));
9429 varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
6e0ef100
JC
9430 count = 0;
9431 continue;
9432 }
9433 break;
663522cb 9434
e9a25f70
JL
9435 default:
9436 break;
230d793d
RS
9437 }
9438
9439 break;
9440 }
9441
9442 /* We need to determine what mode to do the shift in. If the shift is
f6789c77
RK
9443 a right shift or ROTATE, we must always do it in the mode it was
9444 originally done in. Otherwise, we can do it in MODE, the widest mode
9445 encountered. The code we care about is that of the shift that will
9446 actually be done, not the shift that was originally requested. */
9447 shift_mode
9448 = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9449 ? result_mode : mode);
230d793d
RS
9450
9451 /* We have now finished analyzing the shift. The result should be
9452 a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places. If
9453 OUTER_OP is non-NIL, it is an operation that needs to be applied
9454 to the result of the shift. OUTER_CONST is the relevant constant,
9455 but we must turn off all bits turned off in the shift.
9456
9457 If we were passed a value for X, see if we can use any pieces of
9458 it. If not, make new rtx. */
9459
9460 if (x && GET_RTX_CLASS (GET_CODE (x)) == '2'
9461 && GET_CODE (XEXP (x, 1)) == CONST_INT
9462 && INTVAL (XEXP (x, 1)) == count)
9463 const_rtx = XEXP (x, 1);
9464 else
5f4f0e22 9465 const_rtx = GEN_INT (count);
230d793d
RS
9466
9467 if (x && GET_CODE (XEXP (x, 0)) == SUBREG
9468 && GET_MODE (XEXP (x, 0)) == shift_mode
9469 && SUBREG_REG (XEXP (x, 0)) == varop)
9470 varop = XEXP (x, 0);
9471 else if (GET_MODE (varop) != shift_mode)
9472 varop = gen_lowpart_for_combine (shift_mode, varop);
9473
0f41302f 9474 /* If we can't make the SUBREG, try to return what we were given. */
230d793d
RS
9475 if (GET_CODE (varop) == CLOBBER)
9476 return x ? x : varop;
9477
9478 new = simplify_binary_operation (code, shift_mode, varop, const_rtx);
9479 if (new != 0)
9480 x = new;
9481 else
9482 {
9483 if (x == 0 || GET_CODE (x) != code || GET_MODE (x) != shift_mode)
f1c6ba8b 9484 x = gen_rtx_fmt_ee (code, shift_mode, varop, const_rtx);
230d793d
RS
9485
9486 SUBST (XEXP (x, 0), varop);
9487 SUBST (XEXP (x, 1), const_rtx);
9488 }
9489
224eeff2
RK
9490 /* If we have an outer operation and we just made a shift, it is
9491 possible that we could have simplified the shift were it not
9492 for the outer operation. So try to do the simplification
9493 recursively. */
9494
9495 if (outer_op != NIL && GET_CODE (x) == code
9496 && GET_CODE (XEXP (x, 1)) == CONST_INT)
9497 x = simplify_shift_const (x, code, shift_mode, XEXP (x, 0),
9498 INTVAL (XEXP (x, 1)));
9499
230d793d
RS
9500 /* If we were doing a LSHIFTRT in a wider mode than it was originally,
9501 turn off all the bits that the shift would have turned off. */
9502 if (orig_code == LSHIFTRT && result_mode != shift_mode)
5f4f0e22 9503 x = simplify_and_const_int (NULL_RTX, shift_mode, x,
230d793d 9504 GET_MODE_MASK (result_mode) >> orig_count);
663522cb 9505
230d793d
RS
9506 /* Do the remainder of the processing in RESULT_MODE. */
9507 x = gen_lowpart_for_combine (result_mode, x);
9508
9509 /* If COMPLEMENT_P is set, we have to complement X before doing the outer
9510 operation. */
9511 if (complement_p)
f1c6ba8b 9512 x =simplify_gen_unary (NOT, result_mode, x, result_mode);
230d793d
RS
9513
9514 if (outer_op != NIL)
9515 {
5f4f0e22 9516 if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
7e4ce834 9517 outer_const = trunc_int_for_mode (outer_const, result_mode);
230d793d
RS
9518
9519 if (outer_op == AND)
5f4f0e22 9520 x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
230d793d
RS
9521 else if (outer_op == SET)
9522 /* This means that we have determined that the result is
9523 equivalent to a constant. This should be rare. */
5f4f0e22 9524 x = GEN_INT (outer_const);
230d793d 9525 else if (GET_RTX_CLASS (outer_op) == '1')
f1c6ba8b 9526 x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
230d793d 9527 else
5f4f0e22 9528 x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
230d793d
RS
9529 }
9530
9531 return x;
663522cb 9532}
230d793d
RS
9533\f
9534/* Like recog, but we receive the address of a pointer to a new pattern.
9535 We try to match the rtx that the pointer points to.
9536 If that fails, we may try to modify or replace the pattern,
9537 storing the replacement into the same pointer object.
9538
9539 Modifications include deletion or addition of CLOBBERs.
9540
9541 PNOTES is a pointer to a location where any REG_UNUSED notes added for
9542 the CLOBBERs are placed.
9543
9544 The value is the final insn code from the pattern ultimately matched,
9545 or -1. */
9546
9547static int
8e2f6e35 9548recog_for_combine (pnewpat, insn, pnotes)
230d793d
RS
9549 rtx *pnewpat;
9550 rtx insn;
9551 rtx *pnotes;
9552{
9553 register rtx pat = *pnewpat;
9554 int insn_code_number;
9555 int num_clobbers_to_add = 0;
9556 int i;
9557 rtx notes = 0;
c1194d74 9558 rtx old_notes;
230d793d 9559
974f4146
RK
9560 /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
9561 we use to indicate that something didn't match. If we find such a
9562 thing, force rejection. */
d96023cf 9563 if (GET_CODE (pat) == PARALLEL)
974f4146 9564 for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
d96023cf
RK
9565 if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
9566 && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
974f4146
RK
9567 return -1;
9568
c1194d74
JW
9569 /* Remove the old notes prior to trying to recognize the new pattern. */
9570 old_notes = REG_NOTES (insn);
9571 REG_NOTES (insn) = 0;
9572
b5832b43 9573 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
230d793d
RS
9574
9575 /* If it isn't, there is the possibility that we previously had an insn
9576 that clobbered some register as a side effect, but the combined
9577 insn doesn't need to do that. So try once more without the clobbers
9578 unless this represents an ASM insn. */
9579
9580 if (insn_code_number < 0 && ! check_asm_operands (pat)
9581 && GET_CODE (pat) == PARALLEL)
9582 {
9583 int pos;
9584
9585 for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
9586 if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
9587 {
9588 if (i != pos)
9589 SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
9590 pos++;
9591 }
9592
9593 SUBST_INT (XVECLEN (pat, 0), pos);
9594
9595 if (pos == 1)
9596 pat = XVECEXP (pat, 0, 0);
9597
b5832b43 9598 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
230d793d
RS
9599 }
9600
b5832b43
JH
9601 /* Recognize all noop sets, these will be killed by followup pass. */
9602 if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
9603 insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
9604
c1194d74
JW
9605 REG_NOTES (insn) = old_notes;
9606
230d793d
RS
9607 /* If we had any clobbers to add, make a new pattern than contains
9608 them. Then check to make sure that all of them are dead. */
9609 if (num_clobbers_to_add)
9610 {
38a448ca 9611 rtx newpat = gen_rtx_PARALLEL (VOIDmode,
bf103ec2
R
9612 rtvec_alloc (GET_CODE (pat) == PARALLEL
9613 ? (XVECLEN (pat, 0)
9614 + num_clobbers_to_add)
9615 : num_clobbers_to_add + 1));
230d793d
RS
9616
9617 if (GET_CODE (pat) == PARALLEL)
9618 for (i = 0; i < XVECLEN (pat, 0); i++)
9619 XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
9620 else
9621 XVECEXP (newpat, 0, 0) = pat;
9622
9623 add_clobbers (newpat, insn_code_number);
9624
9625 for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
9626 i < XVECLEN (newpat, 0); i++)
9627 {
9628 if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == REG
9629 && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
9630 return -1;
38a448ca
RH
9631 notes = gen_rtx_EXPR_LIST (REG_UNUSED,
9632 XEXP (XVECEXP (newpat, 0, i), 0), notes);
230d793d
RS
9633 }
9634 pat = newpat;
9635 }
9636
9637 *pnewpat = pat;
9638 *pnotes = notes;
9639
9640 return insn_code_number;
9641}
9642\f
9643/* Like gen_lowpart but for use by combine. In combine it is not possible
9644 to create any new pseudoregs. However, it is safe to create
9645 invalid memory addresses, because combine will try to recognize
9646 them and all they will do is make the combine attempt fail.
9647
9648 If for some reason this cannot do its job, an rtx
9649 (clobber (const_int 0)) is returned.
9650 An insn containing that will not be recognized. */
9651
9652#undef gen_lowpart
9653
9654static rtx
9655gen_lowpart_for_combine (mode, x)
9656 enum machine_mode mode;
9657 register rtx x;
9658{
9659 rtx result;
9660
9661 if (GET_MODE (x) == mode)
9662 return x;
9663
eae957a8
RK
9664 /* We can only support MODE being wider than a word if X is a
9665 constant integer or has a mode the same size. */
9666
9667 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
9668 && ! ((GET_MODE (x) == VOIDmode
9669 && (GET_CODE (x) == CONST_INT
9670 || GET_CODE (x) == CONST_DOUBLE))
9671 || GET_MODE_SIZE (GET_MODE (x)) == GET_MODE_SIZE (mode)))
38a448ca 9672 return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
230d793d
RS
9673
9674 /* X might be a paradoxical (subreg (mem)). In that case, gen_lowpart
9675 won't know what to do. So we will strip off the SUBREG here and
9676 process normally. */
9677 if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
9678 {
9679 x = SUBREG_REG (x);
9680 if (GET_MODE (x) == mode)
9681 return x;
9682 }
9683
9684 result = gen_lowpart_common (mode, x);
02188693 9685#ifdef CLASS_CANNOT_CHANGE_MODE
64bf47a2
RK
9686 if (result != 0
9687 && GET_CODE (result) == SUBREG
9688 && GET_CODE (SUBREG_REG (result)) == REG
9689 && REGNO (SUBREG_REG (result)) >= FIRST_PSEUDO_REGISTER
02188693
RH
9690 && CLASS_CANNOT_CHANGE_MODE_P (GET_MODE (result),
9691 GET_MODE (SUBREG_REG (result))))
9692 REG_CHANGES_MODE (REGNO (SUBREG_REG (result))) = 1;
9693#endif
64bf47a2 9694
230d793d
RS
9695 if (result)
9696 return result;
9697
9698 if (GET_CODE (x) == MEM)
9699 {
9700 register int offset = 0;
230d793d
RS
9701
9702 /* Refuse to work on a volatile memory ref or one with a mode-dependent
9703 address. */
9704 if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
38a448ca 9705 return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
230d793d
RS
9706
9707 /* If we want to refer to something bigger than the original memref,
9708 generate a perverse subreg instead. That will force a reload
9709 of the original memref X. */
9710 if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode))
38a448ca 9711 return gen_rtx_SUBREG (mode, x, 0);
230d793d 9712
f76b9db2
ILT
9713 if (WORDS_BIG_ENDIAN)
9714 offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
9715 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
c5c76735 9716
f76b9db2
ILT
9717 if (BYTES_BIG_ENDIAN)
9718 {
9719 /* Adjust the address so that the address-after-the-data is
9720 unchanged. */
9721 offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
9722 - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
9723 }
f1ec5147
RK
9724
9725 return adjust_address_nv (x, mode, offset);
230d793d
RS
9726 }
9727
9728 /* If X is a comparison operator, rewrite it in a new mode. This
9729 probably won't match, but may allow further simplifications. */
9730 else if (GET_RTX_CLASS (GET_CODE (x)) == '<')
f1c6ba8b 9731 return gen_rtx_fmt_ee (GET_CODE (x), mode, XEXP (x, 0), XEXP (x, 1));
230d793d
RS
9732
9733 /* If we couldn't simplify X any other way, just enclose it in a
9734 SUBREG. Normally, this SUBREG won't match, but some patterns may
a7c99304 9735 include an explicit SUBREG or we may simplify it further in combine. */
230d793d 9736 else
dfbe1b2f 9737 {
ddef6bc7 9738 int offset = 0;
e0e08ac2 9739 rtx res;
dfbe1b2f 9740
e0e08ac2
JH
9741 offset = subreg_lowpart_offset (mode, GET_MODE (x));
9742 res = simplify_gen_subreg (mode, x, GET_MODE (x), offset);
9743 if (res)
9744 return res;
9745 return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
dfbe1b2f 9746 }
230d793d
RS
9747}
9748\f
230d793d
RS
9749/* These routines make binary and unary operations by first seeing if they
9750 fold; if not, a new expression is allocated. */
9751
9752static rtx
9753gen_binary (code, mode, op0, op1)
9754 enum rtx_code code;
9755 enum machine_mode mode;
9756 rtx op0, op1;
9757{
9758 rtx result;
1a26b032
RK
9759 rtx tem;
9760
9761 if (GET_RTX_CLASS (code) == 'c'
8c9864f3 9762 && swap_commutative_operands_p (op0, op1))
1a26b032 9763 tem = op0, op0 = op1, op1 = tem;
230d793d 9764
663522cb 9765 if (GET_RTX_CLASS (code) == '<')
230d793d
RS
9766 {
9767 enum machine_mode op_mode = GET_MODE (op0);
9210df58 9768
663522cb 9769 /* Strip the COMPARE from (REL_OP (compare X Y) 0) to get
0f41302f 9770 just (REL_OP X Y). */
9210df58
RK
9771 if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
9772 {
9773 op1 = XEXP (op0, 1);
9774 op0 = XEXP (op0, 0);
9775 op_mode = GET_MODE (op0);
9776 }
9777
230d793d
RS
9778 if (op_mode == VOIDmode)
9779 op_mode = GET_MODE (op1);
9780 result = simplify_relational_operation (code, op_mode, op0, op1);
9781 }
9782 else
9783 result = simplify_binary_operation (code, mode, op0, op1);
9784
9785 if (result)
9786 return result;
9787
9788 /* Put complex operands first and constants second. */
9789 if (GET_RTX_CLASS (code) == 'c'
e5c56fd9 9790 && swap_commutative_operands_p (op0, op1))
f1c6ba8b 9791 return gen_rtx_fmt_ee (code, mode, op1, op0);
230d793d 9792
e5e809f4
JL
9793 /* If we are turning off bits already known off in OP0, we need not do
9794 an AND. */
9795 else if (code == AND && GET_CODE (op1) == CONST_INT
9796 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
663522cb 9797 && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
e5e809f4
JL
9798 return op0;
9799
f1c6ba8b 9800 return gen_rtx_fmt_ee (code, mode, op0, op1);
230d793d
RS
9801}
9802\f
9803/* Simplify a comparison between *POP0 and *POP1 where CODE is the
9804 comparison code that will be tested.
9805
9806 The result is a possibly different comparison code to use. *POP0 and
9807 *POP1 may be updated.
9808
9809 It is possible that we might detect that a comparison is either always
9810 true or always false. However, we do not perform general constant
5089e22e 9811 folding in combine, so this knowledge isn't useful. Such tautologies
230d793d
RS
9812 should have been detected earlier. Hence we ignore all such cases. */
9813
9814static enum rtx_code
9815simplify_comparison (code, pop0, pop1)
9816 enum rtx_code code;
9817 rtx *pop0;
9818 rtx *pop1;
9819{
9820 rtx op0 = *pop0;
9821 rtx op1 = *pop1;
9822 rtx tem, tem1;
9823 int i;
9824 enum machine_mode mode, tmode;
9825
9826 /* Try a few ways of applying the same transformation to both operands. */
9827 while (1)
9828 {
3a19aabc
RK
9829#ifndef WORD_REGISTER_OPERATIONS
9830 /* The test below this one won't handle SIGN_EXTENDs on these machines,
9831 so check specially. */
9832 if (code != GTU && code != GEU && code != LTU && code != LEU
9833 && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
9834 && GET_CODE (XEXP (op0, 0)) == ASHIFT
9835 && GET_CODE (XEXP (op1, 0)) == ASHIFT
9836 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
9837 && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
9838 && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
ad25ba17 9839 == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
3a19aabc
RK
9840 && GET_CODE (XEXP (op0, 1)) == CONST_INT
9841 && GET_CODE (XEXP (op1, 1)) == CONST_INT
9842 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
9843 && GET_CODE (XEXP (XEXP (op1, 0), 1)) == CONST_INT
9844 && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (op1, 1))
9845 && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op0, 0), 1))
9846 && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op1, 0), 1))
9847 && (INTVAL (XEXP (op0, 1))
9848 == (GET_MODE_BITSIZE (GET_MODE (op0))
9849 - (GET_MODE_BITSIZE
9850 (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
9851 {
9852 op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
9853 op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
9854 }
9855#endif
9856
230d793d
RS
9857 /* If both operands are the same constant shift, see if we can ignore the
9858 shift. We can if the shift is a rotate or if the bits shifted out of
951553af 9859 this shift are known to be zero for both inputs and if the type of
230d793d 9860 comparison is compatible with the shift. */
67232b23
RK
9861 if (GET_CODE (op0) == GET_CODE (op1)
9862 && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
9863 && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
45620ed4 9864 || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
67232b23
RK
9865 && (code != GT && code != LT && code != GE && code != LE))
9866 || (GET_CODE (op0) == ASHIFTRT
9867 && (code != GTU && code != LTU
99dc5306 9868 && code != GEU && code != LEU)))
67232b23
RK
9869 && GET_CODE (XEXP (op0, 1)) == CONST_INT
9870 && INTVAL (XEXP (op0, 1)) >= 0
9871 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
9872 && XEXP (op0, 1) == XEXP (op1, 1))
230d793d
RS
9873 {
9874 enum machine_mode mode = GET_MODE (op0);
5f4f0e22 9875 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
230d793d
RS
9876 int shift_count = INTVAL (XEXP (op0, 1));
9877
9878 if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
9879 mask &= (mask >> shift_count) << shift_count;
45620ed4 9880 else if (GET_CODE (op0) == ASHIFT)
230d793d
RS
9881 mask = (mask & (mask << shift_count)) >> shift_count;
9882
663522cb
KH
9883 if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
9884 && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
230d793d
RS
9885 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
9886 else
9887 break;
9888 }
9889
9890 /* If both operands are AND's of a paradoxical SUBREG by constant, the
9891 SUBREGs are of the same mode, and, in both cases, the AND would
9892 be redundant if the comparison was done in the narrower mode,
9893 do the comparison in the narrower mode (e.g., we are AND'ing with 1
951553af
RK
9894 and the operand's possibly nonzero bits are 0xffffff01; in that case
9895 if we only care about QImode, we don't need the AND). This case
9896 occurs if the output mode of an scc insn is not SImode and
7e4dc511
RK
9897 STORE_FLAG_VALUE == 1 (e.g., the 386).
9898
9899 Similarly, check for a case where the AND's are ZERO_EXTEND
9900 operations from some narrower mode even though a SUBREG is not
9901 present. */
230d793d 9902
663522cb
KH
9903 else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
9904 && GET_CODE (XEXP (op0, 1)) == CONST_INT
9905 && GET_CODE (XEXP (op1, 1)) == CONST_INT)
230d793d 9906 {
7e4dc511
RK
9907 rtx inner_op0 = XEXP (op0, 0);
9908 rtx inner_op1 = XEXP (op1, 0);
9909 HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
9910 HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
9911 int changed = 0;
663522cb 9912
7e4dc511
RK
9913 if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
9914 && (GET_MODE_SIZE (GET_MODE (inner_op0))
9915 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
9916 && (GET_MODE (SUBREG_REG (inner_op0))
9917 == GET_MODE (SUBREG_REG (inner_op1)))
729a2bc6 9918 && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
7e4dc511 9919 <= HOST_BITS_PER_WIDE_INT)
01c82bbb 9920 && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
729a2bc6 9921 GET_MODE (SUBREG_REG (inner_op0)))))
01c82bbb
RK
9922 && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
9923 GET_MODE (SUBREG_REG (inner_op1))))))
7e4dc511
RK
9924 {
9925 op0 = SUBREG_REG (inner_op0);
9926 op1 = SUBREG_REG (inner_op1);
9927
9928 /* The resulting comparison is always unsigned since we masked
0f41302f 9929 off the original sign bit. */
7e4dc511
RK
9930 code = unsigned_condition (code);
9931
9932 changed = 1;
9933 }
230d793d 9934
7e4dc511
RK
9935 else if (c0 == c1)
9936 for (tmode = GET_CLASS_NARROWEST_MODE
9937 (GET_MODE_CLASS (GET_MODE (op0)));
9938 tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
e51712db 9939 if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
7e4dc511
RK
9940 {
9941 op0 = gen_lowpart_for_combine (tmode, inner_op0);
9942 op1 = gen_lowpart_for_combine (tmode, inner_op1);
66415c8b 9943 code = unsigned_condition (code);
7e4dc511
RK
9944 changed = 1;
9945 break;
9946 }
9947
9948 if (! changed)
9949 break;
230d793d 9950 }
3a19aabc 9951
ad25ba17
RK
9952 /* If both operands are NOT, we can strip off the outer operation
9953 and adjust the comparison code for swapped operands; similarly for
9954 NEG, except that this must be an equality comparison. */
9955 else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
9956 || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
9957 && (code == EQ || code == NE)))
9958 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
3a19aabc 9959
230d793d
RS
9960 else
9961 break;
9962 }
663522cb 9963
230d793d 9964 /* If the first operand is a constant, swap the operands and adjust the
3aceff0d
RK
9965 comparison code appropriately, but don't do this if the second operand
9966 is already a constant integer. */
8c9864f3 9967 if (swap_commutative_operands_p (op0, op1))
230d793d
RS
9968 {
9969 tem = op0, op0 = op1, op1 = tem;
9970 code = swap_condition (code);
9971 }
9972
9973 /* We now enter a loop during which we will try to simplify the comparison.
9974 For the most part, we only are concerned with comparisons with zero,
9975 but some things may really be comparisons with zero but not start
9976 out looking that way. */
9977
9978 while (GET_CODE (op1) == CONST_INT)
9979 {
9980 enum machine_mode mode = GET_MODE (op0);
770ae6cc 9981 unsigned int mode_width = GET_MODE_BITSIZE (mode);
5f4f0e22 9982 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
230d793d
RS
9983 int equality_comparison_p;
9984 int sign_bit_comparison_p;
9985 int unsigned_comparison_p;
5f4f0e22 9986 HOST_WIDE_INT const_op;
230d793d
RS
9987
9988 /* We only want to handle integral modes. This catches VOIDmode,
9989 CCmode, and the floating-point modes. An exception is that we
9990 can handle VOIDmode if OP0 is a COMPARE or a comparison
9991 operation. */
9992
9993 if (GET_MODE_CLASS (mode) != MODE_INT
9994 && ! (mode == VOIDmode
9995 && (GET_CODE (op0) == COMPARE
9996 || GET_RTX_CLASS (GET_CODE (op0)) == '<')))
9997 break;
9998
9999 /* Get the constant we are comparing against and turn off all bits
10000 not on in our mode. */
3c094e22 10001 const_op = trunc_int_for_mode (INTVAL (op1), mode);
b4fbaca7 10002 op1 = GEN_INT (const_op);
230d793d
RS
10003
10004 /* If we are comparing against a constant power of two and the value
951553af 10005 being compared can only have that single bit nonzero (e.g., it was
230d793d
RS
10006 `and'ed with that bit), we can replace this with a comparison
10007 with zero. */
10008 if (const_op
10009 && (code == EQ || code == NE || code == GE || code == GEU
10010 || code == LT || code == LTU)
5f4f0e22 10011 && mode_width <= HOST_BITS_PER_WIDE_INT
230d793d 10012 && exact_log2 (const_op) >= 0
e51712db 10013 && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
230d793d
RS
10014 {
10015 code = (code == EQ || code == GE || code == GEU ? NE : EQ);
10016 op1 = const0_rtx, const_op = 0;
10017 }
10018
d0ab8cd3
RK
10019 /* Similarly, if we are comparing a value known to be either -1 or
10020 0 with -1, change it to the opposite comparison against zero. */
10021
10022 if (const_op == -1
10023 && (code == EQ || code == NE || code == GT || code == LE
10024 || code == GEU || code == LTU)
10025 && num_sign_bit_copies (op0, mode) == mode_width)
10026 {
10027 code = (code == EQ || code == LE || code == GEU ? NE : EQ);
10028 op1 = const0_rtx, const_op = 0;
10029 }
10030
230d793d 10031 /* Do some canonicalizations based on the comparison code. We prefer
663522cb 10032 comparisons against zero and then prefer equality comparisons.
4803a34a 10033 If we can reduce the size of a constant, we will do that too. */
230d793d
RS
10034
10035 switch (code)
10036 {
10037 case LT:
4803a34a
RK
10038 /* < C is equivalent to <= (C - 1) */
10039 if (const_op > 0)
230d793d 10040 {
4803a34a 10041 const_op -= 1;
5f4f0e22 10042 op1 = GEN_INT (const_op);
230d793d
RS
10043 code = LE;
10044 /* ... fall through to LE case below. */
10045 }
10046 else
10047 break;
10048
10049 case LE:
4803a34a
RK
10050 /* <= C is equivalent to < (C + 1); we do this for C < 0 */
10051 if (const_op < 0)
10052 {
10053 const_op += 1;
5f4f0e22 10054 op1 = GEN_INT (const_op);
4803a34a
RK
10055 code = LT;
10056 }
230d793d
RS
10057
10058 /* If we are doing a <= 0 comparison on a value known to have
10059 a zero sign bit, we can replace this with == 0. */
10060 else if (const_op == 0
5f4f0e22 10061 && mode_width <= HOST_BITS_PER_WIDE_INT
951553af 10062 && (nonzero_bits (op0, mode)
5f4f0e22 10063 & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
230d793d
RS
10064 code = EQ;
10065 break;
10066
10067 case GE:
0f41302f 10068 /* >= C is equivalent to > (C - 1). */
4803a34a 10069 if (const_op > 0)
230d793d 10070 {
4803a34a 10071 const_op -= 1;
5f4f0e22 10072 op1 = GEN_INT (const_op);
230d793d
RS
10073 code = GT;
10074 /* ... fall through to GT below. */
10075 }
10076 else
10077 break;
10078
10079 case GT:
663522cb 10080 /* > C is equivalent to >= (C + 1); we do this for C < 0. */
4803a34a
RK
10081 if (const_op < 0)
10082 {
10083 const_op += 1;
5f4f0e22 10084 op1 = GEN_INT (const_op);
4803a34a
RK
10085 code = GE;
10086 }
230d793d
RS
10087
10088 /* If we are doing a > 0 comparison on a value known to have
10089 a zero sign bit, we can replace this with != 0. */
10090 else if (const_op == 0
5f4f0e22 10091 && mode_width <= HOST_BITS_PER_WIDE_INT
951553af 10092 && (nonzero_bits (op0, mode)
5f4f0e22 10093 & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
230d793d
RS
10094 code = NE;
10095 break;
10096
230d793d 10097 case LTU:
4803a34a
RK
10098 /* < C is equivalent to <= (C - 1). */
10099 if (const_op > 0)
10100 {
10101 const_op -= 1;
5f4f0e22 10102 op1 = GEN_INT (const_op);
4803a34a 10103 code = LEU;
0f41302f 10104 /* ... fall through ... */
4803a34a 10105 }
d0ab8cd3
RK
10106
10107 /* (unsigned) < 0x80000000 is equivalent to >= 0. */
f77aada2
JW
10108 else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10109 && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
d0ab8cd3
RK
10110 {
10111 const_op = 0, op1 = const0_rtx;
10112 code = GE;
10113 break;
10114 }
4803a34a
RK
10115 else
10116 break;
230d793d
RS
10117
10118 case LEU:
10119 /* unsigned <= 0 is equivalent to == 0 */
10120 if (const_op == 0)
10121 code = EQ;
d0ab8cd3 10122
0f41302f 10123 /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */
f77aada2
JW
10124 else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10125 && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
d0ab8cd3
RK
10126 {
10127 const_op = 0, op1 = const0_rtx;
10128 code = GE;
10129 }
230d793d
RS
10130 break;
10131
4803a34a
RK
10132 case GEU:
10133 /* >= C is equivalent to < (C - 1). */
10134 if (const_op > 1)
10135 {
10136 const_op -= 1;
5f4f0e22 10137 op1 = GEN_INT (const_op);
4803a34a 10138 code = GTU;
0f41302f 10139 /* ... fall through ... */
4803a34a 10140 }
d0ab8cd3
RK
10141
10142 /* (unsigned) >= 0x80000000 is equivalent to < 0. */
f77aada2
JW
10143 else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10144 && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
d0ab8cd3
RK
10145 {
10146 const_op = 0, op1 = const0_rtx;
10147 code = LT;
8b2e69e1 10148 break;
d0ab8cd3 10149 }
4803a34a
RK
10150 else
10151 break;
10152
230d793d
RS
10153 case GTU:
10154 /* unsigned > 0 is equivalent to != 0 */
10155 if (const_op == 0)
10156 code = NE;
d0ab8cd3
RK
10157
10158 /* (unsigned) > 0x7fffffff is equivalent to < 0. */
f77aada2
JW
10159 else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10160 && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
d0ab8cd3
RK
10161 {
10162 const_op = 0, op1 = const0_rtx;
10163 code = LT;
10164 }
230d793d 10165 break;
e9a25f70
JL
10166
10167 default:
10168 break;
230d793d
RS
10169 }
10170
10171 /* Compute some predicates to simplify code below. */
10172
10173 equality_comparison_p = (code == EQ || code == NE);
10174 sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
10175 unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
d5010e66 10176 || code == GEU);
230d793d 10177
6139ff20
RK
10178 /* If this is a sign bit comparison and we can do arithmetic in
10179 MODE, say that we will only be needing the sign bit of OP0. */
10180 if (sign_bit_comparison_p
10181 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10182 op0 = force_to_mode (op0, mode,
10183 ((HOST_WIDE_INT) 1
10184 << (GET_MODE_BITSIZE (mode) - 1)),
e3d616e3 10185 NULL_RTX, 0);
6139ff20 10186
230d793d
RS
10187 /* Now try cases based on the opcode of OP0. If none of the cases
10188 does a "continue", we exit this loop immediately after the
10189 switch. */
10190
10191 switch (GET_CODE (op0))
10192 {
10193 case ZERO_EXTRACT:
10194 /* If we are extracting a single bit from a variable position in
10195 a constant that has only a single bit set and are comparing it
663522cb 10196 with zero, we can convert this into an equality comparison
d7cd794f 10197 between the position and the location of the single bit. */
230d793d 10198
230d793d
RS
10199 if (GET_CODE (XEXP (op0, 0)) == CONST_INT
10200 && XEXP (op0, 1) == const1_rtx
10201 && equality_comparison_p && const_op == 0
d7cd794f 10202 && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
230d793d 10203 {
f76b9db2 10204 if (BITS_BIG_ENDIAN)
0d8e55d8 10205 {
da920570
ZW
10206 enum machine_mode new_mode
10207 = mode_for_extraction (EP_extzv, 1);
10208 if (new_mode == MAX_MACHINE_MODE)
10209 i = BITS_PER_WORD - 1 - i;
10210 else
10211 {
10212 mode = new_mode;
10213 i = (GET_MODE_BITSIZE (mode) - 1 - i);
10214 }
0d8e55d8 10215 }
230d793d
RS
10216
10217 op0 = XEXP (op0, 2);
5f4f0e22 10218 op1 = GEN_INT (i);
230d793d
RS
10219 const_op = i;
10220
10221 /* Result is nonzero iff shift count is equal to I. */
10222 code = reverse_condition (code);
10223 continue;
10224 }
230d793d 10225
0f41302f 10226 /* ... fall through ... */
230d793d
RS
10227
10228 case SIGN_EXTRACT:
10229 tem = expand_compound_operation (op0);
10230 if (tem != op0)
10231 {
10232 op0 = tem;
10233 continue;
10234 }
10235 break;
10236
10237 case NOT:
10238 /* If testing for equality, we can take the NOT of the constant. */
10239 if (equality_comparison_p
10240 && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
10241 {
10242 op0 = XEXP (op0, 0);
10243 op1 = tem;
10244 continue;
10245 }
10246
10247 /* If just looking at the sign bit, reverse the sense of the
10248 comparison. */
10249 if (sign_bit_comparison_p)
10250 {
10251 op0 = XEXP (op0, 0);
10252 code = (code == GE ? LT : GE);
10253 continue;
10254 }
10255 break;
10256
10257 case NEG:
10258 /* If testing for equality, we can take the NEG of the constant. */
10259 if (equality_comparison_p
10260 && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
10261 {
10262 op0 = XEXP (op0, 0);
10263 op1 = tem;
10264 continue;
10265 }
10266
10267 /* The remaining cases only apply to comparisons with zero. */
10268 if (const_op != 0)
10269 break;
10270
10271 /* When X is ABS or is known positive,
10272 (neg X) is < 0 if and only if X != 0. */
10273
10274 if (sign_bit_comparison_p
10275 && (GET_CODE (XEXP (op0, 0)) == ABS
5f4f0e22 10276 || (mode_width <= HOST_BITS_PER_WIDE_INT
951553af 10277 && (nonzero_bits (XEXP (op0, 0), mode)
5f4f0e22 10278 & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
230d793d
RS
10279 {
10280 op0 = XEXP (op0, 0);
10281 code = (code == LT ? NE : EQ);
10282 continue;
10283 }
10284
3bed8141 10285 /* If we have NEG of something whose two high-order bits are the
0f41302f 10286 same, we know that "(-a) < 0" is equivalent to "a > 0". */
3bed8141 10287 if (num_sign_bit_copies (op0, mode) >= 2)
230d793d
RS
10288 {
10289 op0 = XEXP (op0, 0);
10290 code = swap_condition (code);
10291 continue;
10292 }
10293 break;
10294
10295 case ROTATE:
10296 /* If we are testing equality and our count is a constant, we
10297 can perform the inverse operation on our RHS. */
10298 if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10299 && (tem = simplify_binary_operation (ROTATERT, mode,
10300 op1, XEXP (op0, 1))) != 0)
10301 {
10302 op0 = XEXP (op0, 0);
10303 op1 = tem;
10304 continue;
10305 }
10306
10307 /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10308 a particular bit. Convert it to an AND of a constant of that
10309 bit. This will be converted into a ZERO_EXTRACT. */
10310 if (const_op == 0 && sign_bit_comparison_p
10311 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5f4f0e22 10312 && mode_width <= HOST_BITS_PER_WIDE_INT)
230d793d 10313 {
5f4f0e22
CH
10314 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10315 ((HOST_WIDE_INT) 1
10316 << (mode_width - 1
10317 - INTVAL (XEXP (op0, 1)))));
230d793d
RS
10318 code = (code == LT ? NE : EQ);
10319 continue;
10320 }
10321
663522cb 10322 /* Fall through. */
230d793d
RS
10323
10324 case ABS:
10325 /* ABS is ignorable inside an equality comparison with zero. */
10326 if (const_op == 0 && equality_comparison_p)
10327 {
10328 op0 = XEXP (op0, 0);
10329 continue;
10330 }
10331 break;
230d793d
RS
10332
10333 case SIGN_EXTEND:
10334 /* Can simplify (compare (zero/sign_extend FOO) CONST)
663522cb 10335 to (compare FOO CONST) if CONST fits in FOO's mode and we
230d793d
RS
10336 are either testing inequality or have an unsigned comparison
10337 with ZERO_EXTEND or a signed comparison with SIGN_EXTEND. */
10338 if (! unsigned_comparison_p
10339 && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
5f4f0e22
CH
10340 <= HOST_BITS_PER_WIDE_INT)
10341 && ((unsigned HOST_WIDE_INT) const_op
e51712db 10342 < (((unsigned HOST_WIDE_INT) 1
5f4f0e22 10343 << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1)))))
230d793d
RS
10344 {
10345 op0 = XEXP (op0, 0);
10346 continue;
10347 }
10348 break;
10349
10350 case SUBREG:
a687e897 10351 /* Check for the case where we are comparing A - C1 with C2,
abc95ed3 10352 both constants are smaller than 1/2 the maximum positive
a687e897
RK
10353 value in MODE, and the comparison is equality or unsigned.
10354 In that case, if A is either zero-extended to MODE or has
10355 sufficient sign bits so that the high-order bit in MODE
10356 is a copy of the sign in the inner mode, we can prove that it is
10357 safe to do the operation in the wider mode. This simplifies
10358 many range checks. */
10359
10360 if (mode_width <= HOST_BITS_PER_WIDE_INT
10361 && subreg_lowpart_p (op0)
10362 && GET_CODE (SUBREG_REG (op0)) == PLUS
10363 && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT
10364 && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0
663522cb
KH
10365 && (-INTVAL (XEXP (SUBREG_REG (op0), 1))
10366 < (HOST_WIDE_INT) (GET_MODE_MASK (mode) / 2))
adb7a1cb 10367 && (unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode) / 2
951553af
RK
10368 && (0 == (nonzero_bits (XEXP (SUBREG_REG (op0), 0),
10369 GET_MODE (SUBREG_REG (op0)))
663522cb 10370 & ~GET_MODE_MASK (mode))
a687e897
RK
10371 || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0),
10372 GET_MODE (SUBREG_REG (op0)))
10373 > (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
10374 - GET_MODE_BITSIZE (mode)))))
10375 {
10376 op0 = SUBREG_REG (op0);
10377 continue;
10378 }
10379
fe0cf571
RK
10380 /* If the inner mode is narrower and we are extracting the low part,
10381 we can treat the SUBREG as if it were a ZERO_EXTEND. */
10382 if (subreg_lowpart_p (op0)
89f1c7f2
RS
10383 && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10384 /* Fall through */ ;
10385 else
230d793d
RS
10386 break;
10387
0f41302f 10388 /* ... fall through ... */
230d793d
RS
10389
10390 case ZERO_EXTEND:
10391 if ((unsigned_comparison_p || equality_comparison_p)
10392 && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
5f4f0e22
CH
10393 <= HOST_BITS_PER_WIDE_INT)
10394 && ((unsigned HOST_WIDE_INT) const_op
230d793d
RS
10395 < GET_MODE_MASK (GET_MODE (XEXP (op0, 0)))))
10396 {
10397 op0 = XEXP (op0, 0);
10398 continue;
10399 }
10400 break;
10401
10402 case PLUS:
20fdd649 10403 /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do
5089e22e 10404 this for equality comparisons due to pathological cases involving
230d793d 10405 overflows. */
20fdd649
RK
10406 if (equality_comparison_p
10407 && 0 != (tem = simplify_binary_operation (MINUS, mode,
10408 op1, XEXP (op0, 1))))
230d793d
RS
10409 {
10410 op0 = XEXP (op0, 0);
10411 op1 = tem;
10412 continue;
10413 }
10414
10415 /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0. */
10416 if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
10417 && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
10418 {
10419 op0 = XEXP (XEXP (op0, 0), 0);
10420 code = (code == LT ? EQ : NE);
10421 continue;
10422 }
10423 break;
10424
10425 case MINUS:
65945ec1
HPN
10426 /* We used to optimize signed comparisons against zero, but that
10427 was incorrect. Unsigned comparisons against zero (GTU, LEU)
10428 arrive here as equality comparisons, or (GEU, LTU) are
10429 optimized away. No need to special-case them. */
0bd4b461 10430
20fdd649
RK
10431 /* (eq (minus A B) C) -> (eq A (plus B C)) or
10432 (eq B (minus A C)), whichever simplifies. We can only do
10433 this for equality comparisons due to pathological cases involving
10434 overflows. */
10435 if (equality_comparison_p
10436 && 0 != (tem = simplify_binary_operation (PLUS, mode,
10437 XEXP (op0, 1), op1)))
10438 {
10439 op0 = XEXP (op0, 0);
10440 op1 = tem;
10441 continue;
10442 }
10443
10444 if (equality_comparison_p
10445 && 0 != (tem = simplify_binary_operation (MINUS, mode,
10446 XEXP (op0, 0), op1)))
10447 {
10448 op0 = XEXP (op0, 1);
10449 op1 = tem;
10450 continue;
10451 }
10452
230d793d
RS
10453 /* The sign bit of (minus (ashiftrt X C) X), where C is the number
10454 of bits in X minus 1, is one iff X > 0. */
10455 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
10456 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10457 && INTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
10458 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10459 {
10460 op0 = XEXP (op0, 1);
10461 code = (code == GE ? LE : GT);
10462 continue;
10463 }
10464 break;
10465
10466 case XOR:
10467 /* (eq (xor A B) C) -> (eq A (xor B C)). This is a simplification
10468 if C is zero or B is a constant. */
10469 if (equality_comparison_p
10470 && 0 != (tem = simplify_binary_operation (XOR, mode,
10471 XEXP (op0, 1), op1)))
10472 {
10473 op0 = XEXP (op0, 0);
10474 op1 = tem;
10475 continue;
10476 }
10477 break;
10478
10479 case EQ: case NE:
69bc0a1f
JH
10480 case UNEQ: case LTGT:
10481 case LT: case LTU: case UNLT: case LE: case LEU: case UNLE:
10482 case GT: case GTU: case UNGT: case GE: case GEU: case UNGE:
10483 case UNORDERED: case ORDERED:
230d793d
RS
10484 /* We can't do anything if OP0 is a condition code value, rather
10485 than an actual data value. */
10486 if (const_op != 0
10487#ifdef HAVE_cc0
10488 || XEXP (op0, 0) == cc0_rtx
10489#endif
10490 || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
10491 break;
10492
10493 /* Get the two operands being compared. */
10494 if (GET_CODE (XEXP (op0, 0)) == COMPARE)
10495 tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
10496 else
10497 tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
10498
10499 /* Check for the cases where we simply want the result of the
10500 earlier test or the opposite of that result. */
9a915772 10501 if (code == NE || code == EQ
5f4f0e22 10502 || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
3f508eca 10503 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
230d793d 10504 && (STORE_FLAG_VALUE
5f4f0e22
CH
10505 & (((HOST_WIDE_INT) 1
10506 << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
aa6683f7 10507 && (code == LT || code == GE)))
230d793d 10508 {
aa6683f7
GK
10509 enum rtx_code new_code;
10510 if (code == LT || code == NE)
10511 new_code = GET_CODE (op0);
10512 else
10513 new_code = combine_reversed_comparison_code (op0);
23190837 10514
aa6683f7 10515 if (new_code != UNKNOWN)
9a915772 10516 {
aa6683f7
GK
10517 code = new_code;
10518 op0 = tem;
10519 op1 = tem1;
9a915772
JH
10520 continue;
10521 }
230d793d
RS
10522 }
10523 break;
10524
10525 case IOR:
10526 /* The sign bit of (ior (plus X (const_int -1)) X) is non-zero
10527 iff X <= 0. */
10528 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
10529 && XEXP (XEXP (op0, 0), 1) == constm1_rtx
10530 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10531 {
10532 op0 = XEXP (op0, 1);
10533 code = (code == GE ? GT : LE);
10534 continue;
10535 }
10536 break;
10537
10538 case AND:
10539 /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1). This
10540 will be converted to a ZERO_EXTRACT later. */
10541 if (const_op == 0 && equality_comparison_p
45620ed4 10542 && GET_CODE (XEXP (op0, 0)) == ASHIFT
230d793d
RS
10543 && XEXP (XEXP (op0, 0), 0) == const1_rtx)
10544 {
10545 op0 = simplify_and_const_int
f1c6ba8b
RK
10546 (op0, mode, gen_rtx_LSHIFTRT (mode,
10547 XEXP (op0, 1),
10548 XEXP (XEXP (op0, 0), 1)),
5f4f0e22 10549 (HOST_WIDE_INT) 1);
230d793d
RS
10550 continue;
10551 }
10552
10553 /* If we are comparing (and (lshiftrt X C1) C2) for equality with
10554 zero and X is a comparison and C1 and C2 describe only bits set
10555 in STORE_FLAG_VALUE, we can compare with X. */
10556 if (const_op == 0 && equality_comparison_p
5f4f0e22 10557 && mode_width <= HOST_BITS_PER_WIDE_INT
230d793d
RS
10558 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10559 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10560 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10561 && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
5f4f0e22 10562 && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
230d793d
RS
10563 {
10564 mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10565 << INTVAL (XEXP (XEXP (op0, 0), 1)));
663522cb 10566 if ((~STORE_FLAG_VALUE & mask) == 0
230d793d
RS
10567 && (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (op0, 0), 0))) == '<'
10568 || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
10569 && GET_RTX_CLASS (GET_CODE (tem)) == '<')))
10570 {
10571 op0 = XEXP (XEXP (op0, 0), 0);
10572 continue;
10573 }
10574 }
10575
10576 /* If we are doing an equality comparison of an AND of a bit equal
10577 to the sign bit, replace this with a LT or GE comparison of
10578 the underlying value. */
10579 if (equality_comparison_p
10580 && const_op == 0
10581 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5f4f0e22 10582 && mode_width <= HOST_BITS_PER_WIDE_INT
230d793d 10583 && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
e51712db 10584 == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
230d793d
RS
10585 {
10586 op0 = XEXP (op0, 0);
10587 code = (code == EQ ? GE : LT);
10588 continue;
10589 }
10590
10591 /* If this AND operation is really a ZERO_EXTEND from a narrower
10592 mode, the constant fits within that mode, and this is either an
10593 equality or unsigned comparison, try to do this comparison in
10594 the narrower mode. */
10595 if ((equality_comparison_p || unsigned_comparison_p)
10596 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10597 && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
10598 & GET_MODE_MASK (mode))
10599 + 1)) >= 0
10600 && const_op >> i == 0
10601 && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode)
10602 {
10603 op0 = gen_lowpart_for_combine (tmode, XEXP (op0, 0));
10604 continue;
10605 }
e5e809f4
JL
10606
10607 /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1 fits
10608 in both M1 and M2 and the SUBREG is either paradoxical or
10609 represents the low part, permute the SUBREG and the AND and
10610 try again. */
10611 if (GET_CODE (XEXP (op0, 0)) == SUBREG
c5c76735 10612 && (0
9ec36da5 10613#ifdef WORD_REGISTER_OPERATIONS
c5c76735
JL
10614 || ((mode_width
10615 > (GET_MODE_BITSIZE
10616 (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
10617 && mode_width <= BITS_PER_WORD)
9ec36da5 10618#endif
c5c76735
JL
10619 || ((mode_width
10620 <= (GET_MODE_BITSIZE
10621 (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
10622 && subreg_lowpart_p (XEXP (op0, 0))))
adc05e6c
JL
10623#ifndef WORD_REGISTER_OPERATIONS
10624 /* It is unsafe to commute the AND into the SUBREG if the SUBREG
10625 is paradoxical and WORD_REGISTER_OPERATIONS is not defined.
10626 As originally written the upper bits have a defined value
10627 due to the AND operation. However, if we commute the AND
10628 inside the SUBREG then they no longer have defined values
10629 and the meaning of the code has been changed. */
10630 && (GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)))
10631 <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))
10632#endif
e5e809f4
JL
10633 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10634 && mode_width <= HOST_BITS_PER_WIDE_INT
10635 && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
10636 <= HOST_BITS_PER_WIDE_INT)
663522cb
KH
10637 && (INTVAL (XEXP (op0, 1)) & ~mask) == 0
10638 && 0 == (~GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
9ec36da5 10639 & INTVAL (XEXP (op0, 1)))
e51712db
KG
10640 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1)) != mask
10641 && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
9ec36da5 10642 != GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
663522cb 10643
e5e809f4
JL
10644 {
10645 op0
10646 = gen_lowpart_for_combine
10647 (mode,
10648 gen_binary (AND, GET_MODE (SUBREG_REG (XEXP (op0, 0))),
10649 SUBREG_REG (XEXP (op0, 0)), XEXP (op0, 1)));
10650 continue;
10651 }
10652
9f8e169e
RH
10653 /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
10654 (eq (and (lshiftrt X) 1) 0). */
10655 if (const_op == 0 && equality_comparison_p
10656 && XEXP (op0, 1) == const1_rtx
10657 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10658 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == NOT)
10659 {
10660 op0 = simplify_and_const_int
f1c6ba8b
RK
10661 (op0, mode,
10662 gen_rtx_LSHIFTRT (mode, XEXP (XEXP (XEXP (op0, 0), 0), 0),
10663 XEXP (XEXP (op0, 0), 1)),
9f8e169e
RH
10664 (HOST_WIDE_INT) 1);
10665 code = (code == NE ? EQ : NE);
10666 continue;
10667 }
230d793d
RS
10668 break;
10669
10670 case ASHIFT:
45620ed4 10671 /* If we have (compare (ashift FOO N) (const_int C)) and
230d793d 10672 the high order N bits of FOO (N+1 if an inequality comparison)
951553af 10673 are known to be zero, we can do this by comparing FOO with C
230d793d
RS
10674 shifted right N bits so long as the low-order N bits of C are
10675 zero. */
10676 if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10677 && INTVAL (XEXP (op0, 1)) >= 0
10678 && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
5f4f0e22
CH
10679 < HOST_BITS_PER_WIDE_INT)
10680 && ((const_op
34785d05 10681 & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
5f4f0e22 10682 && mode_width <= HOST_BITS_PER_WIDE_INT
951553af 10683 && (nonzero_bits (XEXP (op0, 0), mode)
663522cb
KH
10684 & ~(mask >> (INTVAL (XEXP (op0, 1))
10685 + ! equality_comparison_p))) == 0)
230d793d 10686 {
7ce787fe
NC
10687 /* We must perform a logical shift, not an arithmetic one,
10688 as we want the top N bits of C to be zero. */
aaaec114 10689 unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
663522cb 10690
7ce787fe 10691 temp >>= INTVAL (XEXP (op0, 1));
aaaec114 10692 op1 = GEN_INT (trunc_int_for_mode (temp, mode));
230d793d
RS
10693 op0 = XEXP (op0, 0);
10694 continue;
10695 }
10696
dfbe1b2f 10697 /* If we are doing a sign bit comparison, it means we are testing
230d793d 10698 a particular bit. Convert it to the appropriate AND. */
dfbe1b2f 10699 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
5f4f0e22 10700 && mode_width <= HOST_BITS_PER_WIDE_INT)
230d793d 10701 {
5f4f0e22
CH
10702 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10703 ((HOST_WIDE_INT) 1
10704 << (mode_width - 1
10705 - INTVAL (XEXP (op0, 1)))));
230d793d
RS
10706 code = (code == LT ? NE : EQ);
10707 continue;
10708 }
dfbe1b2f
RK
10709
10710 /* If this an equality comparison with zero and we are shifting
10711 the low bit to the sign bit, we can convert this to an AND of the
10712 low-order bit. */
10713 if (const_op == 0 && equality_comparison_p
10714 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10715 && INTVAL (XEXP (op0, 1)) == mode_width - 1)
10716 {
5f4f0e22
CH
10717 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10718 (HOST_WIDE_INT) 1);
dfbe1b2f
RK
10719 continue;
10720 }
230d793d
RS
10721 break;
10722
10723 case ASHIFTRT:
d0ab8cd3
RK
10724 /* If this is an equality comparison with zero, we can do this
10725 as a logical shift, which might be much simpler. */
10726 if (equality_comparison_p && const_op == 0
10727 && GET_CODE (XEXP (op0, 1)) == CONST_INT)
10728 {
10729 op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
10730 XEXP (op0, 0),
10731 INTVAL (XEXP (op0, 1)));
10732 continue;
10733 }
10734
230d793d
RS
10735 /* If OP0 is a sign extension and CODE is not an unsigned comparison,
10736 do the comparison in a narrower mode. */
10737 if (! unsigned_comparison_p
10738 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10739 && GET_CODE (XEXP (op0, 0)) == ASHIFT
10740 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10741 && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
22331794 10742 MODE_INT, 1)) != BLKmode
5f4f0e22 10743 && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
663522cb 10744 || ((unsigned HOST_WIDE_INT) -const_op
5f4f0e22 10745 <= GET_MODE_MASK (tmode))))
230d793d
RS
10746 {
10747 op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0));
10748 continue;
10749 }
10750
14a774a9
RK
10751 /* Likewise if OP0 is a PLUS of a sign extension with a
10752 constant, which is usually represented with the PLUS
10753 between the shifts. */
10754 if (! unsigned_comparison_p
10755 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10756 && GET_CODE (XEXP (op0, 0)) == PLUS
10757 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10758 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
10759 && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
10760 && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10761 MODE_INT, 1)) != BLKmode
10762 && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
663522cb 10763 || ((unsigned HOST_WIDE_INT) -const_op
14a774a9
RK
10764 <= GET_MODE_MASK (tmode))))
10765 {
10766 rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
10767 rtx add_const = XEXP (XEXP (op0, 0), 1);
10768 rtx new_const = gen_binary (ASHIFTRT, GET_MODE (op0), add_const,
10769 XEXP (op0, 1));
10770
10771 op0 = gen_binary (PLUS, tmode,
10772 gen_lowpart_for_combine (tmode, inner),
10773 new_const);
10774 continue;
10775 }
10776
0f41302f 10777 /* ... fall through ... */
230d793d
RS
10778 case LSHIFTRT:
10779 /* If we have (compare (xshiftrt FOO N) (const_int C)) and
951553af 10780 the low order N bits of FOO are known to be zero, we can do this
230d793d
RS
10781 by comparing FOO with C shifted left N bits so long as no
10782 overflow occurs. */
10783 if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10784 && INTVAL (XEXP (op0, 1)) >= 0
5f4f0e22
CH
10785 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10786 && mode_width <= HOST_BITS_PER_WIDE_INT
951553af 10787 && (nonzero_bits (XEXP (op0, 0), mode)
5f4f0e22 10788 & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
230d793d
RS
10789 && (const_op == 0
10790 || (floor_log2 (const_op) + INTVAL (XEXP (op0, 1))
10791 < mode_width)))
10792 {
10793 const_op <<= INTVAL (XEXP (op0, 1));
5f4f0e22 10794 op1 = GEN_INT (const_op);
230d793d
RS
10795 op0 = XEXP (op0, 0);
10796 continue;
10797 }
10798
10799 /* If we are using this shift to extract just the sign bit, we
10800 can replace this with an LT or GE comparison. */
10801 if (const_op == 0
10802 && (equality_comparison_p || sign_bit_comparison_p)
10803 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10804 && INTVAL (XEXP (op0, 1)) == mode_width - 1)
10805 {
10806 op0 = XEXP (op0, 0);
10807 code = (code == NE || code == GT ? LT : GE);
10808 continue;
10809 }
10810 break;
663522cb 10811
e9a25f70
JL
10812 default:
10813 break;
230d793d
RS
10814 }
10815
10816 break;
10817 }
10818
10819 /* Now make any compound operations involved in this comparison. Then,
76d31c63 10820 check for an outmost SUBREG on OP0 that is not doing anything or is
230d793d
RS
10821 paradoxical. The latter case can only occur when it is known that the
10822 "extra" bits will be zero. Therefore, it is safe to remove the SUBREG.
10823 We can never remove a SUBREG for a non-equality comparison because the
10824 sign bit is in a different place in the underlying object. */
10825
10826 op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
10827 op1 = make_compound_operation (op1, SET);
10828
10829 if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
10830 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10831 && (code == NE || code == EQ)
10832 && ((GET_MODE_SIZE (GET_MODE (op0))
10833 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))))
10834 {
10835 op0 = SUBREG_REG (op0);
10836 op1 = gen_lowpart_for_combine (GET_MODE (op0), op1);
10837 }
10838
10839 else if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
10840 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10841 && (code == NE || code == EQ)
ac49a949
RS
10842 && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
10843 <= HOST_BITS_PER_WIDE_INT)
951553af 10844 && (nonzero_bits (SUBREG_REG (op0), GET_MODE (SUBREG_REG (op0)))
663522cb 10845 & ~GET_MODE_MASK (GET_MODE (op0))) == 0
230d793d
RS
10846 && (tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)),
10847 op1),
951553af 10848 (nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
663522cb 10849 & ~GET_MODE_MASK (GET_MODE (op0))) == 0))
230d793d
RS
10850 op0 = SUBREG_REG (op0), op1 = tem;
10851
10852 /* We now do the opposite procedure: Some machines don't have compare
10853 insns in all modes. If OP0's mode is an integer mode smaller than a
10854 word and we can't do a compare in that mode, see if there is a larger
a687e897
RK
10855 mode for which we can do the compare. There are a number of cases in
10856 which we can use the wider mode. */
230d793d
RS
10857
10858 mode = GET_MODE (op0);
10859 if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10860 && GET_MODE_SIZE (mode) < UNITS_PER_WORD
ef89d648 10861 && ! have_insn_for (COMPARE, mode))
230d793d 10862 for (tmode = GET_MODE_WIDER_MODE (mode);
5f4f0e22
CH
10863 (tmode != VOIDmode
10864 && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
230d793d 10865 tmode = GET_MODE_WIDER_MODE (tmode))
ef89d648 10866 if (have_insn_for (COMPARE, tmode))
230d793d 10867 {
951553af 10868 /* If the only nonzero bits in OP0 and OP1 are those in the
a687e897
RK
10869 narrower mode and this is an equality or unsigned comparison,
10870 we can use the wider mode. Similarly for sign-extended
7e4dc511 10871 values, in which case it is true for all comparisons. */
a687e897
RK
10872 if (((code == EQ || code == NE
10873 || code == GEU || code == GTU || code == LEU || code == LTU)
663522cb
KH
10874 && (nonzero_bits (op0, tmode) & ~GET_MODE_MASK (mode)) == 0
10875 && (nonzero_bits (op1, tmode) & ~GET_MODE_MASK (mode)) == 0)
7e4dc511
RK
10876 || ((num_sign_bit_copies (op0, tmode)
10877 > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
a687e897 10878 && (num_sign_bit_copies (op1, tmode)
58744483 10879 > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))))
a687e897 10880 {
14a774a9
RK
10881 /* If OP0 is an AND and we don't have an AND in MODE either,
10882 make a new AND in the proper mode. */
10883 if (GET_CODE (op0) == AND
ef89d648 10884 && !have_insn_for (AND, mode))
14a774a9
RK
10885 op0 = gen_binary (AND, tmode,
10886 gen_lowpart_for_combine (tmode,
10887 XEXP (op0, 0)),
10888 gen_lowpart_for_combine (tmode,
10889 XEXP (op0, 1)));
10890
a687e897
RK
10891 op0 = gen_lowpart_for_combine (tmode, op0);
10892 op1 = gen_lowpart_for_combine (tmode, op1);
10893 break;
10894 }
230d793d 10895
a687e897
RK
10896 /* If this is a test for negative, we can make an explicit
10897 test of the sign bit. */
10898
10899 if (op1 == const0_rtx && (code == LT || code == GE)
10900 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
230d793d 10901 {
a687e897
RK
10902 op0 = gen_binary (AND, tmode,
10903 gen_lowpart_for_combine (tmode, op0),
5f4f0e22
CH
10904 GEN_INT ((HOST_WIDE_INT) 1
10905 << (GET_MODE_BITSIZE (mode) - 1)));
230d793d 10906 code = (code == LT) ? NE : EQ;
a687e897 10907 break;
230d793d 10908 }
230d793d
RS
10909 }
10910
b7a775b2
RK
10911#ifdef CANONICALIZE_COMPARISON
10912 /* If this machine only supports a subset of valid comparisons, see if we
10913 can convert an unsupported one into a supported one. */
10914 CANONICALIZE_COMPARISON (code, op0, op1);
10915#endif
10916
230d793d
RS
10917 *pop0 = op0;
10918 *pop1 = op1;
10919
10920 return code;
10921}
10922\f
9a915772
JH
10923/* Like jump.c' reversed_comparison_code, but use combine infrastructure for
10924 searching backward. */
c3ffea50 10925static enum rtx_code
9a915772
JH
10926combine_reversed_comparison_code (exp)
10927 rtx exp;
230d793d 10928{
9a915772
JH
10929 enum rtx_code code1 = reversed_comparison_code (exp, NULL);
10930 rtx x;
10931
10932 if (code1 != UNKNOWN
10933 || GET_MODE_CLASS (GET_MODE (XEXP (exp, 0))) != MODE_CC)
10934 return code1;
10935 /* Otherwise try and find where the condition codes were last set and
10936 use that. */
c3ffea50
AJ
10937 x = get_last_value (XEXP (exp, 0));
10938 if (!x || GET_CODE (x) != COMPARE)
9a915772
JH
10939 return UNKNOWN;
10940 return reversed_comparison_code_parts (GET_CODE (exp),
10941 XEXP (x, 0), XEXP (x, 1), NULL);
10942}
10943/* Return comparison with reversed code of EXP and operands OP0 and OP1.
10944 Return NULL_RTX in case we fail to do the reversal. */
10945static rtx
10946reversed_comparison (exp, mode, op0, op1)
10947 rtx exp, op0, op1;
10948 enum machine_mode mode;
10949{
10950 enum rtx_code reversed_code = combine_reversed_comparison_code (exp);
10951 if (reversed_code == UNKNOWN)
10952 return NULL_RTX;
10953 else
10954 return gen_binary (reversed_code, mode, op0, op1);
230d793d
RS
10955}
10956\f
10957/* Utility function for following routine. Called when X is part of a value
10958 being stored into reg_last_set_value. Sets reg_last_set_table_tick
10959 for each register mentioned. Similar to mention_regs in cse.c */
10960
10961static void
10962update_table_tick (x)
10963 rtx x;
10964{
10965 register enum rtx_code code = GET_CODE (x);
6f7d635c 10966 register const char *fmt = GET_RTX_FORMAT (code);
230d793d
RS
10967 register int i;
10968
10969 if (code == REG)
10970 {
770ae6cc
RK
10971 unsigned int regno = REGNO (x);
10972 unsigned int endregno
10973 = regno + (regno < FIRST_PSEUDO_REGISTER
10974 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
10975 unsigned int r;
230d793d 10976
770ae6cc
RK
10977 for (r = regno; r < endregno; r++)
10978 reg_last_set_table_tick[r] = label_tick;
230d793d
RS
10979
10980 return;
10981 }
663522cb 10982
230d793d
RS
10983 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
10984 /* Note that we can't have an "E" in values stored; see
10985 get_last_value_validate. */
10986 if (fmt[i] == 'e')
10987 update_table_tick (XEXP (x, i));
10988}
10989
10990/* Record that REG is set to VALUE in insn INSN. If VALUE is zero, we
10991 are saying that the register is clobbered and we no longer know its
7988fd36
RK
10992 value. If INSN is zero, don't update reg_last_set; this is only permitted
10993 with VALUE also zero and is used to invalidate the register. */
230d793d
RS
10994
10995static void
10996record_value_for_reg (reg, insn, value)
10997 rtx reg;
10998 rtx insn;
10999 rtx value;
11000{
770ae6cc
RK
11001 unsigned int regno = REGNO (reg);
11002 unsigned int endregno
11003 = regno + (regno < FIRST_PSEUDO_REGISTER
11004 ? HARD_REGNO_NREGS (regno, GET_MODE (reg)) : 1);
11005 unsigned int i;
230d793d
RS
11006
11007 /* If VALUE contains REG and we have a previous value for REG, substitute
11008 the previous value. */
11009 if (value && insn && reg_overlap_mentioned_p (reg, value))
11010 {
11011 rtx tem;
11012
11013 /* Set things up so get_last_value is allowed to see anything set up to
11014 our insn. */
11015 subst_low_cuid = INSN_CUID (insn);
663522cb 11016 tem = get_last_value (reg);
230d793d 11017
14a774a9
RK
11018 /* If TEM is simply a binary operation with two CLOBBERs as operands,
11019 it isn't going to be useful and will take a lot of time to process,
11020 so just use the CLOBBER. */
11021
230d793d 11022 if (tem)
14a774a9
RK
11023 {
11024 if ((GET_RTX_CLASS (GET_CODE (tem)) == '2'
11025 || GET_RTX_CLASS (GET_CODE (tem)) == 'c')
11026 && GET_CODE (XEXP (tem, 0)) == CLOBBER
11027 && GET_CODE (XEXP (tem, 1)) == CLOBBER)
11028 tem = XEXP (tem, 0);
11029
11030 value = replace_rtx (copy_rtx (value), reg, tem);
11031 }
230d793d
RS
11032 }
11033
11034 /* For each register modified, show we don't know its value, that
ef026f91
RS
11035 we don't know about its bitwise content, that its value has been
11036 updated, and that we don't know the location of the death of the
11037 register. */
770ae6cc 11038 for (i = regno; i < endregno; i++)
230d793d
RS
11039 {
11040 if (insn)
11041 reg_last_set[i] = insn;
770ae6cc 11042
230d793d 11043 reg_last_set_value[i] = 0;
ef026f91
RS
11044 reg_last_set_mode[i] = 0;
11045 reg_last_set_nonzero_bits[i] = 0;
11046 reg_last_set_sign_bit_copies[i] = 0;
230d793d
RS
11047 reg_last_death[i] = 0;
11048 }
11049
11050 /* Mark registers that are being referenced in this value. */
11051 if (value)
11052 update_table_tick (value);
11053
11054 /* Now update the status of each register being set.
11055 If someone is using this register in this block, set this register
11056 to invalid since we will get confused between the two lives in this
11057 basic block. This makes using this register always invalid. In cse, we
11058 scan the table to invalidate all entries using this register, but this
11059 is too much work for us. */
11060
11061 for (i = regno; i < endregno; i++)
11062 {
11063 reg_last_set_label[i] = label_tick;
11064 if (value && reg_last_set_table_tick[i] == label_tick)
11065 reg_last_set_invalid[i] = 1;
11066 else
11067 reg_last_set_invalid[i] = 0;
11068 }
11069
11070 /* The value being assigned might refer to X (like in "x++;"). In that
11071 case, we must replace it with (clobber (const_int 0)) to prevent
11072 infinite loops. */
9a893315 11073 if (value && ! get_last_value_validate (&value, insn,
230d793d
RS
11074 reg_last_set_label[regno], 0))
11075 {
11076 value = copy_rtx (value);
9a893315
JW
11077 if (! get_last_value_validate (&value, insn,
11078 reg_last_set_label[regno], 1))
230d793d
RS
11079 value = 0;
11080 }
11081
55310dad
RK
11082 /* For the main register being modified, update the value, the mode, the
11083 nonzero bits, and the number of sign bit copies. */
11084
230d793d
RS
11085 reg_last_set_value[regno] = value;
11086
55310dad
RK
11087 if (value)
11088 {
2afabb48 11089 subst_low_cuid = INSN_CUID (insn);
55310dad
RK
11090 reg_last_set_mode[regno] = GET_MODE (reg);
11091 reg_last_set_nonzero_bits[regno] = nonzero_bits (value, GET_MODE (reg));
11092 reg_last_set_sign_bit_copies[regno]
11093 = num_sign_bit_copies (value, GET_MODE (reg));
11094 }
230d793d
RS
11095}
11096
230d793d 11097/* Called via note_stores from record_dead_and_set_regs to handle one
84832317
MM
11098 SET or CLOBBER in an insn. DATA is the instruction in which the
11099 set is occurring. */
230d793d
RS
11100
11101static void
84832317 11102record_dead_and_set_regs_1 (dest, setter, data)
230d793d 11103 rtx dest, setter;
84832317 11104 void *data;
230d793d 11105{
84832317
MM
11106 rtx record_dead_insn = (rtx) data;
11107
ca89d290
RK
11108 if (GET_CODE (dest) == SUBREG)
11109 dest = SUBREG_REG (dest);
11110
230d793d
RS
11111 if (GET_CODE (dest) == REG)
11112 {
11113 /* If we are setting the whole register, we know its value. Otherwise
11114 show that we don't know the value. We can handle SUBREG in
11115 some cases. */
11116 if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
11117 record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
11118 else if (GET_CODE (setter) == SET
11119 && GET_CODE (SET_DEST (setter)) == SUBREG
11120 && SUBREG_REG (SET_DEST (setter)) == dest
90bf8081 11121 && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
230d793d 11122 && subreg_lowpart_p (SET_DEST (setter)))
d0ab8cd3
RK
11123 record_value_for_reg (dest, record_dead_insn,
11124 gen_lowpart_for_combine (GET_MODE (dest),
11125 SET_SRC (setter)));
230d793d 11126 else
5f4f0e22 11127 record_value_for_reg (dest, record_dead_insn, NULL_RTX);
230d793d
RS
11128 }
11129 else if (GET_CODE (dest) == MEM
11130 /* Ignore pushes, they clobber nothing. */
11131 && ! push_operand (dest, GET_MODE (dest)))
11132 mem_last_set = INSN_CUID (record_dead_insn);
11133}
11134
11135/* Update the records of when each REG was most recently set or killed
11136 for the things done by INSN. This is the last thing done in processing
11137 INSN in the combiner loop.
11138
ef026f91
RS
11139 We update reg_last_set, reg_last_set_value, reg_last_set_mode,
11140 reg_last_set_nonzero_bits, reg_last_set_sign_bit_copies, reg_last_death,
11141 and also the similar information mem_last_set (which insn most recently
11142 modified memory) and last_call_cuid (which insn was the most recent
11143 subroutine call). */
230d793d
RS
11144
11145static void
11146record_dead_and_set_regs (insn)
11147 rtx insn;
11148{
11149 register rtx link;
770ae6cc 11150 unsigned int i;
55310dad 11151
230d793d
RS
11152 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
11153 {
dbc131f3
RK
11154 if (REG_NOTE_KIND (link) == REG_DEAD
11155 && GET_CODE (XEXP (link, 0)) == REG)
11156 {
770ae6cc
RK
11157 unsigned int regno = REGNO (XEXP (link, 0));
11158 unsigned int endregno
dbc131f3
RK
11159 = regno + (regno < FIRST_PSEUDO_REGISTER
11160 ? HARD_REGNO_NREGS (regno, GET_MODE (XEXP (link, 0)))
11161 : 1);
dbc131f3
RK
11162
11163 for (i = regno; i < endregno; i++)
11164 reg_last_death[i] = insn;
11165 }
230d793d 11166 else if (REG_NOTE_KIND (link) == REG_INC)
5f4f0e22 11167 record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
230d793d
RS
11168 }
11169
11170 if (GET_CODE (insn) == CALL_INSN)
55310dad
RK
11171 {
11172 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
11173 if (call_used_regs[i])
11174 {
11175 reg_last_set_value[i] = 0;
ef026f91
RS
11176 reg_last_set_mode[i] = 0;
11177 reg_last_set_nonzero_bits[i] = 0;
11178 reg_last_set_sign_bit_copies[i] = 0;
55310dad
RK
11179 reg_last_death[i] = 0;
11180 }
11181
11182 last_call_cuid = mem_last_set = INSN_CUID (insn);
11183 }
230d793d 11184
84832317 11185 note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
230d793d 11186}
732f2ac9 11187
732f2ac9
JJ
11188/* If a SUBREG has the promoted bit set, it is in fact a property of the
11189 register present in the SUBREG, so for each such SUBREG go back and
11190 adjust nonzero and sign bit information of the registers that are
11191 known to have some zero/sign bits set.
11192
11193 This is needed because when combine blows the SUBREGs away, the
11194 information on zero/sign bits is lost and further combines can be
11195 missed because of that. */
11196
11197static void
11198record_promoted_value (insn, subreg)
663522cb
KH
11199 rtx insn;
11200 rtx subreg;
732f2ac9 11201{
4a71b24f 11202 rtx links, set;
770ae6cc 11203 unsigned int regno = REGNO (SUBREG_REG (subreg));
732f2ac9
JJ
11204 enum machine_mode mode = GET_MODE (subreg);
11205
25af74a0 11206 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
732f2ac9
JJ
11207 return;
11208
663522cb 11209 for (links = LOG_LINKS (insn); links;)
732f2ac9
JJ
11210 {
11211 insn = XEXP (links, 0);
11212 set = single_set (insn);
11213
11214 if (! set || GET_CODE (SET_DEST (set)) != REG
11215 || REGNO (SET_DEST (set)) != regno
11216 || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
11217 {
11218 links = XEXP (links, 1);
11219 continue;
11220 }
11221
663522cb
KH
11222 if (reg_last_set[regno] == insn)
11223 {
732f2ac9 11224 if (SUBREG_PROMOTED_UNSIGNED_P (subreg))
663522cb
KH
11225 reg_last_set_nonzero_bits[regno] &= GET_MODE_MASK (mode);
11226 }
732f2ac9
JJ
11227
11228 if (GET_CODE (SET_SRC (set)) == REG)
11229 {
11230 regno = REGNO (SET_SRC (set));
11231 links = LOG_LINKS (insn);
11232 }
11233 else
11234 break;
11235 }
11236}
11237
11238/* Scan X for promoted SUBREGs. For each one found,
11239 note what it implies to the registers used in it. */
11240
11241static void
11242check_promoted_subreg (insn, x)
663522cb
KH
11243 rtx insn;
11244 rtx x;
732f2ac9
JJ
11245{
11246 if (GET_CODE (x) == SUBREG && SUBREG_PROMOTED_VAR_P (x)
11247 && GET_CODE (SUBREG_REG (x)) == REG)
11248 record_promoted_value (insn, x);
11249 else
11250 {
11251 const char *format = GET_RTX_FORMAT (GET_CODE (x));
11252 int i, j;
11253
11254 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
663522cb 11255 switch (format[i])
732f2ac9
JJ
11256 {
11257 case 'e':
11258 check_promoted_subreg (insn, XEXP (x, i));
11259 break;
11260 case 'V':
11261 case 'E':
11262 if (XVEC (x, i) != 0)
11263 for (j = 0; j < XVECLEN (x, i); j++)
11264 check_promoted_subreg (insn, XVECEXP (x, i, j));
11265 break;
11266 }
11267 }
11268}
230d793d
RS
11269\f
11270/* Utility routine for the following function. Verify that all the registers
11271 mentioned in *LOC are valid when *LOC was part of a value set when
11272 label_tick == TICK. Return 0 if some are not.
11273
11274 If REPLACE is non-zero, replace the invalid reference with
11275 (clobber (const_int 0)) and return 1. This replacement is useful because
11276 we often can get useful information about the form of a value (e.g., if
11277 it was produced by a shift that always produces -1 or 0) even though
11278 we don't know exactly what registers it was produced from. */
11279
11280static int
9a893315 11281get_last_value_validate (loc, insn, tick, replace)
230d793d 11282 rtx *loc;
9a893315 11283 rtx insn;
230d793d
RS
11284 int tick;
11285 int replace;
11286{
11287 rtx x = *loc;
6f7d635c 11288 const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
230d793d
RS
11289 int len = GET_RTX_LENGTH (GET_CODE (x));
11290 int i;
11291
11292 if (GET_CODE (x) == REG)
11293 {
770ae6cc
RK
11294 unsigned int regno = REGNO (x);
11295 unsigned int endregno
11296 = regno + (regno < FIRST_PSEUDO_REGISTER
11297 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
11298 unsigned int j;
230d793d
RS
11299
11300 for (j = regno; j < endregno; j++)
11301 if (reg_last_set_invalid[j]
57cf50a4
GRK
11302 /* If this is a pseudo-register that was only set once and not
11303 live at the beginning of the function, it is always valid. */
663522cb 11304 || (! (regno >= FIRST_PSEUDO_REGISTER
57cf50a4 11305 && REG_N_SETS (regno) == 1
770ae6cc
RK
11306 && (! REGNO_REG_SET_P
11307 (BASIC_BLOCK (0)->global_live_at_start, regno)))
230d793d
RS
11308 && reg_last_set_label[j] > tick))
11309 {
11310 if (replace)
38a448ca 11311 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
230d793d
RS
11312 return replace;
11313 }
11314
11315 return 1;
11316 }
9a893315
JW
11317 /* If this is a memory reference, make sure that there were
11318 no stores after it that might have clobbered the value. We don't
11319 have alias info, so we assume any store invalidates it. */
11320 else if (GET_CODE (x) == MEM && ! RTX_UNCHANGING_P (x)
11321 && INSN_CUID (insn) <= mem_last_set)
11322 {
11323 if (replace)
38a448ca 11324 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
9a893315
JW
11325 return replace;
11326 }
230d793d
RS
11327
11328 for (i = 0; i < len; i++)
11329 if ((fmt[i] == 'e'
9a893315 11330 && get_last_value_validate (&XEXP (x, i), insn, tick, replace) == 0)
230d793d
RS
11331 /* Don't bother with these. They shouldn't occur anyway. */
11332 || fmt[i] == 'E')
11333 return 0;
11334
11335 /* If we haven't found a reason for it to be invalid, it is valid. */
11336 return 1;
11337}
11338
11339/* Get the last value assigned to X, if known. Some registers
11340 in the value may be replaced with (clobber (const_int 0)) if their value
11341 is known longer known reliably. */
11342
11343static rtx
11344get_last_value (x)
11345 rtx x;
11346{
770ae6cc 11347 unsigned int regno;
230d793d
RS
11348 rtx value;
11349
11350 /* If this is a non-paradoxical SUBREG, get the value of its operand and
11351 then convert it to the desired mode. If this is a paradoxical SUBREG,
0f41302f 11352 we cannot predict what values the "extra" bits might have. */
230d793d
RS
11353 if (GET_CODE (x) == SUBREG
11354 && subreg_lowpart_p (x)
11355 && (GET_MODE_SIZE (GET_MODE (x))
11356 <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
11357 && (value = get_last_value (SUBREG_REG (x))) != 0)
11358 return gen_lowpart_for_combine (GET_MODE (x), value);
11359
11360 if (GET_CODE (x) != REG)
11361 return 0;
11362
11363 regno = REGNO (x);
11364 value = reg_last_set_value[regno];
11365
57cf50a4
GRK
11366 /* If we don't have a value, or if it isn't for this basic block and
11367 it's either a hard register, set more than once, or it's a live
663522cb 11368 at the beginning of the function, return 0.
57cf50a4 11369
663522cb 11370 Because if it's not live at the beginnning of the function then the reg
57cf50a4
GRK
11371 is always set before being used (is never used without being set).
11372 And, if it's set only once, and it's always set before use, then all
11373 uses must have the same last value, even if it's not from this basic
11374 block. */
230d793d
RS
11375
11376 if (value == 0
57cf50a4
GRK
11377 || (reg_last_set_label[regno] != label_tick
11378 && (regno < FIRST_PSEUDO_REGISTER
11379 || REG_N_SETS (regno) != 1
770ae6cc
RK
11380 || (REGNO_REG_SET_P
11381 (BASIC_BLOCK (0)->global_live_at_start, regno)))))
230d793d
RS
11382 return 0;
11383
4255220d 11384 /* If the value was set in a later insn than the ones we are processing,
ca4cd906 11385 we can't use it even if the register was only set once. */
bcd49eb7 11386 if (INSN_CUID (reg_last_set[regno]) >= subst_low_cuid)
ca4cd906 11387 return 0;
d0ab8cd3
RK
11388
11389 /* If the value has all its registers valid, return it. */
9a893315
JW
11390 if (get_last_value_validate (&value, reg_last_set[regno],
11391 reg_last_set_label[regno], 0))
230d793d
RS
11392 return value;
11393
11394 /* Otherwise, make a copy and replace any invalid register with
11395 (clobber (const_int 0)). If that fails for some reason, return 0. */
11396
11397 value = copy_rtx (value);
9a893315
JW
11398 if (get_last_value_validate (&value, reg_last_set[regno],
11399 reg_last_set_label[regno], 1))
230d793d
RS
11400 return value;
11401
11402 return 0;
11403}
11404\f
11405/* Return nonzero if expression X refers to a REG or to memory
11406 that is set in an instruction more recent than FROM_CUID. */
11407
11408static int
11409use_crosses_set_p (x, from_cuid)
11410 register rtx x;
11411 int from_cuid;
11412{
6f7d635c 11413 register const char *fmt;
230d793d
RS
11414 register int i;
11415 register enum rtx_code code = GET_CODE (x);
11416
11417 if (code == REG)
11418 {
770ae6cc
RK
11419 unsigned int regno = REGNO (x);
11420 unsigned endreg = regno + (regno < FIRST_PSEUDO_REGISTER
663522cb
KH
11421 ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
11422
230d793d
RS
11423#ifdef PUSH_ROUNDING
11424 /* Don't allow uses of the stack pointer to be moved,
11425 because we don't know whether the move crosses a push insn. */
f73ad30e 11426 if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
230d793d
RS
11427 return 1;
11428#endif
770ae6cc 11429 for (; regno < endreg; regno++)
e28f5732
RK
11430 if (reg_last_set[regno]
11431 && INSN_CUID (reg_last_set[regno]) > from_cuid)
11432 return 1;
11433 return 0;
230d793d
RS
11434 }
11435
11436 if (code == MEM && mem_last_set > from_cuid)
11437 return 1;
11438
11439 fmt = GET_RTX_FORMAT (code);
11440
11441 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11442 {
11443 if (fmt[i] == 'E')
11444 {
11445 register int j;
11446 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11447 if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid))
11448 return 1;
11449 }
11450 else if (fmt[i] == 'e'
11451 && use_crosses_set_p (XEXP (x, i), from_cuid))
11452 return 1;
11453 }
11454 return 0;
11455}
11456\f
11457/* Define three variables used for communication between the following
11458 routines. */
11459
770ae6cc 11460static unsigned int reg_dead_regno, reg_dead_endregno;
230d793d
RS
11461static int reg_dead_flag;
11462
11463/* Function called via note_stores from reg_dead_at_p.
11464
663522cb 11465 If DEST is within [reg_dead_regno, reg_dead_endregno), set
230d793d
RS
11466 reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET. */
11467
11468static void
84832317 11469reg_dead_at_p_1 (dest, x, data)
230d793d
RS
11470 rtx dest;
11471 rtx x;
84832317 11472 void *data ATTRIBUTE_UNUSED;
230d793d 11473{
770ae6cc 11474 unsigned int regno, endregno;
230d793d
RS
11475
11476 if (GET_CODE (dest) != REG)
11477 return;
11478
11479 regno = REGNO (dest);
663522cb 11480 endregno = regno + (regno < FIRST_PSEUDO_REGISTER
230d793d
RS
11481 ? HARD_REGNO_NREGS (regno, GET_MODE (dest)) : 1);
11482
11483 if (reg_dead_endregno > regno && reg_dead_regno < endregno)
11484 reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
11485}
11486
11487/* Return non-zero if REG is known to be dead at INSN.
11488
11489 We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER
11490 referencing REG, it is dead. If we hit a SET referencing REG, it is
11491 live. Otherwise, see if it is live or dead at the start of the basic
6e25d159
RK
11492 block we are in. Hard regs marked as being live in NEWPAT_USED_REGS
11493 must be assumed to be always live. */
230d793d
RS
11494
11495static int
11496reg_dead_at_p (reg, insn)
11497 rtx reg;
11498 rtx insn;
11499{
770ae6cc
RK
11500 int block;
11501 unsigned int i;
230d793d
RS
11502
11503 /* Set variables for reg_dead_at_p_1. */
11504 reg_dead_regno = REGNO (reg);
11505 reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER
11506 ? HARD_REGNO_NREGS (reg_dead_regno,
11507 GET_MODE (reg))
11508 : 1);
11509
11510 reg_dead_flag = 0;
11511
6e25d159
RK
11512 /* Check that reg isn't mentioned in NEWPAT_USED_REGS. */
11513 if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
11514 {
11515 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11516 if (TEST_HARD_REG_BIT (newpat_used_regs, i))
11517 return 0;
11518 }
11519
230d793d
RS
11520 /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or
11521 beginning of function. */
60715d0b 11522 for (; insn && GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != BARRIER;
230d793d
RS
11523 insn = prev_nonnote_insn (insn))
11524 {
84832317 11525 note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
230d793d
RS
11526 if (reg_dead_flag)
11527 return reg_dead_flag == 1 ? 1 : 0;
11528
11529 if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
11530 return 1;
11531 }
11532
11533 /* Get the basic block number that we were in. */
11534 if (insn == 0)
11535 block = 0;
11536 else
11537 {
11538 for (block = 0; block < n_basic_blocks; block++)
3b413743 11539 if (insn == BLOCK_HEAD (block))
230d793d
RS
11540 break;
11541
11542 if (block == n_basic_blocks)
11543 return 0;
11544 }
11545
11546 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
e881bb1b 11547 if (REGNO_REG_SET_P (BASIC_BLOCK (block)->global_live_at_start, i))
230d793d
RS
11548 return 0;
11549
11550 return 1;
11551}
6e25d159
RK
11552\f
11553/* Note hard registers in X that are used. This code is similar to
11554 that in flow.c, but much simpler since we don't care about pseudos. */
11555
11556static void
11557mark_used_regs_combine (x)
11558 rtx x;
11559{
770ae6cc
RK
11560 RTX_CODE code = GET_CODE (x);
11561 unsigned int regno;
6e25d159
RK
11562 int i;
11563
11564 switch (code)
11565 {
11566 case LABEL_REF:
11567 case SYMBOL_REF:
11568 case CONST_INT:
11569 case CONST:
11570 case CONST_DOUBLE:
11571 case PC:
11572 case ADDR_VEC:
11573 case ADDR_DIFF_VEC:
11574 case ASM_INPUT:
11575#ifdef HAVE_cc0
11576 /* CC0 must die in the insn after it is set, so we don't need to take
11577 special note of it here. */
11578 case CC0:
11579#endif
11580 return;
11581
11582 case CLOBBER:
11583 /* If we are clobbering a MEM, mark any hard registers inside the
11584 address as used. */
11585 if (GET_CODE (XEXP (x, 0)) == MEM)
11586 mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
11587 return;
11588
11589 case REG:
11590 regno = REGNO (x);
11591 /* A hard reg in a wide mode may really be multiple registers.
11592 If so, mark all of them just like the first. */
11593 if (regno < FIRST_PSEUDO_REGISTER)
11594 {
770ae6cc
RK
11595 unsigned int endregno, r;
11596
6e25d159
RK
11597 /* None of this applies to the stack, frame or arg pointers */
11598 if (regno == STACK_POINTER_REGNUM
11599#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
11600 || regno == HARD_FRAME_POINTER_REGNUM
11601#endif
11602#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
11603 || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
11604#endif
11605 || regno == FRAME_POINTER_REGNUM)
11606 return;
11607
770ae6cc
RK
11608 endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11609 for (r = regno; r < endregno; r++)
11610 SET_HARD_REG_BIT (newpat_used_regs, r);
6e25d159
RK
11611 }
11612 return;
11613
11614 case SET:
11615 {
11616 /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
11617 the address. */
11618 register rtx testreg = SET_DEST (x);
11619
e048778f
RK
11620 while (GET_CODE (testreg) == SUBREG
11621 || GET_CODE (testreg) == ZERO_EXTRACT
11622 || GET_CODE (testreg) == SIGN_EXTRACT
11623 || GET_CODE (testreg) == STRICT_LOW_PART)
6e25d159
RK
11624 testreg = XEXP (testreg, 0);
11625
11626 if (GET_CODE (testreg) == MEM)
11627 mark_used_regs_combine (XEXP (testreg, 0));
11628
11629 mark_used_regs_combine (SET_SRC (x));
6e25d159 11630 }
e9a25f70
JL
11631 return;
11632
11633 default:
11634 break;
6e25d159
RK
11635 }
11636
11637 /* Recursively scan the operands of this expression. */
11638
11639 {
6f7d635c 11640 register const char *fmt = GET_RTX_FORMAT (code);
6e25d159
RK
11641
11642 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11643 {
663522cb 11644 if (fmt[i] == 'e')
6e25d159 11645 mark_used_regs_combine (XEXP (x, i));
663522cb
KH
11646 else if (fmt[i] == 'E')
11647 {
11648 register int j;
6e25d159 11649
663522cb
KH
11650 for (j = 0; j < XVECLEN (x, i); j++)
11651 mark_used_regs_combine (XVECEXP (x, i, j));
11652 }
6e25d159
RK
11653 }
11654 }
11655}
230d793d
RS
11656\f
11657/* Remove register number REGNO from the dead registers list of INSN.
11658
11659 Return the note used to record the death, if there was one. */
11660
11661rtx
11662remove_death (regno, insn)
770ae6cc 11663 unsigned int regno;
230d793d
RS
11664 rtx insn;
11665{
11666 register rtx note = find_regno_note (insn, REG_DEAD, regno);
11667
11668 if (note)
1a26b032 11669 {
b1f21e0a 11670 REG_N_DEATHS (regno)--;
1a26b032
RK
11671 remove_note (insn, note);
11672 }
230d793d
RS
11673
11674 return note;
11675}
11676
11677/* For each register (hardware or pseudo) used within expression X, if its
11678 death is in an instruction with cuid between FROM_CUID (inclusive) and
11679 TO_INSN (exclusive), put a REG_DEAD note for that register in the
663522cb 11680 list headed by PNOTES.
230d793d 11681
6eb12cef
RK
11682 That said, don't move registers killed by maybe_kill_insn.
11683
230d793d
RS
11684 This is done when X is being merged by combination into TO_INSN. These
11685 notes will then be distributed as needed. */
11686
11687static void
6eb12cef 11688move_deaths (x, maybe_kill_insn, from_cuid, to_insn, pnotes)
230d793d 11689 rtx x;
6eb12cef 11690 rtx maybe_kill_insn;
230d793d
RS
11691 int from_cuid;
11692 rtx to_insn;
11693 rtx *pnotes;
11694{
6f7d635c 11695 register const char *fmt;
230d793d
RS
11696 register int len, i;
11697 register enum rtx_code code = GET_CODE (x);
11698
11699 if (code == REG)
11700 {
770ae6cc 11701 unsigned int regno = REGNO (x);
230d793d 11702 register rtx where_dead = reg_last_death[regno];
e340018d
JW
11703 register rtx before_dead, after_dead;
11704
6eb12cef
RK
11705 /* Don't move the register if it gets killed in between from and to */
11706 if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
770ae6cc 11707 && ! reg_referenced_p (x, maybe_kill_insn))
6eb12cef
RK
11708 return;
11709
e340018d
JW
11710 /* WHERE_DEAD could be a USE insn made by combine, so first we
11711 make sure that we have insns with valid INSN_CUID values. */
11712 before_dead = where_dead;
11713 while (before_dead && INSN_UID (before_dead) > max_uid_cuid)
11714 before_dead = PREV_INSN (before_dead);
770ae6cc 11715
e340018d
JW
11716 after_dead = where_dead;
11717 while (after_dead && INSN_UID (after_dead) > max_uid_cuid)
11718 after_dead = NEXT_INSN (after_dead);
11719
11720 if (before_dead && after_dead
11721 && INSN_CUID (before_dead) >= from_cuid
11722 && (INSN_CUID (after_dead) < INSN_CUID (to_insn)
11723 || (where_dead != after_dead
11724 && INSN_CUID (after_dead) == INSN_CUID (to_insn))))
230d793d 11725 {
dbc131f3 11726 rtx note = remove_death (regno, where_dead);
230d793d
RS
11727
11728 /* It is possible for the call above to return 0. This can occur
11729 when reg_last_death points to I2 or I1 that we combined with.
dbc131f3
RK
11730 In that case make a new note.
11731
11732 We must also check for the case where X is a hard register
11733 and NOTE is a death note for a range of hard registers
11734 including X. In that case, we must put REG_DEAD notes for
11735 the remaining registers in place of NOTE. */
11736
11737 if (note != 0 && regno < FIRST_PSEUDO_REGISTER
11738 && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
24e46fc4 11739 > GET_MODE_SIZE (GET_MODE (x))))
dbc131f3 11740 {
770ae6cc
RK
11741 unsigned int deadregno = REGNO (XEXP (note, 0));
11742 unsigned int deadend
dbc131f3
RK
11743 = (deadregno + HARD_REGNO_NREGS (deadregno,
11744 GET_MODE (XEXP (note, 0))));
770ae6cc
RK
11745 unsigned int ourend
11746 = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11747 unsigned int i;
dbc131f3
RK
11748
11749 for (i = deadregno; i < deadend; i++)
11750 if (i < regno || i >= ourend)
11751 REG_NOTES (where_dead)
38a448ca
RH
11752 = gen_rtx_EXPR_LIST (REG_DEAD,
11753 gen_rtx_REG (reg_raw_mode[i], i),
11754 REG_NOTES (where_dead));
dbc131f3 11755 }
770ae6cc 11756
24e46fc4
JW
11757 /* If we didn't find any note, or if we found a REG_DEAD note that
11758 covers only part of the given reg, and we have a multi-reg hard
fabd69e8
RK
11759 register, then to be safe we must check for REG_DEAD notes
11760 for each register other than the first. They could have
11761 their own REG_DEAD notes lying around. */
24e46fc4
JW
11762 else if ((note == 0
11763 || (note != 0
11764 && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11765 < GET_MODE_SIZE (GET_MODE (x)))))
11766 && regno < FIRST_PSEUDO_REGISTER
fabd69e8
RK
11767 && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1)
11768 {
770ae6cc
RK
11769 unsigned int ourend
11770 = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11771 unsigned int i, offset;
fabd69e8
RK
11772 rtx oldnotes = 0;
11773
24e46fc4
JW
11774 if (note)
11775 offset = HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0)));
11776 else
11777 offset = 1;
11778
11779 for (i = regno + offset; i < ourend; i++)
38a448ca 11780 move_deaths (gen_rtx_REG (reg_raw_mode[i], i),
6eb12cef 11781 maybe_kill_insn, from_cuid, to_insn, &oldnotes);
fabd69e8 11782 }
230d793d 11783
dbc131f3 11784 if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
230d793d
RS
11785 {
11786 XEXP (note, 1) = *pnotes;
11787 *pnotes = note;
11788 }
11789 else
38a448ca 11790 *pnotes = gen_rtx_EXPR_LIST (REG_DEAD, x, *pnotes);
1a26b032 11791
b1f21e0a 11792 REG_N_DEATHS (regno)++;
230d793d
RS
11793 }
11794
11795 return;
11796 }
11797
11798 else if (GET_CODE (x) == SET)
11799 {
11800 rtx dest = SET_DEST (x);
11801
6eb12cef 11802 move_deaths (SET_SRC (x), maybe_kill_insn, from_cuid, to_insn, pnotes);
230d793d 11803
a7c99304
RK
11804 /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
11805 that accesses one word of a multi-word item, some
11806 piece of everything register in the expression is used by
11807 this insn, so remove any old death. */
ddef6bc7 11808 /* ??? So why do we test for equality of the sizes? */
a7c99304
RK
11809
11810 if (GET_CODE (dest) == ZERO_EXTRACT
11811 || GET_CODE (dest) == STRICT_LOW_PART
11812 || (GET_CODE (dest) == SUBREG
11813 && (((GET_MODE_SIZE (GET_MODE (dest))
11814 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
11815 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
11816 + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
230d793d 11817 {
6eb12cef 11818 move_deaths (dest, maybe_kill_insn, from_cuid, to_insn, pnotes);
a7c99304 11819 return;
230d793d
RS
11820 }
11821
a7c99304
RK
11822 /* If this is some other SUBREG, we know it replaces the entire
11823 value, so use that as the destination. */
11824 if (GET_CODE (dest) == SUBREG)
11825 dest = SUBREG_REG (dest);
11826
11827 /* If this is a MEM, adjust deaths of anything used in the address.
11828 For a REG (the only other possibility), the entire value is
11829 being replaced so the old value is not used in this insn. */
230d793d
RS
11830
11831 if (GET_CODE (dest) == MEM)
6eb12cef
RK
11832 move_deaths (XEXP (dest, 0), maybe_kill_insn, from_cuid,
11833 to_insn, pnotes);
230d793d
RS
11834 return;
11835 }
11836
11837 else if (GET_CODE (x) == CLOBBER)
11838 return;
11839
11840 len = GET_RTX_LENGTH (code);
11841 fmt = GET_RTX_FORMAT (code);
11842
11843 for (i = 0; i < len; i++)
11844 {
11845 if (fmt[i] == 'E')
11846 {
11847 register int j;
11848 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
6eb12cef
RK
11849 move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_cuid,
11850 to_insn, pnotes);
230d793d
RS
11851 }
11852 else if (fmt[i] == 'e')
6eb12cef 11853 move_deaths (XEXP (x, i), maybe_kill_insn, from_cuid, to_insn, pnotes);
230d793d
RS
11854 }
11855}
11856\f
a7c99304
RK
11857/* Return 1 if X is the target of a bit-field assignment in BODY, the
11858 pattern of an insn. X must be a REG. */
230d793d
RS
11859
11860static int
a7c99304
RK
11861reg_bitfield_target_p (x, body)
11862 rtx x;
230d793d
RS
11863 rtx body;
11864{
11865 int i;
11866
11867 if (GET_CODE (body) == SET)
a7c99304
RK
11868 {
11869 rtx dest = SET_DEST (body);
11870 rtx target;
770ae6cc 11871 unsigned int regno, tregno, endregno, endtregno;
a7c99304
RK
11872
11873 if (GET_CODE (dest) == ZERO_EXTRACT)
11874 target = XEXP (dest, 0);
11875 else if (GET_CODE (dest) == STRICT_LOW_PART)
11876 target = SUBREG_REG (XEXP (dest, 0));
11877 else
11878 return 0;
11879
11880 if (GET_CODE (target) == SUBREG)
11881 target = SUBREG_REG (target);
11882
11883 if (GET_CODE (target) != REG)
11884 return 0;
11885
11886 tregno = REGNO (target), regno = REGNO (x);
11887 if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
11888 return target == x;
11889
11890 endtregno = tregno + HARD_REGNO_NREGS (tregno, GET_MODE (target));
11891 endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11892
11893 return endregno > tregno && regno < endtregno;
11894 }
230d793d
RS
11895
11896 else if (GET_CODE (body) == PARALLEL)
11897 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
a7c99304 11898 if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
230d793d
RS
11899 return 1;
11900
11901 return 0;
663522cb 11902}
230d793d
RS
11903\f
11904/* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
11905 as appropriate. I3 and I2 are the insns resulting from the combination
11906 insns including FROM (I2 may be zero).
11907
11908 ELIM_I2 and ELIM_I1 are either zero or registers that we know will
11909 not need REG_DEAD notes because they are being substituted for. This
11910 saves searching in the most common cases.
11911
11912 Each note in the list is either ignored or placed on some insns, depending
11913 on the type of note. */
11914
11915static void
11916distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
11917 rtx notes;
11918 rtx from_insn;
11919 rtx i3, i2;
11920 rtx elim_i2, elim_i1;
11921{
11922 rtx note, next_note;
11923 rtx tem;
11924
11925 for (note = notes; note; note = next_note)
11926 {
11927 rtx place = 0, place2 = 0;
11928
11929 /* If this NOTE references a pseudo register, ensure it references
11930 the latest copy of that register. */
11931 if (XEXP (note, 0) && GET_CODE (XEXP (note, 0)) == REG
11932 && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER)
11933 XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))];
11934
11935 next_note = XEXP (note, 1);
11936 switch (REG_NOTE_KIND (note))
11937 {
c9903b44 11938 case REG_BR_PROB:
4db384c9 11939 case REG_BR_PRED:
c9903b44
DE
11940 case REG_EXEC_COUNT:
11941 /* Doesn't matter much where we put this, as long as it's somewhere.
11942 It is preferable to keep these notes on branches, which is most
11943 likely to be i3. */
11944 place = i3;
11945 break;
11946
f7cfa78d
GS
11947 case REG_NON_LOCAL_GOTO:
11948 if (GET_CODE (i3) == JUMP_INSN)
11949 place = i3;
11950 else if (i2 && GET_CODE (i2) == JUMP_INSN)
11951 place = i2;
11952 else
11953 abort();
11954 break;
11955
4b7c585f 11956 case REG_EH_REGION:
662795a8
RH
11957 /* These notes must remain with the call or trapping instruction. */
11958 if (GET_CODE (i3) == CALL_INSN)
11959 place = i3;
11960 else if (i2 && GET_CODE (i2) == CALL_INSN)
11961 place = i2;
11962 else if (flag_non_call_exceptions)
11963 {
11964 if (may_trap_p (i3))
11965 place = i3;
11966 else if (i2 && may_trap_p (i2))
11967 place = i2;
11968 /* ??? Otherwise assume we've combined things such that we
11969 can now prove that the instructions can't trap. Drop the
11970 note in this case. */
11971 }
11972 else
11973 abort ();
11974 break;
11975
ca3920ad 11976 case REG_NORETURN:
ab61c93f 11977 case REG_SETJMP:
0e403ec3
AS
11978 /* These notes must remain with the call. It should not be
11979 possible for both I2 and I3 to be a call. */
663522cb 11980 if (GET_CODE (i3) == CALL_INSN)
4b7c585f
JL
11981 place = i3;
11982 else if (i2 && GET_CODE (i2) == CALL_INSN)
11983 place = i2;
11984 else
11985 abort ();
11986 break;
11987
230d793d 11988 case REG_UNUSED:
07d0cbdd 11989 /* Any clobbers for i3 may still exist, and so we must process
176c9e6b
JW
11990 REG_UNUSED notes from that insn.
11991
11992 Any clobbers from i2 or i1 can only exist if they were added by
11993 recog_for_combine. In that case, recog_for_combine created the
11994 necessary REG_UNUSED notes. Trying to keep any original
11995 REG_UNUSED notes from these insns can cause incorrect output
11996 if it is for the same register as the original i3 dest.
11997 In that case, we will notice that the register is set in i3,
11998 and then add a REG_UNUSED note for the destination of i3, which
07d0cbdd
JW
11999 is wrong. However, it is possible to have REG_UNUSED notes from
12000 i2 or i1 for register which were both used and clobbered, so
12001 we keep notes from i2 or i1 if they will turn into REG_DEAD
12002 notes. */
176c9e6b 12003
230d793d
RS
12004 /* If this register is set or clobbered in I3, put the note there
12005 unless there is one already. */
07d0cbdd 12006 if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
230d793d 12007 {
07d0cbdd
JW
12008 if (from_insn != i3)
12009 break;
12010
230d793d
RS
12011 if (! (GET_CODE (XEXP (note, 0)) == REG
12012 ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
12013 : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
12014 place = i3;
12015 }
12016 /* Otherwise, if this register is used by I3, then this register
12017 now dies here, so we must put a REG_DEAD note here unless there
12018 is one already. */
12019 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
12020 && ! (GET_CODE (XEXP (note, 0)) == REG
770ae6cc
RK
12021 ? find_regno_note (i3, REG_DEAD,
12022 REGNO (XEXP (note, 0)))
230d793d
RS
12023 : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
12024 {
12025 PUT_REG_NOTE_KIND (note, REG_DEAD);
12026 place = i3;
12027 }
12028 break;
12029
12030 case REG_EQUAL:
12031 case REG_EQUIV:
9ae8ffe7 12032 case REG_NOALIAS:
230d793d
RS
12033 /* These notes say something about results of an insn. We can
12034 only support them if they used to be on I3 in which case they
a687e897
RK
12035 remain on I3. Otherwise they are ignored.
12036
12037 If the note refers to an expression that is not a constant, we
12038 must also ignore the note since we cannot tell whether the
12039 equivalence is still true. It might be possible to do
12040 slightly better than this (we only have a problem if I2DEST
12041 or I1DEST is present in the expression), but it doesn't
12042 seem worth the trouble. */
12043
12044 if (from_insn == i3
12045 && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
230d793d
RS
12046 place = i3;
12047 break;
12048
12049 case REG_INC:
12050 case REG_NO_CONFLICT:
230d793d
RS
12051 /* These notes say something about how a register is used. They must
12052 be present on any use of the register in I2 or I3. */
12053 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
12054 place = i3;
12055
12056 if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
12057 {
12058 if (place)
12059 place2 = i2;
12060 else
12061 place = i2;
12062 }
12063 break;
12064
e55b4486
RH
12065 case REG_LABEL:
12066 /* This can show up in several ways -- either directly in the
12067 pattern, or hidden off in the constant pool with (or without?)
12068 a REG_EQUAL note. */
12069 /* ??? Ignore the without-reg_equal-note problem for now. */
12070 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
12071 || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
12072 && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12073 && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
12074 place = i3;
12075
12076 if (i2
12077 && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
663522cb 12078 || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
e55b4486
RH
12079 && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12080 && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
12081 {
12082 if (place)
12083 place2 = i2;
12084 else
12085 place = i2;
12086 }
12087 break;
12088
c1194d74 12089 case REG_NONNEG:
230d793d 12090 case REG_WAS_0:
c1194d74
JW
12091 /* These notes say something about the value of a register prior
12092 to the execution of an insn. It is too much trouble to see
12093 if the note is still correct in all situations. It is better
12094 to simply delete it. */
230d793d
RS
12095 break;
12096
12097 case REG_RETVAL:
12098 /* If the insn previously containing this note still exists,
12099 put it back where it was. Otherwise move it to the previous
12100 insn. Adjust the corresponding REG_LIBCALL note. */
12101 if (GET_CODE (from_insn) != NOTE)
12102 place = from_insn;
12103 else
12104 {
5f4f0e22 12105 tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
230d793d
RS
12106 place = prev_real_insn (from_insn);
12107 if (tem && place)
12108 XEXP (tem, 0) = place;
c71e1201
AO
12109 /* If we're deleting the last remaining instruction of a
12110 libcall sequence, don't add the notes. */
12111 else if (XEXP (note, 0) == from_insn)
12112 tem = place = 0;
230d793d
RS
12113 }
12114 break;
12115
12116 case REG_LIBCALL:
12117 /* This is handled similarly to REG_RETVAL. */
12118 if (GET_CODE (from_insn) != NOTE)
12119 place = from_insn;
12120 else
12121 {
5f4f0e22 12122 tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX);
230d793d
RS
12123 place = next_real_insn (from_insn);
12124 if (tem && place)
12125 XEXP (tem, 0) = place;
c71e1201
AO
12126 /* If we're deleting the last remaining instruction of a
12127 libcall sequence, don't add the notes. */
12128 else if (XEXP (note, 0) == from_insn)
12129 tem = place = 0;
230d793d
RS
12130 }
12131 break;
12132
12133 case REG_DEAD:
12134 /* If the register is used as an input in I3, it dies there.
12135 Similarly for I2, if it is non-zero and adjacent to I3.
12136
12137 If the register is not used as an input in either I3 or I2
12138 and it is not one of the registers we were supposed to eliminate,
12139 there are two possibilities. We might have a non-adjacent I2
12140 or we might have somehow eliminated an additional register
12141 from a computation. For example, we might have had A & B where
12142 we discover that B will always be zero. In this case we will
12143 eliminate the reference to A.
12144
12145 In both cases, we must search to see if we can find a previous
12146 use of A and put the death note there. */
12147
6e2d1486
RK
12148 if (from_insn
12149 && GET_CODE (from_insn) == CALL_INSN
663522cb 12150 && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
6e2d1486
RK
12151 place = from_insn;
12152 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
230d793d
RS
12153 place = i3;
12154 else if (i2 != 0 && next_nonnote_insn (i2) == i3
12155 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12156 place = i2;
12157
03afaf36
R
12158 if (rtx_equal_p (XEXP (note, 0), elim_i2)
12159 || rtx_equal_p (XEXP (note, 0), elim_i1))
230d793d
RS
12160 break;
12161
12162 if (place == 0)
38d8473f 12163 {
d3a923ee
RH
12164 basic_block bb = BASIC_BLOCK (this_basic_block);
12165
12166 for (tem = PREV_INSN (i3); place == 0; tem = PREV_INSN (tem))
38d8473f 12167 {
2c3c49de 12168 if (! INSN_P (tem))
d3a923ee
RH
12169 {
12170 if (tem == bb->head)
12171 break;
12172 continue;
12173 }
12174
38d8473f
RK
12175 /* If the register is being set at TEM, see if that is all
12176 TEM is doing. If so, delete TEM. Otherwise, make this
12177 into a REG_UNUSED note instead. */
12178 if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
12179 {
12180 rtx set = single_set (tem);
e5e809f4 12181 rtx inner_dest = 0;
e51712db 12182#ifdef HAVE_cc0
f5c97640 12183 rtx cc0_setter = NULL_RTX;
e51712db 12184#endif
e5e809f4
JL
12185
12186 if (set != 0)
12187 for (inner_dest = SET_DEST (set);
663522cb
KH
12188 (GET_CODE (inner_dest) == STRICT_LOW_PART
12189 || GET_CODE (inner_dest) == SUBREG
12190 || GET_CODE (inner_dest) == ZERO_EXTRACT);
e5e809f4
JL
12191 inner_dest = XEXP (inner_dest, 0))
12192 ;
38d8473f
RK
12193
12194 /* Verify that it was the set, and not a clobber that
663522cb 12195 modified the register.
f5c97640
RH
12196
12197 CC0 targets must be careful to maintain setter/user
12198 pairs. If we cannot delete the setter due to side
12199 effects, mark the user with an UNUSED note instead
12200 of deleting it. */
38d8473f
RK
12201
12202 if (set != 0 && ! side_effects_p (SET_SRC (set))
f5c97640
RH
12203 && rtx_equal_p (XEXP (note, 0), inner_dest)
12204#ifdef HAVE_cc0
12205 && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
12206 || ((cc0_setter = prev_cc0_setter (tem)) != NULL
12207 && sets_cc0_p (PATTERN (cc0_setter)) > 0))
12208#endif
12209 )
38d8473f
RK
12210 {
12211 /* Move the notes and links of TEM elsewhere.
663522cb 12212 This might delete other dead insns recursively.
38d8473f
RK
12213 First set the pattern to something that won't use
12214 any register. */
12215
12216 PATTERN (tem) = pc_rtx;
12217
12218 distribute_notes (REG_NOTES (tem), tem, tem,
12219 NULL_RTX, NULL_RTX, NULL_RTX);
12220 distribute_links (LOG_LINKS (tem));
12221
12222 PUT_CODE (tem, NOTE);
12223 NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
12224 NOTE_SOURCE_FILE (tem) = 0;
f5c97640
RH
12225
12226#ifdef HAVE_cc0
12227 /* Delete the setter too. */
12228 if (cc0_setter)
12229 {
12230 PATTERN (cc0_setter) = pc_rtx;
12231
12232 distribute_notes (REG_NOTES (cc0_setter),
12233 cc0_setter, cc0_setter,
12234 NULL_RTX, NULL_RTX, NULL_RTX);
12235 distribute_links (LOG_LINKS (cc0_setter));
12236
12237 PUT_CODE (cc0_setter, NOTE);
d3a923ee
RH
12238 NOTE_LINE_NUMBER (cc0_setter)
12239 = NOTE_INSN_DELETED;
f5c97640
RH
12240 NOTE_SOURCE_FILE (cc0_setter) = 0;
12241 }
12242#endif
38d8473f 12243 }
e5e809f4
JL
12244 /* If the register is both set and used here, put the
12245 REG_DEAD note here, but place a REG_UNUSED note
12246 here too unless there already is one. */
12247 else if (reg_referenced_p (XEXP (note, 0),
12248 PATTERN (tem)))
12249 {
12250 place = tem;
12251
12252 if (! find_regno_note (tem, REG_UNUSED,
12253 REGNO (XEXP (note, 0))))
12254 REG_NOTES (tem)
c5c76735 12255 = gen_rtx_EXPR_LIST (REG_UNUSED, XEXP (note, 0),
9e6a5703 12256 REG_NOTES (tem));
e5e809f4 12257 }
38d8473f
RK
12258 else
12259 {
12260 PUT_REG_NOTE_KIND (note, REG_UNUSED);
663522cb 12261
38d8473f
RK
12262 /* If there isn't already a REG_UNUSED note, put one
12263 here. */
12264 if (! find_regno_note (tem, REG_UNUSED,
12265 REGNO (XEXP (note, 0))))
12266 place = tem;
12267 break;
d3a923ee
RH
12268 }
12269 }
12270 else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
12271 || (GET_CODE (tem) == CALL_INSN
12272 && find_reg_fusage (tem, USE, XEXP (note, 0))))
12273 {
12274 place = tem;
12275
12276 /* If we are doing a 3->2 combination, and we have a
12277 register which formerly died in i3 and was not used
12278 by i2, which now no longer dies in i3 and is used in
12279 i2 but does not die in i2, and place is between i2
12280 and i3, then we may need to move a link from place to
12281 i2. */
12282 if (i2 && INSN_UID (place) <= max_uid_cuid
12283 && INSN_CUID (place) > INSN_CUID (i2)
663522cb
KH
12284 && from_insn
12285 && INSN_CUID (from_insn) > INSN_CUID (i2)
d3a923ee
RH
12286 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12287 {
12288 rtx links = LOG_LINKS (place);
12289 LOG_LINKS (place) = 0;
12290 distribute_links (links);
12291 }
12292 break;
12293 }
12294
12295 if (tem == bb->head)
230d793d 12296 break;
38d8473f 12297 }
663522cb 12298
d3a923ee
RH
12299 /* We haven't found an insn for the death note and it
12300 is still a REG_DEAD note, but we have hit the beginning
12301 of the block. If the existing life info says the reg
715e7fbc 12302 was dead, there's nothing left to do. Otherwise, we'll
e7139885
RH
12303 need to do a global life update after combine. */
12304 if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
12305 && REGNO_REG_SET_P (bb->global_live_at_start,
12306 REGNO (XEXP (note, 0))))
e2cce0cf 12307 {
770ae6cc
RK
12308 SET_BIT (refresh_blocks, this_basic_block);
12309 need_refresh = 1;
e2cce0cf 12310 }
38d8473f 12311 }
230d793d
RS
12312
12313 /* If the register is set or already dead at PLACE, we needn't do
e5e809f4
JL
12314 anything with this note if it is still a REG_DEAD note.
12315 We can here if it is set at all, not if is it totally replace,
12316 which is what `dead_or_set_p' checks, so also check for it being
12317 set partially. */
12318
230d793d
RS
12319 if (place && REG_NOTE_KIND (note) == REG_DEAD)
12320 {
770ae6cc 12321 unsigned int regno = REGNO (XEXP (note, 0));
230d793d 12322
e7139885
RH
12323 /* Similarly, if the instruction on which we want to place
12324 the note is a noop, we'll need do a global live update
12325 after we remove them in delete_noop_moves. */
12326 if (noop_move_p (place))
12327 {
12328 SET_BIT (refresh_blocks, this_basic_block);
12329 need_refresh = 1;
12330 }
12331
230d793d
RS
12332 if (dead_or_set_p (place, XEXP (note, 0))
12333 || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
12334 {
12335 /* Unless the register previously died in PLACE, clear
12336 reg_last_death. [I no longer understand why this is
12337 being done.] */
12338 if (reg_last_death[regno] != place)
12339 reg_last_death[regno] = 0;
12340 place = 0;
12341 }
12342 else
12343 reg_last_death[regno] = place;
12344
12345 /* If this is a death note for a hard reg that is occupying
12346 multiple registers, ensure that we are still using all
12347 parts of the object. If we find a piece of the object
03afaf36
R
12348 that is unused, we must arrange for an appropriate REG_DEAD
12349 note to be added for it. However, we can't just emit a USE
12350 and tag the note to it, since the register might actually
12351 be dead; so we recourse, and the recursive call then finds
12352 the previous insn that used this register. */
230d793d
RS
12353
12354 if (place && regno < FIRST_PSEUDO_REGISTER
12355 && HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0))) > 1)
12356 {
770ae6cc 12357 unsigned int endregno
230d793d
RS
12358 = regno + HARD_REGNO_NREGS (regno,
12359 GET_MODE (XEXP (note, 0)));
12360 int all_used = 1;
770ae6cc 12361 unsigned int i;
230d793d
RS
12362
12363 for (i = regno; i < endregno; i++)
03afaf36
R
12364 if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
12365 && ! find_regno_fusage (place, USE, i))
12366 || dead_or_set_regno_p (place, i))
12367 all_used = 0;
a394b17b 12368
230d793d
RS
12369 if (! all_used)
12370 {
12371 /* Put only REG_DEAD notes for pieces that are
03afaf36 12372 not already dead or set. */
230d793d 12373
03afaf36
R
12374 for (i = regno; i < endregno;
12375 i += HARD_REGNO_NREGS (i, reg_raw_mode[i]))
230d793d 12376 {
38a448ca 12377 rtx piece = gen_rtx_REG (reg_raw_mode[i], i);
c762163e 12378 basic_block bb = BASIC_BLOCK (this_basic_block);
230d793d 12379
03afaf36 12380 if (! dead_or_set_p (place, piece)
230d793d
RS
12381 && ! reg_bitfield_target_p (piece,
12382 PATTERN (place)))
03afaf36
R
12383 {
12384 rtx new_note
12385 = gen_rtx_EXPR_LIST (REG_DEAD, piece, NULL_RTX);
12386
12387 distribute_notes (new_note, place, place,
12388 NULL_RTX, NULL_RTX, NULL_RTX);
12389 }
c762163e
R
12390 else if (! refers_to_regno_p (i, i + 1,
12391 PATTERN (place), 0)
12392 && ! find_regno_fusage (place, USE, i))
12393 for (tem = PREV_INSN (place); ;
12394 tem = PREV_INSN (tem))
12395 {
12396 if (! INSN_P (tem))
12397 {
12398 if (tem == bb->head)
12399 {
12400 SET_BIT (refresh_blocks,
12401 this_basic_block);
12402 need_refresh = 1;
12403 break;
12404 }
12405 continue;
12406 }
12407 if (dead_or_set_p (tem, piece)
12408 || reg_bitfield_target_p (piece,
12409 PATTERN (tem)))
12410 {
12411 REG_NOTES (tem)
71fd5a51 12412 = gen_rtx_EXPR_LIST (REG_UNUSED, piece,
c762163e
R
12413 REG_NOTES (tem));
12414 break;
12415 }
12416 }
12417
230d793d
RS
12418 }
12419
12420 place = 0;
12421 }
12422 }
12423 }
12424 break;
12425
12426 default:
12427 /* Any other notes should not be present at this point in the
12428 compilation. */
12429 abort ();
12430 }
12431
12432 if (place)
12433 {
12434 XEXP (note, 1) = REG_NOTES (place);
12435 REG_NOTES (place) = note;
12436 }
1a26b032
RK
12437 else if ((REG_NOTE_KIND (note) == REG_DEAD
12438 || REG_NOTE_KIND (note) == REG_UNUSED)
12439 && GET_CODE (XEXP (note, 0)) == REG)
b1f21e0a 12440 REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
230d793d
RS
12441
12442 if (place2)
1a26b032
RK
12443 {
12444 if ((REG_NOTE_KIND (note) == REG_DEAD
12445 || REG_NOTE_KIND (note) == REG_UNUSED)
12446 && GET_CODE (XEXP (note, 0)) == REG)
b1f21e0a 12447 REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
1a26b032 12448
38a448ca
RH
12449 REG_NOTES (place2) = gen_rtx_fmt_ee (GET_CODE (note),
12450 REG_NOTE_KIND (note),
12451 XEXP (note, 0),
12452 REG_NOTES (place2));
1a26b032 12453 }
230d793d
RS
12454 }
12455}
12456\f
12457/* Similarly to above, distribute the LOG_LINKS that used to be present on
5089e22e
RS
12458 I3, I2, and I1 to new locations. This is also called in one case to
12459 add a link pointing at I3 when I3's destination is changed. */
230d793d
RS
12460
12461static void
12462distribute_links (links)
12463 rtx links;
12464{
12465 rtx link, next_link;
12466
12467 for (link = links; link; link = next_link)
12468 {
12469 rtx place = 0;
12470 rtx insn;
12471 rtx set, reg;
12472
12473 next_link = XEXP (link, 1);
12474
12475 /* If the insn that this link points to is a NOTE or isn't a single
12476 set, ignore it. In the latter case, it isn't clear what we
663522cb 12477 can do other than ignore the link, since we can't tell which
230d793d
RS
12478 register it was for. Such links wouldn't be used by combine
12479 anyway.
12480
12481 It is not possible for the destination of the target of the link to
12482 have been changed by combine. The only potential of this is if we
12483 replace I3, I2, and I1 by I3 and I2. But in that case the
12484 destination of I2 also remains unchanged. */
12485
12486 if (GET_CODE (XEXP (link, 0)) == NOTE
12487 || (set = single_set (XEXP (link, 0))) == 0)
12488 continue;
12489
12490 reg = SET_DEST (set);
12491 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
12492 || GET_CODE (reg) == SIGN_EXTRACT
12493 || GET_CODE (reg) == STRICT_LOW_PART)
12494 reg = XEXP (reg, 0);
12495
12496 /* A LOG_LINK is defined as being placed on the first insn that uses
12497 a register and points to the insn that sets the register. Start
12498 searching at the next insn after the target of the link and stop
12499 when we reach a set of the register or the end of the basic block.
12500
12501 Note that this correctly handles the link that used to point from
5089e22e 12502 I3 to I2. Also note that not much searching is typically done here
230d793d
RS
12503 since most links don't point very far away. */
12504
12505 for (insn = NEXT_INSN (XEXP (link, 0));
0d4d42c3 12506 (insn && (this_basic_block == n_basic_blocks - 1
3b413743 12507 || BLOCK_HEAD (this_basic_block + 1) != insn));
230d793d 12508 insn = NEXT_INSN (insn))
2c3c49de 12509 if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
230d793d
RS
12510 {
12511 if (reg_referenced_p (reg, PATTERN (insn)))
12512 place = insn;
12513 break;
12514 }
6e2d1486 12515 else if (GET_CODE (insn) == CALL_INSN
663522cb 12516 && find_reg_fusage (insn, USE, reg))
6e2d1486
RK
12517 {
12518 place = insn;
12519 break;
12520 }
230d793d
RS
12521
12522 /* If we found a place to put the link, place it there unless there
12523 is already a link to the same insn as LINK at that point. */
12524
12525 if (place)
12526 {
12527 rtx link2;
12528
12529 for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
12530 if (XEXP (link2, 0) == XEXP (link, 0))
12531 break;
12532
12533 if (link2 == 0)
12534 {
12535 XEXP (link, 1) = LOG_LINKS (place);
12536 LOG_LINKS (place) = link;
abe6e52f
RK
12537
12538 /* Set added_links_insn to the earliest insn we added a
12539 link to. */
663522cb 12540 if (added_links_insn == 0
abe6e52f
RK
12541 || INSN_CUID (added_links_insn) > INSN_CUID (place))
12542 added_links_insn = place;
230d793d
RS
12543 }
12544 }
12545 }
12546}
12547\f
1427d6d2
RK
12548/* Compute INSN_CUID for INSN, which is an insn made by combine. */
12549
12550static int
12551insn_cuid (insn)
12552 rtx insn;
12553{
12554 while (insn != 0 && INSN_UID (insn) > max_uid_cuid
12555 && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == USE)
12556 insn = NEXT_INSN (insn);
12557
12558 if (INSN_UID (insn) > max_uid_cuid)
12559 abort ();
12560
12561 return INSN_CUID (insn);
12562}
12563\f
230d793d
RS
12564void
12565dump_combine_stats (file)
12566 FILE *file;
12567{
ab87f8c8 12568 fnotice
230d793d
RS
12569 (file,
12570 ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
12571 combine_attempts, combine_merges, combine_extras, combine_successes);
12572}
12573
12574void
12575dump_combine_total_stats (file)
12576 FILE *file;
12577{
ab87f8c8 12578 fnotice
230d793d
RS
12579 (file,
12580 "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
12581 total_attempts, total_merges, total_extras, total_successes);
12582}
This page took 3.092272 seconds and 5 git commands to generate.