./:
[official-gcc.git] / gcc / combine.c
blobabd64582d3ee43c6099d84a10dc07a6ad26ecab3
1 /* Optimize by combining instructions for GNU compiler.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301, USA. */
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.
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).
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.
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.
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.
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.
52 There are a few exceptions where the dataflow information created by
53 flow.c aren't completely updated:
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
61 removed because there is no way to know which register it was
62 linking
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.
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. */
77 #include "config.h"
78 #include "system.h"
79 #include "coretypes.h"
80 #include "tm.h"
81 #include "rtl.h"
82 #include "tree.h"
83 #include "tm_p.h"
84 #include "flags.h"
85 #include "regs.h"
86 #include "hard-reg-set.h"
87 #include "basic-block.h"
88 #include "insn-config.h"
89 #include "function.h"
90 /* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
91 #include "expr.h"
92 #include "insn-attr.h"
93 #include "recog.h"
94 #include "real.h"
95 #include "toplev.h"
96 #include "target.h"
97 #include "optabs.h"
98 #include "insn-codes.h"
99 #include "rtlhooks-def.h"
100 /* Include output.h for dump_file. */
101 #include "output.h"
102 #include "params.h"
103 #include "timevar.h"
104 #include "tree-pass.h"
106 /* Number of attempts to combine instructions in this function. */
108 static int combine_attempts;
110 /* Number of attempts that got as far as substitution in this function. */
112 static int combine_merges;
114 /* Number of instructions combined with added SETs in this function. */
116 static int combine_extras;
118 /* Number of instructions combined in this function. */
120 static int combine_successes;
122 /* Totals over entire compilation. */
124 static int total_attempts, total_merges, total_extras, total_successes;
127 /* Vector mapping INSN_UIDs to cuids.
128 The cuids are like uids but increase monotonically always.
129 Combine always uses cuids so that it can compare them.
130 But actually renumbering the uids, which we used to do,
131 proves to be a bad idea because it makes it hard to compare
132 the dumps produced by earlier passes with those from later passes. */
134 static int *uid_cuid;
135 static int max_uid_cuid;
137 /* Get the cuid of an insn. */
139 #define INSN_CUID(INSN) \
140 (INSN_UID (INSN) > max_uid_cuid ? insn_cuid (INSN) : uid_cuid[INSN_UID (INSN)])
142 /* In case BITS_PER_WORD == HOST_BITS_PER_WIDE_INT, shifting by
143 BITS_PER_WORD would invoke undefined behavior. Work around it. */
145 #define UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD(val) \
146 (((unsigned HOST_WIDE_INT) (val) << (BITS_PER_WORD - 1)) << 1)
148 /* Maximum register number, which is the size of the tables below. */
150 static unsigned int combine_max_regno;
152 struct reg_stat {
153 /* Record last point of death of (hard or pseudo) register n. */
154 rtx last_death;
156 /* Record last point of modification of (hard or pseudo) register n. */
157 rtx last_set;
159 /* The next group of fields allows the recording of the last value assigned
160 to (hard or pseudo) register n. We use this information to see if an
161 operation being processed is redundant given a prior operation performed
162 on the register. For example, an `and' with a constant is redundant if
163 all the zero bits are already known to be turned off.
165 We use an approach similar to that used by cse, but change it in the
166 following ways:
168 (1) We do not want to reinitialize at each label.
169 (2) It is useful, but not critical, to know the actual value assigned
170 to a register. Often just its form is helpful.
172 Therefore, we maintain the following fields:
174 last_set_value the last value assigned
175 last_set_label records the value of label_tick when the
176 register was assigned
177 last_set_table_tick records the value of label_tick when a
178 value using the register is assigned
179 last_set_invalid set to nonzero when it is not valid
180 to use the value of this register in some
181 register's value
183 To understand the usage of these tables, it is important to understand
184 the distinction between the value in last_set_value being valid and
185 the register being validly contained in some other expression in the
186 table.
188 (The next two parameters are out of date).
190 reg_stat[i].last_set_value is valid if it is nonzero, and either
191 reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
193 Register I may validly appear in any expression returned for the value
194 of another register if reg_n_sets[i] is 1. It may also appear in the
195 value for register J if reg_stat[j].last_set_invalid is zero, or
196 reg_stat[i].last_set_label < reg_stat[j].last_set_label.
198 If an expression is found in the table containing a register which may
199 not validly appear in an expression, the register is replaced by
200 something that won't match, (clobber (const_int 0)). */
202 /* Record last value assigned to (hard or pseudo) register n. */
204 rtx last_set_value;
206 /* Record the value of label_tick when an expression involving register n
207 is placed in last_set_value. */
209 int last_set_table_tick;
211 /* Record the value of label_tick when the value for register n is placed in
212 last_set_value. */
214 int last_set_label;
216 /* These fields are maintained in parallel with last_set_value and are
217 used to store the mode in which the register was last set, the bits
218 that were known to be zero when it was last set, and the number of
219 sign bits copies it was known to have when it was last set. */
221 unsigned HOST_WIDE_INT last_set_nonzero_bits;
222 char last_set_sign_bit_copies;
223 ENUM_BITFIELD(machine_mode) last_set_mode : 8;
225 /* Set nonzero if references to register n in expressions should not be
226 used. last_set_invalid is set nonzero when this register is being
227 assigned to and last_set_table_tick == label_tick. */
229 char last_set_invalid;
231 /* Some registers that are set more than once and used in more than one
232 basic block are nevertheless always set in similar ways. For example,
233 a QImode register may be loaded from memory in two places on a machine
234 where byte loads zero extend.
236 We record in the following fields if a register has some leading bits
237 that are always equal to the sign bit, and what we know about the
238 nonzero bits of a register, specifically which bits are known to be
239 zero.
241 If an entry is zero, it means that we don't know anything special. */
243 unsigned char sign_bit_copies;
245 unsigned HOST_WIDE_INT nonzero_bits;
248 static struct reg_stat *reg_stat;
250 /* Record the cuid of the last insn that invalidated memory
251 (anything that writes memory, and subroutine calls, but not pushes). */
253 static int mem_last_set;
255 /* Record the cuid of the last CALL_INSN
256 so we can tell whether a potential combination crosses any calls. */
258 static int last_call_cuid;
260 /* When `subst' is called, this is the insn that is being modified
261 (by combining in a previous insn). The PATTERN of this insn
262 is still the old pattern partially modified and it should not be
263 looked at, but this may be used to examine the successors of the insn
264 to judge whether a simplification is valid. */
266 static rtx subst_insn;
268 /* This is the lowest CUID that `subst' is currently dealing with.
269 get_last_value will not return a value if the register was set at or
270 after this CUID. If not for this mechanism, we could get confused if
271 I2 or I1 in try_combine were an insn that used the old value of a register
272 to obtain a new value. In that case, we might erroneously get the
273 new value of the register when we wanted the old one. */
275 static int subst_low_cuid;
277 /* This contains any hard registers that are used in newpat; reg_dead_at_p
278 must consider all these registers to be always live. */
280 static HARD_REG_SET newpat_used_regs;
282 /* This is an insn to which a LOG_LINKS entry has been added. If this
283 insn is the earlier than I2 or I3, combine should rescan starting at
284 that location. */
286 static rtx added_links_insn;
288 /* Basic block in which we are performing combines. */
289 static basic_block this_basic_block;
291 /* A bitmap indicating which blocks had registers go dead at entry.
292 After combine, we'll need to re-do global life analysis with
293 those blocks as starting points. */
294 static sbitmap refresh_blocks;
296 /* The following array records the insn_rtx_cost for every insn
297 in the instruction stream. */
299 static int *uid_insn_cost;
301 /* Length of the currently allocated uid_insn_cost array. */
303 static int last_insn_cost;
305 /* Incremented for each label. */
307 static int label_tick;
309 /* Mode used to compute significance in reg_stat[].nonzero_bits. It is the
310 largest integer mode that can fit in HOST_BITS_PER_WIDE_INT. */
312 static enum machine_mode nonzero_bits_mode;
314 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
315 be safely used. It is zero while computing them and after combine has
316 completed. This former test prevents propagating values based on
317 previously set values, which can be incorrect if a variable is modified
318 in a loop. */
320 static int nonzero_sign_valid;
323 /* Record one modification to rtl structure
324 to be undone by storing old_contents into *where.
325 is_int is 1 if the contents are an int. */
327 struct undo
329 struct undo *next;
330 int is_int;
331 union {rtx r; int i;} old_contents;
332 union {rtx *r; int *i;} where;
335 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
336 num_undo says how many are currently recorded.
338 other_insn is nonzero if we have modified some other insn in the process
339 of working on subst_insn. It must be verified too. */
341 struct undobuf
343 struct undo *undos;
344 struct undo *frees;
345 rtx other_insn;
348 static struct undobuf undobuf;
350 /* Number of times the pseudo being substituted for
351 was found and replaced. */
353 static int n_occurrences;
355 static rtx reg_nonzero_bits_for_combine (rtx, enum machine_mode, rtx,
356 enum machine_mode,
357 unsigned HOST_WIDE_INT,
358 unsigned HOST_WIDE_INT *);
359 static rtx reg_num_sign_bit_copies_for_combine (rtx, enum machine_mode, rtx,
360 enum machine_mode,
361 unsigned int, unsigned int *);
362 static void do_SUBST (rtx *, rtx);
363 static void do_SUBST_INT (int *, int);
364 static void init_reg_last (void);
365 static void setup_incoming_promotions (void);
366 static void set_nonzero_bits_and_sign_copies (rtx, rtx, void *);
367 static int cant_combine_insn_p (rtx);
368 static int can_combine_p (rtx, rtx, rtx, rtx, rtx *, rtx *);
369 static int combinable_i3pat (rtx, rtx *, rtx, rtx, int, rtx *);
370 static int contains_muldiv (rtx);
371 static rtx try_combine (rtx, rtx, rtx, int *);
372 static void undo_all (void);
373 static void undo_commit (void);
374 static rtx *find_split_point (rtx *, rtx);
375 static rtx subst (rtx, rtx, rtx, int, int);
376 static rtx combine_simplify_rtx (rtx, enum machine_mode, int);
377 static rtx simplify_if_then_else (rtx);
378 static rtx simplify_set (rtx);
379 static rtx simplify_logical (rtx);
380 static rtx expand_compound_operation (rtx);
381 static rtx expand_field_assignment (rtx);
382 static rtx make_extraction (enum machine_mode, rtx, HOST_WIDE_INT,
383 rtx, unsigned HOST_WIDE_INT, int, int, int);
384 static rtx extract_left_shift (rtx, int);
385 static rtx make_compound_operation (rtx, enum rtx_code);
386 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
387 unsigned HOST_WIDE_INT *);
388 static rtx force_to_mode (rtx, enum machine_mode,
389 unsigned HOST_WIDE_INT, rtx, int);
390 static rtx if_then_else_cond (rtx, rtx *, rtx *);
391 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
392 static int rtx_equal_for_field_assignment_p (rtx, rtx);
393 static rtx make_field_assignment (rtx);
394 static rtx apply_distributive_law (rtx);
395 static rtx distribute_and_simplify_rtx (rtx, int);
396 static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
397 unsigned HOST_WIDE_INT);
398 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
399 HOST_WIDE_INT, enum machine_mode, int *);
400 static rtx simplify_shift_const (rtx, enum rtx_code, enum machine_mode, rtx,
401 int);
402 static int recog_for_combine (rtx *, rtx, rtx *);
403 static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
404 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
405 static void update_table_tick (rtx);
406 static void record_value_for_reg (rtx, rtx, rtx);
407 static void check_promoted_subreg (rtx, rtx);
408 static void record_dead_and_set_regs_1 (rtx, rtx, void *);
409 static void record_dead_and_set_regs (rtx);
410 static int get_last_value_validate (rtx *, rtx, int, int);
411 static rtx get_last_value (rtx);
412 static int use_crosses_set_p (rtx, int);
413 static void reg_dead_at_p_1 (rtx, rtx, void *);
414 static int reg_dead_at_p (rtx, rtx);
415 static void move_deaths (rtx, rtx, int, rtx, rtx *);
416 static int reg_bitfield_target_p (rtx, rtx);
417 static void distribute_notes (rtx, rtx, rtx, rtx, rtx, rtx);
418 static void distribute_links (rtx);
419 static void mark_used_regs_combine (rtx);
420 static int insn_cuid (rtx);
421 static void record_promoted_value (rtx, rtx);
422 static int unmentioned_reg_p_1 (rtx *, void *);
423 static bool unmentioned_reg_p (rtx, rtx);
426 /* It is not safe to use ordinary gen_lowpart in combine.
427 See comments in gen_lowpart_for_combine. */
428 #undef RTL_HOOKS_GEN_LOWPART
429 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_for_combine
431 /* Our implementation of gen_lowpart never emits a new pseudo. */
432 #undef RTL_HOOKS_GEN_LOWPART_NO_EMIT
433 #define RTL_HOOKS_GEN_LOWPART_NO_EMIT gen_lowpart_for_combine
435 #undef RTL_HOOKS_REG_NONZERO_REG_BITS
436 #define RTL_HOOKS_REG_NONZERO_REG_BITS reg_nonzero_bits_for_combine
438 #undef RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES
439 #define RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES reg_num_sign_bit_copies_for_combine
441 static const struct rtl_hooks combine_rtl_hooks = RTL_HOOKS_INITIALIZER;
444 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
445 insn. The substitution can be undone by undo_all. If INTO is already
446 set to NEWVAL, do not record this change. Because computing NEWVAL might
447 also call SUBST, we have to compute it before we put anything into
448 the undo table. */
450 static void
451 do_SUBST (rtx *into, rtx newval)
453 struct undo *buf;
454 rtx oldval = *into;
456 if (oldval == newval)
457 return;
459 /* We'd like to catch as many invalid transformations here as
460 possible. Unfortunately, there are way too many mode changes
461 that are perfectly valid, so we'd waste too much effort for
462 little gain doing the checks here. Focus on catching invalid
463 transformations involving integer constants. */
464 if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
465 && GET_CODE (newval) == CONST_INT)
467 /* Sanity check that we're replacing oldval with a CONST_INT
468 that is a valid sign-extension for the original mode. */
469 gcc_assert (INTVAL (newval)
470 == trunc_int_for_mode (INTVAL (newval), GET_MODE (oldval)));
472 /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
473 CONST_INT is not valid, because after the replacement, the
474 original mode would be gone. Unfortunately, we can't tell
475 when do_SUBST is called to replace the operand thereof, so we
476 perform this test on oldval instead, checking whether an
477 invalid replacement took place before we got here. */
478 gcc_assert (!(GET_CODE (oldval) == SUBREG
479 && GET_CODE (SUBREG_REG (oldval)) == CONST_INT));
480 gcc_assert (!(GET_CODE (oldval) == ZERO_EXTEND
481 && GET_CODE (XEXP (oldval, 0)) == CONST_INT));
484 if (undobuf.frees)
485 buf = undobuf.frees, undobuf.frees = buf->next;
486 else
487 buf = xmalloc (sizeof (struct undo));
489 buf->is_int = 0;
490 buf->where.r = into;
491 buf->old_contents.r = oldval;
492 *into = newval;
494 buf->next = undobuf.undos, undobuf.undos = buf;
497 #define SUBST(INTO, NEWVAL) do_SUBST(&(INTO), (NEWVAL))
499 /* Similar to SUBST, but NEWVAL is an int expression. Note that substitution
500 for the value of a HOST_WIDE_INT value (including CONST_INT) is
501 not safe. */
503 static void
504 do_SUBST_INT (int *into, int newval)
506 struct undo *buf;
507 int oldval = *into;
509 if (oldval == newval)
510 return;
512 if (undobuf.frees)
513 buf = undobuf.frees, undobuf.frees = buf->next;
514 else
515 buf = xmalloc (sizeof (struct undo));
517 buf->is_int = 1;
518 buf->where.i = into;
519 buf->old_contents.i = oldval;
520 *into = newval;
522 buf->next = undobuf.undos, undobuf.undos = buf;
525 #define SUBST_INT(INTO, NEWVAL) do_SUBST_INT(&(INTO), (NEWVAL))
527 /* Subroutine of try_combine. Determine whether the combine replacement
528 patterns NEWPAT and NEWI2PAT are cheaper according to insn_rtx_cost
529 that the original instruction sequence I1, I2 and I3. Note that I1
530 and/or NEWI2PAT may be NULL_RTX. This function returns false, if the
531 costs of all instructions can be estimated, and the replacements are
532 more expensive than the original sequence. */
534 static bool
535 combine_validate_cost (rtx i1, rtx i2, rtx i3, rtx newpat, rtx newi2pat)
537 int i1_cost, i2_cost, i3_cost;
538 int new_i2_cost, new_i3_cost;
539 int old_cost, new_cost;
541 /* Lookup the original insn_rtx_costs. */
542 i2_cost = INSN_UID (i2) <= last_insn_cost
543 ? uid_insn_cost[INSN_UID (i2)] : 0;
544 i3_cost = INSN_UID (i3) <= last_insn_cost
545 ? uid_insn_cost[INSN_UID (i3)] : 0;
547 if (i1)
549 i1_cost = INSN_UID (i1) <= last_insn_cost
550 ? uid_insn_cost[INSN_UID (i1)] : 0;
551 old_cost = (i1_cost > 0 && i2_cost > 0 && i3_cost > 0)
552 ? i1_cost + i2_cost + i3_cost : 0;
554 else
556 old_cost = (i2_cost > 0 && i3_cost > 0) ? i2_cost + i3_cost : 0;
557 i1_cost = 0;
560 /* Calculate the replacement insn_rtx_costs. */
561 new_i3_cost = insn_rtx_cost (newpat);
562 if (newi2pat)
564 new_i2_cost = insn_rtx_cost (newi2pat);
565 new_cost = (new_i2_cost > 0 && new_i3_cost > 0)
566 ? new_i2_cost + new_i3_cost : 0;
568 else
570 new_cost = new_i3_cost;
571 new_i2_cost = 0;
574 if (undobuf.other_insn)
576 int old_other_cost, new_other_cost;
578 old_other_cost = (INSN_UID (undobuf.other_insn) <= last_insn_cost
579 ? uid_insn_cost[INSN_UID (undobuf.other_insn)] : 0);
580 new_other_cost = insn_rtx_cost (PATTERN (undobuf.other_insn));
581 if (old_other_cost > 0 && new_other_cost > 0)
583 old_cost += old_other_cost;
584 new_cost += new_other_cost;
586 else
587 old_cost = 0;
590 /* Disallow this recombination if both new_cost and old_cost are
591 greater than zero, and new_cost is greater than old cost. */
592 if (old_cost > 0
593 && new_cost > old_cost)
595 if (dump_file)
597 if (i1)
599 fprintf (dump_file,
600 "rejecting combination of insns %d, %d and %d\n",
601 INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
602 fprintf (dump_file, "original costs %d + %d + %d = %d\n",
603 i1_cost, i2_cost, i3_cost, old_cost);
605 else
607 fprintf (dump_file,
608 "rejecting combination of insns %d and %d\n",
609 INSN_UID (i2), INSN_UID (i3));
610 fprintf (dump_file, "original costs %d + %d = %d\n",
611 i2_cost, i3_cost, old_cost);
614 if (newi2pat)
616 fprintf (dump_file, "replacement costs %d + %d = %d\n",
617 new_i2_cost, new_i3_cost, new_cost);
619 else
620 fprintf (dump_file, "replacement cost %d\n", new_cost);
623 return false;
626 /* Update the uid_insn_cost array with the replacement costs. */
627 uid_insn_cost[INSN_UID (i2)] = new_i2_cost;
628 uid_insn_cost[INSN_UID (i3)] = new_i3_cost;
629 if (i1)
630 uid_insn_cost[INSN_UID (i1)] = 0;
632 return true;
635 /* Main entry point for combiner. F is the first insn of the function.
636 NREGS is the first unused pseudo-reg number.
638 Return nonzero if the combiner has turned an indirect jump
639 instruction into a direct jump. */
641 combine_instructions (rtx f, unsigned int nregs)
643 rtx insn, next;
644 #ifdef HAVE_cc0
645 rtx prev;
646 #endif
647 int i;
648 unsigned int j = 0;
649 rtx links, nextlinks;
650 sbitmap_iterator sbi;
652 int new_direct_jump_p = 0;
654 combine_attempts = 0;
655 combine_merges = 0;
656 combine_extras = 0;
657 combine_successes = 0;
659 combine_max_regno = nregs;
661 rtl_hooks = combine_rtl_hooks;
663 reg_stat = xcalloc (nregs, sizeof (struct reg_stat));
665 init_recog_no_volatile ();
667 /* Compute maximum uid value so uid_cuid can be allocated. */
669 for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
670 if (INSN_UID (insn) > i)
671 i = INSN_UID (insn);
673 uid_cuid = xmalloc ((i + 1) * sizeof (int));
674 max_uid_cuid = i;
676 nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
678 /* Don't use reg_stat[].nonzero_bits when computing it. This can cause
679 problems when, for example, we have j <<= 1 in a loop. */
681 nonzero_sign_valid = 0;
683 /* Compute the mapping from uids to cuids.
684 Cuids are numbers assigned to insns, like uids,
685 except that cuids increase monotonically through the code.
687 Scan all SETs and see if we can deduce anything about what
688 bits are known to be zero for some registers and how many copies
689 of the sign bit are known to exist for those registers.
691 Also set any known values so that we can use it while searching
692 for what bits are known to be set. */
694 label_tick = 1;
696 setup_incoming_promotions ();
698 refresh_blocks = sbitmap_alloc (last_basic_block);
699 sbitmap_zero (refresh_blocks);
701 /* Allocate array of current insn_rtx_costs. */
702 uid_insn_cost = xcalloc (max_uid_cuid + 1, sizeof (int));
703 last_insn_cost = max_uid_cuid;
705 for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
707 uid_cuid[INSN_UID (insn)] = ++i;
708 subst_low_cuid = i;
709 subst_insn = insn;
711 if (INSN_P (insn))
713 note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
714 NULL);
715 record_dead_and_set_regs (insn);
717 #ifdef AUTO_INC_DEC
718 for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
719 if (REG_NOTE_KIND (links) == REG_INC)
720 set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
721 NULL);
722 #endif
724 /* Record the current insn_rtx_cost of this instruction. */
725 if (NONJUMP_INSN_P (insn))
726 uid_insn_cost[INSN_UID (insn)] = insn_rtx_cost (PATTERN (insn));
727 if (dump_file)
728 fprintf(dump_file, "insn_cost %d: %d\n",
729 INSN_UID (insn), uid_insn_cost[INSN_UID (insn)]);
732 if (LABEL_P (insn))
733 label_tick++;
736 nonzero_sign_valid = 1;
738 /* Now scan all the insns in forward order. */
740 label_tick = 1;
741 last_call_cuid = 0;
742 mem_last_set = 0;
743 init_reg_last ();
744 setup_incoming_promotions ();
746 FOR_EACH_BB (this_basic_block)
748 for (insn = BB_HEAD (this_basic_block);
749 insn != NEXT_INSN (BB_END (this_basic_block));
750 insn = next ? next : NEXT_INSN (insn))
752 next = 0;
754 if (LABEL_P (insn))
755 label_tick++;
757 else if (INSN_P (insn))
759 /* See if we know about function return values before this
760 insn based upon SUBREG flags. */
761 check_promoted_subreg (insn, PATTERN (insn));
763 /* Try this insn with each insn it links back to. */
765 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
766 if ((next = try_combine (insn, XEXP (links, 0),
767 NULL_RTX, &new_direct_jump_p)) != 0)
768 goto retry;
770 /* Try each sequence of three linked insns ending with this one. */
772 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
774 rtx link = XEXP (links, 0);
776 /* If the linked insn has been replaced by a note, then there
777 is no point in pursuing this chain any further. */
778 if (NOTE_P (link))
779 continue;
781 for (nextlinks = LOG_LINKS (link);
782 nextlinks;
783 nextlinks = XEXP (nextlinks, 1))
784 if ((next = try_combine (insn, link,
785 XEXP (nextlinks, 0),
786 &new_direct_jump_p)) != 0)
787 goto retry;
790 #ifdef HAVE_cc0
791 /* Try to combine a jump insn that uses CC0
792 with a preceding insn that sets CC0, and maybe with its
793 logical predecessor as well.
794 This is how we make decrement-and-branch insns.
795 We need this special code because data flow connections
796 via CC0 do not get entered in LOG_LINKS. */
798 if (JUMP_P (insn)
799 && (prev = prev_nonnote_insn (insn)) != 0
800 && NONJUMP_INSN_P (prev)
801 && sets_cc0_p (PATTERN (prev)))
803 if ((next = try_combine (insn, prev,
804 NULL_RTX, &new_direct_jump_p)) != 0)
805 goto retry;
807 for (nextlinks = LOG_LINKS (prev); nextlinks;
808 nextlinks = XEXP (nextlinks, 1))
809 if ((next = try_combine (insn, prev,
810 XEXP (nextlinks, 0),
811 &new_direct_jump_p)) != 0)
812 goto retry;
815 /* Do the same for an insn that explicitly references CC0. */
816 if (NONJUMP_INSN_P (insn)
817 && (prev = prev_nonnote_insn (insn)) != 0
818 && NONJUMP_INSN_P (prev)
819 && sets_cc0_p (PATTERN (prev))
820 && GET_CODE (PATTERN (insn)) == SET
821 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
823 if ((next = try_combine (insn, prev,
824 NULL_RTX, &new_direct_jump_p)) != 0)
825 goto retry;
827 for (nextlinks = LOG_LINKS (prev); nextlinks;
828 nextlinks = XEXP (nextlinks, 1))
829 if ((next = try_combine (insn, prev,
830 XEXP (nextlinks, 0),
831 &new_direct_jump_p)) != 0)
832 goto retry;
835 /* Finally, see if any of the insns that this insn links to
836 explicitly references CC0. If so, try this insn, that insn,
837 and its predecessor if it sets CC0. */
838 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
839 if (NONJUMP_INSN_P (XEXP (links, 0))
840 && GET_CODE (PATTERN (XEXP (links, 0))) == SET
841 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
842 && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
843 && NONJUMP_INSN_P (prev)
844 && sets_cc0_p (PATTERN (prev))
845 && (next = try_combine (insn, XEXP (links, 0),
846 prev, &new_direct_jump_p)) != 0)
847 goto retry;
848 #endif
850 /* Try combining an insn with two different insns whose results it
851 uses. */
852 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
853 for (nextlinks = XEXP (links, 1); nextlinks;
854 nextlinks = XEXP (nextlinks, 1))
855 if ((next = try_combine (insn, XEXP (links, 0),
856 XEXP (nextlinks, 0),
857 &new_direct_jump_p)) != 0)
858 goto retry;
860 /* Try this insn with each REG_EQUAL note it links back to. */
861 for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
863 rtx set, note;
864 rtx temp = XEXP (links, 0);
865 if ((set = single_set (temp)) != 0
866 && (note = find_reg_equal_equiv_note (temp)) != 0
867 && (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST
868 /* Avoid using a register that may already been marked
869 dead by an earlier instruction. */
870 && ! unmentioned_reg_p (note, SET_SRC (set))
871 && (GET_MODE (note) == VOIDmode
872 ? SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set)))
873 : GET_MODE (SET_DEST (set)) == GET_MODE (note)))
875 /* Temporarily replace the set's source with the
876 contents of the REG_EQUAL note. The insn will
877 be deleted or recognized by try_combine. */
878 rtx orig = SET_SRC (set);
879 SET_SRC (set) = note;
880 next = try_combine (insn, temp, NULL_RTX,
881 &new_direct_jump_p);
882 if (next)
883 goto retry;
884 SET_SRC (set) = orig;
888 if (!NOTE_P (insn))
889 record_dead_and_set_regs (insn);
891 retry:
896 clear_bb_flags ();
898 EXECUTE_IF_SET_IN_SBITMAP (refresh_blocks, 0, j, sbi)
899 BASIC_BLOCK (j)->flags |= BB_DIRTY;
900 new_direct_jump_p |= purge_all_dead_edges ();
901 delete_noop_moves ();
903 update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
904 PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
905 | PROP_KILL_DEAD_CODE);
907 /* Clean up. */
908 sbitmap_free (refresh_blocks);
909 free (uid_insn_cost);
910 free (reg_stat);
911 free (uid_cuid);
914 struct undo *undo, *next;
915 for (undo = undobuf.frees; undo; undo = next)
917 next = undo->next;
918 free (undo);
920 undobuf.frees = 0;
923 total_attempts += combine_attempts;
924 total_merges += combine_merges;
925 total_extras += combine_extras;
926 total_successes += combine_successes;
928 nonzero_sign_valid = 0;
929 rtl_hooks = general_rtl_hooks;
931 /* Make recognizer allow volatile MEMs again. */
932 init_recog ();
934 return new_direct_jump_p;
937 /* Wipe the last_xxx fields of reg_stat in preparation for another pass. */
939 static void
940 init_reg_last (void)
942 unsigned int i;
943 for (i = 0; i < combine_max_regno; i++)
944 memset (reg_stat + i, 0, offsetof (struct reg_stat, sign_bit_copies));
947 /* Set up any promoted values for incoming argument registers. */
949 static void
950 setup_incoming_promotions (void)
952 unsigned int regno;
953 rtx reg;
954 enum machine_mode mode;
955 int unsignedp;
956 rtx first = get_insns ();
958 if (targetm.calls.promote_function_args (TREE_TYPE (cfun->decl)))
960 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
961 /* Check whether this register can hold an incoming pointer
962 argument. FUNCTION_ARG_REGNO_P tests outgoing register
963 numbers, so translate if necessary due to register windows. */
964 if (FUNCTION_ARG_REGNO_P (OUTGOING_REGNO (regno))
965 && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0)
967 record_value_for_reg
968 (reg, first, gen_rtx_fmt_e ((unsignedp ? ZERO_EXTEND
969 : SIGN_EXTEND),
970 GET_MODE (reg),
971 gen_rtx_CLOBBER (mode, const0_rtx)));
976 /* Called via note_stores. If X is a pseudo that is narrower than
977 HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
979 If we are setting only a portion of X and we can't figure out what
980 portion, assume all bits will be used since we don't know what will
981 be happening.
983 Similarly, set how many bits of X are known to be copies of the sign bit
984 at all locations in the function. This is the smallest number implied
985 by any set of X. */
987 static void
988 set_nonzero_bits_and_sign_copies (rtx x, rtx set,
989 void *data ATTRIBUTE_UNUSED)
991 unsigned int num;
993 if (REG_P (x)
994 && REGNO (x) >= FIRST_PSEUDO_REGISTER
995 /* If this register is undefined at the start of the file, we can't
996 say what its contents were. */
997 && ! REGNO_REG_SET_P
998 (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start, REGNO (x))
999 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
1001 if (set == 0 || GET_CODE (set) == CLOBBER)
1003 reg_stat[REGNO (x)].nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1004 reg_stat[REGNO (x)].sign_bit_copies = 1;
1005 return;
1008 /* If this is a complex assignment, see if we can convert it into a
1009 simple assignment. */
1010 set = expand_field_assignment (set);
1012 /* If this is a simple assignment, or we have a paradoxical SUBREG,
1013 set what we know about X. */
1015 if (SET_DEST (set) == x
1016 || (GET_CODE (SET_DEST (set)) == SUBREG
1017 && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
1018 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
1019 && SUBREG_REG (SET_DEST (set)) == x))
1021 rtx src = SET_SRC (set);
1023 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
1024 /* If X is narrower than a word and SRC is a non-negative
1025 constant that would appear negative in the mode of X,
1026 sign-extend it for use in reg_stat[].nonzero_bits because some
1027 machines (maybe most) will actually do the sign-extension
1028 and this is the conservative approach.
1030 ??? For 2.5, try to tighten up the MD files in this regard
1031 instead of this kludge. */
1033 if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
1034 && GET_CODE (src) == CONST_INT
1035 && INTVAL (src) > 0
1036 && 0 != (INTVAL (src)
1037 & ((HOST_WIDE_INT) 1
1038 << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
1039 src = GEN_INT (INTVAL (src)
1040 | ((HOST_WIDE_INT) (-1)
1041 << GET_MODE_BITSIZE (GET_MODE (x))));
1042 #endif
1044 /* Don't call nonzero_bits if it cannot change anything. */
1045 if (reg_stat[REGNO (x)].nonzero_bits != ~(unsigned HOST_WIDE_INT) 0)
1046 reg_stat[REGNO (x)].nonzero_bits
1047 |= nonzero_bits (src, nonzero_bits_mode);
1048 num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1049 if (reg_stat[REGNO (x)].sign_bit_copies == 0
1050 || reg_stat[REGNO (x)].sign_bit_copies > num)
1051 reg_stat[REGNO (x)].sign_bit_copies = num;
1053 else
1055 reg_stat[REGNO (x)].nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1056 reg_stat[REGNO (x)].sign_bit_copies = 1;
1061 /* See if INSN can be combined into I3. PRED and SUCC are optionally
1062 insns that were previously combined into I3 or that will be combined
1063 into the merger of INSN and I3.
1065 Return 0 if the combination is not allowed for any reason.
1067 If the combination is allowed, *PDEST will be set to the single
1068 destination of INSN and *PSRC to the single source, and this function
1069 will return 1. */
1071 static int
1072 can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ,
1073 rtx *pdest, rtx *psrc)
1075 int i;
1076 rtx set = 0, src, dest;
1077 rtx p;
1078 #ifdef AUTO_INC_DEC
1079 rtx link;
1080 #endif
1081 int all_adjacent = (succ ? (next_active_insn (insn) == succ
1082 && next_active_insn (succ) == i3)
1083 : next_active_insn (insn) == i3);
1085 /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1086 or a PARALLEL consisting of such a SET and CLOBBERs.
1088 If INSN has CLOBBER parallel parts, ignore them for our processing.
1089 By definition, these happen during the execution of the insn. When it
1090 is merged with another insn, all bets are off. If they are, in fact,
1091 needed and aren't also supplied in I3, they may be added by
1092 recog_for_combine. Otherwise, it won't match.
1094 We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1095 note.
1097 Get the source and destination of INSN. If more than one, can't
1098 combine. */
1100 if (GET_CODE (PATTERN (insn)) == SET)
1101 set = PATTERN (insn);
1102 else if (GET_CODE (PATTERN (insn)) == PARALLEL
1103 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1105 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1107 rtx elt = XVECEXP (PATTERN (insn), 0, i);
1108 rtx note;
1110 switch (GET_CODE (elt))
1112 /* This is important to combine floating point insns
1113 for the SH4 port. */
1114 case USE:
1115 /* Combining an isolated USE doesn't make sense.
1116 We depend here on combinable_i3pat to reject them. */
1117 /* The code below this loop only verifies that the inputs of
1118 the SET in INSN do not change. We call reg_set_between_p
1119 to verify that the REG in the USE does not change between
1120 I3 and INSN.
1121 If the USE in INSN was for a pseudo register, the matching
1122 insn pattern will likely match any register; combining this
1123 with any other USE would only be safe if we knew that the
1124 used registers have identical values, or if there was
1125 something to tell them apart, e.g. different modes. For
1126 now, we forgo such complicated tests and simply disallow
1127 combining of USES of pseudo registers with any other USE. */
1128 if (REG_P (XEXP (elt, 0))
1129 && GET_CODE (PATTERN (i3)) == PARALLEL)
1131 rtx i3pat = PATTERN (i3);
1132 int i = XVECLEN (i3pat, 0) - 1;
1133 unsigned int regno = REGNO (XEXP (elt, 0));
1137 rtx i3elt = XVECEXP (i3pat, 0, i);
1139 if (GET_CODE (i3elt) == USE
1140 && REG_P (XEXP (i3elt, 0))
1141 && (REGNO (XEXP (i3elt, 0)) == regno
1142 ? reg_set_between_p (XEXP (elt, 0),
1143 PREV_INSN (insn), i3)
1144 : regno >= FIRST_PSEUDO_REGISTER))
1145 return 0;
1147 while (--i >= 0);
1149 break;
1151 /* We can ignore CLOBBERs. */
1152 case CLOBBER:
1153 break;
1155 case SET:
1156 /* Ignore SETs whose result isn't used but not those that
1157 have side-effects. */
1158 if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1159 && (!(note = find_reg_note (insn, REG_EH_REGION, NULL_RTX))
1160 || INTVAL (XEXP (note, 0)) <= 0)
1161 && ! side_effects_p (elt))
1162 break;
1164 /* If we have already found a SET, this is a second one and
1165 so we cannot combine with this insn. */
1166 if (set)
1167 return 0;
1169 set = elt;
1170 break;
1172 default:
1173 /* Anything else means we can't combine. */
1174 return 0;
1178 if (set == 0
1179 /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1180 so don't do anything with it. */
1181 || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1182 return 0;
1184 else
1185 return 0;
1187 if (set == 0)
1188 return 0;
1190 set = expand_field_assignment (set);
1191 src = SET_SRC (set), dest = SET_DEST (set);
1193 /* Don't eliminate a store in the stack pointer. */
1194 if (dest == stack_pointer_rtx
1195 /* Don't combine with an insn that sets a register to itself if it has
1196 a REG_EQUAL note. This may be part of a REG_NO_CONFLICT sequence. */
1197 || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1198 /* Can't merge an ASM_OPERANDS. */
1199 || GET_CODE (src) == ASM_OPERANDS
1200 /* Can't merge a function call. */
1201 || GET_CODE (src) == CALL
1202 /* Don't eliminate a function call argument. */
1203 || (CALL_P (i3)
1204 && (find_reg_fusage (i3, USE, dest)
1205 || (REG_P (dest)
1206 && REGNO (dest) < FIRST_PSEUDO_REGISTER
1207 && global_regs[REGNO (dest)])))
1208 /* Don't substitute into an incremented register. */
1209 || FIND_REG_INC_NOTE (i3, dest)
1210 || (succ && FIND_REG_INC_NOTE (succ, dest))
1211 /* Don't substitute into a non-local goto, this confuses CFG. */
1212 || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1213 #if 0
1214 /* Don't combine the end of a libcall into anything. */
1215 /* ??? This gives worse code, and appears to be unnecessary, since no
1216 pass after flow uses REG_LIBCALL/REG_RETVAL notes. Local-alloc does
1217 use REG_RETVAL notes for noconflict blocks, but other code here
1218 makes sure that those insns don't disappear. */
1219 || find_reg_note (insn, REG_RETVAL, NULL_RTX)
1220 #endif
1221 /* Make sure that DEST is not used after SUCC but before I3. */
1222 || (succ && ! all_adjacent
1223 && reg_used_between_p (dest, succ, i3))
1224 /* Make sure that the value that is to be substituted for the register
1225 does not use any registers whose values alter in between. However,
1226 If the insns are adjacent, a use can't cross a set even though we
1227 think it might (this can happen for a sequence of insns each setting
1228 the same destination; last_set of that register might point to
1229 a NOTE). If INSN has a REG_EQUIV note, the register is always
1230 equivalent to the memory so the substitution is valid even if there
1231 are intervening stores. Also, don't move a volatile asm or
1232 UNSPEC_VOLATILE across any other insns. */
1233 || (! all_adjacent
1234 && (((!MEM_P (src)
1235 || ! find_reg_note (insn, REG_EQUIV, src))
1236 && use_crosses_set_p (src, INSN_CUID (insn)))
1237 || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1238 || GET_CODE (src) == UNSPEC_VOLATILE))
1239 /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get
1240 better register allocation by not doing the combine. */
1241 || find_reg_note (i3, REG_NO_CONFLICT, dest)
1242 || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest))
1243 /* Don't combine across a CALL_INSN, because that would possibly
1244 change whether the life span of some REGs crosses calls or not,
1245 and it is a pain to update that information.
1246 Exception: if source is a constant, moving it later can't hurt.
1247 Accept that special case, because it helps -fforce-addr a lot. */
1248 || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src)))
1249 return 0;
1251 /* DEST must either be a REG or CC0. */
1252 if (REG_P (dest))
1254 /* If register alignment is being enforced for multi-word items in all
1255 cases except for parameters, it is possible to have a register copy
1256 insn referencing a hard register that is not allowed to contain the
1257 mode being copied and which would not be valid as an operand of most
1258 insns. Eliminate this problem by not combining with such an insn.
1260 Also, on some machines we don't want to extend the life of a hard
1261 register. */
1263 if (REG_P (src)
1264 && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1265 && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1266 /* Don't extend the life of a hard register unless it is
1267 user variable (if we have few registers) or it can't
1268 fit into the desired register (meaning something special
1269 is going on).
1270 Also avoid substituting a return register into I3, because
1271 reload can't handle a conflict with constraints of other
1272 inputs. */
1273 || (REGNO (src) < FIRST_PSEUDO_REGISTER
1274 && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1275 return 0;
1277 else if (GET_CODE (dest) != CC0)
1278 return 0;
1281 if (GET_CODE (PATTERN (i3)) == PARALLEL)
1282 for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1283 if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
1285 /* Don't substitute for a register intended as a clobberable
1286 operand. */
1287 rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
1288 if (rtx_equal_p (reg, dest))
1289 return 0;
1291 /* If the clobber represents an earlyclobber operand, we must not
1292 substitute an expression containing the clobbered register.
1293 As we do not analyze the constraint strings here, we have to
1294 make the conservative assumption. However, if the register is
1295 a fixed hard reg, the clobber cannot represent any operand;
1296 we leave it up to the machine description to either accept or
1297 reject use-and-clobber patterns. */
1298 if (!REG_P (reg)
1299 || REGNO (reg) >= FIRST_PSEUDO_REGISTER
1300 || !fixed_regs[REGNO (reg)])
1301 if (reg_overlap_mentioned_p (reg, src))
1302 return 0;
1305 /* If INSN contains anything volatile, or is an `asm' (whether volatile
1306 or not), reject, unless nothing volatile comes between it and I3 */
1308 if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1310 /* Make sure succ doesn't contain a volatile reference. */
1311 if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1312 return 0;
1314 for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1315 if (INSN_P (p) && p != succ && volatile_refs_p (PATTERN (p)))
1316 return 0;
1319 /* If INSN is an asm, and DEST is a hard register, reject, since it has
1320 to be an explicit register variable, and was chosen for a reason. */
1322 if (GET_CODE (src) == ASM_OPERANDS
1323 && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1324 return 0;
1326 /* If there are any volatile insns between INSN and I3, reject, because
1327 they might affect machine state. */
1329 for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1330 if (INSN_P (p) && p != succ && volatile_insn_p (PATTERN (p)))
1331 return 0;
1333 /* If INSN contains an autoincrement or autodecrement, make sure that
1334 register is not used between there and I3, and not already used in
1335 I3 either. Neither must it be used in PRED or SUCC, if they exist.
1336 Also insist that I3 not be a jump; if it were one
1337 and the incremented register were spilled, we would lose. */
1339 #ifdef AUTO_INC_DEC
1340 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1341 if (REG_NOTE_KIND (link) == REG_INC
1342 && (JUMP_P (i3)
1343 || reg_used_between_p (XEXP (link, 0), insn, i3)
1344 || (pred != NULL_RTX
1345 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
1346 || (succ != NULL_RTX
1347 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
1348 || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1349 return 0;
1350 #endif
1352 #ifdef HAVE_cc0
1353 /* Don't combine an insn that follows a CC0-setting insn.
1354 An insn that uses CC0 must not be separated from the one that sets it.
1355 We do, however, allow I2 to follow a CC0-setting insn if that insn
1356 is passed as I1; in that case it will be deleted also.
1357 We also allow combining in this case if all the insns are adjacent
1358 because that would leave the two CC0 insns adjacent as well.
1359 It would be more logical to test whether CC0 occurs inside I1 or I2,
1360 but that would be much slower, and this ought to be equivalent. */
1362 p = prev_nonnote_insn (insn);
1363 if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
1364 && ! all_adjacent)
1365 return 0;
1366 #endif
1368 /* If we get here, we have passed all the tests and the combination is
1369 to be allowed. */
1371 *pdest = dest;
1372 *psrc = src;
1374 return 1;
1377 /* LOC is the location within I3 that contains its pattern or the component
1378 of a PARALLEL of the pattern. We validate that it is valid for combining.
1380 One problem is if I3 modifies its output, as opposed to replacing it
1381 entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1382 so would produce an insn that is not equivalent to the original insns.
1384 Consider:
1386 (set (reg:DI 101) (reg:DI 100))
1387 (set (subreg:SI (reg:DI 101) 0) <foo>)
1389 This is NOT equivalent to:
1391 (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1392 (set (reg:DI 101) (reg:DI 100))])
1394 Not only does this modify 100 (in which case it might still be valid
1395 if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
1397 We can also run into a problem if I2 sets a register that I1
1398 uses and I1 gets directly substituted into I3 (not via I2). In that
1399 case, we would be getting the wrong value of I2DEST into I3, so we
1400 must reject the combination. This case occurs when I2 and I1 both
1401 feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1402 If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
1403 of a SET must prevent combination from occurring.
1405 Before doing the above check, we first try to expand a field assignment
1406 into a set of logical operations.
1408 If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
1409 we place a register that is both set and used within I3. If more than one
1410 such register is detected, we fail.
1412 Return 1 if the combination is valid, zero otherwise. */
1414 static int
1415 combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest,
1416 int i1_not_in_src, rtx *pi3dest_killed)
1418 rtx x = *loc;
1420 if (GET_CODE (x) == SET)
1422 rtx set = x ;
1423 rtx dest = SET_DEST (set);
1424 rtx src = SET_SRC (set);
1425 rtx inner_dest = dest;
1426 rtx subdest;
1428 while (GET_CODE (inner_dest) == STRICT_LOW_PART
1429 || GET_CODE (inner_dest) == SUBREG
1430 || GET_CODE (inner_dest) == ZERO_EXTRACT)
1431 inner_dest = XEXP (inner_dest, 0);
1433 /* Check for the case where I3 modifies its output, as discussed
1434 above. We don't want to prevent pseudos from being combined
1435 into the address of a MEM, so only prevent the combination if
1436 i1 or i2 set the same MEM. */
1437 if ((inner_dest != dest &&
1438 (!MEM_P (inner_dest)
1439 || rtx_equal_p (i2dest, inner_dest)
1440 || (i1dest && rtx_equal_p (i1dest, inner_dest)))
1441 && (reg_overlap_mentioned_p (i2dest, inner_dest)
1442 || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1444 /* This is the same test done in can_combine_p except we can't test
1445 all_adjacent; we don't have to, since this instruction will stay
1446 in place, thus we are not considering increasing the lifetime of
1447 INNER_DEST.
1449 Also, if this insn sets a function argument, combining it with
1450 something that might need a spill could clobber a previous
1451 function argument; the all_adjacent test in can_combine_p also
1452 checks this; here, we do a more specific test for this case. */
1454 || (REG_P (inner_dest)
1455 && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1456 && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
1457 GET_MODE (inner_dest))))
1458 || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1459 return 0;
1461 /* If DEST is used in I3, it is being killed in this insn, so
1462 record that for later. We have to consider paradoxical
1463 subregs here, since they kill the whole register, but we
1464 ignore partial subregs, STRICT_LOW_PART, etc.
1465 Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1466 STACK_POINTER_REGNUM, since these are always considered to be
1467 live. Similarly for ARG_POINTER_REGNUM if it is fixed. */
1468 subdest = dest;
1469 if (GET_CODE (subdest) == SUBREG
1470 && (GET_MODE_SIZE (GET_MODE (subdest))
1471 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (subdest)))))
1472 subdest = SUBREG_REG (subdest);
1473 if (pi3dest_killed
1474 && REG_P (subdest)
1475 && reg_referenced_p (subdest, PATTERN (i3))
1476 && REGNO (subdest) != FRAME_POINTER_REGNUM
1477 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1478 && REGNO (subdest) != HARD_FRAME_POINTER_REGNUM
1479 #endif
1480 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1481 && (REGNO (subdest) != ARG_POINTER_REGNUM
1482 || ! fixed_regs [REGNO (subdest)])
1483 #endif
1484 && REGNO (subdest) != STACK_POINTER_REGNUM)
1486 if (*pi3dest_killed)
1487 return 0;
1489 *pi3dest_killed = subdest;
1493 else if (GET_CODE (x) == PARALLEL)
1495 int i;
1497 for (i = 0; i < XVECLEN (x, 0); i++)
1498 if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1499 i1_not_in_src, pi3dest_killed))
1500 return 0;
1503 return 1;
1506 /* Return 1 if X is an arithmetic expression that contains a multiplication
1507 and division. We don't count multiplications by powers of two here. */
1509 static int
1510 contains_muldiv (rtx x)
1512 switch (GET_CODE (x))
1514 case MOD: case DIV: case UMOD: case UDIV:
1515 return 1;
1517 case MULT:
1518 return ! (GET_CODE (XEXP (x, 1)) == CONST_INT
1519 && exact_log2 (INTVAL (XEXP (x, 1))) >= 0);
1520 default:
1521 if (BINARY_P (x))
1522 return contains_muldiv (XEXP (x, 0))
1523 || contains_muldiv (XEXP (x, 1));
1525 if (UNARY_P (x))
1526 return contains_muldiv (XEXP (x, 0));
1528 return 0;
1532 /* Determine whether INSN can be used in a combination. Return nonzero if
1533 not. This is used in try_combine to detect early some cases where we
1534 can't perform combinations. */
1536 static int
1537 cant_combine_insn_p (rtx insn)
1539 rtx set;
1540 rtx src, dest;
1542 /* If this isn't really an insn, we can't do anything.
1543 This can occur when flow deletes an insn that it has merged into an
1544 auto-increment address. */
1545 if (! INSN_P (insn))
1546 return 1;
1548 /* Never combine loads and stores involving hard regs that are likely
1549 to be spilled. The register allocator can usually handle such
1550 reg-reg moves by tying. If we allow the combiner to make
1551 substitutions of likely-spilled regs, reload might die.
1552 As an exception, we allow combinations involving fixed regs; these are
1553 not available to the register allocator so there's no risk involved. */
1555 set = single_set (insn);
1556 if (! set)
1557 return 0;
1558 src = SET_SRC (set);
1559 dest = SET_DEST (set);
1560 if (GET_CODE (src) == SUBREG)
1561 src = SUBREG_REG (src);
1562 if (GET_CODE (dest) == SUBREG)
1563 dest = SUBREG_REG (dest);
1564 if (REG_P (src) && REG_P (dest)
1565 && ((REGNO (src) < FIRST_PSEUDO_REGISTER
1566 && ! fixed_regs[REGNO (src)]
1567 && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (src))))
1568 || (REGNO (dest) < FIRST_PSEUDO_REGISTER
1569 && ! fixed_regs[REGNO (dest)]
1570 && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (dest))))))
1571 return 1;
1573 return 0;
1576 struct likely_spilled_retval_info
1578 unsigned regno, nregs;
1579 unsigned mask;
1582 /* Called via note_stores by likely_spilled_retval_p. Remove from info->mask
1583 hard registers that are known to be written to / clobbered in full. */
1584 static void
1585 likely_spilled_retval_1 (rtx x, rtx set, void *data)
1587 struct likely_spilled_retval_info *info = data;
1588 unsigned regno, nregs;
1589 unsigned new_mask;
1591 if (!REG_P (XEXP (set, 0)))
1592 return;
1593 regno = REGNO (x);
1594 if (regno >= info->regno + info->nregs)
1595 return;
1596 nregs = hard_regno_nregs[regno][GET_MODE (x)];
1597 if (regno + nregs <= info->regno)
1598 return;
1599 new_mask = (2U << (nregs - 1)) - 1;
1600 if (regno < info->regno)
1601 new_mask >>= info->regno - regno;
1602 else
1603 new_mask <<= regno - info->regno;
1604 info->mask &= new_mask;
1607 /* Return nonzero iff part of the return value is live during INSN, and
1608 it is likely spilled. This can happen when more than one insn is needed
1609 to copy the return value, e.g. when we consider to combine into the
1610 second copy insn for a complex value. */
1612 static int
1613 likely_spilled_retval_p (rtx insn)
1615 rtx use = BB_END (this_basic_block);
1616 rtx reg, p;
1617 unsigned regno, nregs;
1618 /* We assume here that no machine mode needs more than
1619 32 hard registers when the value overlaps with a register
1620 for which FUNCTION_VALUE_REGNO_P is true. */
1621 unsigned mask;
1622 struct likely_spilled_retval_info info;
1624 if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
1625 return 0;
1626 reg = XEXP (PATTERN (use), 0);
1627 if (!REG_P (reg) || !FUNCTION_VALUE_REGNO_P (REGNO (reg)))
1628 return 0;
1629 regno = REGNO (reg);
1630 nregs = hard_regno_nregs[regno][GET_MODE (reg)];
1631 if (nregs == 1)
1632 return 0;
1633 mask = (2U << (nregs - 1)) - 1;
1635 /* Disregard parts of the return value that are set later. */
1636 info.regno = regno;
1637 info.nregs = nregs;
1638 info.mask = mask;
1639 for (p = PREV_INSN (use); info.mask && p != insn; p = PREV_INSN (p))
1640 note_stores (PATTERN (insn), likely_spilled_retval_1, &info);
1641 mask = info.mask;
1643 /* Check if any of the (probably) live return value registers is
1644 likely spilled. */
1645 nregs --;
1648 if ((mask & 1 << nregs)
1649 && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno + nregs)))
1650 return 1;
1651 } while (nregs--);
1652 return 0;
1655 /* Adjust INSN after we made a change to its destination.
1657 Changing the destination can invalidate notes that say something about
1658 the results of the insn and a LOG_LINK pointing to the insn. */
1660 static void
1661 adjust_for_new_dest (rtx insn)
1663 rtx *loc;
1665 /* For notes, be conservative and simply remove them. */
1666 loc = &REG_NOTES (insn);
1667 while (*loc)
1669 enum reg_note kind = REG_NOTE_KIND (*loc);
1670 if (kind == REG_EQUAL || kind == REG_EQUIV)
1671 *loc = XEXP (*loc, 1);
1672 else
1673 loc = &XEXP (*loc, 1);
1676 /* The new insn will have a destination that was previously the destination
1677 of an insn just above it. Call distribute_links to make a LOG_LINK from
1678 the next use of that destination. */
1679 distribute_links (gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX));
1682 /* Return TRUE if combine can reuse reg X in mode MODE.
1683 ADDED_SETS is nonzero if the original set is still required. */
1684 static bool
1685 can_change_dest_mode (rtx x, int added_sets, enum machine_mode mode)
1687 unsigned int regno;
1689 if (!REG_P(x))
1690 return false;
1692 regno = REGNO (x);
1693 /* Allow hard registers if the new mode is legal, and occupies no more
1694 registers than the old mode. */
1695 if (regno < FIRST_PSEUDO_REGISTER)
1696 return (HARD_REGNO_MODE_OK (regno, mode)
1697 && (hard_regno_nregs[regno][GET_MODE (x)]
1698 >= hard_regno_nregs[regno][mode]));
1700 /* Or a pseudo that is only used once. */
1701 return (REG_N_SETS (regno) == 1 && !added_sets
1702 && !REG_USERVAR_P (x));
1705 /* Try to combine the insns I1 and I2 into I3.
1706 Here I1 and I2 appear earlier than I3.
1707 I1 can be zero; then we combine just I2 into I3.
1709 If we are combining three insns and the resulting insn is not recognized,
1710 try splitting it into two insns. If that happens, I2 and I3 are retained
1711 and I1 is pseudo-deleted by turning it into a NOTE. Otherwise, I1 and I2
1712 are pseudo-deleted.
1714 Return 0 if the combination does not work. Then nothing is changed.
1715 If we did the combination, return the insn at which combine should
1716 resume scanning.
1718 Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
1719 new direct jump instruction. */
1721 static rtx
1722 try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
1724 /* New patterns for I3 and I2, respectively. */
1725 rtx newpat, newi2pat = 0;
1726 rtvec newpat_vec_with_clobbers = 0;
1727 int substed_i2 = 0, substed_i1 = 0;
1728 /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead. */
1729 int added_sets_1, added_sets_2;
1730 /* Total number of SETs to put into I3. */
1731 int total_sets;
1732 /* Nonzero if I2's body now appears in I3. */
1733 int i2_is_used;
1734 /* INSN_CODEs for new I3, new I2, and user of condition code. */
1735 int insn_code_number, i2_code_number = 0, other_code_number = 0;
1736 /* Contains I3 if the destination of I3 is used in its source, which means
1737 that the old life of I3 is being killed. If that usage is placed into
1738 I2 and not in I3, a REG_DEAD note must be made. */
1739 rtx i3dest_killed = 0;
1740 /* SET_DEST and SET_SRC of I2 and I1. */
1741 rtx i2dest, i2src, i1dest = 0, i1src = 0;
1742 /* PATTERN (I2), or a copy of it in certain cases. */
1743 rtx i2pat;
1744 /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC. */
1745 int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
1746 int i2dest_killed = 0, i1dest_killed = 0;
1747 int i1_feeds_i3 = 0;
1748 /* Notes that must be added to REG_NOTES in I3 and I2. */
1749 rtx new_i3_notes, new_i2_notes;
1750 /* Notes that we substituted I3 into I2 instead of the normal case. */
1751 int i3_subst_into_i2 = 0;
1752 /* Notes that I1, I2 or I3 is a MULT operation. */
1753 int have_mult = 0;
1754 int swap_i2i3 = 0;
1756 int maxreg;
1757 rtx temp;
1758 rtx link;
1759 int i;
1761 /* Exit early if one of the insns involved can't be used for
1762 combinations. */
1763 if (cant_combine_insn_p (i3)
1764 || cant_combine_insn_p (i2)
1765 || (i1 && cant_combine_insn_p (i1))
1766 || likely_spilled_retval_p (i3)
1767 /* We also can't do anything if I3 has a
1768 REG_LIBCALL note since we don't want to disrupt the contiguity of a
1769 libcall. */
1770 #if 0
1771 /* ??? This gives worse code, and appears to be unnecessary, since no
1772 pass after flow uses REG_LIBCALL/REG_RETVAL notes. */
1773 || find_reg_note (i3, REG_LIBCALL, NULL_RTX)
1774 #endif
1776 return 0;
1778 combine_attempts++;
1779 undobuf.other_insn = 0;
1781 /* Reset the hard register usage information. */
1782 CLEAR_HARD_REG_SET (newpat_used_regs);
1784 /* If I1 and I2 both feed I3, they can be in any order. To simplify the
1785 code below, set I1 to be the earlier of the two insns. */
1786 if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
1787 temp = i1, i1 = i2, i2 = temp;
1789 added_links_insn = 0;
1791 /* First check for one important special-case that the code below will
1792 not handle. Namely, the case where I1 is zero, I2 is a PARALLEL
1793 and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case,
1794 we may be able to replace that destination with the destination of I3.
1795 This occurs in the common code where we compute both a quotient and
1796 remainder into a structure, in which case we want to do the computation
1797 directly into the structure to avoid register-register copies.
1799 Note that this case handles both multiple sets in I2 and also
1800 cases where I2 has a number of CLOBBER or PARALLELs.
1802 We make very conservative checks below and only try to handle the
1803 most common cases of this. For example, we only handle the case
1804 where I2 and I3 are adjacent to avoid making difficult register
1805 usage tests. */
1807 if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
1808 && REG_P (SET_SRC (PATTERN (i3)))
1809 && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
1810 && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
1811 && GET_CODE (PATTERN (i2)) == PARALLEL
1812 && ! side_effects_p (SET_DEST (PATTERN (i3)))
1813 /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
1814 below would need to check what is inside (and reg_overlap_mentioned_p
1815 doesn't support those codes anyway). Don't allow those destinations;
1816 the resulting insn isn't likely to be recognized anyway. */
1817 && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
1818 && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
1819 && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
1820 SET_DEST (PATTERN (i3)))
1821 && next_real_insn (i2) == i3)
1823 rtx p2 = PATTERN (i2);
1825 /* Make sure that the destination of I3,
1826 which we are going to substitute into one output of I2,
1827 is not used within another output of I2. We must avoid making this:
1828 (parallel [(set (mem (reg 69)) ...)
1829 (set (reg 69) ...)])
1830 which is not well-defined as to order of actions.
1831 (Besides, reload can't handle output reloads for this.)
1833 The problem can also happen if the dest of I3 is a memory ref,
1834 if another dest in I2 is an indirect memory ref. */
1835 for (i = 0; i < XVECLEN (p2, 0); i++)
1836 if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1837 || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1838 && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
1839 SET_DEST (XVECEXP (p2, 0, i))))
1840 break;
1842 if (i == XVECLEN (p2, 0))
1843 for (i = 0; i < XVECLEN (p2, 0); i++)
1844 if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1845 || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1846 && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
1848 combine_merges++;
1850 subst_insn = i3;
1851 subst_low_cuid = INSN_CUID (i2);
1853 added_sets_2 = added_sets_1 = 0;
1854 i2dest = SET_SRC (PATTERN (i3));
1855 i2dest_killed = dead_or_set_p (i2, i2dest);
1857 /* Replace the dest in I2 with our dest and make the resulting
1858 insn the new pattern for I3. Then skip to where we
1859 validate the pattern. Everything was set up above. */
1860 SUBST (SET_DEST (XVECEXP (p2, 0, i)),
1861 SET_DEST (PATTERN (i3)));
1863 newpat = p2;
1864 i3_subst_into_i2 = 1;
1865 goto validate_replacement;
1869 /* If I2 is setting a double-word pseudo to a constant and I3 is setting
1870 one of those words to another constant, merge them by making a new
1871 constant. */
1872 if (i1 == 0
1873 && (temp = single_set (i2)) != 0
1874 && (GET_CODE (SET_SRC (temp)) == CONST_INT
1875 || GET_CODE (SET_SRC (temp)) == CONST_DOUBLE)
1876 && REG_P (SET_DEST (temp))
1877 && GET_MODE_CLASS (GET_MODE (SET_DEST (temp))) == MODE_INT
1878 && GET_MODE_SIZE (GET_MODE (SET_DEST (temp))) == 2 * UNITS_PER_WORD
1879 && GET_CODE (PATTERN (i3)) == SET
1880 && GET_CODE (SET_DEST (PATTERN (i3))) == SUBREG
1881 && SUBREG_REG (SET_DEST (PATTERN (i3))) == SET_DEST (temp)
1882 && GET_MODE_CLASS (GET_MODE (SET_DEST (PATTERN (i3)))) == MODE_INT
1883 && GET_MODE_SIZE (GET_MODE (SET_DEST (PATTERN (i3)))) == UNITS_PER_WORD
1884 && GET_CODE (SET_SRC (PATTERN (i3))) == CONST_INT)
1886 HOST_WIDE_INT lo, hi;
1888 if (GET_CODE (SET_SRC (temp)) == CONST_INT)
1889 lo = INTVAL (SET_SRC (temp)), hi = lo < 0 ? -1 : 0;
1890 else
1892 lo = CONST_DOUBLE_LOW (SET_SRC (temp));
1893 hi = CONST_DOUBLE_HIGH (SET_SRC (temp));
1896 if (subreg_lowpart_p (SET_DEST (PATTERN (i3))))
1898 /* We don't handle the case of the target word being wider
1899 than a host wide int. */
1900 gcc_assert (HOST_BITS_PER_WIDE_INT >= BITS_PER_WORD);
1902 lo &= ~(UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1);
1903 lo |= (INTVAL (SET_SRC (PATTERN (i3)))
1904 & (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1906 else if (HOST_BITS_PER_WIDE_INT == BITS_PER_WORD)
1907 hi = INTVAL (SET_SRC (PATTERN (i3)));
1908 else if (HOST_BITS_PER_WIDE_INT >= 2 * BITS_PER_WORD)
1910 int sign = -(int) ((unsigned HOST_WIDE_INT) lo
1911 >> (HOST_BITS_PER_WIDE_INT - 1));
1913 lo &= ~ (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1914 (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD (1) - 1));
1915 lo |= (UWIDE_SHIFT_LEFT_BY_BITS_PER_WORD
1916 (INTVAL (SET_SRC (PATTERN (i3)))));
1917 if (hi == sign)
1918 hi = lo < 0 ? -1 : 0;
1920 else
1921 /* We don't handle the case of the higher word not fitting
1922 entirely in either hi or lo. */
1923 gcc_unreachable ();
1925 combine_merges++;
1926 subst_insn = i3;
1927 subst_low_cuid = INSN_CUID (i2);
1928 added_sets_2 = added_sets_1 = 0;
1929 i2dest = SET_DEST (temp);
1930 i2dest_killed = dead_or_set_p (i2, i2dest);
1932 SUBST (SET_SRC (temp),
1933 immed_double_const (lo, hi, GET_MODE (SET_DEST (temp))));
1935 newpat = PATTERN (i2);
1936 goto validate_replacement;
1939 #ifndef HAVE_cc0
1940 /* If we have no I1 and I2 looks like:
1941 (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
1942 (set Y OP)])
1943 make up a dummy I1 that is
1944 (set Y OP)
1945 and change I2 to be
1946 (set (reg:CC X) (compare:CC Y (const_int 0)))
1948 (We can ignore any trailing CLOBBERs.)
1950 This undoes a previous combination and allows us to match a branch-and-
1951 decrement insn. */
1953 if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
1954 && XVECLEN (PATTERN (i2), 0) >= 2
1955 && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
1956 && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
1957 == MODE_CC)
1958 && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
1959 && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
1960 && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
1961 && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)))
1962 && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
1963 SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
1965 for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
1966 if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
1967 break;
1969 if (i == 1)
1971 /* We make I1 with the same INSN_UID as I2. This gives it
1972 the same INSN_CUID for value tracking. Our fake I1 will
1973 never appear in the insn stream so giving it the same INSN_UID
1974 as I2 will not cause a problem. */
1976 i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
1977 BLOCK_FOR_INSN (i2), INSN_LOCATOR (i2),
1978 XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
1979 NULL_RTX);
1981 SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
1982 SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
1983 SET_DEST (PATTERN (i1)));
1986 #endif
1988 /* Verify that I2 and I1 are valid for combining. */
1989 if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
1990 || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
1992 undo_all ();
1993 return 0;
1996 /* Record whether I2DEST is used in I2SRC and similarly for the other
1997 cases. Knowing this will help in register status updating below. */
1998 i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
1999 i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
2000 i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
2001 i2dest_killed = dead_or_set_p (i2, i2dest);
2002 i1dest_killed = i1 && dead_or_set_p (i1, i1dest);
2004 /* See if I1 directly feeds into I3. It does if I1DEST is not used
2005 in I2SRC. */
2006 i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
2008 /* Ensure that I3's pattern can be the destination of combines. */
2009 if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
2010 i1 && i2dest_in_i1src && i1_feeds_i3,
2011 &i3dest_killed))
2013 undo_all ();
2014 return 0;
2017 /* See if any of the insns is a MULT operation. Unless one is, we will
2018 reject a combination that is, since it must be slower. Be conservative
2019 here. */
2020 if (GET_CODE (i2src) == MULT
2021 || (i1 != 0 && GET_CODE (i1src) == MULT)
2022 || (GET_CODE (PATTERN (i3)) == SET
2023 && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
2024 have_mult = 1;
2026 /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
2027 We used to do this EXCEPT in one case: I3 has a post-inc in an
2028 output operand. However, that exception can give rise to insns like
2029 mov r3,(r3)+
2030 which is a famous insn on the PDP-11 where the value of r3 used as the
2031 source was model-dependent. Avoid this sort of thing. */
2033 #if 0
2034 if (!(GET_CODE (PATTERN (i3)) == SET
2035 && REG_P (SET_SRC (PATTERN (i3)))
2036 && MEM_P (SET_DEST (PATTERN (i3)))
2037 && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
2038 || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
2039 /* It's not the exception. */
2040 #endif
2041 #ifdef AUTO_INC_DEC
2042 for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
2043 if (REG_NOTE_KIND (link) == REG_INC
2044 && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
2045 || (i1 != 0
2046 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
2048 undo_all ();
2049 return 0;
2051 #endif
2053 /* See if the SETs in I1 or I2 need to be kept around in the merged
2054 instruction: whenever the value set there is still needed past I3.
2055 For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
2057 For the SET in I1, we have two cases: If I1 and I2 independently
2058 feed into I3, the set in I1 needs to be kept around if I1DEST dies
2059 or is set in I3. Otherwise (if I1 feeds I2 which feeds I3), the set
2060 in I1 needs to be kept around unless I1DEST dies or is set in either
2061 I2 or I3. We can distinguish these cases by seeing if I2SRC mentions
2062 I1DEST. If so, we know I1 feeds into I2. */
2064 added_sets_2 = ! dead_or_set_p (i3, i2dest);
2066 added_sets_1
2067 = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
2068 : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
2070 /* If the set in I2 needs to be kept around, we must make a copy of
2071 PATTERN (I2), so that when we substitute I1SRC for I1DEST in
2072 PATTERN (I2), we are only substituting for the original I1DEST, not into
2073 an already-substituted copy. This also prevents making self-referential
2074 rtx. If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
2075 I2DEST. */
2077 i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL
2078 ? gen_rtx_SET (VOIDmode, i2dest, i2src)
2079 : PATTERN (i2));
2081 if (added_sets_2)
2082 i2pat = copy_rtx (i2pat);
2084 combine_merges++;
2086 /* Substitute in the latest insn for the regs set by the earlier ones. */
2088 maxreg = max_reg_num ();
2090 subst_insn = i3;
2092 #ifndef HAVE_cc0
2093 /* Many machines that don't use CC0 have insns that can both perform an
2094 arithmetic operation and set the condition code. These operations will
2095 be represented as a PARALLEL with the first element of the vector
2096 being a COMPARE of an arithmetic operation with the constant zero.
2097 The second element of the vector will set some pseudo to the result
2098 of the same arithmetic operation. If we simplify the COMPARE, we won't
2099 match such a pattern and so will generate an extra insn. Here we test
2100 for this case, where both the comparison and the operation result are
2101 needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
2102 I2SRC. Later we will make the PARALLEL that contains I2. */
2104 if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
2105 && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
2106 && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
2107 && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
2109 #ifdef SELECT_CC_MODE
2110 rtx *cc_use;
2111 enum machine_mode compare_mode;
2112 #endif
2114 newpat = PATTERN (i3);
2115 SUBST (XEXP (SET_SRC (newpat), 0), i2src);
2117 i2_is_used = 1;
2119 #ifdef SELECT_CC_MODE
2120 /* See if a COMPARE with the operand we substituted in should be done
2121 with the mode that is currently being used. If not, do the same
2122 processing we do in `subst' for a SET; namely, if the destination
2123 is used only once, try to replace it with a register of the proper
2124 mode and also replace the COMPARE. */
2125 if (undobuf.other_insn == 0
2126 && (cc_use = find_single_use (SET_DEST (newpat), i3,
2127 &undobuf.other_insn))
2128 && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
2129 i2src, const0_rtx))
2130 != GET_MODE (SET_DEST (newpat))))
2132 if (can_change_dest_mode(SET_DEST (newpat), added_sets_2,
2133 compare_mode))
2135 unsigned int regno = REGNO (SET_DEST (newpat));
2136 rtx new_dest = gen_rtx_REG (compare_mode, regno);
2138 if (regno >= FIRST_PSEUDO_REGISTER)
2139 SUBST (regno_reg_rtx[regno], new_dest);
2141 SUBST (SET_DEST (newpat), new_dest);
2142 SUBST (XEXP (*cc_use, 0), new_dest);
2143 SUBST (SET_SRC (newpat),
2144 gen_rtx_COMPARE (compare_mode, i2src, const0_rtx));
2146 else
2147 undobuf.other_insn = 0;
2149 #endif
2151 else
2152 #endif
2154 /* It is possible that the source of I2 or I1 may be performing
2155 an unneeded operation, such as a ZERO_EXTEND of something
2156 that is known to have the high part zero. Handle that case
2157 by letting subst look at the innermost one of them.
2159 Another way to do this would be to have a function that tries
2160 to simplify a single insn instead of merging two or more
2161 insns. We don't do this because of the potential of infinite
2162 loops and because of the potential extra memory required.
2163 However, doing it the way we are is a bit of a kludge and
2164 doesn't catch all cases.
2166 But only do this if -fexpensive-optimizations since it slows
2167 things down and doesn't usually win.
2169 This is not done in the COMPARE case above because the
2170 unmodified I2PAT is used in the PARALLEL and so a pattern
2171 with a modified I2SRC would not match. */
2173 if (flag_expensive_optimizations)
2175 /* Pass pc_rtx so no substitutions are done, just
2176 simplifications. */
2177 if (i1)
2179 subst_low_cuid = INSN_CUID (i1);
2180 i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
2182 else
2184 subst_low_cuid = INSN_CUID (i2);
2185 i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
2189 n_occurrences = 0; /* `subst' counts here */
2191 /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
2192 need to make a unique copy of I2SRC each time we substitute it
2193 to avoid self-referential rtl. */
2195 subst_low_cuid = INSN_CUID (i2);
2196 newpat = subst (PATTERN (i3), i2dest, i2src, 0,
2197 ! i1_feeds_i3 && i1dest_in_i1src);
2198 substed_i2 = 1;
2200 /* Record whether i2's body now appears within i3's body. */
2201 i2_is_used = n_occurrences;
2204 /* If we already got a failure, don't try to do more. Otherwise,
2205 try to substitute in I1 if we have it. */
2207 if (i1 && GET_CODE (newpat) != CLOBBER)
2209 /* Before we can do this substitution, we must redo the test done
2210 above (see detailed comments there) that ensures that I1DEST
2211 isn't mentioned in any SETs in NEWPAT that are field assignments. */
2213 if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
2214 0, (rtx*) 0))
2216 undo_all ();
2217 return 0;
2220 n_occurrences = 0;
2221 subst_low_cuid = INSN_CUID (i1);
2222 newpat = subst (newpat, i1dest, i1src, 0, 0);
2223 substed_i1 = 1;
2226 /* Fail if an autoincrement side-effect has been duplicated. Be careful
2227 to count all the ways that I2SRC and I1SRC can be used. */
2228 if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
2229 && i2_is_used + added_sets_2 > 1)
2230 || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
2231 && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
2232 > 1))
2233 /* Fail if we tried to make a new register. */
2234 || max_reg_num () != maxreg
2235 /* Fail if we couldn't do something and have a CLOBBER. */
2236 || GET_CODE (newpat) == CLOBBER
2237 /* Fail if this new pattern is a MULT and we didn't have one before
2238 at the outer level. */
2239 || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
2240 && ! have_mult))
2242 undo_all ();
2243 return 0;
2246 /* If the actions of the earlier insns must be kept
2247 in addition to substituting them into the latest one,
2248 we must make a new PARALLEL for the latest insn
2249 to hold additional the SETs. */
2251 if (added_sets_1 || added_sets_2)
2253 combine_extras++;
2255 if (GET_CODE (newpat) == PARALLEL)
2257 rtvec old = XVEC (newpat, 0);
2258 total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
2259 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2260 memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
2261 sizeof (old->elem[0]) * old->num_elem);
2263 else
2265 rtx old = newpat;
2266 total_sets = 1 + added_sets_1 + added_sets_2;
2267 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
2268 XVECEXP (newpat, 0, 0) = old;
2271 if (added_sets_1)
2272 XVECEXP (newpat, 0, --total_sets)
2273 = (GET_CODE (PATTERN (i1)) == PARALLEL
2274 ? gen_rtx_SET (VOIDmode, i1dest, i1src) : PATTERN (i1));
2276 if (added_sets_2)
2278 /* If there is no I1, use I2's body as is. We used to also not do
2279 the subst call below if I2 was substituted into I3,
2280 but that could lose a simplification. */
2281 if (i1 == 0)
2282 XVECEXP (newpat, 0, --total_sets) = i2pat;
2283 else
2284 /* See comment where i2pat is assigned. */
2285 XVECEXP (newpat, 0, --total_sets)
2286 = subst (i2pat, i1dest, i1src, 0, 0);
2290 /* We come here when we are replacing a destination in I2 with the
2291 destination of I3. */
2292 validate_replacement:
2294 /* Note which hard regs this insn has as inputs. */
2295 mark_used_regs_combine (newpat);
2297 /* If recog_for_combine fails, it strips existing clobbers. If we'll
2298 consider splitting this pattern, we might need these clobbers. */
2299 if (i1 && GET_CODE (newpat) == PARALLEL
2300 && GET_CODE (XVECEXP (newpat, 0, XVECLEN (newpat, 0) - 1)) == CLOBBER)
2302 int len = XVECLEN (newpat, 0);
2304 newpat_vec_with_clobbers = rtvec_alloc (len);
2305 for (i = 0; i < len; i++)
2306 RTVEC_ELT (newpat_vec_with_clobbers, i) = XVECEXP (newpat, 0, i);
2309 /* Is the result of combination a valid instruction? */
2310 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2312 /* If the result isn't valid, see if it is a PARALLEL of two SETs where
2313 the second SET's destination is a register that is unused and isn't
2314 marked as an instruction that might trap in an EH region. In that case,
2315 we just need the first SET. This can occur when simplifying a divmod
2316 insn. We *must* test for this case here because the code below that
2317 splits two independent SETs doesn't handle this case correctly when it
2318 updates the register status.
2320 It's pointless doing this if we originally had two sets, one from
2321 i3, and one from i2. Combining then splitting the parallel results
2322 in the original i2 again plus an invalid insn (which we delete).
2323 The net effect is only to move instructions around, which makes
2324 debug info less accurate.
2326 Also check the case where the first SET's destination is unused.
2327 That would not cause incorrect code, but does cause an unneeded
2328 insn to remain. */
2330 if (insn_code_number < 0
2331 && !(added_sets_2 && i1 == 0)
2332 && GET_CODE (newpat) == PARALLEL
2333 && XVECLEN (newpat, 0) == 2
2334 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2335 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2336 && asm_noperands (newpat) < 0)
2338 rtx set0 = XVECEXP (newpat, 0, 0);
2339 rtx set1 = XVECEXP (newpat, 0, 1);
2340 rtx note;
2342 if (((REG_P (SET_DEST (set1))
2343 && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
2344 || (GET_CODE (SET_DEST (set1)) == SUBREG
2345 && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
2346 && (!(note = find_reg_note (i3, REG_EH_REGION, NULL_RTX))
2347 || INTVAL (XEXP (note, 0)) <= 0)
2348 && ! side_effects_p (SET_SRC (set1)))
2350 newpat = set0;
2351 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2354 else if (((REG_P (SET_DEST (set0))
2355 && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
2356 || (GET_CODE (SET_DEST (set0)) == SUBREG
2357 && find_reg_note (i3, REG_UNUSED,
2358 SUBREG_REG (SET_DEST (set0)))))
2359 && (!(note = find_reg_note (i3, REG_EH_REGION, NULL_RTX))
2360 || INTVAL (XEXP (note, 0)) <= 0)
2361 && ! side_effects_p (SET_SRC (set0)))
2363 newpat = set1;
2364 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2366 if (insn_code_number >= 0)
2368 /* If we will be able to accept this, we have made a
2369 change to the destination of I3. This requires us to
2370 do a few adjustments. */
2372 PATTERN (i3) = newpat;
2373 adjust_for_new_dest (i3);
2378 /* If we were combining three insns and the result is a simple SET
2379 with no ASM_OPERANDS that wasn't recognized, try to split it into two
2380 insns. There are two ways to do this. It can be split using a
2381 machine-specific method (like when you have an addition of a large
2382 constant) or by combine in the function find_split_point. */
2384 if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
2385 && asm_noperands (newpat) < 0)
2387 rtx m_split, *split;
2388 rtx ni2dest = i2dest;
2390 /* See if the MD file can split NEWPAT. If it can't, see if letting it
2391 use I2DEST as a scratch register will help. In the latter case,
2392 convert I2DEST to the mode of the source of NEWPAT if we can. */
2394 m_split = split_insns (newpat, i3);
2396 /* We can only use I2DEST as a scratch reg if it doesn't overlap any
2397 inputs of NEWPAT. */
2399 /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
2400 possible to try that as a scratch reg. This would require adding
2401 more code to make it work though. */
2403 if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat))
2405 enum machine_mode new_mode = GET_MODE (SET_DEST (newpat));
2406 /* If I2DEST is a hard register or the only use of a pseudo,
2407 we can change its mode. */
2408 if (new_mode != GET_MODE (i2dest)
2409 && new_mode != VOIDmode
2410 && can_change_dest_mode (i2dest, added_sets_2, new_mode))
2411 ni2dest = gen_rtx_REG (GET_MODE (SET_DEST (newpat)),
2412 REGNO (i2dest));
2414 m_split = split_insns (gen_rtx_PARALLEL
2415 (VOIDmode,
2416 gen_rtvec (2, newpat,
2417 gen_rtx_CLOBBER (VOIDmode,
2418 ni2dest))),
2419 i3);
2420 /* If the split with the mode-changed register didn't work, try
2421 the original register. */
2422 if (! m_split && ni2dest != i2dest)
2424 ni2dest = i2dest;
2425 m_split = split_insns (gen_rtx_PARALLEL
2426 (VOIDmode,
2427 gen_rtvec (2, newpat,
2428 gen_rtx_CLOBBER (VOIDmode,
2429 i2dest))),
2430 i3);
2434 /* If recog_for_combine has discarded clobbers, try to use them
2435 again for the split. */
2436 if (m_split == 0 && newpat_vec_with_clobbers)
2437 m_split
2438 = split_insns (gen_rtx_PARALLEL (VOIDmode,
2439 newpat_vec_with_clobbers), i3);
2441 if (m_split && NEXT_INSN (m_split) == NULL_RTX)
2443 m_split = PATTERN (m_split);
2444 insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
2445 if (insn_code_number >= 0)
2446 newpat = m_split;
2448 else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX
2449 && (next_real_insn (i2) == i3
2450 || ! use_crosses_set_p (PATTERN (m_split), INSN_CUID (i2))))
2452 rtx i2set, i3set;
2453 rtx newi3pat = PATTERN (NEXT_INSN (m_split));
2454 newi2pat = PATTERN (m_split);
2456 i3set = single_set (NEXT_INSN (m_split));
2457 i2set = single_set (m_split);
2459 /* In case we changed the mode of I2DEST, replace it in the
2460 pseudo-register table here. We can't do it above in case this
2461 code doesn't get executed and we do a split the other way. */
2463 if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2464 SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest);
2466 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2468 /* If I2 or I3 has multiple SETs, we won't know how to track
2469 register status, so don't use these insns. If I2's destination
2470 is used between I2 and I3, we also can't use these insns. */
2472 if (i2_code_number >= 0 && i2set && i3set
2473 && (next_real_insn (i2) == i3
2474 || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
2475 insn_code_number = recog_for_combine (&newi3pat, i3,
2476 &new_i3_notes);
2477 if (insn_code_number >= 0)
2478 newpat = newi3pat;
2480 /* It is possible that both insns now set the destination of I3.
2481 If so, we must show an extra use of it. */
2483 if (insn_code_number >= 0)
2485 rtx new_i3_dest = SET_DEST (i3set);
2486 rtx new_i2_dest = SET_DEST (i2set);
2488 while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
2489 || GET_CODE (new_i3_dest) == STRICT_LOW_PART
2490 || GET_CODE (new_i3_dest) == SUBREG)
2491 new_i3_dest = XEXP (new_i3_dest, 0);
2493 while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
2494 || GET_CODE (new_i2_dest) == STRICT_LOW_PART
2495 || GET_CODE (new_i2_dest) == SUBREG)
2496 new_i2_dest = XEXP (new_i2_dest, 0);
2498 if (REG_P (new_i3_dest)
2499 && REG_P (new_i2_dest)
2500 && REGNO (new_i3_dest) == REGNO (new_i2_dest))
2501 REG_N_SETS (REGNO (new_i2_dest))++;
2505 /* If we can split it and use I2DEST, go ahead and see if that
2506 helps things be recognized. Verify that none of the registers
2507 are set between I2 and I3. */
2508 if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
2509 #ifdef HAVE_cc0
2510 && REG_P (i2dest)
2511 #endif
2512 /* We need I2DEST in the proper mode. If it is a hard register
2513 or the only use of a pseudo, we can change its mode.
2514 Make sure we don't change a hard register to have a mode that
2515 isn't valid for it, or change the number of registers. */
2516 && (GET_MODE (*split) == GET_MODE (i2dest)
2517 || GET_MODE (*split) == VOIDmode
2518 || can_change_dest_mode (i2dest, added_sets_2,
2519 GET_MODE (*split)))
2520 && (next_real_insn (i2) == i3
2521 || ! use_crosses_set_p (*split, INSN_CUID (i2)))
2522 /* We can't overwrite I2DEST if its value is still used by
2523 NEWPAT. */
2524 && ! reg_referenced_p (i2dest, newpat))
2526 rtx newdest = i2dest;
2527 enum rtx_code split_code = GET_CODE (*split);
2528 enum machine_mode split_mode = GET_MODE (*split);
2530 /* Get NEWDEST as a register in the proper mode. We have already
2531 validated that we can do this. */
2532 if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
2534 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
2536 if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2537 SUBST (regno_reg_rtx[REGNO (i2dest)], newdest);
2540 /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
2541 an ASHIFT. This can occur if it was inside a PLUS and hence
2542 appeared to be a memory address. This is a kludge. */
2543 if (split_code == MULT
2544 && GET_CODE (XEXP (*split, 1)) == CONST_INT
2545 && INTVAL (XEXP (*split, 1)) > 0
2546 && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
2548 SUBST (*split, gen_rtx_ASHIFT (split_mode,
2549 XEXP (*split, 0), GEN_INT (i)));
2550 /* Update split_code because we may not have a multiply
2551 anymore. */
2552 split_code = GET_CODE (*split);
2555 #ifdef INSN_SCHEDULING
2556 /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
2557 be written as a ZERO_EXTEND. */
2558 if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
2560 #ifdef LOAD_EXTEND_OP
2561 /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
2562 what it really is. */
2563 if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (*split)))
2564 == SIGN_EXTEND)
2565 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
2566 SUBREG_REG (*split)));
2567 else
2568 #endif
2569 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
2570 SUBREG_REG (*split)));
2572 #endif
2574 newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
2575 SUBST (*split, newdest);
2576 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2578 /* recog_for_combine might have added CLOBBERs to newi2pat.
2579 Make sure NEWPAT does not depend on the clobbered regs. */
2580 if (GET_CODE (newi2pat) == PARALLEL)
2581 for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
2582 if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
2584 rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
2585 if (reg_overlap_mentioned_p (reg, newpat))
2587 undo_all ();
2588 return 0;
2592 /* If the split point was a MULT and we didn't have one before,
2593 don't use one now. */
2594 if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
2595 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2599 /* Check for a case where we loaded from memory in a narrow mode and
2600 then sign extended it, but we need both registers. In that case,
2601 we have a PARALLEL with both loads from the same memory location.
2602 We can split this into a load from memory followed by a register-register
2603 copy. This saves at least one insn, more if register allocation can
2604 eliminate the copy.
2606 We cannot do this if the destination of the first assignment is a
2607 condition code register or cc0. We eliminate this case by making sure
2608 the SET_DEST and SET_SRC have the same mode.
2610 We cannot do this if the destination of the second assignment is
2611 a register that we have already assumed is zero-extended. Similarly
2612 for a SUBREG of such a register. */
2614 else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2615 && GET_CODE (newpat) == PARALLEL
2616 && XVECLEN (newpat, 0) == 2
2617 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2618 && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
2619 && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
2620 == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
2621 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2622 && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2623 XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
2624 && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2625 INSN_CUID (i2))
2626 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2627 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2628 && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
2629 (REG_P (temp)
2630 && reg_stat[REGNO (temp)].nonzero_bits != 0
2631 && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2632 && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2633 && (reg_stat[REGNO (temp)].nonzero_bits
2634 != GET_MODE_MASK (word_mode))))
2635 && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
2636 && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
2637 (REG_P (temp)
2638 && reg_stat[REGNO (temp)].nonzero_bits != 0
2639 && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2640 && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2641 && (reg_stat[REGNO (temp)].nonzero_bits
2642 != GET_MODE_MASK (word_mode)))))
2643 && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2644 SET_SRC (XVECEXP (newpat, 0, 1)))
2645 && ! find_reg_note (i3, REG_UNUSED,
2646 SET_DEST (XVECEXP (newpat, 0, 0))))
2648 rtx ni2dest;
2650 newi2pat = XVECEXP (newpat, 0, 0);
2651 ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
2652 newpat = XVECEXP (newpat, 0, 1);
2653 SUBST (SET_SRC (newpat),
2654 gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
2655 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2657 if (i2_code_number >= 0)
2658 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2660 if (insn_code_number >= 0)
2661 swap_i2i3 = 1;
2664 /* Similarly, check for a case where we have a PARALLEL of two independent
2665 SETs but we started with three insns. In this case, we can do the sets
2666 as two separate insns. This case occurs when some SET allows two
2667 other insns to combine, but the destination of that SET is still live. */
2669 else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2670 && GET_CODE (newpat) == PARALLEL
2671 && XVECLEN (newpat, 0) == 2
2672 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2673 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
2674 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
2675 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2676 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2677 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2678 && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2679 INSN_CUID (i2))
2680 /* Don't pass sets with (USE (MEM ...)) dests to the following. */
2681 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE
2682 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE
2683 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2684 XVECEXP (newpat, 0, 0))
2685 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
2686 XVECEXP (newpat, 0, 1))
2687 && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
2688 && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
2690 /* Normally, it doesn't matter which of the two is done first,
2691 but it does if one references cc0. In that case, it has to
2692 be first. */
2693 #ifdef HAVE_cc0
2694 if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
2696 newi2pat = XVECEXP (newpat, 0, 0);
2697 newpat = XVECEXP (newpat, 0, 1);
2699 else
2700 #endif
2702 newi2pat = XVECEXP (newpat, 0, 1);
2703 newpat = XVECEXP (newpat, 0, 0);
2706 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2708 if (i2_code_number >= 0)
2709 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2712 /* If it still isn't recognized, fail and change things back the way they
2713 were. */
2714 if ((insn_code_number < 0
2715 /* Is the result a reasonable ASM_OPERANDS? */
2716 && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
2718 undo_all ();
2719 return 0;
2722 /* If we had to change another insn, make sure it is valid also. */
2723 if (undobuf.other_insn)
2725 rtx other_pat = PATTERN (undobuf.other_insn);
2726 rtx new_other_notes;
2727 rtx note, next;
2729 CLEAR_HARD_REG_SET (newpat_used_regs);
2731 other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
2732 &new_other_notes);
2734 if (other_code_number < 0 && ! check_asm_operands (other_pat))
2736 undo_all ();
2737 return 0;
2740 PATTERN (undobuf.other_insn) = other_pat;
2742 /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
2743 are still valid. Then add any non-duplicate notes added by
2744 recog_for_combine. */
2745 for (note = REG_NOTES (undobuf.other_insn); note; note = next)
2747 next = XEXP (note, 1);
2749 if (REG_NOTE_KIND (note) == REG_UNUSED
2750 && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
2752 if (REG_P (XEXP (note, 0)))
2753 REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
2755 remove_note (undobuf.other_insn, note);
2759 for (note = new_other_notes; note; note = XEXP (note, 1))
2760 if (REG_P (XEXP (note, 0)))
2761 REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
2763 distribute_notes (new_other_notes, undobuf.other_insn,
2764 undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
2766 #ifdef HAVE_cc0
2767 /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
2768 they are adjacent to each other or not. */
2770 rtx p = prev_nonnote_insn (i3);
2771 if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
2772 && sets_cc0_p (newi2pat))
2774 undo_all ();
2775 return 0;
2778 #endif
2780 /* Only allow this combination if insn_rtx_costs reports that the
2781 replacement instructions are cheaper than the originals. */
2782 if (!combine_validate_cost (i1, i2, i3, newpat, newi2pat))
2784 undo_all ();
2785 return 0;
2788 /* We now know that we can do this combination. Merge the insns and
2789 update the status of registers and LOG_LINKS. */
2791 if (swap_i2i3)
2793 rtx insn;
2794 rtx link;
2795 rtx ni2dest;
2797 /* I3 now uses what used to be its destination and which is now
2798 I2's destination. This requires us to do a few adjustments. */
2799 PATTERN (i3) = newpat;
2800 adjust_for_new_dest (i3);
2802 /* We need a LOG_LINK from I3 to I2. But we used to have one,
2803 so we still will.
2805 However, some later insn might be using I2's dest and have
2806 a LOG_LINK pointing at I3. We must remove this link.
2807 The simplest way to remove the link is to point it at I1,
2808 which we know will be a NOTE. */
2810 /* newi2pat is usually a SET here; however, recog_for_combine might
2811 have added some clobbers. */
2812 if (GET_CODE (newi2pat) == PARALLEL)
2813 ni2dest = SET_DEST (XVECEXP (newi2pat, 0, 0));
2814 else
2815 ni2dest = SET_DEST (newi2pat);
2817 for (insn = NEXT_INSN (i3);
2818 insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
2819 || insn != BB_HEAD (this_basic_block->next_bb));
2820 insn = NEXT_INSN (insn))
2822 if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
2824 for (link = LOG_LINKS (insn); link;
2825 link = XEXP (link, 1))
2826 if (XEXP (link, 0) == i3)
2827 XEXP (link, 0) = i1;
2829 break;
2835 rtx i3notes, i2notes, i1notes = 0;
2836 rtx i3links, i2links, i1links = 0;
2837 rtx midnotes = 0;
2838 unsigned int regno;
2839 /* Compute which registers we expect to eliminate. newi2pat may be setting
2840 either i3dest or i2dest, so we must check it. Also, i1dest may be the
2841 same as i3dest, in which case newi2pat may be setting i1dest. */
2842 rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
2843 || i2dest_in_i2src || i2dest_in_i1src
2844 || !i2dest_killed
2845 ? 0 : i2dest);
2846 rtx elim_i1 = (i1 == 0 || i1dest_in_i1src
2847 || (newi2pat && reg_set_p (i1dest, newi2pat))
2848 || !i1dest_killed
2849 ? 0 : i1dest);
2851 /* Get the old REG_NOTES and LOG_LINKS from all our insns and
2852 clear them. */
2853 i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
2854 i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
2855 if (i1)
2856 i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
2858 /* Ensure that we do not have something that should not be shared but
2859 occurs multiple times in the new insns. Check this by first
2860 resetting all the `used' flags and then copying anything is shared. */
2862 reset_used_flags (i3notes);
2863 reset_used_flags (i2notes);
2864 reset_used_flags (i1notes);
2865 reset_used_flags (newpat);
2866 reset_used_flags (newi2pat);
2867 if (undobuf.other_insn)
2868 reset_used_flags (PATTERN (undobuf.other_insn));
2870 i3notes = copy_rtx_if_shared (i3notes);
2871 i2notes = copy_rtx_if_shared (i2notes);
2872 i1notes = copy_rtx_if_shared (i1notes);
2873 newpat = copy_rtx_if_shared (newpat);
2874 newi2pat = copy_rtx_if_shared (newi2pat);
2875 if (undobuf.other_insn)
2876 reset_used_flags (PATTERN (undobuf.other_insn));
2878 INSN_CODE (i3) = insn_code_number;
2879 PATTERN (i3) = newpat;
2881 if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
2883 rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
2885 reset_used_flags (call_usage);
2886 call_usage = copy_rtx (call_usage);
2888 if (substed_i2)
2889 replace_rtx (call_usage, i2dest, i2src);
2891 if (substed_i1)
2892 replace_rtx (call_usage, i1dest, i1src);
2894 CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
2897 if (undobuf.other_insn)
2898 INSN_CODE (undobuf.other_insn) = other_code_number;
2900 /* We had one special case above where I2 had more than one set and
2901 we replaced a destination of one of those sets with the destination
2902 of I3. In that case, we have to update LOG_LINKS of insns later
2903 in this basic block. Note that this (expensive) case is rare.
2905 Also, in this case, we must pretend that all REG_NOTEs for I2
2906 actually came from I3, so that REG_UNUSED notes from I2 will be
2907 properly handled. */
2909 if (i3_subst_into_i2)
2911 for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
2912 if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != USE
2913 && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
2914 && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
2915 && ! find_reg_note (i2, REG_UNUSED,
2916 SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
2917 for (temp = NEXT_INSN (i2);
2918 temp && (this_basic_block->next_bb == EXIT_BLOCK_PTR
2919 || BB_HEAD (this_basic_block) != temp);
2920 temp = NEXT_INSN (temp))
2921 if (temp != i3 && INSN_P (temp))
2922 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
2923 if (XEXP (link, 0) == i2)
2924 XEXP (link, 0) = i3;
2926 if (i3notes)
2928 rtx link = i3notes;
2929 while (XEXP (link, 1))
2930 link = XEXP (link, 1);
2931 XEXP (link, 1) = i2notes;
2933 else
2934 i3notes = i2notes;
2935 i2notes = 0;
2938 LOG_LINKS (i3) = 0;
2939 REG_NOTES (i3) = 0;
2940 LOG_LINKS (i2) = 0;
2941 REG_NOTES (i2) = 0;
2943 if (newi2pat)
2945 INSN_CODE (i2) = i2_code_number;
2946 PATTERN (i2) = newi2pat;
2948 else
2949 SET_INSN_DELETED (i2);
2951 if (i1)
2953 LOG_LINKS (i1) = 0;
2954 REG_NOTES (i1) = 0;
2955 SET_INSN_DELETED (i1);
2958 /* Get death notes for everything that is now used in either I3 or
2959 I2 and used to die in a previous insn. If we built two new
2960 patterns, move from I1 to I2 then I2 to I3 so that we get the
2961 proper movement on registers that I2 modifies. */
2963 if (newi2pat)
2965 move_deaths (newi2pat, NULL_RTX, INSN_CUID (i1), i2, &midnotes);
2966 move_deaths (newpat, newi2pat, INSN_CUID (i1), i3, &midnotes);
2968 else
2969 move_deaths (newpat, NULL_RTX, i1 ? INSN_CUID (i1) : INSN_CUID (i2),
2970 i3, &midnotes);
2972 /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */
2973 if (i3notes)
2974 distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
2975 elim_i2, elim_i1);
2976 if (i2notes)
2977 distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
2978 elim_i2, elim_i1);
2979 if (i1notes)
2980 distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
2981 elim_i2, elim_i1);
2982 if (midnotes)
2983 distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2984 elim_i2, elim_i1);
2986 /* Distribute any notes added to I2 or I3 by recog_for_combine. We
2987 know these are REG_UNUSED and want them to go to the desired insn,
2988 so we always pass it as i3. We have not counted the notes in
2989 reg_n_deaths yet, so we need to do so now. */
2991 if (newi2pat && new_i2_notes)
2993 for (temp = new_i2_notes; temp; temp = XEXP (temp, 1))
2994 if (REG_P (XEXP (temp, 0)))
2995 REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2997 distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3000 if (new_i3_notes)
3002 for (temp = new_i3_notes; temp; temp = XEXP (temp, 1))
3003 if (REG_P (XEXP (temp, 0)))
3004 REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
3006 distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
3009 /* If I3DEST was used in I3SRC, it really died in I3. We may need to
3010 put a REG_DEAD note for it somewhere. If NEWI2PAT exists and sets
3011 I3DEST, the death must be somewhere before I2, not I3. If we passed I3
3012 in that case, it might delete I2. Similarly for I2 and I1.
3013 Show an additional death due to the REG_DEAD note we make here. If
3014 we discard it in distribute_notes, we will decrement it again. */
3016 if (i3dest_killed)
3018 if (REG_P (i3dest_killed))
3019 REG_N_DEATHS (REGNO (i3dest_killed))++;
3021 if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
3022 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
3023 NULL_RTX),
3024 NULL_RTX, i2, NULL_RTX, elim_i2, elim_i1);
3025 else
3026 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
3027 NULL_RTX),
3028 NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3029 elim_i2, elim_i1);
3032 if (i2dest_in_i2src)
3034 if (REG_P (i2dest))
3035 REG_N_DEATHS (REGNO (i2dest))++;
3037 if (newi2pat && reg_set_p (i2dest, newi2pat))
3038 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
3039 NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3040 else
3041 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
3042 NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3043 NULL_RTX, NULL_RTX);
3046 if (i1dest_in_i1src)
3048 if (REG_P (i1dest))
3049 REG_N_DEATHS (REGNO (i1dest))++;
3051 if (newi2pat && reg_set_p (i1dest, newi2pat))
3052 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
3053 NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
3054 else
3055 distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
3056 NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
3057 NULL_RTX, NULL_RTX);
3060 distribute_links (i3links);
3061 distribute_links (i2links);
3062 distribute_links (i1links);
3064 if (REG_P (i2dest))
3066 rtx link;
3067 rtx i2_insn = 0, i2_val = 0, set;
3069 /* The insn that used to set this register doesn't exist, and
3070 this life of the register may not exist either. See if one of
3071 I3's links points to an insn that sets I2DEST. If it does,
3072 that is now the last known value for I2DEST. If we don't update
3073 this and I2 set the register to a value that depended on its old
3074 contents, we will get confused. If this insn is used, thing
3075 will be set correctly in combine_instructions. */
3077 for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
3078 if ((set = single_set (XEXP (link, 0))) != 0
3079 && rtx_equal_p (i2dest, SET_DEST (set)))
3080 i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
3082 record_value_for_reg (i2dest, i2_insn, i2_val);
3084 /* If the reg formerly set in I2 died only once and that was in I3,
3085 zero its use count so it won't make `reload' do any work. */
3086 if (! added_sets_2
3087 && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
3088 && ! i2dest_in_i2src)
3090 regno = REGNO (i2dest);
3091 REG_N_SETS (regno)--;
3095 if (i1 && REG_P (i1dest))
3097 rtx link;
3098 rtx i1_insn = 0, i1_val = 0, set;
3100 for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
3101 if ((set = single_set (XEXP (link, 0))) != 0
3102 && rtx_equal_p (i1dest, SET_DEST (set)))
3103 i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
3105 record_value_for_reg (i1dest, i1_insn, i1_val);
3107 regno = REGNO (i1dest);
3108 if (! added_sets_1 && ! i1dest_in_i1src)
3109 REG_N_SETS (regno)--;
3112 /* Update reg_stat[].nonzero_bits et al for any changes that may have
3113 been made to this insn. The order of
3114 set_nonzero_bits_and_sign_copies() is important. Because newi2pat
3115 can affect nonzero_bits of newpat */
3116 if (newi2pat)
3117 note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
3118 note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
3120 /* Set new_direct_jump_p if a new return or simple jump instruction
3121 has been created.
3123 If I3 is now an unconditional jump, ensure that it has a
3124 BARRIER following it since it may have initially been a
3125 conditional jump. It may also be the last nonnote insn. */
3127 if (returnjump_p (i3) || any_uncondjump_p (i3))
3129 *new_direct_jump_p = 1;
3130 mark_jump_label (PATTERN (i3), i3, 0);
3132 if ((temp = next_nonnote_insn (i3)) == NULL_RTX
3133 || !BARRIER_P (temp))
3134 emit_barrier_after (i3);
3137 if (undobuf.other_insn != NULL_RTX
3138 && (returnjump_p (undobuf.other_insn)
3139 || any_uncondjump_p (undobuf.other_insn)))
3141 *new_direct_jump_p = 1;
3143 if ((temp = next_nonnote_insn (undobuf.other_insn)) == NULL_RTX
3144 || !BARRIER_P (temp))
3145 emit_barrier_after (undobuf.other_insn);
3148 /* An NOOP jump does not need barrier, but it does need cleaning up
3149 of CFG. */
3150 if (GET_CODE (newpat) == SET
3151 && SET_SRC (newpat) == pc_rtx
3152 && SET_DEST (newpat) == pc_rtx)
3153 *new_direct_jump_p = 1;
3156 combine_successes++;
3157 undo_commit ();
3159 if (added_links_insn
3160 && (newi2pat == 0 || INSN_CUID (added_links_insn) < INSN_CUID (i2))
3161 && INSN_CUID (added_links_insn) < INSN_CUID (i3))
3162 return added_links_insn;
3163 else
3164 return newi2pat ? i2 : i3;
3167 /* Undo all the modifications recorded in undobuf. */
3169 static void
3170 undo_all (void)
3172 struct undo *undo, *next;
3174 for (undo = undobuf.undos; undo; undo = next)
3176 next = undo->next;
3177 if (undo->is_int)
3178 *undo->where.i = undo->old_contents.i;
3179 else
3180 *undo->where.r = undo->old_contents.r;
3182 undo->next = undobuf.frees;
3183 undobuf.frees = undo;
3186 undobuf.undos = 0;
3189 /* We've committed to accepting the changes we made. Move all
3190 of the undos to the free list. */
3192 static void
3193 undo_commit (void)
3195 struct undo *undo, *next;
3197 for (undo = undobuf.undos; undo; undo = next)
3199 next = undo->next;
3200 undo->next = undobuf.frees;
3201 undobuf.frees = undo;
3203 undobuf.undos = 0;
3207 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
3208 where we have an arithmetic expression and return that point. LOC will
3209 be inside INSN.
3211 try_combine will call this function to see if an insn can be split into
3212 two insns. */
3214 static rtx *
3215 find_split_point (rtx *loc, rtx insn)
3217 rtx x = *loc;
3218 enum rtx_code code = GET_CODE (x);
3219 rtx *split;
3220 unsigned HOST_WIDE_INT len = 0;
3221 HOST_WIDE_INT pos = 0;
3222 int unsignedp = 0;
3223 rtx inner = NULL_RTX;
3225 /* First special-case some codes. */
3226 switch (code)
3228 case SUBREG:
3229 #ifdef INSN_SCHEDULING
3230 /* If we are making a paradoxical SUBREG invalid, it becomes a split
3231 point. */
3232 if (MEM_P (SUBREG_REG (x)))
3233 return loc;
3234 #endif
3235 return find_split_point (&SUBREG_REG (x), insn);
3237 case MEM:
3238 #ifdef HAVE_lo_sum
3239 /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
3240 using LO_SUM and HIGH. */
3241 if (GET_CODE (XEXP (x, 0)) == CONST
3242 || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
3244 SUBST (XEXP (x, 0),
3245 gen_rtx_LO_SUM (Pmode,
3246 gen_rtx_HIGH (Pmode, XEXP (x, 0)),
3247 XEXP (x, 0)));
3248 return &XEXP (XEXP (x, 0), 0);
3250 #endif
3252 /* If we have a PLUS whose second operand is a constant and the
3253 address is not valid, perhaps will can split it up using
3254 the machine-specific way to split large constants. We use
3255 the first pseudo-reg (one of the virtual regs) as a placeholder;
3256 it will not remain in the result. */
3257 if (GET_CODE (XEXP (x, 0)) == PLUS
3258 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3259 && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
3261 rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
3262 rtx seq = split_insns (gen_rtx_SET (VOIDmode, reg, XEXP (x, 0)),
3263 subst_insn);
3265 /* This should have produced two insns, each of which sets our
3266 placeholder. If the source of the second is a valid address,
3267 we can make put both sources together and make a split point
3268 in the middle. */
3270 if (seq
3271 && NEXT_INSN (seq) != NULL_RTX
3272 && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
3273 && NONJUMP_INSN_P (seq)
3274 && GET_CODE (PATTERN (seq)) == SET
3275 && SET_DEST (PATTERN (seq)) == reg
3276 && ! reg_mentioned_p (reg,
3277 SET_SRC (PATTERN (seq)))
3278 && NONJUMP_INSN_P (NEXT_INSN (seq))
3279 && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
3280 && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
3281 && memory_address_p (GET_MODE (x),
3282 SET_SRC (PATTERN (NEXT_INSN (seq)))))
3284 rtx src1 = SET_SRC (PATTERN (seq));
3285 rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
3287 /* Replace the placeholder in SRC2 with SRC1. If we can
3288 find where in SRC2 it was placed, that can become our
3289 split point and we can replace this address with SRC2.
3290 Just try two obvious places. */
3292 src2 = replace_rtx (src2, reg, src1);
3293 split = 0;
3294 if (XEXP (src2, 0) == src1)
3295 split = &XEXP (src2, 0);
3296 else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
3297 && XEXP (XEXP (src2, 0), 0) == src1)
3298 split = &XEXP (XEXP (src2, 0), 0);
3300 if (split)
3302 SUBST (XEXP (x, 0), src2);
3303 return split;
3307 /* If that didn't work, perhaps the first operand is complex and
3308 needs to be computed separately, so make a split point there.
3309 This will occur on machines that just support REG + CONST
3310 and have a constant moved through some previous computation. */
3312 else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
3313 && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
3314 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
3315 return &XEXP (XEXP (x, 0), 0);
3317 break;
3319 case SET:
3320 #ifdef HAVE_cc0
3321 /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
3322 ZERO_EXTRACT, the most likely reason why this doesn't match is that
3323 we need to put the operand into a register. So split at that
3324 point. */
3326 if (SET_DEST (x) == cc0_rtx
3327 && GET_CODE (SET_SRC (x)) != COMPARE
3328 && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
3329 && !OBJECT_P (SET_SRC (x))
3330 && ! (GET_CODE (SET_SRC (x)) == SUBREG
3331 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
3332 return &SET_SRC (x);
3333 #endif
3335 /* See if we can split SET_SRC as it stands. */
3336 split = find_split_point (&SET_SRC (x), insn);
3337 if (split && split != &SET_SRC (x))
3338 return split;
3340 /* See if we can split SET_DEST as it stands. */
3341 split = find_split_point (&SET_DEST (x), insn);
3342 if (split && split != &SET_DEST (x))
3343 return split;
3345 /* See if this is a bitfield assignment with everything constant. If
3346 so, this is an IOR of an AND, so split it into that. */
3347 if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
3348 && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
3349 <= HOST_BITS_PER_WIDE_INT)
3350 && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
3351 && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
3352 && GET_CODE (SET_SRC (x)) == CONST_INT
3353 && ((INTVAL (XEXP (SET_DEST (x), 1))
3354 + INTVAL (XEXP (SET_DEST (x), 2)))
3355 <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
3356 && ! side_effects_p (XEXP (SET_DEST (x), 0)))
3358 HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
3359 unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
3360 unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
3361 rtx dest = XEXP (SET_DEST (x), 0);
3362 enum machine_mode mode = GET_MODE (dest);
3363 unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
3365 if (BITS_BIG_ENDIAN)
3366 pos = GET_MODE_BITSIZE (mode) - len - pos;
3368 if (src == mask)
3369 SUBST (SET_SRC (x),
3370 simplify_gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
3371 else
3373 rtx negmask = gen_int_mode (~(mask << pos), mode);
3374 SUBST (SET_SRC (x),
3375 simplify_gen_binary (IOR, mode,
3376 simplify_gen_binary (AND, mode,
3377 dest, negmask),
3378 GEN_INT (src << pos)));
3381 SUBST (SET_DEST (x), dest);
3383 split = find_split_point (&SET_SRC (x), insn);
3384 if (split && split != &SET_SRC (x))
3385 return split;
3388 /* Otherwise, see if this is an operation that we can split into two.
3389 If so, try to split that. */
3390 code = GET_CODE (SET_SRC (x));
3392 switch (code)
3394 case AND:
3395 /* If we are AND'ing with a large constant that is only a single
3396 bit and the result is only being used in a context where we
3397 need to know if it is zero or nonzero, replace it with a bit
3398 extraction. This will avoid the large constant, which might
3399 have taken more than one insn to make. If the constant were
3400 not a valid argument to the AND but took only one insn to make,
3401 this is no worse, but if it took more than one insn, it will
3402 be better. */
3404 if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3405 && REG_P (XEXP (SET_SRC (x), 0))
3406 && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
3407 && REG_P (SET_DEST (x))
3408 && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
3409 && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
3410 && XEXP (*split, 0) == SET_DEST (x)
3411 && XEXP (*split, 1) == const0_rtx)
3413 rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
3414 XEXP (SET_SRC (x), 0),
3415 pos, NULL_RTX, 1, 1, 0, 0);
3416 if (extraction != 0)
3418 SUBST (SET_SRC (x), extraction);
3419 return find_split_point (loc, insn);
3422 break;
3424 case NE:
3425 /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
3426 is known to be on, this can be converted into a NEG of a shift. */
3427 if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
3428 && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
3429 && 1 <= (pos = exact_log2
3430 (nonzero_bits (XEXP (SET_SRC (x), 0),
3431 GET_MODE (XEXP (SET_SRC (x), 0))))))
3433 enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
3435 SUBST (SET_SRC (x),
3436 gen_rtx_NEG (mode,
3437 gen_rtx_LSHIFTRT (mode,
3438 XEXP (SET_SRC (x), 0),
3439 GEN_INT (pos))));
3441 split = find_split_point (&SET_SRC (x), insn);
3442 if (split && split != &SET_SRC (x))
3443 return split;
3445 break;
3447 case SIGN_EXTEND:
3448 inner = XEXP (SET_SRC (x), 0);
3450 /* We can't optimize if either mode is a partial integer
3451 mode as we don't know how many bits are significant
3452 in those modes. */
3453 if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
3454 || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
3455 break;
3457 pos = 0;
3458 len = GET_MODE_BITSIZE (GET_MODE (inner));
3459 unsignedp = 0;
3460 break;
3462 case SIGN_EXTRACT:
3463 case ZERO_EXTRACT:
3464 if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
3465 && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
3467 inner = XEXP (SET_SRC (x), 0);
3468 len = INTVAL (XEXP (SET_SRC (x), 1));
3469 pos = INTVAL (XEXP (SET_SRC (x), 2));
3471 if (BITS_BIG_ENDIAN)
3472 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
3473 unsignedp = (code == ZERO_EXTRACT);
3475 break;
3477 default:
3478 break;
3481 if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
3483 enum machine_mode mode = GET_MODE (SET_SRC (x));
3485 /* For unsigned, we have a choice of a shift followed by an
3486 AND or two shifts. Use two shifts for field sizes where the
3487 constant might be too large. We assume here that we can
3488 always at least get 8-bit constants in an AND insn, which is
3489 true for every current RISC. */
3491 if (unsignedp && len <= 8)
3493 SUBST (SET_SRC (x),
3494 gen_rtx_AND (mode,
3495 gen_rtx_LSHIFTRT
3496 (mode, gen_lowpart (mode, inner),
3497 GEN_INT (pos)),
3498 GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
3500 split = find_split_point (&SET_SRC (x), insn);
3501 if (split && split != &SET_SRC (x))
3502 return split;
3504 else
3506 SUBST (SET_SRC (x),
3507 gen_rtx_fmt_ee
3508 (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
3509 gen_rtx_ASHIFT (mode,
3510 gen_lowpart (mode, inner),
3511 GEN_INT (GET_MODE_BITSIZE (mode)
3512 - len - pos)),
3513 GEN_INT (GET_MODE_BITSIZE (mode) - len)));
3515 split = find_split_point (&SET_SRC (x), insn);
3516 if (split && split != &SET_SRC (x))
3517 return split;
3521 /* See if this is a simple operation with a constant as the second
3522 operand. It might be that this constant is out of range and hence
3523 could be used as a split point. */
3524 if (BINARY_P (SET_SRC (x))
3525 && CONSTANT_P (XEXP (SET_SRC (x), 1))
3526 && (OBJECT_P (XEXP (SET_SRC (x), 0))
3527 || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
3528 && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
3529 return &XEXP (SET_SRC (x), 1);
3531 /* Finally, see if this is a simple operation with its first operand
3532 not in a register. The operation might require this operand in a
3533 register, so return it as a split point. We can always do this
3534 because if the first operand were another operation, we would have
3535 already found it as a split point. */
3536 if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
3537 && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
3538 return &XEXP (SET_SRC (x), 0);
3540 return 0;
3542 case AND:
3543 case IOR:
3544 /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
3545 it is better to write this as (not (ior A B)) so we can split it.
3546 Similarly for IOR. */
3547 if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
3549 SUBST (*loc,
3550 gen_rtx_NOT (GET_MODE (x),
3551 gen_rtx_fmt_ee (code == IOR ? AND : IOR,
3552 GET_MODE (x),
3553 XEXP (XEXP (x, 0), 0),
3554 XEXP (XEXP (x, 1), 0))));
3555 return find_split_point (loc, insn);
3558 /* Many RISC machines have a large set of logical insns. If the
3559 second operand is a NOT, put it first so we will try to split the
3560 other operand first. */
3561 if (GET_CODE (XEXP (x, 1)) == NOT)
3563 rtx tem = XEXP (x, 0);
3564 SUBST (XEXP (x, 0), XEXP (x, 1));
3565 SUBST (XEXP (x, 1), tem);
3567 break;
3569 default:
3570 break;
3573 /* Otherwise, select our actions depending on our rtx class. */
3574 switch (GET_RTX_CLASS (code))
3576 case RTX_BITFIELD_OPS: /* This is ZERO_EXTRACT and SIGN_EXTRACT. */
3577 case RTX_TERNARY:
3578 split = find_split_point (&XEXP (x, 2), insn);
3579 if (split)
3580 return split;
3581 /* ... fall through ... */
3582 case RTX_BIN_ARITH:
3583 case RTX_COMM_ARITH:
3584 case RTX_COMPARE:
3585 case RTX_COMM_COMPARE:
3586 split = find_split_point (&XEXP (x, 1), insn);
3587 if (split)
3588 return split;
3589 /* ... fall through ... */
3590 case RTX_UNARY:
3591 /* Some machines have (and (shift ...) ...) insns. If X is not
3592 an AND, but XEXP (X, 0) is, use it as our split point. */
3593 if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
3594 return &XEXP (x, 0);
3596 split = find_split_point (&XEXP (x, 0), insn);
3597 if (split)
3598 return split;
3599 return loc;
3601 default:
3602 /* Otherwise, we don't have a split point. */
3603 return 0;
3607 /* Throughout X, replace FROM with TO, and return the result.
3608 The result is TO if X is FROM;
3609 otherwise the result is X, but its contents may have been modified.
3610 If they were modified, a record was made in undobuf so that
3611 undo_all will (among other things) return X to its original state.
3613 If the number of changes necessary is too much to record to undo,
3614 the excess changes are not made, so the result is invalid.
3615 The changes already made can still be undone.
3616 undobuf.num_undo is incremented for such changes, so by testing that
3617 the caller can tell whether the result is valid.
3619 `n_occurrences' is incremented each time FROM is replaced.
3621 IN_DEST is nonzero if we are processing the SET_DEST of a SET.
3623 UNIQUE_COPY is nonzero if each substitution must be unique. We do this
3624 by copying if `n_occurrences' is nonzero. */
3626 static rtx
3627 subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
3629 enum rtx_code code = GET_CODE (x);
3630 enum machine_mode op0_mode = VOIDmode;
3631 const char *fmt;
3632 int len, i;
3633 rtx new;
3635 /* Two expressions are equal if they are identical copies of a shared
3636 RTX or if they are both registers with the same register number
3637 and mode. */
3639 #define COMBINE_RTX_EQUAL_P(X,Y) \
3640 ((X) == (Y) \
3641 || (REG_P (X) && REG_P (Y) \
3642 && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
3644 if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
3646 n_occurrences++;
3647 return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
3650 /* If X and FROM are the same register but different modes, they will
3651 not have been seen as equal above. However, flow.c will make a
3652 LOG_LINKS entry for that case. If we do nothing, we will try to
3653 rerecognize our original insn and, when it succeeds, we will
3654 delete the feeding insn, which is incorrect.
3656 So force this insn not to match in this (rare) case. */
3657 if (! in_dest && code == REG && REG_P (from)
3658 && REGNO (x) == REGNO (from))
3659 return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
3661 /* If this is an object, we are done unless it is a MEM or LO_SUM, both
3662 of which may contain things that can be combined. */
3663 if (code != MEM && code != LO_SUM && OBJECT_P (x))
3664 return x;
3666 /* It is possible to have a subexpression appear twice in the insn.
3667 Suppose that FROM is a register that appears within TO.
3668 Then, after that subexpression has been scanned once by `subst',
3669 the second time it is scanned, TO may be found. If we were
3670 to scan TO here, we would find FROM within it and create a
3671 self-referent rtl structure which is completely wrong. */
3672 if (COMBINE_RTX_EQUAL_P (x, to))
3673 return to;
3675 /* Parallel asm_operands need special attention because all of the
3676 inputs are shared across the arms. Furthermore, unsharing the
3677 rtl results in recognition failures. Failure to handle this case
3678 specially can result in circular rtl.
3680 Solve this by doing a normal pass across the first entry of the
3681 parallel, and only processing the SET_DESTs of the subsequent
3682 entries. Ug. */
3684 if (code == PARALLEL
3685 && GET_CODE (XVECEXP (x, 0, 0)) == SET
3686 && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
3688 new = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
3690 /* If this substitution failed, this whole thing fails. */
3691 if (GET_CODE (new) == CLOBBER
3692 && XEXP (new, 0) == const0_rtx)
3693 return new;
3695 SUBST (XVECEXP (x, 0, 0), new);
3697 for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
3699 rtx dest = SET_DEST (XVECEXP (x, 0, i));
3701 if (!REG_P (dest)
3702 && GET_CODE (dest) != CC0
3703 && GET_CODE (dest) != PC)
3705 new = subst (dest, from, to, 0, unique_copy);
3707 /* If this substitution failed, this whole thing fails. */
3708 if (GET_CODE (new) == CLOBBER
3709 && XEXP (new, 0) == const0_rtx)
3710 return new;
3712 SUBST (SET_DEST (XVECEXP (x, 0, i)), new);
3716 else
3718 len = GET_RTX_LENGTH (code);
3719 fmt = GET_RTX_FORMAT (code);
3721 /* We don't need to process a SET_DEST that is a register, CC0,
3722 or PC, so set up to skip this common case. All other cases
3723 where we want to suppress replacing something inside a
3724 SET_SRC are handled via the IN_DEST operand. */
3725 if (code == SET
3726 && (REG_P (SET_DEST (x))
3727 || GET_CODE (SET_DEST (x)) == CC0
3728 || GET_CODE (SET_DEST (x)) == PC))
3729 fmt = "ie";
3731 /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
3732 constant. */
3733 if (fmt[0] == 'e')
3734 op0_mode = GET_MODE (XEXP (x, 0));
3736 for (i = 0; i < len; i++)
3738 if (fmt[i] == 'E')
3740 int j;
3741 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3743 if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
3745 new = (unique_copy && n_occurrences
3746 ? copy_rtx (to) : to);
3747 n_occurrences++;
3749 else
3751 new = subst (XVECEXP (x, i, j), from, to, 0,
3752 unique_copy);
3754 /* If this substitution failed, this whole thing
3755 fails. */
3756 if (GET_CODE (new) == CLOBBER
3757 && XEXP (new, 0) == const0_rtx)
3758 return new;
3761 SUBST (XVECEXP (x, i, j), new);
3764 else if (fmt[i] == 'e')
3766 /* If this is a register being set, ignore it. */
3767 new = XEXP (x, i);
3768 if (in_dest
3769 && i == 0
3770 && (((code == SUBREG || code == ZERO_EXTRACT)
3771 && REG_P (new))
3772 || code == STRICT_LOW_PART))
3775 else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
3777 /* In general, don't install a subreg involving two
3778 modes not tieable. It can worsen register
3779 allocation, and can even make invalid reload
3780 insns, since the reg inside may need to be copied
3781 from in the outside mode, and that may be invalid
3782 if it is an fp reg copied in integer mode.
3784 We allow two exceptions to this: It is valid if
3785 it is inside another SUBREG and the mode of that
3786 SUBREG and the mode of the inside of TO is
3787 tieable and it is valid if X is a SET that copies
3788 FROM to CC0. */
3790 if (GET_CODE (to) == SUBREG
3791 && ! MODES_TIEABLE_P (GET_MODE (to),
3792 GET_MODE (SUBREG_REG (to)))
3793 && ! (code == SUBREG
3794 && MODES_TIEABLE_P (GET_MODE (x),
3795 GET_MODE (SUBREG_REG (to))))
3796 #ifdef HAVE_cc0
3797 && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
3798 #endif
3800 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3802 #ifdef CANNOT_CHANGE_MODE_CLASS
3803 if (code == SUBREG
3804 && REG_P (to)
3805 && REGNO (to) < FIRST_PSEUDO_REGISTER
3806 && REG_CANNOT_CHANGE_MODE_P (REGNO (to),
3807 GET_MODE (to),
3808 GET_MODE (x)))
3809 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3810 #endif
3812 new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
3813 n_occurrences++;
3815 else
3816 /* If we are in a SET_DEST, suppress most cases unless we
3817 have gone inside a MEM, in which case we want to
3818 simplify the address. We assume here that things that
3819 are actually part of the destination have their inner
3820 parts in the first expression. This is true for SUBREG,
3821 STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
3822 things aside from REG and MEM that should appear in a
3823 SET_DEST. */
3824 new = subst (XEXP (x, i), from, to,
3825 (((in_dest
3826 && (code == SUBREG || code == STRICT_LOW_PART
3827 || code == ZERO_EXTRACT))
3828 || code == SET)
3829 && i == 0), unique_copy);
3831 /* If we found that we will have to reject this combination,
3832 indicate that by returning the CLOBBER ourselves, rather than
3833 an expression containing it. This will speed things up as
3834 well as prevent accidents where two CLOBBERs are considered
3835 to be equal, thus producing an incorrect simplification. */
3837 if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
3838 return new;
3840 if (GET_CODE (x) == SUBREG
3841 && (GET_CODE (new) == CONST_INT
3842 || GET_CODE (new) == CONST_DOUBLE))
3844 enum machine_mode mode = GET_MODE (x);
3846 x = simplify_subreg (GET_MODE (x), new,
3847 GET_MODE (SUBREG_REG (x)),
3848 SUBREG_BYTE (x));
3849 if (! x)
3850 x = gen_rtx_CLOBBER (mode, const0_rtx);
3852 else if (GET_CODE (new) == CONST_INT
3853 && GET_CODE (x) == ZERO_EXTEND)
3855 x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
3856 new, GET_MODE (XEXP (x, 0)));
3857 gcc_assert (x);
3859 else
3860 SUBST (XEXP (x, i), new);
3865 /* Try to simplify X. If the simplification changed the code, it is likely
3866 that further simplification will help, so loop, but limit the number
3867 of repetitions that will be performed. */
3869 for (i = 0; i < 4; i++)
3871 /* If X is sufficiently simple, don't bother trying to do anything
3872 with it. */
3873 if (code != CONST_INT && code != REG && code != CLOBBER)
3874 x = combine_simplify_rtx (x, op0_mode, in_dest);
3876 if (GET_CODE (x) == code)
3877 break;
3879 code = GET_CODE (x);
3881 /* We no longer know the original mode of operand 0 since we
3882 have changed the form of X) */
3883 op0_mode = VOIDmode;
3886 return x;
3889 /* Simplify X, a piece of RTL. We just operate on the expression at the
3890 outer level; call `subst' to simplify recursively. Return the new
3891 expression.
3893 OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero
3894 if we are inside a SET_DEST. */
3896 static rtx
3897 combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
3899 enum rtx_code code = GET_CODE (x);
3900 enum machine_mode mode = GET_MODE (x);
3901 rtx temp;
3902 rtx reversed;
3903 int i;
3905 /* If this is a commutative operation, put a constant last and a complex
3906 expression first. We don't need to do this for comparisons here. */
3907 if (COMMUTATIVE_ARITH_P (x)
3908 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
3910 temp = XEXP (x, 0);
3911 SUBST (XEXP (x, 0), XEXP (x, 1));
3912 SUBST (XEXP (x, 1), temp);
3915 /* If this is a simple operation applied to an IF_THEN_ELSE, try
3916 applying it to the arms of the IF_THEN_ELSE. This often simplifies
3917 things. Check for cases where both arms are testing the same
3918 condition.
3920 Don't do anything if all operands are very simple. */
3922 if ((BINARY_P (x)
3923 && ((!OBJECT_P (XEXP (x, 0))
3924 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3925 && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
3926 || (!OBJECT_P (XEXP (x, 1))
3927 && ! (GET_CODE (XEXP (x, 1)) == SUBREG
3928 && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
3929 || (UNARY_P (x)
3930 && (!OBJECT_P (XEXP (x, 0))
3931 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3932 && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
3934 rtx cond, true_rtx, false_rtx;
3936 cond = if_then_else_cond (x, &true_rtx, &false_rtx);
3937 if (cond != 0
3938 /* If everything is a comparison, what we have is highly unlikely
3939 to be simpler, so don't use it. */
3940 && ! (COMPARISON_P (x)
3941 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
3943 rtx cop1 = const0_rtx;
3944 enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
3946 if (cond_code == NE && COMPARISON_P (cond))
3947 return x;
3949 /* Simplify the alternative arms; this may collapse the true and
3950 false arms to store-flag values. Be careful to use copy_rtx
3951 here since true_rtx or false_rtx might share RTL with x as a
3952 result of the if_then_else_cond call above. */
3953 true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0);
3954 false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0);
3956 /* If true_rtx and false_rtx are not general_operands, an if_then_else
3957 is unlikely to be simpler. */
3958 if (general_operand (true_rtx, VOIDmode)
3959 && general_operand (false_rtx, VOIDmode))
3961 enum rtx_code reversed;
3963 /* Restarting if we generate a store-flag expression will cause
3964 us to loop. Just drop through in this case. */
3966 /* If the result values are STORE_FLAG_VALUE and zero, we can
3967 just make the comparison operation. */
3968 if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
3969 x = simplify_gen_relational (cond_code, mode, VOIDmode,
3970 cond, cop1);
3971 else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
3972 && ((reversed = reversed_comparison_code_parts
3973 (cond_code, cond, cop1, NULL))
3974 != UNKNOWN))
3975 x = simplify_gen_relational (reversed, mode, VOIDmode,
3976 cond, cop1);
3978 /* Likewise, we can make the negate of a comparison operation
3979 if the result values are - STORE_FLAG_VALUE and zero. */
3980 else if (GET_CODE (true_rtx) == CONST_INT
3981 && INTVAL (true_rtx) == - STORE_FLAG_VALUE
3982 && false_rtx == const0_rtx)
3983 x = simplify_gen_unary (NEG, mode,
3984 simplify_gen_relational (cond_code,
3985 mode, VOIDmode,
3986 cond, cop1),
3987 mode);
3988 else if (GET_CODE (false_rtx) == CONST_INT
3989 && INTVAL (false_rtx) == - STORE_FLAG_VALUE
3990 && true_rtx == const0_rtx
3991 && ((reversed = reversed_comparison_code_parts
3992 (cond_code, cond, cop1, NULL))
3993 != UNKNOWN))
3994 x = simplify_gen_unary (NEG, mode,
3995 simplify_gen_relational (reversed,
3996 mode, VOIDmode,
3997 cond, cop1),
3998 mode);
3999 else
4000 return gen_rtx_IF_THEN_ELSE (mode,
4001 simplify_gen_relational (cond_code,
4002 mode,
4003 VOIDmode,
4004 cond,
4005 cop1),
4006 true_rtx, false_rtx);
4008 code = GET_CODE (x);
4009 op0_mode = VOIDmode;
4014 /* Try to fold this expression in case we have constants that weren't
4015 present before. */
4016 temp = 0;
4017 switch (GET_RTX_CLASS (code))
4019 case RTX_UNARY:
4020 if (op0_mode == VOIDmode)
4021 op0_mode = GET_MODE (XEXP (x, 0));
4022 temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
4023 break;
4024 case RTX_COMPARE:
4025 case RTX_COMM_COMPARE:
4027 enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
4028 if (cmp_mode == VOIDmode)
4030 cmp_mode = GET_MODE (XEXP (x, 1));
4031 if (cmp_mode == VOIDmode)
4032 cmp_mode = op0_mode;
4034 temp = simplify_relational_operation (code, mode, cmp_mode,
4035 XEXP (x, 0), XEXP (x, 1));
4037 break;
4038 case RTX_COMM_ARITH:
4039 case RTX_BIN_ARITH:
4040 temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
4041 break;
4042 case RTX_BITFIELD_OPS:
4043 case RTX_TERNARY:
4044 temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
4045 XEXP (x, 1), XEXP (x, 2));
4046 break;
4047 default:
4048 break;
4051 if (temp)
4053 x = temp;
4054 code = GET_CODE (temp);
4055 op0_mode = VOIDmode;
4056 mode = GET_MODE (temp);
4059 /* First see if we can apply the inverse distributive law. */
4060 if (code == PLUS || code == MINUS
4061 || code == AND || code == IOR || code == XOR)
4063 x = apply_distributive_law (x);
4064 code = GET_CODE (x);
4065 op0_mode = VOIDmode;
4068 /* If CODE is an associative operation not otherwise handled, see if we
4069 can associate some operands. This can win if they are constants or
4070 if they are logically related (i.e. (a & b) & a). */
4071 if ((code == PLUS || code == MINUS || code == MULT || code == DIV
4072 || code == AND || code == IOR || code == XOR
4073 || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
4074 && ((INTEGRAL_MODE_P (mode) && code != DIV)
4075 || (flag_unsafe_math_optimizations && FLOAT_MODE_P (mode))))
4077 if (GET_CODE (XEXP (x, 0)) == code)
4079 rtx other = XEXP (XEXP (x, 0), 0);
4080 rtx inner_op0 = XEXP (XEXP (x, 0), 1);
4081 rtx inner_op1 = XEXP (x, 1);
4082 rtx inner;
4084 /* Make sure we pass the constant operand if any as the second
4085 one if this is a commutative operation. */
4086 if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
4088 rtx tem = inner_op0;
4089 inner_op0 = inner_op1;
4090 inner_op1 = tem;
4092 inner = simplify_binary_operation (code == MINUS ? PLUS
4093 : code == DIV ? MULT
4094 : code,
4095 mode, inner_op0, inner_op1);
4097 /* For commutative operations, try the other pair if that one
4098 didn't simplify. */
4099 if (inner == 0 && COMMUTATIVE_ARITH_P (x))
4101 other = XEXP (XEXP (x, 0), 1);
4102 inner = simplify_binary_operation (code, mode,
4103 XEXP (XEXP (x, 0), 0),
4104 XEXP (x, 1));
4107 if (inner)
4108 return simplify_gen_binary (code, mode, other, inner);
4112 /* A little bit of algebraic simplification here. */
4113 switch (code)
4115 case MEM:
4116 /* Ensure that our address has any ASHIFTs converted to MULT in case
4117 address-recognizing predicates are called later. */
4118 temp = make_compound_operation (XEXP (x, 0), MEM);
4119 SUBST (XEXP (x, 0), temp);
4120 break;
4122 case SUBREG:
4123 if (op0_mode == VOIDmode)
4124 op0_mode = GET_MODE (SUBREG_REG (x));
4126 /* See if this can be moved to simplify_subreg. */
4127 if (CONSTANT_P (SUBREG_REG (x))
4128 && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
4129 /* Don't call gen_lowpart if the inner mode
4130 is VOIDmode and we cannot simplify it, as SUBREG without
4131 inner mode is invalid. */
4132 && (GET_MODE (SUBREG_REG (x)) != VOIDmode
4133 || gen_lowpart_common (mode, SUBREG_REG (x))))
4134 return gen_lowpart (mode, SUBREG_REG (x));
4136 if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
4137 break;
4139 rtx temp;
4140 temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
4141 SUBREG_BYTE (x));
4142 if (temp)
4143 return temp;
4146 /* Don't change the mode of the MEM if that would change the meaning
4147 of the address. */
4148 if (MEM_P (SUBREG_REG (x))
4149 && (MEM_VOLATILE_P (SUBREG_REG (x))
4150 || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0))))
4151 return gen_rtx_CLOBBER (mode, const0_rtx);
4153 /* Note that we cannot do any narrowing for non-constants since
4154 we might have been counting on using the fact that some bits were
4155 zero. We now do this in the SET. */
4157 break;
4159 case NOT:
4160 if (GET_CODE (XEXP (x, 0)) == SUBREG
4161 && subreg_lowpart_p (XEXP (x, 0))
4162 && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0)))
4163 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0)))))
4164 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT
4165 && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx)
4167 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0)));
4169 x = gen_rtx_ROTATE (inner_mode,
4170 simplify_gen_unary (NOT, inner_mode, const1_rtx,
4171 inner_mode),
4172 XEXP (SUBREG_REG (XEXP (x, 0)), 1));
4173 return gen_lowpart (mode, x);
4176 /* Apply De Morgan's laws to reduce number of patterns for machines
4177 with negating logical insns (and-not, nand, etc.). If result has
4178 only one NOT, put it first, since that is how the patterns are
4179 coded. */
4181 if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
4183 rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
4184 enum machine_mode op_mode;
4186 op_mode = GET_MODE (in1);
4187 in1 = simplify_gen_unary (NOT, op_mode, in1, op_mode);
4189 op_mode = GET_MODE (in2);
4190 if (op_mode == VOIDmode)
4191 op_mode = mode;
4192 in2 = simplify_gen_unary (NOT, op_mode, in2, op_mode);
4194 if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT)
4196 rtx tem = in2;
4197 in2 = in1; in1 = tem;
4200 return gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR,
4201 mode, in1, in2);
4203 break;
4205 case NEG:
4206 /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */
4207 if (GET_CODE (XEXP (x, 0)) == XOR
4208 && XEXP (XEXP (x, 0), 1) == const1_rtx
4209 && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
4210 return simplify_gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
4211 constm1_rtx);
4213 temp = expand_compound_operation (XEXP (x, 0));
4215 /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
4216 replaced by (lshiftrt X C). This will convert
4217 (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */
4219 if (GET_CODE (temp) == ASHIFTRT
4220 && GET_CODE (XEXP (temp, 1)) == CONST_INT
4221 && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
4222 return simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0),
4223 INTVAL (XEXP (temp, 1)));
4225 /* If X has only a single bit that might be nonzero, say, bit I, convert
4226 (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
4227 MODE minus 1. This will convert (neg (zero_extract X 1 Y)) to
4228 (sign_extract X 1 Y). But only do this if TEMP isn't a register
4229 or a SUBREG of one since we'd be making the expression more
4230 complex if it was just a register. */
4232 if (!REG_P (temp)
4233 && ! (GET_CODE (temp) == SUBREG
4234 && REG_P (SUBREG_REG (temp)))
4235 && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
4237 rtx temp1 = simplify_shift_const
4238 (NULL_RTX, ASHIFTRT, mode,
4239 simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
4240 GET_MODE_BITSIZE (mode) - 1 - i),
4241 GET_MODE_BITSIZE (mode) - 1 - i);
4243 /* If all we did was surround TEMP with the two shifts, we
4244 haven't improved anything, so don't use it. Otherwise,
4245 we are better off with TEMP1. */
4246 if (GET_CODE (temp1) != ASHIFTRT
4247 || GET_CODE (XEXP (temp1, 0)) != ASHIFT
4248 || XEXP (XEXP (temp1, 0), 0) != temp)
4249 return temp1;
4251 break;
4253 case TRUNCATE:
4254 /* We can't handle truncation to a partial integer mode here
4255 because we don't know the real bitsize of the partial
4256 integer mode. */
4257 if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
4258 break;
4260 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4261 && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
4262 GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
4263 SUBST (XEXP (x, 0),
4264 force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
4265 GET_MODE_MASK (mode), NULL_RTX, 0));
4267 /* (truncate:SI ({sign,zero}_extend:DI foo:SI)) == foo:SI. */
4268 if ((GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4269 || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4270 && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
4271 return XEXP (XEXP (x, 0), 0);
4273 /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
4274 (OP:SI foo:SI) if OP is NEG or ABS. */
4275 if ((GET_CODE (XEXP (x, 0)) == ABS
4276 || GET_CODE (XEXP (x, 0)) == NEG)
4277 && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SIGN_EXTEND
4278 || GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND)
4279 && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
4280 return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4281 XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
4283 /* (truncate:SI (subreg:DI (truncate:SI X) 0)) is
4284 (truncate:SI x). */
4285 if (GET_CODE (XEXP (x, 0)) == SUBREG
4286 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == TRUNCATE
4287 && subreg_lowpart_p (XEXP (x, 0)))
4288 return SUBREG_REG (XEXP (x, 0));
4290 /* If we know that the value is already truncated, we can
4291 replace the TRUNCATE with a SUBREG if TRULY_NOOP_TRUNCATION
4292 is nonzero for the corresponding modes. But don't do this
4293 for an (LSHIFTRT (MULT ...)) since this will cause problems
4294 with the umulXi3_highpart patterns. */
4295 if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
4296 GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
4297 && num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4298 >= (unsigned int) (GET_MODE_BITSIZE (mode) + 1)
4299 && ! (GET_CODE (XEXP (x, 0)) == LSHIFTRT
4300 && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT))
4301 return gen_lowpart (mode, XEXP (x, 0));
4303 /* A truncate of a comparison can be replaced with a subreg if
4304 STORE_FLAG_VALUE permits. This is like the previous test,
4305 but it works even if the comparison is done in a mode larger
4306 than HOST_BITS_PER_WIDE_INT. */
4307 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4308 && COMPARISON_P (XEXP (x, 0))
4309 && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0)
4310 return gen_lowpart (mode, XEXP (x, 0));
4312 /* Similarly, a truncate of a register whose value is a
4313 comparison can be replaced with a subreg if STORE_FLAG_VALUE
4314 permits. */
4315 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4316 && ((HOST_WIDE_INT) STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
4317 && (temp = get_last_value (XEXP (x, 0)))
4318 && COMPARISON_P (temp))
4319 return gen_lowpart (mode, XEXP (x, 0));
4321 break;
4323 case FLOAT_TRUNCATE:
4324 /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF. */
4325 if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
4326 && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
4327 return XEXP (XEXP (x, 0), 0);
4329 /* (float_truncate:SF (float_truncate:DF foo:XF))
4330 = (float_truncate:SF foo:XF).
4331 This may eliminate double rounding, so it is unsafe.
4333 (float_truncate:SF (float_extend:XF foo:DF))
4334 = (float_truncate:SF foo:DF).
4336 (float_truncate:DF (float_extend:XF foo:SF))
4337 = (float_extend:SF foo:DF). */
4338 if ((GET_CODE (XEXP (x, 0)) == FLOAT_TRUNCATE
4339 && flag_unsafe_math_optimizations)
4340 || GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND)
4341 return simplify_gen_unary (GET_MODE_SIZE (GET_MODE (XEXP (XEXP (x, 0),
4342 0)))
4343 > GET_MODE_SIZE (mode)
4344 ? FLOAT_TRUNCATE : FLOAT_EXTEND,
4345 mode,
4346 XEXP (XEXP (x, 0), 0), mode);
4348 /* (float_truncate (float x)) is (float x) */
4349 if (GET_CODE (XEXP (x, 0)) == FLOAT
4350 && (flag_unsafe_math_optimizations
4351 || ((unsigned)significand_size (GET_MODE (XEXP (x, 0)))
4352 >= (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))
4353 - num_sign_bit_copies (XEXP (XEXP (x, 0), 0),
4354 GET_MODE (XEXP (XEXP (x, 0), 0)))))))
4355 return simplify_gen_unary (FLOAT, mode,
4356 XEXP (XEXP (x, 0), 0),
4357 GET_MODE (XEXP (XEXP (x, 0), 0)));
4359 /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
4360 (OP:SF foo:SF) if OP is NEG or ABS. */
4361 if ((GET_CODE (XEXP (x, 0)) == ABS
4362 || GET_CODE (XEXP (x, 0)) == NEG)
4363 && GET_CODE (XEXP (XEXP (x, 0), 0)) == FLOAT_EXTEND
4364 && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
4365 return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4366 XEXP (XEXP (XEXP (x, 0), 0), 0), mode);
4368 /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
4369 is (float_truncate:SF x). */
4370 if (GET_CODE (XEXP (x, 0)) == SUBREG
4371 && subreg_lowpart_p (XEXP (x, 0))
4372 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == FLOAT_TRUNCATE)
4373 return SUBREG_REG (XEXP (x, 0));
4374 break;
4375 case FLOAT_EXTEND:
4376 /* (float_extend (float_extend x)) is (float_extend x)
4378 (float_extend (float x)) is (float x) assuming that double
4379 rounding can't happen.
4381 if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
4382 || (GET_CODE (XEXP (x, 0)) == FLOAT
4383 && ((unsigned)significand_size (GET_MODE (XEXP (x, 0)))
4384 >= (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))
4385 - num_sign_bit_copies (XEXP (XEXP (x, 0), 0),
4386 GET_MODE (XEXP (XEXP (x, 0), 0)))))))
4387 return simplify_gen_unary (GET_CODE (XEXP (x, 0)), mode,
4388 XEXP (XEXP (x, 0), 0),
4389 GET_MODE (XEXP (XEXP (x, 0), 0)));
4391 break;
4392 #ifdef HAVE_cc0
4393 case COMPARE:
4394 /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
4395 using cc0, in which case we want to leave it as a COMPARE
4396 so we can distinguish it from a register-register-copy. */
4397 if (XEXP (x, 1) == const0_rtx)
4398 return XEXP (x, 0);
4400 /* x - 0 is the same as x unless x's mode has signed zeros and
4401 allows rounding towards -infinity. Under those conditions,
4402 0 - 0 is -0. */
4403 if (!(HONOR_SIGNED_ZEROS (GET_MODE (XEXP (x, 0)))
4404 && HONOR_SIGN_DEPENDENT_ROUNDING (GET_MODE (XEXP (x, 0))))
4405 && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
4406 return XEXP (x, 0);
4407 break;
4408 #endif
4410 case CONST:
4411 /* (const (const X)) can become (const X). Do it this way rather than
4412 returning the inner CONST since CONST can be shared with a
4413 REG_EQUAL note. */
4414 if (GET_CODE (XEXP (x, 0)) == CONST)
4415 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4416 break;
4418 #ifdef HAVE_lo_sum
4419 case LO_SUM:
4420 /* Convert (lo_sum (high FOO) FOO) to FOO. This is necessary so we
4421 can add in an offset. find_split_point will split this address up
4422 again if it doesn't match. */
4423 if (GET_CODE (XEXP (x, 0)) == HIGH
4424 && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
4425 return XEXP (x, 1);
4426 break;
4427 #endif
4429 case PLUS:
4430 /* Canonicalize (plus (mult (neg B) C) A) to (minus A (mult B C)).
4432 if (GET_CODE (XEXP (x, 0)) == MULT
4433 && GET_CODE (XEXP (XEXP (x, 0), 0)) == NEG)
4435 rtx in1, in2;
4437 in1 = XEXP (XEXP (XEXP (x, 0), 0), 0);
4438 in2 = XEXP (XEXP (x, 0), 1);
4439 return simplify_gen_binary (MINUS, mode, XEXP (x, 1),
4440 simplify_gen_binary (MULT, mode,
4441 in1, in2));
4444 /* If we have (plus (plus (A const) B)), associate it so that CONST is
4445 outermost. That's because that's the way indexed addresses are
4446 supposed to appear. This code used to check many more cases, but
4447 they are now checked elsewhere. */
4448 if (GET_CODE (XEXP (x, 0)) == PLUS
4449 && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
4450 return simplify_gen_binary (PLUS, mode,
4451 simplify_gen_binary (PLUS, mode,
4452 XEXP (XEXP (x, 0), 0),
4453 XEXP (x, 1)),
4454 XEXP (XEXP (x, 0), 1));
4456 /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
4457 when c is (const_int (pow2 + 1) / 2) is a sign extension of a
4458 bit-field and can be replaced by either a sign_extend or a
4459 sign_extract. The `and' may be a zero_extend and the two
4460 <c>, -<c> constants may be reversed. */
4461 if (GET_CODE (XEXP (x, 0)) == XOR
4462 && GET_CODE (XEXP (x, 1)) == CONST_INT
4463 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4464 && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
4465 && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
4466 || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
4467 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4468 && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
4469 && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
4470 && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
4471 == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
4472 || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
4473 && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
4474 == (unsigned int) i + 1))))
4475 return simplify_shift_const
4476 (NULL_RTX, ASHIFTRT, mode,
4477 simplify_shift_const (NULL_RTX, ASHIFT, mode,
4478 XEXP (XEXP (XEXP (x, 0), 0), 0),
4479 GET_MODE_BITSIZE (mode) - (i + 1)),
4480 GET_MODE_BITSIZE (mode) - (i + 1));
4482 /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
4483 C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
4484 is 1. This produces better code than the alternative immediately
4485 below. */
4486 if (COMPARISON_P (XEXP (x, 0))
4487 && ((STORE_FLAG_VALUE == -1 && XEXP (x, 1) == const1_rtx)
4488 || (STORE_FLAG_VALUE == 1 && XEXP (x, 1) == constm1_rtx))
4489 && (reversed = reversed_comparison (XEXP (x, 0), mode)))
4490 return
4491 simplify_gen_unary (NEG, mode, reversed, mode);
4493 /* If only the low-order bit of X is possibly nonzero, (plus x -1)
4494 can become (ashiftrt (ashift (xor x 1) C) C) where C is
4495 the bitsize of the mode - 1. This allows simplification of
4496 "a = (b & 8) == 0;" */
4497 if (XEXP (x, 1) == constm1_rtx
4498 && !REG_P (XEXP (x, 0))
4499 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
4500 && REG_P (SUBREG_REG (XEXP (x, 0))))
4501 && nonzero_bits (XEXP (x, 0), mode) == 1)
4502 return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
4503 simplify_shift_const (NULL_RTX, ASHIFT, mode,
4504 gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
4505 GET_MODE_BITSIZE (mode) - 1),
4506 GET_MODE_BITSIZE (mode) - 1);
4508 /* If we are adding two things that have no bits in common, convert
4509 the addition into an IOR. This will often be further simplified,
4510 for example in cases like ((a & 1) + (a & 2)), which can
4511 become a & 3. */
4513 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4514 && (nonzero_bits (XEXP (x, 0), mode)
4515 & nonzero_bits (XEXP (x, 1), mode)) == 0)
4517 /* Try to simplify the expression further. */
4518 rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
4519 temp = combine_simplify_rtx (tor, mode, in_dest);
4521 /* If we could, great. If not, do not go ahead with the IOR
4522 replacement, since PLUS appears in many special purpose
4523 address arithmetic instructions. */
4524 if (GET_CODE (temp) != CLOBBER && temp != tor)
4525 return temp;
4527 break;
4529 case MINUS:
4530 /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
4531 by reversing the comparison code if valid. */
4532 if (STORE_FLAG_VALUE == 1
4533 && XEXP (x, 0) == const1_rtx
4534 && COMPARISON_P (XEXP (x, 1))
4535 && (reversed = reversed_comparison (XEXP (x, 1), mode)))
4536 return reversed;
4538 /* (minus <foo> (and <foo> (const_int -pow2))) becomes
4539 (and <foo> (const_int pow2-1)) */
4540 if (GET_CODE (XEXP (x, 1)) == AND
4541 && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
4542 && exact_log2 (-INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
4543 && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
4544 return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
4545 -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
4547 /* Canonicalize (minus A (mult (neg B) C)) to (plus (mult B C) A).
4549 if (GET_CODE (XEXP (x, 1)) == MULT
4550 && GET_CODE (XEXP (XEXP (x, 1), 0)) == NEG)
4552 rtx in1, in2;
4554 in1 = XEXP (XEXP (XEXP (x, 1), 0), 0);
4555 in2 = XEXP (XEXP (x, 1), 1);
4556 return simplify_gen_binary (PLUS, mode,
4557 simplify_gen_binary (MULT, mode,
4558 in1, in2),
4559 XEXP (x, 0));
4562 /* Canonicalize (minus (neg A) (mult B C)) to
4563 (minus (mult (neg B) C) A). */
4564 if (GET_CODE (XEXP (x, 1)) == MULT
4565 && GET_CODE (XEXP (x, 0)) == NEG)
4567 rtx in1, in2;
4569 in1 = simplify_gen_unary (NEG, mode, XEXP (XEXP (x, 1), 0), mode);
4570 in2 = XEXP (XEXP (x, 1), 1);
4571 return simplify_gen_binary (MINUS, mode,
4572 simplify_gen_binary (MULT, mode,
4573 in1, in2),
4574 XEXP (XEXP (x, 0), 0));
4577 /* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
4578 integers. */
4579 if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
4580 return simplify_gen_binary (MINUS, mode,
4581 simplify_gen_binary (MINUS, mode,
4582 XEXP (x, 0),
4583 XEXP (XEXP (x, 1), 0)),
4584 XEXP (XEXP (x, 1), 1));
4585 break;
4587 case MULT:
4588 /* If we have (mult (plus A B) C), apply the distributive law and then
4589 the inverse distributive law to see if things simplify. This
4590 occurs mostly in addresses, often when unrolling loops. */
4592 if (GET_CODE (XEXP (x, 0)) == PLUS)
4594 rtx result = distribute_and_simplify_rtx (x, 0);
4595 if (result)
4596 return result;
4599 /* Try simplify a*(b/c) as (a*b)/c. */
4600 if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
4601 && GET_CODE (XEXP (x, 0)) == DIV)
4603 rtx tem = simplify_binary_operation (MULT, mode,
4604 XEXP (XEXP (x, 0), 0),
4605 XEXP (x, 1));
4606 if (tem)
4607 return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
4609 break;
4611 case UDIV:
4612 /* If this is a divide by a power of two, treat it as a shift if
4613 its first operand is a shift. */
4614 if (GET_CODE (XEXP (x, 1)) == CONST_INT
4615 && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
4616 && (GET_CODE (XEXP (x, 0)) == ASHIFT
4617 || GET_CODE (XEXP (x, 0)) == LSHIFTRT
4618 || GET_CODE (XEXP (x, 0)) == ASHIFTRT
4619 || GET_CODE (XEXP (x, 0)) == ROTATE
4620 || GET_CODE (XEXP (x, 0)) == ROTATERT))
4621 return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
4622 break;
4624 case EQ: case NE:
4625 case GT: case GTU: case GE: case GEU:
4626 case LT: case LTU: case LE: case LEU:
4627 case UNEQ: case LTGT:
4628 case UNGT: case UNGE:
4629 case UNLT: case UNLE:
4630 case UNORDERED: case ORDERED:
4631 /* If the first operand is a condition code, we can't do anything
4632 with it. */
4633 if (GET_CODE (XEXP (x, 0)) == COMPARE
4634 || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
4635 && ! CC0_P (XEXP (x, 0))))
4637 rtx op0 = XEXP (x, 0);
4638 rtx op1 = XEXP (x, 1);
4639 enum rtx_code new_code;
4641 if (GET_CODE (op0) == COMPARE)
4642 op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
4644 /* Simplify our comparison, if possible. */
4645 new_code = simplify_comparison (code, &op0, &op1);
4647 /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
4648 if only the low-order bit is possibly nonzero in X (such as when
4649 X is a ZERO_EXTRACT of one bit). Similarly, we can convert EQ to
4650 (xor X 1) or (minus 1 X); we use the former. Finally, if X is
4651 known to be either 0 or -1, NE becomes a NEG and EQ becomes
4652 (plus X 1).
4654 Remove any ZERO_EXTRACT we made when thinking this was a
4655 comparison. It may now be simpler to use, e.g., an AND. If a
4656 ZERO_EXTRACT is indeed appropriate, it will be placed back by
4657 the call to make_compound_operation in the SET case. */
4659 if (STORE_FLAG_VALUE == 1
4660 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4661 && op1 == const0_rtx
4662 && mode == GET_MODE (op0)
4663 && nonzero_bits (op0, mode) == 1)
4664 return gen_lowpart (mode,
4665 expand_compound_operation (op0));
4667 else if (STORE_FLAG_VALUE == 1
4668 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4669 && op1 == const0_rtx
4670 && mode == GET_MODE (op0)
4671 && (num_sign_bit_copies (op0, mode)
4672 == GET_MODE_BITSIZE (mode)))
4674 op0 = expand_compound_operation (op0);
4675 return simplify_gen_unary (NEG, mode,
4676 gen_lowpart (mode, op0),
4677 mode);
4680 else if (STORE_FLAG_VALUE == 1
4681 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4682 && op1 == const0_rtx
4683 && mode == GET_MODE (op0)
4684 && nonzero_bits (op0, mode) == 1)
4686 op0 = expand_compound_operation (op0);
4687 return simplify_gen_binary (XOR, mode,
4688 gen_lowpart (mode, op0),
4689 const1_rtx);
4692 else if (STORE_FLAG_VALUE == 1
4693 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4694 && op1 == const0_rtx
4695 && mode == GET_MODE (op0)
4696 && (num_sign_bit_copies (op0, mode)
4697 == GET_MODE_BITSIZE (mode)))
4699 op0 = expand_compound_operation (op0);
4700 return plus_constant (gen_lowpart (mode, op0), 1);
4703 /* If STORE_FLAG_VALUE is -1, we have cases similar to
4704 those above. */
4705 if (STORE_FLAG_VALUE == -1
4706 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4707 && op1 == const0_rtx
4708 && (num_sign_bit_copies (op0, mode)
4709 == GET_MODE_BITSIZE (mode)))
4710 return gen_lowpart (mode,
4711 expand_compound_operation (op0));
4713 else if (STORE_FLAG_VALUE == -1
4714 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4715 && op1 == const0_rtx
4716 && mode == GET_MODE (op0)
4717 && nonzero_bits (op0, mode) == 1)
4719 op0 = expand_compound_operation (op0);
4720 return simplify_gen_unary (NEG, mode,
4721 gen_lowpart (mode, op0),
4722 mode);
4725 else if (STORE_FLAG_VALUE == -1
4726 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4727 && op1 == const0_rtx
4728 && mode == GET_MODE (op0)
4729 && (num_sign_bit_copies (op0, mode)
4730 == GET_MODE_BITSIZE (mode)))
4732 op0 = expand_compound_operation (op0);
4733 return simplify_gen_unary (NOT, mode,
4734 gen_lowpart (mode, op0),
4735 mode);
4738 /* If X is 0/1, (eq X 0) is X-1. */
4739 else if (STORE_FLAG_VALUE == -1
4740 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4741 && op1 == const0_rtx
4742 && mode == GET_MODE (op0)
4743 && nonzero_bits (op0, mode) == 1)
4745 op0 = expand_compound_operation (op0);
4746 return plus_constant (gen_lowpart (mode, op0), -1);
4749 /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
4750 one bit that might be nonzero, we can convert (ne x 0) to
4751 (ashift x c) where C puts the bit in the sign bit. Remove any
4752 AND with STORE_FLAG_VALUE when we are done, since we are only
4753 going to test the sign bit. */
4754 if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4755 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4756 && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
4757 == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
4758 && op1 == const0_rtx
4759 && mode == GET_MODE (op0)
4760 && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
4762 x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
4763 expand_compound_operation (op0),
4764 GET_MODE_BITSIZE (mode) - 1 - i);
4765 if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
4766 return XEXP (x, 0);
4767 else
4768 return x;
4771 /* If the code changed, return a whole new comparison. */
4772 if (new_code != code)
4773 return gen_rtx_fmt_ee (new_code, mode, op0, op1);
4775 /* Otherwise, keep this operation, but maybe change its operands.
4776 This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR). */
4777 SUBST (XEXP (x, 0), op0);
4778 SUBST (XEXP (x, 1), op1);
4780 break;
4782 case IF_THEN_ELSE:
4783 return simplify_if_then_else (x);
4785 case ZERO_EXTRACT:
4786 case SIGN_EXTRACT:
4787 case ZERO_EXTEND:
4788 case SIGN_EXTEND:
4789 /* If we are processing SET_DEST, we are done. */
4790 if (in_dest)
4791 return x;
4793 return expand_compound_operation (x);
4795 case SET:
4796 return simplify_set (x);
4798 case AND:
4799 case IOR:
4800 case XOR:
4801 return simplify_logical (x);
4803 case ABS:
4804 /* (abs (neg <foo>)) -> (abs <foo>) */
4805 if (GET_CODE (XEXP (x, 0)) == NEG)
4806 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4808 /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
4809 do nothing. */
4810 if (GET_MODE (XEXP (x, 0)) == VOIDmode)
4811 break;
4813 /* If operand is something known to be positive, ignore the ABS. */
4814 if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS
4815 || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4816 <= HOST_BITS_PER_WIDE_INT)
4817 && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4818 & ((HOST_WIDE_INT) 1
4819 << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))
4820 == 0)))
4821 return XEXP (x, 0);
4823 /* If operand is known to be only -1 or 0, convert ABS to NEG. */
4824 if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode))
4825 return gen_rtx_NEG (mode, XEXP (x, 0));
4827 break;
4829 case FFS:
4830 /* (ffs (*_extend <X>)) = (ffs <X>) */
4831 if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4832 || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4833 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4834 break;
4836 case POPCOUNT:
4837 case PARITY:
4838 /* (pop* (zero_extend <X>)) = (pop* <X>) */
4839 if (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4840 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4841 break;
4843 case FLOAT:
4844 /* (float (sign_extend <X>)) = (float <X>). */
4845 if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
4846 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4847 break;
4849 case ASHIFT:
4850 case LSHIFTRT:
4851 case ASHIFTRT:
4852 case ROTATE:
4853 case ROTATERT:
4854 /* If this is a shift by a constant amount, simplify it. */
4855 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
4856 return simplify_shift_const (x, code, mode, XEXP (x, 0),
4857 INTVAL (XEXP (x, 1)));
4859 else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
4860 SUBST (XEXP (x, 1),
4861 force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
4862 ((HOST_WIDE_INT) 1
4863 << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
4864 - 1,
4865 NULL_RTX, 0));
4866 break;
4868 case VEC_SELECT:
4870 rtx op0 = XEXP (x, 0);
4871 rtx op1 = XEXP (x, 1);
4872 int len;
4874 gcc_assert (GET_CODE (op1) == PARALLEL);
4875 len = XVECLEN (op1, 0);
4876 if (len == 1
4877 && GET_CODE (XVECEXP (op1, 0, 0)) == CONST_INT
4878 && GET_CODE (op0) == VEC_CONCAT)
4880 int offset = INTVAL (XVECEXP (op1, 0, 0)) * GET_MODE_SIZE (GET_MODE (x));
4882 /* Try to find the element in the VEC_CONCAT. */
4883 for (;;)
4885 if (GET_MODE (op0) == GET_MODE (x))
4886 return op0;
4887 if (GET_CODE (op0) == VEC_CONCAT)
4889 HOST_WIDE_INT op0_size = GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)));
4890 if (offset < op0_size)
4891 op0 = XEXP (op0, 0);
4892 else
4894 offset -= op0_size;
4895 op0 = XEXP (op0, 1);
4898 else
4899 break;
4904 break;
4906 default:
4907 break;
4910 return x;
4913 /* Simplify X, an IF_THEN_ELSE expression. Return the new expression. */
4915 static rtx
4916 simplify_if_then_else (rtx x)
4918 enum machine_mode mode = GET_MODE (x);
4919 rtx cond = XEXP (x, 0);
4920 rtx true_rtx = XEXP (x, 1);
4921 rtx false_rtx = XEXP (x, 2);
4922 enum rtx_code true_code = GET_CODE (cond);
4923 int comparison_p = COMPARISON_P (cond);
4924 rtx temp;
4925 int i;
4926 enum rtx_code false_code;
4927 rtx reversed;
4929 /* Simplify storing of the truth value. */
4930 if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
4931 return simplify_gen_relational (true_code, mode, VOIDmode,
4932 XEXP (cond, 0), XEXP (cond, 1));
4934 /* Also when the truth value has to be reversed. */
4935 if (comparison_p
4936 && true_rtx == const0_rtx && false_rtx == const_true_rtx
4937 && (reversed = reversed_comparison (cond, mode)))
4938 return reversed;
4940 /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
4941 in it is being compared against certain values. Get the true and false
4942 comparisons and see if that says anything about the value of each arm. */
4944 if (comparison_p
4945 && ((false_code = reversed_comparison_code (cond, NULL))
4946 != UNKNOWN)
4947 && REG_P (XEXP (cond, 0)))
4949 HOST_WIDE_INT nzb;
4950 rtx from = XEXP (cond, 0);
4951 rtx true_val = XEXP (cond, 1);
4952 rtx false_val = true_val;
4953 int swapped = 0;
4955 /* If FALSE_CODE is EQ, swap the codes and arms. */
4957 if (false_code == EQ)
4959 swapped = 1, true_code = EQ, false_code = NE;
4960 temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
4963 /* If we are comparing against zero and the expression being tested has
4964 only a single bit that might be nonzero, that is its value when it is
4965 not equal to zero. Similarly if it is known to be -1 or 0. */
4967 if (true_code == EQ && true_val == const0_rtx
4968 && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
4969 false_code = EQ, false_val = GEN_INT (nzb);
4970 else if (true_code == EQ && true_val == const0_rtx
4971 && (num_sign_bit_copies (from, GET_MODE (from))
4972 == GET_MODE_BITSIZE (GET_MODE (from))))
4973 false_code = EQ, false_val = constm1_rtx;
4975 /* Now simplify an arm if we know the value of the register in the
4976 branch and it is used in the arm. Be careful due to the potential
4977 of locally-shared RTL. */
4979 if (reg_mentioned_p (from, true_rtx))
4980 true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
4981 from, true_val),
4982 pc_rtx, pc_rtx, 0, 0);
4983 if (reg_mentioned_p (from, false_rtx))
4984 false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
4985 from, false_val),
4986 pc_rtx, pc_rtx, 0, 0);
4988 SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
4989 SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
4991 true_rtx = XEXP (x, 1);
4992 false_rtx = XEXP (x, 2);
4993 true_code = GET_CODE (cond);
4996 /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
4997 reversed, do so to avoid needing two sets of patterns for
4998 subtract-and-branch insns. Similarly if we have a constant in the true
4999 arm, the false arm is the same as the first operand of the comparison, or
5000 the false arm is more complicated than the true arm. */
5002 if (comparison_p
5003 && reversed_comparison_code (cond, NULL) != UNKNOWN
5004 && (true_rtx == pc_rtx
5005 || (CONSTANT_P (true_rtx)
5006 && GET_CODE (false_rtx) != CONST_INT && false_rtx != pc_rtx)
5007 || true_rtx == const0_rtx
5008 || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
5009 || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
5010 && !OBJECT_P (false_rtx))
5011 || reg_mentioned_p (true_rtx, false_rtx)
5012 || rtx_equal_p (false_rtx, XEXP (cond, 0))))
5014 true_code = reversed_comparison_code (cond, NULL);
5015 SUBST (XEXP (x, 0), reversed_comparison (cond, GET_MODE (cond)));
5016 SUBST (XEXP (x, 1), false_rtx);
5017 SUBST (XEXP (x, 2), true_rtx);
5019 temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5020 cond = XEXP (x, 0);
5022 /* It is possible that the conditional has been simplified out. */
5023 true_code = GET_CODE (cond);
5024 comparison_p = COMPARISON_P (cond);
5027 /* If the two arms are identical, we don't need the comparison. */
5029 if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
5030 return true_rtx;
5032 /* Convert a == b ? b : a to "a". */
5033 if (true_code == EQ && ! side_effects_p (cond)
5034 && !HONOR_NANS (mode)
5035 && rtx_equal_p (XEXP (cond, 0), false_rtx)
5036 && rtx_equal_p (XEXP (cond, 1), true_rtx))
5037 return false_rtx;
5038 else if (true_code == NE && ! side_effects_p (cond)
5039 && !HONOR_NANS (mode)
5040 && rtx_equal_p (XEXP (cond, 0), true_rtx)
5041 && rtx_equal_p (XEXP (cond, 1), false_rtx))
5042 return true_rtx;
5044 /* Look for cases where we have (abs x) or (neg (abs X)). */
5046 if (GET_MODE_CLASS (mode) == MODE_INT
5047 && GET_CODE (false_rtx) == NEG
5048 && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
5049 && comparison_p
5050 && rtx_equal_p (true_rtx, XEXP (cond, 0))
5051 && ! side_effects_p (true_rtx))
5052 switch (true_code)
5054 case GT:
5055 case GE:
5056 return simplify_gen_unary (ABS, mode, true_rtx, mode);
5057 case LT:
5058 case LE:
5059 return
5060 simplify_gen_unary (NEG, mode,
5061 simplify_gen_unary (ABS, mode, true_rtx, mode),
5062 mode);
5063 default:
5064 break;
5067 /* Look for MIN or MAX. */
5069 if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
5070 && comparison_p
5071 && rtx_equal_p (XEXP (cond, 0), true_rtx)
5072 && rtx_equal_p (XEXP (cond, 1), false_rtx)
5073 && ! side_effects_p (cond))
5074 switch (true_code)
5076 case GE:
5077 case GT:
5078 return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
5079 case LE:
5080 case LT:
5081 return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
5082 case GEU:
5083 case GTU:
5084 return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
5085 case LEU:
5086 case LTU:
5087 return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
5088 default:
5089 break;
5092 /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
5093 second operand is zero, this can be done as (OP Z (mult COND C2)) where
5094 C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
5095 SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
5096 We can do this kind of thing in some cases when STORE_FLAG_VALUE is
5097 neither 1 or -1, but it isn't worth checking for. */
5099 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
5100 && comparison_p
5101 && GET_MODE_CLASS (mode) == MODE_INT
5102 && ! side_effects_p (x))
5104 rtx t = make_compound_operation (true_rtx, SET);
5105 rtx f = make_compound_operation (false_rtx, SET);
5106 rtx cond_op0 = XEXP (cond, 0);
5107 rtx cond_op1 = XEXP (cond, 1);
5108 enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
5109 enum machine_mode m = mode;
5110 rtx z = 0, c1 = NULL_RTX;
5112 if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
5113 || GET_CODE (t) == IOR || GET_CODE (t) == XOR
5114 || GET_CODE (t) == ASHIFT
5115 || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
5116 && rtx_equal_p (XEXP (t, 0), f))
5117 c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
5119 /* If an identity-zero op is commutative, check whether there
5120 would be a match if we swapped the operands. */
5121 else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
5122 || GET_CODE (t) == XOR)
5123 && rtx_equal_p (XEXP (t, 1), f))
5124 c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
5125 else if (GET_CODE (t) == SIGN_EXTEND
5126 && (GET_CODE (XEXP (t, 0)) == PLUS
5127 || GET_CODE (XEXP (t, 0)) == MINUS
5128 || GET_CODE (XEXP (t, 0)) == IOR
5129 || GET_CODE (XEXP (t, 0)) == XOR
5130 || GET_CODE (XEXP (t, 0)) == ASHIFT
5131 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5132 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5133 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5134 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5135 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5136 && (num_sign_bit_copies (f, GET_MODE (f))
5137 > (unsigned int)
5138 (GET_MODE_BITSIZE (mode)
5139 - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
5141 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5142 extend_op = SIGN_EXTEND;
5143 m = GET_MODE (XEXP (t, 0));
5145 else if (GET_CODE (t) == SIGN_EXTEND
5146 && (GET_CODE (XEXP (t, 0)) == PLUS
5147 || GET_CODE (XEXP (t, 0)) == IOR
5148 || GET_CODE (XEXP (t, 0)) == XOR)
5149 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5150 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5151 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5152 && (num_sign_bit_copies (f, GET_MODE (f))
5153 > (unsigned int)
5154 (GET_MODE_BITSIZE (mode)
5155 - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
5157 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5158 extend_op = SIGN_EXTEND;
5159 m = GET_MODE (XEXP (t, 0));
5161 else if (GET_CODE (t) == ZERO_EXTEND
5162 && (GET_CODE (XEXP (t, 0)) == PLUS
5163 || GET_CODE (XEXP (t, 0)) == MINUS
5164 || GET_CODE (XEXP (t, 0)) == IOR
5165 || GET_CODE (XEXP (t, 0)) == XOR
5166 || GET_CODE (XEXP (t, 0)) == ASHIFT
5167 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
5168 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
5169 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
5170 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5171 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
5172 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
5173 && ((nonzero_bits (f, GET_MODE (f))
5174 & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
5175 == 0))
5177 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
5178 extend_op = ZERO_EXTEND;
5179 m = GET_MODE (XEXP (t, 0));
5181 else if (GET_CODE (t) == ZERO_EXTEND
5182 && (GET_CODE (XEXP (t, 0)) == PLUS
5183 || GET_CODE (XEXP (t, 0)) == IOR
5184 || GET_CODE (XEXP (t, 0)) == XOR)
5185 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
5186 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5187 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
5188 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
5189 && ((nonzero_bits (f, GET_MODE (f))
5190 & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
5191 == 0))
5193 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
5194 extend_op = ZERO_EXTEND;
5195 m = GET_MODE (XEXP (t, 0));
5198 if (z)
5200 temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
5201 cond_op0, cond_op1),
5202 pc_rtx, pc_rtx, 0, 0);
5203 temp = simplify_gen_binary (MULT, m, temp,
5204 simplify_gen_binary (MULT, m, c1,
5205 const_true_rtx));
5206 temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
5207 temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
5209 if (extend_op != UNKNOWN)
5210 temp = simplify_gen_unary (extend_op, mode, temp, m);
5212 return temp;
5216 /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
5217 1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
5218 negation of a single bit, we can convert this operation to a shift. We
5219 can actually do this more generally, but it doesn't seem worth it. */
5221 if (true_code == NE && XEXP (cond, 1) == const0_rtx
5222 && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
5223 && ((1 == nonzero_bits (XEXP (cond, 0), mode)
5224 && (i = exact_log2 (INTVAL (true_rtx))) >= 0)
5225 || ((num_sign_bit_copies (XEXP (cond, 0), mode)
5226 == GET_MODE_BITSIZE (mode))
5227 && (i = exact_log2 (-INTVAL (true_rtx))) >= 0)))
5228 return
5229 simplify_shift_const (NULL_RTX, ASHIFT, mode,
5230 gen_lowpart (mode, XEXP (cond, 0)), i);
5232 /* (IF_THEN_ELSE (NE REG 0) (0) (8)) is REG for nonzero_bits (REG) == 8. */
5233 if (true_code == NE && XEXP (cond, 1) == const0_rtx
5234 && false_rtx == const0_rtx && GET_CODE (true_rtx) == CONST_INT
5235 && GET_MODE (XEXP (cond, 0)) == mode
5236 && (INTVAL (true_rtx) & GET_MODE_MASK (mode))
5237 == nonzero_bits (XEXP (cond, 0), mode)
5238 && (i = exact_log2 (INTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
5239 return XEXP (cond, 0);
5241 return x;
5244 /* Simplify X, a SET expression. Return the new expression. */
5246 static rtx
5247 simplify_set (rtx x)
5249 rtx src = SET_SRC (x);
5250 rtx dest = SET_DEST (x);
5251 enum machine_mode mode
5252 = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
5253 rtx other_insn;
5254 rtx *cc_use;
5256 /* (set (pc) (return)) gets written as (return). */
5257 if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
5258 return src;
5260 /* Now that we know for sure which bits of SRC we are using, see if we can
5261 simplify the expression for the object knowing that we only need the
5262 low-order bits. */
5264 if (GET_MODE_CLASS (mode) == MODE_INT
5265 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
5267 src = force_to_mode (src, mode, ~(HOST_WIDE_INT) 0, NULL_RTX, 0);
5268 SUBST (SET_SRC (x), src);
5271 /* If we are setting CC0 or if the source is a COMPARE, look for the use of
5272 the comparison result and try to simplify it unless we already have used
5273 undobuf.other_insn. */
5274 if ((GET_MODE_CLASS (mode) == MODE_CC
5275 || GET_CODE (src) == COMPARE
5276 || CC0_P (dest))
5277 && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
5278 && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
5279 && COMPARISON_P (*cc_use)
5280 && rtx_equal_p (XEXP (*cc_use, 0), dest))
5282 enum rtx_code old_code = GET_CODE (*cc_use);
5283 enum rtx_code new_code;
5284 rtx op0, op1, tmp;
5285 int other_changed = 0;
5286 enum machine_mode compare_mode = GET_MODE (dest);
5288 if (GET_CODE (src) == COMPARE)
5289 op0 = XEXP (src, 0), op1 = XEXP (src, 1);
5290 else
5291 op0 = src, op1 = CONST0_RTX (GET_MODE (src));
5293 tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
5294 op0, op1);
5295 if (!tmp)
5296 new_code = old_code;
5297 else if (!CONSTANT_P (tmp))
5299 new_code = GET_CODE (tmp);
5300 op0 = XEXP (tmp, 0);
5301 op1 = XEXP (tmp, 1);
5303 else
5305 rtx pat = PATTERN (other_insn);
5306 undobuf.other_insn = other_insn;
5307 SUBST (*cc_use, tmp);
5309 /* Attempt to simplify CC user. */
5310 if (GET_CODE (pat) == SET)
5312 rtx new = simplify_rtx (SET_SRC (pat));
5313 if (new != NULL_RTX)
5314 SUBST (SET_SRC (pat), new);
5317 /* Convert X into a no-op move. */
5318 SUBST (SET_DEST (x), pc_rtx);
5319 SUBST (SET_SRC (x), pc_rtx);
5320 return x;
5323 /* Simplify our comparison, if possible. */
5324 new_code = simplify_comparison (new_code, &op0, &op1);
5326 #ifdef SELECT_CC_MODE
5327 /* If this machine has CC modes other than CCmode, check to see if we
5328 need to use a different CC mode here. */
5329 if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
5330 compare_mode = GET_MODE (op0);
5331 else
5332 compare_mode = SELECT_CC_MODE (new_code, op0, op1);
5334 #ifndef HAVE_cc0
5335 /* If the mode changed, we have to change SET_DEST, the mode in the
5336 compare, and the mode in the place SET_DEST is used. If SET_DEST is
5337 a hard register, just build new versions with the proper mode. If it
5338 is a pseudo, we lose unless it is only time we set the pseudo, in
5339 which case we can safely change its mode. */
5340 if (compare_mode != GET_MODE (dest))
5342 if (can_change_dest_mode (dest, 0, compare_mode))
5344 unsigned int regno = REGNO (dest);
5345 rtx new_dest = gen_rtx_REG (compare_mode, regno);
5347 if (regno >= FIRST_PSEUDO_REGISTER)
5348 SUBST (regno_reg_rtx[regno], new_dest);
5350 SUBST (SET_DEST (x), new_dest);
5351 SUBST (XEXP (*cc_use, 0), new_dest);
5352 other_changed = 1;
5354 dest = new_dest;
5357 #endif /* cc0 */
5358 #endif /* SELECT_CC_MODE */
5360 /* If the code changed, we have to build a new comparison in
5361 undobuf.other_insn. */
5362 if (new_code != old_code)
5364 int other_changed_previously = other_changed;
5365 unsigned HOST_WIDE_INT mask;
5367 SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
5368 dest, const0_rtx));
5369 other_changed = 1;
5371 /* If the only change we made was to change an EQ into an NE or
5372 vice versa, OP0 has only one bit that might be nonzero, and OP1
5373 is zero, check if changing the user of the condition code will
5374 produce a valid insn. If it won't, we can keep the original code
5375 in that insn by surrounding our operation with an XOR. */
5377 if (((old_code == NE && new_code == EQ)
5378 || (old_code == EQ && new_code == NE))
5379 && ! other_changed_previously && op1 == const0_rtx
5380 && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
5381 && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
5383 rtx pat = PATTERN (other_insn), note = 0;
5385 if ((recog_for_combine (&pat, other_insn, &note) < 0
5386 && ! check_asm_operands (pat)))
5388 PUT_CODE (*cc_use, old_code);
5389 other_changed = 0;
5391 op0 = simplify_gen_binary (XOR, GET_MODE (op0),
5392 op0, GEN_INT (mask));
5397 if (other_changed)
5398 undobuf.other_insn = other_insn;
5400 #ifdef HAVE_cc0
5401 /* If we are now comparing against zero, change our source if
5402 needed. If we do not use cc0, we always have a COMPARE. */
5403 if (op1 == const0_rtx && dest == cc0_rtx)
5405 SUBST (SET_SRC (x), op0);
5406 src = op0;
5408 else
5409 #endif
5411 /* Otherwise, if we didn't previously have a COMPARE in the
5412 correct mode, we need one. */
5413 if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
5415 SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
5416 src = SET_SRC (x);
5418 else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
5420 SUBST(SET_SRC (x), op0);
5421 src = SET_SRC (x);
5423 else
5425 /* Otherwise, update the COMPARE if needed. */
5426 SUBST (XEXP (src, 0), op0);
5427 SUBST (XEXP (src, 1), op1);
5430 else
5432 /* Get SET_SRC in a form where we have placed back any
5433 compound expressions. Then do the checks below. */
5434 src = make_compound_operation (src, SET);
5435 SUBST (SET_SRC (x), src);
5438 /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
5439 and X being a REG or (subreg (reg)), we may be able to convert this to
5440 (set (subreg:m2 x) (op)).
5442 We can always do this if M1 is narrower than M2 because that means that
5443 we only care about the low bits of the result.
5445 However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
5446 perform a narrower operation than requested since the high-order bits will
5447 be undefined. On machine where it is defined, this transformation is safe
5448 as long as M1 and M2 have the same number of words. */
5450 if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5451 && !OBJECT_P (SUBREG_REG (src))
5452 && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
5453 / UNITS_PER_WORD)
5454 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
5455 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
5456 #ifndef WORD_REGISTER_OPERATIONS
5457 && (GET_MODE_SIZE (GET_MODE (src))
5458 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5459 #endif
5460 #ifdef CANNOT_CHANGE_MODE_CLASS
5461 && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
5462 && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
5463 GET_MODE (SUBREG_REG (src)),
5464 GET_MODE (src)))
5465 #endif
5466 && (REG_P (dest)
5467 || (GET_CODE (dest) == SUBREG
5468 && REG_P (SUBREG_REG (dest)))))
5470 SUBST (SET_DEST (x),
5471 gen_lowpart (GET_MODE (SUBREG_REG (src)),
5472 dest));
5473 SUBST (SET_SRC (x), SUBREG_REG (src));
5475 src = SET_SRC (x), dest = SET_DEST (x);
5478 #ifdef HAVE_cc0
5479 /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
5480 in SRC. */
5481 if (dest == cc0_rtx
5482 && GET_CODE (src) == SUBREG
5483 && subreg_lowpart_p (src)
5484 && (GET_MODE_BITSIZE (GET_MODE (src))
5485 < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
5487 rtx inner = SUBREG_REG (src);
5488 enum machine_mode inner_mode = GET_MODE (inner);
5490 /* Here we make sure that we don't have a sign bit on. */
5491 if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
5492 && (nonzero_bits (inner, inner_mode)
5493 < ((unsigned HOST_WIDE_INT) 1
5494 << (GET_MODE_BITSIZE (GET_MODE (src)) - 1))))
5496 SUBST (SET_SRC (x), inner);
5497 src = SET_SRC (x);
5500 #endif
5502 #ifdef LOAD_EXTEND_OP
5503 /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
5504 would require a paradoxical subreg. Replace the subreg with a
5505 zero_extend to avoid the reload that would otherwise be required. */
5507 if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
5508 && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != UNKNOWN
5509 && SUBREG_BYTE (src) == 0
5510 && (GET_MODE_SIZE (GET_MODE (src))
5511 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
5512 && MEM_P (SUBREG_REG (src)))
5514 SUBST (SET_SRC (x),
5515 gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
5516 GET_MODE (src), SUBREG_REG (src)));
5518 src = SET_SRC (x);
5520 #endif
5522 /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
5523 are comparing an item known to be 0 or -1 against 0, use a logical
5524 operation instead. Check for one of the arms being an IOR of the other
5525 arm with some value. We compute three terms to be IOR'ed together. In
5526 practice, at most two will be nonzero. Then we do the IOR's. */
5528 if (GET_CODE (dest) != PC
5529 && GET_CODE (src) == IF_THEN_ELSE
5530 && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
5531 && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
5532 && XEXP (XEXP (src, 0), 1) == const0_rtx
5533 && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
5534 #ifdef HAVE_conditional_move
5535 && ! can_conditionally_move_p (GET_MODE (src))
5536 #endif
5537 && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
5538 GET_MODE (XEXP (XEXP (src, 0), 0)))
5539 == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
5540 && ! side_effects_p (src))
5542 rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
5543 ? XEXP (src, 1) : XEXP (src, 2));
5544 rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
5545 ? XEXP (src, 2) : XEXP (src, 1));
5546 rtx term1 = const0_rtx, term2, term3;
5548 if (GET_CODE (true_rtx) == IOR
5549 && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
5550 term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
5551 else if (GET_CODE (true_rtx) == IOR
5552 && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
5553 term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
5554 else if (GET_CODE (false_rtx) == IOR
5555 && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
5556 term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
5557 else if (GET_CODE (false_rtx) == IOR
5558 && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
5559 term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
5561 term2 = simplify_gen_binary (AND, GET_MODE (src),
5562 XEXP (XEXP (src, 0), 0), true_rtx);
5563 term3 = simplify_gen_binary (AND, GET_MODE (src),
5564 simplify_gen_unary (NOT, GET_MODE (src),
5565 XEXP (XEXP (src, 0), 0),
5566 GET_MODE (src)),
5567 false_rtx);
5569 SUBST (SET_SRC (x),
5570 simplify_gen_binary (IOR, GET_MODE (src),
5571 simplify_gen_binary (IOR, GET_MODE (src),
5572 term1, term2),
5573 term3));
5575 src = SET_SRC (x);
5578 /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
5579 whole thing fail. */
5580 if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
5581 return src;
5582 else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
5583 return dest;
5584 else
5585 /* Convert this into a field assignment operation, if possible. */
5586 return make_field_assignment (x);
5589 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
5590 result. */
5592 static rtx
5593 simplify_logical (rtx x)
5595 enum machine_mode mode = GET_MODE (x);
5596 rtx op0 = XEXP (x, 0);
5597 rtx op1 = XEXP (x, 1);
5598 rtx reversed;
5600 switch (GET_CODE (x))
5602 case AND:
5603 /* Convert (A ^ B) & A to A & (~B) since the latter is often a single
5604 insn (and may simplify more). */
5605 if (GET_CODE (op0) == XOR
5606 && rtx_equal_p (XEXP (op0, 0), op1)
5607 && ! side_effects_p (op1))
5608 x = simplify_gen_binary (AND, mode,
5609 simplify_gen_unary (NOT, mode,
5610 XEXP (op0, 1), mode),
5611 op1);
5613 if (GET_CODE (op0) == XOR
5614 && rtx_equal_p (XEXP (op0, 1), op1)
5615 && ! side_effects_p (op1))
5616 x = simplify_gen_binary (AND, mode,
5617 simplify_gen_unary (NOT, mode,
5618 XEXP (op0, 0), mode),
5619 op1);
5621 /* Similarly for (~(A ^ B)) & A. */
5622 if (GET_CODE (op0) == NOT
5623 && GET_CODE (XEXP (op0, 0)) == XOR
5624 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
5625 && ! side_effects_p (op1))
5626 x = simplify_gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
5628 if (GET_CODE (op0) == NOT
5629 && GET_CODE (XEXP (op0, 0)) == XOR
5630 && rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
5631 && ! side_effects_p (op1))
5632 x = simplify_gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
5634 /* We can call simplify_and_const_int only if we don't lose
5635 any (sign) bits when converting INTVAL (op1) to
5636 "unsigned HOST_WIDE_INT". */
5637 if (GET_CODE (op1) == CONST_INT
5638 && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5639 || INTVAL (op1) > 0))
5641 x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
5643 /* If we have (ior (and (X C1) C2)) and the next restart would be
5644 the last, simplify this by making C1 as small as possible
5645 and then exit. Only do this if C1 actually changes: for now
5646 this only saves memory but, should this transformation be
5647 moved to simplify-rtx.c, we'd risk unbounded recursion there. */
5648 if (GET_CODE (x) == IOR && GET_CODE (op0) == AND
5649 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5650 && GET_CODE (op1) == CONST_INT
5651 && (INTVAL (XEXP (op0, 1)) & INTVAL (op1)) != 0)
5652 return simplify_gen_binary (IOR, mode,
5653 simplify_gen_binary
5654 (AND, mode, XEXP (op0, 0),
5655 GEN_INT (INTVAL (XEXP (op0, 1))
5656 & ~INTVAL (op1))), op1);
5658 if (GET_CODE (x) != AND)
5659 return x;
5661 op0 = XEXP (x, 0);
5662 op1 = XEXP (x, 1);
5665 /* Convert (A | B) & A to A. */
5666 if (GET_CODE (op0) == IOR
5667 && (rtx_equal_p (XEXP (op0, 0), op1)
5668 || rtx_equal_p (XEXP (op0, 1), op1))
5669 && ! side_effects_p (XEXP (op0, 0))
5670 && ! side_effects_p (XEXP (op0, 1)))
5671 return op1;
5673 /* If we have any of (and (ior A B) C) or (and (xor A B) C),
5674 apply the distributive law and then the inverse distributive
5675 law to see if things simplify. */
5676 if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
5678 rtx result = distribute_and_simplify_rtx (x, 0);
5679 if (result)
5680 return result;
5682 if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
5684 rtx result = distribute_and_simplify_rtx (x, 1);
5685 if (result)
5686 return result;
5688 break;
5690 case IOR:
5691 /* (ior A C) is C if all bits of A that might be nonzero are on in C. */
5692 if (GET_CODE (op1) == CONST_INT
5693 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5694 && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
5695 return op1;
5697 /* Convert (A & B) | A to A. */
5698 if (GET_CODE (op0) == AND
5699 && (rtx_equal_p (XEXP (op0, 0), op1)
5700 || rtx_equal_p (XEXP (op0, 1), op1))
5701 && ! side_effects_p (XEXP (op0, 0))
5702 && ! side_effects_p (XEXP (op0, 1)))
5703 return op1;
5705 /* If we have (ior (and A B) C), apply the distributive law and then
5706 the inverse distributive law to see if things simplify. */
5708 if (GET_CODE (op0) == AND)
5710 rtx result = distribute_and_simplify_rtx (x, 0);
5711 if (result)
5712 return result;
5715 if (GET_CODE (op1) == AND)
5717 rtx result = distribute_and_simplify_rtx (x, 1);
5718 if (result)
5719 return result;
5722 /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
5723 mode size to (rotate A CX). */
5725 if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT)
5726 || (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT))
5727 && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
5728 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5729 && GET_CODE (XEXP (op1, 1)) == CONST_INT
5730 && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1))
5731 == GET_MODE_BITSIZE (mode)))
5732 return gen_rtx_ROTATE (mode, XEXP (op0, 0),
5733 (GET_CODE (op0) == ASHIFT
5734 ? XEXP (op0, 1) : XEXP (op1, 1)));
5736 /* If OP0 is (ashiftrt (plus ...) C), it might actually be
5737 a (sign_extend (plus ...)). If so, OP1 is a CONST_INT, and the PLUS
5738 does not affect any of the bits in OP1, it can really be done
5739 as a PLUS and we can associate. We do this by seeing if OP1
5740 can be safely shifted left C bits. */
5741 if (GET_CODE (op1) == CONST_INT && GET_CODE (op0) == ASHIFTRT
5742 && GET_CODE (XEXP (op0, 0)) == PLUS
5743 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
5744 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5745 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT)
5747 int count = INTVAL (XEXP (op0, 1));
5748 HOST_WIDE_INT mask = INTVAL (op1) << count;
5750 if (mask >> count == INTVAL (op1)
5751 && (mask & nonzero_bits (XEXP (op0, 0), mode)) == 0)
5753 SUBST (XEXP (XEXP (op0, 0), 1),
5754 GEN_INT (INTVAL (XEXP (XEXP (op0, 0), 1)) | mask));
5755 return op0;
5758 break;
5760 case XOR:
5761 /* If we are XORing two things that have no bits in common,
5762 convert them into an IOR. This helps to detect rotation encoded
5763 using those methods and possibly other simplifications. */
5765 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5766 && (nonzero_bits (op0, mode)
5767 & nonzero_bits (op1, mode)) == 0)
5768 return (simplify_gen_binary (IOR, mode, op0, op1));
5770 /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
5771 Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
5772 (NOT y). */
5774 int num_negated = 0;
5776 if (GET_CODE (op0) == NOT)
5777 num_negated++, op0 = XEXP (op0, 0);
5778 if (GET_CODE (op1) == NOT)
5779 num_negated++, op1 = XEXP (op1, 0);
5781 if (num_negated == 2)
5783 SUBST (XEXP (x, 0), op0);
5784 SUBST (XEXP (x, 1), op1);
5786 else if (num_negated == 1)
5787 return
5788 simplify_gen_unary (NOT, mode,
5789 simplify_gen_binary (XOR, mode, op0, op1),
5790 mode);
5793 /* Convert (xor (and A B) B) to (and (not A) B). The latter may
5794 correspond to a machine insn or result in further simplifications
5795 if B is a constant. */
5797 if (GET_CODE (op0) == AND
5798 && rtx_equal_p (XEXP (op0, 1), op1)
5799 && ! side_effects_p (op1))
5800 return simplify_gen_binary (AND, mode,
5801 simplify_gen_unary (NOT, mode,
5802 XEXP (op0, 0), mode),
5803 op1);
5805 else if (GET_CODE (op0) == AND
5806 && rtx_equal_p (XEXP (op0, 0), op1)
5807 && ! side_effects_p (op1))
5808 return simplify_gen_binary (AND, mode,
5809 simplify_gen_unary (NOT, mode,
5810 XEXP (op0, 1), mode),
5811 op1);
5813 /* (xor (comparison foo bar) (const_int 1)) can become the reversed
5814 comparison if STORE_FLAG_VALUE is 1. */
5815 if (STORE_FLAG_VALUE == 1
5816 && op1 == const1_rtx
5817 && COMPARISON_P (op0)
5818 && (reversed = reversed_comparison (op0, mode)))
5819 return reversed;
5821 /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
5822 is (lt foo (const_int 0)), so we can perform the above
5823 simplification if STORE_FLAG_VALUE is 1. */
5825 if (STORE_FLAG_VALUE == 1
5826 && op1 == const1_rtx
5827 && GET_CODE (op0) == LSHIFTRT
5828 && GET_CODE (XEXP (op0, 1)) == CONST_INT
5829 && INTVAL (XEXP (op0, 1)) == GET_MODE_BITSIZE (mode) - 1)
5830 return gen_rtx_GE (mode, XEXP (op0, 0), const0_rtx);
5832 /* (xor (comparison foo bar) (const_int sign-bit))
5833 when STORE_FLAG_VALUE is the sign bit. */
5834 if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5835 && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5836 == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5837 && op1 == const_true_rtx
5838 && COMPARISON_P (op0)
5839 && (reversed = reversed_comparison (op0, mode)))
5840 return reversed;
5842 break;
5844 default:
5845 gcc_unreachable ();
5848 return x;
5851 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
5852 operations" because they can be replaced with two more basic operations.
5853 ZERO_EXTEND is also considered "compound" because it can be replaced with
5854 an AND operation, which is simpler, though only one operation.
5856 The function expand_compound_operation is called with an rtx expression
5857 and will convert it to the appropriate shifts and AND operations,
5858 simplifying at each stage.
5860 The function make_compound_operation is called to convert an expression
5861 consisting of shifts and ANDs into the equivalent compound expression.
5862 It is the inverse of this function, loosely speaking. */
5864 static rtx
5865 expand_compound_operation (rtx x)
5867 unsigned HOST_WIDE_INT pos = 0, len;
5868 int unsignedp = 0;
5869 unsigned int modewidth;
5870 rtx tem;
5872 switch (GET_CODE (x))
5874 case ZERO_EXTEND:
5875 unsignedp = 1;
5876 case SIGN_EXTEND:
5877 /* We can't necessarily use a const_int for a multiword mode;
5878 it depends on implicitly extending the value.
5879 Since we don't know the right way to extend it,
5880 we can't tell whether the implicit way is right.
5882 Even for a mode that is no wider than a const_int,
5883 we can't win, because we need to sign extend one of its bits through
5884 the rest of it, and we don't know which bit. */
5885 if (GET_CODE (XEXP (x, 0)) == CONST_INT)
5886 return x;
5888 /* Return if (subreg:MODE FROM 0) is not a safe replacement for
5889 (zero_extend:MODE FROM) or (sign_extend:MODE FROM). It is for any MEM
5890 because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
5891 reloaded. If not for that, MEM's would very rarely be safe.
5893 Reject MODEs bigger than a word, because we might not be able
5894 to reference a two-register group starting with an arbitrary register
5895 (and currently gen_lowpart might crash for a SUBREG). */
5897 if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
5898 return x;
5900 /* Reject MODEs that aren't scalar integers because turning vector
5901 or complex modes into shifts causes problems. */
5903 if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
5904 return x;
5906 len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
5907 /* If the inner object has VOIDmode (the only way this can happen
5908 is if it is an ASM_OPERANDS), we can't do anything since we don't
5909 know how much masking to do. */
5910 if (len == 0)
5911 return x;
5913 break;
5915 case ZERO_EXTRACT:
5916 unsignedp = 1;
5918 /* ... fall through ... */
5920 case SIGN_EXTRACT:
5921 /* If the operand is a CLOBBER, just return it. */
5922 if (GET_CODE (XEXP (x, 0)) == CLOBBER)
5923 return XEXP (x, 0);
5925 if (GET_CODE (XEXP (x, 1)) != CONST_INT
5926 || GET_CODE (XEXP (x, 2)) != CONST_INT
5927 || GET_MODE (XEXP (x, 0)) == VOIDmode)
5928 return x;
5930 /* Reject MODEs that aren't scalar integers because turning vector
5931 or complex modes into shifts causes problems. */
5933 if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
5934 return x;
5936 len = INTVAL (XEXP (x, 1));
5937 pos = INTVAL (XEXP (x, 2));
5939 /* If this goes outside the object being extracted, replace the object
5940 with a (use (mem ...)) construct that only combine understands
5941 and is used only for this purpose. */
5942 if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
5943 SUBST (XEXP (x, 0), gen_rtx_USE (GET_MODE (x), XEXP (x, 0)));
5945 if (BITS_BIG_ENDIAN)
5946 pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
5948 break;
5950 default:
5951 return x;
5953 /* Convert sign extension to zero extension, if we know that the high
5954 bit is not set, as this is easier to optimize. It will be converted
5955 back to cheaper alternative in make_extraction. */
5956 if (GET_CODE (x) == SIGN_EXTEND
5957 && (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5958 && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
5959 & ~(((unsigned HOST_WIDE_INT)
5960 GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
5961 >> 1))
5962 == 0)))
5964 rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
5965 rtx temp2 = expand_compound_operation (temp);
5967 /* Make sure this is a profitable operation. */
5968 if (rtx_cost (x, SET) > rtx_cost (temp2, SET))
5969 return temp2;
5970 else if (rtx_cost (x, SET) > rtx_cost (temp, SET))
5971 return temp;
5972 else
5973 return x;
5976 /* We can optimize some special cases of ZERO_EXTEND. */
5977 if (GET_CODE (x) == ZERO_EXTEND)
5979 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
5980 know that the last value didn't have any inappropriate bits
5981 set. */
5982 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5983 && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5984 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5985 && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
5986 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5987 return XEXP (XEXP (x, 0), 0);
5989 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
5990 if (GET_CODE (XEXP (x, 0)) == SUBREG
5991 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5992 && subreg_lowpart_p (XEXP (x, 0))
5993 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5994 && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
5995 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5996 return SUBREG_REG (XEXP (x, 0));
5998 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
5999 is a comparison and STORE_FLAG_VALUE permits. This is like
6000 the first case, but it works even when GET_MODE (x) is larger
6001 than HOST_WIDE_INT. */
6002 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6003 && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6004 && COMPARISON_P (XEXP (XEXP (x, 0), 0))
6005 && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6006 <= HOST_BITS_PER_WIDE_INT)
6007 && ((HOST_WIDE_INT) STORE_FLAG_VALUE
6008 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6009 return XEXP (XEXP (x, 0), 0);
6011 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
6012 if (GET_CODE (XEXP (x, 0)) == SUBREG
6013 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6014 && subreg_lowpart_p (XEXP (x, 0))
6015 && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
6016 && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
6017 <= HOST_BITS_PER_WIDE_INT)
6018 && ((HOST_WIDE_INT) STORE_FLAG_VALUE
6019 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6020 return SUBREG_REG (XEXP (x, 0));
6024 /* If we reach here, we want to return a pair of shifts. The inner
6025 shift is a left shift of BITSIZE - POS - LEN bits. The outer
6026 shift is a right shift of BITSIZE - LEN bits. It is arithmetic or
6027 logical depending on the value of UNSIGNEDP.
6029 If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
6030 converted into an AND of a shift.
6032 We must check for the case where the left shift would have a negative
6033 count. This can happen in a case like (x >> 31) & 255 on machines
6034 that can't shift by a constant. On those machines, we would first
6035 combine the shift with the AND to produce a variable-position
6036 extraction. Then the constant of 31 would be substituted in to produce
6037 a such a position. */
6039 modewidth = GET_MODE_BITSIZE (GET_MODE (x));
6040 if (modewidth + len >= pos)
6041 tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
6042 GET_MODE (x),
6043 simplify_shift_const (NULL_RTX, ASHIFT,
6044 GET_MODE (x),
6045 XEXP (x, 0),
6046 modewidth - pos - len),
6047 modewidth - len);
6049 else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
6050 tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
6051 simplify_shift_const (NULL_RTX, LSHIFTRT,
6052 GET_MODE (x),
6053 XEXP (x, 0), pos),
6054 ((HOST_WIDE_INT) 1 << len) - 1);
6055 else
6056 /* Any other cases we can't handle. */
6057 return x;
6059 /* If we couldn't do this for some reason, return the original
6060 expression. */
6061 if (GET_CODE (tem) == CLOBBER)
6062 return x;
6064 return tem;
6067 /* X is a SET which contains an assignment of one object into
6068 a part of another (such as a bit-field assignment, STRICT_LOW_PART,
6069 or certain SUBREGS). If possible, convert it into a series of
6070 logical operations.
6072 We half-heartedly support variable positions, but do not at all
6073 support variable lengths. */
6075 static rtx
6076 expand_field_assignment (rtx x)
6078 rtx inner;
6079 rtx pos; /* Always counts from low bit. */
6080 int len;
6081 rtx mask, cleared, masked;
6082 enum machine_mode compute_mode;
6084 /* Loop until we find something we can't simplify. */
6085 while (1)
6087 if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
6088 && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
6090 inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
6091 len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
6092 pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
6094 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
6095 && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
6097 inner = XEXP (SET_DEST (x), 0);
6098 len = INTVAL (XEXP (SET_DEST (x), 1));
6099 pos = XEXP (SET_DEST (x), 2);
6101 /* If the position is constant and spans the width of INNER,
6102 surround INNER with a USE to indicate this. */
6103 if (GET_CODE (pos) == CONST_INT
6104 && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
6105 inner = gen_rtx_USE (GET_MODE (SET_DEST (x)), inner);
6107 if (BITS_BIG_ENDIAN)
6109 if (GET_CODE (pos) == CONST_INT)
6110 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
6111 - INTVAL (pos));
6112 else if (GET_CODE (pos) == MINUS
6113 && GET_CODE (XEXP (pos, 1)) == CONST_INT
6114 && (INTVAL (XEXP (pos, 1))
6115 == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
6116 /* If position is ADJUST - X, new position is X. */
6117 pos = XEXP (pos, 0);
6118 else
6119 pos = simplify_gen_binary (MINUS, GET_MODE (pos),
6120 GEN_INT (GET_MODE_BITSIZE (
6121 GET_MODE (inner))
6122 - len),
6123 pos);
6127 /* A SUBREG between two modes that occupy the same numbers of words
6128 can be done by moving the SUBREG to the source. */
6129 else if (GET_CODE (SET_DEST (x)) == SUBREG
6130 /* We need SUBREGs to compute nonzero_bits properly. */
6131 && nonzero_sign_valid
6132 && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
6133 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
6134 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
6135 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
6137 x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
6138 gen_lowpart
6139 (GET_MODE (SUBREG_REG (SET_DEST (x))),
6140 SET_SRC (x)));
6141 continue;
6143 else
6144 break;
6146 while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6147 inner = SUBREG_REG (inner);
6149 compute_mode = GET_MODE (inner);
6151 /* Don't attempt bitwise arithmetic on non scalar integer modes. */
6152 if (! SCALAR_INT_MODE_P (compute_mode))
6154 enum machine_mode imode;
6156 /* Don't do anything for vector or complex integral types. */
6157 if (! FLOAT_MODE_P (compute_mode))
6158 break;
6160 /* Try to find an integral mode to pun with. */
6161 imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
6162 if (imode == BLKmode)
6163 break;
6165 compute_mode = imode;
6166 inner = gen_lowpart (imode, inner);
6169 /* Compute a mask of LEN bits, if we can do this on the host machine. */
6170 if (len >= HOST_BITS_PER_WIDE_INT)
6171 break;
6173 /* Now compute the equivalent expression. Make a copy of INNER
6174 for the SET_DEST in case it is a MEM into which we will substitute;
6175 we don't want shared RTL in that case. */
6176 mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
6177 cleared = simplify_gen_binary (AND, compute_mode,
6178 simplify_gen_unary (NOT, compute_mode,
6179 simplify_gen_binary (ASHIFT,
6180 compute_mode,
6181 mask, pos),
6182 compute_mode),
6183 inner);
6184 masked = simplify_gen_binary (ASHIFT, compute_mode,
6185 simplify_gen_binary (
6186 AND, compute_mode,
6187 gen_lowpart (compute_mode, SET_SRC (x)),
6188 mask),
6189 pos);
6191 x = gen_rtx_SET (VOIDmode, copy_rtx (inner),
6192 simplify_gen_binary (IOR, compute_mode,
6193 cleared, masked));
6196 return x;
6199 /* Return an RTX for a reference to LEN bits of INNER. If POS_RTX is nonzero,
6200 it is an RTX that represents a variable starting position; otherwise,
6201 POS is the (constant) starting bit position (counted from the LSB).
6203 INNER may be a USE. This will occur when we started with a bitfield
6204 that went outside the boundary of the object in memory, which is
6205 allowed on most machines. To isolate this case, we produce a USE
6206 whose mode is wide enough and surround the MEM with it. The only
6207 code that understands the USE is this routine. If it is not removed,
6208 it will cause the resulting insn not to match.
6210 UNSIGNEDP is nonzero for an unsigned reference and zero for a
6211 signed reference.
6213 IN_DEST is nonzero if this is a reference in the destination of a
6214 SET. This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If nonzero,
6215 a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
6216 be used.
6218 IN_COMPARE is nonzero if we are in a COMPARE. This means that a
6219 ZERO_EXTRACT should be built even for bits starting at bit 0.
6221 MODE is the desired mode of the result (if IN_DEST == 0).
6223 The result is an RTX for the extraction or NULL_RTX if the target
6224 can't handle it. */
6226 static rtx
6227 make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
6228 rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
6229 int in_dest, int in_compare)
6231 /* This mode describes the size of the storage area
6232 to fetch the overall value from. Within that, we
6233 ignore the POS lowest bits, etc. */
6234 enum machine_mode is_mode = GET_MODE (inner);
6235 enum machine_mode inner_mode;
6236 enum machine_mode wanted_inner_mode = byte_mode;
6237 enum machine_mode wanted_inner_reg_mode = word_mode;
6238 enum machine_mode pos_mode = word_mode;
6239 enum machine_mode extraction_mode = word_mode;
6240 enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
6241 int spans_byte = 0;
6242 rtx new = 0;
6243 rtx orig_pos_rtx = pos_rtx;
6244 HOST_WIDE_INT orig_pos;
6246 /* Get some information about INNER and get the innermost object. */
6247 if (GET_CODE (inner) == USE)
6248 /* (use:SI (mem:QI foo)) stands for (mem:SI foo). */
6249 /* We don't need to adjust the position because we set up the USE
6250 to pretend that it was a full-word object. */
6251 spans_byte = 1, inner = XEXP (inner, 0);
6252 else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6254 /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
6255 consider just the QI as the memory to extract from.
6256 The subreg adds or removes high bits; its mode is
6257 irrelevant to the meaning of this extraction,
6258 since POS and LEN count from the lsb. */
6259 if (MEM_P (SUBREG_REG (inner)))
6260 is_mode = GET_MODE (SUBREG_REG (inner));
6261 inner = SUBREG_REG (inner);
6263 else if (GET_CODE (inner) == ASHIFT
6264 && GET_CODE (XEXP (inner, 1)) == CONST_INT
6265 && pos_rtx == 0 && pos == 0
6266 && len > (unsigned HOST_WIDE_INT) INTVAL (XEXP (inner, 1)))
6268 /* We're extracting the least significant bits of an rtx
6269 (ashift X (const_int C)), where LEN > C. Extract the
6270 least significant (LEN - C) bits of X, giving an rtx
6271 whose mode is MODE, then shift it left C times. */
6272 new = make_extraction (mode, XEXP (inner, 0),
6273 0, 0, len - INTVAL (XEXP (inner, 1)),
6274 unsignedp, in_dest, in_compare);
6275 if (new != 0)
6276 return gen_rtx_ASHIFT (mode, new, XEXP (inner, 1));
6279 inner_mode = GET_MODE (inner);
6281 if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
6282 pos = INTVAL (pos_rtx), pos_rtx = 0;
6284 /* See if this can be done without an extraction. We never can if the
6285 width of the field is not the same as that of some integer mode. For
6286 registers, we can only avoid the extraction if the position is at the
6287 low-order bit and this is either not in the destination or we have the
6288 appropriate STRICT_LOW_PART operation available.
6290 For MEM, we can avoid an extract if the field starts on an appropriate
6291 boundary and we can change the mode of the memory reference. However,
6292 we cannot directly access the MEM if we have a USE and the underlying
6293 MEM is not TMODE. This combination means that MEM was being used in a
6294 context where bits outside its mode were being referenced; that is only
6295 valid in bit-field insns. */
6297 if (tmode != BLKmode
6298 && ! (spans_byte && inner_mode != tmode)
6299 && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
6300 && !MEM_P (inner)
6301 && (! in_dest
6302 || (REG_P (inner)
6303 && have_insn_for (STRICT_LOW_PART, tmode))))
6304 || (MEM_P (inner) && pos_rtx == 0
6305 && (pos
6306 % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
6307 : BITS_PER_UNIT)) == 0
6308 /* We can't do this if we are widening INNER_MODE (it
6309 may not be aligned, for one thing). */
6310 && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
6311 && (inner_mode == tmode
6312 || (! mode_dependent_address_p (XEXP (inner, 0))
6313 && ! MEM_VOLATILE_P (inner))))))
6315 /* If INNER is a MEM, make a new MEM that encompasses just the desired
6316 field. If the original and current mode are the same, we need not
6317 adjust the offset. Otherwise, we do if bytes big endian.
6319 If INNER is not a MEM, get a piece consisting of just the field
6320 of interest (in this case POS % BITS_PER_WORD must be 0). */
6322 if (MEM_P (inner))
6324 HOST_WIDE_INT offset;
6326 /* POS counts from lsb, but make OFFSET count in memory order. */
6327 if (BYTES_BIG_ENDIAN)
6328 offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
6329 else
6330 offset = pos / BITS_PER_UNIT;
6332 new = adjust_address_nv (inner, tmode, offset);
6334 else if (REG_P (inner))
6336 if (tmode != inner_mode)
6338 /* We can't call gen_lowpart in a DEST since we
6339 always want a SUBREG (see below) and it would sometimes
6340 return a new hard register. */
6341 if (pos || in_dest)
6343 HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
6345 if (WORDS_BIG_ENDIAN
6346 && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
6347 final_word = ((GET_MODE_SIZE (inner_mode)
6348 - GET_MODE_SIZE (tmode))
6349 / UNITS_PER_WORD) - final_word;
6351 final_word *= UNITS_PER_WORD;
6352 if (BYTES_BIG_ENDIAN &&
6353 GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
6354 final_word += (GET_MODE_SIZE (inner_mode)
6355 - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
6357 /* Avoid creating invalid subregs, for example when
6358 simplifying (x>>32)&255. */
6359 if (!validate_subreg (tmode, inner_mode, inner, final_word))
6360 return NULL_RTX;
6362 new = gen_rtx_SUBREG (tmode, inner, final_word);
6364 else
6365 new = gen_lowpart (tmode, inner);
6367 else
6368 new = inner;
6370 else
6371 new = force_to_mode (inner, tmode,
6372 len >= HOST_BITS_PER_WIDE_INT
6373 ? ~(unsigned HOST_WIDE_INT) 0
6374 : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
6375 NULL_RTX, 0);
6377 /* If this extraction is going into the destination of a SET,
6378 make a STRICT_LOW_PART unless we made a MEM. */
6380 if (in_dest)
6381 return (MEM_P (new) ? new
6382 : (GET_CODE (new) != SUBREG
6383 ? gen_rtx_CLOBBER (tmode, const0_rtx)
6384 : gen_rtx_STRICT_LOW_PART (VOIDmode, new)));
6386 if (mode == tmode)
6387 return new;
6389 if (GET_CODE (new) == CONST_INT)
6390 return gen_int_mode (INTVAL (new), mode);
6392 /* If we know that no extraneous bits are set, and that the high
6393 bit is not set, convert the extraction to the cheaper of
6394 sign and zero extension, that are equivalent in these cases. */
6395 if (flag_expensive_optimizations
6396 && (GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
6397 && ((nonzero_bits (new, tmode)
6398 & ~(((unsigned HOST_WIDE_INT)
6399 GET_MODE_MASK (tmode))
6400 >> 1))
6401 == 0)))
6403 rtx temp = gen_rtx_ZERO_EXTEND (mode, new);
6404 rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new);
6406 /* Prefer ZERO_EXTENSION, since it gives more information to
6407 backends. */
6408 if (rtx_cost (temp, SET) <= rtx_cost (temp1, SET))
6409 return temp;
6410 return temp1;
6413 /* Otherwise, sign- or zero-extend unless we already are in the
6414 proper mode. */
6416 return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
6417 mode, new));
6420 /* Unless this is a COMPARE or we have a funny memory reference,
6421 don't do anything with zero-extending field extracts starting at
6422 the low-order bit since they are simple AND operations. */
6423 if (pos_rtx == 0 && pos == 0 && ! in_dest
6424 && ! in_compare && ! spans_byte && unsignedp)
6425 return 0;
6427 /* Unless we are allowed to span bytes or INNER is not MEM, reject this if
6428 we would be spanning bytes or if the position is not a constant and the
6429 length is not 1. In all other cases, we would only be going outside
6430 our object in cases when an original shift would have been
6431 undefined. */
6432 if (! spans_byte && MEM_P (inner)
6433 && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
6434 || (pos_rtx != 0 && len != 1)))
6435 return 0;
6437 /* Get the mode to use should INNER not be a MEM, the mode for the position,
6438 and the mode for the result. */
6439 if (in_dest && mode_for_extraction (EP_insv, -1) != MAX_MACHINE_MODE)
6441 wanted_inner_reg_mode = mode_for_extraction (EP_insv, 0);
6442 pos_mode = mode_for_extraction (EP_insv, 2);
6443 extraction_mode = mode_for_extraction (EP_insv, 3);
6446 if (! in_dest && unsignedp
6447 && mode_for_extraction (EP_extzv, -1) != MAX_MACHINE_MODE)
6449 wanted_inner_reg_mode = mode_for_extraction (EP_extzv, 1);
6450 pos_mode = mode_for_extraction (EP_extzv, 3);
6451 extraction_mode = mode_for_extraction (EP_extzv, 0);
6454 if (! in_dest && ! unsignedp
6455 && mode_for_extraction (EP_extv, -1) != MAX_MACHINE_MODE)
6457 wanted_inner_reg_mode = mode_for_extraction (EP_extv, 1);
6458 pos_mode = mode_for_extraction (EP_extv, 3);
6459 extraction_mode = mode_for_extraction (EP_extv, 0);
6462 /* Never narrow an object, since that might not be safe. */
6464 if (mode != VOIDmode
6465 && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
6466 extraction_mode = mode;
6468 if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
6469 && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6470 pos_mode = GET_MODE (pos_rtx);
6472 /* If this is not from memory, the desired mode is wanted_inner_reg_mode;
6473 if we have to change the mode of memory and cannot, the desired mode is
6474 EXTRACTION_MODE. */
6475 if (!MEM_P (inner))
6476 wanted_inner_mode = wanted_inner_reg_mode;
6477 else if (inner_mode != wanted_inner_mode
6478 && (mode_dependent_address_p (XEXP (inner, 0))
6479 || MEM_VOLATILE_P (inner)))
6480 wanted_inner_mode = extraction_mode;
6482 orig_pos = pos;
6484 if (BITS_BIG_ENDIAN)
6486 /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
6487 BITS_BIG_ENDIAN style. If position is constant, compute new
6488 position. Otherwise, build subtraction.
6489 Note that POS is relative to the mode of the original argument.
6490 If it's a MEM we need to recompute POS relative to that.
6491 However, if we're extracting from (or inserting into) a register,
6492 we want to recompute POS relative to wanted_inner_mode. */
6493 int width = (MEM_P (inner)
6494 ? GET_MODE_BITSIZE (is_mode)
6495 : GET_MODE_BITSIZE (wanted_inner_mode));
6497 if (pos_rtx == 0)
6498 pos = width - len - pos;
6499 else
6500 pos_rtx
6501 = gen_rtx_MINUS (GET_MODE (pos_rtx), GEN_INT (width - len), pos_rtx);
6502 /* POS may be less than 0 now, but we check for that below.
6503 Note that it can only be less than 0 if !MEM_P (inner). */
6506 /* If INNER has a wider mode, make it smaller. If this is a constant
6507 extract, try to adjust the byte to point to the byte containing
6508 the value. */
6509 if (wanted_inner_mode != VOIDmode
6510 && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
6511 && ((MEM_P (inner)
6512 && (inner_mode == wanted_inner_mode
6513 || (! mode_dependent_address_p (XEXP (inner, 0))
6514 && ! MEM_VOLATILE_P (inner))))))
6516 int offset = 0;
6518 /* The computations below will be correct if the machine is big
6519 endian in both bits and bytes or little endian in bits and bytes.
6520 If it is mixed, we must adjust. */
6522 /* If bytes are big endian and we had a paradoxical SUBREG, we must
6523 adjust OFFSET to compensate. */
6524 if (BYTES_BIG_ENDIAN
6525 && ! spans_byte
6526 && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
6527 offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
6529 /* If this is a constant position, we can move to the desired byte.
6530 Be careful not to go beyond the original object and maintain the
6531 natural alignment of the memory. */
6532 if (pos_rtx == 0)
6534 enum machine_mode bfmode = smallest_mode_for_size (len, MODE_INT);
6535 offset += (pos / GET_MODE_BITSIZE (bfmode)) * GET_MODE_SIZE (bfmode);
6536 pos %= GET_MODE_BITSIZE (bfmode);
6539 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
6540 && ! spans_byte
6541 && is_mode != wanted_inner_mode)
6542 offset = (GET_MODE_SIZE (is_mode)
6543 - GET_MODE_SIZE (wanted_inner_mode) - offset);
6545 if (offset != 0 || inner_mode != wanted_inner_mode)
6546 inner = adjust_address_nv (inner, wanted_inner_mode, offset);
6549 /* If INNER is not memory, we can always get it into the proper mode. If we
6550 are changing its mode, POS must be a constant and smaller than the size
6551 of the new mode. */
6552 else if (!MEM_P (inner))
6554 if (GET_MODE (inner) != wanted_inner_mode
6555 && (pos_rtx != 0
6556 || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
6557 return 0;
6559 inner = force_to_mode (inner, wanted_inner_mode,
6560 pos_rtx
6561 || len + orig_pos >= HOST_BITS_PER_WIDE_INT
6562 ? ~(unsigned HOST_WIDE_INT) 0
6563 : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
6564 << orig_pos),
6565 NULL_RTX, 0);
6568 /* Adjust mode of POS_RTX, if needed. If we want a wider mode, we
6569 have to zero extend. Otherwise, we can just use a SUBREG. */
6570 if (pos_rtx != 0
6571 && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
6573 rtx temp = gen_rtx_ZERO_EXTEND (pos_mode, pos_rtx);
6575 /* If we know that no extraneous bits are set, and that the high
6576 bit is not set, convert extraction to cheaper one - either
6577 SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
6578 cases. */
6579 if (flag_expensive_optimizations
6580 && (GET_MODE_BITSIZE (GET_MODE (pos_rtx)) <= HOST_BITS_PER_WIDE_INT
6581 && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
6582 & ~(((unsigned HOST_WIDE_INT)
6583 GET_MODE_MASK (GET_MODE (pos_rtx)))
6584 >> 1))
6585 == 0)))
6587 rtx temp1 = gen_rtx_SIGN_EXTEND (pos_mode, pos_rtx);
6589 /* Prefer ZERO_EXTENSION, since it gives more information to
6590 backends. */
6591 if (rtx_cost (temp1, SET) < rtx_cost (temp, SET))
6592 temp = temp1;
6594 pos_rtx = temp;
6596 else if (pos_rtx != 0
6597 && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
6598 pos_rtx = gen_lowpart (pos_mode, pos_rtx);
6600 /* Make POS_RTX unless we already have it and it is correct. If we don't
6601 have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
6602 be a CONST_INT. */
6603 if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
6604 pos_rtx = orig_pos_rtx;
6606 else if (pos_rtx == 0)
6607 pos_rtx = GEN_INT (pos);
6609 /* Make the required operation. See if we can use existing rtx. */
6610 new = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
6611 extraction_mode, inner, GEN_INT (len), pos_rtx);
6612 if (! in_dest)
6613 new = gen_lowpart (mode, new);
6615 return new;
6618 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
6619 with any other operations in X. Return X without that shift if so. */
6621 static rtx
6622 extract_left_shift (rtx x, int count)
6624 enum rtx_code code = GET_CODE (x);
6625 enum machine_mode mode = GET_MODE (x);
6626 rtx tem;
6628 switch (code)
6630 case ASHIFT:
6631 /* This is the shift itself. If it is wide enough, we will return
6632 either the value being shifted if the shift count is equal to
6633 COUNT or a shift for the difference. */
6634 if (GET_CODE (XEXP (x, 1)) == CONST_INT
6635 && INTVAL (XEXP (x, 1)) >= count)
6636 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
6637 INTVAL (XEXP (x, 1)) - count);
6638 break;
6640 case NEG: case NOT:
6641 if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6642 return simplify_gen_unary (code, mode, tem, mode);
6644 break;
6646 case PLUS: case IOR: case XOR: case AND:
6647 /* If we can safely shift this constant and we find the inner shift,
6648 make a new operation. */
6649 if (GET_CODE (XEXP (x, 1)) == CONST_INT
6650 && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
6651 && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6652 return simplify_gen_binary (code, mode, tem,
6653 GEN_INT (INTVAL (XEXP (x, 1)) >> count));
6655 break;
6657 default:
6658 break;
6661 return 0;
6664 /* Look at the expression rooted at X. Look for expressions
6665 equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
6666 Form these expressions.
6668 Return the new rtx, usually just X.
6670 Also, for machines like the VAX that don't have logical shift insns,
6671 try to convert logical to arithmetic shift operations in cases where
6672 they are equivalent. This undoes the canonicalizations to logical
6673 shifts done elsewhere.
6675 We try, as much as possible, to re-use rtl expressions to save memory.
6677 IN_CODE says what kind of expression we are processing. Normally, it is
6678 SET. In a memory address (inside a MEM, PLUS or minus, the latter two
6679 being kludges), it is MEM. When processing the arguments of a comparison
6680 or a COMPARE against zero, it is COMPARE. */
6682 static rtx
6683 make_compound_operation (rtx x, enum rtx_code in_code)
6685 enum rtx_code code = GET_CODE (x);
6686 enum machine_mode mode = GET_MODE (x);
6687 int mode_width = GET_MODE_BITSIZE (mode);
6688 rtx rhs, lhs;
6689 enum rtx_code next_code;
6690 int i;
6691 rtx new = 0;
6692 rtx tem;
6693 const char *fmt;
6695 /* Select the code to be used in recursive calls. Once we are inside an
6696 address, we stay there. If we have a comparison, set to COMPARE,
6697 but once inside, go back to our default of SET. */
6699 next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
6700 : ((code == COMPARE || COMPARISON_P (x))
6701 && XEXP (x, 1) == const0_rtx) ? COMPARE
6702 : in_code == COMPARE ? SET : in_code);
6704 /* Process depending on the code of this operation. If NEW is set
6705 nonzero, it will be returned. */
6707 switch (code)
6709 case ASHIFT:
6710 /* Convert shifts by constants into multiplications if inside
6711 an address. */
6712 if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
6713 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6714 && INTVAL (XEXP (x, 1)) >= 0)
6716 new = make_compound_operation (XEXP (x, 0), next_code);
6717 new = gen_rtx_MULT (mode, new,
6718 GEN_INT ((HOST_WIDE_INT) 1
6719 << INTVAL (XEXP (x, 1))));
6721 break;
6723 case AND:
6724 /* If the second operand is not a constant, we can't do anything
6725 with it. */
6726 if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6727 break;
6729 /* If the constant is a power of two minus one and the first operand
6730 is a logical right shift, make an extraction. */
6731 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6732 && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6734 new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6735 new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1,
6736 0, in_code == COMPARE);
6739 /* Same as previous, but for (subreg (lshiftrt ...)) in first op. */
6740 else if (GET_CODE (XEXP (x, 0)) == SUBREG
6741 && subreg_lowpart_p (XEXP (x, 0))
6742 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
6743 && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6745 new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
6746 next_code);
6747 new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0,
6748 XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
6749 0, in_code == COMPARE);
6751 /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)). */
6752 else if ((GET_CODE (XEXP (x, 0)) == XOR
6753 || GET_CODE (XEXP (x, 0)) == IOR)
6754 && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
6755 && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
6756 && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6758 /* Apply the distributive law, and then try to make extractions. */
6759 new = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
6760 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
6761 XEXP (x, 1)),
6762 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
6763 XEXP (x, 1)));
6764 new = make_compound_operation (new, in_code);
6767 /* If we are have (and (rotate X C) M) and C is larger than the number
6768 of bits in M, this is an extraction. */
6770 else if (GET_CODE (XEXP (x, 0)) == ROTATE
6771 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6772 && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
6773 && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
6775 new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6776 new = make_extraction (mode, new,
6777 (GET_MODE_BITSIZE (mode)
6778 - INTVAL (XEXP (XEXP (x, 0), 1))),
6779 NULL_RTX, i, 1, 0, in_code == COMPARE);
6782 /* On machines without logical shifts, if the operand of the AND is
6783 a logical shift and our mask turns off all the propagated sign
6784 bits, we can replace the logical shift with an arithmetic shift. */
6785 else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6786 && !have_insn_for (LSHIFTRT, mode)
6787 && have_insn_for (ASHIFTRT, mode)
6788 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6789 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6790 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6791 && mode_width <= HOST_BITS_PER_WIDE_INT)
6793 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
6795 mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
6796 if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
6797 SUBST (XEXP (x, 0),
6798 gen_rtx_ASHIFTRT (mode,
6799 make_compound_operation
6800 (XEXP (XEXP (x, 0), 0), next_code),
6801 XEXP (XEXP (x, 0), 1)));
6804 /* If the constant is one less than a power of two, this might be
6805 representable by an extraction even if no shift is present.
6806 If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
6807 we are in a COMPARE. */
6808 else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6809 new = make_extraction (mode,
6810 make_compound_operation (XEXP (x, 0),
6811 next_code),
6812 0, NULL_RTX, i, 1, 0, in_code == COMPARE);
6814 /* If we are in a comparison and this is an AND with a power of two,
6815 convert this into the appropriate bit extract. */
6816 else if (in_code == COMPARE
6817 && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
6818 new = make_extraction (mode,
6819 make_compound_operation (XEXP (x, 0),
6820 next_code),
6821 i, NULL_RTX, 1, 1, 0, 1);
6823 break;
6825 case LSHIFTRT:
6826 /* If the sign bit is known to be zero, replace this with an
6827 arithmetic shift. */
6828 if (have_insn_for (ASHIFTRT, mode)
6829 && ! have_insn_for (LSHIFTRT, mode)
6830 && mode_width <= HOST_BITS_PER_WIDE_INT
6831 && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
6833 new = gen_rtx_ASHIFTRT (mode,
6834 make_compound_operation (XEXP (x, 0),
6835 next_code),
6836 XEXP (x, 1));
6837 break;
6840 /* ... fall through ... */
6842 case ASHIFTRT:
6843 lhs = XEXP (x, 0);
6844 rhs = XEXP (x, 1);
6846 /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
6847 this is a SIGN_EXTRACT. */
6848 if (GET_CODE (rhs) == CONST_INT
6849 && GET_CODE (lhs) == ASHIFT
6850 && GET_CODE (XEXP (lhs, 1)) == CONST_INT
6851 && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1)))
6853 new = make_compound_operation (XEXP (lhs, 0), next_code);
6854 new = make_extraction (mode, new,
6855 INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
6856 NULL_RTX, mode_width - INTVAL (rhs),
6857 code == LSHIFTRT, 0, in_code == COMPARE);
6858 break;
6861 /* See if we have operations between an ASHIFTRT and an ASHIFT.
6862 If so, try to merge the shifts into a SIGN_EXTEND. We could
6863 also do this for some cases of SIGN_EXTRACT, but it doesn't
6864 seem worth the effort; the case checked for occurs on Alpha. */
6866 if (!OBJECT_P (lhs)
6867 && ! (GET_CODE (lhs) == SUBREG
6868 && (OBJECT_P (SUBREG_REG (lhs))))
6869 && GET_CODE (rhs) == CONST_INT
6870 && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
6871 && (new = extract_left_shift (lhs, INTVAL (rhs))) != 0)
6872 new = make_extraction (mode, make_compound_operation (new, next_code),
6873 0, NULL_RTX, mode_width - INTVAL (rhs),
6874 code == LSHIFTRT, 0, in_code == COMPARE);
6876 break;
6878 case SUBREG:
6879 /* Call ourselves recursively on the inner expression. If we are
6880 narrowing the object and it has a different RTL code from
6881 what it originally did, do this SUBREG as a force_to_mode. */
6883 tem = make_compound_operation (SUBREG_REG (x), in_code);
6886 rtx simplified;
6887 simplified = simplify_subreg (GET_MODE (x), tem, GET_MODE (tem),
6888 SUBREG_BYTE (x));
6890 if (simplified)
6891 tem = simplified;
6893 if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
6894 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
6895 && subreg_lowpart_p (x))
6897 rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
6898 NULL_RTX, 0);
6900 /* If we have something other than a SUBREG, we might have
6901 done an expansion, so rerun ourselves. */
6902 if (GET_CODE (newer) != SUBREG)
6903 newer = make_compound_operation (newer, in_code);
6905 return newer;
6908 if (simplified)
6909 return tem;
6911 break;
6913 default:
6914 break;
6917 if (new)
6919 x = gen_lowpart (mode, new);
6920 code = GET_CODE (x);
6923 /* Now recursively process each operand of this operation. */
6924 fmt = GET_RTX_FORMAT (code);
6925 for (i = 0; i < GET_RTX_LENGTH (code); i++)
6926 if (fmt[i] == 'e')
6928 new = make_compound_operation (XEXP (x, i), next_code);
6929 SUBST (XEXP (x, i), new);
6932 /* If this is a commutative operation, the changes to the operands
6933 may have made it noncanonical. */
6934 if (COMMUTATIVE_ARITH_P (x)
6935 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
6937 tem = XEXP (x, 0);
6938 SUBST (XEXP (x, 0), XEXP (x, 1));
6939 SUBST (XEXP (x, 1), tem);
6942 return x;
6945 /* Given M see if it is a value that would select a field of bits
6946 within an item, but not the entire word. Return -1 if not.
6947 Otherwise, return the starting position of the field, where 0 is the
6948 low-order bit.
6950 *PLEN is set to the length of the field. */
6952 static int
6953 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
6955 /* Get the bit number of the first 1 bit from the right, -1 if none. */
6956 int pos = exact_log2 (m & -m);
6957 int len = 0;
6959 if (pos >= 0)
6960 /* Now shift off the low-order zero bits and see if we have a
6961 power of two minus 1. */
6962 len = exact_log2 ((m >> pos) + 1);
6964 if (len <= 0)
6965 pos = -1;
6967 *plen = len;
6968 return pos;
6971 /* See if X can be simplified knowing that we will only refer to it in
6972 MODE and will only refer to those bits that are nonzero in MASK.
6973 If other bits are being computed or if masking operations are done
6974 that select a superset of the bits in MASK, they can sometimes be
6975 ignored.
6977 Return a possibly simplified expression, but always convert X to
6978 MODE. If X is a CONST_INT, AND the CONST_INT with MASK.
6980 Also, if REG is nonzero and X is a register equal in value to REG,
6981 replace X with REG.
6983 If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
6984 are all off in X. This is used when X will be complemented, by either
6985 NOT, NEG, or XOR. */
6987 static rtx
6988 force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
6989 rtx reg, int just_select)
6991 enum rtx_code code = GET_CODE (x);
6992 int next_select = just_select || code == XOR || code == NOT || code == NEG;
6993 enum machine_mode op_mode;
6994 unsigned HOST_WIDE_INT fuller_mask, nonzero;
6995 rtx op0, op1, temp;
6997 /* If this is a CALL or ASM_OPERANDS, don't do anything. Some of the
6998 code below will do the wrong thing since the mode of such an
6999 expression is VOIDmode.
7001 Also do nothing if X is a CLOBBER; this can happen if X was
7002 the return value from a call to gen_lowpart. */
7003 if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
7004 return x;
7006 /* We want to perform the operation is its present mode unless we know
7007 that the operation is valid in MODE, in which case we do the operation
7008 in MODE. */
7009 op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
7010 && have_insn_for (code, mode))
7011 ? mode : GET_MODE (x));
7013 /* It is not valid to do a right-shift in a narrower mode
7014 than the one it came in with. */
7015 if ((code == LSHIFTRT || code == ASHIFTRT)
7016 && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
7017 op_mode = GET_MODE (x);
7019 /* Truncate MASK to fit OP_MODE. */
7020 if (op_mode)
7021 mask &= GET_MODE_MASK (op_mode);
7023 /* When we have an arithmetic operation, or a shift whose count we
7024 do not know, we need to assume that all bits up to the highest-order
7025 bit in MASK will be needed. This is how we form such a mask. */
7026 if (mask & ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
7027 fuller_mask = ~(unsigned HOST_WIDE_INT) 0;
7028 else
7029 fuller_mask = (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
7030 - 1);
7032 /* Determine what bits of X are guaranteed to be (non)zero. */
7033 nonzero = nonzero_bits (x, mode);
7035 /* If none of the bits in X are needed, return a zero. */
7036 if (! just_select && (nonzero & mask) == 0)
7037 x = const0_rtx;
7039 /* If X is a CONST_INT, return a new one. Do this here since the
7040 test below will fail. */
7041 if (GET_CODE (x) == CONST_INT)
7043 if (SCALAR_INT_MODE_P (mode))
7044 return gen_int_mode (INTVAL (x) & mask, mode);
7045 else
7047 x = GEN_INT (INTVAL (x) & mask);
7048 return gen_lowpart_common (mode, x);
7052 /* If X is narrower than MODE and we want all the bits in X's mode, just
7053 get X in the proper mode. */
7054 if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
7055 && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
7056 return gen_lowpart (mode, x);
7058 switch (code)
7060 case CLOBBER:
7061 /* If X is a (clobber (const_int)), return it since we know we are
7062 generating something that won't match. */
7063 return x;
7065 case USE:
7066 /* X is a (use (mem ..)) that was made from a bit-field extraction that
7067 spanned the boundary of the MEM. If we are now masking so it is
7068 within that boundary, we don't need the USE any more. */
7069 if (! BITS_BIG_ENDIAN
7070 && (mask & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
7071 return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7072 break;
7074 case SIGN_EXTEND:
7075 case ZERO_EXTEND:
7076 case ZERO_EXTRACT:
7077 case SIGN_EXTRACT:
7078 x = expand_compound_operation (x);
7079 if (GET_CODE (x) != code)
7080 return force_to_mode (x, mode, mask, reg, next_select);
7081 break;
7083 case REG:
7084 if (reg != 0 && (rtx_equal_p (get_last_value (reg), x)
7085 || rtx_equal_p (reg, get_last_value (x))))
7086 x = reg;
7087 break;
7089 case SUBREG:
7090 if (subreg_lowpart_p (x)
7091 /* We can ignore the effect of this SUBREG if it narrows the mode or
7092 if the constant masks to zero all the bits the mode doesn't
7093 have. */
7094 && ((GET_MODE_SIZE (GET_MODE (x))
7095 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
7096 || (0 == (mask
7097 & GET_MODE_MASK (GET_MODE (x))
7098 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
7099 return force_to_mode (SUBREG_REG (x), mode, mask, reg, next_select);
7100 break;
7102 case AND:
7103 /* If this is an AND with a constant, convert it into an AND
7104 whose constant is the AND of that constant with MASK. If it
7105 remains an AND of MASK, delete it since it is redundant. */
7107 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
7109 x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
7110 mask & INTVAL (XEXP (x, 1)));
7112 /* If X is still an AND, see if it is an AND with a mask that
7113 is just some low-order bits. If so, and it is MASK, we don't
7114 need it. */
7116 if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
7117 && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
7118 == mask))
7119 x = XEXP (x, 0);
7121 /* If it remains an AND, try making another AND with the bits
7122 in the mode mask that aren't in MASK turned on. If the
7123 constant in the AND is wide enough, this might make a
7124 cheaper constant. */
7126 if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
7127 && GET_MODE_MASK (GET_MODE (x)) != mask
7128 && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
7130 HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
7131 | (GET_MODE_MASK (GET_MODE (x)) & ~mask));
7132 int width = GET_MODE_BITSIZE (GET_MODE (x));
7133 rtx y;
7135 /* If MODE is narrower than HOST_WIDE_INT and CVAL is a negative
7136 number, sign extend it. */
7137 if (width > 0 && width < HOST_BITS_PER_WIDE_INT
7138 && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7139 cval |= (HOST_WIDE_INT) -1 << width;
7141 y = simplify_gen_binary (AND, GET_MODE (x),
7142 XEXP (x, 0), GEN_INT (cval));
7143 if (rtx_cost (y, SET) < rtx_cost (x, SET))
7144 x = y;
7147 break;
7150 goto binop;
7152 case PLUS:
7153 /* In (and (plus FOO C1) M), if M is a mask that just turns off
7154 low-order bits (as in an alignment operation) and FOO is already
7155 aligned to that boundary, mask C1 to that boundary as well.
7156 This may eliminate that PLUS and, later, the AND. */
7159 unsigned int width = GET_MODE_BITSIZE (mode);
7160 unsigned HOST_WIDE_INT smask = mask;
7162 /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
7163 number, sign extend it. */
7165 if (width < HOST_BITS_PER_WIDE_INT
7166 && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
7167 smask |= (HOST_WIDE_INT) -1 << width;
7169 if (GET_CODE (XEXP (x, 1)) == CONST_INT
7170 && exact_log2 (- smask) >= 0
7171 && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
7172 && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
7173 return force_to_mode (plus_constant (XEXP (x, 0),
7174 (INTVAL (XEXP (x, 1)) & smask)),
7175 mode, smask, reg, next_select);
7178 /* ... fall through ... */
7180 case MULT:
7181 /* For PLUS, MINUS and MULT, we need any bits less significant than the
7182 most significant bit in MASK since carries from those bits will
7183 affect the bits we are interested in. */
7184 mask = fuller_mask;
7185 goto binop;
7187 case MINUS:
7188 /* If X is (minus C Y) where C's least set bit is larger than any bit
7189 in the mask, then we may replace with (neg Y). */
7190 if (GET_CODE (XEXP (x, 0)) == CONST_INT
7191 && (((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 0))
7192 & -INTVAL (XEXP (x, 0))))
7193 > mask))
7195 x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
7196 GET_MODE (x));
7197 return force_to_mode (x, mode, mask, reg, next_select);
7200 /* Similarly, if C contains every bit in the fuller_mask, then we may
7201 replace with (not Y). */
7202 if (GET_CODE (XEXP (x, 0)) == CONST_INT
7203 && ((INTVAL (XEXP (x, 0)) | (HOST_WIDE_INT) fuller_mask)
7204 == INTVAL (XEXP (x, 0))))
7206 x = simplify_gen_unary (NOT, GET_MODE (x),
7207 XEXP (x, 1), GET_MODE (x));
7208 return force_to_mode (x, mode, mask, reg, next_select);
7211 mask = fuller_mask;
7212 goto binop;
7214 case IOR:
7215 case XOR:
7216 /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
7217 LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
7218 operation which may be a bitfield extraction. Ensure that the
7219 constant we form is not wider than the mode of X. */
7221 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7222 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7223 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7224 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7225 && GET_CODE (XEXP (x, 1)) == CONST_INT
7226 && ((INTVAL (XEXP (XEXP (x, 0), 1))
7227 + floor_log2 (INTVAL (XEXP (x, 1))))
7228 < GET_MODE_BITSIZE (GET_MODE (x)))
7229 && (INTVAL (XEXP (x, 1))
7230 & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
7232 temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
7233 << INTVAL (XEXP (XEXP (x, 0), 1)));
7234 temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
7235 XEXP (XEXP (x, 0), 0), temp);
7236 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
7237 XEXP (XEXP (x, 0), 1));
7238 return force_to_mode (x, mode, mask, reg, next_select);
7241 binop:
7242 /* For most binary operations, just propagate into the operation and
7243 change the mode if we have an operation of that mode. */
7245 op0 = gen_lowpart (op_mode,
7246 force_to_mode (XEXP (x, 0), mode, mask,
7247 reg, next_select));
7248 op1 = gen_lowpart (op_mode,
7249 force_to_mode (XEXP (x, 1), mode, mask,
7250 reg, next_select));
7252 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7253 x = simplify_gen_binary (code, op_mode, op0, op1);
7254 break;
7256 case ASHIFT:
7257 /* For left shifts, do the same, but just for the first operand.
7258 However, we cannot do anything with shifts where we cannot
7259 guarantee that the counts are smaller than the size of the mode
7260 because such a count will have a different meaning in a
7261 wider mode. */
7263 if (! (GET_CODE (XEXP (x, 1)) == CONST_INT
7264 && INTVAL (XEXP (x, 1)) >= 0
7265 && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
7266 && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
7267 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
7268 < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
7269 break;
7271 /* If the shift count is a constant and we can do arithmetic in
7272 the mode of the shift, refine which bits we need. Otherwise, use the
7273 conservative form of the mask. */
7274 if (GET_CODE (XEXP (x, 1)) == CONST_INT
7275 && INTVAL (XEXP (x, 1)) >= 0
7276 && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
7277 && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7278 mask >>= INTVAL (XEXP (x, 1));
7279 else
7280 mask = fuller_mask;
7282 op0 = gen_lowpart (op_mode,
7283 force_to_mode (XEXP (x, 0), op_mode,
7284 mask, reg, next_select));
7286 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7287 x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
7288 break;
7290 case LSHIFTRT:
7291 /* Here we can only do something if the shift count is a constant,
7292 this shift constant is valid for the host, and we can do arithmetic
7293 in OP_MODE. */
7295 if (GET_CODE (XEXP (x, 1)) == CONST_INT
7296 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7297 && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
7299 rtx inner = XEXP (x, 0);
7300 unsigned HOST_WIDE_INT inner_mask;
7302 /* Select the mask of the bits we need for the shift operand. */
7303 inner_mask = mask << INTVAL (XEXP (x, 1));
7305 /* We can only change the mode of the shift if we can do arithmetic
7306 in the mode of the shift and INNER_MASK is no wider than the
7307 width of X's mode. */
7308 if ((inner_mask & ~GET_MODE_MASK (GET_MODE (x))) != 0)
7309 op_mode = GET_MODE (x);
7311 inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
7313 if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
7314 x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
7317 /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
7318 shift and AND produces only copies of the sign bit (C2 is one less
7319 than a power of two), we can do this with just a shift. */
7321 if (GET_CODE (x) == LSHIFTRT
7322 && GET_CODE (XEXP (x, 1)) == CONST_INT
7323 /* The shift puts one of the sign bit copies in the least significant
7324 bit. */
7325 && ((INTVAL (XEXP (x, 1))
7326 + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
7327 >= GET_MODE_BITSIZE (GET_MODE (x)))
7328 && exact_log2 (mask + 1) >= 0
7329 /* Number of bits left after the shift must be more than the mask
7330 needs. */
7331 && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
7332 <= GET_MODE_BITSIZE (GET_MODE (x)))
7333 /* Must be more sign bit copies than the mask needs. */
7334 && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
7335 >= exact_log2 (mask + 1)))
7336 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7337 GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
7338 - exact_log2 (mask + 1)));
7340 goto shiftrt;
7342 case ASHIFTRT:
7343 /* If we are just looking for the sign bit, we don't need this shift at
7344 all, even if it has a variable count. */
7345 if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
7346 && (mask == ((unsigned HOST_WIDE_INT) 1
7347 << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
7348 return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7350 /* If this is a shift by a constant, get a mask that contains those bits
7351 that are not copies of the sign bit. We then have two cases: If
7352 MASK only includes those bits, this can be a logical shift, which may
7353 allow simplifications. If MASK is a single-bit field not within
7354 those bits, we are requesting a copy of the sign bit and hence can
7355 shift the sign bit to the appropriate location. */
7357 if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0
7358 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7360 int i = -1;
7362 /* If the considered data is wider than HOST_WIDE_INT, we can't
7363 represent a mask for all its bits in a single scalar.
7364 But we only care about the lower bits, so calculate these. */
7366 if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
7368 nonzero = ~(HOST_WIDE_INT) 0;
7370 /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7371 is the number of bits a full-width mask would have set.
7372 We need only shift if these are fewer than nonzero can
7373 hold. If not, we must keep all bits set in nonzero. */
7375 if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
7376 < HOST_BITS_PER_WIDE_INT)
7377 nonzero >>= INTVAL (XEXP (x, 1))
7378 + HOST_BITS_PER_WIDE_INT
7379 - GET_MODE_BITSIZE (GET_MODE (x)) ;
7381 else
7383 nonzero = GET_MODE_MASK (GET_MODE (x));
7384 nonzero >>= INTVAL (XEXP (x, 1));
7387 if ((mask & ~nonzero) == 0
7388 || (i = exact_log2 (mask)) >= 0)
7390 x = simplify_shift_const
7391 (x, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
7392 i < 0 ? INTVAL (XEXP (x, 1))
7393 : GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
7395 if (GET_CODE (x) != ASHIFTRT)
7396 return force_to_mode (x, mode, mask, reg, next_select);
7400 /* If MASK is 1, convert this to an LSHIFTRT. This can be done
7401 even if the shift count isn't a constant. */
7402 if (mask == 1)
7403 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
7404 XEXP (x, 0), XEXP (x, 1));
7406 shiftrt:
7408 /* If this is a zero- or sign-extension operation that just affects bits
7409 we don't care about, remove it. Be sure the call above returned
7410 something that is still a shift. */
7412 if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
7413 && GET_CODE (XEXP (x, 1)) == CONST_INT
7414 && INTVAL (XEXP (x, 1)) >= 0
7415 && (INTVAL (XEXP (x, 1))
7416 <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
7417 && GET_CODE (XEXP (x, 0)) == ASHIFT
7418 && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
7419 return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
7420 reg, next_select);
7422 break;
7424 case ROTATE:
7425 case ROTATERT:
7426 /* If the shift count is constant and we can do computations
7427 in the mode of X, compute where the bits we care about are.
7428 Otherwise, we can't do anything. Don't change the mode of
7429 the shift or propagate MODE into the shift, though. */
7430 if (GET_CODE (XEXP (x, 1)) == CONST_INT
7431 && INTVAL (XEXP (x, 1)) >= 0)
7433 temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
7434 GET_MODE (x), GEN_INT (mask),
7435 XEXP (x, 1));
7436 if (temp && GET_CODE (temp) == CONST_INT)
7437 SUBST (XEXP (x, 0),
7438 force_to_mode (XEXP (x, 0), GET_MODE (x),
7439 INTVAL (temp), reg, next_select));
7441 break;
7443 case NEG:
7444 /* If we just want the low-order bit, the NEG isn't needed since it
7445 won't change the low-order bit. */
7446 if (mask == 1)
7447 return force_to_mode (XEXP (x, 0), mode, mask, reg, just_select);
7449 /* We need any bits less significant than the most significant bit in
7450 MASK since carries from those bits will affect the bits we are
7451 interested in. */
7452 mask = fuller_mask;
7453 goto unop;
7455 case NOT:
7456 /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
7457 same as the XOR case above. Ensure that the constant we form is not
7458 wider than the mode of X. */
7460 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7461 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
7462 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7463 && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
7464 < GET_MODE_BITSIZE (GET_MODE (x)))
7465 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
7467 temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
7468 GET_MODE (x));
7469 temp = simplify_gen_binary (XOR, GET_MODE (x),
7470 XEXP (XEXP (x, 0), 0), temp);
7471 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
7472 temp, XEXP (XEXP (x, 0), 1));
7474 return force_to_mode (x, mode, mask, reg, next_select);
7477 /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
7478 use the full mask inside the NOT. */
7479 mask = fuller_mask;
7481 unop:
7482 op0 = gen_lowpart (op_mode,
7483 force_to_mode (XEXP (x, 0), mode, mask,
7484 reg, next_select));
7485 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
7486 x = simplify_gen_unary (code, op_mode, op0, op_mode);
7487 break;
7489 case NE:
7490 /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
7491 in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
7492 which is equal to STORE_FLAG_VALUE. */
7493 if ((mask & ~STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
7494 && GET_MODE (XEXP (x, 0)) == mode
7495 && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
7496 && (nonzero_bits (XEXP (x, 0), mode)
7497 == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
7498 return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
7500 break;
7502 case IF_THEN_ELSE:
7503 /* We have no way of knowing if the IF_THEN_ELSE can itself be
7504 written in a narrower mode. We play it safe and do not do so. */
7506 SUBST (XEXP (x, 1),
7507 gen_lowpart (GET_MODE (x),
7508 force_to_mode (XEXP (x, 1), mode,
7509 mask, reg, next_select)));
7510 SUBST (XEXP (x, 2),
7511 gen_lowpart (GET_MODE (x),
7512 force_to_mode (XEXP (x, 2), mode,
7513 mask, reg, next_select)));
7514 break;
7516 default:
7517 break;
7520 /* Ensure we return a value of the proper mode. */
7521 return gen_lowpart (mode, x);
7524 /* Return nonzero if X is an expression that has one of two values depending on
7525 whether some other value is zero or nonzero. In that case, we return the
7526 value that is being tested, *PTRUE is set to the value if the rtx being
7527 returned has a nonzero value, and *PFALSE is set to the other alternative.
7529 If we return zero, we set *PTRUE and *PFALSE to X. */
7531 static rtx
7532 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
7534 enum machine_mode mode = GET_MODE (x);
7535 enum rtx_code code = GET_CODE (x);
7536 rtx cond0, cond1, true0, true1, false0, false1;
7537 unsigned HOST_WIDE_INT nz;
7539 /* If we are comparing a value against zero, we are done. */
7540 if ((code == NE || code == EQ)
7541 && XEXP (x, 1) == const0_rtx)
7543 *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
7544 *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
7545 return XEXP (x, 0);
7548 /* If this is a unary operation whose operand has one of two values, apply
7549 our opcode to compute those values. */
7550 else if (UNARY_P (x)
7551 && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
7553 *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
7554 *pfalse = simplify_gen_unary (code, mode, false0,
7555 GET_MODE (XEXP (x, 0)));
7556 return cond0;
7559 /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
7560 make can't possibly match and would suppress other optimizations. */
7561 else if (code == COMPARE)
7564 /* If this is a binary operation, see if either side has only one of two
7565 values. If either one does or if both do and they are conditional on
7566 the same value, compute the new true and false values. */
7567 else if (BINARY_P (x))
7569 cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
7570 cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
7572 if ((cond0 != 0 || cond1 != 0)
7573 && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
7575 /* If if_then_else_cond returned zero, then true/false are the
7576 same rtl. We must copy one of them to prevent invalid rtl
7577 sharing. */
7578 if (cond0 == 0)
7579 true0 = copy_rtx (true0);
7580 else if (cond1 == 0)
7581 true1 = copy_rtx (true1);
7583 if (COMPARISON_P (x))
7585 *ptrue = simplify_gen_relational (code, mode, VOIDmode,
7586 true0, true1);
7587 *pfalse = simplify_gen_relational (code, mode, VOIDmode,
7588 false0, false1);
7590 else
7592 *ptrue = simplify_gen_binary (code, mode, true0, true1);
7593 *pfalse = simplify_gen_binary (code, mode, false0, false1);
7596 return cond0 ? cond0 : cond1;
7599 /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
7600 operands is zero when the other is nonzero, and vice-versa,
7601 and STORE_FLAG_VALUE is 1 or -1. */
7603 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7604 && (code == PLUS || code == IOR || code == XOR || code == MINUS
7605 || code == UMAX)
7606 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7608 rtx op0 = XEXP (XEXP (x, 0), 1);
7609 rtx op1 = XEXP (XEXP (x, 1), 1);
7611 cond0 = XEXP (XEXP (x, 0), 0);
7612 cond1 = XEXP (XEXP (x, 1), 0);
7614 if (COMPARISON_P (cond0)
7615 && COMPARISON_P (cond1)
7616 && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
7617 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7618 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7619 || ((swap_condition (GET_CODE (cond0))
7620 == reversed_comparison_code (cond1, NULL))
7621 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7622 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7623 && ! side_effects_p (x))
7625 *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
7626 *pfalse = simplify_gen_binary (MULT, mode,
7627 (code == MINUS
7628 ? simplify_gen_unary (NEG, mode,
7629 op1, mode)
7630 : op1),
7631 const_true_rtx);
7632 return cond0;
7636 /* Similarly for MULT, AND and UMIN, except that for these the result
7637 is always zero. */
7638 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
7639 && (code == MULT || code == AND || code == UMIN)
7640 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
7642 cond0 = XEXP (XEXP (x, 0), 0);
7643 cond1 = XEXP (XEXP (x, 1), 0);
7645 if (COMPARISON_P (cond0)
7646 && COMPARISON_P (cond1)
7647 && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
7648 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
7649 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
7650 || ((swap_condition (GET_CODE (cond0))
7651 == reversed_comparison_code (cond1, NULL))
7652 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
7653 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
7654 && ! side_effects_p (x))
7656 *ptrue = *pfalse = const0_rtx;
7657 return cond0;
7662 else if (code == IF_THEN_ELSE)
7664 /* If we have IF_THEN_ELSE already, extract the condition and
7665 canonicalize it if it is NE or EQ. */
7666 cond0 = XEXP (x, 0);
7667 *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
7668 if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
7669 return XEXP (cond0, 0);
7670 else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
7672 *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
7673 return XEXP (cond0, 0);
7675 else
7676 return cond0;
7679 /* If X is a SUBREG, we can narrow both the true and false values
7680 if the inner expression, if there is a condition. */
7681 else if (code == SUBREG
7682 && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
7683 &true0, &false0)))
7685 true0 = simplify_gen_subreg (mode, true0,
7686 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7687 false0 = simplify_gen_subreg (mode, false0,
7688 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
7689 if (true0 && false0)
7691 *ptrue = true0;
7692 *pfalse = false0;
7693 return cond0;
7697 /* If X is a constant, this isn't special and will cause confusions
7698 if we treat it as such. Likewise if it is equivalent to a constant. */
7699 else if (CONSTANT_P (x)
7700 || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
7703 /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
7704 will be least confusing to the rest of the compiler. */
7705 else if (mode == BImode)
7707 *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
7708 return x;
7711 /* If X is known to be either 0 or -1, those are the true and
7712 false values when testing X. */
7713 else if (x == constm1_rtx || x == const0_rtx
7714 || (mode != VOIDmode
7715 && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
7717 *ptrue = constm1_rtx, *pfalse = const0_rtx;
7718 return x;
7721 /* Likewise for 0 or a single bit. */
7722 else if (SCALAR_INT_MODE_P (mode)
7723 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
7724 && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
7726 *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
7727 return x;
7730 /* Otherwise fail; show no condition with true and false values the same. */
7731 *ptrue = *pfalse = x;
7732 return 0;
7735 /* Return the value of expression X given the fact that condition COND
7736 is known to be true when applied to REG as its first operand and VAL
7737 as its second. X is known to not be shared and so can be modified in
7738 place.
7740 We only handle the simplest cases, and specifically those cases that
7741 arise with IF_THEN_ELSE expressions. */
7743 static rtx
7744 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
7746 enum rtx_code code = GET_CODE (x);
7747 rtx temp;
7748 const char *fmt;
7749 int i, j;
7751 if (side_effects_p (x))
7752 return x;
7754 /* If either operand of the condition is a floating point value,
7755 then we have to avoid collapsing an EQ comparison. */
7756 if (cond == EQ
7757 && rtx_equal_p (x, reg)
7758 && ! FLOAT_MODE_P (GET_MODE (x))
7759 && ! FLOAT_MODE_P (GET_MODE (val)))
7760 return val;
7762 if (cond == UNEQ && rtx_equal_p (x, reg))
7763 return val;
7765 /* If X is (abs REG) and we know something about REG's relationship
7766 with zero, we may be able to simplify this. */
7768 if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
7769 switch (cond)
7771 case GE: case GT: case EQ:
7772 return XEXP (x, 0);
7773 case LT: case LE:
7774 return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
7775 XEXP (x, 0),
7776 GET_MODE (XEXP (x, 0)));
7777 default:
7778 break;
7781 /* The only other cases we handle are MIN, MAX, and comparisons if the
7782 operands are the same as REG and VAL. */
7784 else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
7786 if (rtx_equal_p (XEXP (x, 0), val))
7787 cond = swap_condition (cond), temp = val, val = reg, reg = temp;
7789 if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
7791 if (COMPARISON_P (x))
7793 if (comparison_dominates_p (cond, code))
7794 return const_true_rtx;
7796 code = reversed_comparison_code (x, NULL);
7797 if (code != UNKNOWN
7798 && comparison_dominates_p (cond, code))
7799 return const0_rtx;
7800 else
7801 return x;
7803 else if (code == SMAX || code == SMIN
7804 || code == UMIN || code == UMAX)
7806 int unsignedp = (code == UMIN || code == UMAX);
7808 /* Do not reverse the condition when it is NE or EQ.
7809 This is because we cannot conclude anything about
7810 the value of 'SMAX (x, y)' when x is not equal to y,
7811 but we can when x equals y. */
7812 if ((code == SMAX || code == UMAX)
7813 && ! (cond == EQ || cond == NE))
7814 cond = reverse_condition (cond);
7816 switch (cond)
7818 case GE: case GT:
7819 return unsignedp ? x : XEXP (x, 1);
7820 case LE: case LT:
7821 return unsignedp ? x : XEXP (x, 0);
7822 case GEU: case GTU:
7823 return unsignedp ? XEXP (x, 1) : x;
7824 case LEU: case LTU:
7825 return unsignedp ? XEXP (x, 0) : x;
7826 default:
7827 break;
7832 else if (code == SUBREG)
7834 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
7835 rtx new, r = known_cond (SUBREG_REG (x), cond, reg, val);
7837 if (SUBREG_REG (x) != r)
7839 /* We must simplify subreg here, before we lose track of the
7840 original inner_mode. */
7841 new = simplify_subreg (GET_MODE (x), r,
7842 inner_mode, SUBREG_BYTE (x));
7843 if (new)
7844 return new;
7845 else
7846 SUBST (SUBREG_REG (x), r);
7849 return x;
7851 /* We don't have to handle SIGN_EXTEND here, because even in the
7852 case of replacing something with a modeless CONST_INT, a
7853 CONST_INT is already (supposed to be) a valid sign extension for
7854 its narrower mode, which implies it's already properly
7855 sign-extended for the wider mode. Now, for ZERO_EXTEND, the
7856 story is different. */
7857 else if (code == ZERO_EXTEND)
7859 enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
7860 rtx new, r = known_cond (XEXP (x, 0), cond, reg, val);
7862 if (XEXP (x, 0) != r)
7864 /* We must simplify the zero_extend here, before we lose
7865 track of the original inner_mode. */
7866 new = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
7867 r, inner_mode);
7868 if (new)
7869 return new;
7870 else
7871 SUBST (XEXP (x, 0), r);
7874 return x;
7877 fmt = GET_RTX_FORMAT (code);
7878 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7880 if (fmt[i] == 'e')
7881 SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
7882 else if (fmt[i] == 'E')
7883 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7884 SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
7885 cond, reg, val));
7888 return x;
7891 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
7892 assignment as a field assignment. */
7894 static int
7895 rtx_equal_for_field_assignment_p (rtx x, rtx y)
7897 if (x == y || rtx_equal_p (x, y))
7898 return 1;
7900 if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
7901 return 0;
7903 /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
7904 Note that all SUBREGs of MEM are paradoxical; otherwise they
7905 would have been rewritten. */
7906 if (MEM_P (x) && GET_CODE (y) == SUBREG
7907 && MEM_P (SUBREG_REG (y))
7908 && rtx_equal_p (SUBREG_REG (y),
7909 gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
7910 return 1;
7912 if (MEM_P (y) && GET_CODE (x) == SUBREG
7913 && MEM_P (SUBREG_REG (x))
7914 && rtx_equal_p (SUBREG_REG (x),
7915 gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
7916 return 1;
7918 /* We used to see if get_last_value of X and Y were the same but that's
7919 not correct. In one direction, we'll cause the assignment to have
7920 the wrong destination and in the case, we'll import a register into this
7921 insn that might have already have been dead. So fail if none of the
7922 above cases are true. */
7923 return 0;
7926 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
7927 Return that assignment if so.
7929 We only handle the most common cases. */
7931 static rtx
7932 make_field_assignment (rtx x)
7934 rtx dest = SET_DEST (x);
7935 rtx src = SET_SRC (x);
7936 rtx assign;
7937 rtx rhs, lhs;
7938 HOST_WIDE_INT c1;
7939 HOST_WIDE_INT pos;
7940 unsigned HOST_WIDE_INT len;
7941 rtx other;
7942 enum machine_mode mode;
7944 /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
7945 a clear of a one-bit field. We will have changed it to
7946 (and (rotate (const_int -2) POS) DEST), so check for that. Also check
7947 for a SUBREG. */
7949 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
7950 && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
7951 && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
7952 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7954 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7955 1, 1, 1, 0);
7956 if (assign != 0)
7957 return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7958 return x;
7961 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
7962 && subreg_lowpart_p (XEXP (src, 0))
7963 && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
7964 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
7965 && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
7966 && GET_CODE (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == CONST_INT
7967 && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
7968 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7970 assign = make_extraction (VOIDmode, dest, 0,
7971 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
7972 1, 1, 1, 0);
7973 if (assign != 0)
7974 return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7975 return x;
7978 /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
7979 one-bit field. */
7980 if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
7981 && XEXP (XEXP (src, 0), 0) == const1_rtx
7982 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7984 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7985 1, 1, 1, 0);
7986 if (assign != 0)
7987 return gen_rtx_SET (VOIDmode, assign, const1_rtx);
7988 return x;
7991 /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
7992 SRC is an AND with all bits of that field set, then we can discard
7993 the AND. */
7994 if (GET_CODE (dest) == ZERO_EXTRACT
7995 && GET_CODE (XEXP (dest, 1)) == CONST_INT
7996 && GET_CODE (src) == AND
7997 && GET_CODE (XEXP (src, 1)) == CONST_INT)
7999 HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
8000 unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
8001 unsigned HOST_WIDE_INT ze_mask;
8003 if (width >= HOST_BITS_PER_WIDE_INT)
8004 ze_mask = -1;
8005 else
8006 ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
8008 /* Complete overlap. We can remove the source AND. */
8009 if ((and_mask & ze_mask) == ze_mask)
8010 return gen_rtx_SET (VOIDmode, dest, XEXP (src, 0));
8012 /* Partial overlap. We can reduce the source AND. */
8013 if ((and_mask & ze_mask) != and_mask)
8015 mode = GET_MODE (src);
8016 src = gen_rtx_AND (mode, XEXP (src, 0),
8017 gen_int_mode (and_mask & ze_mask, mode));
8018 return gen_rtx_SET (VOIDmode, dest, src);
8022 /* The other case we handle is assignments into a constant-position
8023 field. They look like (ior/xor (and DEST C1) OTHER). If C1 represents
8024 a mask that has all one bits except for a group of zero bits and
8025 OTHER is known to have zeros where C1 has ones, this is such an
8026 assignment. Compute the position and length from C1. Shift OTHER
8027 to the appropriate position, force it to the required mode, and
8028 make the extraction. Check for the AND in both operands. */
8030 if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
8031 return x;
8033 rhs = expand_compound_operation (XEXP (src, 0));
8034 lhs = expand_compound_operation (XEXP (src, 1));
8036 if (GET_CODE (rhs) == AND
8037 && GET_CODE (XEXP (rhs, 1)) == CONST_INT
8038 && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
8039 c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
8040 else if (GET_CODE (lhs) == AND
8041 && GET_CODE (XEXP (lhs, 1)) == CONST_INT
8042 && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
8043 c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
8044 else
8045 return x;
8047 pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
8048 if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
8049 || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
8050 || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
8051 return x;
8053 assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
8054 if (assign == 0)
8055 return x;
8057 /* The mode to use for the source is the mode of the assignment, or of
8058 what is inside a possible STRICT_LOW_PART. */
8059 mode = (GET_CODE (assign) == STRICT_LOW_PART
8060 ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
8062 /* Shift OTHER right POS places and make it the source, restricting it
8063 to the proper length and mode. */
8065 src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT,
8066 GET_MODE (src), other, pos),
8067 mode,
8068 GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
8069 ? ~(unsigned HOST_WIDE_INT) 0
8070 : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
8071 dest, 0);
8073 /* If SRC is masked by an AND that does not make a difference in
8074 the value being stored, strip it. */
8075 if (GET_CODE (assign) == ZERO_EXTRACT
8076 && GET_CODE (XEXP (assign, 1)) == CONST_INT
8077 && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
8078 && GET_CODE (src) == AND
8079 && GET_CODE (XEXP (src, 1)) == CONST_INT
8080 && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (src, 1))
8081 == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1))
8082 src = XEXP (src, 0);
8084 return gen_rtx_SET (VOIDmode, assign, src);
8087 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
8088 if so. */
8090 static rtx
8091 apply_distributive_law (rtx x)
8093 enum rtx_code code = GET_CODE (x);
8094 enum rtx_code inner_code;
8095 rtx lhs, rhs, other;
8096 rtx tem;
8098 /* Distributivity is not true for floating point as it can change the
8099 value. So we don't do it unless -funsafe-math-optimizations. */
8100 if (FLOAT_MODE_P (GET_MODE (x))
8101 && ! flag_unsafe_math_optimizations)
8102 return x;
8104 /* The outer operation can only be one of the following: */
8105 if (code != IOR && code != AND && code != XOR
8106 && code != PLUS && code != MINUS)
8107 return x;
8109 lhs = XEXP (x, 0);
8110 rhs = XEXP (x, 1);
8112 /* If either operand is a primitive we can't do anything, so get out
8113 fast. */
8114 if (OBJECT_P (lhs) || OBJECT_P (rhs))
8115 return x;
8117 lhs = expand_compound_operation (lhs);
8118 rhs = expand_compound_operation (rhs);
8119 inner_code = GET_CODE (lhs);
8120 if (inner_code != GET_CODE (rhs))
8121 return x;
8123 /* See if the inner and outer operations distribute. */
8124 switch (inner_code)
8126 case LSHIFTRT:
8127 case ASHIFTRT:
8128 case AND:
8129 case IOR:
8130 /* These all distribute except over PLUS. */
8131 if (code == PLUS || code == MINUS)
8132 return x;
8133 break;
8135 case MULT:
8136 if (code != PLUS && code != MINUS)
8137 return x;
8138 break;
8140 case ASHIFT:
8141 /* This is also a multiply, so it distributes over everything. */
8142 break;
8144 case SUBREG:
8145 /* Non-paradoxical SUBREGs distributes over all operations,
8146 provided the inner modes and byte offsets are the same, this
8147 is an extraction of a low-order part, we don't convert an fp
8148 operation to int or vice versa, this is not a vector mode,
8149 and we would not be converting a single-word operation into a
8150 multi-word operation. The latter test is not required, but
8151 it prevents generating unneeded multi-word operations. Some
8152 of the previous tests are redundant given the latter test,
8153 but are retained because they are required for correctness.
8155 We produce the result slightly differently in this case. */
8157 if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
8158 || SUBREG_BYTE (lhs) != SUBREG_BYTE (rhs)
8159 || ! subreg_lowpart_p (lhs)
8160 || (GET_MODE_CLASS (GET_MODE (lhs))
8161 != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
8162 || (GET_MODE_SIZE (GET_MODE (lhs))
8163 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
8164 || VECTOR_MODE_P (GET_MODE (lhs))
8165 || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
8166 return x;
8168 tem = simplify_gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
8169 SUBREG_REG (lhs), SUBREG_REG (rhs));
8170 return gen_lowpart (GET_MODE (x), tem);
8172 default:
8173 return x;
8176 /* Set LHS and RHS to the inner operands (A and B in the example
8177 above) and set OTHER to the common operand (C in the example).
8178 There is only one way to do this unless the inner operation is
8179 commutative. */
8180 if (COMMUTATIVE_ARITH_P (lhs)
8181 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
8182 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
8183 else if (COMMUTATIVE_ARITH_P (lhs)
8184 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
8185 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
8186 else if (COMMUTATIVE_ARITH_P (lhs)
8187 && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
8188 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
8189 else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
8190 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
8191 else
8192 return x;
8194 /* Form the new inner operation, seeing if it simplifies first. */
8195 tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
8197 /* There is one exception to the general way of distributing:
8198 (a | c) ^ (b | c) -> (a ^ b) & ~c */
8199 if (code == XOR && inner_code == IOR)
8201 inner_code = AND;
8202 other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
8205 /* We may be able to continuing distributing the result, so call
8206 ourselves recursively on the inner operation before forming the
8207 outer operation, which we return. */
8208 return simplify_gen_binary (inner_code, GET_MODE (x),
8209 apply_distributive_law (tem), other);
8212 /* See if X is of the form (* (+ A B) C), and if so convert to
8213 (+ (* A C) (* B C)) and try to simplify.
8215 Most of the time, this results in no change. However, if some of
8216 the operands are the same or inverses of each other, simplifications
8217 will result.
8219 For example, (and (ior A B) (not B)) can occur as the result of
8220 expanding a bit field assignment. When we apply the distributive
8221 law to this, we get (ior (and (A (not B))) (and (B (not B)))),
8222 which then simplifies to (and (A (not B))).
8224 Note that no checks happen on the validity of applying the inverse
8225 distributive law. This is pointless since we can do it in the
8226 few places where this routine is called.
8228 N is the index of the term that is decomposed (the arithmetic operation,
8229 i.e. (+ A B) in the first example above). !N is the index of the term that
8230 is distributed, i.e. of C in the first example above. */
8231 static rtx
8232 distribute_and_simplify_rtx (rtx x, int n)
8234 enum machine_mode mode;
8235 enum rtx_code outer_code, inner_code;
8236 rtx decomposed, distributed, inner_op0, inner_op1, new_op0, new_op1, tmp;
8238 decomposed = XEXP (x, n);
8239 if (!ARITHMETIC_P (decomposed))
8240 return NULL_RTX;
8242 mode = GET_MODE (x);
8243 outer_code = GET_CODE (x);
8244 distributed = XEXP (x, !n);
8246 inner_code = GET_CODE (decomposed);
8247 inner_op0 = XEXP (decomposed, 0);
8248 inner_op1 = XEXP (decomposed, 1);
8250 /* Special case (and (xor B C) (not A)), which is equivalent to
8251 (xor (ior A B) (ior A C)) */
8252 if (outer_code == AND && inner_code == XOR && GET_CODE (distributed) == NOT)
8254 distributed = XEXP (distributed, 0);
8255 outer_code = IOR;
8258 if (n == 0)
8260 /* Distribute the second term. */
8261 new_op0 = simplify_gen_binary (outer_code, mode, inner_op0, distributed);
8262 new_op1 = simplify_gen_binary (outer_code, mode, inner_op1, distributed);
8264 else
8266 /* Distribute the first term. */
8267 new_op0 = simplify_gen_binary (outer_code, mode, distributed, inner_op0);
8268 new_op1 = simplify_gen_binary (outer_code, mode, distributed, inner_op1);
8271 tmp = apply_distributive_law (simplify_gen_binary (inner_code, mode,
8272 new_op0, new_op1));
8273 if (GET_CODE (tmp) != outer_code
8274 && rtx_cost (tmp, SET) < rtx_cost (x, SET))
8275 return tmp;
8277 return NULL_RTX;
8280 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
8281 in MODE.
8283 Return an equivalent form, if different from X. Otherwise, return X. If
8284 X is zero, we are to always construct the equivalent form. */
8286 static rtx
8287 simplify_and_const_int (rtx x, enum machine_mode mode, rtx varop,
8288 unsigned HOST_WIDE_INT constop)
8290 unsigned HOST_WIDE_INT nonzero;
8291 int i;
8293 /* Simplify VAROP knowing that we will be only looking at some of the
8294 bits in it.
8296 Note by passing in CONSTOP, we guarantee that the bits not set in
8297 CONSTOP are not significant and will never be examined. We must
8298 ensure that is the case by explicitly masking out those bits
8299 before returning. */
8300 varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
8302 /* If VAROP is a CLOBBER, we will fail so return it. */
8303 if (GET_CODE (varop) == CLOBBER)
8304 return varop;
8306 /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
8307 to VAROP and return the new constant. */
8308 if (GET_CODE (varop) == CONST_INT)
8309 return gen_int_mode (INTVAL (varop) & constop, mode);
8311 /* See what bits may be nonzero in VAROP. Unlike the general case of
8312 a call to nonzero_bits, here we don't care about bits outside
8313 MODE. */
8315 nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
8317 /* Turn off all bits in the constant that are known to already be zero.
8318 Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
8319 which is tested below. */
8321 constop &= nonzero;
8323 /* If we don't have any bits left, return zero. */
8324 if (constop == 0)
8325 return const0_rtx;
8327 /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
8328 a power of two, we can replace this with an ASHIFT. */
8329 if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
8330 && (i = exact_log2 (constop)) >= 0)
8331 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
8333 /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
8334 or XOR, then try to apply the distributive law. This may eliminate
8335 operations if either branch can be simplified because of the AND.
8336 It may also make some cases more complex, but those cases probably
8337 won't match a pattern either with or without this. */
8339 if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
8340 return
8341 gen_lowpart
8342 (mode,
8343 apply_distributive_law
8344 (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
8345 simplify_and_const_int (NULL_RTX,
8346 GET_MODE (varop),
8347 XEXP (varop, 0),
8348 constop),
8349 simplify_and_const_int (NULL_RTX,
8350 GET_MODE (varop),
8351 XEXP (varop, 1),
8352 constop))));
8354 /* If VAROP is PLUS, and the constant is a mask of low bite, distribute
8355 the AND and see if one of the operands simplifies to zero. If so, we
8356 may eliminate it. */
8358 if (GET_CODE (varop) == PLUS
8359 && exact_log2 (constop + 1) >= 0)
8361 rtx o0, o1;
8363 o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
8364 o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
8365 if (o0 == const0_rtx)
8366 return o1;
8367 if (o1 == const0_rtx)
8368 return o0;
8371 /* Get VAROP in MODE. Try to get a SUBREG if not. Don't make a new SUBREG
8372 if we already had one (just check for the simplest cases). */
8373 if (x && GET_CODE (XEXP (x, 0)) == SUBREG
8374 && GET_MODE (XEXP (x, 0)) == mode
8375 && SUBREG_REG (XEXP (x, 0)) == varop)
8376 varop = XEXP (x, 0);
8377 else
8378 varop = gen_lowpart (mode, varop);
8380 /* If we can't make the SUBREG, try to return what we were given. */
8381 if (GET_CODE (varop) == CLOBBER)
8382 return x ? x : varop;
8384 /* If we are only masking insignificant bits, return VAROP. */
8385 if (constop == nonzero)
8386 x = varop;
8387 else
8389 /* Otherwise, return an AND. */
8390 constop = trunc_int_for_mode (constop, mode);
8391 /* See how much, if any, of X we can use. */
8392 if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
8393 x = simplify_gen_binary (AND, mode, varop, GEN_INT (constop));
8395 else
8397 if (GET_CODE (XEXP (x, 1)) != CONST_INT
8398 || (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) != constop)
8399 SUBST (XEXP (x, 1), GEN_INT (constop));
8401 SUBST (XEXP (x, 0), varop);
8405 return x;
8408 /* Given a REG, X, compute which bits in X can be nonzero.
8409 We don't care about bits outside of those defined in MODE.
8411 For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
8412 a shift, AND, or zero_extract, we can do better. */
8414 static rtx
8415 reg_nonzero_bits_for_combine (rtx x, enum machine_mode mode,
8416 rtx known_x ATTRIBUTE_UNUSED,
8417 enum machine_mode known_mode ATTRIBUTE_UNUSED,
8418 unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
8419 unsigned HOST_WIDE_INT *nonzero)
8421 rtx tem;
8423 /* If X is a register whose nonzero bits value is current, use it.
8424 Otherwise, if X is a register whose value we can find, use that
8425 value. Otherwise, use the previously-computed global nonzero bits
8426 for this register. */
8428 if (reg_stat[REGNO (x)].last_set_value != 0
8429 && (reg_stat[REGNO (x)].last_set_mode == mode
8430 || (GET_MODE_CLASS (reg_stat[REGNO (x)].last_set_mode) == MODE_INT
8431 && GET_MODE_CLASS (mode) == MODE_INT))
8432 && (reg_stat[REGNO (x)].last_set_label == label_tick
8433 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8434 && REG_N_SETS (REGNO (x)) == 1
8435 && ! REGNO_REG_SET_P
8436 (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
8437 REGNO (x))))
8438 && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
8440 *nonzero &= reg_stat[REGNO (x)].last_set_nonzero_bits;
8441 return NULL;
8444 tem = get_last_value (x);
8446 if (tem)
8448 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
8449 /* If X is narrower than MODE and TEM is a non-negative
8450 constant that would appear negative in the mode of X,
8451 sign-extend it for use in reg_nonzero_bits because some
8452 machines (maybe most) will actually do the sign-extension
8453 and this is the conservative approach.
8455 ??? For 2.5, try to tighten up the MD files in this regard
8456 instead of this kludge. */
8458 if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode)
8459 && GET_CODE (tem) == CONST_INT
8460 && INTVAL (tem) > 0
8461 && 0 != (INTVAL (tem)
8462 & ((HOST_WIDE_INT) 1
8463 << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
8464 tem = GEN_INT (INTVAL (tem)
8465 | ((HOST_WIDE_INT) (-1)
8466 << GET_MODE_BITSIZE (GET_MODE (x))));
8467 #endif
8468 return tem;
8470 else if (nonzero_sign_valid && reg_stat[REGNO (x)].nonzero_bits)
8472 unsigned HOST_WIDE_INT mask = reg_stat[REGNO (x)].nonzero_bits;
8474 if (GET_MODE_BITSIZE (GET_MODE (x)) < GET_MODE_BITSIZE (mode))
8475 /* We don't know anything about the upper bits. */
8476 mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
8477 *nonzero &= mask;
8480 return NULL;
8483 /* Return the number of bits at the high-order end of X that are known to
8484 be equal to the sign bit. X will be used in mode MODE; if MODE is
8485 VOIDmode, X will be used in its own mode. The returned value will always
8486 be between 1 and the number of bits in MODE. */
8488 static rtx
8489 reg_num_sign_bit_copies_for_combine (rtx x, enum machine_mode mode,
8490 rtx known_x ATTRIBUTE_UNUSED,
8491 enum machine_mode known_mode
8492 ATTRIBUTE_UNUSED,
8493 unsigned int known_ret ATTRIBUTE_UNUSED,
8494 unsigned int *result)
8496 rtx tem;
8498 if (reg_stat[REGNO (x)].last_set_value != 0
8499 && reg_stat[REGNO (x)].last_set_mode == mode
8500 && (reg_stat[REGNO (x)].last_set_label == label_tick
8501 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8502 && REG_N_SETS (REGNO (x)) == 1
8503 && ! REGNO_REG_SET_P
8504 (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
8505 REGNO (x))))
8506 && INSN_CUID (reg_stat[REGNO (x)].last_set) < subst_low_cuid)
8508 *result = reg_stat[REGNO (x)].last_set_sign_bit_copies;
8509 return NULL;
8512 tem = get_last_value (x);
8513 if (tem != 0)
8514 return tem;
8516 if (nonzero_sign_valid && reg_stat[REGNO (x)].sign_bit_copies != 0
8517 && GET_MODE_BITSIZE (GET_MODE (x)) == GET_MODE_BITSIZE (mode))
8518 *result = reg_stat[REGNO (x)].sign_bit_copies;
8520 return NULL;
8523 /* Return the number of "extended" bits there are in X, when interpreted
8524 as a quantity in MODE whose signedness is indicated by UNSIGNEDP. For
8525 unsigned quantities, this is the number of high-order zero bits.
8526 For signed quantities, this is the number of copies of the sign bit
8527 minus 1. In both case, this function returns the number of "spare"
8528 bits. For example, if two quantities for which this function returns
8529 at least 1 are added, the addition is known not to overflow.
8531 This function will always return 0 unless called during combine, which
8532 implies that it must be called from a define_split. */
8534 unsigned int
8535 extended_count (rtx x, enum machine_mode mode, int unsignedp)
8537 if (nonzero_sign_valid == 0)
8538 return 0;
8540 return (unsignedp
8541 ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8542 ? (unsigned int) (GET_MODE_BITSIZE (mode) - 1
8543 - floor_log2 (nonzero_bits (x, mode)))
8544 : 0)
8545 : num_sign_bit_copies (x, mode) - 1);
8548 /* This function is called from `simplify_shift_const' to merge two
8549 outer operations. Specifically, we have already found that we need
8550 to perform operation *POP0 with constant *PCONST0 at the outermost
8551 position. We would now like to also perform OP1 with constant CONST1
8552 (with *POP0 being done last).
8554 Return 1 if we can do the operation and update *POP0 and *PCONST0 with
8555 the resulting operation. *PCOMP_P is set to 1 if we would need to
8556 complement the innermost operand, otherwise it is unchanged.
8558 MODE is the mode in which the operation will be done. No bits outside
8559 the width of this mode matter. It is assumed that the width of this mode
8560 is smaller than or equal to HOST_BITS_PER_WIDE_INT.
8562 If *POP0 or OP1 are UNKNOWN, it means no operation is required. Only NEG, PLUS,
8563 IOR, XOR, and AND are supported. We may set *POP0 to SET if the proper
8564 result is simply *PCONST0.
8566 If the resulting operation cannot be expressed as one operation, we
8567 return 0 and do not change *POP0, *PCONST0, and *PCOMP_P. */
8569 static int
8570 merge_outer_ops (enum rtx_code *pop0, HOST_WIDE_INT *pconst0, enum rtx_code op1, HOST_WIDE_INT const1, enum machine_mode mode, int *pcomp_p)
8572 enum rtx_code op0 = *pop0;
8573 HOST_WIDE_INT const0 = *pconst0;
8575 const0 &= GET_MODE_MASK (mode);
8576 const1 &= GET_MODE_MASK (mode);
8578 /* If OP0 is an AND, clear unimportant bits in CONST1. */
8579 if (op0 == AND)
8580 const1 &= const0;
8582 /* If OP0 or OP1 is UNKNOWN, this is easy. Similarly if they are the same or
8583 if OP0 is SET. */
8585 if (op1 == UNKNOWN || op0 == SET)
8586 return 1;
8588 else if (op0 == UNKNOWN)
8589 op0 = op1, const0 = const1;
8591 else if (op0 == op1)
8593 switch (op0)
8595 case AND:
8596 const0 &= const1;
8597 break;
8598 case IOR:
8599 const0 |= const1;
8600 break;
8601 case XOR:
8602 const0 ^= const1;
8603 break;
8604 case PLUS:
8605 const0 += const1;
8606 break;
8607 case NEG:
8608 op0 = UNKNOWN;
8609 break;
8610 default:
8611 break;
8615 /* Otherwise, if either is a PLUS or NEG, we can't do anything. */
8616 else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
8617 return 0;
8619 /* If the two constants aren't the same, we can't do anything. The
8620 remaining six cases can all be done. */
8621 else if (const0 != const1)
8622 return 0;
8624 else
8625 switch (op0)
8627 case IOR:
8628 if (op1 == AND)
8629 /* (a & b) | b == b */
8630 op0 = SET;
8631 else /* op1 == XOR */
8632 /* (a ^ b) | b == a | b */
8634 break;
8636 case XOR:
8637 if (op1 == AND)
8638 /* (a & b) ^ b == (~a) & b */
8639 op0 = AND, *pcomp_p = 1;
8640 else /* op1 == IOR */
8641 /* (a | b) ^ b == a & ~b */
8642 op0 = AND, const0 = ~const0;
8643 break;
8645 case AND:
8646 if (op1 == IOR)
8647 /* (a | b) & b == b */
8648 op0 = SET;
8649 else /* op1 == XOR */
8650 /* (a ^ b) & b) == (~a) & b */
8651 *pcomp_p = 1;
8652 break;
8653 default:
8654 break;
8657 /* Check for NO-OP cases. */
8658 const0 &= GET_MODE_MASK (mode);
8659 if (const0 == 0
8660 && (op0 == IOR || op0 == XOR || op0 == PLUS))
8661 op0 = UNKNOWN;
8662 else if (const0 == 0 && op0 == AND)
8663 op0 = SET;
8664 else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
8665 && op0 == AND)
8666 op0 = UNKNOWN;
8668 /* ??? Slightly redundant with the above mask, but not entirely.
8669 Moving this above means we'd have to sign-extend the mode mask
8670 for the final test. */
8671 const0 = trunc_int_for_mode (const0, mode);
8673 *pop0 = op0;
8674 *pconst0 = const0;
8676 return 1;
8679 /* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift.
8680 The result of the shift is RESULT_MODE. X, if nonzero, is an expression
8681 that we started with.
8683 The shift is normally computed in the widest mode we find in VAROP, as
8684 long as it isn't a different number of words than RESULT_MODE. Exceptions
8685 are ASHIFTRT and ROTATE, which are always done in their original mode, */
8687 static rtx
8688 simplify_shift_const (rtx x, enum rtx_code code,
8689 enum machine_mode result_mode, rtx varop,
8690 int orig_count)
8692 enum rtx_code orig_code = code;
8693 unsigned int count;
8694 int signed_count;
8695 enum machine_mode mode = result_mode;
8696 enum machine_mode shift_mode, tmode;
8697 unsigned int mode_words
8698 = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
8699 /* We form (outer_op (code varop count) (outer_const)). */
8700 enum rtx_code outer_op = UNKNOWN;
8701 HOST_WIDE_INT outer_const = 0;
8702 rtx const_rtx;
8703 int complement_p = 0;
8704 rtx new;
8706 /* Make sure and truncate the "natural" shift on the way in. We don't
8707 want to do this inside the loop as it makes it more difficult to
8708 combine shifts. */
8709 if (SHIFT_COUNT_TRUNCATED)
8710 orig_count &= GET_MODE_BITSIZE (mode) - 1;
8712 /* If we were given an invalid count, don't do anything except exactly
8713 what was requested. */
8715 if (orig_count < 0 || orig_count >= (int) GET_MODE_BITSIZE (mode))
8717 if (x)
8718 return x;
8720 return gen_rtx_fmt_ee (code, mode, varop, GEN_INT (orig_count));
8723 count = orig_count;
8725 /* Unless one of the branches of the `if' in this loop does a `continue',
8726 we will `break' the loop after the `if'. */
8728 while (count != 0)
8730 /* If we have an operand of (clobber (const_int 0)), just return that
8731 value. */
8732 if (GET_CODE (varop) == CLOBBER)
8733 return varop;
8735 /* If we discovered we had to complement VAROP, leave. Making a NOT
8736 here would cause an infinite loop. */
8737 if (complement_p)
8738 break;
8740 /* Convert ROTATERT to ROTATE. */
8741 if (code == ROTATERT)
8743 unsigned int bitsize = GET_MODE_BITSIZE (result_mode);;
8744 code = ROTATE;
8745 if (VECTOR_MODE_P (result_mode))
8746 count = bitsize / GET_MODE_NUNITS (result_mode) - count;
8747 else
8748 count = bitsize - count;
8751 /* We need to determine what mode we will do the shift in. If the
8752 shift is a right shift or a ROTATE, we must always do it in the mode
8753 it was originally done in. Otherwise, we can do it in MODE, the
8754 widest mode encountered. */
8755 shift_mode
8756 = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
8757 ? result_mode : mode);
8759 /* Handle cases where the count is greater than the size of the mode
8760 minus 1. For ASHIFT, use the size minus one as the count (this can
8761 occur when simplifying (lshiftrt (ashiftrt ..))). For rotates,
8762 take the count modulo the size. For other shifts, the result is
8763 zero.
8765 Since these shifts are being produced by the compiler by combining
8766 multiple operations, each of which are defined, we know what the
8767 result is supposed to be. */
8769 if (count > (unsigned int) (GET_MODE_BITSIZE (shift_mode) - 1))
8771 if (code == ASHIFTRT)
8772 count = GET_MODE_BITSIZE (shift_mode) - 1;
8773 else if (code == ROTATE || code == ROTATERT)
8774 count %= GET_MODE_BITSIZE (shift_mode);
8775 else
8777 /* We can't simply return zero because there may be an
8778 outer op. */
8779 varop = const0_rtx;
8780 count = 0;
8781 break;
8785 /* An arithmetic right shift of a quantity known to be -1 or 0
8786 is a no-op. */
8787 if (code == ASHIFTRT
8788 && (num_sign_bit_copies (varop, shift_mode)
8789 == GET_MODE_BITSIZE (shift_mode)))
8791 count = 0;
8792 break;
8795 /* If we are doing an arithmetic right shift and discarding all but
8796 the sign bit copies, this is equivalent to doing a shift by the
8797 bitsize minus one. Convert it into that shift because it will often
8798 allow other simplifications. */
8800 if (code == ASHIFTRT
8801 && (count + num_sign_bit_copies (varop, shift_mode)
8802 >= GET_MODE_BITSIZE (shift_mode)))
8803 count = GET_MODE_BITSIZE (shift_mode) - 1;
8805 /* We simplify the tests below and elsewhere by converting
8806 ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
8807 `make_compound_operation' will convert it to an ASHIFTRT for
8808 those machines (such as VAX) that don't have an LSHIFTRT. */
8809 if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
8810 && code == ASHIFTRT
8811 && ((nonzero_bits (varop, shift_mode)
8812 & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
8813 == 0))
8814 code = LSHIFTRT;
8816 if (code == LSHIFTRT
8817 && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
8818 && !(nonzero_bits (varop, shift_mode) >> count))
8819 varop = const0_rtx;
8820 if (code == ASHIFT
8821 && GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
8822 && !((nonzero_bits (varop, shift_mode) << count)
8823 & GET_MODE_MASK (shift_mode)))
8824 varop = const0_rtx;
8826 switch (GET_CODE (varop))
8828 case SIGN_EXTEND:
8829 case ZERO_EXTEND:
8830 case SIGN_EXTRACT:
8831 case ZERO_EXTRACT:
8832 new = expand_compound_operation (varop);
8833 if (new != varop)
8835 varop = new;
8836 continue;
8838 break;
8840 case MEM:
8841 /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
8842 minus the width of a smaller mode, we can do this with a
8843 SIGN_EXTEND or ZERO_EXTEND from the narrower memory location. */
8844 if ((code == ASHIFTRT || code == LSHIFTRT)
8845 && ! mode_dependent_address_p (XEXP (varop, 0))
8846 && ! MEM_VOLATILE_P (varop)
8847 && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
8848 MODE_INT, 1)) != BLKmode)
8850 new = adjust_address_nv (varop, tmode,
8851 BYTES_BIG_ENDIAN ? 0
8852 : count / BITS_PER_UNIT);
8854 varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
8855 : ZERO_EXTEND, mode, new);
8856 count = 0;
8857 continue;
8859 break;
8861 case USE:
8862 /* Similar to the case above, except that we can only do this if
8863 the resulting mode is the same as that of the underlying
8864 MEM and adjust the address depending on the *bits* endianness
8865 because of the way that bit-field extract insns are defined. */
8866 if ((code == ASHIFTRT || code == LSHIFTRT)
8867 && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
8868 MODE_INT, 1)) != BLKmode
8869 && tmode == GET_MODE (XEXP (varop, 0)))
8871 if (BITS_BIG_ENDIAN)
8872 new = XEXP (varop, 0);
8873 else
8875 new = copy_rtx (XEXP (varop, 0));
8876 SUBST (XEXP (new, 0),
8877 plus_constant (XEXP (new, 0),
8878 count / BITS_PER_UNIT));
8881 varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
8882 : ZERO_EXTEND, mode, new);
8883 count = 0;
8884 continue;
8886 break;
8888 case SUBREG:
8889 /* If VAROP is a SUBREG, strip it as long as the inner operand has
8890 the same number of words as what we've seen so far. Then store
8891 the widest mode in MODE. */
8892 if (subreg_lowpart_p (varop)
8893 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
8894 > GET_MODE_SIZE (GET_MODE (varop)))
8895 && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
8896 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
8897 == mode_words)
8899 varop = SUBREG_REG (varop);
8900 if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
8901 mode = GET_MODE (varop);
8902 continue;
8904 break;
8906 case MULT:
8907 /* Some machines use MULT instead of ASHIFT because MULT
8908 is cheaper. But it is still better on those machines to
8909 merge two shifts into one. */
8910 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8911 && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
8913 varop
8914 = simplify_gen_binary (ASHIFT, GET_MODE (varop),
8915 XEXP (varop, 0),
8916 GEN_INT (exact_log2 (
8917 INTVAL (XEXP (varop, 1)))));
8918 continue;
8920 break;
8922 case UDIV:
8923 /* Similar, for when divides are cheaper. */
8924 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8925 && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
8927 varop
8928 = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
8929 XEXP (varop, 0),
8930 GEN_INT (exact_log2 (
8931 INTVAL (XEXP (varop, 1)))));
8932 continue;
8934 break;
8936 case ASHIFTRT:
8937 /* If we are extracting just the sign bit of an arithmetic
8938 right shift, that shift is not needed. However, the sign
8939 bit of a wider mode may be different from what would be
8940 interpreted as the sign bit in a narrower mode, so, if
8941 the result is narrower, don't discard the shift. */
8942 if (code == LSHIFTRT
8943 && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
8944 && (GET_MODE_BITSIZE (result_mode)
8945 >= GET_MODE_BITSIZE (GET_MODE (varop))))
8947 varop = XEXP (varop, 0);
8948 continue;
8951 /* ... fall through ... */
8953 case LSHIFTRT:
8954 case ASHIFT:
8955 case ROTATE:
8956 /* Here we have two nested shifts. The result is usually the
8957 AND of a new shift with a mask. We compute the result below. */
8958 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8959 && INTVAL (XEXP (varop, 1)) >= 0
8960 && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
8961 && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
8962 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
8964 enum rtx_code first_code = GET_CODE (varop);
8965 unsigned int first_count = INTVAL (XEXP (varop, 1));
8966 unsigned HOST_WIDE_INT mask;
8967 rtx mask_rtx;
8969 /* We have one common special case. We can't do any merging if
8970 the inner code is an ASHIFTRT of a smaller mode. However, if
8971 we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
8972 with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
8973 we can convert it to
8974 (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
8975 This simplifies certain SIGN_EXTEND operations. */
8976 if (code == ASHIFT && first_code == ASHIFTRT
8977 && count == (unsigned int)
8978 (GET_MODE_BITSIZE (result_mode)
8979 - GET_MODE_BITSIZE (GET_MODE (varop))))
8981 /* C3 has the low-order C1 bits zero. */
8983 mask = (GET_MODE_MASK (mode)
8984 & ~(((HOST_WIDE_INT) 1 << first_count) - 1));
8986 varop = simplify_and_const_int (NULL_RTX, result_mode,
8987 XEXP (varop, 0), mask);
8988 varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
8989 varop, count);
8990 count = first_count;
8991 code = ASHIFTRT;
8992 continue;
8995 /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
8996 than C1 high-order bits equal to the sign bit, we can convert
8997 this to either an ASHIFT or an ASHIFTRT depending on the
8998 two counts.
9000 We cannot do this if VAROP's mode is not SHIFT_MODE. */
9002 if (code == ASHIFTRT && first_code == ASHIFT
9003 && GET_MODE (varop) == shift_mode
9004 && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
9005 > first_count))
9007 varop = XEXP (varop, 0);
9009 signed_count = count - first_count;
9010 if (signed_count < 0)
9011 count = -signed_count, code = ASHIFT;
9012 else
9013 count = signed_count;
9015 continue;
9018 /* There are some cases we can't do. If CODE is ASHIFTRT,
9019 we can only do this if FIRST_CODE is also ASHIFTRT.
9021 We can't do the case when CODE is ROTATE and FIRST_CODE is
9022 ASHIFTRT.
9024 If the mode of this shift is not the mode of the outer shift,
9025 we can't do this if either shift is a right shift or ROTATE.
9027 Finally, we can't do any of these if the mode is too wide
9028 unless the codes are the same.
9030 Handle the case where the shift codes are the same
9031 first. */
9033 if (code == first_code)
9035 if (GET_MODE (varop) != result_mode
9036 && (code == ASHIFTRT || code == LSHIFTRT
9037 || code == ROTATE))
9038 break;
9040 count += first_count;
9041 varop = XEXP (varop, 0);
9042 continue;
9045 if (code == ASHIFTRT
9046 || (code == ROTATE && first_code == ASHIFTRT)
9047 || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
9048 || (GET_MODE (varop) != result_mode
9049 && (first_code == ASHIFTRT || first_code == LSHIFTRT
9050 || first_code == ROTATE
9051 || code == ROTATE)))
9052 break;
9054 /* To compute the mask to apply after the shift, shift the
9055 nonzero bits of the inner shift the same way the
9056 outer shift will. */
9058 mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
9060 mask_rtx
9061 = simplify_binary_operation (code, result_mode, mask_rtx,
9062 GEN_INT (count));
9064 /* Give up if we can't compute an outer operation to use. */
9065 if (mask_rtx == 0
9066 || GET_CODE (mask_rtx) != CONST_INT
9067 || ! merge_outer_ops (&outer_op, &outer_const, AND,
9068 INTVAL (mask_rtx),
9069 result_mode, &complement_p))
9070 break;
9072 /* If the shifts are in the same direction, we add the
9073 counts. Otherwise, we subtract them. */
9074 signed_count = count;
9075 if ((code == ASHIFTRT || code == LSHIFTRT)
9076 == (first_code == ASHIFTRT || first_code == LSHIFTRT))
9077 signed_count += first_count;
9078 else
9079 signed_count -= first_count;
9081 /* If COUNT is positive, the new shift is usually CODE,
9082 except for the two exceptions below, in which case it is
9083 FIRST_CODE. If the count is negative, FIRST_CODE should
9084 always be used */
9085 if (signed_count > 0
9086 && ((first_code == ROTATE && code == ASHIFT)
9087 || (first_code == ASHIFTRT && code == LSHIFTRT)))
9088 code = first_code, count = signed_count;
9089 else if (signed_count < 0)
9090 code = first_code, count = -signed_count;
9091 else
9092 count = signed_count;
9094 varop = XEXP (varop, 0);
9095 continue;
9098 /* If we have (A << B << C) for any shift, we can convert this to
9099 (A << C << B). This wins if A is a constant. Only try this if
9100 B is not a constant. */
9102 else if (GET_CODE (varop) == code
9103 && GET_CODE (XEXP (varop, 1)) != CONST_INT
9104 && 0 != (new
9105 = simplify_binary_operation (code, mode,
9106 XEXP (varop, 0),
9107 GEN_INT (count))))
9109 varop = gen_rtx_fmt_ee (code, mode, new, XEXP (varop, 1));
9110 count = 0;
9111 continue;
9113 break;
9115 case NOT:
9116 /* Make this fit the case below. */
9117 varop = gen_rtx_XOR (mode, XEXP (varop, 0),
9118 GEN_INT (GET_MODE_MASK (mode)));
9119 continue;
9121 case IOR:
9122 case AND:
9123 case XOR:
9124 /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
9125 with C the size of VAROP - 1 and the shift is logical if
9126 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9127 we have an (le X 0) operation. If we have an arithmetic shift
9128 and STORE_FLAG_VALUE is 1 or we have a logical shift with
9129 STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation. */
9131 if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
9132 && XEXP (XEXP (varop, 0), 1) == constm1_rtx
9133 && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9134 && (code == LSHIFTRT || code == ASHIFTRT)
9135 && count == (unsigned int)
9136 (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9137 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9139 count = 0;
9140 varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
9141 const0_rtx);
9143 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9144 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9146 continue;
9149 /* If we have (shift (logical)), move the logical to the outside
9150 to allow it to possibly combine with another logical and the
9151 shift to combine with another shift. This also canonicalizes to
9152 what a ZERO_EXTRACT looks like. Also, some machines have
9153 (and (shift)) insns. */
9155 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9156 /* We can't do this if we have (ashiftrt (xor)) and the
9157 constant has its sign bit set in shift_mode. */
9158 && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9159 && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9160 shift_mode))
9161 && (new = simplify_binary_operation (code, result_mode,
9162 XEXP (varop, 1),
9163 GEN_INT (count))) != 0
9164 && GET_CODE (new) == CONST_INT
9165 && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
9166 INTVAL (new), result_mode, &complement_p))
9168 varop = XEXP (varop, 0);
9169 continue;
9172 /* If we can't do that, try to simplify the shift in each arm of the
9173 logical expression, make a new logical expression, and apply
9174 the inverse distributive law. This also can't be done
9175 for some (ashiftrt (xor)). */
9176 if (GET_CODE (XEXP (varop, 1)) == CONST_INT
9177 && !(code == ASHIFTRT && GET_CODE (varop) == XOR
9178 && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
9179 shift_mode)))
9181 rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9182 XEXP (varop, 0), count);
9183 rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
9184 XEXP (varop, 1), count);
9186 varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
9187 lhs, rhs);
9188 varop = apply_distributive_law (varop);
9190 count = 0;
9191 continue;
9193 break;
9195 case EQ:
9196 /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
9197 says that the sign bit can be tested, FOO has mode MODE, C is
9198 GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
9199 that may be nonzero. */
9200 if (code == LSHIFTRT
9201 && XEXP (varop, 1) == const0_rtx
9202 && GET_MODE (XEXP (varop, 0)) == result_mode
9203 && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9204 && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9205 && ((STORE_FLAG_VALUE
9206 & ((HOST_WIDE_INT) 1
9207 < (GET_MODE_BITSIZE (result_mode) - 1))))
9208 && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9209 && merge_outer_ops (&outer_op, &outer_const, XOR,
9210 (HOST_WIDE_INT) 1, result_mode,
9211 &complement_p))
9213 varop = XEXP (varop, 0);
9214 count = 0;
9215 continue;
9217 break;
9219 case NEG:
9220 /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
9221 than the number of bits in the mode is equivalent to A. */
9222 if (code == LSHIFTRT
9223 && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9224 && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
9226 varop = XEXP (varop, 0);
9227 count = 0;
9228 continue;
9231 /* NEG commutes with ASHIFT since it is multiplication. Move the
9232 NEG outside to allow shifts to combine. */
9233 if (code == ASHIFT
9234 && merge_outer_ops (&outer_op, &outer_const, NEG,
9235 (HOST_WIDE_INT) 0, result_mode,
9236 &complement_p))
9238 varop = XEXP (varop, 0);
9239 continue;
9241 break;
9243 case PLUS:
9244 /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
9245 is one less than the number of bits in the mode is
9246 equivalent to (xor A 1). */
9247 if (code == LSHIFTRT
9248 && count == (unsigned int) (GET_MODE_BITSIZE (result_mode) - 1)
9249 && XEXP (varop, 1) == constm1_rtx
9250 && nonzero_bits (XEXP (varop, 0), result_mode) == 1
9251 && merge_outer_ops (&outer_op, &outer_const, XOR,
9252 (HOST_WIDE_INT) 1, result_mode,
9253 &complement_p))
9255 count = 0;
9256 varop = XEXP (varop, 0);
9257 continue;
9260 /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
9261 that might be nonzero in BAR are those being shifted out and those
9262 bits are known zero in FOO, we can replace the PLUS with FOO.
9263 Similarly in the other operand order. This code occurs when
9264 we are computing the size of a variable-size array. */
9266 if ((code == ASHIFTRT || code == LSHIFTRT)
9267 && count < HOST_BITS_PER_WIDE_INT
9268 && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9269 && (nonzero_bits (XEXP (varop, 1), result_mode)
9270 & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
9272 varop = XEXP (varop, 0);
9273 continue;
9275 else if ((code == ASHIFTRT || code == LSHIFTRT)
9276 && count < HOST_BITS_PER_WIDE_INT
9277 && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9278 && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9279 >> count)
9280 && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9281 & nonzero_bits (XEXP (varop, 1),
9282 result_mode)))
9284 varop = XEXP (varop, 1);
9285 continue;
9288 /* (ashift (plus foo C) N) is (plus (ashift foo N) C'). */
9289 if (code == ASHIFT
9290 && GET_CODE (XEXP (varop, 1)) == CONST_INT
9291 && (new = simplify_binary_operation (ASHIFT, result_mode,
9292 XEXP (varop, 1),
9293 GEN_INT (count))) != 0
9294 && GET_CODE (new) == CONST_INT
9295 && merge_outer_ops (&outer_op, &outer_const, PLUS,
9296 INTVAL (new), result_mode, &complement_p))
9298 varop = XEXP (varop, 0);
9299 continue;
9302 /* Check for 'PLUS signbit', which is the canonical form of 'XOR
9303 signbit', and attempt to change the PLUS to an XOR and move it to
9304 the outer operation as is done above in the AND/IOR/XOR case
9305 leg for shift(logical). See details in logical handling above
9306 for reasoning in doing so. */
9307 if (code == LSHIFTRT
9308 && GET_CODE (XEXP (varop, 1)) == CONST_INT
9309 && mode_signbit_p (result_mode, XEXP (varop, 1))
9310 && (new = simplify_binary_operation (code, result_mode,
9311 XEXP (varop, 1),
9312 GEN_INT (count))) != 0
9313 && GET_CODE (new) == CONST_INT
9314 && merge_outer_ops (&outer_op, &outer_const, XOR,
9315 INTVAL (new), result_mode, &complement_p))
9317 varop = XEXP (varop, 0);
9318 continue;
9321 break;
9323 case MINUS:
9324 /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9325 with C the size of VAROP - 1 and the shift is logical if
9326 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9327 we have a (gt X 0) operation. If the shift is arithmetic with
9328 STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9329 we have a (neg (gt X 0)) operation. */
9331 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9332 && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
9333 && count == (unsigned int)
9334 (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)
9335 && (code == LSHIFTRT || code == ASHIFTRT)
9336 && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9337 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (varop, 0), 1))
9338 == count
9339 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9341 count = 0;
9342 varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
9343 const0_rtx);
9345 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9346 varop = gen_rtx_NEG (GET_MODE (varop), varop);
9348 continue;
9350 break;
9352 case TRUNCATE:
9353 /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
9354 if the truncate does not affect the value. */
9355 if (code == LSHIFTRT
9356 && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
9357 && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9358 && (INTVAL (XEXP (XEXP (varop, 0), 1))
9359 >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
9360 - GET_MODE_BITSIZE (GET_MODE (varop)))))
9362 rtx varop_inner = XEXP (varop, 0);
9364 varop_inner
9365 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
9366 XEXP (varop_inner, 0),
9367 GEN_INT
9368 (count + INTVAL (XEXP (varop_inner, 1))));
9369 varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
9370 count = 0;
9371 continue;
9373 break;
9375 default:
9376 break;
9379 break;
9382 /* We need to determine what mode to do the shift in. If the shift is
9383 a right shift or ROTATE, we must always do it in the mode it was
9384 originally done in. Otherwise, we can do it in MODE, the widest mode
9385 encountered. The code we care about is that of the shift that will
9386 actually be done, not the shift that was originally requested. */
9387 shift_mode
9388 = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9389 ? result_mode : mode);
9391 /* We have now finished analyzing the shift. The result should be
9392 a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places. If
9393 OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
9394 to the result of the shift. OUTER_CONST is the relevant constant,
9395 but we must turn off all bits turned off in the shift.
9397 If we were passed a value for X, see if we can use any pieces of
9398 it. If not, make new rtx. */
9400 if (x && GET_RTX_CLASS (GET_CODE (x)) == RTX_BIN_ARITH
9401 && GET_CODE (XEXP (x, 1)) == CONST_INT
9402 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) == count)
9403 const_rtx = XEXP (x, 1);
9404 else
9405 const_rtx = GEN_INT (count);
9407 if (x && GET_CODE (XEXP (x, 0)) == SUBREG
9408 && GET_MODE (XEXP (x, 0)) == shift_mode
9409 && SUBREG_REG (XEXP (x, 0)) == varop)
9410 varop = XEXP (x, 0);
9411 else if (GET_MODE (varop) != shift_mode)
9412 varop = gen_lowpart (shift_mode, varop);
9414 /* If we can't make the SUBREG, try to return what we were given. */
9415 if (GET_CODE (varop) == CLOBBER)
9416 return x ? x : varop;
9418 new = simplify_binary_operation (code, shift_mode, varop, const_rtx);
9419 if (new != 0)
9420 x = new;
9421 else
9422 x = gen_rtx_fmt_ee (code, shift_mode, varop, const_rtx);
9424 /* If we have an outer operation and we just made a shift, it is
9425 possible that we could have simplified the shift were it not
9426 for the outer operation. So try to do the simplification
9427 recursively. */
9429 if (outer_op != UNKNOWN && GET_CODE (x) == code
9430 && GET_CODE (XEXP (x, 1)) == CONST_INT)
9431 x = simplify_shift_const (x, code, shift_mode, XEXP (x, 0),
9432 INTVAL (XEXP (x, 1)));
9434 /* If we were doing an LSHIFTRT in a wider mode than it was originally,
9435 turn off all the bits that the shift would have turned off. */
9436 if (orig_code == LSHIFTRT && result_mode != shift_mode)
9437 x = simplify_and_const_int (NULL_RTX, shift_mode, x,
9438 GET_MODE_MASK (result_mode) >> orig_count);
9440 /* Do the remainder of the processing in RESULT_MODE. */
9441 x = gen_lowpart (result_mode, x);
9443 /* If COMPLEMENT_P is set, we have to complement X before doing the outer
9444 operation. */
9445 if (complement_p)
9446 x = simplify_gen_unary (NOT, result_mode, x, result_mode);
9448 if (outer_op != UNKNOWN)
9450 if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
9451 outer_const = trunc_int_for_mode (outer_const, result_mode);
9453 if (outer_op == AND)
9454 x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
9455 else if (outer_op == SET)
9456 /* This means that we have determined that the result is
9457 equivalent to a constant. This should be rare. */
9458 x = GEN_INT (outer_const);
9459 else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
9460 x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
9461 else
9462 x = simplify_gen_binary (outer_op, result_mode, x,
9463 GEN_INT (outer_const));
9466 return x;
9469 /* Like recog, but we receive the address of a pointer to a new pattern.
9470 We try to match the rtx that the pointer points to.
9471 If that fails, we may try to modify or replace the pattern,
9472 storing the replacement into the same pointer object.
9474 Modifications include deletion or addition of CLOBBERs.
9476 PNOTES is a pointer to a location where any REG_UNUSED notes added for
9477 the CLOBBERs are placed.
9479 The value is the final insn code from the pattern ultimately matched,
9480 or -1. */
9482 static int
9483 recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
9485 rtx pat = *pnewpat;
9486 int insn_code_number;
9487 int num_clobbers_to_add = 0;
9488 int i;
9489 rtx notes = 0;
9490 rtx old_notes, old_pat;
9492 /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
9493 we use to indicate that something didn't match. If we find such a
9494 thing, force rejection. */
9495 if (GET_CODE (pat) == PARALLEL)
9496 for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
9497 if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
9498 && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
9499 return -1;
9501 old_pat = PATTERN (insn);
9502 old_notes = REG_NOTES (insn);
9503 PATTERN (insn) = pat;
9504 REG_NOTES (insn) = 0;
9506 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9508 /* If it isn't, there is the possibility that we previously had an insn
9509 that clobbered some register as a side effect, but the combined
9510 insn doesn't need to do that. So try once more without the clobbers
9511 unless this represents an ASM insn. */
9513 if (insn_code_number < 0 && ! check_asm_operands (pat)
9514 && GET_CODE (pat) == PARALLEL)
9516 int pos;
9518 for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
9519 if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
9521 if (i != pos)
9522 SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
9523 pos++;
9526 SUBST_INT (XVECLEN (pat, 0), pos);
9528 if (pos == 1)
9529 pat = XVECEXP (pat, 0, 0);
9531 PATTERN (insn) = pat;
9532 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9534 PATTERN (insn) = old_pat;
9535 REG_NOTES (insn) = old_notes;
9537 /* Recognize all noop sets, these will be killed by followup pass. */
9538 if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
9539 insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
9541 /* If we had any clobbers to add, make a new pattern than contains
9542 them. Then check to make sure that all of them are dead. */
9543 if (num_clobbers_to_add)
9545 rtx newpat = gen_rtx_PARALLEL (VOIDmode,
9546 rtvec_alloc (GET_CODE (pat) == PARALLEL
9547 ? (XVECLEN (pat, 0)
9548 + num_clobbers_to_add)
9549 : num_clobbers_to_add + 1));
9551 if (GET_CODE (pat) == PARALLEL)
9552 for (i = 0; i < XVECLEN (pat, 0); i++)
9553 XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
9554 else
9555 XVECEXP (newpat, 0, 0) = pat;
9557 add_clobbers (newpat, insn_code_number);
9559 for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
9560 i < XVECLEN (newpat, 0); i++)
9562 if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
9563 && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
9564 return -1;
9565 notes = gen_rtx_EXPR_LIST (REG_UNUSED,
9566 XEXP (XVECEXP (newpat, 0, i), 0), notes);
9568 pat = newpat;
9571 *pnewpat = pat;
9572 *pnotes = notes;
9574 return insn_code_number;
9577 /* Like gen_lowpart_general but for use by combine. In combine it
9578 is not possible to create any new pseudoregs. However, it is
9579 safe to create invalid memory addresses, because combine will
9580 try to recognize them and all they will do is make the combine
9581 attempt fail.
9583 If for some reason this cannot do its job, an rtx
9584 (clobber (const_int 0)) is returned.
9585 An insn containing that will not be recognized. */
9587 static rtx
9588 gen_lowpart_for_combine (enum machine_mode omode, rtx x)
9590 enum machine_mode imode = GET_MODE (x);
9591 unsigned int osize = GET_MODE_SIZE (omode);
9592 unsigned int isize = GET_MODE_SIZE (imode);
9593 rtx result;
9595 if (omode == imode)
9596 return x;
9598 /* Return identity if this is a CONST or symbolic reference. */
9599 if (omode == Pmode
9600 && (GET_CODE (x) == CONST
9601 || GET_CODE (x) == SYMBOL_REF
9602 || GET_CODE (x) == LABEL_REF))
9603 return x;
9605 /* We can only support MODE being wider than a word if X is a
9606 constant integer or has a mode the same size. */
9607 if (GET_MODE_SIZE (omode) > UNITS_PER_WORD
9608 && ! ((imode == VOIDmode
9609 && (GET_CODE (x) == CONST_INT
9610 || GET_CODE (x) == CONST_DOUBLE))
9611 || isize == osize))
9612 goto fail;
9614 /* X might be a paradoxical (subreg (mem)). In that case, gen_lowpart
9615 won't know what to do. So we will strip off the SUBREG here and
9616 process normally. */
9617 if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
9619 x = SUBREG_REG (x);
9621 /* For use in case we fall down into the address adjustments
9622 further below, we need to adjust the known mode and size of
9623 x; imode and isize, since we just adjusted x. */
9624 imode = GET_MODE (x);
9626 if (imode == omode)
9627 return x;
9629 isize = GET_MODE_SIZE (imode);
9632 result = gen_lowpart_common (omode, x);
9634 #ifdef CANNOT_CHANGE_MODE_CLASS
9635 if (result != 0 && GET_CODE (result) == SUBREG)
9636 record_subregs_of_mode (result);
9637 #endif
9639 if (result)
9640 return result;
9642 if (MEM_P (x))
9644 int offset = 0;
9646 /* Refuse to work on a volatile memory ref or one with a mode-dependent
9647 address. */
9648 if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
9649 goto fail;
9651 /* If we want to refer to something bigger than the original memref,
9652 generate a paradoxical subreg instead. That will force a reload
9653 of the original memref X. */
9654 if (isize < osize)
9655 return gen_rtx_SUBREG (omode, x, 0);
9657 if (WORDS_BIG_ENDIAN)
9658 offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
9660 /* Adjust the address so that the address-after-the-data is
9661 unchanged. */
9662 if (BYTES_BIG_ENDIAN)
9663 offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
9665 return adjust_address_nv (x, omode, offset);
9668 /* If X is a comparison operator, rewrite it in a new mode. This
9669 probably won't match, but may allow further simplifications. */
9670 else if (COMPARISON_P (x))
9671 return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
9673 /* If we couldn't simplify X any other way, just enclose it in a
9674 SUBREG. Normally, this SUBREG won't match, but some patterns may
9675 include an explicit SUBREG or we may simplify it further in combine. */
9676 else
9678 int offset = 0;
9679 rtx res;
9681 offset = subreg_lowpart_offset (omode, imode);
9682 if (imode == VOIDmode)
9684 imode = int_mode_for_mode (omode);
9685 x = gen_lowpart_common (imode, x);
9686 if (x == NULL)
9687 goto fail;
9689 res = simplify_gen_subreg (omode, x, imode, offset);
9690 if (res)
9691 return res;
9694 fail:
9695 return gen_rtx_CLOBBER (imode, const0_rtx);
9698 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
9699 comparison code that will be tested.
9701 The result is a possibly different comparison code to use. *POP0 and
9702 *POP1 may be updated.
9704 It is possible that we might detect that a comparison is either always
9705 true or always false. However, we do not perform general constant
9706 folding in combine, so this knowledge isn't useful. Such tautologies
9707 should have been detected earlier. Hence we ignore all such cases. */
9709 static enum rtx_code
9710 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
9712 rtx op0 = *pop0;
9713 rtx op1 = *pop1;
9714 rtx tem, tem1;
9715 int i;
9716 enum machine_mode mode, tmode;
9718 /* Try a few ways of applying the same transformation to both operands. */
9719 while (1)
9721 #ifndef WORD_REGISTER_OPERATIONS
9722 /* The test below this one won't handle SIGN_EXTENDs on these machines,
9723 so check specially. */
9724 if (code != GTU && code != GEU && code != LTU && code != LEU
9725 && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
9726 && GET_CODE (XEXP (op0, 0)) == ASHIFT
9727 && GET_CODE (XEXP (op1, 0)) == ASHIFT
9728 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
9729 && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
9730 && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
9731 == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
9732 && GET_CODE (XEXP (op0, 1)) == CONST_INT
9733 && XEXP (op0, 1) == XEXP (op1, 1)
9734 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
9735 && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
9736 && (INTVAL (XEXP (op0, 1))
9737 == (GET_MODE_BITSIZE (GET_MODE (op0))
9738 - (GET_MODE_BITSIZE
9739 (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
9741 op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
9742 op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
9744 #endif
9746 /* If both operands are the same constant shift, see if we can ignore the
9747 shift. We can if the shift is a rotate or if the bits shifted out of
9748 this shift are known to be zero for both inputs and if the type of
9749 comparison is compatible with the shift. */
9750 if (GET_CODE (op0) == GET_CODE (op1)
9751 && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
9752 && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
9753 || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
9754 && (code != GT && code != LT && code != GE && code != LE))
9755 || (GET_CODE (op0) == ASHIFTRT
9756 && (code != GTU && code != LTU
9757 && code != GEU && code != LEU)))
9758 && GET_CODE (XEXP (op0, 1)) == CONST_INT
9759 && INTVAL (XEXP (op0, 1)) >= 0
9760 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
9761 && XEXP (op0, 1) == XEXP (op1, 1))
9763 enum machine_mode mode = GET_MODE (op0);
9764 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
9765 int shift_count = INTVAL (XEXP (op0, 1));
9767 if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
9768 mask &= (mask >> shift_count) << shift_count;
9769 else if (GET_CODE (op0) == ASHIFT)
9770 mask = (mask & (mask << shift_count)) >> shift_count;
9772 if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
9773 && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
9774 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
9775 else
9776 break;
9779 /* If both operands are AND's of a paradoxical SUBREG by constant, the
9780 SUBREGs are of the same mode, and, in both cases, the AND would
9781 be redundant if the comparison was done in the narrower mode,
9782 do the comparison in the narrower mode (e.g., we are AND'ing with 1
9783 and the operand's possibly nonzero bits are 0xffffff01; in that case
9784 if we only care about QImode, we don't need the AND). This case
9785 occurs if the output mode of an scc insn is not SImode and
9786 STORE_FLAG_VALUE == 1 (e.g., the 386).
9788 Similarly, check for a case where the AND's are ZERO_EXTEND
9789 operations from some narrower mode even though a SUBREG is not
9790 present. */
9792 else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
9793 && GET_CODE (XEXP (op0, 1)) == CONST_INT
9794 && GET_CODE (XEXP (op1, 1)) == CONST_INT)
9796 rtx inner_op0 = XEXP (op0, 0);
9797 rtx inner_op1 = XEXP (op1, 0);
9798 HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
9799 HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
9800 int changed = 0;
9802 if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
9803 && (GET_MODE_SIZE (GET_MODE (inner_op0))
9804 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
9805 && (GET_MODE (SUBREG_REG (inner_op0))
9806 == GET_MODE (SUBREG_REG (inner_op1)))
9807 && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
9808 <= HOST_BITS_PER_WIDE_INT)
9809 && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
9810 GET_MODE (SUBREG_REG (inner_op0)))))
9811 && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
9812 GET_MODE (SUBREG_REG (inner_op1))))))
9814 op0 = SUBREG_REG (inner_op0);
9815 op1 = SUBREG_REG (inner_op1);
9817 /* The resulting comparison is always unsigned since we masked
9818 off the original sign bit. */
9819 code = unsigned_condition (code);
9821 changed = 1;
9824 else if (c0 == c1)
9825 for (tmode = GET_CLASS_NARROWEST_MODE
9826 (GET_MODE_CLASS (GET_MODE (op0)));
9827 tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
9828 if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
9830 op0 = gen_lowpart (tmode, inner_op0);
9831 op1 = gen_lowpart (tmode, inner_op1);
9832 code = unsigned_condition (code);
9833 changed = 1;
9834 break;
9837 if (! changed)
9838 break;
9841 /* If both operands are NOT, we can strip off the outer operation
9842 and adjust the comparison code for swapped operands; similarly for
9843 NEG, except that this must be an equality comparison. */
9844 else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
9845 || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
9846 && (code == EQ || code == NE)))
9847 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
9849 else
9850 break;
9853 /* If the first operand is a constant, swap the operands and adjust the
9854 comparison code appropriately, but don't do this if the second operand
9855 is already a constant integer. */
9856 if (swap_commutative_operands_p (op0, op1))
9858 tem = op0, op0 = op1, op1 = tem;
9859 code = swap_condition (code);
9862 /* We now enter a loop during which we will try to simplify the comparison.
9863 For the most part, we only are concerned with comparisons with zero,
9864 but some things may really be comparisons with zero but not start
9865 out looking that way. */
9867 while (GET_CODE (op1) == CONST_INT)
9869 enum machine_mode mode = GET_MODE (op0);
9870 unsigned int mode_width = GET_MODE_BITSIZE (mode);
9871 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
9872 int equality_comparison_p;
9873 int sign_bit_comparison_p;
9874 int unsigned_comparison_p;
9875 HOST_WIDE_INT const_op;
9877 /* We only want to handle integral modes. This catches VOIDmode,
9878 CCmode, and the floating-point modes. An exception is that we
9879 can handle VOIDmode if OP0 is a COMPARE or a comparison
9880 operation. */
9882 if (GET_MODE_CLASS (mode) != MODE_INT
9883 && ! (mode == VOIDmode
9884 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
9885 break;
9887 /* Get the constant we are comparing against and turn off all bits
9888 not on in our mode. */
9889 const_op = INTVAL (op1);
9890 if (mode != VOIDmode)
9891 const_op = trunc_int_for_mode (const_op, mode);
9892 op1 = GEN_INT (const_op);
9894 /* If we are comparing against a constant power of two and the value
9895 being compared can only have that single bit nonzero (e.g., it was
9896 `and'ed with that bit), we can replace this with a comparison
9897 with zero. */
9898 if (const_op
9899 && (code == EQ || code == NE || code == GE || code == GEU
9900 || code == LT || code == LTU)
9901 && mode_width <= HOST_BITS_PER_WIDE_INT
9902 && exact_log2 (const_op) >= 0
9903 && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
9905 code = (code == EQ || code == GE || code == GEU ? NE : EQ);
9906 op1 = const0_rtx, const_op = 0;
9909 /* Similarly, if we are comparing a value known to be either -1 or
9910 0 with -1, change it to the opposite comparison against zero. */
9912 if (const_op == -1
9913 && (code == EQ || code == NE || code == GT || code == LE
9914 || code == GEU || code == LTU)
9915 && num_sign_bit_copies (op0, mode) == mode_width)
9917 code = (code == EQ || code == LE || code == GEU ? NE : EQ);
9918 op1 = const0_rtx, const_op = 0;
9921 /* Do some canonicalizations based on the comparison code. We prefer
9922 comparisons against zero and then prefer equality comparisons.
9923 If we can reduce the size of a constant, we will do that too. */
9925 switch (code)
9927 case LT:
9928 /* < C is equivalent to <= (C - 1) */
9929 if (const_op > 0)
9931 const_op -= 1;
9932 op1 = GEN_INT (const_op);
9933 code = LE;
9934 /* ... fall through to LE case below. */
9936 else
9937 break;
9939 case LE:
9940 /* <= C is equivalent to < (C + 1); we do this for C < 0 */
9941 if (const_op < 0)
9943 const_op += 1;
9944 op1 = GEN_INT (const_op);
9945 code = LT;
9948 /* If we are doing a <= 0 comparison on a value known to have
9949 a zero sign bit, we can replace this with == 0. */
9950 else if (const_op == 0
9951 && mode_width <= HOST_BITS_PER_WIDE_INT
9952 && (nonzero_bits (op0, mode)
9953 & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
9954 code = EQ;
9955 break;
9957 case GE:
9958 /* >= C is equivalent to > (C - 1). */
9959 if (const_op > 0)
9961 const_op -= 1;
9962 op1 = GEN_INT (const_op);
9963 code = GT;
9964 /* ... fall through to GT below. */
9966 else
9967 break;
9969 case GT:
9970 /* > C is equivalent to >= (C + 1); we do this for C < 0. */
9971 if (const_op < 0)
9973 const_op += 1;
9974 op1 = GEN_INT (const_op);
9975 code = GE;
9978 /* If we are doing a > 0 comparison on a value known to have
9979 a zero sign bit, we can replace this with != 0. */
9980 else if (const_op == 0
9981 && mode_width <= HOST_BITS_PER_WIDE_INT
9982 && (nonzero_bits (op0, mode)
9983 & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
9984 code = NE;
9985 break;
9987 case LTU:
9988 /* < C is equivalent to <= (C - 1). */
9989 if (const_op > 0)
9991 const_op -= 1;
9992 op1 = GEN_INT (const_op);
9993 code = LEU;
9994 /* ... fall through ... */
9997 /* (unsigned) < 0x80000000 is equivalent to >= 0. */
9998 else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9999 && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10001 const_op = 0, op1 = const0_rtx;
10002 code = GE;
10003 break;
10005 else
10006 break;
10008 case LEU:
10009 /* unsigned <= 0 is equivalent to == 0 */
10010 if (const_op == 0)
10011 code = EQ;
10013 /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */
10014 else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10015 && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10017 const_op = 0, op1 = const0_rtx;
10018 code = GE;
10020 break;
10022 case GEU:
10023 /* >= C is equivalent to > (C - 1). */
10024 if (const_op > 1)
10026 const_op -= 1;
10027 op1 = GEN_INT (const_op);
10028 code = GTU;
10029 /* ... fall through ... */
10032 /* (unsigned) >= 0x80000000 is equivalent to < 0. */
10033 else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10034 && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
10036 const_op = 0, op1 = const0_rtx;
10037 code = LT;
10038 break;
10040 else
10041 break;
10043 case GTU:
10044 /* unsigned > 0 is equivalent to != 0 */
10045 if (const_op == 0)
10046 code = NE;
10048 /* (unsigned) > 0x7fffffff is equivalent to < 0. */
10049 else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
10050 && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
10052 const_op = 0, op1 = const0_rtx;
10053 code = LT;
10055 break;
10057 default:
10058 break;
10061 /* Compute some predicates to simplify code below. */
10063 equality_comparison_p = (code == EQ || code == NE);
10064 sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
10065 unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
10066 || code == GEU);
10068 /* If this is a sign bit comparison and we can do arithmetic in
10069 MODE, say that we will only be needing the sign bit of OP0. */
10070 if (sign_bit_comparison_p
10071 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10072 op0 = force_to_mode (op0, mode,
10073 ((HOST_WIDE_INT) 1
10074 << (GET_MODE_BITSIZE (mode) - 1)),
10075 NULL_RTX, 0);
10077 /* Now try cases based on the opcode of OP0. If none of the cases
10078 does a "continue", we exit this loop immediately after the
10079 switch. */
10081 switch (GET_CODE (op0))
10083 case ZERO_EXTRACT:
10084 /* If we are extracting a single bit from a variable position in
10085 a constant that has only a single bit set and are comparing it
10086 with zero, we can convert this into an equality comparison
10087 between the position and the location of the single bit. */
10088 /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
10089 have already reduced the shift count modulo the word size. */
10090 if (!SHIFT_COUNT_TRUNCATED
10091 && GET_CODE (XEXP (op0, 0)) == CONST_INT
10092 && XEXP (op0, 1) == const1_rtx
10093 && equality_comparison_p && const_op == 0
10094 && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
10096 if (BITS_BIG_ENDIAN)
10098 enum machine_mode new_mode
10099 = mode_for_extraction (EP_extzv, 1);
10100 if (new_mode == MAX_MACHINE_MODE)
10101 i = BITS_PER_WORD - 1 - i;
10102 else
10104 mode = new_mode;
10105 i = (GET_MODE_BITSIZE (mode) - 1 - i);
10109 op0 = XEXP (op0, 2);
10110 op1 = GEN_INT (i);
10111 const_op = i;
10113 /* Result is nonzero iff shift count is equal to I. */
10114 code = reverse_condition (code);
10115 continue;
10118 /* ... fall through ... */
10120 case SIGN_EXTRACT:
10121 tem = expand_compound_operation (op0);
10122 if (tem != op0)
10124 op0 = tem;
10125 continue;
10127 break;
10129 case NOT:
10130 /* If testing for equality, we can take the NOT of the constant. */
10131 if (equality_comparison_p
10132 && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
10134 op0 = XEXP (op0, 0);
10135 op1 = tem;
10136 continue;
10139 /* If just looking at the sign bit, reverse the sense of the
10140 comparison. */
10141 if (sign_bit_comparison_p)
10143 op0 = XEXP (op0, 0);
10144 code = (code == GE ? LT : GE);
10145 continue;
10147 break;
10149 case NEG:
10150 /* If testing for equality, we can take the NEG of the constant. */
10151 if (equality_comparison_p
10152 && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
10154 op0 = XEXP (op0, 0);
10155 op1 = tem;
10156 continue;
10159 /* The remaining cases only apply to comparisons with zero. */
10160 if (const_op != 0)
10161 break;
10163 /* When X is ABS or is known positive,
10164 (neg X) is < 0 if and only if X != 0. */
10166 if (sign_bit_comparison_p
10167 && (GET_CODE (XEXP (op0, 0)) == ABS
10168 || (mode_width <= HOST_BITS_PER_WIDE_INT
10169 && (nonzero_bits (XEXP (op0, 0), mode)
10170 & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
10172 op0 = XEXP (op0, 0);
10173 code = (code == LT ? NE : EQ);
10174 continue;
10177 /* If we have NEG of something whose two high-order bits are the
10178 same, we know that "(-a) < 0" is equivalent to "a > 0". */
10179 if (num_sign_bit_copies (op0, mode) >= 2)
10181 op0 = XEXP (op0, 0);
10182 code = swap_condition (code);
10183 continue;
10185 break;
10187 case ROTATE:
10188 /* If we are testing equality and our count is a constant, we
10189 can perform the inverse operation on our RHS. */
10190 if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10191 && (tem = simplify_binary_operation (ROTATERT, mode,
10192 op1, XEXP (op0, 1))) != 0)
10194 op0 = XEXP (op0, 0);
10195 op1 = tem;
10196 continue;
10199 /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10200 a particular bit. Convert it to an AND of a constant of that
10201 bit. This will be converted into a ZERO_EXTRACT. */
10202 if (const_op == 0 && sign_bit_comparison_p
10203 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10204 && mode_width <= HOST_BITS_PER_WIDE_INT)
10206 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10207 ((HOST_WIDE_INT) 1
10208 << (mode_width - 1
10209 - INTVAL (XEXP (op0, 1)))));
10210 code = (code == LT ? NE : EQ);
10211 continue;
10214 /* Fall through. */
10216 case ABS:
10217 /* ABS is ignorable inside an equality comparison with zero. */
10218 if (const_op == 0 && equality_comparison_p)
10220 op0 = XEXP (op0, 0);
10221 continue;
10223 break;
10225 case SIGN_EXTEND:
10226 /* Can simplify (compare (zero/sign_extend FOO) CONST) to
10227 (compare FOO CONST) if CONST fits in FOO's mode and we
10228 are either testing inequality or have an unsigned
10229 comparison with ZERO_EXTEND or a signed comparison with
10230 SIGN_EXTEND. But don't do it if we don't have a compare
10231 insn of the given mode, since we'd have to revert it
10232 later on, and then we wouldn't know whether to sign- or
10233 zero-extend. */
10234 mode = GET_MODE (XEXP (op0, 0));
10235 if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10236 && ! unsigned_comparison_p
10237 && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10238 && ((unsigned HOST_WIDE_INT) const_op
10239 < (((unsigned HOST_WIDE_INT) 1
10240 << (GET_MODE_BITSIZE (mode) - 1))))
10241 && cmp_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
10243 op0 = XEXP (op0, 0);
10244 continue;
10246 break;
10248 case SUBREG:
10249 /* Check for the case where we are comparing A - C1 with C2, that is
10251 (subreg:MODE (plus (A) (-C1))) op (C2)
10253 with C1 a constant, and try to lift the SUBREG, i.e. to do the
10254 comparison in the wider mode. One of the following two conditions
10255 must be true in order for this to be valid:
10257 1. The mode extension results in the same bit pattern being added
10258 on both sides and the comparison is equality or unsigned. As
10259 C2 has been truncated to fit in MODE, the pattern can only be
10260 all 0s or all 1s.
10262 2. The mode extension results in the sign bit being copied on
10263 each side.
10265 The difficulty here is that we have predicates for A but not for
10266 (A - C1) so we need to check that C1 is within proper bounds so
10267 as to perturbate A as little as possible. */
10269 if (mode_width <= HOST_BITS_PER_WIDE_INT
10270 && subreg_lowpart_p (op0)
10271 && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) > mode_width
10272 && GET_CODE (SUBREG_REG (op0)) == PLUS
10273 && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT)
10275 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
10276 rtx a = XEXP (SUBREG_REG (op0), 0);
10277 HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
10279 if ((c1 > 0
10280 && (unsigned HOST_WIDE_INT) c1
10281 < (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)
10282 && (equality_comparison_p || unsigned_comparison_p)
10283 /* (A - C1) zero-extends if it is positive and sign-extends
10284 if it is negative, C2 both zero- and sign-extends. */
10285 && ((0 == (nonzero_bits (a, inner_mode)
10286 & ~GET_MODE_MASK (mode))
10287 && const_op >= 0)
10288 /* (A - C1) sign-extends if it is positive and 1-extends
10289 if it is negative, C2 both sign- and 1-extends. */
10290 || (num_sign_bit_copies (a, inner_mode)
10291 > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10292 - mode_width)
10293 && const_op < 0)))
10294 || ((unsigned HOST_WIDE_INT) c1
10295 < (unsigned HOST_WIDE_INT) 1 << (mode_width - 2)
10296 /* (A - C1) always sign-extends, like C2. */
10297 && num_sign_bit_copies (a, inner_mode)
10298 > (unsigned int) (GET_MODE_BITSIZE (inner_mode)
10299 - (mode_width - 1))))
10301 op0 = SUBREG_REG (op0);
10302 continue;
10306 /* If the inner mode is narrower and we are extracting the low part,
10307 we can treat the SUBREG as if it were a ZERO_EXTEND. */
10308 if (subreg_lowpart_p (op0)
10309 && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10310 /* Fall through */ ;
10311 else
10312 break;
10314 /* ... fall through ... */
10316 case ZERO_EXTEND:
10317 mode = GET_MODE (XEXP (op0, 0));
10318 if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10319 && (unsigned_comparison_p || equality_comparison_p)
10320 && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10321 && ((unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode))
10322 && cmp_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
10324 op0 = XEXP (op0, 0);
10325 continue;
10327 break;
10329 case PLUS:
10330 /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do
10331 this for equality comparisons due to pathological cases involving
10332 overflows. */
10333 if (equality_comparison_p
10334 && 0 != (tem = simplify_binary_operation (MINUS, mode,
10335 op1, XEXP (op0, 1))))
10337 op0 = XEXP (op0, 0);
10338 op1 = tem;
10339 continue;
10342 /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0. */
10343 if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
10344 && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
10346 op0 = XEXP (XEXP (op0, 0), 0);
10347 code = (code == LT ? EQ : NE);
10348 continue;
10350 break;
10352 case MINUS:
10353 /* We used to optimize signed comparisons against zero, but that
10354 was incorrect. Unsigned comparisons against zero (GTU, LEU)
10355 arrive here as equality comparisons, or (GEU, LTU) are
10356 optimized away. No need to special-case them. */
10358 /* (eq (minus A B) C) -> (eq A (plus B C)) or
10359 (eq B (minus A C)), whichever simplifies. We can only do
10360 this for equality comparisons due to pathological cases involving
10361 overflows. */
10362 if (equality_comparison_p
10363 && 0 != (tem = simplify_binary_operation (PLUS, mode,
10364 XEXP (op0, 1), op1)))
10366 op0 = XEXP (op0, 0);
10367 op1 = tem;
10368 continue;
10371 if (equality_comparison_p
10372 && 0 != (tem = simplify_binary_operation (MINUS, mode,
10373 XEXP (op0, 0), op1)))
10375 op0 = XEXP (op0, 1);
10376 op1 = tem;
10377 continue;
10380 /* The sign bit of (minus (ashiftrt X C) X), where C is the number
10381 of bits in X minus 1, is one iff X > 0. */
10382 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
10383 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10384 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (XEXP (op0, 0), 1))
10385 == mode_width - 1
10386 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10388 op0 = XEXP (op0, 1);
10389 code = (code == GE ? LE : GT);
10390 continue;
10392 break;
10394 case XOR:
10395 /* (eq (xor A B) C) -> (eq A (xor B C)). This is a simplification
10396 if C is zero or B is a constant. */
10397 if (equality_comparison_p
10398 && 0 != (tem = simplify_binary_operation (XOR, mode,
10399 XEXP (op0, 1), op1)))
10401 op0 = XEXP (op0, 0);
10402 op1 = tem;
10403 continue;
10405 break;
10407 case EQ: case NE:
10408 case UNEQ: case LTGT:
10409 case LT: case LTU: case UNLT: case LE: case LEU: case UNLE:
10410 case GT: case GTU: case UNGT: case GE: case GEU: case UNGE:
10411 case UNORDERED: case ORDERED:
10412 /* We can't do anything if OP0 is a condition code value, rather
10413 than an actual data value. */
10414 if (const_op != 0
10415 || CC0_P (XEXP (op0, 0))
10416 || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
10417 break;
10419 /* Get the two operands being compared. */
10420 if (GET_CODE (XEXP (op0, 0)) == COMPARE)
10421 tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
10422 else
10423 tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
10425 /* Check for the cases where we simply want the result of the
10426 earlier test or the opposite of that result. */
10427 if (code == NE || code == EQ
10428 || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10429 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10430 && (STORE_FLAG_VALUE
10431 & (((HOST_WIDE_INT) 1
10432 << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
10433 && (code == LT || code == GE)))
10435 enum rtx_code new_code;
10436 if (code == LT || code == NE)
10437 new_code = GET_CODE (op0);
10438 else
10439 new_code = reversed_comparison_code (op0, NULL);
10441 if (new_code != UNKNOWN)
10443 code = new_code;
10444 op0 = tem;
10445 op1 = tem1;
10446 continue;
10449 break;
10451 case IOR:
10452 /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
10453 iff X <= 0. */
10454 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
10455 && XEXP (XEXP (op0, 0), 1) == constm1_rtx
10456 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10458 op0 = XEXP (op0, 1);
10459 code = (code == GE ? GT : LE);
10460 continue;
10462 break;
10464 case AND:
10465 /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1). This
10466 will be converted to a ZERO_EXTRACT later. */
10467 if (const_op == 0 && equality_comparison_p
10468 && GET_CODE (XEXP (op0, 0)) == ASHIFT
10469 && XEXP (XEXP (op0, 0), 0) == const1_rtx)
10471 op0 = simplify_and_const_int
10472 (op0, mode, gen_rtx_LSHIFTRT (mode,
10473 XEXP (op0, 1),
10474 XEXP (XEXP (op0, 0), 1)),
10475 (HOST_WIDE_INT) 1);
10476 continue;
10479 /* If we are comparing (and (lshiftrt X C1) C2) for equality with
10480 zero and X is a comparison and C1 and C2 describe only bits set
10481 in STORE_FLAG_VALUE, we can compare with X. */
10482 if (const_op == 0 && equality_comparison_p
10483 && mode_width <= HOST_BITS_PER_WIDE_INT
10484 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10485 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10486 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10487 && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
10488 && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
10490 mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10491 << INTVAL (XEXP (XEXP (op0, 0), 1)));
10492 if ((~STORE_FLAG_VALUE & mask) == 0
10493 && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
10494 || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
10495 && COMPARISON_P (tem))))
10497 op0 = XEXP (XEXP (op0, 0), 0);
10498 continue;
10502 /* If we are doing an equality comparison of an AND of a bit equal
10503 to the sign bit, replace this with a LT or GE comparison of
10504 the underlying value. */
10505 if (equality_comparison_p
10506 && const_op == 0
10507 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10508 && mode_width <= HOST_BITS_PER_WIDE_INT
10509 && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10510 == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10512 op0 = XEXP (op0, 0);
10513 code = (code == EQ ? GE : LT);
10514 continue;
10517 /* If this AND operation is really a ZERO_EXTEND from a narrower
10518 mode, the constant fits within that mode, and this is either an
10519 equality or unsigned comparison, try to do this comparison in
10520 the narrower mode. */
10521 if ((equality_comparison_p || unsigned_comparison_p)
10522 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10523 && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
10524 & GET_MODE_MASK (mode))
10525 + 1)) >= 0
10526 && const_op >> i == 0
10527 && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode)
10529 op0 = gen_lowpart (tmode, XEXP (op0, 0));
10530 continue;
10533 /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1
10534 fits in both M1 and M2 and the SUBREG is either paradoxical
10535 or represents the low part, permute the SUBREG and the AND
10536 and try again. */
10537 if (GET_CODE (XEXP (op0, 0)) == SUBREG)
10539 unsigned HOST_WIDE_INT c1;
10540 tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0)));
10541 /* Require an integral mode, to avoid creating something like
10542 (AND:SF ...). */
10543 if (SCALAR_INT_MODE_P (tmode)
10544 /* It is unsafe to commute the AND into the SUBREG if the
10545 SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
10546 not defined. As originally written the upper bits
10547 have a defined value due to the AND operation.
10548 However, if we commute the AND inside the SUBREG then
10549 they no longer have defined values and the meaning of
10550 the code has been changed. */
10551 && (0
10552 #ifdef WORD_REGISTER_OPERATIONS
10553 || (mode_width > GET_MODE_BITSIZE (tmode)
10554 && mode_width <= BITS_PER_WORD)
10555 #endif
10556 || (mode_width <= GET_MODE_BITSIZE (tmode)
10557 && subreg_lowpart_p (XEXP (op0, 0))))
10558 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10559 && mode_width <= HOST_BITS_PER_WIDE_INT
10560 && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT
10561 && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0
10562 && (c1 & ~GET_MODE_MASK (tmode)) == 0
10563 && c1 != mask
10564 && c1 != GET_MODE_MASK (tmode))
10566 op0 = simplify_gen_binary (AND, tmode,
10567 SUBREG_REG (XEXP (op0, 0)),
10568 gen_int_mode (c1, tmode));
10569 op0 = gen_lowpart (mode, op0);
10570 continue;
10574 /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0). */
10575 if (const_op == 0 && equality_comparison_p
10576 && XEXP (op0, 1) == const1_rtx
10577 && GET_CODE (XEXP (op0, 0)) == NOT)
10579 op0 = simplify_and_const_int
10580 (NULL_RTX, mode, XEXP (XEXP (op0, 0), 0), (HOST_WIDE_INT) 1);
10581 code = (code == NE ? EQ : NE);
10582 continue;
10585 /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
10586 (eq (and (lshiftrt X) 1) 0).
10587 Also handle the case where (not X) is expressed using xor. */
10588 if (const_op == 0 && equality_comparison_p
10589 && XEXP (op0, 1) == const1_rtx
10590 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
10592 rtx shift_op = XEXP (XEXP (op0, 0), 0);
10593 rtx shift_count = XEXP (XEXP (op0, 0), 1);
10595 if (GET_CODE (shift_op) == NOT
10596 || (GET_CODE (shift_op) == XOR
10597 && GET_CODE (XEXP (shift_op, 1)) == CONST_INT
10598 && GET_CODE (shift_count) == CONST_INT
10599 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
10600 && (INTVAL (XEXP (shift_op, 1))
10601 == (HOST_WIDE_INT) 1 << INTVAL (shift_count))))
10603 op0 = simplify_and_const_int
10604 (NULL_RTX, mode,
10605 gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count),
10606 (HOST_WIDE_INT) 1);
10607 code = (code == NE ? EQ : NE);
10608 continue;
10611 break;
10613 case ASHIFT:
10614 /* If we have (compare (ashift FOO N) (const_int C)) and
10615 the high order N bits of FOO (N+1 if an inequality comparison)
10616 are known to be zero, we can do this by comparing FOO with C
10617 shifted right N bits so long as the low-order N bits of C are
10618 zero. */
10619 if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10620 && INTVAL (XEXP (op0, 1)) >= 0
10621 && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
10622 < HOST_BITS_PER_WIDE_INT)
10623 && ((const_op
10624 & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
10625 && mode_width <= HOST_BITS_PER_WIDE_INT
10626 && (nonzero_bits (XEXP (op0, 0), mode)
10627 & ~(mask >> (INTVAL (XEXP (op0, 1))
10628 + ! equality_comparison_p))) == 0)
10630 /* We must perform a logical shift, not an arithmetic one,
10631 as we want the top N bits of C to be zero. */
10632 unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
10634 temp >>= INTVAL (XEXP (op0, 1));
10635 op1 = gen_int_mode (temp, mode);
10636 op0 = XEXP (op0, 0);
10637 continue;
10640 /* If we are doing a sign bit comparison, it means we are testing
10641 a particular bit. Convert it to the appropriate AND. */
10642 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10643 && mode_width <= HOST_BITS_PER_WIDE_INT)
10645 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10646 ((HOST_WIDE_INT) 1
10647 << (mode_width - 1
10648 - INTVAL (XEXP (op0, 1)))));
10649 code = (code == LT ? NE : EQ);
10650 continue;
10653 /* If this an equality comparison with zero and we are shifting
10654 the low bit to the sign bit, we can convert this to an AND of the
10655 low-order bit. */
10656 if (const_op == 0 && equality_comparison_p
10657 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10658 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
10659 == mode_width - 1)
10661 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10662 (HOST_WIDE_INT) 1);
10663 continue;
10665 break;
10667 case ASHIFTRT:
10668 /* If this is an equality comparison with zero, we can do this
10669 as a logical shift, which might be much simpler. */
10670 if (equality_comparison_p && const_op == 0
10671 && GET_CODE (XEXP (op0, 1)) == CONST_INT)
10673 op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
10674 XEXP (op0, 0),
10675 INTVAL (XEXP (op0, 1)));
10676 continue;
10679 /* If OP0 is a sign extension and CODE is not an unsigned comparison,
10680 do the comparison in a narrower mode. */
10681 if (! unsigned_comparison_p
10682 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10683 && GET_CODE (XEXP (op0, 0)) == ASHIFT
10684 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10685 && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10686 MODE_INT, 1)) != BLKmode
10687 && (((unsigned HOST_WIDE_INT) const_op
10688 + (GET_MODE_MASK (tmode) >> 1) + 1)
10689 <= GET_MODE_MASK (tmode)))
10691 op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
10692 continue;
10695 /* Likewise if OP0 is a PLUS of a sign extension with a
10696 constant, which is usually represented with the PLUS
10697 between the shifts. */
10698 if (! unsigned_comparison_p
10699 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10700 && GET_CODE (XEXP (op0, 0)) == PLUS
10701 && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10702 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
10703 && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
10704 && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10705 MODE_INT, 1)) != BLKmode
10706 && (((unsigned HOST_WIDE_INT) const_op
10707 + (GET_MODE_MASK (tmode) >> 1) + 1)
10708 <= GET_MODE_MASK (tmode)))
10710 rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
10711 rtx add_const = XEXP (XEXP (op0, 0), 1);
10712 rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
10713 add_const, XEXP (op0, 1));
10715 op0 = simplify_gen_binary (PLUS, tmode,
10716 gen_lowpart (tmode, inner),
10717 new_const);
10718 continue;
10721 /* ... fall through ... */
10722 case LSHIFTRT:
10723 /* If we have (compare (xshiftrt FOO N) (const_int C)) and
10724 the low order N bits of FOO are known to be zero, we can do this
10725 by comparing FOO with C shifted left N bits so long as no
10726 overflow occurs. */
10727 if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10728 && INTVAL (XEXP (op0, 1)) >= 0
10729 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10730 && mode_width <= HOST_BITS_PER_WIDE_INT
10731 && (nonzero_bits (XEXP (op0, 0), mode)
10732 & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
10733 && (((unsigned HOST_WIDE_INT) const_op
10734 + (GET_CODE (op0) != LSHIFTRT
10735 ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
10736 + 1)
10737 : 0))
10738 <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
10740 /* If the shift was logical, then we must make the condition
10741 unsigned. */
10742 if (GET_CODE (op0) == LSHIFTRT)
10743 code = unsigned_condition (code);
10745 const_op <<= INTVAL (XEXP (op0, 1));
10746 op1 = GEN_INT (const_op);
10747 op0 = XEXP (op0, 0);
10748 continue;
10751 /* If we are using this shift to extract just the sign bit, we
10752 can replace this with an LT or GE comparison. */
10753 if (const_op == 0
10754 && (equality_comparison_p || sign_bit_comparison_p)
10755 && GET_CODE (XEXP (op0, 1)) == CONST_INT
10756 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
10757 == mode_width - 1)
10759 op0 = XEXP (op0, 0);
10760 code = (code == NE || code == GT ? LT : GE);
10761 continue;
10763 break;
10765 default:
10766 break;
10769 break;
10772 /* Now make any compound operations involved in this comparison. Then,
10773 check for an outmost SUBREG on OP0 that is not doing anything or is
10774 paradoxical. The latter transformation must only be performed when
10775 it is known that the "extra" bits will be the same in op0 and op1 or
10776 that they don't matter. There are three cases to consider:
10778 1. SUBREG_REG (op0) is a register. In this case the bits are don't
10779 care bits and we can assume they have any convenient value. So
10780 making the transformation is safe.
10782 2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
10783 In this case the upper bits of op0 are undefined. We should not make
10784 the simplification in that case as we do not know the contents of
10785 those bits.
10787 3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
10788 UNKNOWN. In that case we know those bits are zeros or ones. We must
10789 also be sure that they are the same as the upper bits of op1.
10791 We can never remove a SUBREG for a non-equality comparison because
10792 the sign bit is in a different place in the underlying object. */
10794 op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
10795 op1 = make_compound_operation (op1, SET);
10797 if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
10798 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10799 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
10800 && (code == NE || code == EQ))
10802 if (GET_MODE_SIZE (GET_MODE (op0))
10803 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))
10805 /* For paradoxical subregs, allow case 1 as above. Case 3 isn't
10806 implemented. */
10807 if (REG_P (SUBREG_REG (op0)))
10809 op0 = SUBREG_REG (op0);
10810 op1 = gen_lowpart (GET_MODE (op0), op1);
10813 else if ((GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
10814 <= HOST_BITS_PER_WIDE_INT)
10815 && (nonzero_bits (SUBREG_REG (op0),
10816 GET_MODE (SUBREG_REG (op0)))
10817 & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
10819 tem = gen_lowpart (GET_MODE (SUBREG_REG (op0)), op1);
10821 if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
10822 & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
10823 op0 = SUBREG_REG (op0), op1 = tem;
10827 /* We now do the opposite procedure: Some machines don't have compare
10828 insns in all modes. If OP0's mode is an integer mode smaller than a
10829 word and we can't do a compare in that mode, see if there is a larger
10830 mode for which we can do the compare. There are a number of cases in
10831 which we can use the wider mode. */
10833 mode = GET_MODE (op0);
10834 if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10835 && GET_MODE_SIZE (mode) < UNITS_PER_WORD
10836 && ! have_insn_for (COMPARE, mode))
10837 for (tmode = GET_MODE_WIDER_MODE (mode);
10838 (tmode != VOIDmode
10839 && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
10840 tmode = GET_MODE_WIDER_MODE (tmode))
10841 if (have_insn_for (COMPARE, tmode))
10843 int zero_extended;
10845 /* If the only nonzero bits in OP0 and OP1 are those in the
10846 narrower mode and this is an equality or unsigned comparison,
10847 we can use the wider mode. Similarly for sign-extended
10848 values, in which case it is true for all comparisons. */
10849 zero_extended = ((code == EQ || code == NE
10850 || code == GEU || code == GTU
10851 || code == LEU || code == LTU)
10852 && (nonzero_bits (op0, tmode)
10853 & ~GET_MODE_MASK (mode)) == 0
10854 && ((GET_CODE (op1) == CONST_INT
10855 || (nonzero_bits (op1, tmode)
10856 & ~GET_MODE_MASK (mode)) == 0)));
10858 if (zero_extended
10859 || ((num_sign_bit_copies (op0, tmode)
10860 > (unsigned int) (GET_MODE_BITSIZE (tmode)
10861 - GET_MODE_BITSIZE (mode)))
10862 && (num_sign_bit_copies (op1, tmode)
10863 > (unsigned int) (GET_MODE_BITSIZE (tmode)
10864 - GET_MODE_BITSIZE (mode)))))
10866 /* If OP0 is an AND and we don't have an AND in MODE either,
10867 make a new AND in the proper mode. */
10868 if (GET_CODE (op0) == AND
10869 && !have_insn_for (AND, mode))
10870 op0 = simplify_gen_binary (AND, tmode,
10871 gen_lowpart (tmode,
10872 XEXP (op0, 0)),
10873 gen_lowpart (tmode,
10874 XEXP (op0, 1)));
10876 op0 = gen_lowpart (tmode, op0);
10877 if (zero_extended && GET_CODE (op1) == CONST_INT)
10878 op1 = GEN_INT (INTVAL (op1) & GET_MODE_MASK (mode));
10879 op1 = gen_lowpart (tmode, op1);
10880 break;
10883 /* If this is a test for negative, we can make an explicit
10884 test of the sign bit. */
10886 if (op1 == const0_rtx && (code == LT || code == GE)
10887 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10889 op0 = simplify_gen_binary (AND, tmode,
10890 gen_lowpart (tmode, op0),
10891 GEN_INT ((HOST_WIDE_INT) 1
10892 << (GET_MODE_BITSIZE (mode)
10893 - 1)));
10894 code = (code == LT) ? NE : EQ;
10895 break;
10899 #ifdef CANONICALIZE_COMPARISON
10900 /* If this machine only supports a subset of valid comparisons, see if we
10901 can convert an unsupported one into a supported one. */
10902 CANONICALIZE_COMPARISON (code, op0, op1);
10903 #endif
10905 *pop0 = op0;
10906 *pop1 = op1;
10908 return code;
10911 /* Utility function for record_value_for_reg. Count number of
10912 rtxs in X. */
10913 static int
10914 count_rtxs (rtx x)
10916 enum rtx_code code = GET_CODE (x);
10917 const char *fmt;
10918 int i, ret = 1;
10920 if (GET_RTX_CLASS (code) == '2'
10921 || GET_RTX_CLASS (code) == 'c')
10923 rtx x0 = XEXP (x, 0);
10924 rtx x1 = XEXP (x, 1);
10926 if (x0 == x1)
10927 return 1 + 2 * count_rtxs (x0);
10929 if ((GET_RTX_CLASS (GET_CODE (x1)) == '2'
10930 || GET_RTX_CLASS (GET_CODE (x1)) == 'c')
10931 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
10932 return 2 + 2 * count_rtxs (x0)
10933 + count_rtxs (x == XEXP (x1, 0)
10934 ? XEXP (x1, 1) : XEXP (x1, 0));
10936 if ((GET_RTX_CLASS (GET_CODE (x0)) == '2'
10937 || GET_RTX_CLASS (GET_CODE (x0)) == 'c')
10938 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
10939 return 2 + 2 * count_rtxs (x1)
10940 + count_rtxs (x == XEXP (x0, 0)
10941 ? XEXP (x0, 1) : XEXP (x0, 0));
10944 fmt = GET_RTX_FORMAT (code);
10945 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
10946 if (fmt[i] == 'e')
10947 ret += count_rtxs (XEXP (x, i));
10949 return ret;
10952 /* Utility function for following routine. Called when X is part of a value
10953 being stored into last_set_value. Sets last_set_table_tick
10954 for each register mentioned. Similar to mention_regs in cse.c */
10956 static void
10957 update_table_tick (rtx x)
10959 enum rtx_code code = GET_CODE (x);
10960 const char *fmt = GET_RTX_FORMAT (code);
10961 int i;
10963 if (code == REG)
10965 unsigned int regno = REGNO (x);
10966 unsigned int endregno
10967 = regno + (regno < FIRST_PSEUDO_REGISTER
10968 ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
10969 unsigned int r;
10971 for (r = regno; r < endregno; r++)
10972 reg_stat[r].last_set_table_tick = label_tick;
10974 return;
10977 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
10978 /* Note that we can't have an "E" in values stored; see
10979 get_last_value_validate. */
10980 if (fmt[i] == 'e')
10982 /* Check for identical subexpressions. If x contains
10983 identical subexpression we only have to traverse one of
10984 them. */
10985 if (i == 0 && ARITHMETIC_P (x))
10987 /* Note that at this point x1 has already been
10988 processed. */
10989 rtx x0 = XEXP (x, 0);
10990 rtx x1 = XEXP (x, 1);
10992 /* If x0 and x1 are identical then there is no need to
10993 process x0. */
10994 if (x0 == x1)
10995 break;
10997 /* If x0 is identical to a subexpression of x1 then while
10998 processing x1, x0 has already been processed. Thus we
10999 are done with x. */
11000 if (ARITHMETIC_P (x1)
11001 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11002 break;
11004 /* If x1 is identical to a subexpression of x0 then we
11005 still have to process the rest of x0. */
11006 if (ARITHMETIC_P (x0)
11007 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11009 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
11010 break;
11014 update_table_tick (XEXP (x, i));
11018 /* Record that REG is set to VALUE in insn INSN. If VALUE is zero, we
11019 are saying that the register is clobbered and we no longer know its
11020 value. If INSN is zero, don't update reg_stat[].last_set; this is
11021 only permitted with VALUE also zero and is used to invalidate the
11022 register. */
11024 static void
11025 record_value_for_reg (rtx reg, rtx insn, rtx value)
11027 unsigned int regno = REGNO (reg);
11028 unsigned int endregno
11029 = regno + (regno < FIRST_PSEUDO_REGISTER
11030 ? hard_regno_nregs[regno][GET_MODE (reg)] : 1);
11031 unsigned int i;
11033 /* If VALUE contains REG and we have a previous value for REG, substitute
11034 the previous value. */
11035 if (value && insn && reg_overlap_mentioned_p (reg, value))
11037 rtx tem;
11039 /* Set things up so get_last_value is allowed to see anything set up to
11040 our insn. */
11041 subst_low_cuid = INSN_CUID (insn);
11042 tem = get_last_value (reg);
11044 /* If TEM is simply a binary operation with two CLOBBERs as operands,
11045 it isn't going to be useful and will take a lot of time to process,
11046 so just use the CLOBBER. */
11048 if (tem)
11050 if (ARITHMETIC_P (tem)
11051 && GET_CODE (XEXP (tem, 0)) == CLOBBER
11052 && GET_CODE (XEXP (tem, 1)) == CLOBBER)
11053 tem = XEXP (tem, 0);
11054 else if (count_occurrences (value, reg, 1) >= 2)
11056 /* If there are two or more occurrences of REG in VALUE,
11057 prevent the value from growing too much. */
11058 if (count_rtxs (tem) > MAX_LAST_VALUE_RTL)
11059 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
11062 value = replace_rtx (copy_rtx (value), reg, tem);
11066 /* For each register modified, show we don't know its value, that
11067 we don't know about its bitwise content, that its value has been
11068 updated, and that we don't know the location of the death of the
11069 register. */
11070 for (i = regno; i < endregno; i++)
11072 if (insn)
11073 reg_stat[i].last_set = insn;
11075 reg_stat[i].last_set_value = 0;
11076 reg_stat[i].last_set_mode = 0;
11077 reg_stat[i].last_set_nonzero_bits = 0;
11078 reg_stat[i].last_set_sign_bit_copies = 0;
11079 reg_stat[i].last_death = 0;
11082 /* Mark registers that are being referenced in this value. */
11083 if (value)
11084 update_table_tick (value);
11086 /* Now update the status of each register being set.
11087 If someone is using this register in this block, set this register
11088 to invalid since we will get confused between the two lives in this
11089 basic block. This makes using this register always invalid. In cse, we
11090 scan the table to invalidate all entries using this register, but this
11091 is too much work for us. */
11093 for (i = regno; i < endregno; i++)
11095 reg_stat[i].last_set_label = label_tick;
11096 if (value && reg_stat[i].last_set_table_tick == label_tick)
11097 reg_stat[i].last_set_invalid = 1;
11098 else
11099 reg_stat[i].last_set_invalid = 0;
11102 /* The value being assigned might refer to X (like in "x++;"). In that
11103 case, we must replace it with (clobber (const_int 0)) to prevent
11104 infinite loops. */
11105 if (value && ! get_last_value_validate (&value, insn,
11106 reg_stat[regno].last_set_label, 0))
11108 value = copy_rtx (value);
11109 if (! get_last_value_validate (&value, insn,
11110 reg_stat[regno].last_set_label, 1))
11111 value = 0;
11114 /* For the main register being modified, update the value, the mode, the
11115 nonzero bits, and the number of sign bit copies. */
11117 reg_stat[regno].last_set_value = value;
11119 if (value)
11121 enum machine_mode mode = GET_MODE (reg);
11122 subst_low_cuid = INSN_CUID (insn);
11123 reg_stat[regno].last_set_mode = mode;
11124 if (GET_MODE_CLASS (mode) == MODE_INT
11125 && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
11126 mode = nonzero_bits_mode;
11127 reg_stat[regno].last_set_nonzero_bits = nonzero_bits (value, mode);
11128 reg_stat[regno].last_set_sign_bit_copies
11129 = num_sign_bit_copies (value, GET_MODE (reg));
11133 /* Called via note_stores from record_dead_and_set_regs to handle one
11134 SET or CLOBBER in an insn. DATA is the instruction in which the
11135 set is occurring. */
11137 static void
11138 record_dead_and_set_regs_1 (rtx dest, rtx setter, void *data)
11140 rtx record_dead_insn = (rtx) data;
11142 if (GET_CODE (dest) == SUBREG)
11143 dest = SUBREG_REG (dest);
11145 if (REG_P (dest))
11147 /* If we are setting the whole register, we know its value. Otherwise
11148 show that we don't know the value. We can handle SUBREG in
11149 some cases. */
11150 if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
11151 record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
11152 else if (GET_CODE (setter) == SET
11153 && GET_CODE (SET_DEST (setter)) == SUBREG
11154 && SUBREG_REG (SET_DEST (setter)) == dest
11155 && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
11156 && subreg_lowpart_p (SET_DEST (setter)))
11157 record_value_for_reg (dest, record_dead_insn,
11158 gen_lowpart (GET_MODE (dest),
11159 SET_SRC (setter)));
11160 else
11161 record_value_for_reg (dest, record_dead_insn, NULL_RTX);
11163 else if (MEM_P (dest)
11164 /* Ignore pushes, they clobber nothing. */
11165 && ! push_operand (dest, GET_MODE (dest)))
11166 mem_last_set = INSN_CUID (record_dead_insn);
11169 /* Update the records of when each REG was most recently set or killed
11170 for the things done by INSN. This is the last thing done in processing
11171 INSN in the combiner loop.
11173 We update reg_stat[], in particular fields last_set, last_set_value,
11174 last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
11175 last_death, and also the similar information mem_last_set (which insn
11176 most recently modified memory) and last_call_cuid (which insn was the
11177 most recent subroutine call). */
11179 static void
11180 record_dead_and_set_regs (rtx insn)
11182 rtx link;
11183 unsigned int i;
11185 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
11187 if (REG_NOTE_KIND (link) == REG_DEAD
11188 && REG_P (XEXP (link, 0)))
11190 unsigned int regno = REGNO (XEXP (link, 0));
11191 unsigned int endregno
11192 = regno + (regno < FIRST_PSEUDO_REGISTER
11193 ? hard_regno_nregs[regno][GET_MODE (XEXP (link, 0))]
11194 : 1);
11196 for (i = regno; i < endregno; i++)
11197 reg_stat[i].last_death = insn;
11199 else if (REG_NOTE_KIND (link) == REG_INC)
11200 record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
11203 if (CALL_P (insn))
11205 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
11206 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
11208 reg_stat[i].last_set_value = 0;
11209 reg_stat[i].last_set_mode = 0;
11210 reg_stat[i].last_set_nonzero_bits = 0;
11211 reg_stat[i].last_set_sign_bit_copies = 0;
11212 reg_stat[i].last_death = 0;
11215 last_call_cuid = mem_last_set = INSN_CUID (insn);
11217 /* Don't bother recording what this insn does. It might set the
11218 return value register, but we can't combine into a call
11219 pattern anyway, so there's no point trying (and it may cause
11220 a crash, if e.g. we wind up asking for last_set_value of a
11221 SUBREG of the return value register). */
11222 return;
11225 note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
11228 /* If a SUBREG has the promoted bit set, it is in fact a property of the
11229 register present in the SUBREG, so for each such SUBREG go back and
11230 adjust nonzero and sign bit information of the registers that are
11231 known to have some zero/sign bits set.
11233 This is needed because when combine blows the SUBREGs away, the
11234 information on zero/sign bits is lost and further combines can be
11235 missed because of that. */
11237 static void
11238 record_promoted_value (rtx insn, rtx subreg)
11240 rtx links, set;
11241 unsigned int regno = REGNO (SUBREG_REG (subreg));
11242 enum machine_mode mode = GET_MODE (subreg);
11244 if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT)
11245 return;
11247 for (links = LOG_LINKS (insn); links;)
11249 insn = XEXP (links, 0);
11250 set = single_set (insn);
11252 if (! set || !REG_P (SET_DEST (set))
11253 || REGNO (SET_DEST (set)) != regno
11254 || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
11256 links = XEXP (links, 1);
11257 continue;
11260 if (reg_stat[regno].last_set == insn)
11262 if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
11263 reg_stat[regno].last_set_nonzero_bits &= GET_MODE_MASK (mode);
11266 if (REG_P (SET_SRC (set)))
11268 regno = REGNO (SET_SRC (set));
11269 links = LOG_LINKS (insn);
11271 else
11272 break;
11276 /* Scan X for promoted SUBREGs. For each one found,
11277 note what it implies to the registers used in it. */
11279 static void
11280 check_promoted_subreg (rtx insn, rtx x)
11282 if (GET_CODE (x) == SUBREG && SUBREG_PROMOTED_VAR_P (x)
11283 && REG_P (SUBREG_REG (x)))
11284 record_promoted_value (insn, x);
11285 else
11287 const char *format = GET_RTX_FORMAT (GET_CODE (x));
11288 int i, j;
11290 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
11291 switch (format[i])
11293 case 'e':
11294 check_promoted_subreg (insn, XEXP (x, i));
11295 break;
11296 case 'V':
11297 case 'E':
11298 if (XVEC (x, i) != 0)
11299 for (j = 0; j < XVECLEN (x, i); j++)
11300 check_promoted_subreg (insn, XVECEXP (x, i, j));
11301 break;
11306 /* Utility routine for the following function. Verify that all the registers
11307 mentioned in *LOC are valid when *LOC was part of a value set when
11308 label_tick == TICK. Return 0 if some are not.
11310 If REPLACE is nonzero, replace the invalid reference with
11311 (clobber (const_int 0)) and return 1. This replacement is useful because
11312 we often can get useful information about the form of a value (e.g., if
11313 it was produced by a shift that always produces -1 or 0) even though
11314 we don't know exactly what registers it was produced from. */
11316 static int
11317 get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
11319 rtx x = *loc;
11320 const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
11321 int len = GET_RTX_LENGTH (GET_CODE (x));
11322 int i;
11324 if (REG_P (x))
11326 unsigned int regno = REGNO (x);
11327 unsigned int endregno
11328 = regno + (regno < FIRST_PSEUDO_REGISTER
11329 ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
11330 unsigned int j;
11332 for (j = regno; j < endregno; j++)
11333 if (reg_stat[j].last_set_invalid
11334 /* If this is a pseudo-register that was only set once and not
11335 live at the beginning of the function, it is always valid. */
11336 || (! (regno >= FIRST_PSEUDO_REGISTER
11337 && REG_N_SETS (regno) == 1
11338 && (! REGNO_REG_SET_P
11339 (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
11340 regno)))
11341 && reg_stat[j].last_set_label > tick))
11343 if (replace)
11344 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11345 return replace;
11348 return 1;
11350 /* If this is a memory reference, make sure that there were
11351 no stores after it that might have clobbered the value. We don't
11352 have alias info, so we assume any store invalidates it. */
11353 else if (MEM_P (x) && !MEM_READONLY_P (x)
11354 && INSN_CUID (insn) <= mem_last_set)
11356 if (replace)
11357 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
11358 return replace;
11361 for (i = 0; i < len; i++)
11363 if (fmt[i] == 'e')
11365 /* Check for identical subexpressions. If x contains
11366 identical subexpression we only have to traverse one of
11367 them. */
11368 if (i == 1 && ARITHMETIC_P (x))
11370 /* Note that at this point x0 has already been checked
11371 and found valid. */
11372 rtx x0 = XEXP (x, 0);
11373 rtx x1 = XEXP (x, 1);
11375 /* If x0 and x1 are identical then x is also valid. */
11376 if (x0 == x1)
11377 return 1;
11379 /* If x1 is identical to a subexpression of x0 then
11380 while checking x0, x1 has already been checked. Thus
11381 it is valid and so as x. */
11382 if (ARITHMETIC_P (x0)
11383 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
11384 return 1;
11386 /* If x0 is identical to a subexpression of x1 then x is
11387 valid iff the rest of x1 is valid. */
11388 if (ARITHMETIC_P (x1)
11389 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
11390 return
11391 get_last_value_validate (&XEXP (x1,
11392 x0 == XEXP (x1, 0) ? 1 : 0),
11393 insn, tick, replace);
11396 if (get_last_value_validate (&XEXP (x, i), insn, tick,
11397 replace) == 0)
11398 return 0;
11400 /* Don't bother with these. They shouldn't occur anyway. */
11401 else if (fmt[i] == 'E')
11402 return 0;
11405 /* If we haven't found a reason for it to be invalid, it is valid. */
11406 return 1;
11409 /* Get the last value assigned to X, if known. Some registers
11410 in the value may be replaced with (clobber (const_int 0)) if their value
11411 is known longer known reliably. */
11413 static rtx
11414 get_last_value (rtx x)
11416 unsigned int regno;
11417 rtx value;
11419 /* If this is a non-paradoxical SUBREG, get the value of its operand and
11420 then convert it to the desired mode. If this is a paradoxical SUBREG,
11421 we cannot predict what values the "extra" bits might have. */
11422 if (GET_CODE (x) == SUBREG
11423 && subreg_lowpart_p (x)
11424 && (GET_MODE_SIZE (GET_MODE (x))
11425 <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
11426 && (value = get_last_value (SUBREG_REG (x))) != 0)
11427 return gen_lowpart (GET_MODE (x), value);
11429 if (!REG_P (x))
11430 return 0;
11432 regno = REGNO (x);
11433 value = reg_stat[regno].last_set_value;
11435 /* If we don't have a value, or if it isn't for this basic block and
11436 it's either a hard register, set more than once, or it's a live
11437 at the beginning of the function, return 0.
11439 Because if it's not live at the beginning of the function then the reg
11440 is always set before being used (is never used without being set).
11441 And, if it's set only once, and it's always set before use, then all
11442 uses must have the same last value, even if it's not from this basic
11443 block. */
11445 if (value == 0
11446 || (reg_stat[regno].last_set_label != label_tick
11447 && (regno < FIRST_PSEUDO_REGISTER
11448 || REG_N_SETS (regno) != 1
11449 || (REGNO_REG_SET_P
11450 (ENTRY_BLOCK_PTR->next_bb->il.rtl->global_live_at_start,
11451 regno)))))
11452 return 0;
11454 /* If the value was set in a later insn than the ones we are processing,
11455 we can't use it even if the register was only set once. */
11456 if (INSN_CUID (reg_stat[regno].last_set) >= subst_low_cuid)
11457 return 0;
11459 /* If the value has all its registers valid, return it. */
11460 if (get_last_value_validate (&value, reg_stat[regno].last_set,
11461 reg_stat[regno].last_set_label, 0))
11462 return value;
11464 /* Otherwise, make a copy and replace any invalid register with
11465 (clobber (const_int 0)). If that fails for some reason, return 0. */
11467 value = copy_rtx (value);
11468 if (get_last_value_validate (&value, reg_stat[regno].last_set,
11469 reg_stat[regno].last_set_label, 1))
11470 return value;
11472 return 0;
11475 /* Return nonzero if expression X refers to a REG or to memory
11476 that is set in an instruction more recent than FROM_CUID. */
11478 static int
11479 use_crosses_set_p (rtx x, int from_cuid)
11481 const char *fmt;
11482 int i;
11483 enum rtx_code code = GET_CODE (x);
11485 if (code == REG)
11487 unsigned int regno = REGNO (x);
11488 unsigned endreg = regno + (regno < FIRST_PSEUDO_REGISTER
11489 ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
11491 #ifdef PUSH_ROUNDING
11492 /* Don't allow uses of the stack pointer to be moved,
11493 because we don't know whether the move crosses a push insn. */
11494 if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
11495 return 1;
11496 #endif
11497 for (; regno < endreg; regno++)
11498 if (reg_stat[regno].last_set
11499 && INSN_CUID (reg_stat[regno].last_set) > from_cuid)
11500 return 1;
11501 return 0;
11504 if (code == MEM && mem_last_set > from_cuid)
11505 return 1;
11507 fmt = GET_RTX_FORMAT (code);
11509 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11511 if (fmt[i] == 'E')
11513 int j;
11514 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11515 if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid))
11516 return 1;
11518 else if (fmt[i] == 'e'
11519 && use_crosses_set_p (XEXP (x, i), from_cuid))
11520 return 1;
11522 return 0;
11525 /* Define three variables used for communication between the following
11526 routines. */
11528 static unsigned int reg_dead_regno, reg_dead_endregno;
11529 static int reg_dead_flag;
11531 /* Function called via note_stores from reg_dead_at_p.
11533 If DEST is within [reg_dead_regno, reg_dead_endregno), set
11534 reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET. */
11536 static void
11537 reg_dead_at_p_1 (rtx dest, rtx x, void *data ATTRIBUTE_UNUSED)
11539 unsigned int regno, endregno;
11541 if (!REG_P (dest))
11542 return;
11544 regno = REGNO (dest);
11545 endregno = regno + (regno < FIRST_PSEUDO_REGISTER
11546 ? hard_regno_nregs[regno][GET_MODE (dest)] : 1);
11548 if (reg_dead_endregno > regno && reg_dead_regno < endregno)
11549 reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
11552 /* Return nonzero if REG is known to be dead at INSN.
11554 We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER
11555 referencing REG, it is dead. If we hit a SET referencing REG, it is
11556 live. Otherwise, see if it is live or dead at the start of the basic
11557 block we are in. Hard regs marked as being live in NEWPAT_USED_REGS
11558 must be assumed to be always live. */
11560 static int
11561 reg_dead_at_p (rtx reg, rtx insn)
11563 basic_block block;
11564 unsigned int i;
11566 /* Set variables for reg_dead_at_p_1. */
11567 reg_dead_regno = REGNO (reg);
11568 reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER
11569 ? hard_regno_nregs[reg_dead_regno]
11570 [GET_MODE (reg)]
11571 : 1);
11573 reg_dead_flag = 0;
11575 /* Check that reg isn't mentioned in NEWPAT_USED_REGS. For fixed registers
11576 we allow the machine description to decide whether use-and-clobber
11577 patterns are OK. */
11578 if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
11580 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11581 if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
11582 return 0;
11585 /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or
11586 beginning of function. */
11587 for (; insn && !LABEL_P (insn) && !BARRIER_P (insn);
11588 insn = prev_nonnote_insn (insn))
11590 note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
11591 if (reg_dead_flag)
11592 return reg_dead_flag == 1 ? 1 : 0;
11594 if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
11595 return 1;
11598 /* Get the basic block that we were in. */
11599 if (insn == 0)
11600 block = ENTRY_BLOCK_PTR->next_bb;
11601 else
11603 FOR_EACH_BB (block)
11604 if (insn == BB_HEAD (block))
11605 break;
11607 if (block == EXIT_BLOCK_PTR)
11608 return 0;
11611 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11612 if (REGNO_REG_SET_P (block->il.rtl->global_live_at_start, i))
11613 return 0;
11615 return 1;
11618 /* Note hard registers in X that are used. This code is similar to
11619 that in flow.c, but much simpler since we don't care about pseudos. */
11621 static void
11622 mark_used_regs_combine (rtx x)
11624 RTX_CODE code = GET_CODE (x);
11625 unsigned int regno;
11626 int i;
11628 switch (code)
11630 case LABEL_REF:
11631 case SYMBOL_REF:
11632 case CONST_INT:
11633 case CONST:
11634 case CONST_DOUBLE:
11635 case CONST_VECTOR:
11636 case PC:
11637 case ADDR_VEC:
11638 case ADDR_DIFF_VEC:
11639 case ASM_INPUT:
11640 #ifdef HAVE_cc0
11641 /* CC0 must die in the insn after it is set, so we don't need to take
11642 special note of it here. */
11643 case CC0:
11644 #endif
11645 return;
11647 case CLOBBER:
11648 /* If we are clobbering a MEM, mark any hard registers inside the
11649 address as used. */
11650 if (MEM_P (XEXP (x, 0)))
11651 mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
11652 return;
11654 case REG:
11655 regno = REGNO (x);
11656 /* A hard reg in a wide mode may really be multiple registers.
11657 If so, mark all of them just like the first. */
11658 if (regno < FIRST_PSEUDO_REGISTER)
11660 unsigned int endregno, r;
11662 /* None of this applies to the stack, frame or arg pointers. */
11663 if (regno == STACK_POINTER_REGNUM
11664 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
11665 || regno == HARD_FRAME_POINTER_REGNUM
11666 #endif
11667 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
11668 || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
11669 #endif
11670 || regno == FRAME_POINTER_REGNUM)
11671 return;
11673 endregno = regno + hard_regno_nregs[regno][GET_MODE (x)];
11674 for (r = regno; r < endregno; r++)
11675 SET_HARD_REG_BIT (newpat_used_regs, r);
11677 return;
11679 case SET:
11681 /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
11682 the address. */
11683 rtx testreg = SET_DEST (x);
11685 while (GET_CODE (testreg) == SUBREG
11686 || GET_CODE (testreg) == ZERO_EXTRACT
11687 || GET_CODE (testreg) == STRICT_LOW_PART)
11688 testreg = XEXP (testreg, 0);
11690 if (MEM_P (testreg))
11691 mark_used_regs_combine (XEXP (testreg, 0));
11693 mark_used_regs_combine (SET_SRC (x));
11695 return;
11697 default:
11698 break;
11701 /* Recursively scan the operands of this expression. */
11704 const char *fmt = GET_RTX_FORMAT (code);
11706 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11708 if (fmt[i] == 'e')
11709 mark_used_regs_combine (XEXP (x, i));
11710 else if (fmt[i] == 'E')
11712 int j;
11714 for (j = 0; j < XVECLEN (x, i); j++)
11715 mark_used_regs_combine (XVECEXP (x, i, j));
11721 /* Remove register number REGNO from the dead registers list of INSN.
11723 Return the note used to record the death, if there was one. */
11726 remove_death (unsigned int regno, rtx insn)
11728 rtx note = find_regno_note (insn, REG_DEAD, regno);
11730 if (note)
11732 REG_N_DEATHS (regno)--;
11733 remove_note (insn, note);
11736 return note;
11739 /* For each register (hardware or pseudo) used within expression X, if its
11740 death is in an instruction with cuid between FROM_CUID (inclusive) and
11741 TO_INSN (exclusive), put a REG_DEAD note for that register in the
11742 list headed by PNOTES.
11744 That said, don't move registers killed by maybe_kill_insn.
11746 This is done when X is being merged by combination into TO_INSN. These
11747 notes will then be distributed as needed. */
11749 static void
11750 move_deaths (rtx x, rtx maybe_kill_insn, int from_cuid, rtx to_insn,
11751 rtx *pnotes)
11753 const char *fmt;
11754 int len, i;
11755 enum rtx_code code = GET_CODE (x);
11757 if (code == REG)
11759 unsigned int regno = REGNO (x);
11760 rtx where_dead = reg_stat[regno].last_death;
11761 rtx before_dead, after_dead;
11763 /* Don't move the register if it gets killed in between from and to. */
11764 if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
11765 && ! reg_referenced_p (x, maybe_kill_insn))
11766 return;
11768 /* WHERE_DEAD could be a USE insn made by combine, so first we
11769 make sure that we have insns with valid INSN_CUID values. */
11770 before_dead = where_dead;
11771 while (before_dead && INSN_UID (before_dead) > max_uid_cuid)
11772 before_dead = PREV_INSN (before_dead);
11774 after_dead = where_dead;
11775 while (after_dead && INSN_UID (after_dead) > max_uid_cuid)
11776 after_dead = NEXT_INSN (after_dead);
11778 if (before_dead && after_dead
11779 && INSN_CUID (before_dead) >= from_cuid
11780 && (INSN_CUID (after_dead) < INSN_CUID (to_insn)
11781 || (where_dead != after_dead
11782 && INSN_CUID (after_dead) == INSN_CUID (to_insn))))
11784 rtx note = remove_death (regno, where_dead);
11786 /* It is possible for the call above to return 0. This can occur
11787 when last_death points to I2 or I1 that we combined with.
11788 In that case make a new note.
11790 We must also check for the case where X is a hard register
11791 and NOTE is a death note for a range of hard registers
11792 including X. In that case, we must put REG_DEAD notes for
11793 the remaining registers in place of NOTE. */
11795 if (note != 0 && regno < FIRST_PSEUDO_REGISTER
11796 && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11797 > GET_MODE_SIZE (GET_MODE (x))))
11799 unsigned int deadregno = REGNO (XEXP (note, 0));
11800 unsigned int deadend
11801 = (deadregno + hard_regno_nregs[deadregno]
11802 [GET_MODE (XEXP (note, 0))]);
11803 unsigned int ourend
11804 = regno + hard_regno_nregs[regno][GET_MODE (x)];
11805 unsigned int i;
11807 for (i = deadregno; i < deadend; i++)
11808 if (i < regno || i >= ourend)
11809 REG_NOTES (where_dead)
11810 = gen_rtx_EXPR_LIST (REG_DEAD,
11811 regno_reg_rtx[i],
11812 REG_NOTES (where_dead));
11815 /* If we didn't find any note, or if we found a REG_DEAD note that
11816 covers only part of the given reg, and we have a multi-reg hard
11817 register, then to be safe we must check for REG_DEAD notes
11818 for each register other than the first. They could have
11819 their own REG_DEAD notes lying around. */
11820 else if ((note == 0
11821 || (note != 0
11822 && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11823 < GET_MODE_SIZE (GET_MODE (x)))))
11824 && regno < FIRST_PSEUDO_REGISTER
11825 && hard_regno_nregs[regno][GET_MODE (x)] > 1)
11827 unsigned int ourend
11828 = regno + hard_regno_nregs[regno][GET_MODE (x)];
11829 unsigned int i, offset;
11830 rtx oldnotes = 0;
11832 if (note)
11833 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
11834 else
11835 offset = 1;
11837 for (i = regno + offset; i < ourend; i++)
11838 move_deaths (regno_reg_rtx[i],
11839 maybe_kill_insn, from_cuid, to_insn, &oldnotes);
11842 if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
11844 XEXP (note, 1) = *pnotes;
11845 *pnotes = note;
11847 else
11848 *pnotes = gen_rtx_EXPR_LIST (REG_DEAD, x, *pnotes);
11850 REG_N_DEATHS (regno)++;
11853 return;
11856 else if (GET_CODE (x) == SET)
11858 rtx dest = SET_DEST (x);
11860 move_deaths (SET_SRC (x), maybe_kill_insn, from_cuid, to_insn, pnotes);
11862 /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
11863 that accesses one word of a multi-word item, some
11864 piece of everything register in the expression is used by
11865 this insn, so remove any old death. */
11866 /* ??? So why do we test for equality of the sizes? */
11868 if (GET_CODE (dest) == ZERO_EXTRACT
11869 || GET_CODE (dest) == STRICT_LOW_PART
11870 || (GET_CODE (dest) == SUBREG
11871 && (((GET_MODE_SIZE (GET_MODE (dest))
11872 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
11873 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
11874 + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
11876 move_deaths (dest, maybe_kill_insn, from_cuid, to_insn, pnotes);
11877 return;
11880 /* If this is some other SUBREG, we know it replaces the entire
11881 value, so use that as the destination. */
11882 if (GET_CODE (dest) == SUBREG)
11883 dest = SUBREG_REG (dest);
11885 /* If this is a MEM, adjust deaths of anything used in the address.
11886 For a REG (the only other possibility), the entire value is
11887 being replaced so the old value is not used in this insn. */
11889 if (MEM_P (dest))
11890 move_deaths (XEXP (dest, 0), maybe_kill_insn, from_cuid,
11891 to_insn, pnotes);
11892 return;
11895 else if (GET_CODE (x) == CLOBBER)
11896 return;
11898 len = GET_RTX_LENGTH (code);
11899 fmt = GET_RTX_FORMAT (code);
11901 for (i = 0; i < len; i++)
11903 if (fmt[i] == 'E')
11905 int j;
11906 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11907 move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_cuid,
11908 to_insn, pnotes);
11910 else if (fmt[i] == 'e')
11911 move_deaths (XEXP (x, i), maybe_kill_insn, from_cuid, to_insn, pnotes);
11915 /* Return 1 if X is the target of a bit-field assignment in BODY, the
11916 pattern of an insn. X must be a REG. */
11918 static int
11919 reg_bitfield_target_p (rtx x, rtx body)
11921 int i;
11923 if (GET_CODE (body) == SET)
11925 rtx dest = SET_DEST (body);
11926 rtx target;
11927 unsigned int regno, tregno, endregno, endtregno;
11929 if (GET_CODE (dest) == ZERO_EXTRACT)
11930 target = XEXP (dest, 0);
11931 else if (GET_CODE (dest) == STRICT_LOW_PART)
11932 target = SUBREG_REG (XEXP (dest, 0));
11933 else
11934 return 0;
11936 if (GET_CODE (target) == SUBREG)
11937 target = SUBREG_REG (target);
11939 if (!REG_P (target))
11940 return 0;
11942 tregno = REGNO (target), regno = REGNO (x);
11943 if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
11944 return target == x;
11946 endtregno = tregno + hard_regno_nregs[tregno][GET_MODE (target)];
11947 endregno = regno + hard_regno_nregs[regno][GET_MODE (x)];
11949 return endregno > tregno && regno < endtregno;
11952 else if (GET_CODE (body) == PARALLEL)
11953 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
11954 if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
11955 return 1;
11957 return 0;
11960 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
11961 as appropriate. I3 and I2 are the insns resulting from the combination
11962 insns including FROM (I2 may be zero).
11964 ELIM_I2 and ELIM_I1 are either zero or registers that we know will
11965 not need REG_DEAD notes because they are being substituted for. This
11966 saves searching in the most common cases.
11968 Each note in the list is either ignored or placed on some insns, depending
11969 on the type of note. */
11971 static void
11972 distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
11973 rtx elim_i1)
11975 rtx note, next_note;
11976 rtx tem;
11978 for (note = notes; note; note = next_note)
11980 rtx place = 0, place2 = 0;
11982 /* If this NOTE references a pseudo register, ensure it references
11983 the latest copy of that register. */
11984 if (XEXP (note, 0) && REG_P (XEXP (note, 0))
11985 && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER)
11986 XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))];
11988 next_note = XEXP (note, 1);
11989 switch (REG_NOTE_KIND (note))
11991 case REG_BR_PROB:
11992 case REG_BR_PRED:
11993 /* Doesn't matter much where we put this, as long as it's somewhere.
11994 It is preferable to keep these notes on branches, which is most
11995 likely to be i3. */
11996 place = i3;
11997 break;
11999 case REG_VALUE_PROFILE:
12000 /* Just get rid of this note, as it is unused later anyway. */
12001 break;
12003 case REG_NON_LOCAL_GOTO:
12004 if (JUMP_P (i3))
12005 place = i3;
12006 else
12008 gcc_assert (i2 && JUMP_P (i2));
12009 place = i2;
12011 break;
12013 case REG_EH_REGION:
12014 /* These notes must remain with the call or trapping instruction. */
12015 if (CALL_P (i3))
12016 place = i3;
12017 else if (i2 && CALL_P (i2))
12018 place = i2;
12019 else
12021 gcc_assert (flag_non_call_exceptions);
12022 if (may_trap_p (i3))
12023 place = i3;
12024 else if (i2 && may_trap_p (i2))
12025 place = i2;
12026 /* ??? Otherwise assume we've combined things such that we
12027 can now prove that the instructions can't trap. Drop the
12028 note in this case. */
12030 break;
12032 case REG_NORETURN:
12033 case REG_SETJMP:
12034 /* These notes must remain with the call. It should not be
12035 possible for both I2 and I3 to be a call. */
12036 if (CALL_P (i3))
12037 place = i3;
12038 else
12040 gcc_assert (i2 && CALL_P (i2));
12041 place = i2;
12043 break;
12045 case REG_UNUSED:
12046 /* Any clobbers for i3 may still exist, and so we must process
12047 REG_UNUSED notes from that insn.
12049 Any clobbers from i2 or i1 can only exist if they were added by
12050 recog_for_combine. In that case, recog_for_combine created the
12051 necessary REG_UNUSED notes. Trying to keep any original
12052 REG_UNUSED notes from these insns can cause incorrect output
12053 if it is for the same register as the original i3 dest.
12054 In that case, we will notice that the register is set in i3,
12055 and then add a REG_UNUSED note for the destination of i3, which
12056 is wrong. However, it is possible to have REG_UNUSED notes from
12057 i2 or i1 for register which were both used and clobbered, so
12058 we keep notes from i2 or i1 if they will turn into REG_DEAD
12059 notes. */
12061 /* If this register is set or clobbered in I3, put the note there
12062 unless there is one already. */
12063 if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
12065 if (from_insn != i3)
12066 break;
12068 if (! (REG_P (XEXP (note, 0))
12069 ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
12070 : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
12071 place = i3;
12073 /* Otherwise, if this register is used by I3, then this register
12074 now dies here, so we must put a REG_DEAD note here unless there
12075 is one already. */
12076 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
12077 && ! (REG_P (XEXP (note, 0))
12078 ? find_regno_note (i3, REG_DEAD,
12079 REGNO (XEXP (note, 0)))
12080 : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
12082 PUT_REG_NOTE_KIND (note, REG_DEAD);
12083 place = i3;
12085 break;
12087 case REG_EQUAL:
12088 case REG_EQUIV:
12089 case REG_NOALIAS:
12090 /* These notes say something about results of an insn. We can
12091 only support them if they used to be on I3 in which case they
12092 remain on I3. Otherwise they are ignored.
12094 If the note refers to an expression that is not a constant, we
12095 must also ignore the note since we cannot tell whether the
12096 equivalence is still true. It might be possible to do
12097 slightly better than this (we only have a problem if I2DEST
12098 or I1DEST is present in the expression), but it doesn't
12099 seem worth the trouble. */
12101 if (from_insn == i3
12102 && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
12103 place = i3;
12104 break;
12106 case REG_INC:
12107 case REG_NO_CONFLICT:
12108 /* These notes say something about how a register is used. They must
12109 be present on any use of the register in I2 or I3. */
12110 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
12111 place = i3;
12113 if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
12115 if (place)
12116 place2 = i2;
12117 else
12118 place = i2;
12120 break;
12122 case REG_LABEL:
12123 /* This can show up in several ways -- either directly in the
12124 pattern, or hidden off in the constant pool with (or without?)
12125 a REG_EQUAL note. */
12126 /* ??? Ignore the without-reg_equal-note problem for now. */
12127 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
12128 || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
12129 && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12130 && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
12131 place = i3;
12133 if (i2
12134 && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
12135 || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
12136 && GET_CODE (XEXP (tem, 0)) == LABEL_REF
12137 && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
12139 if (place)
12140 place2 = i2;
12141 else
12142 place = i2;
12145 /* Don't attach REG_LABEL note to a JUMP_INSN. Add
12146 a JUMP_LABEL instead or decrement LABEL_NUSES. */
12147 if (place && JUMP_P (place))
12149 rtx label = JUMP_LABEL (place);
12151 if (!label)
12152 JUMP_LABEL (place) = XEXP (note, 0);
12153 else
12155 gcc_assert (label == XEXP (note, 0));
12156 if (LABEL_P (label))
12157 LABEL_NUSES (label)--;
12159 place = 0;
12161 if (place2 && JUMP_P (place2))
12163 rtx label = JUMP_LABEL (place2);
12165 if (!label)
12166 JUMP_LABEL (place2) = XEXP (note, 0);
12167 else
12169 gcc_assert (label == XEXP (note, 0));
12170 if (LABEL_P (label))
12171 LABEL_NUSES (label)--;
12173 place2 = 0;
12175 break;
12177 case REG_NONNEG:
12178 /* This note says something about the value of a register prior
12179 to the execution of an insn. It is too much trouble to see
12180 if the note is still correct in all situations. It is better
12181 to simply delete it. */
12182 break;
12184 case REG_RETVAL:
12185 /* If the insn previously containing this note still exists,
12186 put it back where it was. Otherwise move it to the previous
12187 insn. Adjust the corresponding REG_LIBCALL note. */
12188 if (!NOTE_P (from_insn))
12189 place = from_insn;
12190 else
12192 tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
12193 place = prev_real_insn (from_insn);
12194 if (tem && place)
12195 XEXP (tem, 0) = place;
12196 /* If we're deleting the last remaining instruction of a
12197 libcall sequence, don't add the notes. */
12198 else if (XEXP (note, 0) == from_insn)
12199 tem = place = 0;
12200 /* Don't add the dangling REG_RETVAL note. */
12201 else if (! tem)
12202 place = 0;
12204 break;
12206 case REG_LIBCALL:
12207 /* This is handled similarly to REG_RETVAL. */
12208 if (!NOTE_P (from_insn))
12209 place = from_insn;
12210 else
12212 tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX);
12213 place = next_real_insn (from_insn);
12214 if (tem && place)
12215 XEXP (tem, 0) = place;
12216 /* If we're deleting the last remaining instruction of a
12217 libcall sequence, don't add the notes. */
12218 else if (XEXP (note, 0) == from_insn)
12219 tem = place = 0;
12220 /* Don't add the dangling REG_LIBCALL note. */
12221 else if (! tem)
12222 place = 0;
12224 break;
12226 case REG_DEAD:
12227 /* If the register is used as an input in I3, it dies there.
12228 Similarly for I2, if it is nonzero and adjacent to I3.
12230 If the register is not used as an input in either I3 or I2
12231 and it is not one of the registers we were supposed to eliminate,
12232 there are two possibilities. We might have a non-adjacent I2
12233 or we might have somehow eliminated an additional register
12234 from a computation. For example, we might have had A & B where
12235 we discover that B will always be zero. In this case we will
12236 eliminate the reference to A.
12238 In both cases, we must search to see if we can find a previous
12239 use of A and put the death note there. */
12241 if (from_insn
12242 && CALL_P (from_insn)
12243 && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
12244 place = from_insn;
12245 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
12246 place = i3;
12247 else if (i2 != 0 && next_nonnote_insn (i2) == i3
12248 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12249 place = i2;
12251 if (place == 0
12252 && (rtx_equal_p (XEXP (note, 0), elim_i2)
12253 || rtx_equal_p (XEXP (note, 0), elim_i1)))
12254 break;
12256 if (place == 0)
12258 basic_block bb = this_basic_block;
12260 /* You might think you could search back from FROM_INSN
12261 rather than from I3, but combine tries to split invalid
12262 combined instructions. This can result in the old I2
12263 or I1 moving later in the insn sequence. */
12264 for (tem = PREV_INSN (i3); place == 0; tem = PREV_INSN (tem))
12266 if (! INSN_P (tem))
12268 if (tem == BB_HEAD (bb))
12269 break;
12270 continue;
12273 /* If the register is being set at TEM, see if that is all
12274 TEM is doing. If so, delete TEM. Otherwise, make this
12275 into a REG_UNUSED note instead. Don't delete sets to
12276 global register vars. */
12277 if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
12278 || !global_regs[REGNO (XEXP (note, 0))])
12279 && reg_set_p (XEXP (note, 0), PATTERN (tem)))
12281 rtx set = single_set (tem);
12282 rtx inner_dest = 0;
12283 #ifdef HAVE_cc0
12284 rtx cc0_setter = NULL_RTX;
12285 #endif
12287 if (set != 0)
12288 for (inner_dest = SET_DEST (set);
12289 (GET_CODE (inner_dest) == STRICT_LOW_PART
12290 || GET_CODE (inner_dest) == SUBREG
12291 || GET_CODE (inner_dest) == ZERO_EXTRACT);
12292 inner_dest = XEXP (inner_dest, 0))
12295 /* Verify that it was the set, and not a clobber that
12296 modified the register.
12298 CC0 targets must be careful to maintain setter/user
12299 pairs. If we cannot delete the setter due to side
12300 effects, mark the user with an UNUSED note instead
12301 of deleting it. */
12303 if (set != 0 && ! side_effects_p (SET_SRC (set))
12304 && rtx_equal_p (XEXP (note, 0), inner_dest)
12305 #ifdef HAVE_cc0
12306 && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
12307 || ((cc0_setter = prev_cc0_setter (tem)) != NULL
12308 && sets_cc0_p (PATTERN (cc0_setter)) > 0))
12309 #endif
12312 /* Move the notes and links of TEM elsewhere.
12313 This might delete other dead insns recursively.
12314 First set the pattern to something that won't use
12315 any register. */
12316 rtx old_notes = REG_NOTES (tem);
12318 PATTERN (tem) = pc_rtx;
12319 REG_NOTES (tem) = NULL;
12321 distribute_notes (old_notes, tem, tem, NULL_RTX,
12322 NULL_RTX, NULL_RTX);
12323 distribute_links (LOG_LINKS (tem));
12325 SET_INSN_DELETED (tem);
12327 #ifdef HAVE_cc0
12328 /* Delete the setter too. */
12329 if (cc0_setter)
12331 PATTERN (cc0_setter) = pc_rtx;
12332 old_notes = REG_NOTES (cc0_setter);
12333 REG_NOTES (cc0_setter) = NULL;
12335 distribute_notes (old_notes, cc0_setter,
12336 cc0_setter, NULL_RTX,
12337 NULL_RTX, NULL_RTX);
12338 distribute_links (LOG_LINKS (cc0_setter));
12340 SET_INSN_DELETED (cc0_setter);
12342 #endif
12344 else
12346 PUT_REG_NOTE_KIND (note, REG_UNUSED);
12348 /* If there isn't already a REG_UNUSED note, put one
12349 here. Do not place a REG_DEAD note, even if
12350 the register is also used here; that would not
12351 match the algorithm used in lifetime analysis
12352 and can cause the consistency check in the
12353 scheduler to fail. */
12354 if (! find_regno_note (tem, REG_UNUSED,
12355 REGNO (XEXP (note, 0))))
12356 place = tem;
12357 break;
12360 else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
12361 || (CALL_P (tem)
12362 && find_reg_fusage (tem, USE, XEXP (note, 0))))
12364 /* This may not be the correct place for the death
12365 note if FROM_INSN is before TEM, and the reg is
12366 set between FROM_INSN and TEM. The reg might
12367 die two or more times. An existing death note
12368 means we are looking at the wrong live range. */
12369 if (from_insn
12370 && INSN_CUID (from_insn) < INSN_CUID (tem)
12371 && find_regno_note (tem, REG_DEAD,
12372 REGNO (XEXP (note, 0))))
12374 tem = from_insn;
12375 if (tem == BB_HEAD (bb))
12376 break;
12377 continue;
12380 place = tem;
12382 /* If we are doing a 3->2 combination, and we have a
12383 register which formerly died in i3 and was not used
12384 by i2, which now no longer dies in i3 and is used in
12385 i2 but does not die in i2, and place is between i2
12386 and i3, then we may need to move a link from place to
12387 i2. */
12388 if (i2 && INSN_UID (place) <= max_uid_cuid
12389 && INSN_CUID (place) > INSN_CUID (i2)
12390 && from_insn
12391 && INSN_CUID (from_insn) > INSN_CUID (i2)
12392 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
12394 rtx links = LOG_LINKS (place);
12395 LOG_LINKS (place) = 0;
12396 distribute_links (links);
12398 break;
12401 if (tem == BB_HEAD (bb))
12402 break;
12405 /* We haven't found an insn for the death note and it
12406 is still a REG_DEAD note, but we have hit the beginning
12407 of the block. If the existing life info says the reg
12408 was dead, there's nothing left to do. Otherwise, we'll
12409 need to do a global life update after combine. */
12410 if (REG_NOTE_KIND (note) == REG_DEAD && place == 0
12411 && REGNO_REG_SET_P (bb->il.rtl->global_live_at_start,
12412 REGNO (XEXP (note, 0))))
12413 SET_BIT (refresh_blocks, this_basic_block->index);
12416 /* If the register is set or already dead at PLACE, we needn't do
12417 anything with this note if it is still a REG_DEAD note.
12418 We check here if it is set at all, not if is it totally replaced,
12419 which is what `dead_or_set_p' checks, so also check for it being
12420 set partially. */
12422 if (place && REG_NOTE_KIND (note) == REG_DEAD)
12424 unsigned int regno = REGNO (XEXP (note, 0));
12426 /* Similarly, if the instruction on which we want to place
12427 the note is a noop, we'll need do a global live update
12428 after we remove them in delete_noop_moves. */
12429 if (noop_move_p (place))
12430 SET_BIT (refresh_blocks, this_basic_block->index);
12432 if (dead_or_set_p (place, XEXP (note, 0))
12433 || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
12435 /* Unless the register previously died in PLACE, clear
12436 last_death. [I no longer understand why this is
12437 being done.] */
12438 if (reg_stat[regno].last_death != place)
12439 reg_stat[regno].last_death = 0;
12440 place = 0;
12442 else
12443 reg_stat[regno].last_death = place;
12445 /* If this is a death note for a hard reg that is occupying
12446 multiple registers, ensure that we are still using all
12447 parts of the object. If we find a piece of the object
12448 that is unused, we must arrange for an appropriate REG_DEAD
12449 note to be added for it. However, we can't just emit a USE
12450 and tag the note to it, since the register might actually
12451 be dead; so we recourse, and the recursive call then finds
12452 the previous insn that used this register. */
12454 if (place && regno < FIRST_PSEUDO_REGISTER
12455 && hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))] > 1)
12457 unsigned int endregno
12458 = regno + hard_regno_nregs[regno]
12459 [GET_MODE (XEXP (note, 0))];
12460 int all_used = 1;
12461 unsigned int i;
12463 for (i = regno; i < endregno; i++)
12464 if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
12465 && ! find_regno_fusage (place, USE, i))
12466 || dead_or_set_regno_p (place, i))
12467 all_used = 0;
12469 if (! all_used)
12471 /* Put only REG_DEAD notes for pieces that are
12472 not already dead or set. */
12474 for (i = regno; i < endregno;
12475 i += hard_regno_nregs[i][reg_raw_mode[i]])
12477 rtx piece = regno_reg_rtx[i];
12478 basic_block bb = this_basic_block;
12480 if (! dead_or_set_p (place, piece)
12481 && ! reg_bitfield_target_p (piece,
12482 PATTERN (place)))
12484 rtx new_note
12485 = gen_rtx_EXPR_LIST (REG_DEAD, piece, NULL_RTX);
12487 distribute_notes (new_note, place, place,
12488 NULL_RTX, NULL_RTX, NULL_RTX);
12490 else if (! refers_to_regno_p (i, i + 1,
12491 PATTERN (place), 0)
12492 && ! find_regno_fusage (place, USE, i))
12493 for (tem = PREV_INSN (place); ;
12494 tem = PREV_INSN (tem))
12496 if (! INSN_P (tem))
12498 if (tem == BB_HEAD (bb))
12500 SET_BIT (refresh_blocks,
12501 this_basic_block->index);
12502 break;
12504 continue;
12506 if (dead_or_set_p (tem, piece)
12507 || reg_bitfield_target_p (piece,
12508 PATTERN (tem)))
12510 REG_NOTES (tem)
12511 = gen_rtx_EXPR_LIST (REG_UNUSED, piece,
12512 REG_NOTES (tem));
12513 break;
12519 place = 0;
12523 break;
12525 default:
12526 /* Any other notes should not be present at this point in the
12527 compilation. */
12528 gcc_unreachable ();
12531 if (place)
12533 XEXP (note, 1) = REG_NOTES (place);
12534 REG_NOTES (place) = note;
12536 else if ((REG_NOTE_KIND (note) == REG_DEAD
12537 || REG_NOTE_KIND (note) == REG_UNUSED)
12538 && REG_P (XEXP (note, 0)))
12539 REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
12541 if (place2)
12543 if ((REG_NOTE_KIND (note) == REG_DEAD
12544 || REG_NOTE_KIND (note) == REG_UNUSED)
12545 && REG_P (XEXP (note, 0)))
12546 REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
12548 REG_NOTES (place2) = gen_rtx_fmt_ee (GET_CODE (note),
12549 REG_NOTE_KIND (note),
12550 XEXP (note, 0),
12551 REG_NOTES (place2));
12556 /* Similarly to above, distribute the LOG_LINKS that used to be present on
12557 I3, I2, and I1 to new locations. This is also called to add a link
12558 pointing at I3 when I3's destination is changed. */
12560 static void
12561 distribute_links (rtx links)
12563 rtx link, next_link;
12565 for (link = links; link; link = next_link)
12567 rtx place = 0;
12568 rtx insn;
12569 rtx set, reg;
12571 next_link = XEXP (link, 1);
12573 /* If the insn that this link points to is a NOTE or isn't a single
12574 set, ignore it. In the latter case, it isn't clear what we
12575 can do other than ignore the link, since we can't tell which
12576 register it was for. Such links wouldn't be used by combine
12577 anyway.
12579 It is not possible for the destination of the target of the link to
12580 have been changed by combine. The only potential of this is if we
12581 replace I3, I2, and I1 by I3 and I2. But in that case the
12582 destination of I2 also remains unchanged. */
12584 if (NOTE_P (XEXP (link, 0))
12585 || (set = single_set (XEXP (link, 0))) == 0)
12586 continue;
12588 reg = SET_DEST (set);
12589 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
12590 || GET_CODE (reg) == STRICT_LOW_PART)
12591 reg = XEXP (reg, 0);
12593 /* A LOG_LINK is defined as being placed on the first insn that uses
12594 a register and points to the insn that sets the register. Start
12595 searching at the next insn after the target of the link and stop
12596 when we reach a set of the register or the end of the basic block.
12598 Note that this correctly handles the link that used to point from
12599 I3 to I2. Also note that not much searching is typically done here
12600 since most links don't point very far away. */
12602 for (insn = NEXT_INSN (XEXP (link, 0));
12603 (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR
12604 || BB_HEAD (this_basic_block->next_bb) != insn));
12605 insn = NEXT_INSN (insn))
12606 if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
12608 if (reg_referenced_p (reg, PATTERN (insn)))
12609 place = insn;
12610 break;
12612 else if (CALL_P (insn)
12613 && find_reg_fusage (insn, USE, reg))
12615 place = insn;
12616 break;
12618 else if (INSN_P (insn) && reg_set_p (reg, insn))
12619 break;
12621 /* If we found a place to put the link, place it there unless there
12622 is already a link to the same insn as LINK at that point. */
12624 if (place)
12626 rtx link2;
12628 for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
12629 if (XEXP (link2, 0) == XEXP (link, 0))
12630 break;
12632 if (link2 == 0)
12634 XEXP (link, 1) = LOG_LINKS (place);
12635 LOG_LINKS (place) = link;
12637 /* Set added_links_insn to the earliest insn we added a
12638 link to. */
12639 if (added_links_insn == 0
12640 || INSN_CUID (added_links_insn) > INSN_CUID (place))
12641 added_links_insn = place;
12647 /* Subroutine of unmentioned_reg_p and callback from for_each_rtx.
12648 Check whether the expression pointer to by LOC is a register or
12649 memory, and if so return 1 if it isn't mentioned in the rtx EXPR.
12650 Otherwise return zero. */
12652 static int
12653 unmentioned_reg_p_1 (rtx *loc, void *expr)
12655 rtx x = *loc;
12657 if (x != NULL_RTX
12658 && (REG_P (x) || MEM_P (x))
12659 && ! reg_mentioned_p (x, (rtx) expr))
12660 return 1;
12661 return 0;
12664 /* Check for any register or memory mentioned in EQUIV that is not
12665 mentioned in EXPR. This is used to restrict EQUIV to "specializations"
12666 of EXPR where some registers may have been replaced by constants. */
12668 static bool
12669 unmentioned_reg_p (rtx equiv, rtx expr)
12671 return for_each_rtx (&equiv, unmentioned_reg_p_1, expr);
12674 /* Compute INSN_CUID for INSN, which is an insn made by combine. */
12676 static int
12677 insn_cuid (rtx insn)
12679 while (insn != 0 && INSN_UID (insn) > max_uid_cuid
12680 && NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE)
12681 insn = NEXT_INSN (insn);
12683 gcc_assert (INSN_UID (insn) <= max_uid_cuid);
12685 return INSN_CUID (insn);
12688 void
12689 dump_combine_stats (FILE *file)
12691 fprintf
12692 (file,
12693 ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
12694 combine_attempts, combine_merges, combine_extras, combine_successes);
12697 void
12698 dump_combine_total_stats (FILE *file)
12700 fprintf
12701 (file,
12702 "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
12703 total_attempts, total_merges, total_extras, total_successes);
12707 static bool
12708 gate_handle_combine (void)
12710 return (optimize > 0);
12713 /* Try combining insns through substitution. */
12714 static void
12715 rest_of_handle_combine (void)
12717 int rebuild_jump_labels_after_combine
12718 = combine_instructions (get_insns (), max_reg_num ());
12720 /* Combining insns may have turned an indirect jump into a
12721 direct jump. Rebuild the JUMP_LABEL fields of jumping
12722 instructions. */
12723 if (rebuild_jump_labels_after_combine)
12725 timevar_push (TV_JUMP);
12726 rebuild_jump_labels (get_insns ());
12727 timevar_pop (TV_JUMP);
12729 delete_dead_jumptables ();
12730 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
12734 struct tree_opt_pass pass_combine =
12736 "combine", /* name */
12737 gate_handle_combine, /* gate */
12738 rest_of_handle_combine, /* execute */
12739 NULL, /* sub */
12740 NULL, /* next */
12741 0, /* static_pass_number */
12742 TV_COMBINE, /* tv_id */
12743 0, /* properties_required */
12744 0, /* properties_provided */
12745 0, /* properties_destroyed */
12746 0, /* todo_flags_start */
12747 TODO_dump_func |
12748 TODO_ggc_collect, /* todo_flags_finish */
12749 'c' /* letter */