1 /* Optimize by combining instructions for GNU compiler.
2 Copyright (C) 1987-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This module is essentially the "combiner" phase of the U. of Arizona
21 Portable Optimizer, but redone to work on our list-structured
22 representation for RTL instead of their string representation.
24 The LOG_LINKS of each insn identify the most recent assignment
25 to each REG used in the insn. It is a list of previous insns,
26 each of which contains a SET for a REG that is used in this insn
27 and not used or set in between. LOG_LINKs never cross basic blocks.
28 They were set up by the preceding pass (lifetime analysis).
30 We try to combine each pair of insns joined by a logical link.
31 We also try to combine triplets of insns A, B and C when C has
32 a link back to B and B has a link back to A. Likewise for a
33 small number of quadruplets of insns A, B, C and D for which
34 there's high likelihood of success.
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 modified_between_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 isn't
53 completely updated (however this is only a local issue since it is
54 regenerated before the next pass that uses it):
56 - reg_live_length is not updated
57 - reg_n_refs is not adjusted in the rare case when a register is
58 no longer required in a computation
59 - there are extremely rare cases (see distribute_notes) when a
61 - a LOG_LINKS entry that refers to an insn with multiple SETs may be
62 removed because there is no way to know which register it was
65 To simplify substitution, we combine only when the earlier insn(s)
66 consist of only a single assignment. To simplify updating afterward,
67 we never combine when a subroutine call appears in the middle.
69 Since we do not represent assignments to CC0 explicitly except when that
70 is all an insn does, there is no LOG_LINKS entry in an insn that uses
71 the condition code for the insn that set the condition code.
72 Fortunately, these two insns must be consecutive.
73 Therefore, every JUMP_INSN is taken to have an implicit logical link
74 to the preceding insn. This is not quite right, since non-jumps can
75 also use the condition code; but in practice such insns would not
80 #include "coretypes.h"
95 #include "stor-layout.h"
97 #include "cfgcleanup.h"
98 /* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
100 #include "insn-attr.h"
101 #include "rtlhooks-def.h"
103 #include "tree-pass.h"
104 #include "valtrack.h"
105 #include "rtl-iter.h"
106 #include "print-rtl.h"
108 /* Number of attempts to combine instructions in this function. */
110 static int combine_attempts
;
112 /* Number of attempts that got as far as substitution in this function. */
114 static int combine_merges
;
116 /* Number of instructions combined with added SETs in this function. */
118 static int combine_extras
;
120 /* Number of instructions combined in this function. */
122 static int combine_successes
;
124 /* Totals over entire compilation. */
126 static int total_attempts
, total_merges
, total_extras
, total_successes
;
128 /* combine_instructions may try to replace the right hand side of the
129 second instruction with the value of an associated REG_EQUAL note
130 before throwing it at try_combine. That is problematic when there
131 is a REG_DEAD note for a register used in the old right hand side
132 and can cause distribute_notes to do wrong things. This is the
133 second instruction if it has been so modified, null otherwise. */
135 static rtx_insn
*i2mod
;
137 /* When I2MOD is nonnull, this is a copy of the old right hand side. */
139 static rtx i2mod_old_rhs
;
141 /* When I2MOD is nonnull, this is a copy of the new right hand side. */
143 static rtx i2mod_new_rhs
;
145 struct reg_stat_type
{
146 /* Record last point of death of (hard or pseudo) register n. */
147 rtx_insn
*last_death
;
149 /* Record last point of modification of (hard or pseudo) register n. */
152 /* The next group of fields allows the recording of the last value assigned
153 to (hard or pseudo) register n. We use this information to see if an
154 operation being processed is redundant given a prior operation performed
155 on the register. For example, an `and' with a constant is redundant if
156 all the zero bits are already known to be turned off.
158 We use an approach similar to that used by cse, but change it in the
161 (1) We do not want to reinitialize at each label.
162 (2) It is useful, but not critical, to know the actual value assigned
163 to a register. Often just its form is helpful.
165 Therefore, we maintain the following fields:
167 last_set_value the last value assigned
168 last_set_label records the value of label_tick when the
169 register was assigned
170 last_set_table_tick records the value of label_tick when a
171 value using the register is assigned
172 last_set_invalid set to nonzero when it is not valid
173 to use the value of this register in some
176 To understand the usage of these tables, it is important to understand
177 the distinction between the value in last_set_value being valid and
178 the register being validly contained in some other expression in the
181 (The next two parameters are out of date).
183 reg_stat[i].last_set_value is valid if it is nonzero, and either
184 reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
186 Register I may validly appear in any expression returned for the value
187 of another register if reg_n_sets[i] is 1. It may also appear in the
188 value for register J if reg_stat[j].last_set_invalid is zero, or
189 reg_stat[i].last_set_label < reg_stat[j].last_set_label.
191 If an expression is found in the table containing a register which may
192 not validly appear in an expression, the register is replaced by
193 something that won't match, (clobber (const_int 0)). */
195 /* Record last value assigned to (hard or pseudo) register n. */
199 /* Record the value of label_tick when an expression involving register n
200 is placed in last_set_value. */
202 int last_set_table_tick
;
204 /* Record the value of label_tick when the value for register n is placed in
209 /* These fields are maintained in parallel with last_set_value and are
210 used to store the mode in which the register was last set, the bits
211 that were known to be zero when it was last set, and the number of
212 sign bits copies it was known to have when it was last set. */
214 unsigned HOST_WIDE_INT last_set_nonzero_bits
;
215 char last_set_sign_bit_copies
;
216 ENUM_BITFIELD(machine_mode
) last_set_mode
: 8;
218 /* Set nonzero if references to register n in expressions should not be
219 used. last_set_invalid is set nonzero when this register is being
220 assigned to and last_set_table_tick == label_tick. */
222 char last_set_invalid
;
224 /* Some registers that are set more than once and used in more than one
225 basic block are nevertheless always set in similar ways. For example,
226 a QImode register may be loaded from memory in two places on a machine
227 where byte loads zero extend.
229 We record in the following fields if a register has some leading bits
230 that are always equal to the sign bit, and what we know about the
231 nonzero bits of a register, specifically which bits are known to be
234 If an entry is zero, it means that we don't know anything special. */
236 unsigned char sign_bit_copies
;
238 unsigned HOST_WIDE_INT nonzero_bits
;
240 /* Record the value of the label_tick when the last truncation
241 happened. The field truncated_to_mode is only valid if
242 truncation_label == label_tick. */
244 int truncation_label
;
246 /* Record the last truncation seen for this register. If truncation
247 is not a nop to this mode we might be able to save an explicit
248 truncation if we know that value already contains a truncated
251 ENUM_BITFIELD(machine_mode
) truncated_to_mode
: 8;
255 static vec
<reg_stat_type
> reg_stat
;
257 /* One plus the highest pseudo for which we track REG_N_SETS.
258 regstat_init_n_sets_and_refs allocates the array for REG_N_SETS just once,
259 but during combine_split_insns new pseudos can be created. As we don't have
260 updated DF information in that case, it is hard to initialize the array
261 after growing. The combiner only cares about REG_N_SETS (regno) == 1,
262 so instead of growing the arrays, just assume all newly created pseudos
263 during combine might be set multiple times. */
265 static unsigned int reg_n_sets_max
;
267 /* Record the luid of the last insn that invalidated memory
268 (anything that writes memory, and subroutine calls, but not pushes). */
270 static int mem_last_set
;
272 /* Record the luid of the last CALL_INSN
273 so we can tell whether a potential combination crosses any calls. */
275 static int last_call_luid
;
277 /* When `subst' is called, this is the insn that is being modified
278 (by combining in a previous insn). The PATTERN of this insn
279 is still the old pattern partially modified and it should not be
280 looked at, but this may be used to examine the successors of the insn
281 to judge whether a simplification is valid. */
283 static rtx_insn
*subst_insn
;
285 /* This is the lowest LUID that `subst' is currently dealing with.
286 get_last_value will not return a value if the register was set at or
287 after this LUID. If not for this mechanism, we could get confused if
288 I2 or I1 in try_combine were an insn that used the old value of a register
289 to obtain a new value. In that case, we might erroneously get the
290 new value of the register when we wanted the old one. */
292 static int subst_low_luid
;
294 /* This contains any hard registers that are used in newpat; reg_dead_at_p
295 must consider all these registers to be always live. */
297 static HARD_REG_SET newpat_used_regs
;
299 /* This is an insn to which a LOG_LINKS entry has been added. If this
300 insn is the earlier than I2 or I3, combine should rescan starting at
303 static rtx_insn
*added_links_insn
;
305 /* And similarly, for notes. */
307 static rtx_insn
*added_notes_insn
;
309 /* Basic block in which we are performing combines. */
310 static basic_block this_basic_block
;
311 static bool optimize_this_for_speed_p
;
314 /* Length of the currently allocated uid_insn_cost array. */
316 static int max_uid_known
;
318 /* The following array records the insn_cost for every insn
319 in the instruction stream. */
321 static int *uid_insn_cost
;
323 /* The following array records the LOG_LINKS for every insn in the
324 instruction stream as struct insn_link pointers. */
329 struct insn_link
*next
;
332 static struct insn_link
**uid_log_links
;
335 insn_uid_check (const_rtx insn
)
337 int uid
= INSN_UID (insn
);
338 gcc_checking_assert (uid
<= max_uid_known
);
342 #define INSN_COST(INSN) (uid_insn_cost[insn_uid_check (INSN)])
343 #define LOG_LINKS(INSN) (uid_log_links[insn_uid_check (INSN)])
345 #define FOR_EACH_LOG_LINK(L, INSN) \
346 for ((L) = LOG_LINKS (INSN); (L); (L) = (L)->next)
348 /* Links for LOG_LINKS are allocated from this obstack. */
350 static struct obstack insn_link_obstack
;
352 /* Allocate a link. */
354 static inline struct insn_link
*
355 alloc_insn_link (rtx_insn
*insn
, unsigned int regno
, struct insn_link
*next
)
358 = (struct insn_link
*) obstack_alloc (&insn_link_obstack
,
359 sizeof (struct insn_link
));
366 /* Incremented for each basic block. */
368 static int label_tick
;
370 /* Reset to label_tick for each extended basic block in scanning order. */
372 static int label_tick_ebb_start
;
374 /* Mode used to compute significance in reg_stat[].nonzero_bits. It is the
375 largest integer mode that can fit in HOST_BITS_PER_WIDE_INT. */
377 static scalar_int_mode nonzero_bits_mode
;
379 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
380 be safely used. It is zero while computing them and after combine has
381 completed. This former test prevents propagating values based on
382 previously set values, which can be incorrect if a variable is modified
385 static int nonzero_sign_valid
;
388 /* Record one modification to rtl structure
389 to be undone by storing old_contents into *where. */
391 enum undo_kind
{ UNDO_RTX
, UNDO_INT
, UNDO_MODE
, UNDO_LINKS
};
397 union { rtx r
; int i
; machine_mode m
; struct insn_link
*l
; } old_contents
;
398 union { rtx
*r
; int *i
; struct insn_link
**l
; } where
;
401 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
402 num_undo says how many are currently recorded.
404 other_insn is nonzero if we have modified some other insn in the process
405 of working on subst_insn. It must be verified too. */
411 rtx_insn
*other_insn
;
414 static struct undobuf undobuf
;
416 /* Number of times the pseudo being substituted for
417 was found and replaced. */
419 static int n_occurrences
;
421 static rtx
reg_nonzero_bits_for_combine (const_rtx
, scalar_int_mode
,
423 unsigned HOST_WIDE_INT
*);
424 static rtx
reg_num_sign_bit_copies_for_combine (const_rtx
, scalar_int_mode
,
427 static void do_SUBST (rtx
*, rtx
);
428 static void do_SUBST_INT (int *, int);
429 static void init_reg_last (void);
430 static void setup_incoming_promotions (rtx_insn
*);
431 static void set_nonzero_bits_and_sign_copies (rtx
, const_rtx
, void *);
432 static int cant_combine_insn_p (rtx_insn
*);
433 static int can_combine_p (rtx_insn
*, rtx_insn
*, rtx_insn
*, rtx_insn
*,
434 rtx_insn
*, rtx_insn
*, rtx
*, rtx
*);
435 static int combinable_i3pat (rtx_insn
*, rtx
*, rtx
, rtx
, rtx
, int, int, rtx
*);
436 static int contains_muldiv (rtx
);
437 static rtx_insn
*try_combine (rtx_insn
*, rtx_insn
*, rtx_insn
*, rtx_insn
*,
439 static void undo_all (void);
440 static void undo_commit (void);
441 static rtx
*find_split_point (rtx
*, rtx_insn
*, bool);
442 static rtx
subst (rtx
, rtx
, rtx
, int, int, int);
443 static rtx
combine_simplify_rtx (rtx
, machine_mode
, int, int);
444 static rtx
simplify_if_then_else (rtx
);
445 static rtx
simplify_set (rtx
);
446 static rtx
simplify_logical (rtx
);
447 static rtx
expand_compound_operation (rtx
);
448 static const_rtx
expand_field_assignment (const_rtx
);
449 static rtx
make_extraction (machine_mode
, rtx
, HOST_WIDE_INT
,
450 rtx
, unsigned HOST_WIDE_INT
, int, int, int);
451 static int get_pos_from_mask (unsigned HOST_WIDE_INT
,
452 unsigned HOST_WIDE_INT
*);
453 static rtx
canon_reg_for_combine (rtx
, rtx
);
454 static rtx
force_int_to_mode (rtx
, scalar_int_mode
, scalar_int_mode
,
455 scalar_int_mode
, unsigned HOST_WIDE_INT
, int);
456 static rtx
force_to_mode (rtx
, machine_mode
,
457 unsigned HOST_WIDE_INT
, int);
458 static rtx
if_then_else_cond (rtx
, rtx
*, rtx
*);
459 static rtx
known_cond (rtx
, enum rtx_code
, rtx
, rtx
);
460 static int rtx_equal_for_field_assignment_p (rtx
, rtx
, bool = false);
461 static rtx
make_field_assignment (rtx
);
462 static rtx
apply_distributive_law (rtx
);
463 static rtx
distribute_and_simplify_rtx (rtx
, int);
464 static rtx
simplify_and_const_int_1 (scalar_int_mode
, rtx
,
465 unsigned HOST_WIDE_INT
);
466 static rtx
simplify_and_const_int (rtx
, scalar_int_mode
, rtx
,
467 unsigned HOST_WIDE_INT
);
468 static int merge_outer_ops (enum rtx_code
*, HOST_WIDE_INT
*, enum rtx_code
,
469 HOST_WIDE_INT
, machine_mode
, int *);
470 static rtx
simplify_shift_const_1 (enum rtx_code
, machine_mode
, rtx
, int);
471 static rtx
simplify_shift_const (rtx
, enum rtx_code
, machine_mode
, rtx
,
473 static int recog_for_combine (rtx
*, rtx_insn
*, rtx
*);
474 static rtx
gen_lowpart_for_combine (machine_mode
, rtx
);
475 static enum rtx_code
simplify_compare_const (enum rtx_code
, machine_mode
,
477 static enum rtx_code
simplify_comparison (enum rtx_code
, rtx
*, rtx
*);
478 static void update_table_tick (rtx
);
479 static void record_value_for_reg (rtx
, rtx_insn
*, rtx
);
480 static void check_promoted_subreg (rtx_insn
*, rtx
);
481 static void record_dead_and_set_regs_1 (rtx
, const_rtx
, void *);
482 static void record_dead_and_set_regs (rtx_insn
*);
483 static int get_last_value_validate (rtx
*, rtx_insn
*, int, int);
484 static rtx
get_last_value (const_rtx
);
485 static void reg_dead_at_p_1 (rtx
, const_rtx
, void *);
486 static int reg_dead_at_p (rtx
, rtx_insn
*);
487 static void move_deaths (rtx
, rtx
, int, rtx_insn
*, rtx
*);
488 static int reg_bitfield_target_p (rtx
, rtx
);
489 static void distribute_notes (rtx
, rtx_insn
*, rtx_insn
*, rtx_insn
*, rtx
, rtx
, rtx
);
490 static void distribute_links (struct insn_link
*);
491 static void mark_used_regs_combine (rtx
);
492 static void record_promoted_value (rtx_insn
*, rtx
);
493 static bool unmentioned_reg_p (rtx
, rtx
);
494 static void record_truncated_values (rtx
*, void *);
495 static bool reg_truncated_to_mode (machine_mode
, const_rtx
);
496 static rtx
gen_lowpart_or_truncate (machine_mode
, rtx
);
499 /* It is not safe to use ordinary gen_lowpart in combine.
500 See comments in gen_lowpart_for_combine. */
501 #undef RTL_HOOKS_GEN_LOWPART
502 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_for_combine
504 /* Our implementation of gen_lowpart never emits a new pseudo. */
505 #undef RTL_HOOKS_GEN_LOWPART_NO_EMIT
506 #define RTL_HOOKS_GEN_LOWPART_NO_EMIT gen_lowpart_for_combine
508 #undef RTL_HOOKS_REG_NONZERO_REG_BITS
509 #define RTL_HOOKS_REG_NONZERO_REG_BITS reg_nonzero_bits_for_combine
511 #undef RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES
512 #define RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES reg_num_sign_bit_copies_for_combine
514 #undef RTL_HOOKS_REG_TRUNCATED_TO_MODE
515 #define RTL_HOOKS_REG_TRUNCATED_TO_MODE reg_truncated_to_mode
517 static const struct rtl_hooks combine_rtl_hooks
= RTL_HOOKS_INITIALIZER
;
520 /* Convenience wrapper for the canonicalize_comparison target hook.
521 Target hooks cannot use enum rtx_code. */
523 target_canonicalize_comparison (enum rtx_code
*code
, rtx
*op0
, rtx
*op1
,
524 bool op0_preserve_value
)
526 int code_int
= (int)*code
;
527 targetm
.canonicalize_comparison (&code_int
, op0
, op1
, op0_preserve_value
);
528 *code
= (enum rtx_code
)code_int
;
531 /* Try to split PATTERN found in INSN. This returns NULL_RTX if
532 PATTERN can not be split. Otherwise, it returns an insn sequence.
533 This is a wrapper around split_insns which ensures that the
534 reg_stat vector is made larger if the splitter creates a new
538 combine_split_insns (rtx pattern
, rtx_insn
*insn
)
543 ret
= split_insns (pattern
, insn
);
544 nregs
= max_reg_num ();
545 if (nregs
> reg_stat
.length ())
546 reg_stat
.safe_grow_cleared (nregs
);
550 /* This is used by find_single_use to locate an rtx in LOC that
551 contains exactly one use of DEST, which is typically either a REG
552 or CC0. It returns a pointer to the innermost rtx expression
553 containing DEST. Appearances of DEST that are being used to
554 totally replace it are not counted. */
557 find_single_use_1 (rtx dest
, rtx
*loc
)
560 enum rtx_code code
= GET_CODE (x
);
576 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
577 of a REG that occupies all of the REG, the insn uses DEST if
578 it is mentioned in the destination or the source. Otherwise, we
579 need just check the source. */
580 if (GET_CODE (SET_DEST (x
)) != CC0
581 && GET_CODE (SET_DEST (x
)) != PC
582 && !REG_P (SET_DEST (x
))
583 && ! (GET_CODE (SET_DEST (x
)) == SUBREG
584 && REG_P (SUBREG_REG (SET_DEST (x
)))
585 && !read_modify_subreg_p (SET_DEST (x
))))
588 return find_single_use_1 (dest
, &SET_SRC (x
));
592 return find_single_use_1 (dest
, &XEXP (x
, 0));
598 /* If it wasn't one of the common cases above, check each expression and
599 vector of this code. Look for a unique usage of DEST. */
601 fmt
= GET_RTX_FORMAT (code
);
602 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
606 if (dest
== XEXP (x
, i
)
607 || (REG_P (dest
) && REG_P (XEXP (x
, i
))
608 && REGNO (dest
) == REGNO (XEXP (x
, i
))))
611 this_result
= find_single_use_1 (dest
, &XEXP (x
, i
));
614 result
= this_result
;
615 else if (this_result
)
616 /* Duplicate usage. */
619 else if (fmt
[i
] == 'E')
623 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
625 if (XVECEXP (x
, i
, j
) == dest
627 && REG_P (XVECEXP (x
, i
, j
))
628 && REGNO (XVECEXP (x
, i
, j
)) == REGNO (dest
)))
631 this_result
= find_single_use_1 (dest
, &XVECEXP (x
, i
, j
));
634 result
= this_result
;
635 else if (this_result
)
645 /* See if DEST, produced in INSN, is used only a single time in the
646 sequel. If so, return a pointer to the innermost rtx expression in which
649 If PLOC is nonzero, *PLOC is set to the insn containing the single use.
651 If DEST is cc0_rtx, we look only at the next insn. In that case, we don't
652 care about REG_DEAD notes or LOG_LINKS.
654 Otherwise, we find the single use by finding an insn that has a
655 LOG_LINKS pointing at INSN and has a REG_DEAD note for DEST. If DEST is
656 only referenced once in that insn, we know that it must be the first
657 and last insn referencing DEST. */
660 find_single_use (rtx dest
, rtx_insn
*insn
, rtx_insn
**ploc
)
665 struct insn_link
*link
;
669 next
= NEXT_INSN (insn
);
671 || (!NONJUMP_INSN_P (next
) && !JUMP_P (next
)))
674 result
= find_single_use_1 (dest
, &PATTERN (next
));
683 bb
= BLOCK_FOR_INSN (insn
);
684 for (next
= NEXT_INSN (insn
);
685 next
&& BLOCK_FOR_INSN (next
) == bb
;
686 next
= NEXT_INSN (next
))
687 if (NONDEBUG_INSN_P (next
) && dead_or_set_p (next
, dest
))
689 FOR_EACH_LOG_LINK (link
, next
)
690 if (link
->insn
== insn
&& link
->regno
== REGNO (dest
))
695 result
= find_single_use_1 (dest
, &PATTERN (next
));
705 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
706 insn. The substitution can be undone by undo_all. If INTO is already
707 set to NEWVAL, do not record this change. Because computing NEWVAL might
708 also call SUBST, we have to compute it before we put anything into
712 do_SUBST (rtx
*into
, rtx newval
)
717 if (oldval
== newval
)
720 /* We'd like to catch as many invalid transformations here as
721 possible. Unfortunately, there are way too many mode changes
722 that are perfectly valid, so we'd waste too much effort for
723 little gain doing the checks here. Focus on catching invalid
724 transformations involving integer constants. */
725 if (GET_MODE_CLASS (GET_MODE (oldval
)) == MODE_INT
726 && CONST_INT_P (newval
))
728 /* Sanity check that we're replacing oldval with a CONST_INT
729 that is a valid sign-extension for the original mode. */
730 gcc_assert (INTVAL (newval
)
731 == trunc_int_for_mode (INTVAL (newval
), GET_MODE (oldval
)));
733 /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
734 CONST_INT is not valid, because after the replacement, the
735 original mode would be gone. Unfortunately, we can't tell
736 when do_SUBST is called to replace the operand thereof, so we
737 perform this test on oldval instead, checking whether an
738 invalid replacement took place before we got here. */
739 gcc_assert (!(GET_CODE (oldval
) == SUBREG
740 && CONST_INT_P (SUBREG_REG (oldval
))));
741 gcc_assert (!(GET_CODE (oldval
) == ZERO_EXTEND
742 && CONST_INT_P (XEXP (oldval
, 0))));
746 buf
= undobuf
.frees
, undobuf
.frees
= buf
->next
;
748 buf
= XNEW (struct undo
);
750 buf
->kind
= UNDO_RTX
;
752 buf
->old_contents
.r
= oldval
;
755 buf
->next
= undobuf
.undos
, undobuf
.undos
= buf
;
758 #define SUBST(INTO, NEWVAL) do_SUBST (&(INTO), (NEWVAL))
760 /* Similar to SUBST, but NEWVAL is an int expression. Note that substitution
761 for the value of a HOST_WIDE_INT value (including CONST_INT) is
765 do_SUBST_INT (int *into
, int newval
)
770 if (oldval
== newval
)
774 buf
= undobuf
.frees
, undobuf
.frees
= buf
->next
;
776 buf
= XNEW (struct undo
);
778 buf
->kind
= UNDO_INT
;
780 buf
->old_contents
.i
= oldval
;
783 buf
->next
= undobuf
.undos
, undobuf
.undos
= buf
;
786 #define SUBST_INT(INTO, NEWVAL) do_SUBST_INT (&(INTO), (NEWVAL))
788 /* Similar to SUBST, but just substitute the mode. This is used when
789 changing the mode of a pseudo-register, so that any other
790 references to the entry in the regno_reg_rtx array will change as
794 do_SUBST_MODE (rtx
*into
, machine_mode newval
)
797 machine_mode oldval
= GET_MODE (*into
);
799 if (oldval
== newval
)
803 buf
= undobuf
.frees
, undobuf
.frees
= buf
->next
;
805 buf
= XNEW (struct undo
);
807 buf
->kind
= UNDO_MODE
;
809 buf
->old_contents
.m
= oldval
;
810 adjust_reg_mode (*into
, newval
);
812 buf
->next
= undobuf
.undos
, undobuf
.undos
= buf
;
815 #define SUBST_MODE(INTO, NEWVAL) do_SUBST_MODE (&(INTO), (NEWVAL))
817 /* Similar to SUBST, but NEWVAL is a LOG_LINKS expression. */
820 do_SUBST_LINK (struct insn_link
**into
, struct insn_link
*newval
)
823 struct insn_link
* oldval
= *into
;
825 if (oldval
== newval
)
829 buf
= undobuf
.frees
, undobuf
.frees
= buf
->next
;
831 buf
= XNEW (struct undo
);
833 buf
->kind
= UNDO_LINKS
;
835 buf
->old_contents
.l
= oldval
;
838 buf
->next
= undobuf
.undos
, undobuf
.undos
= buf
;
841 #define SUBST_LINK(oldval, newval) do_SUBST_LINK (&oldval, newval)
843 /* Subroutine of try_combine. Determine whether the replacement patterns
844 NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to insn_cost
845 than the original sequence I0, I1, I2, I3 and undobuf.other_insn. Note
846 that I0, I1 and/or NEWI2PAT may be NULL_RTX. Similarly, NEWOTHERPAT and
847 undobuf.other_insn may also both be NULL_RTX. Return false if the cost
848 of all the instructions can be estimated and the replacements are more
849 expensive than the original sequence. */
852 combine_validate_cost (rtx_insn
*i0
, rtx_insn
*i1
, rtx_insn
*i2
, rtx_insn
*i3
,
853 rtx newpat
, rtx newi2pat
, rtx newotherpat
)
855 int i0_cost
, i1_cost
, i2_cost
, i3_cost
;
856 int new_i2_cost
, new_i3_cost
;
857 int old_cost
, new_cost
;
859 /* Lookup the original insn_costs. */
860 i2_cost
= INSN_COST (i2
);
861 i3_cost
= INSN_COST (i3
);
865 i1_cost
= INSN_COST (i1
);
868 i0_cost
= INSN_COST (i0
);
869 old_cost
= (i0_cost
> 0 && i1_cost
> 0 && i2_cost
> 0 && i3_cost
> 0
870 ? i0_cost
+ i1_cost
+ i2_cost
+ i3_cost
: 0);
874 old_cost
= (i1_cost
> 0 && i2_cost
> 0 && i3_cost
> 0
875 ? i1_cost
+ i2_cost
+ i3_cost
: 0);
881 old_cost
= (i2_cost
> 0 && i3_cost
> 0) ? i2_cost
+ i3_cost
: 0;
882 i1_cost
= i0_cost
= 0;
885 /* If we have split a PARALLEL I2 to I1,I2, we have counted its cost twice;
887 if (old_cost
&& i1
&& INSN_UID (i1
) == INSN_UID (i2
))
891 /* Calculate the replacement insn_costs. */
892 rtx tmp
= PATTERN (i3
);
893 PATTERN (i3
) = newpat
;
894 int tmpi
= INSN_CODE (i3
);
896 new_i3_cost
= insn_cost (i3
, optimize_this_for_speed_p
);
898 INSN_CODE (i3
) = tmpi
;
902 PATTERN (i2
) = newi2pat
;
903 tmpi
= INSN_CODE (i2
);
905 new_i2_cost
= insn_cost (i2
, optimize_this_for_speed_p
);
907 INSN_CODE (i2
) = tmpi
;
908 new_cost
= (new_i2_cost
> 0 && new_i3_cost
> 0)
909 ? new_i2_cost
+ new_i3_cost
: 0;
913 new_cost
= new_i3_cost
;
917 if (undobuf
.other_insn
)
919 int old_other_cost
, new_other_cost
;
921 old_other_cost
= INSN_COST (undobuf
.other_insn
);
922 tmp
= PATTERN (undobuf
.other_insn
);
923 PATTERN (undobuf
.other_insn
) = newotherpat
;
924 tmpi
= INSN_CODE (undobuf
.other_insn
);
925 INSN_CODE (undobuf
.other_insn
) = -1;
926 new_other_cost
= insn_cost (undobuf
.other_insn
,
927 optimize_this_for_speed_p
);
928 PATTERN (undobuf
.other_insn
) = tmp
;
929 INSN_CODE (undobuf
.other_insn
) = tmpi
;
930 if (old_other_cost
> 0 && new_other_cost
> 0)
932 old_cost
+= old_other_cost
;
933 new_cost
+= new_other_cost
;
939 /* Disallow this combination if both new_cost and old_cost are greater than
940 zero, and new_cost is greater than old cost. */
941 int reject
= old_cost
> 0 && new_cost
> old_cost
;
945 fprintf (dump_file
, "%s combination of insns ",
946 reject
? "rejecting" : "allowing");
948 fprintf (dump_file
, "%d, ", INSN_UID (i0
));
949 if (i1
&& INSN_UID (i1
) != INSN_UID (i2
))
950 fprintf (dump_file
, "%d, ", INSN_UID (i1
));
951 fprintf (dump_file
, "%d and %d\n", INSN_UID (i2
), INSN_UID (i3
));
953 fprintf (dump_file
, "original costs ");
955 fprintf (dump_file
, "%d + ", i0_cost
);
956 if (i1
&& INSN_UID (i1
) != INSN_UID (i2
))
957 fprintf (dump_file
, "%d + ", i1_cost
);
958 fprintf (dump_file
, "%d + %d = %d\n", i2_cost
, i3_cost
, old_cost
);
961 fprintf (dump_file
, "replacement costs %d + %d = %d\n",
962 new_i2_cost
, new_i3_cost
, new_cost
);
964 fprintf (dump_file
, "replacement cost %d\n", new_cost
);
970 /* Update the uid_insn_cost array with the replacement costs. */
971 INSN_COST (i2
) = new_i2_cost
;
972 INSN_COST (i3
) = new_i3_cost
;
984 /* Delete any insns that copy a register to itself. */
987 delete_noop_moves (void)
989 rtx_insn
*insn
, *next
;
992 FOR_EACH_BB_FN (bb
, cfun
)
994 for (insn
= BB_HEAD (bb
); insn
!= NEXT_INSN (BB_END (bb
)); insn
= next
)
996 next
= NEXT_INSN (insn
);
997 if (INSN_P (insn
) && noop_move_p (insn
))
1000 fprintf (dump_file
, "deleting noop move %d\n", INSN_UID (insn
));
1002 delete_insn_and_edges (insn
);
1009 /* Return false if we do not want to (or cannot) combine DEF. */
1011 can_combine_def_p (df_ref def
)
1013 /* Do not consider if it is pre/post modification in MEM. */
1014 if (DF_REF_FLAGS (def
) & DF_REF_PRE_POST_MODIFY
)
1017 unsigned int regno
= DF_REF_REGNO (def
);
1019 /* Do not combine frame pointer adjustments. */
1020 if ((regno
== FRAME_POINTER_REGNUM
1021 && (!reload_completed
|| frame_pointer_needed
))
1022 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER
1023 && regno
== HARD_FRAME_POINTER_REGNUM
1024 && (!reload_completed
|| frame_pointer_needed
))
1025 || (FRAME_POINTER_REGNUM
!= ARG_POINTER_REGNUM
1026 && regno
== ARG_POINTER_REGNUM
&& fixed_regs
[regno
]))
1032 /* Return false if we do not want to (or cannot) combine USE. */
1034 can_combine_use_p (df_ref use
)
1036 /* Do not consider the usage of the stack pointer by function call. */
1037 if (DF_REF_FLAGS (use
) & DF_REF_CALL_STACK_USAGE
)
1043 /* Fill in log links field for all insns. */
1046 create_log_links (void)
1049 rtx_insn
**next_use
;
1053 next_use
= XCNEWVEC (rtx_insn
*, max_reg_num ());
1055 /* Pass through each block from the end, recording the uses of each
1056 register and establishing log links when def is encountered.
1057 Note that we do not clear next_use array in order to save time,
1058 so we have to test whether the use is in the same basic block as def.
1060 There are a few cases below when we do not consider the definition or
1061 usage -- these are taken from original flow.c did. Don't ask me why it is
1062 done this way; I don't know and if it works, I don't want to know. */
1064 FOR_EACH_BB_FN (bb
, cfun
)
1066 FOR_BB_INSNS_REVERSE (bb
, insn
)
1068 if (!NONDEBUG_INSN_P (insn
))
1071 /* Log links are created only once. */
1072 gcc_assert (!LOG_LINKS (insn
));
1074 FOR_EACH_INSN_DEF (def
, insn
)
1076 unsigned int regno
= DF_REF_REGNO (def
);
1079 if (!next_use
[regno
])
1082 if (!can_combine_def_p (def
))
1085 use_insn
= next_use
[regno
];
1086 next_use
[regno
] = NULL
;
1088 if (BLOCK_FOR_INSN (use_insn
) != bb
)
1093 We don't build a LOG_LINK for hard registers contained
1094 in ASM_OPERANDs. If these registers get replaced,
1095 we might wind up changing the semantics of the insn,
1096 even if reload can make what appear to be valid
1097 assignments later. */
1098 if (regno
< FIRST_PSEUDO_REGISTER
1099 && asm_noperands (PATTERN (use_insn
)) >= 0)
1102 /* Don't add duplicate links between instructions. */
1103 struct insn_link
*links
;
1104 FOR_EACH_LOG_LINK (links
, use_insn
)
1105 if (insn
== links
->insn
&& regno
== links
->regno
)
1109 LOG_LINKS (use_insn
)
1110 = alloc_insn_link (insn
, regno
, LOG_LINKS (use_insn
));
1113 FOR_EACH_INSN_USE (use
, insn
)
1114 if (can_combine_use_p (use
))
1115 next_use
[DF_REF_REGNO (use
)] = insn
;
1122 /* Walk the LOG_LINKS of insn B to see if we find a reference to A. Return
1123 true if we found a LOG_LINK that proves that A feeds B. This only works
1124 if there are no instructions between A and B which could have a link
1125 depending on A, since in that case we would not record a link for B.
1126 We also check the implicit dependency created by a cc0 setter/user
1130 insn_a_feeds_b (rtx_insn
*a
, rtx_insn
*b
)
1132 struct insn_link
*links
;
1133 FOR_EACH_LOG_LINK (links
, b
)
1134 if (links
->insn
== a
)
1136 if (HAVE_cc0
&& sets_cc0_p (a
))
1141 /* Main entry point for combiner. F is the first insn of the function.
1142 NREGS is the first unused pseudo-reg number.
1144 Return nonzero if the combiner has turned an indirect jump
1145 instruction into a direct jump. */
1147 combine_instructions (rtx_insn
*f
, unsigned int nregs
)
1149 rtx_insn
*insn
, *next
;
1151 struct insn_link
*links
, *nextlinks
;
1153 basic_block last_bb
;
1155 int new_direct_jump_p
= 0;
1157 for (first
= f
; first
&& !NONDEBUG_INSN_P (first
); )
1158 first
= NEXT_INSN (first
);
1162 combine_attempts
= 0;
1165 combine_successes
= 0;
1167 rtl_hooks
= combine_rtl_hooks
;
1169 reg_stat
.safe_grow_cleared (nregs
);
1171 init_recog_no_volatile ();
1173 /* Allocate array for insn info. */
1174 max_uid_known
= get_max_uid ();
1175 uid_log_links
= XCNEWVEC (struct insn_link
*, max_uid_known
+ 1);
1176 uid_insn_cost
= XCNEWVEC (int, max_uid_known
+ 1);
1177 gcc_obstack_init (&insn_link_obstack
);
1179 nonzero_bits_mode
= int_mode_for_size (HOST_BITS_PER_WIDE_INT
, 0).require ();
1181 /* Don't use reg_stat[].nonzero_bits when computing it. This can cause
1182 problems when, for example, we have j <<= 1 in a loop. */
1184 nonzero_sign_valid
= 0;
1185 label_tick
= label_tick_ebb_start
= 1;
1187 /* Scan all SETs and see if we can deduce anything about what
1188 bits are known to be zero for some registers and how many copies
1189 of the sign bit are known to exist for those registers.
1191 Also set any known values so that we can use it while searching
1192 for what bits are known to be set. */
1194 setup_incoming_promotions (first
);
1195 /* Allow the entry block and the first block to fall into the same EBB.
1196 Conceptually the incoming promotions are assigned to the entry block. */
1197 last_bb
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
1199 create_log_links ();
1200 FOR_EACH_BB_FN (this_basic_block
, cfun
)
1202 optimize_this_for_speed_p
= optimize_bb_for_speed_p (this_basic_block
);
1207 if (!single_pred_p (this_basic_block
)
1208 || single_pred (this_basic_block
) != last_bb
)
1209 label_tick_ebb_start
= label_tick
;
1210 last_bb
= this_basic_block
;
1212 FOR_BB_INSNS (this_basic_block
, insn
)
1213 if (INSN_P (insn
) && BLOCK_FOR_INSN (insn
))
1217 subst_low_luid
= DF_INSN_LUID (insn
);
1220 note_stores (PATTERN (insn
), set_nonzero_bits_and_sign_copies
,
1222 record_dead_and_set_regs (insn
);
1225 for (links
= REG_NOTES (insn
); links
; links
= XEXP (links
, 1))
1226 if (REG_NOTE_KIND (links
) == REG_INC
)
1227 set_nonzero_bits_and_sign_copies (XEXP (links
, 0), NULL_RTX
,
1230 /* Record the current insn_cost of this instruction. */
1231 if (NONJUMP_INSN_P (insn
))
1232 INSN_COST (insn
) = insn_cost (insn
, optimize_this_for_speed_p
);
1235 fprintf (dump_file
, "insn_cost %d for ", INSN_COST (insn
));
1236 dump_insn_slim (dump_file
, insn
);
1241 nonzero_sign_valid
= 1;
1243 /* Now scan all the insns in forward order. */
1244 label_tick
= label_tick_ebb_start
= 1;
1246 setup_incoming_promotions (first
);
1247 last_bb
= ENTRY_BLOCK_PTR_FOR_FN (cfun
);
1248 int max_combine
= PARAM_VALUE (PARAM_MAX_COMBINE_INSNS
);
1250 FOR_EACH_BB_FN (this_basic_block
, cfun
)
1252 rtx_insn
*last_combined_insn
= NULL
;
1254 /* Ignore instruction combination in basic blocks that are going to
1255 be removed as unreachable anyway. See PR82386. */
1256 if (EDGE_COUNT (this_basic_block
->preds
) == 0)
1259 optimize_this_for_speed_p
= optimize_bb_for_speed_p (this_basic_block
);
1264 if (!single_pred_p (this_basic_block
)
1265 || single_pred (this_basic_block
) != last_bb
)
1266 label_tick_ebb_start
= label_tick
;
1267 last_bb
= this_basic_block
;
1269 rtl_profile_for_bb (this_basic_block
);
1270 for (insn
= BB_HEAD (this_basic_block
);
1271 insn
!= NEXT_INSN (BB_END (this_basic_block
));
1272 insn
= next
? next
: NEXT_INSN (insn
))
1275 if (!NONDEBUG_INSN_P (insn
))
1278 while (last_combined_insn
1279 && (!NONDEBUG_INSN_P (last_combined_insn
)
1280 || last_combined_insn
->deleted ()))
1281 last_combined_insn
= PREV_INSN (last_combined_insn
);
1282 if (last_combined_insn
== NULL_RTX
1283 || BLOCK_FOR_INSN (last_combined_insn
) != this_basic_block
1284 || DF_INSN_LUID (last_combined_insn
) <= DF_INSN_LUID (insn
))
1285 last_combined_insn
= insn
;
1287 /* See if we know about function return values before this
1288 insn based upon SUBREG flags. */
1289 check_promoted_subreg (insn
, PATTERN (insn
));
1291 /* See if we can find hardregs and subreg of pseudos in
1292 narrower modes. This could help turning TRUNCATEs
1294 note_uses (&PATTERN (insn
), record_truncated_values
, NULL
);
1296 /* Try this insn with each insn it links back to. */
1298 FOR_EACH_LOG_LINK (links
, insn
)
1299 if ((next
= try_combine (insn
, links
->insn
, NULL
,
1300 NULL
, &new_direct_jump_p
,
1301 last_combined_insn
)) != 0)
1303 statistics_counter_event (cfun
, "two-insn combine", 1);
1307 /* Try each sequence of three linked insns ending with this one. */
1309 if (max_combine
>= 3)
1310 FOR_EACH_LOG_LINK (links
, insn
)
1312 rtx_insn
*link
= links
->insn
;
1314 /* If the linked insn has been replaced by a note, then there
1315 is no point in pursuing this chain any further. */
1319 FOR_EACH_LOG_LINK (nextlinks
, link
)
1320 if ((next
= try_combine (insn
, link
, nextlinks
->insn
,
1321 NULL
, &new_direct_jump_p
,
1322 last_combined_insn
)) != 0)
1324 statistics_counter_event (cfun
, "three-insn combine", 1);
1329 /* Try to combine a jump insn that uses CC0
1330 with a preceding insn that sets CC0, and maybe with its
1331 logical predecessor as well.
1332 This is how we make decrement-and-branch insns.
1333 We need this special code because data flow connections
1334 via CC0 do not get entered in LOG_LINKS. */
1338 && (prev
= prev_nonnote_insn (insn
)) != 0
1339 && NONJUMP_INSN_P (prev
)
1340 && sets_cc0_p (PATTERN (prev
)))
1342 if ((next
= try_combine (insn
, prev
, NULL
, NULL
,
1344 last_combined_insn
)) != 0)
1347 FOR_EACH_LOG_LINK (nextlinks
, prev
)
1348 if ((next
= try_combine (insn
, prev
, nextlinks
->insn
,
1349 NULL
, &new_direct_jump_p
,
1350 last_combined_insn
)) != 0)
1354 /* Do the same for an insn that explicitly references CC0. */
1355 if (HAVE_cc0
&& NONJUMP_INSN_P (insn
)
1356 && (prev
= prev_nonnote_insn (insn
)) != 0
1357 && NONJUMP_INSN_P (prev
)
1358 && sets_cc0_p (PATTERN (prev
))
1359 && GET_CODE (PATTERN (insn
)) == SET
1360 && reg_mentioned_p (cc0_rtx
, SET_SRC (PATTERN (insn
))))
1362 if ((next
= try_combine (insn
, prev
, NULL
, NULL
,
1364 last_combined_insn
)) != 0)
1367 FOR_EACH_LOG_LINK (nextlinks
, prev
)
1368 if ((next
= try_combine (insn
, prev
, nextlinks
->insn
,
1369 NULL
, &new_direct_jump_p
,
1370 last_combined_insn
)) != 0)
1374 /* Finally, see if any of the insns that this insn links to
1375 explicitly references CC0. If so, try this insn, that insn,
1376 and its predecessor if it sets CC0. */
1379 FOR_EACH_LOG_LINK (links
, insn
)
1380 if (NONJUMP_INSN_P (links
->insn
)
1381 && GET_CODE (PATTERN (links
->insn
)) == SET
1382 && reg_mentioned_p (cc0_rtx
, SET_SRC (PATTERN (links
->insn
)))
1383 && (prev
= prev_nonnote_insn (links
->insn
)) != 0
1384 && NONJUMP_INSN_P (prev
)
1385 && sets_cc0_p (PATTERN (prev
))
1386 && (next
= try_combine (insn
, links
->insn
,
1387 prev
, NULL
, &new_direct_jump_p
,
1388 last_combined_insn
)) != 0)
1392 /* Try combining an insn with two different insns whose results it
1394 if (max_combine
>= 3)
1395 FOR_EACH_LOG_LINK (links
, insn
)
1396 for (nextlinks
= links
->next
; nextlinks
;
1397 nextlinks
= nextlinks
->next
)
1398 if ((next
= try_combine (insn
, links
->insn
,
1399 nextlinks
->insn
, NULL
,
1401 last_combined_insn
)) != 0)
1404 statistics_counter_event (cfun
, "three-insn combine", 1);
1408 /* Try four-instruction combinations. */
1409 if (max_combine
>= 4)
1410 FOR_EACH_LOG_LINK (links
, insn
)
1412 struct insn_link
*next1
;
1413 rtx_insn
*link
= links
->insn
;
1415 /* If the linked insn has been replaced by a note, then there
1416 is no point in pursuing this chain any further. */
1420 FOR_EACH_LOG_LINK (next1
, link
)
1422 rtx_insn
*link1
= next1
->insn
;
1425 /* I0 -> I1 -> I2 -> I3. */
1426 FOR_EACH_LOG_LINK (nextlinks
, link1
)
1427 if ((next
= try_combine (insn
, link
, link1
,
1430 last_combined_insn
)) != 0)
1432 statistics_counter_event (cfun
, "four-insn combine", 1);
1435 /* I0, I1 -> I2, I2 -> I3. */
1436 for (nextlinks
= next1
->next
; nextlinks
;
1437 nextlinks
= nextlinks
->next
)
1438 if ((next
= try_combine (insn
, link
, link1
,
1441 last_combined_insn
)) != 0)
1443 statistics_counter_event (cfun
, "four-insn combine", 1);
1448 for (next1
= links
->next
; next1
; next1
= next1
->next
)
1450 rtx_insn
*link1
= next1
->insn
;
1453 /* I0 -> I2; I1, I2 -> I3. */
1454 FOR_EACH_LOG_LINK (nextlinks
, link
)
1455 if ((next
= try_combine (insn
, link
, link1
,
1458 last_combined_insn
)) != 0)
1460 statistics_counter_event (cfun
, "four-insn combine", 1);
1463 /* I0 -> I1; I1, I2 -> I3. */
1464 FOR_EACH_LOG_LINK (nextlinks
, link1
)
1465 if ((next
= try_combine (insn
, link
, link1
,
1468 last_combined_insn
)) != 0)
1470 statistics_counter_event (cfun
, "four-insn combine", 1);
1476 /* Try this insn with each REG_EQUAL note it links back to. */
1477 FOR_EACH_LOG_LINK (links
, insn
)
1480 rtx_insn
*temp
= links
->insn
;
1481 if ((set
= single_set (temp
)) != 0
1482 && (note
= find_reg_equal_equiv_note (temp
)) != 0
1483 && (note
= XEXP (note
, 0), GET_CODE (note
)) != EXPR_LIST
1484 /* Avoid using a register that may already been marked
1485 dead by an earlier instruction. */
1486 && ! unmentioned_reg_p (note
, SET_SRC (set
))
1487 && (GET_MODE (note
) == VOIDmode
1488 ? SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set
)))
1489 : (GET_MODE (SET_DEST (set
)) == GET_MODE (note
)
1490 && (GET_CODE (SET_DEST (set
)) != ZERO_EXTRACT
1491 || (GET_MODE (XEXP (SET_DEST (set
), 0))
1492 == GET_MODE (note
))))))
1494 /* Temporarily replace the set's source with the
1495 contents of the REG_EQUAL note. The insn will
1496 be deleted or recognized by try_combine. */
1497 rtx orig_src
= SET_SRC (set
);
1498 rtx orig_dest
= SET_DEST (set
);
1499 if (GET_CODE (SET_DEST (set
)) == ZERO_EXTRACT
)
1500 SET_DEST (set
) = XEXP (SET_DEST (set
), 0);
1501 SET_SRC (set
) = note
;
1503 i2mod_old_rhs
= copy_rtx (orig_src
);
1504 i2mod_new_rhs
= copy_rtx (note
);
1505 next
= try_combine (insn
, i2mod
, NULL
, NULL
,
1507 last_combined_insn
);
1511 statistics_counter_event (cfun
, "insn-with-note combine", 1);
1514 SET_SRC (set
) = orig_src
;
1515 SET_DEST (set
) = orig_dest
;
1520 record_dead_and_set_regs (insn
);
1527 default_rtl_profile ();
1529 new_direct_jump_p
|= purge_all_dead_edges ();
1530 delete_noop_moves ();
1533 obstack_free (&insn_link_obstack
, NULL
);
1534 free (uid_log_links
);
1535 free (uid_insn_cost
);
1536 reg_stat
.release ();
1539 struct undo
*undo
, *next
;
1540 for (undo
= undobuf
.frees
; undo
; undo
= next
)
1548 total_attempts
+= combine_attempts
;
1549 total_merges
+= combine_merges
;
1550 total_extras
+= combine_extras
;
1551 total_successes
+= combine_successes
;
1553 nonzero_sign_valid
= 0;
1554 rtl_hooks
= general_rtl_hooks
;
1556 /* Make recognizer allow volatile MEMs again. */
1559 return new_direct_jump_p
;
1562 /* Wipe the last_xxx fields of reg_stat in preparation for another pass. */
1565 init_reg_last (void)
1570 FOR_EACH_VEC_ELT (reg_stat
, i
, p
)
1571 memset (p
, 0, offsetof (reg_stat_type
, sign_bit_copies
));
1574 /* Set up any promoted values for incoming argument registers. */
1577 setup_incoming_promotions (rtx_insn
*first
)
1580 bool strictly_local
= false;
1582 for (arg
= DECL_ARGUMENTS (current_function_decl
); arg
;
1583 arg
= DECL_CHAIN (arg
))
1585 rtx x
, reg
= DECL_INCOMING_RTL (arg
);
1587 machine_mode mode1
, mode2
, mode3
, mode4
;
1589 /* Only continue if the incoming argument is in a register. */
1593 /* Determine, if possible, whether all call sites of the current
1594 function lie within the current compilation unit. (This does
1595 take into account the exporting of a function via taking its
1596 address, and so forth.) */
1597 strictly_local
= cgraph_node::local_info (current_function_decl
)->local
;
1599 /* The mode and signedness of the argument before any promotions happen
1600 (equal to the mode of the pseudo holding it at that stage). */
1601 mode1
= TYPE_MODE (TREE_TYPE (arg
));
1602 uns1
= TYPE_UNSIGNED (TREE_TYPE (arg
));
1604 /* The mode and signedness of the argument after any source language and
1605 TARGET_PROMOTE_PROTOTYPES-driven promotions. */
1606 mode2
= TYPE_MODE (DECL_ARG_TYPE (arg
));
1607 uns3
= TYPE_UNSIGNED (DECL_ARG_TYPE (arg
));
1609 /* The mode and signedness of the argument as it is actually passed,
1610 see assign_parm_setup_reg in function.c. */
1611 mode3
= promote_function_mode (TREE_TYPE (arg
), mode1
, &uns3
,
1612 TREE_TYPE (cfun
->decl
), 0);
1614 /* The mode of the register in which the argument is being passed. */
1615 mode4
= GET_MODE (reg
);
1617 /* Eliminate sign extensions in the callee when:
1618 (a) A mode promotion has occurred; */
1621 /* (b) The mode of the register is the same as the mode of
1622 the argument as it is passed; */
1625 /* (c) There's no language level extension; */
1628 /* (c.1) All callers are from the current compilation unit. If that's
1629 the case we don't have to rely on an ABI, we only have to know
1630 what we're generating right now, and we know that we will do the
1631 mode1 to mode2 promotion with the given sign. */
1632 else if (!strictly_local
)
1634 /* (c.2) The combination of the two promotions is useful. This is
1635 true when the signs match, or if the first promotion is unsigned.
1636 In the later case, (sign_extend (zero_extend x)) is the same as
1637 (zero_extend (zero_extend x)), so make sure to force UNS3 true. */
1643 /* Record that the value was promoted from mode1 to mode3,
1644 so that any sign extension at the head of the current
1645 function may be eliminated. */
1646 x
= gen_rtx_CLOBBER (mode1
, const0_rtx
);
1647 x
= gen_rtx_fmt_e ((uns3
? ZERO_EXTEND
: SIGN_EXTEND
), mode3
, x
);
1648 record_value_for_reg (reg
, first
, x
);
1652 /* If MODE has a precision lower than PREC and SRC is a non-negative constant
1653 that would appear negative in MODE, sign-extend SRC for use in nonzero_bits
1654 because some machines (maybe most) will actually do the sign-extension and
1655 this is the conservative approach.
1657 ??? For 2.5, try to tighten up the MD files in this regard instead of this
1661 sign_extend_short_imm (rtx src
, machine_mode mode
, unsigned int prec
)
1663 scalar_int_mode int_mode
;
1664 if (CONST_INT_P (src
)
1665 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
1666 && GET_MODE_PRECISION (int_mode
) < prec
1668 && val_signbit_known_set_p (int_mode
, INTVAL (src
)))
1669 src
= GEN_INT (INTVAL (src
) | ~GET_MODE_MASK (int_mode
));
1674 /* Update RSP for pseudo-register X from INSN's REG_EQUAL note (if one exists)
1678 update_rsp_from_reg_equal (reg_stat_type
*rsp
, rtx_insn
*insn
, const_rtx set
,
1681 rtx reg_equal_note
= insn
? find_reg_equal_equiv_note (insn
) : NULL_RTX
;
1682 unsigned HOST_WIDE_INT bits
= 0;
1683 rtx reg_equal
= NULL
, src
= SET_SRC (set
);
1684 unsigned int num
= 0;
1687 reg_equal
= XEXP (reg_equal_note
, 0);
1689 if (SHORT_IMMEDIATES_SIGN_EXTEND
)
1691 src
= sign_extend_short_imm (src
, GET_MODE (x
), BITS_PER_WORD
);
1693 reg_equal
= sign_extend_short_imm (reg_equal
, GET_MODE (x
), BITS_PER_WORD
);
1696 /* Don't call nonzero_bits if it cannot change anything. */
1697 if (rsp
->nonzero_bits
!= HOST_WIDE_INT_M1U
)
1699 bits
= nonzero_bits (src
, nonzero_bits_mode
);
1700 if (reg_equal
&& bits
)
1701 bits
&= nonzero_bits (reg_equal
, nonzero_bits_mode
);
1702 rsp
->nonzero_bits
|= bits
;
1705 /* Don't call num_sign_bit_copies if it cannot change anything. */
1706 if (rsp
->sign_bit_copies
!= 1)
1708 num
= num_sign_bit_copies (SET_SRC (set
), GET_MODE (x
));
1709 if (reg_equal
&& maybe_ne (num
, GET_MODE_PRECISION (GET_MODE (x
))))
1711 unsigned int numeq
= num_sign_bit_copies (reg_equal
, GET_MODE (x
));
1712 if (num
== 0 || numeq
> num
)
1715 if (rsp
->sign_bit_copies
== 0 || num
< rsp
->sign_bit_copies
)
1716 rsp
->sign_bit_copies
= num
;
1720 /* Called via note_stores. If X is a pseudo that is narrower than
1721 HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
1723 If we are setting only a portion of X and we can't figure out what
1724 portion, assume all bits will be used since we don't know what will
1727 Similarly, set how many bits of X are known to be copies of the sign bit
1728 at all locations in the function. This is the smallest number implied
1732 set_nonzero_bits_and_sign_copies (rtx x
, const_rtx set
, void *data
)
1734 rtx_insn
*insn
= (rtx_insn
*) data
;
1735 scalar_int_mode mode
;
1738 && REGNO (x
) >= FIRST_PSEUDO_REGISTER
1739 /* If this register is undefined at the start of the file, we can't
1740 say what its contents were. */
1741 && ! REGNO_REG_SET_P
1742 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->next_bb
), REGNO (x
))
1743 && is_a
<scalar_int_mode
> (GET_MODE (x
), &mode
)
1744 && HWI_COMPUTABLE_MODE_P (mode
))
1746 reg_stat_type
*rsp
= ®_stat
[REGNO (x
)];
1748 if (set
== 0 || GET_CODE (set
) == CLOBBER
)
1750 rsp
->nonzero_bits
= GET_MODE_MASK (mode
);
1751 rsp
->sign_bit_copies
= 1;
1755 /* If this register is being initialized using itself, and the
1756 register is uninitialized in this basic block, and there are
1757 no LOG_LINKS which set the register, then part of the
1758 register is uninitialized. In that case we can't assume
1759 anything about the number of nonzero bits.
1761 ??? We could do better if we checked this in
1762 reg_{nonzero_bits,num_sign_bit_copies}_for_combine. Then we
1763 could avoid making assumptions about the insn which initially
1764 sets the register, while still using the information in other
1765 insns. We would have to be careful to check every insn
1766 involved in the combination. */
1769 && reg_referenced_p (x
, PATTERN (insn
))
1770 && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn
)),
1773 struct insn_link
*link
;
1775 FOR_EACH_LOG_LINK (link
, insn
)
1776 if (dead_or_set_p (link
->insn
, x
))
1780 rsp
->nonzero_bits
= GET_MODE_MASK (mode
);
1781 rsp
->sign_bit_copies
= 1;
1786 /* If this is a complex assignment, see if we can convert it into a
1787 simple assignment. */
1788 set
= expand_field_assignment (set
);
1790 /* If this is a simple assignment, or we have a paradoxical SUBREG,
1791 set what we know about X. */
1793 if (SET_DEST (set
) == x
1794 || (paradoxical_subreg_p (SET_DEST (set
))
1795 && SUBREG_REG (SET_DEST (set
)) == x
))
1796 update_rsp_from_reg_equal (rsp
, insn
, set
, x
);
1799 rsp
->nonzero_bits
= GET_MODE_MASK (mode
);
1800 rsp
->sign_bit_copies
= 1;
1805 /* See if INSN can be combined into I3. PRED, PRED2, SUCC and SUCC2 are
1806 optionally insns that were previously combined into I3 or that will be
1807 combined into the merger of INSN and I3. The order is PRED, PRED2,
1808 INSN, SUCC, SUCC2, I3.
1810 Return 0 if the combination is not allowed for any reason.
1812 If the combination is allowed, *PDEST will be set to the single
1813 destination of INSN and *PSRC to the single source, and this function
1817 can_combine_p (rtx_insn
*insn
, rtx_insn
*i3
, rtx_insn
*pred ATTRIBUTE_UNUSED
,
1818 rtx_insn
*pred2 ATTRIBUTE_UNUSED
, rtx_insn
*succ
, rtx_insn
*succ2
,
1819 rtx
*pdest
, rtx
*psrc
)
1826 bool all_adjacent
= true;
1827 int (*is_volatile_p
) (const_rtx
);
1833 if (next_active_insn (succ2
) != i3
)
1834 all_adjacent
= false;
1835 if (next_active_insn (succ
) != succ2
)
1836 all_adjacent
= false;
1838 else if (next_active_insn (succ
) != i3
)
1839 all_adjacent
= false;
1840 if (next_active_insn (insn
) != succ
)
1841 all_adjacent
= false;
1843 else if (next_active_insn (insn
) != i3
)
1844 all_adjacent
= false;
1846 /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1847 or a PARALLEL consisting of such a SET and CLOBBERs.
1849 If INSN has CLOBBER parallel parts, ignore them for our processing.
1850 By definition, these happen during the execution of the insn. When it
1851 is merged with another insn, all bets are off. If they are, in fact,
1852 needed and aren't also supplied in I3, they may be added by
1853 recog_for_combine. Otherwise, it won't match.
1855 We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1858 Get the source and destination of INSN. If more than one, can't
1861 if (GET_CODE (PATTERN (insn
)) == SET
)
1862 set
= PATTERN (insn
);
1863 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
1864 && GET_CODE (XVECEXP (PATTERN (insn
), 0, 0)) == SET
)
1866 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
1868 rtx elt
= XVECEXP (PATTERN (insn
), 0, i
);
1870 switch (GET_CODE (elt
))
1872 /* This is important to combine floating point insns
1873 for the SH4 port. */
1875 /* Combining an isolated USE doesn't make sense.
1876 We depend here on combinable_i3pat to reject them. */
1877 /* The code below this loop only verifies that the inputs of
1878 the SET in INSN do not change. We call reg_set_between_p
1879 to verify that the REG in the USE does not change between
1881 If the USE in INSN was for a pseudo register, the matching
1882 insn pattern will likely match any register; combining this
1883 with any other USE would only be safe if we knew that the
1884 used registers have identical values, or if there was
1885 something to tell them apart, e.g. different modes. For
1886 now, we forgo such complicated tests and simply disallow
1887 combining of USES of pseudo registers with any other USE. */
1888 if (REG_P (XEXP (elt
, 0))
1889 && GET_CODE (PATTERN (i3
)) == PARALLEL
)
1891 rtx i3pat
= PATTERN (i3
);
1892 int i
= XVECLEN (i3pat
, 0) - 1;
1893 unsigned int regno
= REGNO (XEXP (elt
, 0));
1897 rtx i3elt
= XVECEXP (i3pat
, 0, i
);
1899 if (GET_CODE (i3elt
) == USE
1900 && REG_P (XEXP (i3elt
, 0))
1901 && (REGNO (XEXP (i3elt
, 0)) == regno
1902 ? reg_set_between_p (XEXP (elt
, 0),
1903 PREV_INSN (insn
), i3
)
1904 : regno
>= FIRST_PSEUDO_REGISTER
))
1911 /* We can ignore CLOBBERs. */
1916 /* Ignore SETs whose result isn't used but not those that
1917 have side-effects. */
1918 if (find_reg_note (insn
, REG_UNUSED
, SET_DEST (elt
))
1919 && insn_nothrow_p (insn
)
1920 && !side_effects_p (elt
))
1923 /* If we have already found a SET, this is a second one and
1924 so we cannot combine with this insn. */
1932 /* Anything else means we can't combine. */
1938 /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1939 so don't do anything with it. */
1940 || GET_CODE (SET_SRC (set
)) == ASM_OPERANDS
)
1949 /* The simplification in expand_field_assignment may call back to
1950 get_last_value, so set safe guard here. */
1951 subst_low_luid
= DF_INSN_LUID (insn
);
1953 set
= expand_field_assignment (set
);
1954 src
= SET_SRC (set
), dest
= SET_DEST (set
);
1956 /* Do not eliminate user-specified register if it is in an
1957 asm input because we may break the register asm usage defined
1958 in GCC manual if allow to do so.
1959 Be aware that this may cover more cases than we expect but this
1960 should be harmless. */
1961 if (REG_P (dest
) && REG_USERVAR_P (dest
) && HARD_REGISTER_P (dest
)
1962 && extract_asm_operands (PATTERN (i3
)))
1965 /* Don't eliminate a store in the stack pointer. */
1966 if (dest
== stack_pointer_rtx
1967 /* Don't combine with an insn that sets a register to itself if it has
1968 a REG_EQUAL note. This may be part of a LIBCALL sequence. */
1969 || (rtx_equal_p (src
, dest
) && find_reg_note (insn
, REG_EQUAL
, NULL_RTX
))
1970 /* Can't merge an ASM_OPERANDS. */
1971 || GET_CODE (src
) == ASM_OPERANDS
1972 /* Can't merge a function call. */
1973 || GET_CODE (src
) == CALL
1974 /* Don't eliminate a function call argument. */
1976 && (find_reg_fusage (i3
, USE
, dest
)
1978 && REGNO (dest
) < FIRST_PSEUDO_REGISTER
1979 && global_regs
[REGNO (dest
)])))
1980 /* Don't substitute into an incremented register. */
1981 || FIND_REG_INC_NOTE (i3
, dest
)
1982 || (succ
&& FIND_REG_INC_NOTE (succ
, dest
))
1983 || (succ2
&& FIND_REG_INC_NOTE (succ2
, dest
))
1984 /* Don't substitute into a non-local goto, this confuses CFG. */
1985 || (JUMP_P (i3
) && find_reg_note (i3
, REG_NON_LOCAL_GOTO
, NULL_RTX
))
1986 /* Make sure that DEST is not used after INSN but before SUCC, or
1987 after SUCC and before SUCC2, or after SUCC2 but before I3. */
1990 && (reg_used_between_p (dest
, succ2
, i3
)
1991 || reg_used_between_p (dest
, succ
, succ2
)))
1992 || (!succ2
&& succ
&& reg_used_between_p (dest
, succ
, i3
))
1994 /* SUCC and SUCC2 can be split halves from a PARALLEL; in
1995 that case SUCC is not in the insn stream, so use SUCC2
1996 instead for this test. */
1997 && reg_used_between_p (dest
, insn
,
1999 && INSN_UID (succ
) == INSN_UID (succ2
)
2001 /* Make sure that the value that is to be substituted for the register
2002 does not use any registers whose values alter in between. However,
2003 If the insns are adjacent, a use can't cross a set even though we
2004 think it might (this can happen for a sequence of insns each setting
2005 the same destination; last_set of that register might point to
2006 a NOTE). If INSN has a REG_EQUIV note, the register is always
2007 equivalent to the memory so the substitution is valid even if there
2008 are intervening stores. Also, don't move a volatile asm or
2009 UNSPEC_VOLATILE across any other insns. */
2012 || ! find_reg_note (insn
, REG_EQUIV
, src
))
2013 && modified_between_p (src
, insn
, i3
))
2014 || (GET_CODE (src
) == ASM_OPERANDS
&& MEM_VOLATILE_P (src
))
2015 || GET_CODE (src
) == UNSPEC_VOLATILE
))
2016 /* Don't combine across a CALL_INSN, because that would possibly
2017 change whether the life span of some REGs crosses calls or not,
2018 and it is a pain to update that information.
2019 Exception: if source is a constant, moving it later can't hurt.
2020 Accept that as a special case. */
2021 || (DF_INSN_LUID (insn
) < last_call_luid
&& ! CONSTANT_P (src
)))
2024 /* DEST must either be a REG or CC0. */
2027 /* If register alignment is being enforced for multi-word items in all
2028 cases except for parameters, it is possible to have a register copy
2029 insn referencing a hard register that is not allowed to contain the
2030 mode being copied and which would not be valid as an operand of most
2031 insns. Eliminate this problem by not combining with such an insn.
2033 Also, on some machines we don't want to extend the life of a hard
2037 && ((REGNO (dest
) < FIRST_PSEUDO_REGISTER
2038 && !targetm
.hard_regno_mode_ok (REGNO (dest
), GET_MODE (dest
)))
2039 /* Don't extend the life of a hard register unless it is
2040 user variable (if we have few registers) or it can't
2041 fit into the desired register (meaning something special
2043 Also avoid substituting a return register into I3, because
2044 reload can't handle a conflict with constraints of other
2046 || (REGNO (src
) < FIRST_PSEUDO_REGISTER
2047 && !targetm
.hard_regno_mode_ok (REGNO (src
),
2051 else if (GET_CODE (dest
) != CC0
)
2055 if (GET_CODE (PATTERN (i3
)) == PARALLEL
)
2056 for (i
= XVECLEN (PATTERN (i3
), 0) - 1; i
>= 0; i
--)
2057 if (GET_CODE (XVECEXP (PATTERN (i3
), 0, i
)) == CLOBBER
)
2059 rtx reg
= XEXP (XVECEXP (PATTERN (i3
), 0, i
), 0);
2061 /* If the clobber represents an earlyclobber operand, we must not
2062 substitute an expression containing the clobbered register.
2063 As we do not analyze the constraint strings here, we have to
2064 make the conservative assumption. However, if the register is
2065 a fixed hard reg, the clobber cannot represent any operand;
2066 we leave it up to the machine description to either accept or
2067 reject use-and-clobber patterns. */
2069 || REGNO (reg
) >= FIRST_PSEUDO_REGISTER
2070 || !fixed_regs
[REGNO (reg
)])
2071 if (reg_overlap_mentioned_p (reg
, src
))
2075 /* If INSN contains anything volatile, or is an `asm' (whether volatile
2076 or not), reject, unless nothing volatile comes between it and I3 */
2078 if (GET_CODE (src
) == ASM_OPERANDS
|| volatile_refs_p (src
))
2080 /* Make sure neither succ nor succ2 contains a volatile reference. */
2081 if (succ2
!= 0 && volatile_refs_p (PATTERN (succ2
)))
2083 if (succ
!= 0 && volatile_refs_p (PATTERN (succ
)))
2085 /* We'll check insns between INSN and I3 below. */
2088 /* If INSN is an asm, and DEST is a hard register, reject, since it has
2089 to be an explicit register variable, and was chosen for a reason. */
2091 if (GET_CODE (src
) == ASM_OPERANDS
2092 && REG_P (dest
) && REGNO (dest
) < FIRST_PSEUDO_REGISTER
)
2095 /* If INSN contains volatile references (specifically volatile MEMs),
2096 we cannot combine across any other volatile references.
2097 Even if INSN doesn't contain volatile references, any intervening
2098 volatile insn might affect machine state. */
2100 is_volatile_p
= volatile_refs_p (PATTERN (insn
))
2104 for (p
= NEXT_INSN (insn
); p
!= i3
; p
= NEXT_INSN (p
))
2105 if (INSN_P (p
) && p
!= succ
&& p
!= succ2
&& is_volatile_p (PATTERN (p
)))
2108 /* If INSN contains an autoincrement or autodecrement, make sure that
2109 register is not used between there and I3, and not already used in
2110 I3 either. Neither must it be used in PRED or SUCC, if they exist.
2111 Also insist that I3 not be a jump; if it were one
2112 and the incremented register were spilled, we would lose. */
2115 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
2116 if (REG_NOTE_KIND (link
) == REG_INC
2118 || reg_used_between_p (XEXP (link
, 0), insn
, i3
)
2119 || (pred
!= NULL_RTX
2120 && reg_overlap_mentioned_p (XEXP (link
, 0), PATTERN (pred
)))
2121 || (pred2
!= NULL_RTX
2122 && reg_overlap_mentioned_p (XEXP (link
, 0), PATTERN (pred2
)))
2123 || (succ
!= NULL_RTX
2124 && reg_overlap_mentioned_p (XEXP (link
, 0), PATTERN (succ
)))
2125 || (succ2
!= NULL_RTX
2126 && reg_overlap_mentioned_p (XEXP (link
, 0), PATTERN (succ2
)))
2127 || reg_overlap_mentioned_p (XEXP (link
, 0), PATTERN (i3
))))
2130 /* Don't combine an insn that follows a CC0-setting insn.
2131 An insn that uses CC0 must not be separated from the one that sets it.
2132 We do, however, allow I2 to follow a CC0-setting insn if that insn
2133 is passed as I1; in that case it will be deleted also.
2134 We also allow combining in this case if all the insns are adjacent
2135 because that would leave the two CC0 insns adjacent as well.
2136 It would be more logical to test whether CC0 occurs inside I1 or I2,
2137 but that would be much slower, and this ought to be equivalent. */
2141 p
= prev_nonnote_insn (insn
);
2142 if (p
&& p
!= pred
&& NONJUMP_INSN_P (p
) && sets_cc0_p (PATTERN (p
))
2147 /* If we get here, we have passed all the tests and the combination is
2156 /* LOC is the location within I3 that contains its pattern or the component
2157 of a PARALLEL of the pattern. We validate that it is valid for combining.
2159 One problem is if I3 modifies its output, as opposed to replacing it
2160 entirely, we can't allow the output to contain I2DEST, I1DEST or I0DEST as
2161 doing so would produce an insn that is not equivalent to the original insns.
2165 (set (reg:DI 101) (reg:DI 100))
2166 (set (subreg:SI (reg:DI 101) 0) <foo>)
2168 This is NOT equivalent to:
2170 (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
2171 (set (reg:DI 101) (reg:DI 100))])
2173 Not only does this modify 100 (in which case it might still be valid
2174 if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
2176 We can also run into a problem if I2 sets a register that I1
2177 uses and I1 gets directly substituted into I3 (not via I2). In that
2178 case, we would be getting the wrong value of I2DEST into I3, so we
2179 must reject the combination. This case occurs when I2 and I1 both
2180 feed into I3, rather than when I1 feeds into I2, which feeds into I3.
2181 If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
2182 of a SET must prevent combination from occurring. The same situation
2183 can occur for I0, in which case I0_NOT_IN_SRC is set.
2185 Before doing the above check, we first try to expand a field assignment
2186 into a set of logical operations.
2188 If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
2189 we place a register that is both set and used within I3. If more than one
2190 such register is detected, we fail.
2192 Return 1 if the combination is valid, zero otherwise. */
2195 combinable_i3pat (rtx_insn
*i3
, rtx
*loc
, rtx i2dest
, rtx i1dest
, rtx i0dest
,
2196 int i1_not_in_src
, int i0_not_in_src
, rtx
*pi3dest_killed
)
2200 if (GET_CODE (x
) == SET
)
2203 rtx dest
= SET_DEST (set
);
2204 rtx src
= SET_SRC (set
);
2205 rtx inner_dest
= dest
;
2208 while (GET_CODE (inner_dest
) == STRICT_LOW_PART
2209 || GET_CODE (inner_dest
) == SUBREG
2210 || GET_CODE (inner_dest
) == ZERO_EXTRACT
)
2211 inner_dest
= XEXP (inner_dest
, 0);
2213 /* Check for the case where I3 modifies its output, as discussed
2214 above. We don't want to prevent pseudos from being combined
2215 into the address of a MEM, so only prevent the combination if
2216 i1 or i2 set the same MEM. */
2217 if ((inner_dest
!= dest
&&
2218 (!MEM_P (inner_dest
)
2219 || rtx_equal_p (i2dest
, inner_dest
)
2220 || (i1dest
&& rtx_equal_p (i1dest
, inner_dest
))
2221 || (i0dest
&& rtx_equal_p (i0dest
, inner_dest
)))
2222 && (reg_overlap_mentioned_p (i2dest
, inner_dest
)
2223 || (i1dest
&& reg_overlap_mentioned_p (i1dest
, inner_dest
))
2224 || (i0dest
&& reg_overlap_mentioned_p (i0dest
, inner_dest
))))
2226 /* This is the same test done in can_combine_p except we can't test
2227 all_adjacent; we don't have to, since this instruction will stay
2228 in place, thus we are not considering increasing the lifetime of
2231 Also, if this insn sets a function argument, combining it with
2232 something that might need a spill could clobber a previous
2233 function argument; the all_adjacent test in can_combine_p also
2234 checks this; here, we do a more specific test for this case. */
2236 || (REG_P (inner_dest
)
2237 && REGNO (inner_dest
) < FIRST_PSEUDO_REGISTER
2238 && !targetm
.hard_regno_mode_ok (REGNO (inner_dest
),
2239 GET_MODE (inner_dest
)))
2240 || (i1_not_in_src
&& reg_overlap_mentioned_p (i1dest
, src
))
2241 || (i0_not_in_src
&& reg_overlap_mentioned_p (i0dest
, src
)))
2244 /* If DEST is used in I3, it is being killed in this insn, so
2245 record that for later. We have to consider paradoxical
2246 subregs here, since they kill the whole register, but we
2247 ignore partial subregs, STRICT_LOW_PART, etc.
2248 Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
2249 STACK_POINTER_REGNUM, since these are always considered to be
2250 live. Similarly for ARG_POINTER_REGNUM if it is fixed. */
2252 if (GET_CODE (subdest
) == SUBREG
&& !partial_subreg_p (subdest
))
2253 subdest
= SUBREG_REG (subdest
);
2256 && reg_referenced_p (subdest
, PATTERN (i3
))
2257 && REGNO (subdest
) != FRAME_POINTER_REGNUM
2258 && (HARD_FRAME_POINTER_IS_FRAME_POINTER
2259 || REGNO (subdest
) != HARD_FRAME_POINTER_REGNUM
)
2260 && (FRAME_POINTER_REGNUM
== ARG_POINTER_REGNUM
2261 || (REGNO (subdest
) != ARG_POINTER_REGNUM
2262 || ! fixed_regs
[REGNO (subdest
)]))
2263 && REGNO (subdest
) != STACK_POINTER_REGNUM
)
2265 if (*pi3dest_killed
)
2268 *pi3dest_killed
= subdest
;
2272 else if (GET_CODE (x
) == PARALLEL
)
2276 for (i
= 0; i
< XVECLEN (x
, 0); i
++)
2277 if (! combinable_i3pat (i3
, &XVECEXP (x
, 0, i
), i2dest
, i1dest
, i0dest
,
2278 i1_not_in_src
, i0_not_in_src
, pi3dest_killed
))
2285 /* Return 1 if X is an arithmetic expression that contains a multiplication
2286 and division. We don't count multiplications by powers of two here. */
2289 contains_muldiv (rtx x
)
2291 switch (GET_CODE (x
))
2293 case MOD
: case DIV
: case UMOD
: case UDIV
:
2297 return ! (CONST_INT_P (XEXP (x
, 1))
2298 && pow2p_hwi (UINTVAL (XEXP (x
, 1))));
2301 return contains_muldiv (XEXP (x
, 0))
2302 || contains_muldiv (XEXP (x
, 1));
2305 return contains_muldiv (XEXP (x
, 0));
2311 /* Determine whether INSN can be used in a combination. Return nonzero if
2312 not. This is used in try_combine to detect early some cases where we
2313 can't perform combinations. */
2316 cant_combine_insn_p (rtx_insn
*insn
)
2321 /* If this isn't really an insn, we can't do anything.
2322 This can occur when flow deletes an insn that it has merged into an
2323 auto-increment address. */
2324 if (!NONDEBUG_INSN_P (insn
))
2327 /* Never combine loads and stores involving hard regs that are likely
2328 to be spilled. The register allocator can usually handle such
2329 reg-reg moves by tying. If we allow the combiner to make
2330 substitutions of likely-spilled regs, reload might die.
2331 As an exception, we allow combinations involving fixed regs; these are
2332 not available to the register allocator so there's no risk involved. */
2334 set
= single_set (insn
);
2337 src
= SET_SRC (set
);
2338 dest
= SET_DEST (set
);
2339 if (GET_CODE (src
) == SUBREG
)
2340 src
= SUBREG_REG (src
);
2341 if (GET_CODE (dest
) == SUBREG
)
2342 dest
= SUBREG_REG (dest
);
2343 if (REG_P (src
) && REG_P (dest
)
2344 && ((HARD_REGISTER_P (src
)
2345 && ! TEST_HARD_REG_BIT (fixed_reg_set
, REGNO (src
))
2346 && targetm
.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (src
))))
2347 || (HARD_REGISTER_P (dest
)
2348 && ! TEST_HARD_REG_BIT (fixed_reg_set
, REGNO (dest
))
2349 && targetm
.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (dest
))))))
2355 struct likely_spilled_retval_info
2357 unsigned regno
, nregs
;
2361 /* Called via note_stores by likely_spilled_retval_p. Remove from info->mask
2362 hard registers that are known to be written to / clobbered in full. */
2364 likely_spilled_retval_1 (rtx x
, const_rtx set
, void *data
)
2366 struct likely_spilled_retval_info
*const info
=
2367 (struct likely_spilled_retval_info
*) data
;
2368 unsigned regno
, nregs
;
2371 if (!REG_P (XEXP (set
, 0)))
2374 if (regno
>= info
->regno
+ info
->nregs
)
2376 nregs
= REG_NREGS (x
);
2377 if (regno
+ nregs
<= info
->regno
)
2379 new_mask
= (2U << (nregs
- 1)) - 1;
2380 if (regno
< info
->regno
)
2381 new_mask
>>= info
->regno
- regno
;
2383 new_mask
<<= regno
- info
->regno
;
2384 info
->mask
&= ~new_mask
;
2387 /* Return nonzero iff part of the return value is live during INSN, and
2388 it is likely spilled. This can happen when more than one insn is needed
2389 to copy the return value, e.g. when we consider to combine into the
2390 second copy insn for a complex value. */
2393 likely_spilled_retval_p (rtx_insn
*insn
)
2395 rtx_insn
*use
= BB_END (this_basic_block
);
2398 unsigned regno
, nregs
;
2399 /* We assume here that no machine mode needs more than
2400 32 hard registers when the value overlaps with a register
2401 for which TARGET_FUNCTION_VALUE_REGNO_P is true. */
2403 struct likely_spilled_retval_info info
;
2405 if (!NONJUMP_INSN_P (use
) || GET_CODE (PATTERN (use
)) != USE
|| insn
== use
)
2407 reg
= XEXP (PATTERN (use
), 0);
2408 if (!REG_P (reg
) || !targetm
.calls
.function_value_regno_p (REGNO (reg
)))
2410 regno
= REGNO (reg
);
2411 nregs
= REG_NREGS (reg
);
2414 mask
= (2U << (nregs
- 1)) - 1;
2416 /* Disregard parts of the return value that are set later. */
2420 for (p
= PREV_INSN (use
); info
.mask
&& p
!= insn
; p
= PREV_INSN (p
))
2422 note_stores (PATTERN (p
), likely_spilled_retval_1
, &info
);
2425 /* Check if any of the (probably) live return value registers is
2430 if ((mask
& 1 << nregs
)
2431 && targetm
.class_likely_spilled_p (REGNO_REG_CLASS (regno
+ nregs
)))
2437 /* Adjust INSN after we made a change to its destination.
2439 Changing the destination can invalidate notes that say something about
2440 the results of the insn and a LOG_LINK pointing to the insn. */
2443 adjust_for_new_dest (rtx_insn
*insn
)
2445 /* For notes, be conservative and simply remove them. */
2446 remove_reg_equal_equiv_notes (insn
);
2448 /* The new insn will have a destination that was previously the destination
2449 of an insn just above it. Call distribute_links to make a LOG_LINK from
2450 the next use of that destination. */
2452 rtx set
= single_set (insn
);
2455 rtx reg
= SET_DEST (set
);
2457 while (GET_CODE (reg
) == ZERO_EXTRACT
2458 || GET_CODE (reg
) == STRICT_LOW_PART
2459 || GET_CODE (reg
) == SUBREG
)
2460 reg
= XEXP (reg
, 0);
2461 gcc_assert (REG_P (reg
));
2463 distribute_links (alloc_insn_link (insn
, REGNO (reg
), NULL
));
2465 df_insn_rescan (insn
);
2468 /* Return TRUE if combine can reuse reg X in mode MODE.
2469 ADDED_SETS is nonzero if the original set is still required. */
2471 can_change_dest_mode (rtx x
, int added_sets
, machine_mode mode
)
2478 /* Don't change between modes with different underlying register sizes,
2479 since this could lead to invalid subregs. */
2480 if (maybe_ne (REGMODE_NATURAL_SIZE (mode
),
2481 REGMODE_NATURAL_SIZE (GET_MODE (x
))))
2485 /* Allow hard registers if the new mode is legal, and occupies no more
2486 registers than the old mode. */
2487 if (regno
< FIRST_PSEUDO_REGISTER
)
2488 return (targetm
.hard_regno_mode_ok (regno
, mode
)
2489 && REG_NREGS (x
) >= hard_regno_nregs (regno
, mode
));
2491 /* Or a pseudo that is only used once. */
2492 return (regno
< reg_n_sets_max
2493 && REG_N_SETS (regno
) == 1
2495 && !REG_USERVAR_P (x
));
2499 /* Check whether X, the destination of a set, refers to part of
2500 the register specified by REG. */
2503 reg_subword_p (rtx x
, rtx reg
)
2505 /* Check that reg is an integer mode register. */
2506 if (!REG_P (reg
) || GET_MODE_CLASS (GET_MODE (reg
)) != MODE_INT
)
2509 if (GET_CODE (x
) == STRICT_LOW_PART
2510 || GET_CODE (x
) == ZERO_EXTRACT
)
2513 return GET_CODE (x
) == SUBREG
2514 && SUBREG_REG (x
) == reg
2515 && GET_MODE_CLASS (GET_MODE (x
)) == MODE_INT
;
2518 /* Delete the unconditional jump INSN and adjust the CFG correspondingly.
2519 Note that the INSN should be deleted *after* removing dead edges, so
2520 that the kept edge is the fallthrough edge for a (set (pc) (pc))
2521 but not for a (set (pc) (label_ref FOO)). */
2524 update_cfg_for_uncondjump (rtx_insn
*insn
)
2526 basic_block bb
= BLOCK_FOR_INSN (insn
);
2527 gcc_assert (BB_END (bb
) == insn
);
2529 purge_dead_edges (bb
);
2532 if (EDGE_COUNT (bb
->succs
) == 1)
2536 single_succ_edge (bb
)->flags
|= EDGE_FALLTHRU
;
2538 /* Remove barriers from the footer if there are any. */
2539 for (insn
= BB_FOOTER (bb
); insn
; insn
= NEXT_INSN (insn
))
2540 if (BARRIER_P (insn
))
2542 if (PREV_INSN (insn
))
2543 SET_NEXT_INSN (PREV_INSN (insn
)) = NEXT_INSN (insn
);
2545 BB_FOOTER (bb
) = NEXT_INSN (insn
);
2546 if (NEXT_INSN (insn
))
2547 SET_PREV_INSN (NEXT_INSN (insn
)) = PREV_INSN (insn
);
2549 else if (LABEL_P (insn
))
2554 /* Return whether PAT is a PARALLEL of exactly N register SETs followed
2555 by an arbitrary number of CLOBBERs. */
2557 is_parallel_of_n_reg_sets (rtx pat
, int n
)
2559 if (GET_CODE (pat
) != PARALLEL
)
2562 int len
= XVECLEN (pat
, 0);
2567 for (i
= 0; i
< n
; i
++)
2568 if (GET_CODE (XVECEXP (pat
, 0, i
)) != SET
2569 || !REG_P (SET_DEST (XVECEXP (pat
, 0, i
))))
2571 for ( ; i
< len
; i
++)
2572 if (GET_CODE (XVECEXP (pat
, 0, i
)) != CLOBBER
2573 || XEXP (XVECEXP (pat
, 0, i
), 0) == const0_rtx
)
2579 /* Return whether INSN, a PARALLEL of N register SETs (and maybe some
2580 CLOBBERs), can be split into individual SETs in that order, without
2581 changing semantics. */
2583 can_split_parallel_of_n_reg_sets (rtx_insn
*insn
, int n
)
2585 if (!insn_nothrow_p (insn
))
2588 rtx pat
= PATTERN (insn
);
2591 for (i
= 0; i
< n
; i
++)
2593 if (side_effects_p (SET_SRC (XVECEXP (pat
, 0, i
))))
2596 rtx reg
= SET_DEST (XVECEXP (pat
, 0, i
));
2598 for (j
= i
+ 1; j
< n
; j
++)
2599 if (reg_referenced_p (reg
, XVECEXP (pat
, 0, j
)))
2606 /* Try to combine the insns I0, I1 and I2 into I3.
2607 Here I0, I1 and I2 appear earlier than I3.
2608 I0 and I1 can be zero; then we combine just I2 into I3, or I1 and I2 into
2611 If we are combining more than two insns and the resulting insn is not
2612 recognized, try splitting it into two insns. If that happens, I2 and I3
2613 are retained and I1/I0 are pseudo-deleted by turning them into a NOTE.
2614 Otherwise, I0, I1 and I2 are pseudo-deleted.
2616 Return 0 if the combination does not work. Then nothing is changed.
2617 If we did the combination, return the insn at which combine should
2620 Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
2621 new direct jump instruction.
2623 LAST_COMBINED_INSN is either I3, or some insn after I3 that has
2624 been I3 passed to an earlier try_combine within the same basic
2628 try_combine (rtx_insn
*i3
, rtx_insn
*i2
, rtx_insn
*i1
, rtx_insn
*i0
,
2629 int *new_direct_jump_p
, rtx_insn
*last_combined_insn
)
2631 /* New patterns for I3 and I2, respectively. */
2632 rtx newpat
, newi2pat
= 0;
2633 rtvec newpat_vec_with_clobbers
= 0;
2634 int substed_i2
= 0, substed_i1
= 0, substed_i0
= 0;
2635 /* Indicates need to preserve SET in I0, I1 or I2 in I3 if it is not
2637 int added_sets_0
, added_sets_1
, added_sets_2
;
2638 /* Total number of SETs to put into I3. */
2640 /* Nonzero if I2's or I1's body now appears in I3. */
2641 int i2_is_used
= 0, i1_is_used
= 0;
2642 /* INSN_CODEs for new I3, new I2, and user of condition code. */
2643 int insn_code_number
, i2_code_number
= 0, other_code_number
= 0;
2644 /* Contains I3 if the destination of I3 is used in its source, which means
2645 that the old life of I3 is being killed. If that usage is placed into
2646 I2 and not in I3, a REG_DEAD note must be made. */
2647 rtx i3dest_killed
= 0;
2648 /* SET_DEST and SET_SRC of I2, I1 and I0. */
2649 rtx i2dest
= 0, i2src
= 0, i1dest
= 0, i1src
= 0, i0dest
= 0, i0src
= 0;
2650 /* Copy of SET_SRC of I1 and I0, if needed. */
2651 rtx i1src_copy
= 0, i0src_copy
= 0, i0src_copy2
= 0;
2652 /* Set if I2DEST was reused as a scratch register. */
2653 bool i2scratch
= false;
2654 /* The PATTERNs of I0, I1, and I2, or a copy of them in certain cases. */
2655 rtx i0pat
= 0, i1pat
= 0, i2pat
= 0;
2656 /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC. */
2657 int i2dest_in_i2src
= 0, i1dest_in_i1src
= 0, i2dest_in_i1src
= 0;
2658 int i0dest_in_i0src
= 0, i1dest_in_i0src
= 0, i2dest_in_i0src
= 0;
2659 int i2dest_killed
= 0, i1dest_killed
= 0, i0dest_killed
= 0;
2660 int i1_feeds_i2_n
= 0, i0_feeds_i2_n
= 0, i0_feeds_i1_n
= 0;
2661 /* Notes that must be added to REG_NOTES in I3 and I2. */
2662 rtx new_i3_notes
, new_i2_notes
;
2663 /* Notes that we substituted I3 into I2 instead of the normal case. */
2664 int i3_subst_into_i2
= 0;
2665 /* Notes that I1, I2 or I3 is a MULT operation. */
2669 int changed_i3_dest
= 0;
2672 rtx_insn
*temp_insn
;
2674 struct insn_link
*link
;
2676 rtx new_other_notes
;
2678 scalar_int_mode dest_mode
, temp_mode
;
2680 /* Immediately return if any of I0,I1,I2 are the same insn (I3 can
2682 if (i1
== i2
|| i0
== i2
|| (i0
&& i0
== i1
))
2685 /* Only try four-insn combinations when there's high likelihood of
2686 success. Look for simple insns, such as loads of constants or
2687 binary operations involving a constant. */
2695 if (!flag_expensive_optimizations
)
2698 for (i
= 0; i
< 4; i
++)
2700 rtx_insn
*insn
= i
== 0 ? i0
: i
== 1 ? i1
: i
== 2 ? i2
: i3
;
2701 rtx set
= single_set (insn
);
2705 src
= SET_SRC (set
);
2706 if (CONSTANT_P (src
))
2711 else if (BINARY_P (src
) && CONSTANT_P (XEXP (src
, 1)))
2713 else if (GET_CODE (src
) == ASHIFT
|| GET_CODE (src
) == ASHIFTRT
2714 || GET_CODE (src
) == LSHIFTRT
)
2718 /* If I0 loads a memory and I3 sets the same memory, then I1 and I2
2719 are likely manipulating its value. Ideally we'll be able to combine
2720 all four insns into a bitfield insertion of some kind.
2722 Note the source in I0 might be inside a sign/zero extension and the
2723 memory modes in I0 and I3 might be different. So extract the address
2724 from the destination of I3 and search for it in the source of I0.
2726 In the event that there's a match but the source/dest do not actually
2727 refer to the same memory, the worst that happens is we try some
2728 combinations that we wouldn't have otherwise. */
2729 if ((set0
= single_set (i0
))
2730 /* Ensure the source of SET0 is a MEM, possibly buried inside
2732 && (GET_CODE (SET_SRC (set0
)) == MEM
2733 || ((GET_CODE (SET_SRC (set0
)) == ZERO_EXTEND
2734 || GET_CODE (SET_SRC (set0
)) == SIGN_EXTEND
)
2735 && GET_CODE (XEXP (SET_SRC (set0
), 0)) == MEM
))
2736 && (set3
= single_set (i3
))
2737 /* Ensure the destination of SET3 is a MEM. */
2738 && GET_CODE (SET_DEST (set3
)) == MEM
2739 /* Would it be better to extract the base address for the MEM
2740 in SET3 and look for that? I don't have cases where it matters
2741 but I could envision such cases. */
2742 && rtx_referenced_p (XEXP (SET_DEST (set3
), 0), SET_SRC (set0
)))
2745 if (ngood
< 2 && nshift
< 2)
2749 /* Exit early if one of the insns involved can't be used for
2752 || (i1
&& CALL_P (i1
))
2753 || (i0
&& CALL_P (i0
))
2754 || cant_combine_insn_p (i3
)
2755 || cant_combine_insn_p (i2
)
2756 || (i1
&& cant_combine_insn_p (i1
))
2757 || (i0
&& cant_combine_insn_p (i0
))
2758 || likely_spilled_retval_p (i3
))
2762 undobuf
.other_insn
= 0;
2764 /* Reset the hard register usage information. */
2765 CLEAR_HARD_REG_SET (newpat_used_regs
);
2767 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2770 fprintf (dump_file
, "\nTrying %d, %d, %d -> %d:\n",
2771 INSN_UID (i0
), INSN_UID (i1
), INSN_UID (i2
), INSN_UID (i3
));
2773 fprintf (dump_file
, "\nTrying %d, %d -> %d:\n",
2774 INSN_UID (i1
), INSN_UID (i2
), INSN_UID (i3
));
2776 fprintf (dump_file
, "\nTrying %d -> %d:\n",
2777 INSN_UID (i2
), INSN_UID (i3
));
2780 dump_insn_slim (dump_file
, i0
);
2782 dump_insn_slim (dump_file
, i1
);
2783 dump_insn_slim (dump_file
, i2
);
2784 dump_insn_slim (dump_file
, i3
);
2787 /* If multiple insns feed into one of I2 or I3, they can be in any
2788 order. To simplify the code below, reorder them in sequence. */
2789 if (i0
&& DF_INSN_LUID (i0
) > DF_INSN_LUID (i2
))
2791 if (i0
&& DF_INSN_LUID (i0
) > DF_INSN_LUID (i1
))
2793 if (i1
&& DF_INSN_LUID (i1
) > DF_INSN_LUID (i2
))
2796 added_links_insn
= 0;
2797 added_notes_insn
= 0;
2799 /* First check for one important special case that the code below will
2800 not handle. Namely, the case where I1 is zero, I2 is a PARALLEL
2801 and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case,
2802 we may be able to replace that destination with the destination of I3.
2803 This occurs in the common code where we compute both a quotient and
2804 remainder into a structure, in which case we want to do the computation
2805 directly into the structure to avoid register-register copies.
2807 Note that this case handles both multiple sets in I2 and also cases
2808 where I2 has a number of CLOBBERs inside the PARALLEL.
2810 We make very conservative checks below and only try to handle the
2811 most common cases of this. For example, we only handle the case
2812 where I2 and I3 are adjacent to avoid making difficult register
2815 if (i1
== 0 && NONJUMP_INSN_P (i3
) && GET_CODE (PATTERN (i3
)) == SET
2816 && REG_P (SET_SRC (PATTERN (i3
)))
2817 && REGNO (SET_SRC (PATTERN (i3
))) >= FIRST_PSEUDO_REGISTER
2818 && find_reg_note (i3
, REG_DEAD
, SET_SRC (PATTERN (i3
)))
2819 && GET_CODE (PATTERN (i2
)) == PARALLEL
2820 && ! side_effects_p (SET_DEST (PATTERN (i3
)))
2821 /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
2822 below would need to check what is inside (and reg_overlap_mentioned_p
2823 doesn't support those codes anyway). Don't allow those destinations;
2824 the resulting insn isn't likely to be recognized anyway. */
2825 && GET_CODE (SET_DEST (PATTERN (i3
))) != ZERO_EXTRACT
2826 && GET_CODE (SET_DEST (PATTERN (i3
))) != STRICT_LOW_PART
2827 && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3
)),
2828 SET_DEST (PATTERN (i3
)))
2829 && next_active_insn (i2
) == i3
)
2831 rtx p2
= PATTERN (i2
);
2833 /* Make sure that the destination of I3,
2834 which we are going to substitute into one output of I2,
2835 is not used within another output of I2. We must avoid making this:
2836 (parallel [(set (mem (reg 69)) ...)
2837 (set (reg 69) ...)])
2838 which is not well-defined as to order of actions.
2839 (Besides, reload can't handle output reloads for this.)
2841 The problem can also happen if the dest of I3 is a memory ref,
2842 if another dest in I2 is an indirect memory ref.
2844 Neither can this PARALLEL be an asm. We do not allow combining
2845 that usually (see can_combine_p), so do not here either. */
2847 for (i
= 0; ok
&& i
< XVECLEN (p2
, 0); i
++)
2849 if ((GET_CODE (XVECEXP (p2
, 0, i
)) == SET
2850 || GET_CODE (XVECEXP (p2
, 0, i
)) == CLOBBER
)
2851 && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3
)),
2852 SET_DEST (XVECEXP (p2
, 0, i
))))
2854 else if (GET_CODE (XVECEXP (p2
, 0, i
)) == SET
2855 && GET_CODE (SET_SRC (XVECEXP (p2
, 0, i
))) == ASM_OPERANDS
)
2860 for (i
= 0; i
< XVECLEN (p2
, 0); i
++)
2861 if (GET_CODE (XVECEXP (p2
, 0, i
)) == SET
2862 && SET_DEST (XVECEXP (p2
, 0, i
)) == SET_SRC (PATTERN (i3
)))
2867 subst_low_luid
= DF_INSN_LUID (i2
);
2869 added_sets_2
= added_sets_1
= added_sets_0
= 0;
2870 i2src
= SET_SRC (XVECEXP (p2
, 0, i
));
2871 i2dest
= SET_DEST (XVECEXP (p2
, 0, i
));
2872 i2dest_killed
= dead_or_set_p (i2
, i2dest
);
2874 /* Replace the dest in I2 with our dest and make the resulting
2875 insn the new pattern for I3. Then skip to where we validate
2876 the pattern. Everything was set up above. */
2877 SUBST (SET_DEST (XVECEXP (p2
, 0, i
)), SET_DEST (PATTERN (i3
)));
2879 i3_subst_into_i2
= 1;
2880 goto validate_replacement
;
2884 /* If I2 is setting a pseudo to a constant and I3 is setting some
2885 sub-part of it to another constant, merge them by making a new
2888 && (temp_expr
= single_set (i2
)) != 0
2889 && is_a
<scalar_int_mode
> (GET_MODE (SET_DEST (temp_expr
)), &temp_mode
)
2890 && CONST_SCALAR_INT_P (SET_SRC (temp_expr
))
2891 && GET_CODE (PATTERN (i3
)) == SET
2892 && CONST_SCALAR_INT_P (SET_SRC (PATTERN (i3
)))
2893 && reg_subword_p (SET_DEST (PATTERN (i3
)), SET_DEST (temp_expr
)))
2895 rtx dest
= SET_DEST (PATTERN (i3
));
2896 rtx temp_dest
= SET_DEST (temp_expr
);
2900 if (GET_CODE (dest
) == ZERO_EXTRACT
)
2902 if (CONST_INT_P (XEXP (dest
, 1))
2903 && CONST_INT_P (XEXP (dest
, 2))
2904 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (dest
, 0)),
2907 width
= INTVAL (XEXP (dest
, 1));
2908 offset
= INTVAL (XEXP (dest
, 2));
2909 dest
= XEXP (dest
, 0);
2910 if (BITS_BIG_ENDIAN
)
2911 offset
= GET_MODE_PRECISION (dest_mode
) - width
- offset
;
2916 if (GET_CODE (dest
) == STRICT_LOW_PART
)
2917 dest
= XEXP (dest
, 0);
2918 if (is_a
<scalar_int_mode
> (GET_MODE (dest
), &dest_mode
))
2920 width
= GET_MODE_PRECISION (dest_mode
);
2927 /* If this is the low part, we're done. */
2928 if (subreg_lowpart_p (dest
))
2930 /* Handle the case where inner is twice the size of outer. */
2931 else if (GET_MODE_PRECISION (temp_mode
)
2932 == 2 * GET_MODE_PRECISION (dest_mode
))
2933 offset
+= GET_MODE_PRECISION (dest_mode
);
2934 /* Otherwise give up for now. */
2941 rtx inner
= SET_SRC (PATTERN (i3
));
2942 rtx outer
= SET_SRC (temp_expr
);
2944 wide_int o
= wi::insert (rtx_mode_t (outer
, temp_mode
),
2945 rtx_mode_t (inner
, dest_mode
),
2950 subst_low_luid
= DF_INSN_LUID (i2
);
2951 added_sets_2
= added_sets_1
= added_sets_0
= 0;
2953 i2dest_killed
= dead_or_set_p (i2
, i2dest
);
2955 /* Replace the source in I2 with the new constant and make the
2956 resulting insn the new pattern for I3. Then skip to where we
2957 validate the pattern. Everything was set up above. */
2958 SUBST (SET_SRC (temp_expr
),
2959 immed_wide_int_const (o
, temp_mode
));
2961 newpat
= PATTERN (i2
);
2963 /* The dest of I3 has been replaced with the dest of I2. */
2964 changed_i3_dest
= 1;
2965 goto validate_replacement
;
2969 /* If we have no I1 and I2 looks like:
2970 (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
2972 make up a dummy I1 that is
2975 (set (reg:CC X) (compare:CC Y (const_int 0)))
2977 (We can ignore any trailing CLOBBERs.)
2979 This undoes a previous combination and allows us to match a branch-and-
2982 if (!HAVE_cc0
&& i1
== 0
2983 && is_parallel_of_n_reg_sets (PATTERN (i2
), 2)
2984 && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2
), 0, 0))))
2986 && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2
), 0, 0))) == COMPARE
2987 && XEXP (SET_SRC (XVECEXP (PATTERN (i2
), 0, 0)), 1) == const0_rtx
2988 && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2
), 0, 0)), 0),
2989 SET_SRC (XVECEXP (PATTERN (i2
), 0, 1)))
2990 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2
), 0, 0)), i2
, i3
)
2991 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2
), 0, 1)), i2
, i3
))
2993 /* We make I1 with the same INSN_UID as I2. This gives it
2994 the same DF_INSN_LUID for value tracking. Our fake I1 will
2995 never appear in the insn stream so giving it the same INSN_UID
2996 as I2 will not cause a problem. */
2998 i1
= gen_rtx_INSN (VOIDmode
, NULL
, i2
, BLOCK_FOR_INSN (i2
),
2999 XVECEXP (PATTERN (i2
), 0, 1), INSN_LOCATION (i2
),
3001 INSN_UID (i1
) = INSN_UID (i2
);
3003 SUBST (PATTERN (i2
), XVECEXP (PATTERN (i2
), 0, 0));
3004 SUBST (XEXP (SET_SRC (PATTERN (i2
)), 0),
3005 SET_DEST (PATTERN (i1
)));
3006 unsigned int regno
= REGNO (SET_DEST (PATTERN (i1
)));
3007 SUBST_LINK (LOG_LINKS (i2
),
3008 alloc_insn_link (i1
, regno
, LOG_LINKS (i2
)));
3011 /* If I2 is a PARALLEL of two SETs of REGs (and perhaps some CLOBBERs),
3012 make those two SETs separate I1 and I2 insns, and make an I0 that is
3014 if (!HAVE_cc0
&& i0
== 0
3015 && is_parallel_of_n_reg_sets (PATTERN (i2
), 2)
3016 && can_split_parallel_of_n_reg_sets (i2
, 2)
3017 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2
), 0, 0)), i2
, i3
)
3018 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2
), 0, 1)), i2
, i3
)
3019 && !reg_set_between_p (SET_DEST (XVECEXP (PATTERN (i2
), 0, 0)), i2
, i3
)
3020 && !reg_set_between_p (SET_DEST (XVECEXP (PATTERN (i2
), 0, 1)), i2
, i3
))
3022 /* If there is no I1, there is no I0 either. */
3025 /* We make I1 with the same INSN_UID as I2. This gives it
3026 the same DF_INSN_LUID for value tracking. Our fake I1 will
3027 never appear in the insn stream so giving it the same INSN_UID
3028 as I2 will not cause a problem. */
3030 i1
= gen_rtx_INSN (VOIDmode
, NULL
, i2
, BLOCK_FOR_INSN (i2
),
3031 XVECEXP (PATTERN (i2
), 0, 0), INSN_LOCATION (i2
),
3033 INSN_UID (i1
) = INSN_UID (i2
);
3035 SUBST (PATTERN (i2
), XVECEXP (PATTERN (i2
), 0, 1));
3038 /* Verify that I2 and maybe I1 and I0 can be combined into I3. */
3039 if (!can_combine_p (i2
, i3
, i0
, i1
, NULL
, NULL
, &i2dest
, &i2src
))
3042 fprintf (dump_file
, "Can't combine i2 into i3\n");
3046 if (i1
&& !can_combine_p (i1
, i3
, i0
, NULL
, i2
, NULL
, &i1dest
, &i1src
))
3049 fprintf (dump_file
, "Can't combine i1 into i3\n");
3053 if (i0
&& !can_combine_p (i0
, i3
, NULL
, NULL
, i1
, i2
, &i0dest
, &i0src
))
3056 fprintf (dump_file
, "Can't combine i0 into i3\n");
3061 /* Record whether I2DEST is used in I2SRC and similarly for the other
3062 cases. Knowing this will help in register status updating below. */
3063 i2dest_in_i2src
= reg_overlap_mentioned_p (i2dest
, i2src
);
3064 i1dest_in_i1src
= i1
&& reg_overlap_mentioned_p (i1dest
, i1src
);
3065 i2dest_in_i1src
= i1
&& reg_overlap_mentioned_p (i2dest
, i1src
);
3066 i0dest_in_i0src
= i0
&& reg_overlap_mentioned_p (i0dest
, i0src
);
3067 i1dest_in_i0src
= i0
&& reg_overlap_mentioned_p (i1dest
, i0src
);
3068 i2dest_in_i0src
= i0
&& reg_overlap_mentioned_p (i2dest
, i0src
);
3069 i2dest_killed
= dead_or_set_p (i2
, i2dest
);
3070 i1dest_killed
= i1
&& dead_or_set_p (i1
, i1dest
);
3071 i0dest_killed
= i0
&& dead_or_set_p (i0
, i0dest
);
3073 /* For the earlier insns, determine which of the subsequent ones they
3075 i1_feeds_i2_n
= i1
&& insn_a_feeds_b (i1
, i2
);
3076 i0_feeds_i1_n
= i0
&& insn_a_feeds_b (i0
, i1
);
3077 i0_feeds_i2_n
= (i0
&& (!i0_feeds_i1_n
? insn_a_feeds_b (i0
, i2
)
3078 : (!reg_overlap_mentioned_p (i1dest
, i0dest
)
3079 && reg_overlap_mentioned_p (i0dest
, i2src
))));
3081 /* Ensure that I3's pattern can be the destination of combines. */
3082 if (! combinable_i3pat (i3
, &PATTERN (i3
), i2dest
, i1dest
, i0dest
,
3083 i1
&& i2dest_in_i1src
&& !i1_feeds_i2_n
,
3084 i0
&& ((i2dest_in_i0src
&& !i0_feeds_i2_n
)
3085 || (i1dest_in_i0src
&& !i0_feeds_i1_n
)),
3092 /* See if any of the insns is a MULT operation. Unless one is, we will
3093 reject a combination that is, since it must be slower. Be conservative
3095 if (GET_CODE (i2src
) == MULT
3096 || (i1
!= 0 && GET_CODE (i1src
) == MULT
)
3097 || (i0
!= 0 && GET_CODE (i0src
) == MULT
)
3098 || (GET_CODE (PATTERN (i3
)) == SET
3099 && GET_CODE (SET_SRC (PATTERN (i3
))) == MULT
))
3102 /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
3103 We used to do this EXCEPT in one case: I3 has a post-inc in an
3104 output operand. However, that exception can give rise to insns like
3106 which is a famous insn on the PDP-11 where the value of r3 used as the
3107 source was model-dependent. Avoid this sort of thing. */
3110 if (!(GET_CODE (PATTERN (i3
)) == SET
3111 && REG_P (SET_SRC (PATTERN (i3
)))
3112 && MEM_P (SET_DEST (PATTERN (i3
)))
3113 && (GET_CODE (XEXP (SET_DEST (PATTERN (i3
)), 0)) == POST_INC
3114 || GET_CODE (XEXP (SET_DEST (PATTERN (i3
)), 0)) == POST_DEC
)))
3115 /* It's not the exception. */
3120 for (link
= REG_NOTES (i3
); link
; link
= XEXP (link
, 1))
3121 if (REG_NOTE_KIND (link
) == REG_INC
3122 && (reg_overlap_mentioned_p (XEXP (link
, 0), PATTERN (i2
))
3124 && reg_overlap_mentioned_p (XEXP (link
, 0), PATTERN (i1
)))))
3131 /* See if the SETs in I1 or I2 need to be kept around in the merged
3132 instruction: whenever the value set there is still needed past I3.
3133 For the SET in I2, this is easy: we see if I2DEST dies or is set in I3.
3135 For the SET in I1, we have two cases: if I1 and I2 independently feed
3136 into I3, the set in I1 needs to be kept around unless I1DEST dies
3137 or is set in I3. Otherwise (if I1 feeds I2 which feeds I3), the set
3138 in I1 needs to be kept around unless I1DEST dies or is set in either
3139 I2 or I3. The same considerations apply to I0. */
3141 added_sets_2
= !dead_or_set_p (i3
, i2dest
);
3144 added_sets_1
= !(dead_or_set_p (i3
, i1dest
)
3145 || (i1_feeds_i2_n
&& dead_or_set_p (i2
, i1dest
)));
3150 added_sets_0
= !(dead_or_set_p (i3
, i0dest
)
3151 || (i0_feeds_i1_n
&& dead_or_set_p (i1
, i0dest
))
3152 || ((i0_feeds_i2_n
|| (i0_feeds_i1_n
&& i1_feeds_i2_n
))
3153 && dead_or_set_p (i2
, i0dest
)));
3157 /* We are about to copy insns for the case where they need to be kept
3158 around. Check that they can be copied in the merged instruction. */
3160 if (targetm
.cannot_copy_insn_p
3161 && ((added_sets_2
&& targetm
.cannot_copy_insn_p (i2
))
3162 || (i1
&& added_sets_1
&& targetm
.cannot_copy_insn_p (i1
))
3163 || (i0
&& added_sets_0
&& targetm
.cannot_copy_insn_p (i0
))))
3169 /* If the set in I2 needs to be kept around, we must make a copy of
3170 PATTERN (I2), so that when we substitute I1SRC for I1DEST in
3171 PATTERN (I2), we are only substituting for the original I1DEST, not into
3172 an already-substituted copy. This also prevents making self-referential
3173 rtx. If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
3178 if (GET_CODE (PATTERN (i2
)) == PARALLEL
)
3179 i2pat
= gen_rtx_SET (i2dest
, copy_rtx (i2src
));
3181 i2pat
= copy_rtx (PATTERN (i2
));
3186 if (GET_CODE (PATTERN (i1
)) == PARALLEL
)
3187 i1pat
= gen_rtx_SET (i1dest
, copy_rtx (i1src
));
3189 i1pat
= copy_rtx (PATTERN (i1
));
3194 if (GET_CODE (PATTERN (i0
)) == PARALLEL
)
3195 i0pat
= gen_rtx_SET (i0dest
, copy_rtx (i0src
));
3197 i0pat
= copy_rtx (PATTERN (i0
));
3202 /* Substitute in the latest insn for the regs set by the earlier ones. */
3204 maxreg
= max_reg_num ();
3208 /* Many machines that don't use CC0 have insns that can both perform an
3209 arithmetic operation and set the condition code. These operations will
3210 be represented as a PARALLEL with the first element of the vector
3211 being a COMPARE of an arithmetic operation with the constant zero.
3212 The second element of the vector will set some pseudo to the result
3213 of the same arithmetic operation. If we simplify the COMPARE, we won't
3214 match such a pattern and so will generate an extra insn. Here we test
3215 for this case, where both the comparison and the operation result are
3216 needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
3217 I2SRC. Later we will make the PARALLEL that contains I2. */
3219 if (!HAVE_cc0
&& i1
== 0 && added_sets_2
&& GET_CODE (PATTERN (i3
)) == SET
3220 && GET_CODE (SET_SRC (PATTERN (i3
))) == COMPARE
3221 && CONST_INT_P (XEXP (SET_SRC (PATTERN (i3
)), 1))
3222 && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3
)), 0), i2dest
))
3225 rtx
*cc_use_loc
= NULL
;
3226 rtx_insn
*cc_use_insn
= NULL
;
3227 rtx op0
= i2src
, op1
= XEXP (SET_SRC (PATTERN (i3
)), 1);
3228 machine_mode compare_mode
, orig_compare_mode
;
3229 enum rtx_code compare_code
= UNKNOWN
, orig_compare_code
= UNKNOWN
;
3230 scalar_int_mode mode
;
3232 newpat
= PATTERN (i3
);
3233 newpat_dest
= SET_DEST (newpat
);
3234 compare_mode
= orig_compare_mode
= GET_MODE (newpat_dest
);
3236 if (undobuf
.other_insn
== 0
3237 && (cc_use_loc
= find_single_use (SET_DEST (newpat
), i3
,
3240 compare_code
= orig_compare_code
= GET_CODE (*cc_use_loc
);
3241 if (is_a
<scalar_int_mode
> (GET_MODE (i2dest
), &mode
))
3242 compare_code
= simplify_compare_const (compare_code
, mode
,
3244 target_canonicalize_comparison (&compare_code
, &op0
, &op1
, 1);
3247 /* Do the rest only if op1 is const0_rtx, which may be the
3248 result of simplification. */
3249 if (op1
== const0_rtx
)
3251 /* If a single use of the CC is found, prepare to modify it
3252 when SELECT_CC_MODE returns a new CC-class mode, or when
3253 the above simplify_compare_const() returned a new comparison
3254 operator. undobuf.other_insn is assigned the CC use insn
3255 when modifying it. */
3258 #ifdef SELECT_CC_MODE
3259 machine_mode new_mode
3260 = SELECT_CC_MODE (compare_code
, op0
, op1
);
3261 if (new_mode
!= orig_compare_mode
3262 && can_change_dest_mode (SET_DEST (newpat
),
3263 added_sets_2
, new_mode
))
3265 unsigned int regno
= REGNO (newpat_dest
);
3266 compare_mode
= new_mode
;
3267 if (regno
< FIRST_PSEUDO_REGISTER
)
3268 newpat_dest
= gen_rtx_REG (compare_mode
, regno
);
3271 SUBST_MODE (regno_reg_rtx
[regno
], compare_mode
);
3272 newpat_dest
= regno_reg_rtx
[regno
];
3276 /* Cases for modifying the CC-using comparison. */
3277 if (compare_code
!= orig_compare_code
3278 /* ??? Do we need to verify the zero rtx? */
3279 && XEXP (*cc_use_loc
, 1) == const0_rtx
)
3281 /* Replace cc_use_loc with entire new RTX. */
3283 gen_rtx_fmt_ee (compare_code
, compare_mode
,
3284 newpat_dest
, const0_rtx
));
3285 undobuf
.other_insn
= cc_use_insn
;
3287 else if (compare_mode
!= orig_compare_mode
)
3289 /* Just replace the CC reg with a new mode. */
3290 SUBST (XEXP (*cc_use_loc
, 0), newpat_dest
);
3291 undobuf
.other_insn
= cc_use_insn
;
3295 /* Now we modify the current newpat:
3296 First, SET_DEST(newpat) is updated if the CC mode has been
3297 altered. For targets without SELECT_CC_MODE, this should be
3299 if (compare_mode
!= orig_compare_mode
)
3300 SUBST (SET_DEST (newpat
), newpat_dest
);
3301 /* This is always done to propagate i2src into newpat. */
3302 SUBST (SET_SRC (newpat
),
3303 gen_rtx_COMPARE (compare_mode
, op0
, op1
));
3304 /* Create new version of i2pat if needed; the below PARALLEL
3305 creation needs this to work correctly. */
3306 if (! rtx_equal_p (i2src
, op0
))
3307 i2pat
= gen_rtx_SET (i2dest
, op0
);
3312 if (i2_is_used
== 0)
3314 /* It is possible that the source of I2 or I1 may be performing
3315 an unneeded operation, such as a ZERO_EXTEND of something
3316 that is known to have the high part zero. Handle that case
3317 by letting subst look at the inner insns.
3319 Another way to do this would be to have a function that tries
3320 to simplify a single insn instead of merging two or more
3321 insns. We don't do this because of the potential of infinite
3322 loops and because of the potential extra memory required.
3323 However, doing it the way we are is a bit of a kludge and
3324 doesn't catch all cases.
3326 But only do this if -fexpensive-optimizations since it slows
3327 things down and doesn't usually win.
3329 This is not done in the COMPARE case above because the
3330 unmodified I2PAT is used in the PARALLEL and so a pattern
3331 with a modified I2SRC would not match. */
3333 if (flag_expensive_optimizations
)
3335 /* Pass pc_rtx so no substitutions are done, just
3339 subst_low_luid
= DF_INSN_LUID (i1
);
3340 i1src
= subst (i1src
, pc_rtx
, pc_rtx
, 0, 0, 0);
3343 subst_low_luid
= DF_INSN_LUID (i2
);
3344 i2src
= subst (i2src
, pc_rtx
, pc_rtx
, 0, 0, 0);
3347 n_occurrences
= 0; /* `subst' counts here */
3348 subst_low_luid
= DF_INSN_LUID (i2
);
3350 /* If I1 feeds into I2 and I1DEST is in I1SRC, we need to make a unique
3351 copy of I2SRC each time we substitute it, in order to avoid creating
3352 self-referential RTL when we will be substituting I1SRC for I1DEST
3353 later. Likewise if I0 feeds into I2, either directly or indirectly
3354 through I1, and I0DEST is in I0SRC. */
3355 newpat
= subst (PATTERN (i3
), i2dest
, i2src
, 0, 0,
3356 (i1_feeds_i2_n
&& i1dest_in_i1src
)
3357 || ((i0_feeds_i2_n
|| (i0_feeds_i1_n
&& i1_feeds_i2_n
))
3358 && i0dest_in_i0src
));
3361 /* Record whether I2's body now appears within I3's body. */
3362 i2_is_used
= n_occurrences
;
3365 /* If we already got a failure, don't try to do more. Otherwise, try to
3366 substitute I1 if we have it. */
3368 if (i1
&& GET_CODE (newpat
) != CLOBBER
)
3370 /* Check that an autoincrement side-effect on I1 has not been lost.
3371 This happens if I1DEST is mentioned in I2 and dies there, and
3372 has disappeared from the new pattern. */
3373 if ((FIND_REG_INC_NOTE (i1
, NULL_RTX
) != 0
3375 && dead_or_set_p (i2
, i1dest
)
3376 && !reg_overlap_mentioned_p (i1dest
, newpat
))
3377 /* Before we can do this substitution, we must redo the test done
3378 above (see detailed comments there) that ensures I1DEST isn't
3379 mentioned in any SETs in NEWPAT that are field assignments. */
3380 || !combinable_i3pat (NULL
, &newpat
, i1dest
, NULL_RTX
, NULL_RTX
,
3388 subst_low_luid
= DF_INSN_LUID (i1
);
3390 /* If the following substitution will modify I1SRC, make a copy of it
3391 for the case where it is substituted for I1DEST in I2PAT later. */
3392 if (added_sets_2
&& i1_feeds_i2_n
)
3393 i1src_copy
= copy_rtx (i1src
);
3395 /* If I0 feeds into I1 and I0DEST is in I0SRC, we need to make a unique
3396 copy of I1SRC each time we substitute it, in order to avoid creating
3397 self-referential RTL when we will be substituting I0SRC for I0DEST
3399 newpat
= subst (newpat
, i1dest
, i1src
, 0, 0,
3400 i0_feeds_i1_n
&& i0dest_in_i0src
);
3403 /* Record whether I1's body now appears within I3's body. */
3404 i1_is_used
= n_occurrences
;
3407 /* Likewise for I0 if we have it. */
3409 if (i0
&& GET_CODE (newpat
) != CLOBBER
)
3411 if ((FIND_REG_INC_NOTE (i0
, NULL_RTX
) != 0
3412 && ((i0_feeds_i2_n
&& dead_or_set_p (i2
, i0dest
))
3413 || (i0_feeds_i1_n
&& dead_or_set_p (i1
, i0dest
)))
3414 && !reg_overlap_mentioned_p (i0dest
, newpat
))
3415 || !combinable_i3pat (NULL
, &newpat
, i0dest
, NULL_RTX
, NULL_RTX
,
3422 /* If the following substitution will modify I0SRC, make a copy of it
3423 for the case where it is substituted for I0DEST in I1PAT later. */
3424 if (added_sets_1
&& i0_feeds_i1_n
)
3425 i0src_copy
= copy_rtx (i0src
);
3426 /* And a copy for I0DEST in I2PAT substitution. */
3427 if (added_sets_2
&& ((i0_feeds_i1_n
&& i1_feeds_i2_n
)
3428 || (i0_feeds_i2_n
)))
3429 i0src_copy2
= copy_rtx (i0src
);
3432 subst_low_luid
= DF_INSN_LUID (i0
);
3433 newpat
= subst (newpat
, i0dest
, i0src
, 0, 0, 0);
3437 /* Fail if an autoincrement side-effect has been duplicated. Be careful
3438 to count all the ways that I2SRC and I1SRC can be used. */
3439 if ((FIND_REG_INC_NOTE (i2
, NULL_RTX
) != 0
3440 && i2_is_used
+ added_sets_2
> 1)
3441 || (i1
!= 0 && FIND_REG_INC_NOTE (i1
, NULL_RTX
) != 0
3442 && (i1_is_used
+ added_sets_1
+ (added_sets_2
&& i1_feeds_i2_n
)
3444 || (i0
!= 0 && FIND_REG_INC_NOTE (i0
, NULL_RTX
) != 0
3445 && (n_occurrences
+ added_sets_0
3446 + (added_sets_1
&& i0_feeds_i1_n
)
3447 + (added_sets_2
&& i0_feeds_i2_n
)
3449 /* Fail if we tried to make a new register. */
3450 || max_reg_num () != maxreg
3451 /* Fail if we couldn't do something and have a CLOBBER. */
3452 || GET_CODE (newpat
) == CLOBBER
3453 /* Fail if this new pattern is a MULT and we didn't have one before
3454 at the outer level. */
3455 || (GET_CODE (newpat
) == SET
&& GET_CODE (SET_SRC (newpat
)) == MULT
3462 /* If the actions of the earlier insns must be kept
3463 in addition to substituting them into the latest one,
3464 we must make a new PARALLEL for the latest insn
3465 to hold additional the SETs. */
3467 if (added_sets_0
|| added_sets_1
|| added_sets_2
)
3469 int extra_sets
= added_sets_0
+ added_sets_1
+ added_sets_2
;
3472 if (GET_CODE (newpat
) == PARALLEL
)
3474 rtvec old
= XVEC (newpat
, 0);
3475 total_sets
= XVECLEN (newpat
, 0) + extra_sets
;
3476 newpat
= gen_rtx_PARALLEL (VOIDmode
, rtvec_alloc (total_sets
));
3477 memcpy (XVEC (newpat
, 0)->elem
, &old
->elem
[0],
3478 sizeof (old
->elem
[0]) * old
->num_elem
);
3483 total_sets
= 1 + extra_sets
;
3484 newpat
= gen_rtx_PARALLEL (VOIDmode
, rtvec_alloc (total_sets
));
3485 XVECEXP (newpat
, 0, 0) = old
;
3489 XVECEXP (newpat
, 0, --total_sets
) = i0pat
;
3495 t
= subst (t
, i0dest
, i0src_copy
? i0src_copy
: i0src
, 0, 0, 0);
3497 XVECEXP (newpat
, 0, --total_sets
) = t
;
3503 t
= subst (t
, i1dest
, i1src_copy
? i1src_copy
: i1src
, 0, 0,
3504 i0_feeds_i1_n
&& i0dest_in_i0src
);
3505 if ((i0_feeds_i1_n
&& i1_feeds_i2_n
) || i0_feeds_i2_n
)
3506 t
= subst (t
, i0dest
, i0src_copy2
? i0src_copy2
: i0src
, 0, 0, 0);
3508 XVECEXP (newpat
, 0, --total_sets
) = t
;
3512 validate_replacement
:
3514 /* Note which hard regs this insn has as inputs. */
3515 mark_used_regs_combine (newpat
);
3517 /* If recog_for_combine fails, it strips existing clobbers. If we'll
3518 consider splitting this pattern, we might need these clobbers. */
3519 if (i1
&& GET_CODE (newpat
) == PARALLEL
3520 && GET_CODE (XVECEXP (newpat
, 0, XVECLEN (newpat
, 0) - 1)) == CLOBBER
)
3522 int len
= XVECLEN (newpat
, 0);
3524 newpat_vec_with_clobbers
= rtvec_alloc (len
);
3525 for (i
= 0; i
< len
; i
++)
3526 RTVEC_ELT (newpat_vec_with_clobbers
, i
) = XVECEXP (newpat
, 0, i
);
3529 /* We have recognized nothing yet. */
3530 insn_code_number
= -1;
3532 /* See if this is a PARALLEL of two SETs where one SET's destination is
3533 a register that is unused and this isn't marked as an instruction that
3534 might trap in an EH region. In that case, we just need the other SET.
3535 We prefer this over the PARALLEL.
3537 This can occur when simplifying a divmod insn. We *must* test for this
3538 case here because the code below that splits two independent SETs doesn't
3539 handle this case correctly when it updates the register status.
3541 It's pointless doing this if we originally had two sets, one from
3542 i3, and one from i2. Combining then splitting the parallel results
3543 in the original i2 again plus an invalid insn (which we delete).
3544 The net effect is only to move instructions around, which makes
3545 debug info less accurate.
3547 If the remaining SET came from I2 its destination should not be used
3548 between I2 and I3. See PR82024. */
3550 if (!(added_sets_2
&& i1
== 0)
3551 && is_parallel_of_n_reg_sets (newpat
, 2)
3552 && asm_noperands (newpat
) < 0)
3554 rtx set0
= XVECEXP (newpat
, 0, 0);
3555 rtx set1
= XVECEXP (newpat
, 0, 1);
3556 rtx oldpat
= newpat
;
3558 if (((REG_P (SET_DEST (set1
))
3559 && find_reg_note (i3
, REG_UNUSED
, SET_DEST (set1
)))
3560 || (GET_CODE (SET_DEST (set1
)) == SUBREG
3561 && find_reg_note (i3
, REG_UNUSED
, SUBREG_REG (SET_DEST (set1
)))))
3562 && insn_nothrow_p (i3
)
3563 && !side_effects_p (SET_SRC (set1
)))
3566 insn_code_number
= recog_for_combine (&newpat
, i3
, &new_i3_notes
);
3569 else if (((REG_P (SET_DEST (set0
))
3570 && find_reg_note (i3
, REG_UNUSED
, SET_DEST (set0
)))
3571 || (GET_CODE (SET_DEST (set0
)) == SUBREG
3572 && find_reg_note (i3
, REG_UNUSED
,
3573 SUBREG_REG (SET_DEST (set0
)))))
3574 && insn_nothrow_p (i3
)
3575 && !side_effects_p (SET_SRC (set0
)))
3577 rtx dest
= SET_DEST (set1
);
3578 if (GET_CODE (dest
) == SUBREG
)
3579 dest
= SUBREG_REG (dest
);
3580 if (!reg_used_between_p (dest
, i2
, i3
))
3583 insn_code_number
= recog_for_combine (&newpat
, i3
, &new_i3_notes
);
3585 if (insn_code_number
>= 0)
3586 changed_i3_dest
= 1;
3590 if (insn_code_number
< 0)
3594 /* Is the result of combination a valid instruction? */
3595 if (insn_code_number
< 0)
3596 insn_code_number
= recog_for_combine (&newpat
, i3
, &new_i3_notes
);
3598 /* If we were combining three insns and the result is a simple SET
3599 with no ASM_OPERANDS that wasn't recognized, try to split it into two
3600 insns. There are two ways to do this. It can be split using a
3601 machine-specific method (like when you have an addition of a large
3602 constant) or by combine in the function find_split_point. */
3604 if (i1
&& insn_code_number
< 0 && GET_CODE (newpat
) == SET
3605 && asm_noperands (newpat
) < 0)
3607 rtx parallel
, *split
;
3608 rtx_insn
*m_split_insn
;
3610 /* See if the MD file can split NEWPAT. If it can't, see if letting it
3611 use I2DEST as a scratch register will help. In the latter case,
3612 convert I2DEST to the mode of the source of NEWPAT if we can. */
3614 m_split_insn
= combine_split_insns (newpat
, i3
);
3616 /* We can only use I2DEST as a scratch reg if it doesn't overlap any
3617 inputs of NEWPAT. */
3619 /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
3620 possible to try that as a scratch reg. This would require adding
3621 more code to make it work though. */
3623 if (m_split_insn
== 0 && ! reg_overlap_mentioned_p (i2dest
, newpat
))
3625 machine_mode new_mode
= GET_MODE (SET_DEST (newpat
));
3627 /* ??? Reusing i2dest without resetting the reg_stat entry for it
3628 (temporarily, until we are committed to this instruction
3629 combination) does not work: for example, any call to nonzero_bits
3630 on the register (from a splitter in the MD file, for example)
3631 will get the old information, which is invalid.
3633 Since nowadays we can create registers during combine just fine,
3634 we should just create a new one here, not reuse i2dest. */
3636 /* First try to split using the original register as a
3637 scratch register. */
3638 parallel
= gen_rtx_PARALLEL (VOIDmode
,
3639 gen_rtvec (2, newpat
,
3640 gen_rtx_CLOBBER (VOIDmode
,
3642 m_split_insn
= combine_split_insns (parallel
, i3
);
3644 /* If that didn't work, try changing the mode of I2DEST if
3646 if (m_split_insn
== 0
3647 && new_mode
!= GET_MODE (i2dest
)
3648 && new_mode
!= VOIDmode
3649 && can_change_dest_mode (i2dest
, added_sets_2
, new_mode
))
3651 machine_mode old_mode
= GET_MODE (i2dest
);
3654 if (REGNO (i2dest
) < FIRST_PSEUDO_REGISTER
)
3655 ni2dest
= gen_rtx_REG (new_mode
, REGNO (i2dest
));
3658 SUBST_MODE (regno_reg_rtx
[REGNO (i2dest
)], new_mode
);
3659 ni2dest
= regno_reg_rtx
[REGNO (i2dest
)];
3662 parallel
= (gen_rtx_PARALLEL
3664 gen_rtvec (2, newpat
,
3665 gen_rtx_CLOBBER (VOIDmode
,
3667 m_split_insn
= combine_split_insns (parallel
, i3
);
3669 if (m_split_insn
== 0
3670 && REGNO (i2dest
) >= FIRST_PSEUDO_REGISTER
)
3674 adjust_reg_mode (regno_reg_rtx
[REGNO (i2dest
)], old_mode
);
3675 buf
= undobuf
.undos
;
3676 undobuf
.undos
= buf
->next
;
3677 buf
->next
= undobuf
.frees
;
3678 undobuf
.frees
= buf
;
3682 i2scratch
= m_split_insn
!= 0;
3685 /* If recog_for_combine has discarded clobbers, try to use them
3686 again for the split. */
3687 if (m_split_insn
== 0 && newpat_vec_with_clobbers
)
3689 parallel
= gen_rtx_PARALLEL (VOIDmode
, newpat_vec_with_clobbers
);
3690 m_split_insn
= combine_split_insns (parallel
, i3
);
3693 if (m_split_insn
&& NEXT_INSN (m_split_insn
) == NULL_RTX
)
3695 rtx m_split_pat
= PATTERN (m_split_insn
);
3696 insn_code_number
= recog_for_combine (&m_split_pat
, i3
, &new_i3_notes
);
3697 if (insn_code_number
>= 0)
3698 newpat
= m_split_pat
;
3700 else if (m_split_insn
&& NEXT_INSN (NEXT_INSN (m_split_insn
)) == NULL_RTX
3701 && (next_nonnote_nondebug_insn (i2
) == i3
3702 || !modified_between_p (PATTERN (m_split_insn
), i2
, i3
)))
3705 rtx newi3pat
= PATTERN (NEXT_INSN (m_split_insn
));
3706 newi2pat
= PATTERN (m_split_insn
);
3708 i3set
= single_set (NEXT_INSN (m_split_insn
));
3709 i2set
= single_set (m_split_insn
);
3711 i2_code_number
= recog_for_combine (&newi2pat
, i2
, &new_i2_notes
);
3713 /* If I2 or I3 has multiple SETs, we won't know how to track
3714 register status, so don't use these insns. If I2's destination
3715 is used between I2 and I3, we also can't use these insns. */
3717 if (i2_code_number
>= 0 && i2set
&& i3set
3718 && (next_nonnote_nondebug_insn (i2
) == i3
3719 || ! reg_used_between_p (SET_DEST (i2set
), i2
, i3
)))
3720 insn_code_number
= recog_for_combine (&newi3pat
, i3
,
3722 if (insn_code_number
>= 0)
3725 /* It is possible that both insns now set the destination of I3.
3726 If so, we must show an extra use of it. */
3728 if (insn_code_number
>= 0)
3730 rtx new_i3_dest
= SET_DEST (i3set
);
3731 rtx new_i2_dest
= SET_DEST (i2set
);
3733 while (GET_CODE (new_i3_dest
) == ZERO_EXTRACT
3734 || GET_CODE (new_i3_dest
) == STRICT_LOW_PART
3735 || GET_CODE (new_i3_dest
) == SUBREG
)
3736 new_i3_dest
= XEXP (new_i3_dest
, 0);
3738 while (GET_CODE (new_i2_dest
) == ZERO_EXTRACT
3739 || GET_CODE (new_i2_dest
) == STRICT_LOW_PART
3740 || GET_CODE (new_i2_dest
) == SUBREG
)
3741 new_i2_dest
= XEXP (new_i2_dest
, 0);
3743 if (REG_P (new_i3_dest
)
3744 && REG_P (new_i2_dest
)
3745 && REGNO (new_i3_dest
) == REGNO (new_i2_dest
)
3746 && REGNO (new_i2_dest
) < reg_n_sets_max
)
3747 INC_REG_N_SETS (REGNO (new_i2_dest
), 1);
3751 /* If we can split it and use I2DEST, go ahead and see if that
3752 helps things be recognized. Verify that none of the registers
3753 are set between I2 and I3. */
3754 if (insn_code_number
< 0
3755 && (split
= find_split_point (&newpat
, i3
, false)) != 0
3756 && (!HAVE_cc0
|| REG_P (i2dest
))
3757 /* We need I2DEST in the proper mode. If it is a hard register
3758 or the only use of a pseudo, we can change its mode.
3759 Make sure we don't change a hard register to have a mode that
3760 isn't valid for it, or change the number of registers. */
3761 && (GET_MODE (*split
) == GET_MODE (i2dest
)
3762 || GET_MODE (*split
) == VOIDmode
3763 || can_change_dest_mode (i2dest
, added_sets_2
,
3765 && (next_nonnote_nondebug_insn (i2
) == i3
3766 || !modified_between_p (*split
, i2
, i3
))
3767 /* We can't overwrite I2DEST if its value is still used by
3769 && ! reg_referenced_p (i2dest
, newpat
))
3771 rtx newdest
= i2dest
;
3772 enum rtx_code split_code
= GET_CODE (*split
);
3773 machine_mode split_mode
= GET_MODE (*split
);
3774 bool subst_done
= false;
3775 newi2pat
= NULL_RTX
;
3779 /* *SPLIT may be part of I2SRC, so make sure we have the
3780 original expression around for later debug processing.
3781 We should not need I2SRC any more in other cases. */
3782 if (MAY_HAVE_DEBUG_BIND_INSNS
)
3783 i2src
= copy_rtx (i2src
);
3787 /* Get NEWDEST as a register in the proper mode. We have already
3788 validated that we can do this. */
3789 if (GET_MODE (i2dest
) != split_mode
&& split_mode
!= VOIDmode
)
3791 if (REGNO (i2dest
) < FIRST_PSEUDO_REGISTER
)
3792 newdest
= gen_rtx_REG (split_mode
, REGNO (i2dest
));
3795 SUBST_MODE (regno_reg_rtx
[REGNO (i2dest
)], split_mode
);
3796 newdest
= regno_reg_rtx
[REGNO (i2dest
)];
3800 /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
3801 an ASHIFT. This can occur if it was inside a PLUS and hence
3802 appeared to be a memory address. This is a kludge. */
3803 if (split_code
== MULT
3804 && CONST_INT_P (XEXP (*split
, 1))
3805 && INTVAL (XEXP (*split
, 1)) > 0
3806 && (i
= exact_log2 (UINTVAL (XEXP (*split
, 1)))) >= 0)
3808 rtx i_rtx
= gen_int_shift_amount (split_mode
, i
);
3809 SUBST (*split
, gen_rtx_ASHIFT (split_mode
,
3810 XEXP (*split
, 0), i_rtx
));
3811 /* Update split_code because we may not have a multiply
3813 split_code
= GET_CODE (*split
);
3816 /* Similarly for (plus (mult FOO (const_int pow2))). */
3817 if (split_code
== PLUS
3818 && GET_CODE (XEXP (*split
, 0)) == MULT
3819 && CONST_INT_P (XEXP (XEXP (*split
, 0), 1))
3820 && INTVAL (XEXP (XEXP (*split
, 0), 1)) > 0
3821 && (i
= exact_log2 (UINTVAL (XEXP (XEXP (*split
, 0), 1)))) >= 0)
3823 rtx nsplit
= XEXP (*split
, 0);
3824 rtx i_rtx
= gen_int_shift_amount (GET_MODE (nsplit
), i
);
3825 SUBST (XEXP (*split
, 0), gen_rtx_ASHIFT (GET_MODE (nsplit
),
3828 /* Update split_code because we may not have a multiply
3830 split_code
= GET_CODE (*split
);
3833 #ifdef INSN_SCHEDULING
3834 /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
3835 be written as a ZERO_EXTEND. */
3836 if (split_code
== SUBREG
&& MEM_P (SUBREG_REG (*split
)))
3838 /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
3839 what it really is. */
3840 if (load_extend_op (GET_MODE (SUBREG_REG (*split
)))
3842 SUBST (*split
, gen_rtx_SIGN_EXTEND (split_mode
,
3843 SUBREG_REG (*split
)));
3845 SUBST (*split
, gen_rtx_ZERO_EXTEND (split_mode
,
3846 SUBREG_REG (*split
)));
3850 /* Attempt to split binary operators using arithmetic identities. */
3851 if (BINARY_P (SET_SRC (newpat
))
3852 && split_mode
== GET_MODE (SET_SRC (newpat
))
3853 && ! side_effects_p (SET_SRC (newpat
)))
3855 rtx setsrc
= SET_SRC (newpat
);
3856 machine_mode mode
= GET_MODE (setsrc
);
3857 enum rtx_code code
= GET_CODE (setsrc
);
3858 rtx src_op0
= XEXP (setsrc
, 0);
3859 rtx src_op1
= XEXP (setsrc
, 1);
3861 /* Split "X = Y op Y" as "Z = Y; X = Z op Z". */
3862 if (rtx_equal_p (src_op0
, src_op1
))
3864 newi2pat
= gen_rtx_SET (newdest
, src_op0
);
3865 SUBST (XEXP (setsrc
, 0), newdest
);
3866 SUBST (XEXP (setsrc
, 1), newdest
);
3869 /* Split "((P op Q) op R) op S" where op is PLUS or MULT. */
3870 else if ((code
== PLUS
|| code
== MULT
)
3871 && GET_CODE (src_op0
) == code
3872 && GET_CODE (XEXP (src_op0
, 0)) == code
3873 && (INTEGRAL_MODE_P (mode
)
3874 || (FLOAT_MODE_P (mode
)
3875 && flag_unsafe_math_optimizations
)))
3877 rtx p
= XEXP (XEXP (src_op0
, 0), 0);
3878 rtx q
= XEXP (XEXP (src_op0
, 0), 1);
3879 rtx r
= XEXP (src_op0
, 1);
3882 /* Split both "((X op Y) op X) op Y" and
3883 "((X op Y) op Y) op X" as "T op T" where T is
3885 if ((rtx_equal_p (p
,r
) && rtx_equal_p (q
,s
))
3886 || (rtx_equal_p (p
,s
) && rtx_equal_p (q
,r
)))
3888 newi2pat
= gen_rtx_SET (newdest
, XEXP (src_op0
, 0));
3889 SUBST (XEXP (setsrc
, 0), newdest
);
3890 SUBST (XEXP (setsrc
, 1), newdest
);
3893 /* Split "((X op X) op Y) op Y)" as "T op T" where
3895 else if (rtx_equal_p (p
,q
) && rtx_equal_p (r
,s
))
3897 rtx tmp
= simplify_gen_binary (code
, mode
, p
, r
);
3898 newi2pat
= gen_rtx_SET (newdest
, tmp
);
3899 SUBST (XEXP (setsrc
, 0), newdest
);
3900 SUBST (XEXP (setsrc
, 1), newdest
);
3908 newi2pat
= gen_rtx_SET (newdest
, *split
);
3909 SUBST (*split
, newdest
);
3912 i2_code_number
= recog_for_combine (&newi2pat
, i2
, &new_i2_notes
);
3914 /* recog_for_combine might have added CLOBBERs to newi2pat.
3915 Make sure NEWPAT does not depend on the clobbered regs. */
3916 if (GET_CODE (newi2pat
) == PARALLEL
)
3917 for (i
= XVECLEN (newi2pat
, 0) - 1; i
>= 0; i
--)
3918 if (GET_CODE (XVECEXP (newi2pat
, 0, i
)) == CLOBBER
)
3920 rtx reg
= XEXP (XVECEXP (newi2pat
, 0, i
), 0);
3921 if (reg_overlap_mentioned_p (reg
, newpat
))
3928 /* If the split point was a MULT and we didn't have one before,
3929 don't use one now. */
3930 if (i2_code_number
>= 0 && ! (split_code
== MULT
&& ! have_mult
))
3931 insn_code_number
= recog_for_combine (&newpat
, i3
, &new_i3_notes
);
3935 /* Check for a case where we loaded from memory in a narrow mode and
3936 then sign extended it, but we need both registers. In that case,
3937 we have a PARALLEL with both loads from the same memory location.
3938 We can split this into a load from memory followed by a register-register
3939 copy. This saves at least one insn, more if register allocation can
3942 We cannot do this if the destination of the first assignment is a
3943 condition code register or cc0. We eliminate this case by making sure
3944 the SET_DEST and SET_SRC have the same mode.
3946 We cannot do this if the destination of the second assignment is
3947 a register that we have already assumed is zero-extended. Similarly
3948 for a SUBREG of such a register. */
3950 else if (i1
&& insn_code_number
< 0 && asm_noperands (newpat
) < 0
3951 && GET_CODE (newpat
) == PARALLEL
3952 && XVECLEN (newpat
, 0) == 2
3953 && GET_CODE (XVECEXP (newpat
, 0, 0)) == SET
3954 && GET_CODE (SET_SRC (XVECEXP (newpat
, 0, 0))) == SIGN_EXTEND
3955 && (GET_MODE (SET_DEST (XVECEXP (newpat
, 0, 0)))
3956 == GET_MODE (SET_SRC (XVECEXP (newpat
, 0, 0))))
3957 && GET_CODE (XVECEXP (newpat
, 0, 1)) == SET
3958 && rtx_equal_p (SET_SRC (XVECEXP (newpat
, 0, 1)),
3959 XEXP (SET_SRC (XVECEXP (newpat
, 0, 0)), 0))
3960 && !modified_between_p (SET_SRC (XVECEXP (newpat
, 0, 1)), i2
, i3
)
3961 && GET_CODE (SET_DEST (XVECEXP (newpat
, 0, 1))) != ZERO_EXTRACT
3962 && GET_CODE (SET_DEST (XVECEXP (newpat
, 0, 1))) != STRICT_LOW_PART
3963 && ! (temp_expr
= SET_DEST (XVECEXP (newpat
, 0, 1)),
3965 && reg_stat
[REGNO (temp_expr
)].nonzero_bits
!= 0
3966 && known_lt (GET_MODE_PRECISION (GET_MODE (temp_expr
)),
3968 && known_lt (GET_MODE_PRECISION (GET_MODE (temp_expr
)),
3970 && (reg_stat
[REGNO (temp_expr
)].nonzero_bits
3971 != GET_MODE_MASK (word_mode
))))
3972 && ! (GET_CODE (SET_DEST (XVECEXP (newpat
, 0, 1))) == SUBREG
3973 && (temp_expr
= SUBREG_REG (SET_DEST (XVECEXP (newpat
, 0, 1))),
3975 && reg_stat
[REGNO (temp_expr
)].nonzero_bits
!= 0
3976 && known_lt (GET_MODE_PRECISION (GET_MODE (temp_expr
)),
3978 && known_lt (GET_MODE_PRECISION (GET_MODE (temp_expr
)),
3980 && (reg_stat
[REGNO (temp_expr
)].nonzero_bits
3981 != GET_MODE_MASK (word_mode
)))))
3982 && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat
, 0, 1)),
3983 SET_SRC (XVECEXP (newpat
, 0, 1)))
3984 && ! find_reg_note (i3
, REG_UNUSED
,
3985 SET_DEST (XVECEXP (newpat
, 0, 0))))
3989 newi2pat
= XVECEXP (newpat
, 0, 0);
3990 ni2dest
= SET_DEST (XVECEXP (newpat
, 0, 0));
3991 newpat
= XVECEXP (newpat
, 0, 1);
3992 SUBST (SET_SRC (newpat
),
3993 gen_lowpart (GET_MODE (SET_SRC (newpat
)), ni2dest
));
3994 i2_code_number
= recog_for_combine (&newi2pat
, i2
, &new_i2_notes
);
3996 if (i2_code_number
>= 0)
3997 insn_code_number
= recog_for_combine (&newpat
, i3
, &new_i3_notes
);
3999 if (insn_code_number
>= 0)
4003 /* Similarly, check for a case where we have a PARALLEL of two independent
4004 SETs but we started with three insns. In this case, we can do the sets
4005 as two separate insns. This case occurs when some SET allows two
4006 other insns to combine, but the destination of that SET is still live.
4008 Also do this if we started with two insns and (at least) one of the
4009 resulting sets is a noop; this noop will be deleted later. */
4011 else if (insn_code_number
< 0 && asm_noperands (newpat
) < 0
4012 && GET_CODE (newpat
) == PARALLEL
4013 && XVECLEN (newpat
, 0) == 2
4014 && GET_CODE (XVECEXP (newpat
, 0, 0)) == SET
4015 && GET_CODE (XVECEXP (newpat
, 0, 1)) == SET
4016 && (i1
|| set_noop_p (XVECEXP (newpat
, 0, 0))
4017 || set_noop_p (XVECEXP (newpat
, 0, 1)))
4018 && GET_CODE (SET_DEST (XVECEXP (newpat
, 0, 0))) != ZERO_EXTRACT
4019 && GET_CODE (SET_DEST (XVECEXP (newpat
, 0, 0))) != STRICT_LOW_PART
4020 && GET_CODE (SET_DEST (XVECEXP (newpat
, 0, 1))) != ZERO_EXTRACT
4021 && GET_CODE (SET_DEST (XVECEXP (newpat
, 0, 1))) != STRICT_LOW_PART
4022 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat
, 0, 1)),
4023 XVECEXP (newpat
, 0, 0))
4024 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat
, 0, 0)),
4025 XVECEXP (newpat
, 0, 1))
4026 && ! (contains_muldiv (SET_SRC (XVECEXP (newpat
, 0, 0)))
4027 && contains_muldiv (SET_SRC (XVECEXP (newpat
, 0, 1)))))
4029 rtx set0
= XVECEXP (newpat
, 0, 0);
4030 rtx set1
= XVECEXP (newpat
, 0, 1);
4032 /* Normally, it doesn't matter which of the two is done first,
4033 but the one that references cc0 can't be the second, and
4034 one which uses any regs/memory set in between i2 and i3 can't
4035 be first. The PARALLEL might also have been pre-existing in i3,
4036 so we need to make sure that we won't wrongly hoist a SET to i2
4037 that would conflict with a death note present in there. */
4038 if (!modified_between_p (SET_SRC (set1
), i2
, i3
)
4039 && !(REG_P (SET_DEST (set1
))
4040 && find_reg_note (i2
, REG_DEAD
, SET_DEST (set1
)))
4041 && !(GET_CODE (SET_DEST (set1
)) == SUBREG
4042 && find_reg_note (i2
, REG_DEAD
,
4043 SUBREG_REG (SET_DEST (set1
))))
4044 && (!HAVE_cc0
|| !reg_referenced_p (cc0_rtx
, set0
))
4045 /* If I3 is a jump, ensure that set0 is a jump so that
4046 we do not create invalid RTL. */
4047 && (!JUMP_P (i3
) || SET_DEST (set0
) == pc_rtx
)
4053 else if (!modified_between_p (SET_SRC (set0
), i2
, i3
)
4054 && !(REG_P (SET_DEST (set0
))
4055 && find_reg_note (i2
, REG_DEAD
, SET_DEST (set0
)))
4056 && !(GET_CODE (SET_DEST (set0
)) == SUBREG
4057 && find_reg_note (i2
, REG_DEAD
,
4058 SUBREG_REG (SET_DEST (set0
))))
4059 && (!HAVE_cc0
|| !reg_referenced_p (cc0_rtx
, set1
))
4060 /* If I3 is a jump, ensure that set1 is a jump so that
4061 we do not create invalid RTL. */
4062 && (!JUMP_P (i3
) || SET_DEST (set1
) == pc_rtx
)
4074 i2_code_number
= recog_for_combine (&newi2pat
, i2
, &new_i2_notes
);
4076 if (i2_code_number
>= 0)
4078 /* recog_for_combine might have added CLOBBERs to newi2pat.
4079 Make sure NEWPAT does not depend on the clobbered regs. */
4080 if (GET_CODE (newi2pat
) == PARALLEL
)
4082 for (i
= XVECLEN (newi2pat
, 0) - 1; i
>= 0; i
--)
4083 if (GET_CODE (XVECEXP (newi2pat
, 0, i
)) == CLOBBER
)
4085 rtx reg
= XEXP (XVECEXP (newi2pat
, 0, i
), 0);
4086 if (reg_overlap_mentioned_p (reg
, newpat
))
4094 insn_code_number
= recog_for_combine (&newpat
, i3
, &new_i3_notes
);
4096 if (insn_code_number
>= 0)
4101 /* If it still isn't recognized, fail and change things back the way they
4103 if ((insn_code_number
< 0
4104 /* Is the result a reasonable ASM_OPERANDS? */
4105 && (! check_asm_operands (newpat
) || added_sets_1
|| added_sets_2
)))
4111 /* If we had to change another insn, make sure it is valid also. */
4112 if (undobuf
.other_insn
)
4114 CLEAR_HARD_REG_SET (newpat_used_regs
);
4116 other_pat
= PATTERN (undobuf
.other_insn
);
4117 other_code_number
= recog_for_combine (&other_pat
, undobuf
.other_insn
,
4120 if (other_code_number
< 0 && ! check_asm_operands (other_pat
))
4127 /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
4128 they are adjacent to each other or not. */
4131 rtx_insn
*p
= prev_nonnote_insn (i3
);
4132 if (p
&& p
!= i2
&& NONJUMP_INSN_P (p
) && newi2pat
4133 && sets_cc0_p (newi2pat
))
4140 /* Only allow this combination if insn_cost reports that the
4141 replacement instructions are cheaper than the originals. */
4142 if (!combine_validate_cost (i0
, i1
, i2
, i3
, newpat
, newi2pat
, other_pat
))
4148 if (MAY_HAVE_DEBUG_BIND_INSNS
)
4152 for (undo
= undobuf
.undos
; undo
; undo
= undo
->next
)
4153 if (undo
->kind
== UNDO_MODE
)
4155 rtx reg
= *undo
->where
.r
;
4156 machine_mode new_mode
= GET_MODE (reg
);
4157 machine_mode old_mode
= undo
->old_contents
.m
;
4159 /* Temporarily revert mode back. */
4160 adjust_reg_mode (reg
, old_mode
);
4162 if (reg
== i2dest
&& i2scratch
)
4164 /* If we used i2dest as a scratch register with a
4165 different mode, substitute it for the original
4166 i2src while its original mode is temporarily
4167 restored, and then clear i2scratch so that we don't
4168 do it again later. */
4169 propagate_for_debug (i2
, last_combined_insn
, reg
, i2src
,
4172 /* Put back the new mode. */
4173 adjust_reg_mode (reg
, new_mode
);
4177 rtx tempreg
= gen_raw_REG (old_mode
, REGNO (reg
));
4178 rtx_insn
*first
, *last
;
4183 last
= last_combined_insn
;
4188 last
= undobuf
.other_insn
;
4190 if (DF_INSN_LUID (last
)
4191 < DF_INSN_LUID (last_combined_insn
))
4192 last
= last_combined_insn
;
4195 /* We're dealing with a reg that changed mode but not
4196 meaning, so we want to turn it into a subreg for
4197 the new mode. However, because of REG sharing and
4198 because its mode had already changed, we have to do
4199 it in two steps. First, replace any debug uses of
4200 reg, with its original mode temporarily restored,
4201 with this copy we have created; then, replace the
4202 copy with the SUBREG of the original shared reg,
4203 once again changed to the new mode. */
4204 propagate_for_debug (first
, last
, reg
, tempreg
,
4206 adjust_reg_mode (reg
, new_mode
);
4207 propagate_for_debug (first
, last
, tempreg
,
4208 lowpart_subreg (old_mode
, reg
, new_mode
),
4214 /* If we will be able to accept this, we have made a
4215 change to the destination of I3. This requires us to
4216 do a few adjustments. */
4218 if (changed_i3_dest
)
4220 PATTERN (i3
) = newpat
;
4221 adjust_for_new_dest (i3
);
4224 /* We now know that we can do this combination. Merge the insns and
4225 update the status of registers and LOG_LINKS. */
4227 if (undobuf
.other_insn
)
4231 PATTERN (undobuf
.other_insn
) = other_pat
;
4233 /* If any of the notes in OTHER_INSN were REG_DEAD or REG_UNUSED,
4234 ensure that they are still valid. Then add any non-duplicate
4235 notes added by recog_for_combine. */
4236 for (note
= REG_NOTES (undobuf
.other_insn
); note
; note
= next
)
4238 next
= XEXP (note
, 1);
4240 if ((REG_NOTE_KIND (note
) == REG_DEAD
4241 && !reg_referenced_p (XEXP (note
, 0),
4242 PATTERN (undobuf
.other_insn
)))
4243 ||(REG_NOTE_KIND (note
) == REG_UNUSED
4244 && !reg_set_p (XEXP (note
, 0),
4245 PATTERN (undobuf
.other_insn
)))
4246 /* Simply drop equal note since it may be no longer valid
4247 for other_insn. It may be possible to record that CC
4248 register is changed and only discard those notes, but
4249 in practice it's unnecessary complication and doesn't
4250 give any meaningful improvement.
4253 || REG_NOTE_KIND (note
) == REG_EQUAL
4254 || REG_NOTE_KIND (note
) == REG_EQUIV
)
4255 remove_note (undobuf
.other_insn
, note
);
4258 distribute_notes (new_other_notes
, undobuf
.other_insn
,
4259 undobuf
.other_insn
, NULL
, NULL_RTX
, NULL_RTX
,
4265 /* I3 now uses what used to be its destination and which is now
4266 I2's destination. This requires us to do a few adjustments. */
4267 PATTERN (i3
) = newpat
;
4268 adjust_for_new_dest (i3
);
4271 if (swap_i2i3
|| split_i2i3
)
4273 /* We might need a LOG_LINK from I3 to I2. But then we used to
4274 have one, so we still will.
4276 However, some later insn might be using I2's dest and have
4277 a LOG_LINK pointing at I3. We should change it to point at
4280 /* newi2pat is usually a SET here; however, recog_for_combine might
4281 have added some clobbers. */
4283 if (GET_CODE (x
) == PARALLEL
)
4284 x
= XVECEXP (newi2pat
, 0, 0);
4286 /* It can only be a SET of a REG or of a SUBREG of a REG. */
4287 unsigned int regno
= reg_or_subregno (SET_DEST (x
));
4290 for (rtx_insn
*insn
= NEXT_INSN (i3
);
4293 && NONDEBUG_INSN_P (insn
)
4294 && BLOCK_FOR_INSN (insn
) == this_basic_block
;
4295 insn
= NEXT_INSN (insn
))
4297 struct insn_link
*link
;
4298 FOR_EACH_LOG_LINK (link
, insn
)
4299 if (link
->insn
== i3
&& link
->regno
== regno
)
4309 rtx i3notes
, i2notes
, i1notes
= 0, i0notes
= 0;
4310 struct insn_link
*i3links
, *i2links
, *i1links
= 0, *i0links
= 0;
4313 /* Compute which registers we expect to eliminate. newi2pat may be setting
4314 either i3dest or i2dest, so we must check it. */
4315 rtx elim_i2
= ((newi2pat
&& reg_set_p (i2dest
, newi2pat
))
4316 || i2dest_in_i2src
|| i2dest_in_i1src
|| i2dest_in_i0src
4319 /* For i1, we need to compute both local elimination and global
4320 elimination information with respect to newi2pat because i1dest
4321 may be the same as i3dest, in which case newi2pat may be setting
4322 i1dest. Global information is used when distributing REG_DEAD
4323 note for i2 and i3, in which case it does matter if newi2pat sets
4326 Local information is used when distributing REG_DEAD note for i1,
4327 in which case it doesn't matter if newi2pat sets i1dest or not.
4328 See PR62151, if we have four insns combination:
4330 i1: r1 <- i1src (using r0)
4332 i2: r0 <- i2src (using r1)
4333 i3: r3 <- i3src (using r0)
4335 From i1's point of view, r0 is eliminated, no matter if it is set
4336 by newi2pat or not. In other words, REG_DEAD info for r0 in i1
4337 should be discarded.
4339 Note local information only affects cases in forms like "I1->I2->I3",
4340 "I0->I1->I2->I3" or "I0&I1->I2, I2->I3". For other cases like
4341 "I0->I1, I1&I2->I3" or "I1&I2->I3", newi2pat won't set i1dest or
4343 rtx local_elim_i1
= (i1
== 0 || i1dest_in_i1src
|| i1dest_in_i0src
4346 rtx elim_i1
= (local_elim_i1
== 0
4347 || (newi2pat
&& reg_set_p (i1dest
, newi2pat
))
4349 /* Same case as i1. */
4350 rtx local_elim_i0
= (i0
== 0 || i0dest_in_i0src
|| !i0dest_killed
4352 rtx elim_i0
= (local_elim_i0
== 0
4353 || (newi2pat
&& reg_set_p (i0dest
, newi2pat
))
4356 /* Get the old REG_NOTES and LOG_LINKS from all our insns and
4358 i3notes
= REG_NOTES (i3
), i3links
= LOG_LINKS (i3
);
4359 i2notes
= REG_NOTES (i2
), i2links
= LOG_LINKS (i2
);
4361 i1notes
= REG_NOTES (i1
), i1links
= LOG_LINKS (i1
);
4363 i0notes
= REG_NOTES (i0
), i0links
= LOG_LINKS (i0
);
4365 /* Ensure that we do not have something that should not be shared but
4366 occurs multiple times in the new insns. Check this by first
4367 resetting all the `used' flags and then copying anything is shared. */
4369 reset_used_flags (i3notes
);
4370 reset_used_flags (i2notes
);
4371 reset_used_flags (i1notes
);
4372 reset_used_flags (i0notes
);
4373 reset_used_flags (newpat
);
4374 reset_used_flags (newi2pat
);
4375 if (undobuf
.other_insn
)
4376 reset_used_flags (PATTERN (undobuf
.other_insn
));
4378 i3notes
= copy_rtx_if_shared (i3notes
);
4379 i2notes
= copy_rtx_if_shared (i2notes
);
4380 i1notes
= copy_rtx_if_shared (i1notes
);
4381 i0notes
= copy_rtx_if_shared (i0notes
);
4382 newpat
= copy_rtx_if_shared (newpat
);
4383 newi2pat
= copy_rtx_if_shared (newi2pat
);
4384 if (undobuf
.other_insn
)
4385 reset_used_flags (PATTERN (undobuf
.other_insn
));
4387 INSN_CODE (i3
) = insn_code_number
;
4388 PATTERN (i3
) = newpat
;
4390 if (CALL_P (i3
) && CALL_INSN_FUNCTION_USAGE (i3
))
4392 for (rtx link
= CALL_INSN_FUNCTION_USAGE (i3
); link
;
4393 link
= XEXP (link
, 1))
4397 /* I2SRC must still be meaningful at this point. Some
4398 splitting operations can invalidate I2SRC, but those
4399 operations do not apply to calls. */
4401 XEXP (link
, 0) = simplify_replace_rtx (XEXP (link
, 0),
4405 XEXP (link
, 0) = simplify_replace_rtx (XEXP (link
, 0),
4408 XEXP (link
, 0) = simplify_replace_rtx (XEXP (link
, 0),
4413 if (undobuf
.other_insn
)
4414 INSN_CODE (undobuf
.other_insn
) = other_code_number
;
4416 /* We had one special case above where I2 had more than one set and
4417 we replaced a destination of one of those sets with the destination
4418 of I3. In that case, we have to update LOG_LINKS of insns later
4419 in this basic block. Note that this (expensive) case is rare.
4421 Also, in this case, we must pretend that all REG_NOTEs for I2
4422 actually came from I3, so that REG_UNUSED notes from I2 will be
4423 properly handled. */
4425 if (i3_subst_into_i2
)
4427 for (i
= 0; i
< XVECLEN (PATTERN (i2
), 0); i
++)
4428 if ((GET_CODE (XVECEXP (PATTERN (i2
), 0, i
)) == SET
4429 || GET_CODE (XVECEXP (PATTERN (i2
), 0, i
)) == CLOBBER
)
4430 && REG_P (SET_DEST (XVECEXP (PATTERN (i2
), 0, i
)))
4431 && SET_DEST (XVECEXP (PATTERN (i2
), 0, i
)) != i2dest
4432 && ! find_reg_note (i2
, REG_UNUSED
,
4433 SET_DEST (XVECEXP (PATTERN (i2
), 0, i
))))
4434 for (temp_insn
= NEXT_INSN (i2
);
4436 && (this_basic_block
->next_bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
)
4437 || BB_HEAD (this_basic_block
) != temp_insn
);
4438 temp_insn
= NEXT_INSN (temp_insn
))
4439 if (temp_insn
!= i3
&& NONDEBUG_INSN_P (temp_insn
))
4440 FOR_EACH_LOG_LINK (link
, temp_insn
)
4441 if (link
->insn
== i2
)
4447 while (XEXP (link
, 1))
4448 link
= XEXP (link
, 1);
4449 XEXP (link
, 1) = i2notes
;
4456 LOG_LINKS (i3
) = NULL
;
4458 LOG_LINKS (i2
) = NULL
;
4463 if (MAY_HAVE_DEBUG_BIND_INSNS
&& i2scratch
)
4464 propagate_for_debug (i2
, last_combined_insn
, i2dest
, i2src
,
4466 INSN_CODE (i2
) = i2_code_number
;
4467 PATTERN (i2
) = newi2pat
;
4471 if (MAY_HAVE_DEBUG_BIND_INSNS
&& i2src
)
4472 propagate_for_debug (i2
, last_combined_insn
, i2dest
, i2src
,
4474 SET_INSN_DELETED (i2
);
4479 LOG_LINKS (i1
) = NULL
;
4481 if (MAY_HAVE_DEBUG_BIND_INSNS
)
4482 propagate_for_debug (i1
, last_combined_insn
, i1dest
, i1src
,
4484 SET_INSN_DELETED (i1
);
4489 LOG_LINKS (i0
) = NULL
;
4491 if (MAY_HAVE_DEBUG_BIND_INSNS
)
4492 propagate_for_debug (i0
, last_combined_insn
, i0dest
, i0src
,
4494 SET_INSN_DELETED (i0
);
4497 /* Get death notes for everything that is now used in either I3 or
4498 I2 and used to die in a previous insn. If we built two new
4499 patterns, move from I1 to I2 then I2 to I3 so that we get the
4500 proper movement on registers that I2 modifies. */
4503 from_luid
= DF_INSN_LUID (i0
);
4505 from_luid
= DF_INSN_LUID (i1
);
4507 from_luid
= DF_INSN_LUID (i2
);
4509 move_deaths (newi2pat
, NULL_RTX
, from_luid
, i2
, &midnotes
);
4510 move_deaths (newpat
, newi2pat
, from_luid
, i3
, &midnotes
);
4512 /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */
4514 distribute_notes (i3notes
, i3
, i3
, newi2pat
? i2
: NULL
,
4515 elim_i2
, elim_i1
, elim_i0
);
4517 distribute_notes (i2notes
, i2
, i3
, newi2pat
? i2
: NULL
,
4518 elim_i2
, elim_i1
, elim_i0
);
4520 distribute_notes (i1notes
, i1
, i3
, newi2pat
? i2
: NULL
,
4521 elim_i2
, local_elim_i1
, local_elim_i0
);
4523 distribute_notes (i0notes
, i0
, i3
, newi2pat
? i2
: NULL
,
4524 elim_i2
, elim_i1
, local_elim_i0
);
4526 distribute_notes (midnotes
, NULL
, i3
, newi2pat
? i2
: NULL
,
4527 elim_i2
, elim_i1
, elim_i0
);
4529 /* Distribute any notes added to I2 or I3 by recog_for_combine. We
4530 know these are REG_UNUSED and want them to go to the desired insn,
4531 so we always pass it as i3. */
4533 if (newi2pat
&& new_i2_notes
)
4534 distribute_notes (new_i2_notes
, i2
, i2
, NULL
, NULL_RTX
, NULL_RTX
,
4538 distribute_notes (new_i3_notes
, i3
, i3
, NULL
, NULL_RTX
, NULL_RTX
,
4541 /* If I3DEST was used in I3SRC, it really died in I3. We may need to
4542 put a REG_DEAD note for it somewhere. If NEWI2PAT exists and sets
4543 I3DEST, the death must be somewhere before I2, not I3. If we passed I3
4544 in that case, it might delete I2. Similarly for I2 and I1.
4545 Show an additional death due to the REG_DEAD note we make here. If
4546 we discard it in distribute_notes, we will decrement it again. */
4550 rtx new_note
= alloc_reg_note (REG_DEAD
, i3dest_killed
, NULL_RTX
);
4551 if (newi2pat
&& reg_set_p (i3dest_killed
, newi2pat
))
4552 distribute_notes (new_note
, NULL
, i2
, NULL
, elim_i2
,
4555 distribute_notes (new_note
, NULL
, i3
, newi2pat
? i2
: NULL
,
4556 elim_i2
, elim_i1
, elim_i0
);
4559 if (i2dest_in_i2src
)
4561 rtx new_note
= alloc_reg_note (REG_DEAD
, i2dest
, NULL_RTX
);
4562 if (newi2pat
&& reg_set_p (i2dest
, newi2pat
))
4563 distribute_notes (new_note
, NULL
, i2
, NULL
, NULL_RTX
,
4564 NULL_RTX
, NULL_RTX
);
4566 distribute_notes (new_note
, NULL
, i3
, newi2pat
? i2
: NULL
,
4567 NULL_RTX
, NULL_RTX
, NULL_RTX
);
4570 if (i1dest_in_i1src
)
4572 rtx new_note
= alloc_reg_note (REG_DEAD
, i1dest
, NULL_RTX
);
4573 if (newi2pat
&& reg_set_p (i1dest
, newi2pat
))
4574 distribute_notes (new_note
, NULL
, i2
, NULL
, NULL_RTX
,
4575 NULL_RTX
, NULL_RTX
);
4577 distribute_notes (new_note
, NULL
, i3
, newi2pat
? i2
: NULL
,
4578 NULL_RTX
, NULL_RTX
, NULL_RTX
);
4581 if (i0dest_in_i0src
)
4583 rtx new_note
= alloc_reg_note (REG_DEAD
, i0dest
, NULL_RTX
);
4584 if (newi2pat
&& reg_set_p (i0dest
, newi2pat
))
4585 distribute_notes (new_note
, NULL
, i2
, NULL
, NULL_RTX
,
4586 NULL_RTX
, NULL_RTX
);
4588 distribute_notes (new_note
, NULL
, i3
, newi2pat
? i2
: NULL
,
4589 NULL_RTX
, NULL_RTX
, NULL_RTX
);
4592 distribute_links (i3links
);
4593 distribute_links (i2links
);
4594 distribute_links (i1links
);
4595 distribute_links (i0links
);
4599 struct insn_link
*link
;
4600 rtx_insn
*i2_insn
= 0;
4601 rtx i2_val
= 0, set
;
4603 /* The insn that used to set this register doesn't exist, and
4604 this life of the register may not exist either. See if one of
4605 I3's links points to an insn that sets I2DEST. If it does,
4606 that is now the last known value for I2DEST. If we don't update
4607 this and I2 set the register to a value that depended on its old
4608 contents, we will get confused. If this insn is used, thing
4609 will be set correctly in combine_instructions. */
4610 FOR_EACH_LOG_LINK (link
, i3
)
4611 if ((set
= single_set (link
->insn
)) != 0
4612 && rtx_equal_p (i2dest
, SET_DEST (set
)))
4613 i2_insn
= link
->insn
, i2_val
= SET_SRC (set
);
4615 record_value_for_reg (i2dest
, i2_insn
, i2_val
);
4617 /* If the reg formerly set in I2 died only once and that was in I3,
4618 zero its use count so it won't make `reload' do any work. */
4620 && (newi2pat
== 0 || ! reg_mentioned_p (i2dest
, newi2pat
))
4621 && ! i2dest_in_i2src
4622 && REGNO (i2dest
) < reg_n_sets_max
)
4623 INC_REG_N_SETS (REGNO (i2dest
), -1);
4626 if (i1
&& REG_P (i1dest
))
4628 struct insn_link
*link
;
4629 rtx_insn
*i1_insn
= 0;
4630 rtx i1_val
= 0, set
;
4632 FOR_EACH_LOG_LINK (link
, i3
)
4633 if ((set
= single_set (link
->insn
)) != 0
4634 && rtx_equal_p (i1dest
, SET_DEST (set
)))
4635 i1_insn
= link
->insn
, i1_val
= SET_SRC (set
);
4637 record_value_for_reg (i1dest
, i1_insn
, i1_val
);
4640 && ! i1dest_in_i1src
4641 && REGNO (i1dest
) < reg_n_sets_max
)
4642 INC_REG_N_SETS (REGNO (i1dest
), -1);
4645 if (i0
&& REG_P (i0dest
))
4647 struct insn_link
*link
;
4648 rtx_insn
*i0_insn
= 0;
4649 rtx i0_val
= 0, set
;
4651 FOR_EACH_LOG_LINK (link
, i3
)
4652 if ((set
= single_set (link
->insn
)) != 0
4653 && rtx_equal_p (i0dest
, SET_DEST (set
)))
4654 i0_insn
= link
->insn
, i0_val
= SET_SRC (set
);
4656 record_value_for_reg (i0dest
, i0_insn
, i0_val
);
4659 && ! i0dest_in_i0src
4660 && REGNO (i0dest
) < reg_n_sets_max
)
4661 INC_REG_N_SETS (REGNO (i0dest
), -1);
4664 /* Update reg_stat[].nonzero_bits et al for any changes that may have
4665 been made to this insn. The order is important, because newi2pat
4666 can affect nonzero_bits of newpat. */
4668 note_stores (newi2pat
, set_nonzero_bits_and_sign_copies
, NULL
);
4669 note_stores (newpat
, set_nonzero_bits_and_sign_copies
, NULL
);
4672 if (undobuf
.other_insn
!= NULL_RTX
)
4676 fprintf (dump_file
, "modifying other_insn ");
4677 dump_insn_slim (dump_file
, undobuf
.other_insn
);
4679 df_insn_rescan (undobuf
.other_insn
);
4682 if (i0
&& !(NOTE_P (i0
) && (NOTE_KIND (i0
) == NOTE_INSN_DELETED
)))
4686 fprintf (dump_file
, "modifying insn i0 ");
4687 dump_insn_slim (dump_file
, i0
);
4689 df_insn_rescan (i0
);
4692 if (i1
&& !(NOTE_P (i1
) && (NOTE_KIND (i1
) == NOTE_INSN_DELETED
)))
4696 fprintf (dump_file
, "modifying insn i1 ");
4697 dump_insn_slim (dump_file
, i1
);
4699 df_insn_rescan (i1
);
4702 if (i2
&& !(NOTE_P (i2
) && (NOTE_KIND (i2
) == NOTE_INSN_DELETED
)))
4706 fprintf (dump_file
, "modifying insn i2 ");
4707 dump_insn_slim (dump_file
, i2
);
4709 df_insn_rescan (i2
);
4712 if (i3
&& !(NOTE_P (i3
) && (NOTE_KIND (i3
) == NOTE_INSN_DELETED
)))
4716 fprintf (dump_file
, "modifying insn i3 ");
4717 dump_insn_slim (dump_file
, i3
);
4719 df_insn_rescan (i3
);
4722 /* Set new_direct_jump_p if a new return or simple jump instruction
4723 has been created. Adjust the CFG accordingly. */
4724 if (returnjump_p (i3
) || any_uncondjump_p (i3
))
4726 *new_direct_jump_p
= 1;
4727 mark_jump_label (PATTERN (i3
), i3
, 0);
4728 update_cfg_for_uncondjump (i3
);
4731 if (undobuf
.other_insn
!= NULL_RTX
4732 && (returnjump_p (undobuf
.other_insn
)
4733 || any_uncondjump_p (undobuf
.other_insn
)))
4735 *new_direct_jump_p
= 1;
4736 update_cfg_for_uncondjump (undobuf
.other_insn
);
4739 if (GET_CODE (PATTERN (i3
)) == TRAP_IF
4740 && XEXP (PATTERN (i3
), 0) == const1_rtx
)
4742 basic_block bb
= BLOCK_FOR_INSN (i3
);
4744 remove_edge (split_block (bb
, i3
));
4745 emit_barrier_after_bb (bb
);
4746 *new_direct_jump_p
= 1;
4749 if (undobuf
.other_insn
4750 && GET_CODE (PATTERN (undobuf
.other_insn
)) == TRAP_IF
4751 && XEXP (PATTERN (undobuf
.other_insn
), 0) == const1_rtx
)
4753 basic_block bb
= BLOCK_FOR_INSN (undobuf
.other_insn
);
4755 remove_edge (split_block (bb
, undobuf
.other_insn
));
4756 emit_barrier_after_bb (bb
);
4757 *new_direct_jump_p
= 1;
4760 /* A noop might also need cleaning up of CFG, if it comes from the
4761 simplification of a jump. */
4763 && GET_CODE (newpat
) == SET
4764 && SET_SRC (newpat
) == pc_rtx
4765 && SET_DEST (newpat
) == pc_rtx
)
4767 *new_direct_jump_p
= 1;
4768 update_cfg_for_uncondjump (i3
);
4771 if (undobuf
.other_insn
!= NULL_RTX
4772 && JUMP_P (undobuf
.other_insn
)
4773 && GET_CODE (PATTERN (undobuf
.other_insn
)) == SET
4774 && SET_SRC (PATTERN (undobuf
.other_insn
)) == pc_rtx
4775 && SET_DEST (PATTERN (undobuf
.other_insn
)) == pc_rtx
)
4777 *new_direct_jump_p
= 1;
4778 update_cfg_for_uncondjump (undobuf
.other_insn
);
4781 combine_successes
++;
4784 rtx_insn
*ret
= newi2pat
? i2
: i3
;
4785 if (added_links_insn
&& DF_INSN_LUID (added_links_insn
) < DF_INSN_LUID (ret
))
4786 ret
= added_links_insn
;
4787 if (added_notes_insn
&& DF_INSN_LUID (added_notes_insn
) < DF_INSN_LUID (ret
))
4788 ret
= added_notes_insn
;
4793 /* Get a marker for undoing to the current state. */
4796 get_undo_marker (void)
4798 return undobuf
.undos
;
4801 /* Undo the modifications up to the marker. */
4804 undo_to_marker (void *marker
)
4806 struct undo
*undo
, *next
;
4808 for (undo
= undobuf
.undos
; undo
!= marker
; undo
= next
)
4816 *undo
->where
.r
= undo
->old_contents
.r
;
4819 *undo
->where
.i
= undo
->old_contents
.i
;
4822 adjust_reg_mode (*undo
->where
.r
, undo
->old_contents
.m
);
4825 *undo
->where
.l
= undo
->old_contents
.l
;
4831 undo
->next
= undobuf
.frees
;
4832 undobuf
.frees
= undo
;
4835 undobuf
.undos
= (struct undo
*) marker
;
4838 /* Undo all the modifications recorded in undobuf. */
4846 /* We've committed to accepting the changes we made. Move all
4847 of the undos to the free list. */
4852 struct undo
*undo
, *next
;
4854 for (undo
= undobuf
.undos
; undo
; undo
= next
)
4857 undo
->next
= undobuf
.frees
;
4858 undobuf
.frees
= undo
;
4863 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
4864 where we have an arithmetic expression and return that point. LOC will
4867 try_combine will call this function to see if an insn can be split into
4871 find_split_point (rtx
*loc
, rtx_insn
*insn
, bool set_src
)
4874 enum rtx_code code
= GET_CODE (x
);
4876 unsigned HOST_WIDE_INT len
= 0;
4877 HOST_WIDE_INT pos
= 0;
4879 rtx inner
= NULL_RTX
;
4880 scalar_int_mode mode
, inner_mode
;
4882 /* First special-case some codes. */
4886 #ifdef INSN_SCHEDULING
4887 /* If we are making a paradoxical SUBREG invalid, it becomes a split
4889 if (MEM_P (SUBREG_REG (x
)))
4892 return find_split_point (&SUBREG_REG (x
), insn
, false);
4895 /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
4896 using LO_SUM and HIGH. */
4897 if (HAVE_lo_sum
&& (GET_CODE (XEXP (x
, 0)) == CONST
4898 || GET_CODE (XEXP (x
, 0)) == SYMBOL_REF
))
4900 machine_mode address_mode
= get_address_mode (x
);
4903 gen_rtx_LO_SUM (address_mode
,
4904 gen_rtx_HIGH (address_mode
, XEXP (x
, 0)),
4906 return &XEXP (XEXP (x
, 0), 0);
4909 /* If we have a PLUS whose second operand is a constant and the
4910 address is not valid, perhaps will can split it up using
4911 the machine-specific way to split large constants. We use
4912 the first pseudo-reg (one of the virtual regs) as a placeholder;
4913 it will not remain in the result. */
4914 if (GET_CODE (XEXP (x
, 0)) == PLUS
4915 && CONST_INT_P (XEXP (XEXP (x
, 0), 1))
4916 && ! memory_address_addr_space_p (GET_MODE (x
), XEXP (x
, 0),
4917 MEM_ADDR_SPACE (x
)))
4919 rtx reg
= regno_reg_rtx
[FIRST_PSEUDO_REGISTER
];
4920 rtx_insn
*seq
= combine_split_insns (gen_rtx_SET (reg
, XEXP (x
, 0)),
4923 /* This should have produced two insns, each of which sets our
4924 placeholder. If the source of the second is a valid address,
4925 we can make put both sources together and make a split point
4929 && NEXT_INSN (seq
) != NULL_RTX
4930 && NEXT_INSN (NEXT_INSN (seq
)) == NULL_RTX
4931 && NONJUMP_INSN_P (seq
)
4932 && GET_CODE (PATTERN (seq
)) == SET
4933 && SET_DEST (PATTERN (seq
)) == reg
4934 && ! reg_mentioned_p (reg
,
4935 SET_SRC (PATTERN (seq
)))
4936 && NONJUMP_INSN_P (NEXT_INSN (seq
))
4937 && GET_CODE (PATTERN (NEXT_INSN (seq
))) == SET
4938 && SET_DEST (PATTERN (NEXT_INSN (seq
))) == reg
4939 && memory_address_addr_space_p
4940 (GET_MODE (x
), SET_SRC (PATTERN (NEXT_INSN (seq
))),
4941 MEM_ADDR_SPACE (x
)))
4943 rtx src1
= SET_SRC (PATTERN (seq
));
4944 rtx src2
= SET_SRC (PATTERN (NEXT_INSN (seq
)));
4946 /* Replace the placeholder in SRC2 with SRC1. If we can
4947 find where in SRC2 it was placed, that can become our
4948 split point and we can replace this address with SRC2.
4949 Just try two obvious places. */
4951 src2
= replace_rtx (src2
, reg
, src1
);
4953 if (XEXP (src2
, 0) == src1
)
4954 split
= &XEXP (src2
, 0);
4955 else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2
, 0)))[0] == 'e'
4956 && XEXP (XEXP (src2
, 0), 0) == src1
)
4957 split
= &XEXP (XEXP (src2
, 0), 0);
4961 SUBST (XEXP (x
, 0), src2
);
4966 /* If that didn't work, perhaps the first operand is complex and
4967 needs to be computed separately, so make a split point there.
4968 This will occur on machines that just support REG + CONST
4969 and have a constant moved through some previous computation. */
4971 else if (!OBJECT_P (XEXP (XEXP (x
, 0), 0))
4972 && ! (GET_CODE (XEXP (XEXP (x
, 0), 0)) == SUBREG
4973 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x
, 0), 0)))))
4974 return &XEXP (XEXP (x
, 0), 0);
4977 /* If we have a PLUS whose first operand is complex, try computing it
4978 separately by making a split there. */
4979 if (GET_CODE (XEXP (x
, 0)) == PLUS
4980 && ! memory_address_addr_space_p (GET_MODE (x
), XEXP (x
, 0),
4982 && ! OBJECT_P (XEXP (XEXP (x
, 0), 0))
4983 && ! (GET_CODE (XEXP (XEXP (x
, 0), 0)) == SUBREG
4984 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x
, 0), 0)))))
4985 return &XEXP (XEXP (x
, 0), 0);
4989 /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
4990 ZERO_EXTRACT, the most likely reason why this doesn't match is that
4991 we need to put the operand into a register. So split at that
4994 if (SET_DEST (x
) == cc0_rtx
4995 && GET_CODE (SET_SRC (x
)) != COMPARE
4996 && GET_CODE (SET_SRC (x
)) != ZERO_EXTRACT
4997 && !OBJECT_P (SET_SRC (x
))
4998 && ! (GET_CODE (SET_SRC (x
)) == SUBREG
4999 && OBJECT_P (SUBREG_REG (SET_SRC (x
)))))
5000 return &SET_SRC (x
);
5002 /* See if we can split SET_SRC as it stands. */
5003 split
= find_split_point (&SET_SRC (x
), insn
, true);
5004 if (split
&& split
!= &SET_SRC (x
))
5007 /* See if we can split SET_DEST as it stands. */
5008 split
= find_split_point (&SET_DEST (x
), insn
, false);
5009 if (split
&& split
!= &SET_DEST (x
))
5012 /* See if this is a bitfield assignment with everything constant. If
5013 so, this is an IOR of an AND, so split it into that. */
5014 if (GET_CODE (SET_DEST (x
)) == ZERO_EXTRACT
5015 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (SET_DEST (x
), 0)),
5017 && HWI_COMPUTABLE_MODE_P (inner_mode
)
5018 && CONST_INT_P (XEXP (SET_DEST (x
), 1))
5019 && CONST_INT_P (XEXP (SET_DEST (x
), 2))
5020 && CONST_INT_P (SET_SRC (x
))
5021 && ((INTVAL (XEXP (SET_DEST (x
), 1))
5022 + INTVAL (XEXP (SET_DEST (x
), 2)))
5023 <= GET_MODE_PRECISION (inner_mode
))
5024 && ! side_effects_p (XEXP (SET_DEST (x
), 0)))
5026 HOST_WIDE_INT pos
= INTVAL (XEXP (SET_DEST (x
), 2));
5027 unsigned HOST_WIDE_INT len
= INTVAL (XEXP (SET_DEST (x
), 1));
5028 unsigned HOST_WIDE_INT src
= INTVAL (SET_SRC (x
));
5029 rtx dest
= XEXP (SET_DEST (x
), 0);
5030 unsigned HOST_WIDE_INT mask
5031 = (HOST_WIDE_INT_1U
<< len
) - 1;
5034 if (BITS_BIG_ENDIAN
)
5035 pos
= GET_MODE_PRECISION (inner_mode
) - len
- pos
;
5037 or_mask
= gen_int_mode (src
<< pos
, inner_mode
);
5040 simplify_gen_binary (IOR
, inner_mode
, dest
, or_mask
));
5043 rtx negmask
= gen_int_mode (~(mask
<< pos
), inner_mode
);
5045 simplify_gen_binary (IOR
, inner_mode
,
5046 simplify_gen_binary (AND
, inner_mode
,
5051 SUBST (SET_DEST (x
), dest
);
5053 split
= find_split_point (&SET_SRC (x
), insn
, true);
5054 if (split
&& split
!= &SET_SRC (x
))
5058 /* Otherwise, see if this is an operation that we can split into two.
5059 If so, try to split that. */
5060 code
= GET_CODE (SET_SRC (x
));
5065 /* If we are AND'ing with a large constant that is only a single
5066 bit and the result is only being used in a context where we
5067 need to know if it is zero or nonzero, replace it with a bit
5068 extraction. This will avoid the large constant, which might
5069 have taken more than one insn to make. If the constant were
5070 not a valid argument to the AND but took only one insn to make,
5071 this is no worse, but if it took more than one insn, it will
5074 if (CONST_INT_P (XEXP (SET_SRC (x
), 1))
5075 && REG_P (XEXP (SET_SRC (x
), 0))
5076 && (pos
= exact_log2 (UINTVAL (XEXP (SET_SRC (x
), 1)))) >= 7
5077 && REG_P (SET_DEST (x
))
5078 && (split
= find_single_use (SET_DEST (x
), insn
, NULL
)) != 0
5079 && (GET_CODE (*split
) == EQ
|| GET_CODE (*split
) == NE
)
5080 && XEXP (*split
, 0) == SET_DEST (x
)
5081 && XEXP (*split
, 1) == const0_rtx
)
5083 rtx extraction
= make_extraction (GET_MODE (SET_DEST (x
)),
5084 XEXP (SET_SRC (x
), 0),
5085 pos
, NULL_RTX
, 1, 1, 0, 0);
5086 if (extraction
!= 0)
5088 SUBST (SET_SRC (x
), extraction
);
5089 return find_split_point (loc
, insn
, false);
5095 /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
5096 is known to be on, this can be converted into a NEG of a shift. */
5097 if (STORE_FLAG_VALUE
== -1 && XEXP (SET_SRC (x
), 1) == const0_rtx
5098 && GET_MODE (SET_SRC (x
)) == GET_MODE (XEXP (SET_SRC (x
), 0))
5099 && ((pos
= exact_log2 (nonzero_bits (XEXP (SET_SRC (x
), 0),
5100 GET_MODE (XEXP (SET_SRC (x
),
5103 machine_mode mode
= GET_MODE (XEXP (SET_SRC (x
), 0));
5104 rtx pos_rtx
= gen_int_shift_amount (mode
, pos
);
5107 gen_rtx_LSHIFTRT (mode
,
5108 XEXP (SET_SRC (x
), 0),
5111 split
= find_split_point (&SET_SRC (x
), insn
, true);
5112 if (split
&& split
!= &SET_SRC (x
))
5118 inner
= XEXP (SET_SRC (x
), 0);
5120 /* We can't optimize if either mode is a partial integer
5121 mode as we don't know how many bits are significant
5123 if (!is_int_mode (GET_MODE (inner
), &inner_mode
)
5124 || GET_MODE_CLASS (GET_MODE (SET_SRC (x
))) == MODE_PARTIAL_INT
)
5128 len
= GET_MODE_PRECISION (inner_mode
);
5134 if (is_a
<scalar_int_mode
> (GET_MODE (XEXP (SET_SRC (x
), 0)),
5136 && CONST_INT_P (XEXP (SET_SRC (x
), 1))
5137 && CONST_INT_P (XEXP (SET_SRC (x
), 2)))
5139 inner
= XEXP (SET_SRC (x
), 0);
5140 len
= INTVAL (XEXP (SET_SRC (x
), 1));
5141 pos
= INTVAL (XEXP (SET_SRC (x
), 2));
5143 if (BITS_BIG_ENDIAN
)
5144 pos
= GET_MODE_PRECISION (inner_mode
) - len
- pos
;
5145 unsignedp
= (code
== ZERO_EXTRACT
);
5154 && known_subrange_p (pos
, len
,
5155 0, GET_MODE_PRECISION (GET_MODE (inner
)))
5156 && is_a
<scalar_int_mode
> (GET_MODE (SET_SRC (x
)), &mode
))
5158 /* For unsigned, we have a choice of a shift followed by an
5159 AND or two shifts. Use two shifts for field sizes where the
5160 constant might be too large. We assume here that we can
5161 always at least get 8-bit constants in an AND insn, which is
5162 true for every current RISC. */
5164 if (unsignedp
&& len
<= 8)
5166 unsigned HOST_WIDE_INT mask
5167 = (HOST_WIDE_INT_1U
<< len
) - 1;
5168 rtx pos_rtx
= gen_int_shift_amount (mode
, pos
);
5172 (mode
, gen_lowpart (mode
, inner
), pos_rtx
),
5173 gen_int_mode (mask
, mode
)));
5175 split
= find_split_point (&SET_SRC (x
), insn
, true);
5176 if (split
&& split
!= &SET_SRC (x
))
5181 int left_bits
= GET_MODE_PRECISION (mode
) - len
- pos
;
5182 int right_bits
= GET_MODE_PRECISION (mode
) - len
;
5185 (unsignedp
? LSHIFTRT
: ASHIFTRT
, mode
,
5186 gen_rtx_ASHIFT (mode
,
5187 gen_lowpart (mode
, inner
),
5188 gen_int_shift_amount (mode
, left_bits
)),
5189 gen_int_shift_amount (mode
, right_bits
)));
5191 split
= find_split_point (&SET_SRC (x
), insn
, true);
5192 if (split
&& split
!= &SET_SRC (x
))
5197 /* See if this is a simple operation with a constant as the second
5198 operand. It might be that this constant is out of range and hence
5199 could be used as a split point. */
5200 if (BINARY_P (SET_SRC (x
))
5201 && CONSTANT_P (XEXP (SET_SRC (x
), 1))
5202 && (OBJECT_P (XEXP (SET_SRC (x
), 0))
5203 || (GET_CODE (XEXP (SET_SRC (x
), 0)) == SUBREG
5204 && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x
), 0))))))
5205 return &XEXP (SET_SRC (x
), 1);
5207 /* Finally, see if this is a simple operation with its first operand
5208 not in a register. The operation might require this operand in a
5209 register, so return it as a split point. We can always do this
5210 because if the first operand were another operation, we would have
5211 already found it as a split point. */
5212 if ((BINARY_P (SET_SRC (x
)) || UNARY_P (SET_SRC (x
)))
5213 && ! register_operand (XEXP (SET_SRC (x
), 0), VOIDmode
))
5214 return &XEXP (SET_SRC (x
), 0);
5220 /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
5221 it is better to write this as (not (ior A B)) so we can split it.
5222 Similarly for IOR. */
5223 if (GET_CODE (XEXP (x
, 0)) == NOT
&& GET_CODE (XEXP (x
, 1)) == NOT
)
5226 gen_rtx_NOT (GET_MODE (x
),
5227 gen_rtx_fmt_ee (code
== IOR
? AND
: IOR
,
5229 XEXP (XEXP (x
, 0), 0),
5230 XEXP (XEXP (x
, 1), 0))));
5231 return find_split_point (loc
, insn
, set_src
);
5234 /* Many RISC machines have a large set of logical insns. If the
5235 second operand is a NOT, put it first so we will try to split the
5236 other operand first. */
5237 if (GET_CODE (XEXP (x
, 1)) == NOT
)
5239 rtx tem
= XEXP (x
, 0);
5240 SUBST (XEXP (x
, 0), XEXP (x
, 1));
5241 SUBST (XEXP (x
, 1), tem
);
5247 /* Canonicalization can produce (minus A (mult B C)), where C is a
5248 constant. It may be better to try splitting (plus (mult B -C) A)
5249 instead if this isn't a multiply by a power of two. */
5250 if (set_src
&& code
== MINUS
&& GET_CODE (XEXP (x
, 1)) == MULT
5251 && GET_CODE (XEXP (XEXP (x
, 1), 1)) == CONST_INT
5252 && !pow2p_hwi (INTVAL (XEXP (XEXP (x
, 1), 1))))
5254 machine_mode mode
= GET_MODE (x
);
5255 unsigned HOST_WIDE_INT this_int
= INTVAL (XEXP (XEXP (x
, 1), 1));
5256 HOST_WIDE_INT other_int
= trunc_int_for_mode (-this_int
, mode
);
5257 SUBST (*loc
, gen_rtx_PLUS (mode
,
5259 XEXP (XEXP (x
, 1), 0),
5260 gen_int_mode (other_int
,
5263 return find_split_point (loc
, insn
, set_src
);
5266 /* Split at a multiply-accumulate instruction. However if this is
5267 the SET_SRC, we likely do not have such an instruction and it's
5268 worthless to try this split. */
5270 && (GET_CODE (XEXP (x
, 0)) == MULT
5271 || (GET_CODE (XEXP (x
, 0)) == ASHIFT
5272 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
)))
5279 /* Otherwise, select our actions depending on our rtx class. */
5280 switch (GET_RTX_CLASS (code
))
5282 case RTX_BITFIELD_OPS
: /* This is ZERO_EXTRACT and SIGN_EXTRACT. */
5284 split
= find_split_point (&XEXP (x
, 2), insn
, false);
5289 case RTX_COMM_ARITH
:
5291 case RTX_COMM_COMPARE
:
5292 split
= find_split_point (&XEXP (x
, 1), insn
, false);
5297 /* Some machines have (and (shift ...) ...) insns. If X is not
5298 an AND, but XEXP (X, 0) is, use it as our split point. */
5299 if (GET_CODE (x
) != AND
&& GET_CODE (XEXP (x
, 0)) == AND
)
5300 return &XEXP (x
, 0);
5302 split
= find_split_point (&XEXP (x
, 0), insn
, false);
5308 /* Otherwise, we don't have a split point. */
5313 /* Throughout X, replace FROM with TO, and return the result.
5314 The result is TO if X is FROM;
5315 otherwise the result is X, but its contents may have been modified.
5316 If they were modified, a record was made in undobuf so that
5317 undo_all will (among other things) return X to its original state.
5319 If the number of changes necessary is too much to record to undo,
5320 the excess changes are not made, so the result is invalid.
5321 The changes already made can still be undone.
5322 undobuf.num_undo is incremented for such changes, so by testing that
5323 the caller can tell whether the result is valid.
5325 `n_occurrences' is incremented each time FROM is replaced.
5327 IN_DEST is nonzero if we are processing the SET_DEST of a SET.
5329 IN_COND is nonzero if we are at the top level of a condition.
5331 UNIQUE_COPY is nonzero if each substitution must be unique. We do this
5332 by copying if `n_occurrences' is nonzero. */
5335 subst (rtx x
, rtx from
, rtx to
, int in_dest
, int in_cond
, int unique_copy
)
5337 enum rtx_code code
= GET_CODE (x
);
5338 machine_mode op0_mode
= VOIDmode
;
5343 /* Two expressions are equal if they are identical copies of a shared
5344 RTX or if they are both registers with the same register number
5347 #define COMBINE_RTX_EQUAL_P(X,Y) \
5349 || (REG_P (X) && REG_P (Y) \
5350 && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
5352 /* Do not substitute into clobbers of regs -- this will never result in
5354 if (GET_CODE (x
) == CLOBBER
&& REG_P (XEXP (x
, 0)))
5357 if (! in_dest
&& COMBINE_RTX_EQUAL_P (x
, from
))
5360 return (unique_copy
&& n_occurrences
> 1 ? copy_rtx (to
) : to
);
5363 /* If X and FROM are the same register but different modes, they
5364 will not have been seen as equal above. However, the log links code
5365 will make a LOG_LINKS entry for that case. If we do nothing, we
5366 will try to rerecognize our original insn and, when it succeeds,
5367 we will delete the feeding insn, which is incorrect.
5369 So force this insn not to match in this (rare) case. */
5370 if (! in_dest
&& code
== REG
&& REG_P (from
)
5371 && reg_overlap_mentioned_p (x
, from
))
5372 return gen_rtx_CLOBBER (GET_MODE (x
), const0_rtx
);
5374 /* If this is an object, we are done unless it is a MEM or LO_SUM, both
5375 of which may contain things that can be combined. */
5376 if (code
!= MEM
&& code
!= LO_SUM
&& OBJECT_P (x
))
5379 /* It is possible to have a subexpression appear twice in the insn.
5380 Suppose that FROM is a register that appears within TO.
5381 Then, after that subexpression has been scanned once by `subst',
5382 the second time it is scanned, TO may be found. If we were
5383 to scan TO here, we would find FROM within it and create a
5384 self-referent rtl structure which is completely wrong. */
5385 if (COMBINE_RTX_EQUAL_P (x
, to
))
5388 /* Parallel asm_operands need special attention because all of the
5389 inputs are shared across the arms. Furthermore, unsharing the
5390 rtl results in recognition failures. Failure to handle this case
5391 specially can result in circular rtl.
5393 Solve this by doing a normal pass across the first entry of the
5394 parallel, and only processing the SET_DESTs of the subsequent
5397 if (code
== PARALLEL
5398 && GET_CODE (XVECEXP (x
, 0, 0)) == SET
5399 && GET_CODE (SET_SRC (XVECEXP (x
, 0, 0))) == ASM_OPERANDS
)
5401 new_rtx
= subst (XVECEXP (x
, 0, 0), from
, to
, 0, 0, unique_copy
);
5403 /* If this substitution failed, this whole thing fails. */
5404 if (GET_CODE (new_rtx
) == CLOBBER
5405 && XEXP (new_rtx
, 0) == const0_rtx
)
5408 SUBST (XVECEXP (x
, 0, 0), new_rtx
);
5410 for (i
= XVECLEN (x
, 0) - 1; i
>= 1; i
--)
5412 rtx dest
= SET_DEST (XVECEXP (x
, 0, i
));
5415 && GET_CODE (dest
) != CC0
5416 && GET_CODE (dest
) != PC
)
5418 new_rtx
= subst (dest
, from
, to
, 0, 0, unique_copy
);
5420 /* If this substitution failed, this whole thing fails. */
5421 if (GET_CODE (new_rtx
) == CLOBBER
5422 && XEXP (new_rtx
, 0) == const0_rtx
)
5425 SUBST (SET_DEST (XVECEXP (x
, 0, i
)), new_rtx
);
5431 len
= GET_RTX_LENGTH (code
);
5432 fmt
= GET_RTX_FORMAT (code
);
5434 /* We don't need to process a SET_DEST that is a register, CC0,
5435 or PC, so set up to skip this common case. All other cases
5436 where we want to suppress replacing something inside a
5437 SET_SRC are handled via the IN_DEST operand. */
5439 && (REG_P (SET_DEST (x
))
5440 || GET_CODE (SET_DEST (x
)) == CC0
5441 || GET_CODE (SET_DEST (x
)) == PC
))
5444 /* Trying to simplify the operands of a widening MULT is not likely
5445 to create RTL matching a machine insn. */
5447 && (GET_CODE (XEXP (x
, 0)) == ZERO_EXTEND
5448 || GET_CODE (XEXP (x
, 0)) == SIGN_EXTEND
)
5449 && (GET_CODE (XEXP (x
, 1)) == ZERO_EXTEND
5450 || GET_CODE (XEXP (x
, 1)) == SIGN_EXTEND
)
5451 && REG_P (XEXP (XEXP (x
, 0), 0))
5452 && REG_P (XEXP (XEXP (x
, 1), 0))
5457 /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
5460 op0_mode
= GET_MODE (XEXP (x
, 0));
5462 for (i
= 0; i
< len
; i
++)
5467 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
5469 if (COMBINE_RTX_EQUAL_P (XVECEXP (x
, i
, j
), from
))
5471 new_rtx
= (unique_copy
&& n_occurrences
5472 ? copy_rtx (to
) : to
);
5477 new_rtx
= subst (XVECEXP (x
, i
, j
), from
, to
, 0, 0,
5480 /* If this substitution failed, this whole thing
5482 if (GET_CODE (new_rtx
) == CLOBBER
5483 && XEXP (new_rtx
, 0) == const0_rtx
)
5487 SUBST (XVECEXP (x
, i
, j
), new_rtx
);
5490 else if (fmt
[i
] == 'e')
5492 /* If this is a register being set, ignore it. */
5493 new_rtx
= XEXP (x
, i
);
5496 && (((code
== SUBREG
|| code
== ZERO_EXTRACT
)
5498 || code
== STRICT_LOW_PART
))
5501 else if (COMBINE_RTX_EQUAL_P (XEXP (x
, i
), from
))
5503 /* In general, don't install a subreg involving two
5504 modes not tieable. It can worsen register
5505 allocation, and can even make invalid reload
5506 insns, since the reg inside may need to be copied
5507 from in the outside mode, and that may be invalid
5508 if it is an fp reg copied in integer mode.
5510 We allow two exceptions to this: It is valid if
5511 it is inside another SUBREG and the mode of that
5512 SUBREG and the mode of the inside of TO is
5513 tieable and it is valid if X is a SET that copies
5516 if (GET_CODE (to
) == SUBREG
5517 && !targetm
.modes_tieable_p (GET_MODE (to
),
5518 GET_MODE (SUBREG_REG (to
)))
5519 && ! (code
== SUBREG
5520 && (targetm
.modes_tieable_p
5521 (GET_MODE (x
), GET_MODE (SUBREG_REG (to
)))))
5525 && XEXP (x
, 0) == cc0_rtx
))))
5526 return gen_rtx_CLOBBER (VOIDmode
, const0_rtx
);
5530 && REGNO (to
) < FIRST_PSEUDO_REGISTER
5531 && simplify_subreg_regno (REGNO (to
), GET_MODE (to
),
5534 return gen_rtx_CLOBBER (VOIDmode
, const0_rtx
);
5536 new_rtx
= (unique_copy
&& n_occurrences
? copy_rtx (to
) : to
);
5540 /* If we are in a SET_DEST, suppress most cases unless we
5541 have gone inside a MEM, in which case we want to
5542 simplify the address. We assume here that things that
5543 are actually part of the destination have their inner
5544 parts in the first expression. This is true for SUBREG,
5545 STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
5546 things aside from REG and MEM that should appear in a
5548 new_rtx
= subst (XEXP (x
, i
), from
, to
,
5550 && (code
== SUBREG
|| code
== STRICT_LOW_PART
5551 || code
== ZERO_EXTRACT
))
5554 code
== IF_THEN_ELSE
&& i
== 0,
5557 /* If we found that we will have to reject this combination,
5558 indicate that by returning the CLOBBER ourselves, rather than
5559 an expression containing it. This will speed things up as
5560 well as prevent accidents where two CLOBBERs are considered
5561 to be equal, thus producing an incorrect simplification. */
5563 if (GET_CODE (new_rtx
) == CLOBBER
&& XEXP (new_rtx
, 0) == const0_rtx
)
5566 if (GET_CODE (x
) == SUBREG
&& CONST_SCALAR_INT_P (new_rtx
))
5568 machine_mode mode
= GET_MODE (x
);
5570 x
= simplify_subreg (GET_MODE (x
), new_rtx
,
5571 GET_MODE (SUBREG_REG (x
)),
5574 x
= gen_rtx_CLOBBER (mode
, const0_rtx
);
5576 else if (CONST_SCALAR_INT_P (new_rtx
)
5577 && GET_CODE (x
) == ZERO_EXTEND
)
5579 x
= simplify_unary_operation (ZERO_EXTEND
, GET_MODE (x
),
5580 new_rtx
, GET_MODE (XEXP (x
, 0)));
5584 SUBST (XEXP (x
, i
), new_rtx
);
5589 /* Check if we are loading something from the constant pool via float
5590 extension; in this case we would undo compress_float_constant
5591 optimization and degenerate constant load to an immediate value. */
5592 if (GET_CODE (x
) == FLOAT_EXTEND
5593 && MEM_P (XEXP (x
, 0))
5594 && MEM_READONLY_P (XEXP (x
, 0)))
5596 rtx tmp
= avoid_constant_pool_reference (x
);
5601 /* Try to simplify X. If the simplification changed the code, it is likely
5602 that further simplification will help, so loop, but limit the number
5603 of repetitions that will be performed. */
5605 for (i
= 0; i
< 4; i
++)
5607 /* If X is sufficiently simple, don't bother trying to do anything
5609 if (code
!= CONST_INT
&& code
!= REG
&& code
!= CLOBBER
)
5610 x
= combine_simplify_rtx (x
, op0_mode
, in_dest
, in_cond
);
5612 if (GET_CODE (x
) == code
)
5615 code
= GET_CODE (x
);
5617 /* We no longer know the original mode of operand 0 since we
5618 have changed the form of X) */
5619 op0_mode
= VOIDmode
;
5625 /* If X is a commutative operation whose operands are not in the canonical
5626 order, use substitutions to swap them. */
5629 maybe_swap_commutative_operands (rtx x
)
5631 if (COMMUTATIVE_ARITH_P (x
)
5632 && swap_commutative_operands_p (XEXP (x
, 0), XEXP (x
, 1)))
5634 rtx temp
= XEXP (x
, 0);
5635 SUBST (XEXP (x
, 0), XEXP (x
, 1));
5636 SUBST (XEXP (x
, 1), temp
);
5640 /* Simplify X, a piece of RTL. We just operate on the expression at the
5641 outer level; call `subst' to simplify recursively. Return the new
5644 OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero
5645 if we are inside a SET_DEST. IN_COND is nonzero if we are at the top level
5649 combine_simplify_rtx (rtx x
, machine_mode op0_mode
, int in_dest
,
5652 enum rtx_code code
= GET_CODE (x
);
5653 machine_mode mode
= GET_MODE (x
);
5654 scalar_int_mode int_mode
;
5658 /* If this is a commutative operation, put a constant last and a complex
5659 expression first. We don't need to do this for comparisons here. */
5660 maybe_swap_commutative_operands (x
);
5662 /* Try to fold this expression in case we have constants that weren't
5665 switch (GET_RTX_CLASS (code
))
5668 if (op0_mode
== VOIDmode
)
5669 op0_mode
= GET_MODE (XEXP (x
, 0));
5670 temp
= simplify_unary_operation (code
, mode
, XEXP (x
, 0), op0_mode
);
5673 case RTX_COMM_COMPARE
:
5675 machine_mode cmp_mode
= GET_MODE (XEXP (x
, 0));
5676 if (cmp_mode
== VOIDmode
)
5678 cmp_mode
= GET_MODE (XEXP (x
, 1));
5679 if (cmp_mode
== VOIDmode
)
5680 cmp_mode
= op0_mode
;
5682 temp
= simplify_relational_operation (code
, mode
, cmp_mode
,
5683 XEXP (x
, 0), XEXP (x
, 1));
5686 case RTX_COMM_ARITH
:
5688 temp
= simplify_binary_operation (code
, mode
, XEXP (x
, 0), XEXP (x
, 1));
5690 case RTX_BITFIELD_OPS
:
5692 temp
= simplify_ternary_operation (code
, mode
, op0_mode
, XEXP (x
, 0),
5693 XEXP (x
, 1), XEXP (x
, 2));
5702 code
= GET_CODE (temp
);
5703 op0_mode
= VOIDmode
;
5704 mode
= GET_MODE (temp
);
5707 /* If this is a simple operation applied to an IF_THEN_ELSE, try
5708 applying it to the arms of the IF_THEN_ELSE. This often simplifies
5709 things. Check for cases where both arms are testing the same
5712 Don't do anything if all operands are very simple. */
5715 && ((!OBJECT_P (XEXP (x
, 0))
5716 && ! (GET_CODE (XEXP (x
, 0)) == SUBREG
5717 && OBJECT_P (SUBREG_REG (XEXP (x
, 0)))))
5718 || (!OBJECT_P (XEXP (x
, 1))
5719 && ! (GET_CODE (XEXP (x
, 1)) == SUBREG
5720 && OBJECT_P (SUBREG_REG (XEXP (x
, 1)))))))
5722 && (!OBJECT_P (XEXP (x
, 0))
5723 && ! (GET_CODE (XEXP (x
, 0)) == SUBREG
5724 && OBJECT_P (SUBREG_REG (XEXP (x
, 0)))))))
5726 rtx cond
, true_rtx
, false_rtx
;
5728 cond
= if_then_else_cond (x
, &true_rtx
, &false_rtx
);
5730 /* If everything is a comparison, what we have is highly unlikely
5731 to be simpler, so don't use it. */
5732 && ! (COMPARISON_P (x
)
5733 && (COMPARISON_P (true_rtx
) || COMPARISON_P (false_rtx
)))
5734 /* Similarly, if we end up with one of the expressions the same
5735 as the original, it is certainly not simpler. */
5736 && ! rtx_equal_p (x
, true_rtx
)
5737 && ! rtx_equal_p (x
, false_rtx
))
5739 rtx cop1
= const0_rtx
;
5740 enum rtx_code cond_code
= simplify_comparison (NE
, &cond
, &cop1
);
5742 if (cond_code
== NE
&& COMPARISON_P (cond
))
5745 /* Simplify the alternative arms; this may collapse the true and
5746 false arms to store-flag values. Be careful to use copy_rtx
5747 here since true_rtx or false_rtx might share RTL with x as a
5748 result of the if_then_else_cond call above. */
5749 true_rtx
= subst (copy_rtx (true_rtx
), pc_rtx
, pc_rtx
, 0, 0, 0);
5750 false_rtx
= subst (copy_rtx (false_rtx
), pc_rtx
, pc_rtx
, 0, 0, 0);
5752 /* If true_rtx and false_rtx are not general_operands, an if_then_else
5753 is unlikely to be simpler. */
5754 if (general_operand (true_rtx
, VOIDmode
)
5755 && general_operand (false_rtx
, VOIDmode
))
5757 enum rtx_code reversed
;
5759 /* Restarting if we generate a store-flag expression will cause
5760 us to loop. Just drop through in this case. */
5762 /* If the result values are STORE_FLAG_VALUE and zero, we can
5763 just make the comparison operation. */
5764 if (true_rtx
== const_true_rtx
&& false_rtx
== const0_rtx
)
5765 x
= simplify_gen_relational (cond_code
, mode
, VOIDmode
,
5767 else if (true_rtx
== const0_rtx
&& false_rtx
== const_true_rtx
5768 && ((reversed
= reversed_comparison_code_parts
5769 (cond_code
, cond
, cop1
, NULL
))
5771 x
= simplify_gen_relational (reversed
, mode
, VOIDmode
,
5774 /* Likewise, we can make the negate of a comparison operation
5775 if the result values are - STORE_FLAG_VALUE and zero. */
5776 else if (CONST_INT_P (true_rtx
)
5777 && INTVAL (true_rtx
) == - STORE_FLAG_VALUE
5778 && false_rtx
== const0_rtx
)
5779 x
= simplify_gen_unary (NEG
, mode
,
5780 simplify_gen_relational (cond_code
,
5784 else if (CONST_INT_P (false_rtx
)
5785 && INTVAL (false_rtx
) == - STORE_FLAG_VALUE
5786 && true_rtx
== const0_rtx
5787 && ((reversed
= reversed_comparison_code_parts
5788 (cond_code
, cond
, cop1
, NULL
))
5790 x
= simplify_gen_unary (NEG
, mode
,
5791 simplify_gen_relational (reversed
,
5796 return gen_rtx_IF_THEN_ELSE (mode
,
5797 simplify_gen_relational (cond_code
,
5802 true_rtx
, false_rtx
);
5804 code
= GET_CODE (x
);
5805 op0_mode
= VOIDmode
;
5810 /* First see if we can apply the inverse distributive law. */
5811 if (code
== PLUS
|| code
== MINUS
5812 || code
== AND
|| code
== IOR
|| code
== XOR
)
5814 x
= apply_distributive_law (x
);
5815 code
= GET_CODE (x
);
5816 op0_mode
= VOIDmode
;
5819 /* If CODE is an associative operation not otherwise handled, see if we
5820 can associate some operands. This can win if they are constants or
5821 if they are logically related (i.e. (a & b) & a). */
5822 if ((code
== PLUS
|| code
== MINUS
|| code
== MULT
|| code
== DIV
5823 || code
== AND
|| code
== IOR
|| code
== XOR
5824 || code
== SMAX
|| code
== SMIN
|| code
== UMAX
|| code
== UMIN
)
5825 && ((INTEGRAL_MODE_P (mode
) && code
!= DIV
)
5826 || (flag_associative_math
&& FLOAT_MODE_P (mode
))))
5828 if (GET_CODE (XEXP (x
, 0)) == code
)
5830 rtx other
= XEXP (XEXP (x
, 0), 0);
5831 rtx inner_op0
= XEXP (XEXP (x
, 0), 1);
5832 rtx inner_op1
= XEXP (x
, 1);
5835 /* Make sure we pass the constant operand if any as the second
5836 one if this is a commutative operation. */
5837 if (CONSTANT_P (inner_op0
) && COMMUTATIVE_ARITH_P (x
))
5838 std::swap (inner_op0
, inner_op1
);
5839 inner
= simplify_binary_operation (code
== MINUS
? PLUS
5840 : code
== DIV
? MULT
5842 mode
, inner_op0
, inner_op1
);
5844 /* For commutative operations, try the other pair if that one
5846 if (inner
== 0 && COMMUTATIVE_ARITH_P (x
))
5848 other
= XEXP (XEXP (x
, 0), 1);
5849 inner
= simplify_binary_operation (code
, mode
,
5850 XEXP (XEXP (x
, 0), 0),
5855 return simplify_gen_binary (code
, mode
, other
, inner
);
5859 /* A little bit of algebraic simplification here. */
5863 /* Ensure that our address has any ASHIFTs converted to MULT in case
5864 address-recognizing predicates are called later. */
5865 temp
= make_compound_operation (XEXP (x
, 0), MEM
);
5866 SUBST (XEXP (x
, 0), temp
);
5870 if (op0_mode
== VOIDmode
)
5871 op0_mode
= GET_MODE (SUBREG_REG (x
));
5873 /* See if this can be moved to simplify_subreg. */
5874 if (CONSTANT_P (SUBREG_REG (x
))
5875 && known_eq (subreg_lowpart_offset (mode
, op0_mode
), SUBREG_BYTE (x
))
5876 /* Don't call gen_lowpart if the inner mode
5877 is VOIDmode and we cannot simplify it, as SUBREG without
5878 inner mode is invalid. */
5879 && (GET_MODE (SUBREG_REG (x
)) != VOIDmode
5880 || gen_lowpart_common (mode
, SUBREG_REG (x
))))
5881 return gen_lowpart (mode
, SUBREG_REG (x
));
5883 if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x
))) == MODE_CC
)
5887 temp
= simplify_subreg (mode
, SUBREG_REG (x
), op0_mode
,
5892 /* If op is known to have all lower bits zero, the result is zero. */
5893 scalar_int_mode int_mode
, int_op0_mode
;
5895 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
5896 && is_a
<scalar_int_mode
> (op0_mode
, &int_op0_mode
)
5897 && (GET_MODE_PRECISION (int_mode
)
5898 < GET_MODE_PRECISION (int_op0_mode
))
5899 && known_eq (subreg_lowpart_offset (int_mode
, int_op0_mode
),
5901 && HWI_COMPUTABLE_MODE_P (int_op0_mode
)
5902 && (nonzero_bits (SUBREG_REG (x
), int_op0_mode
)
5903 & GET_MODE_MASK (int_mode
)) == 0)
5904 return CONST0_RTX (int_mode
);
5907 /* Don't change the mode of the MEM if that would change the meaning
5909 if (MEM_P (SUBREG_REG (x
))
5910 && (MEM_VOLATILE_P (SUBREG_REG (x
))
5911 || mode_dependent_address_p (XEXP (SUBREG_REG (x
), 0),
5912 MEM_ADDR_SPACE (SUBREG_REG (x
)))))
5913 return gen_rtx_CLOBBER (mode
, const0_rtx
);
5915 /* Note that we cannot do any narrowing for non-constants since
5916 we might have been counting on using the fact that some bits were
5917 zero. We now do this in the SET. */
5922 temp
= expand_compound_operation (XEXP (x
, 0));
5924 /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
5925 replaced by (lshiftrt X C). This will convert
5926 (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */
5928 if (GET_CODE (temp
) == ASHIFTRT
5929 && CONST_INT_P (XEXP (temp
, 1))
5930 && INTVAL (XEXP (temp
, 1)) == GET_MODE_UNIT_PRECISION (mode
) - 1)
5931 return simplify_shift_const (NULL_RTX
, LSHIFTRT
, mode
, XEXP (temp
, 0),
5932 INTVAL (XEXP (temp
, 1)));
5934 /* If X has only a single bit that might be nonzero, say, bit I, convert
5935 (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
5936 MODE minus 1. This will convert (neg (zero_extract X 1 Y)) to
5937 (sign_extract X 1 Y). But only do this if TEMP isn't a register
5938 or a SUBREG of one since we'd be making the expression more
5939 complex if it was just a register. */
5942 && ! (GET_CODE (temp
) == SUBREG
5943 && REG_P (SUBREG_REG (temp
)))
5944 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
5945 && (i
= exact_log2 (nonzero_bits (temp
, int_mode
))) >= 0)
5947 rtx temp1
= simplify_shift_const
5948 (NULL_RTX
, ASHIFTRT
, int_mode
,
5949 simplify_shift_const (NULL_RTX
, ASHIFT
, int_mode
, temp
,
5950 GET_MODE_PRECISION (int_mode
) - 1 - i
),
5951 GET_MODE_PRECISION (int_mode
) - 1 - i
);
5953 /* If all we did was surround TEMP with the two shifts, we
5954 haven't improved anything, so don't use it. Otherwise,
5955 we are better off with TEMP1. */
5956 if (GET_CODE (temp1
) != ASHIFTRT
5957 || GET_CODE (XEXP (temp1
, 0)) != ASHIFT
5958 || XEXP (XEXP (temp1
, 0), 0) != temp
)
5964 /* We can't handle truncation to a partial integer mode here
5965 because we don't know the real bitsize of the partial
5967 if (GET_MODE_CLASS (mode
) == MODE_PARTIAL_INT
)
5970 if (HWI_COMPUTABLE_MODE_P (mode
))
5972 force_to_mode (XEXP (x
, 0), GET_MODE (XEXP (x
, 0)),
5973 GET_MODE_MASK (mode
), 0));
5975 /* We can truncate a constant value and return it. */
5976 if (CONST_INT_P (XEXP (x
, 0)))
5977 return gen_int_mode (INTVAL (XEXP (x
, 0)), mode
);
5979 /* Similarly to what we do in simplify-rtx.c, a truncate of a register
5980 whose value is a comparison can be replaced with a subreg if
5981 STORE_FLAG_VALUE permits. */
5982 if (HWI_COMPUTABLE_MODE_P (mode
)
5983 && (STORE_FLAG_VALUE
& ~GET_MODE_MASK (mode
)) == 0
5984 && (temp
= get_last_value (XEXP (x
, 0)))
5985 && COMPARISON_P (temp
))
5986 return gen_lowpart (mode
, XEXP (x
, 0));
5990 /* (const (const X)) can become (const X). Do it this way rather than
5991 returning the inner CONST since CONST can be shared with a
5993 if (GET_CODE (XEXP (x
, 0)) == CONST
)
5994 SUBST (XEXP (x
, 0), XEXP (XEXP (x
, 0), 0));
5998 /* Convert (lo_sum (high FOO) FOO) to FOO. This is necessary so we
5999 can add in an offset. find_split_point will split this address up
6000 again if it doesn't match. */
6001 if (HAVE_lo_sum
&& GET_CODE (XEXP (x
, 0)) == HIGH
6002 && rtx_equal_p (XEXP (XEXP (x
, 0), 0), XEXP (x
, 1)))
6007 /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
6008 when c is (const_int (pow2 + 1) / 2) is a sign extension of a
6009 bit-field and can be replaced by either a sign_extend or a
6010 sign_extract. The `and' may be a zero_extend and the two
6011 <c>, -<c> constants may be reversed. */
6012 if (GET_CODE (XEXP (x
, 0)) == XOR
6013 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
6014 && CONST_INT_P (XEXP (x
, 1))
6015 && CONST_INT_P (XEXP (XEXP (x
, 0), 1))
6016 && INTVAL (XEXP (x
, 1)) == -INTVAL (XEXP (XEXP (x
, 0), 1))
6017 && ((i
= exact_log2 (UINTVAL (XEXP (XEXP (x
, 0), 1)))) >= 0
6018 || (i
= exact_log2 (UINTVAL (XEXP (x
, 1)))) >= 0)
6019 && HWI_COMPUTABLE_MODE_P (int_mode
)
6020 && ((GET_CODE (XEXP (XEXP (x
, 0), 0)) == AND
6021 && CONST_INT_P (XEXP (XEXP (XEXP (x
, 0), 0), 1))
6022 && (UINTVAL (XEXP (XEXP (XEXP (x
, 0), 0), 1))
6023 == (HOST_WIDE_INT_1U
<< (i
+ 1)) - 1))
6024 || (GET_CODE (XEXP (XEXP (x
, 0), 0)) == ZERO_EXTEND
6025 && known_eq ((GET_MODE_PRECISION
6026 (GET_MODE (XEXP (XEXP (XEXP (x
, 0), 0), 0)))),
6027 (unsigned int) i
+ 1))))
6028 return simplify_shift_const
6029 (NULL_RTX
, ASHIFTRT
, int_mode
,
6030 simplify_shift_const (NULL_RTX
, ASHIFT
, int_mode
,
6031 XEXP (XEXP (XEXP (x
, 0), 0), 0),
6032 GET_MODE_PRECISION (int_mode
) - (i
+ 1)),
6033 GET_MODE_PRECISION (int_mode
) - (i
+ 1));
6035 /* If only the low-order bit of X is possibly nonzero, (plus x -1)
6036 can become (ashiftrt (ashift (xor x 1) C) C) where C is
6037 the bitsize of the mode - 1. This allows simplification of
6038 "a = (b & 8) == 0;" */
6039 if (XEXP (x
, 1) == constm1_rtx
6040 && !REG_P (XEXP (x
, 0))
6041 && ! (GET_CODE (XEXP (x
, 0)) == SUBREG
6042 && REG_P (SUBREG_REG (XEXP (x
, 0))))
6043 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
6044 && nonzero_bits (XEXP (x
, 0), int_mode
) == 1)
6045 return simplify_shift_const
6046 (NULL_RTX
, ASHIFTRT
, int_mode
,
6047 simplify_shift_const (NULL_RTX
, ASHIFT
, int_mode
,
6048 gen_rtx_XOR (int_mode
, XEXP (x
, 0),
6050 GET_MODE_PRECISION (int_mode
) - 1),
6051 GET_MODE_PRECISION (int_mode
) - 1);
6053 /* If we are adding two things that have no bits in common, convert
6054 the addition into an IOR. This will often be further simplified,
6055 for example in cases like ((a & 1) + (a & 2)), which can
6058 if (HWI_COMPUTABLE_MODE_P (mode
)
6059 && (nonzero_bits (XEXP (x
, 0), mode
)
6060 & nonzero_bits (XEXP (x
, 1), mode
)) == 0)
6062 /* Try to simplify the expression further. */
6063 rtx tor
= simplify_gen_binary (IOR
, mode
, XEXP (x
, 0), XEXP (x
, 1));
6064 temp
= combine_simplify_rtx (tor
, VOIDmode
, in_dest
, 0);
6066 /* If we could, great. If not, do not go ahead with the IOR
6067 replacement, since PLUS appears in many special purpose
6068 address arithmetic instructions. */
6069 if (GET_CODE (temp
) != CLOBBER
6070 && (GET_CODE (temp
) != IOR
6071 || ((XEXP (temp
, 0) != XEXP (x
, 0)
6072 || XEXP (temp
, 1) != XEXP (x
, 1))
6073 && (XEXP (temp
, 0) != XEXP (x
, 1)
6074 || XEXP (temp
, 1) != XEXP (x
, 0)))))
6078 /* Canonicalize x + x into x << 1. */
6079 if (GET_MODE_CLASS (mode
) == MODE_INT
6080 && rtx_equal_p (XEXP (x
, 0), XEXP (x
, 1))
6081 && !side_effects_p (XEXP (x
, 0)))
6082 return simplify_gen_binary (ASHIFT
, mode
, XEXP (x
, 0), const1_rtx
);
6087 /* (minus <foo> (and <foo> (const_int -pow2))) becomes
6088 (and <foo> (const_int pow2-1)) */
6089 if (is_a
<scalar_int_mode
> (mode
, &int_mode
)
6090 && GET_CODE (XEXP (x
, 1)) == AND
6091 && CONST_INT_P (XEXP (XEXP (x
, 1), 1))
6092 && pow2p_hwi (-UINTVAL (XEXP (XEXP (x
, 1), 1)))
6093 && rtx_equal_p (XEXP (XEXP (x
, 1), 0), XEXP (x
, 0)))
6094 return simplify_and_const_int (NULL_RTX
, int_mode
, XEXP (x
, 0),
6095 -INTVAL (XEXP (XEXP (x
, 1), 1)) - 1);
6099 /* If we have (mult (plus A B) C), apply the distributive law and then
6100 the inverse distributive law to see if things simplify. This
6101 occurs mostly in addresses, often when unrolling loops. */
6103 if (GET_CODE (XEXP (x
, 0)) == PLUS
)
6105 rtx result
= distribute_and_simplify_rtx (x
, 0);
6110 /* Try simplify a*(b/c) as (a*b)/c. */
6111 if (FLOAT_MODE_P (mode
) && flag_associative_math
6112 && GET_CODE (XEXP (x
, 0)) == DIV
)
6114 rtx tem
= simplify_binary_operation (MULT
, mode
,
6115 XEXP (XEXP (x
, 0), 0),
6118 return simplify_gen_binary (DIV
, mode
, tem
, XEXP (XEXP (x
, 0), 1));
6123 /* If this is a divide by a power of two, treat it as a shift if
6124 its first operand is a shift. */
6125 if (is_a
<scalar_int_mode
> (mode
, &int_mode
)
6126 && CONST_INT_P (XEXP (x
, 1))
6127 && (i
= exact_log2 (UINTVAL (XEXP (x
, 1)))) >= 0
6128 && (GET_CODE (XEXP (x
, 0)) == ASHIFT
6129 || GET_CODE (XEXP (x
, 0)) == LSHIFTRT
6130 || GET_CODE (XEXP (x
, 0)) == ASHIFTRT
6131 || GET_CODE (XEXP (x
, 0)) == ROTATE
6132 || GET_CODE (XEXP (x
, 0)) == ROTATERT
))
6133 return simplify_shift_const (NULL_RTX
, LSHIFTRT
, int_mode
,
6138 case GT
: case GTU
: case GE
: case GEU
:
6139 case LT
: case LTU
: case LE
: case LEU
:
6140 case UNEQ
: case LTGT
:
6141 case UNGT
: case UNGE
:
6142 case UNLT
: case UNLE
:
6143 case UNORDERED
: case ORDERED
:
6144 /* If the first operand is a condition code, we can't do anything
6146 if (GET_CODE (XEXP (x
, 0)) == COMPARE
6147 || (GET_MODE_CLASS (GET_MODE (XEXP (x
, 0))) != MODE_CC
6148 && ! CC0_P (XEXP (x
, 0))))
6150 rtx op0
= XEXP (x
, 0);
6151 rtx op1
= XEXP (x
, 1);
6152 enum rtx_code new_code
;
6154 if (GET_CODE (op0
) == COMPARE
)
6155 op1
= XEXP (op0
, 1), op0
= XEXP (op0
, 0);
6157 /* Simplify our comparison, if possible. */
6158 new_code
= simplify_comparison (code
, &op0
, &op1
);
6160 /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
6161 if only the low-order bit is possibly nonzero in X (such as when
6162 X is a ZERO_EXTRACT of one bit). Similarly, we can convert EQ to
6163 (xor X 1) or (minus 1 X); we use the former. Finally, if X is
6164 known to be either 0 or -1, NE becomes a NEG and EQ becomes
6167 Remove any ZERO_EXTRACT we made when thinking this was a
6168 comparison. It may now be simpler to use, e.g., an AND. If a
6169 ZERO_EXTRACT is indeed appropriate, it will be placed back by
6170 the call to make_compound_operation in the SET case.
6172 Don't apply these optimizations if the caller would
6173 prefer a comparison rather than a value.
6174 E.g., for the condition in an IF_THEN_ELSE most targets need
6175 an explicit comparison. */
6180 else if (STORE_FLAG_VALUE
== 1
6182 && is_int_mode (mode
, &int_mode
)
6183 && op1
== const0_rtx
6184 && int_mode
== GET_MODE (op0
)
6185 && nonzero_bits (op0
, int_mode
) == 1)
6186 return gen_lowpart (int_mode
,
6187 expand_compound_operation (op0
));
6189 else if (STORE_FLAG_VALUE
== 1
6191 && is_int_mode (mode
, &int_mode
)
6192 && op1
== const0_rtx
6193 && int_mode
== GET_MODE (op0
)
6194 && (num_sign_bit_copies (op0
, int_mode
)
6195 == GET_MODE_PRECISION (int_mode
)))
6197 op0
= expand_compound_operation (op0
);
6198 return simplify_gen_unary (NEG
, int_mode
,
6199 gen_lowpart (int_mode
, op0
),
6203 else if (STORE_FLAG_VALUE
== 1
6205 && is_int_mode (mode
, &int_mode
)
6206 && op1
== const0_rtx
6207 && int_mode
== GET_MODE (op0
)
6208 && nonzero_bits (op0
, int_mode
) == 1)
6210 op0
= expand_compound_operation (op0
);
6211 return simplify_gen_binary (XOR
, int_mode
,
6212 gen_lowpart (int_mode
, op0
),
6216 else if (STORE_FLAG_VALUE
== 1
6218 && is_int_mode (mode
, &int_mode
)
6219 && op1
== const0_rtx
6220 && int_mode
== GET_MODE (op0
)
6221 && (num_sign_bit_copies (op0
, int_mode
)
6222 == GET_MODE_PRECISION (int_mode
)))
6224 op0
= expand_compound_operation (op0
);
6225 return plus_constant (int_mode
, gen_lowpart (int_mode
, op0
), 1);
6228 /* If STORE_FLAG_VALUE is -1, we have cases similar to
6233 else if (STORE_FLAG_VALUE
== -1
6235 && is_int_mode (mode
, &int_mode
)
6236 && op1
== const0_rtx
6237 && int_mode
== GET_MODE (op0
)
6238 && (num_sign_bit_copies (op0
, int_mode
)
6239 == GET_MODE_PRECISION (int_mode
)))
6240 return gen_lowpart (int_mode
, expand_compound_operation (op0
));
6242 else if (STORE_FLAG_VALUE
== -1
6244 && is_int_mode (mode
, &int_mode
)
6245 && op1
== const0_rtx
6246 && int_mode
== GET_MODE (op0
)
6247 && nonzero_bits (op0
, int_mode
) == 1)
6249 op0
= expand_compound_operation (op0
);
6250 return simplify_gen_unary (NEG
, int_mode
,
6251 gen_lowpart (int_mode
, op0
),
6255 else if (STORE_FLAG_VALUE
== -1
6257 && is_int_mode (mode
, &int_mode
)
6258 && op1
== const0_rtx
6259 && int_mode
== GET_MODE (op0
)
6260 && (num_sign_bit_copies (op0
, int_mode
)
6261 == GET_MODE_PRECISION (int_mode
)))
6263 op0
= expand_compound_operation (op0
);
6264 return simplify_gen_unary (NOT
, int_mode
,
6265 gen_lowpart (int_mode
, op0
),
6269 /* If X is 0/1, (eq X 0) is X-1. */
6270 else if (STORE_FLAG_VALUE
== -1
6272 && is_int_mode (mode
, &int_mode
)
6273 && op1
== const0_rtx
6274 && int_mode
== GET_MODE (op0
)
6275 && nonzero_bits (op0
, int_mode
) == 1)
6277 op0
= expand_compound_operation (op0
);
6278 return plus_constant (int_mode
, gen_lowpart (int_mode
, op0
), -1);
6281 /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
6282 one bit that might be nonzero, we can convert (ne x 0) to
6283 (ashift x c) where C puts the bit in the sign bit. Remove any
6284 AND with STORE_FLAG_VALUE when we are done, since we are only
6285 going to test the sign bit. */
6287 && is_int_mode (mode
, &int_mode
)
6288 && HWI_COMPUTABLE_MODE_P (int_mode
)
6289 && val_signbit_p (int_mode
, STORE_FLAG_VALUE
)
6290 && op1
== const0_rtx
6291 && int_mode
== GET_MODE (op0
)
6292 && (i
= exact_log2 (nonzero_bits (op0
, int_mode
))) >= 0)
6294 x
= simplify_shift_const (NULL_RTX
, ASHIFT
, int_mode
,
6295 expand_compound_operation (op0
),
6296 GET_MODE_PRECISION (int_mode
) - 1 - i
);
6297 if (GET_CODE (x
) == AND
&& XEXP (x
, 1) == const_true_rtx
)
6303 /* If the code changed, return a whole new comparison.
6304 We also need to avoid using SUBST in cases where
6305 simplify_comparison has widened a comparison with a CONST_INT,
6306 since in that case the wider CONST_INT may fail the sanity
6307 checks in do_SUBST. */
6308 if (new_code
!= code
6309 || (CONST_INT_P (op1
)
6310 && GET_MODE (op0
) != GET_MODE (XEXP (x
, 0))
6311 && GET_MODE (op0
) != GET_MODE (XEXP (x
, 1))))
6312 return gen_rtx_fmt_ee (new_code
, mode
, op0
, op1
);
6314 /* Otherwise, keep this operation, but maybe change its operands.
6315 This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR). */
6316 SUBST (XEXP (x
, 0), op0
);
6317 SUBST (XEXP (x
, 1), op1
);
6322 return simplify_if_then_else (x
);
6328 /* If we are processing SET_DEST, we are done. */
6332 return expand_compound_operation (x
);
6335 return simplify_set (x
);
6339 return simplify_logical (x
);
6346 /* If this is a shift by a constant amount, simplify it. */
6347 if (CONST_INT_P (XEXP (x
, 1)))
6348 return simplify_shift_const (x
, code
, mode
, XEXP (x
, 0),
6349 INTVAL (XEXP (x
, 1)));
6351 else if (SHIFT_COUNT_TRUNCATED
&& !REG_P (XEXP (x
, 1)))
6353 force_to_mode (XEXP (x
, 1), GET_MODE (XEXP (x
, 1)),
6355 << exact_log2 (GET_MODE_UNIT_BITSIZE
6368 /* Simplify X, an IF_THEN_ELSE expression. Return the new expression. */
6371 simplify_if_then_else (rtx x
)
6373 machine_mode mode
= GET_MODE (x
);
6374 rtx cond
= XEXP (x
, 0);
6375 rtx true_rtx
= XEXP (x
, 1);
6376 rtx false_rtx
= XEXP (x
, 2);
6377 enum rtx_code true_code
= GET_CODE (cond
);
6378 int comparison_p
= COMPARISON_P (cond
);
6381 enum rtx_code false_code
;
6383 scalar_int_mode int_mode
, inner_mode
;
6385 /* Simplify storing of the truth value. */
6386 if (comparison_p
&& true_rtx
== const_true_rtx
&& false_rtx
== const0_rtx
)
6387 return simplify_gen_relational (true_code
, mode
, VOIDmode
,
6388 XEXP (cond
, 0), XEXP (cond
, 1));
6390 /* Also when the truth value has to be reversed. */
6392 && true_rtx
== const0_rtx
&& false_rtx
== const_true_rtx
6393 && (reversed
= reversed_comparison (cond
, mode
)))
6396 /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
6397 in it is being compared against certain values. Get the true and false
6398 comparisons and see if that says anything about the value of each arm. */
6401 && ((false_code
= reversed_comparison_code (cond
, NULL
))
6403 && REG_P (XEXP (cond
, 0)))
6406 rtx from
= XEXP (cond
, 0);
6407 rtx true_val
= XEXP (cond
, 1);
6408 rtx false_val
= true_val
;
6411 /* If FALSE_CODE is EQ, swap the codes and arms. */
6413 if (false_code
== EQ
)
6415 swapped
= 1, true_code
= EQ
, false_code
= NE
;
6416 std::swap (true_rtx
, false_rtx
);
6419 scalar_int_mode from_mode
;
6420 if (is_a
<scalar_int_mode
> (GET_MODE (from
), &from_mode
))
6422 /* If we are comparing against zero and the expression being
6423 tested has only a single bit that might be nonzero, that is
6424 its value when it is not equal to zero. Similarly if it is
6425 known to be -1 or 0. */
6427 && true_val
== const0_rtx
6428 && pow2p_hwi (nzb
= nonzero_bits (from
, from_mode
)))
6431 false_val
= gen_int_mode (nzb
, from_mode
);
6433 else if (true_code
== EQ
6434 && true_val
== const0_rtx
6435 && (num_sign_bit_copies (from
, from_mode
)
6436 == GET_MODE_PRECISION (from_mode
)))
6439 false_val
= constm1_rtx
;
6443 /* Now simplify an arm if we know the value of the register in the
6444 branch and it is used in the arm. Be careful due to the potential
6445 of locally-shared RTL. */
6447 if (reg_mentioned_p (from
, true_rtx
))
6448 true_rtx
= subst (known_cond (copy_rtx (true_rtx
), true_code
,
6450 pc_rtx
, pc_rtx
, 0, 0, 0);
6451 if (reg_mentioned_p (from
, false_rtx
))
6452 false_rtx
= subst (known_cond (copy_rtx (false_rtx
), false_code
,
6454 pc_rtx
, pc_rtx
, 0, 0, 0);
6456 SUBST (XEXP (x
, 1), swapped
? false_rtx
: true_rtx
);
6457 SUBST (XEXP (x
, 2), swapped
? true_rtx
: false_rtx
);
6459 true_rtx
= XEXP (x
, 1);
6460 false_rtx
= XEXP (x
, 2);
6461 true_code
= GET_CODE (cond
);
6464 /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
6465 reversed, do so to avoid needing two sets of patterns for
6466 subtract-and-branch insns. Similarly if we have a constant in the true
6467 arm, the false arm is the same as the first operand of the comparison, or
6468 the false arm is more complicated than the true arm. */
6471 && reversed_comparison_code (cond
, NULL
) != UNKNOWN
6472 && (true_rtx
== pc_rtx
6473 || (CONSTANT_P (true_rtx
)
6474 && !CONST_INT_P (false_rtx
) && false_rtx
!= pc_rtx
)
6475 || true_rtx
== const0_rtx
6476 || (OBJECT_P (true_rtx
) && !OBJECT_P (false_rtx
))
6477 || (GET_CODE (true_rtx
) == SUBREG
&& OBJECT_P (SUBREG_REG (true_rtx
))
6478 && !OBJECT_P (false_rtx
))
6479 || reg_mentioned_p (true_rtx
, false_rtx
)
6480 || rtx_equal_p (false_rtx
, XEXP (cond
, 0))))
6482 true_code
= reversed_comparison_code (cond
, NULL
);
6483 SUBST (XEXP (x
, 0), reversed_comparison (cond
, GET_MODE (cond
)));
6484 SUBST (XEXP (x
, 1), false_rtx
);
6485 SUBST (XEXP (x
, 2), true_rtx
);
6487 std::swap (true_rtx
, false_rtx
);
6490 /* It is possible that the conditional has been simplified out. */
6491 true_code
= GET_CODE (cond
);
6492 comparison_p
= COMPARISON_P (cond
);
6495 /* If the two arms are identical, we don't need the comparison. */
6497 if (rtx_equal_p (true_rtx
, false_rtx
) && ! side_effects_p (cond
))
6500 /* Convert a == b ? b : a to "a". */
6501 if (true_code
== EQ
&& ! side_effects_p (cond
)
6502 && !HONOR_NANS (mode
)
6503 && rtx_equal_p (XEXP (cond
, 0), false_rtx
)
6504 && rtx_equal_p (XEXP (cond
, 1), true_rtx
))
6506 else if (true_code
== NE
&& ! side_effects_p (cond
)
6507 && !HONOR_NANS (mode
)
6508 && rtx_equal_p (XEXP (cond
, 0), true_rtx
)
6509 && rtx_equal_p (XEXP (cond
, 1), false_rtx
))
6512 /* Look for cases where we have (abs x) or (neg (abs X)). */
6514 if (GET_MODE_CLASS (mode
) == MODE_INT
6516 && XEXP (cond
, 1) == const0_rtx
6517 && GET_CODE (false_rtx
) == NEG
6518 && rtx_equal_p (true_rtx
, XEXP (false_rtx
, 0))
6519 && rtx_equal_p (true_rtx
, XEXP (cond
, 0))
6520 && ! side_effects_p (true_rtx
))
6525 return simplify_gen_unary (ABS
, mode
, true_rtx
, mode
);
6529 simplify_gen_unary (NEG
, mode
,
6530 simplify_gen_unary (ABS
, mode
, true_rtx
, mode
),
6536 /* Look for MIN or MAX. */
6538 if ((! FLOAT_MODE_P (mode
) || flag_unsafe_math_optimizations
)
6540 && rtx_equal_p (XEXP (cond
, 0), true_rtx
)
6541 && rtx_equal_p (XEXP (cond
, 1), false_rtx
)
6542 && ! side_effects_p (cond
))
6547 return simplify_gen_binary (SMAX
, mode
, true_rtx
, false_rtx
);
6550 return simplify_gen_binary (SMIN
, mode
, true_rtx
, false_rtx
);
6553 return simplify_gen_binary (UMAX
, mode
, true_rtx
, false_rtx
);
6556 return simplify_gen_binary (UMIN
, mode
, true_rtx
, false_rtx
);
6561 /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
6562 second operand is zero, this can be done as (OP Z (mult COND C2)) where
6563 C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
6564 SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
6565 We can do this kind of thing in some cases when STORE_FLAG_VALUE is
6566 neither 1 or -1, but it isn't worth checking for. */
6568 if ((STORE_FLAG_VALUE
== 1 || STORE_FLAG_VALUE
== -1)
6570 && is_int_mode (mode
, &int_mode
)
6571 && ! side_effects_p (x
))
6573 rtx t
= make_compound_operation (true_rtx
, SET
);
6574 rtx f
= make_compound_operation (false_rtx
, SET
);
6575 rtx cond_op0
= XEXP (cond
, 0);
6576 rtx cond_op1
= XEXP (cond
, 1);
6577 enum rtx_code op
= UNKNOWN
, extend_op
= UNKNOWN
;
6578 scalar_int_mode m
= int_mode
;
6579 rtx z
= 0, c1
= NULL_RTX
;
6581 if ((GET_CODE (t
) == PLUS
|| GET_CODE (t
) == MINUS
6582 || GET_CODE (t
) == IOR
|| GET_CODE (t
) == XOR
6583 || GET_CODE (t
) == ASHIFT
6584 || GET_CODE (t
) == LSHIFTRT
|| GET_CODE (t
) == ASHIFTRT
)
6585 && rtx_equal_p (XEXP (t
, 0), f
))
6586 c1
= XEXP (t
, 1), op
= GET_CODE (t
), z
= f
;
6588 /* If an identity-zero op is commutative, check whether there
6589 would be a match if we swapped the operands. */
6590 else if ((GET_CODE (t
) == PLUS
|| GET_CODE (t
) == IOR
6591 || GET_CODE (t
) == XOR
)
6592 && rtx_equal_p (XEXP (t
, 1), f
))
6593 c1
= XEXP (t
, 0), op
= GET_CODE (t
), z
= f
;
6594 else if (GET_CODE (t
) == SIGN_EXTEND
6595 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (t
, 0)), &inner_mode
)
6596 && (GET_CODE (XEXP (t
, 0)) == PLUS
6597 || GET_CODE (XEXP (t
, 0)) == MINUS
6598 || GET_CODE (XEXP (t
, 0)) == IOR
6599 || GET_CODE (XEXP (t
, 0)) == XOR
6600 || GET_CODE (XEXP (t
, 0)) == ASHIFT
6601 || GET_CODE (XEXP (t
, 0)) == LSHIFTRT
6602 || GET_CODE (XEXP (t
, 0)) == ASHIFTRT
)
6603 && GET_CODE (XEXP (XEXP (t
, 0), 0)) == SUBREG
6604 && subreg_lowpart_p (XEXP (XEXP (t
, 0), 0))
6605 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t
, 0), 0)), f
)
6606 && (num_sign_bit_copies (f
, GET_MODE (f
))
6608 (GET_MODE_PRECISION (int_mode
)
6609 - GET_MODE_PRECISION (inner_mode
))))
6611 c1
= XEXP (XEXP (t
, 0), 1); z
= f
; op
= GET_CODE (XEXP (t
, 0));
6612 extend_op
= SIGN_EXTEND
;
6615 else if (GET_CODE (t
) == SIGN_EXTEND
6616 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (t
, 0)), &inner_mode
)
6617 && (GET_CODE (XEXP (t
, 0)) == PLUS
6618 || GET_CODE (XEXP (t
, 0)) == IOR
6619 || GET_CODE (XEXP (t
, 0)) == XOR
)
6620 && GET_CODE (XEXP (XEXP (t
, 0), 1)) == SUBREG
6621 && subreg_lowpart_p (XEXP (XEXP (t
, 0), 1))
6622 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t
, 0), 1)), f
)
6623 && (num_sign_bit_copies (f
, GET_MODE (f
))
6625 (GET_MODE_PRECISION (int_mode
)
6626 - GET_MODE_PRECISION (inner_mode
))))
6628 c1
= XEXP (XEXP (t
, 0), 0); z
= f
; op
= GET_CODE (XEXP (t
, 0));
6629 extend_op
= SIGN_EXTEND
;
6632 else if (GET_CODE (t
) == ZERO_EXTEND
6633 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (t
, 0)), &inner_mode
)
6634 && (GET_CODE (XEXP (t
, 0)) == PLUS
6635 || GET_CODE (XEXP (t
, 0)) == MINUS
6636 || GET_CODE (XEXP (t
, 0)) == IOR
6637 || GET_CODE (XEXP (t
, 0)) == XOR
6638 || GET_CODE (XEXP (t
, 0)) == ASHIFT
6639 || GET_CODE (XEXP (t
, 0)) == LSHIFTRT
6640 || GET_CODE (XEXP (t
, 0)) == ASHIFTRT
)
6641 && GET_CODE (XEXP (XEXP (t
, 0), 0)) == SUBREG
6642 && HWI_COMPUTABLE_MODE_P (int_mode
)
6643 && subreg_lowpart_p (XEXP (XEXP (t
, 0), 0))
6644 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t
, 0), 0)), f
)
6645 && ((nonzero_bits (f
, GET_MODE (f
))
6646 & ~GET_MODE_MASK (inner_mode
))
6649 c1
= XEXP (XEXP (t
, 0), 1); z
= f
; op
= GET_CODE (XEXP (t
, 0));
6650 extend_op
= ZERO_EXTEND
;
6653 else if (GET_CODE (t
) == ZERO_EXTEND
6654 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (t
, 0)), &inner_mode
)
6655 && (GET_CODE (XEXP (t
, 0)) == PLUS
6656 || GET_CODE (XEXP (t
, 0)) == IOR
6657 || GET_CODE (XEXP (t
, 0)) == XOR
)
6658 && GET_CODE (XEXP (XEXP (t
, 0), 1)) == SUBREG
6659 && HWI_COMPUTABLE_MODE_P (int_mode
)
6660 && subreg_lowpart_p (XEXP (XEXP (t
, 0), 1))
6661 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t
, 0), 1)), f
)
6662 && ((nonzero_bits (f
, GET_MODE (f
))
6663 & ~GET_MODE_MASK (inner_mode
))
6666 c1
= XEXP (XEXP (t
, 0), 0); z
= f
; op
= GET_CODE (XEXP (t
, 0));
6667 extend_op
= ZERO_EXTEND
;
6673 machine_mode cm
= m
;
6674 if ((op
== ASHIFT
|| op
== LSHIFTRT
|| op
== ASHIFTRT
)
6675 && GET_MODE (c1
) != VOIDmode
)
6677 temp
= subst (simplify_gen_relational (true_code
, cm
, VOIDmode
,
6678 cond_op0
, cond_op1
),
6679 pc_rtx
, pc_rtx
, 0, 0, 0);
6680 temp
= simplify_gen_binary (MULT
, cm
, temp
,
6681 simplify_gen_binary (MULT
, cm
, c1
,
6683 temp
= subst (temp
, pc_rtx
, pc_rtx
, 0, 0, 0);
6684 temp
= simplify_gen_binary (op
, m
, gen_lowpart (m
, z
), temp
);
6686 if (extend_op
!= UNKNOWN
)
6687 temp
= simplify_gen_unary (extend_op
, int_mode
, temp
, m
);
6693 /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
6694 1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
6695 negation of a single bit, we can convert this operation to a shift. We
6696 can actually do this more generally, but it doesn't seem worth it. */
6699 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
6700 && XEXP (cond
, 1) == const0_rtx
6701 && false_rtx
== const0_rtx
6702 && CONST_INT_P (true_rtx
)
6703 && ((nonzero_bits (XEXP (cond
, 0), int_mode
) == 1
6704 && (i
= exact_log2 (UINTVAL (true_rtx
))) >= 0)
6705 || ((num_sign_bit_copies (XEXP (cond
, 0), int_mode
)
6706 == GET_MODE_PRECISION (int_mode
))
6707 && (i
= exact_log2 (-UINTVAL (true_rtx
))) >= 0)))
6709 simplify_shift_const (NULL_RTX
, ASHIFT
, int_mode
,
6710 gen_lowpart (int_mode
, XEXP (cond
, 0)), i
);
6712 /* (IF_THEN_ELSE (NE A 0) C1 0) is A or a zero-extend of A if the only
6713 non-zero bit in A is C1. */
6714 if (true_code
== NE
&& XEXP (cond
, 1) == const0_rtx
6715 && false_rtx
== const0_rtx
&& CONST_INT_P (true_rtx
)
6716 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
6717 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (cond
, 0)), &inner_mode
)
6718 && (UINTVAL (true_rtx
) & GET_MODE_MASK (int_mode
))
6719 == nonzero_bits (XEXP (cond
, 0), inner_mode
)
6720 && (i
= exact_log2 (UINTVAL (true_rtx
) & GET_MODE_MASK (int_mode
))) >= 0)
6722 rtx val
= XEXP (cond
, 0);
6723 if (inner_mode
== int_mode
)
6725 else if (GET_MODE_PRECISION (inner_mode
) < GET_MODE_PRECISION (int_mode
))
6726 return simplify_gen_unary (ZERO_EXTEND
, int_mode
, val
, inner_mode
);
6732 /* Simplify X, a SET expression. Return the new expression. */
6735 simplify_set (rtx x
)
6737 rtx src
= SET_SRC (x
);
6738 rtx dest
= SET_DEST (x
);
6740 = GET_MODE (src
) != VOIDmode
? GET_MODE (src
) : GET_MODE (dest
);
6741 rtx_insn
*other_insn
;
6743 scalar_int_mode int_mode
;
6745 /* (set (pc) (return)) gets written as (return). */
6746 if (GET_CODE (dest
) == PC
&& ANY_RETURN_P (src
))
6749 /* Now that we know for sure which bits of SRC we are using, see if we can
6750 simplify the expression for the object knowing that we only need the
6753 if (GET_MODE_CLASS (mode
) == MODE_INT
&& HWI_COMPUTABLE_MODE_P (mode
))
6755 src
= force_to_mode (src
, mode
, HOST_WIDE_INT_M1U
, 0);
6756 SUBST (SET_SRC (x
), src
);
6759 /* If we are setting CC0 or if the source is a COMPARE, look for the use of
6760 the comparison result and try to simplify it unless we already have used
6761 undobuf.other_insn. */
6762 if ((GET_MODE_CLASS (mode
) == MODE_CC
6763 || GET_CODE (src
) == COMPARE
6765 && (cc_use
= find_single_use (dest
, subst_insn
, &other_insn
)) != 0
6766 && (undobuf
.other_insn
== 0 || other_insn
== undobuf
.other_insn
)
6767 && COMPARISON_P (*cc_use
)
6768 && rtx_equal_p (XEXP (*cc_use
, 0), dest
))
6770 enum rtx_code old_code
= GET_CODE (*cc_use
);
6771 enum rtx_code new_code
;
6773 int other_changed
= 0;
6774 rtx inner_compare
= NULL_RTX
;
6775 machine_mode compare_mode
= GET_MODE (dest
);
6777 if (GET_CODE (src
) == COMPARE
)
6779 op0
= XEXP (src
, 0), op1
= XEXP (src
, 1);
6780 if (GET_CODE (op0
) == COMPARE
&& op1
== const0_rtx
)
6782 inner_compare
= op0
;
6783 op0
= XEXP (inner_compare
, 0), op1
= XEXP (inner_compare
, 1);
6787 op0
= src
, op1
= CONST0_RTX (GET_MODE (src
));
6789 tmp
= simplify_relational_operation (old_code
, compare_mode
, VOIDmode
,
6792 new_code
= old_code
;
6793 else if (!CONSTANT_P (tmp
))
6795 new_code
= GET_CODE (tmp
);
6796 op0
= XEXP (tmp
, 0);
6797 op1
= XEXP (tmp
, 1);
6801 rtx pat
= PATTERN (other_insn
);
6802 undobuf
.other_insn
= other_insn
;
6803 SUBST (*cc_use
, tmp
);
6805 /* Attempt to simplify CC user. */
6806 if (GET_CODE (pat
) == SET
)
6808 rtx new_rtx
= simplify_rtx (SET_SRC (pat
));
6809 if (new_rtx
!= NULL_RTX
)
6810 SUBST (SET_SRC (pat
), new_rtx
);
6813 /* Convert X into a no-op move. */
6814 SUBST (SET_DEST (x
), pc_rtx
);
6815 SUBST (SET_SRC (x
), pc_rtx
);
6819 /* Simplify our comparison, if possible. */
6820 new_code
= simplify_comparison (new_code
, &op0
, &op1
);
6822 #ifdef SELECT_CC_MODE
6823 /* If this machine has CC modes other than CCmode, check to see if we
6824 need to use a different CC mode here. */
6825 if (GET_MODE_CLASS (GET_MODE (op0
)) == MODE_CC
)
6826 compare_mode
= GET_MODE (op0
);
6827 else if (inner_compare
6828 && GET_MODE_CLASS (GET_MODE (inner_compare
)) == MODE_CC
6829 && new_code
== old_code
6830 && op0
== XEXP (inner_compare
, 0)
6831 && op1
== XEXP (inner_compare
, 1))
6832 compare_mode
= GET_MODE (inner_compare
);
6834 compare_mode
= SELECT_CC_MODE (new_code
, op0
, op1
);
6836 /* If the mode changed, we have to change SET_DEST, the mode in the
6837 compare, and the mode in the place SET_DEST is used. If SET_DEST is
6838 a hard register, just build new versions with the proper mode. If it
6839 is a pseudo, we lose unless it is only time we set the pseudo, in
6840 which case we can safely change its mode. */
6841 if (!HAVE_cc0
&& compare_mode
!= GET_MODE (dest
))
6843 if (can_change_dest_mode (dest
, 0, compare_mode
))
6845 unsigned int regno
= REGNO (dest
);
6848 if (regno
< FIRST_PSEUDO_REGISTER
)
6849 new_dest
= gen_rtx_REG (compare_mode
, regno
);
6852 SUBST_MODE (regno_reg_rtx
[regno
], compare_mode
);
6853 new_dest
= regno_reg_rtx
[regno
];
6856 SUBST (SET_DEST (x
), new_dest
);
6857 SUBST (XEXP (*cc_use
, 0), new_dest
);
6863 #endif /* SELECT_CC_MODE */
6865 /* If the code changed, we have to build a new comparison in
6866 undobuf.other_insn. */
6867 if (new_code
!= old_code
)
6869 int other_changed_previously
= other_changed
;
6870 unsigned HOST_WIDE_INT mask
;
6871 rtx old_cc_use
= *cc_use
;
6873 SUBST (*cc_use
, gen_rtx_fmt_ee (new_code
, GET_MODE (*cc_use
),
6877 /* If the only change we made was to change an EQ into an NE or
6878 vice versa, OP0 has only one bit that might be nonzero, and OP1
6879 is zero, check if changing the user of the condition code will
6880 produce a valid insn. If it won't, we can keep the original code
6881 in that insn by surrounding our operation with an XOR. */
6883 if (((old_code
== NE
&& new_code
== EQ
)
6884 || (old_code
== EQ
&& new_code
== NE
))
6885 && ! other_changed_previously
&& op1
== const0_rtx
6886 && HWI_COMPUTABLE_MODE_P (GET_MODE (op0
))
6887 && pow2p_hwi (mask
= nonzero_bits (op0
, GET_MODE (op0
))))
6889 rtx pat
= PATTERN (other_insn
), note
= 0;
6891 if ((recog_for_combine (&pat
, other_insn
, ¬e
) < 0
6892 && ! check_asm_operands (pat
)))
6894 *cc_use
= old_cc_use
;
6897 op0
= simplify_gen_binary (XOR
, GET_MODE (op0
), op0
,
6905 undobuf
.other_insn
= other_insn
;
6907 /* Don't generate a compare of a CC with 0, just use that CC. */
6908 if (GET_MODE (op0
) == compare_mode
&& op1
== const0_rtx
)
6910 SUBST (SET_SRC (x
), op0
);
6913 /* Otherwise, if we didn't previously have the same COMPARE we
6914 want, create it from scratch. */
6915 else if (GET_CODE (src
) != COMPARE
|| GET_MODE (src
) != compare_mode
6916 || XEXP (src
, 0) != op0
|| XEXP (src
, 1) != op1
)
6918 SUBST (SET_SRC (x
), gen_rtx_COMPARE (compare_mode
, op0
, op1
));
6924 /* Get SET_SRC in a form where we have placed back any
6925 compound expressions. Then do the checks below. */
6926 src
= make_compound_operation (src
, SET
);
6927 SUBST (SET_SRC (x
), src
);
6930 /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
6931 and X being a REG or (subreg (reg)), we may be able to convert this to
6932 (set (subreg:m2 x) (op)).
6934 We can always do this if M1 is narrower than M2 because that means that
6935 we only care about the low bits of the result.
6937 However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
6938 perform a narrower operation than requested since the high-order bits will
6939 be undefined. On machine where it is defined, this transformation is safe
6940 as long as M1 and M2 have the same number of words. */
6942 if (GET_CODE (src
) == SUBREG
&& subreg_lowpart_p (src
)
6943 && !OBJECT_P (SUBREG_REG (src
))
6944 && (known_equal_after_align_up
6945 (GET_MODE_SIZE (GET_MODE (src
)),
6946 GET_MODE_SIZE (GET_MODE (SUBREG_REG (src
))),
6948 && (WORD_REGISTER_OPERATIONS
|| !paradoxical_subreg_p (src
))
6949 && ! (REG_P (dest
) && REGNO (dest
) < FIRST_PSEUDO_REGISTER
6950 && !REG_CAN_CHANGE_MODE_P (REGNO (dest
),
6951 GET_MODE (SUBREG_REG (src
)),
6954 || (GET_CODE (dest
) == SUBREG
6955 && REG_P (SUBREG_REG (dest
)))))
6957 SUBST (SET_DEST (x
),
6958 gen_lowpart (GET_MODE (SUBREG_REG (src
)),
6960 SUBST (SET_SRC (x
), SUBREG_REG (src
));
6962 src
= SET_SRC (x
), dest
= SET_DEST (x
);
6965 /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
6968 && partial_subreg_p (src
)
6969 && subreg_lowpart_p (src
))
6971 rtx inner
= SUBREG_REG (src
);
6972 machine_mode inner_mode
= GET_MODE (inner
);
6974 /* Here we make sure that we don't have a sign bit on. */
6975 if (val_signbit_known_clear_p (GET_MODE (src
),
6976 nonzero_bits (inner
, inner_mode
)))
6978 SUBST (SET_SRC (x
), inner
);
6983 /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
6984 would require a paradoxical subreg. Replace the subreg with a
6985 zero_extend to avoid the reload that would otherwise be required.
6986 Don't do this unless we have a scalar integer mode, otherwise the
6987 transformation is incorrect. */
6989 enum rtx_code extend_op
;
6990 if (paradoxical_subreg_p (src
)
6991 && MEM_P (SUBREG_REG (src
))
6992 && SCALAR_INT_MODE_P (GET_MODE (src
))
6993 && (extend_op
= load_extend_op (GET_MODE (SUBREG_REG (src
)))) != UNKNOWN
)
6996 gen_rtx_fmt_e (extend_op
, GET_MODE (src
), SUBREG_REG (src
)));
7001 /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
7002 are comparing an item known to be 0 or -1 against 0, use a logical
7003 operation instead. Check for one of the arms being an IOR of the other
7004 arm with some value. We compute three terms to be IOR'ed together. In
7005 practice, at most two will be nonzero. Then we do the IOR's. */
7007 if (GET_CODE (dest
) != PC
7008 && GET_CODE (src
) == IF_THEN_ELSE
7009 && is_int_mode (GET_MODE (src
), &int_mode
)
7010 && (GET_CODE (XEXP (src
, 0)) == EQ
|| GET_CODE (XEXP (src
, 0)) == NE
)
7011 && XEXP (XEXP (src
, 0), 1) == const0_rtx
7012 && int_mode
== GET_MODE (XEXP (XEXP (src
, 0), 0))
7013 && (!HAVE_conditional_move
7014 || ! can_conditionally_move_p (int_mode
))
7015 && (num_sign_bit_copies (XEXP (XEXP (src
, 0), 0), int_mode
)
7016 == GET_MODE_PRECISION (int_mode
))
7017 && ! side_effects_p (src
))
7019 rtx true_rtx
= (GET_CODE (XEXP (src
, 0)) == NE
7020 ? XEXP (src
, 1) : XEXP (src
, 2));
7021 rtx false_rtx
= (GET_CODE (XEXP (src
, 0)) == NE
7022 ? XEXP (src
, 2) : XEXP (src
, 1));
7023 rtx term1
= const0_rtx
, term2
, term3
;
7025 if (GET_CODE (true_rtx
) == IOR
7026 && rtx_equal_p (XEXP (true_rtx
, 0), false_rtx
))
7027 term1
= false_rtx
, true_rtx
= XEXP (true_rtx
, 1), false_rtx
= const0_rtx
;
7028 else if (GET_CODE (true_rtx
) == IOR
7029 && rtx_equal_p (XEXP (true_rtx
, 1), false_rtx
))
7030 term1
= false_rtx
, true_rtx
= XEXP (true_rtx
, 0), false_rtx
= const0_rtx
;
7031 else if (GET_CODE (false_rtx
) == IOR
7032 && rtx_equal_p (XEXP (false_rtx
, 0), true_rtx
))
7033 term1
= true_rtx
, false_rtx
= XEXP (false_rtx
, 1), true_rtx
= const0_rtx
;
7034 else if (GET_CODE (false_rtx
) == IOR
7035 && rtx_equal_p (XEXP (false_rtx
, 1), true_rtx
))
7036 term1
= true_rtx
, false_rtx
= XEXP (false_rtx
, 0), true_rtx
= const0_rtx
;
7038 term2
= simplify_gen_binary (AND
, int_mode
,
7039 XEXP (XEXP (src
, 0), 0), true_rtx
);
7040 term3
= simplify_gen_binary (AND
, int_mode
,
7041 simplify_gen_unary (NOT
, int_mode
,
7042 XEXP (XEXP (src
, 0), 0),
7047 simplify_gen_binary (IOR
, int_mode
,
7048 simplify_gen_binary (IOR
, int_mode
,
7055 /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
7056 whole thing fail. */
7057 if (GET_CODE (src
) == CLOBBER
&& XEXP (src
, 0) == const0_rtx
)
7059 else if (GET_CODE (dest
) == CLOBBER
&& XEXP (dest
, 0) == const0_rtx
)
7062 /* Convert this into a field assignment operation, if possible. */
7063 return make_field_assignment (x
);
7066 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
7070 simplify_logical (rtx x
)
7072 rtx op0
= XEXP (x
, 0);
7073 rtx op1
= XEXP (x
, 1);
7074 scalar_int_mode mode
;
7076 switch (GET_CODE (x
))
7079 /* We can call simplify_and_const_int only if we don't lose
7080 any (sign) bits when converting INTVAL (op1) to
7081 "unsigned HOST_WIDE_INT". */
7082 if (is_a
<scalar_int_mode
> (GET_MODE (x
), &mode
)
7083 && CONST_INT_P (op1
)
7084 && (HWI_COMPUTABLE_MODE_P (mode
)
7085 || INTVAL (op1
) > 0))
7087 x
= simplify_and_const_int (x
, mode
, op0
, INTVAL (op1
));
7088 if (GET_CODE (x
) != AND
)
7095 /* If we have any of (and (ior A B) C) or (and (xor A B) C),
7096 apply the distributive law and then the inverse distributive
7097 law to see if things simplify. */
7098 if (GET_CODE (op0
) == IOR
|| GET_CODE (op0
) == XOR
)
7100 rtx result
= distribute_and_simplify_rtx (x
, 0);
7104 if (GET_CODE (op1
) == IOR
|| GET_CODE (op1
) == XOR
)
7106 rtx result
= distribute_and_simplify_rtx (x
, 1);
7113 /* If we have (ior (and A B) C), apply the distributive law and then
7114 the inverse distributive law to see if things simplify. */
7116 if (GET_CODE (op0
) == AND
)
7118 rtx result
= distribute_and_simplify_rtx (x
, 0);
7123 if (GET_CODE (op1
) == AND
)
7125 rtx result
= distribute_and_simplify_rtx (x
, 1);
7138 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
7139 operations" because they can be replaced with two more basic operations.
7140 ZERO_EXTEND is also considered "compound" because it can be replaced with
7141 an AND operation, which is simpler, though only one operation.
7143 The function expand_compound_operation is called with an rtx expression
7144 and will convert it to the appropriate shifts and AND operations,
7145 simplifying at each stage.
7147 The function make_compound_operation is called to convert an expression
7148 consisting of shifts and ANDs into the equivalent compound expression.
7149 It is the inverse of this function, loosely speaking. */
7152 expand_compound_operation (rtx x
)
7154 unsigned HOST_WIDE_INT pos
= 0, len
;
7156 unsigned int modewidth
;
7158 scalar_int_mode inner_mode
;
7160 switch (GET_CODE (x
))
7166 /* We can't necessarily use a const_int for a multiword mode;
7167 it depends on implicitly extending the value.
7168 Since we don't know the right way to extend it,
7169 we can't tell whether the implicit way is right.
7171 Even for a mode that is no wider than a const_int,
7172 we can't win, because we need to sign extend one of its bits through
7173 the rest of it, and we don't know which bit. */
7174 if (CONST_INT_P (XEXP (x
, 0)))
7177 /* Reject modes that aren't scalar integers because turning vector
7178 or complex modes into shifts causes problems. */
7179 if (!is_a
<scalar_int_mode
> (GET_MODE (XEXP (x
, 0)), &inner_mode
))
7182 /* Return if (subreg:MODE FROM 0) is not a safe replacement for
7183 (zero_extend:MODE FROM) or (sign_extend:MODE FROM). It is for any MEM
7184 because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
7185 reloaded. If not for that, MEM's would very rarely be safe.
7187 Reject modes bigger than a word, because we might not be able
7188 to reference a two-register group starting with an arbitrary register
7189 (and currently gen_lowpart might crash for a SUBREG). */
7191 if (GET_MODE_SIZE (inner_mode
) > UNITS_PER_WORD
)
7194 len
= GET_MODE_PRECISION (inner_mode
);
7195 /* If the inner object has VOIDmode (the only way this can happen
7196 is if it is an ASM_OPERANDS), we can't do anything since we don't
7197 know how much masking to do. */
7209 /* If the operand is a CLOBBER, just return it. */
7210 if (GET_CODE (XEXP (x
, 0)) == CLOBBER
)
7213 if (!CONST_INT_P (XEXP (x
, 1))
7214 || !CONST_INT_P (XEXP (x
, 2)))
7217 /* Reject modes that aren't scalar integers because turning vector
7218 or complex modes into shifts causes problems. */
7219 if (!is_a
<scalar_int_mode
> (GET_MODE (XEXP (x
, 0)), &inner_mode
))
7222 len
= INTVAL (XEXP (x
, 1));
7223 pos
= INTVAL (XEXP (x
, 2));
7225 /* This should stay within the object being extracted, fail otherwise. */
7226 if (len
+ pos
> GET_MODE_PRECISION (inner_mode
))
7229 if (BITS_BIG_ENDIAN
)
7230 pos
= GET_MODE_PRECISION (inner_mode
) - len
- pos
;
7238 /* We've rejected non-scalar operations by now. */
7239 scalar_int_mode mode
= as_a
<scalar_int_mode
> (GET_MODE (x
));
7241 /* Convert sign extension to zero extension, if we know that the high
7242 bit is not set, as this is easier to optimize. It will be converted
7243 back to cheaper alternative in make_extraction. */
7244 if (GET_CODE (x
) == SIGN_EXTEND
7245 && HWI_COMPUTABLE_MODE_P (mode
)
7246 && ((nonzero_bits (XEXP (x
, 0), inner_mode
)
7247 & ~(((unsigned HOST_WIDE_INT
) GET_MODE_MASK (inner_mode
)) >> 1))
7250 rtx temp
= gen_rtx_ZERO_EXTEND (mode
, XEXP (x
, 0));
7251 rtx temp2
= expand_compound_operation (temp
);
7253 /* Make sure this is a profitable operation. */
7254 if (set_src_cost (x
, mode
, optimize_this_for_speed_p
)
7255 > set_src_cost (temp2
, mode
, optimize_this_for_speed_p
))
7257 else if (set_src_cost (x
, mode
, optimize_this_for_speed_p
)
7258 > set_src_cost (temp
, mode
, optimize_this_for_speed_p
))
7264 /* We can optimize some special cases of ZERO_EXTEND. */
7265 if (GET_CODE (x
) == ZERO_EXTEND
)
7267 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
7268 know that the last value didn't have any inappropriate bits
7270 if (GET_CODE (XEXP (x
, 0)) == TRUNCATE
7271 && GET_MODE (XEXP (XEXP (x
, 0), 0)) == mode
7272 && HWI_COMPUTABLE_MODE_P (mode
)
7273 && (nonzero_bits (XEXP (XEXP (x
, 0), 0), mode
)
7274 & ~GET_MODE_MASK (inner_mode
)) == 0)
7275 return XEXP (XEXP (x
, 0), 0);
7277 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
7278 if (GET_CODE (XEXP (x
, 0)) == SUBREG
7279 && GET_MODE (SUBREG_REG (XEXP (x
, 0))) == mode
7280 && subreg_lowpart_p (XEXP (x
, 0))
7281 && HWI_COMPUTABLE_MODE_P (mode
)
7282 && (nonzero_bits (SUBREG_REG (XEXP (x
, 0)), mode
)
7283 & ~GET_MODE_MASK (inner_mode
)) == 0)
7284 return SUBREG_REG (XEXP (x
, 0));
7286 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
7287 is a comparison and STORE_FLAG_VALUE permits. This is like
7288 the first case, but it works even when MODE is larger
7289 than HOST_WIDE_INT. */
7290 if (GET_CODE (XEXP (x
, 0)) == TRUNCATE
7291 && GET_MODE (XEXP (XEXP (x
, 0), 0)) == mode
7292 && COMPARISON_P (XEXP (XEXP (x
, 0), 0))
7293 && GET_MODE_PRECISION (inner_mode
) <= HOST_BITS_PER_WIDE_INT
7294 && (STORE_FLAG_VALUE
& ~GET_MODE_MASK (inner_mode
)) == 0)
7295 return XEXP (XEXP (x
, 0), 0);
7297 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
7298 if (GET_CODE (XEXP (x
, 0)) == SUBREG
7299 && GET_MODE (SUBREG_REG (XEXP (x
, 0))) == mode
7300 && subreg_lowpart_p (XEXP (x
, 0))
7301 && COMPARISON_P (SUBREG_REG (XEXP (x
, 0)))
7302 && GET_MODE_PRECISION (inner_mode
) <= HOST_BITS_PER_WIDE_INT
7303 && (STORE_FLAG_VALUE
& ~GET_MODE_MASK (inner_mode
)) == 0)
7304 return SUBREG_REG (XEXP (x
, 0));
7308 /* If we reach here, we want to return a pair of shifts. The inner
7309 shift is a left shift of BITSIZE - POS - LEN bits. The outer
7310 shift is a right shift of BITSIZE - LEN bits. It is arithmetic or
7311 logical depending on the value of UNSIGNEDP.
7313 If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
7314 converted into an AND of a shift.
7316 We must check for the case where the left shift would have a negative
7317 count. This can happen in a case like (x >> 31) & 255 on machines
7318 that can't shift by a constant. On those machines, we would first
7319 combine the shift with the AND to produce a variable-position
7320 extraction. Then the constant of 31 would be substituted in
7321 to produce such a position. */
7323 modewidth
= GET_MODE_PRECISION (mode
);
7324 if (modewidth
>= pos
+ len
)
7326 tem
= gen_lowpart (mode
, XEXP (x
, 0));
7327 if (!tem
|| GET_CODE (tem
) == CLOBBER
)
7329 tem
= simplify_shift_const (NULL_RTX
, ASHIFT
, mode
,
7330 tem
, modewidth
- pos
- len
);
7331 tem
= simplify_shift_const (NULL_RTX
, unsignedp
? LSHIFTRT
: ASHIFTRT
,
7332 mode
, tem
, modewidth
- len
);
7334 else if (unsignedp
&& len
< HOST_BITS_PER_WIDE_INT
)
7335 tem
= simplify_and_const_int (NULL_RTX
, mode
,
7336 simplify_shift_const (NULL_RTX
, LSHIFTRT
,
7339 (HOST_WIDE_INT_1U
<< len
) - 1);
7341 /* Any other cases we can't handle. */
7344 /* If we couldn't do this for some reason, return the original
7346 if (GET_CODE (tem
) == CLOBBER
)
7352 /* X is a SET which contains an assignment of one object into
7353 a part of another (such as a bit-field assignment, STRICT_LOW_PART,
7354 or certain SUBREGS). If possible, convert it into a series of
7357 We half-heartedly support variable positions, but do not at all
7358 support variable lengths. */
7361 expand_field_assignment (const_rtx x
)
7364 rtx pos
; /* Always counts from low bit. */
7366 rtx mask
, cleared
, masked
;
7367 scalar_int_mode compute_mode
;
7369 /* Loop until we find something we can't simplify. */
7372 if (GET_CODE (SET_DEST (x
)) == STRICT_LOW_PART
7373 && GET_CODE (XEXP (SET_DEST (x
), 0)) == SUBREG
)
7375 rtx x0
= XEXP (SET_DEST (x
), 0);
7376 if (!GET_MODE_PRECISION (GET_MODE (x0
)).is_constant (&len
))
7378 inner
= SUBREG_REG (XEXP (SET_DEST (x
), 0));
7379 pos
= gen_int_mode (subreg_lsb (XEXP (SET_DEST (x
), 0)),
7382 else if (GET_CODE (SET_DEST (x
)) == ZERO_EXTRACT
7383 && CONST_INT_P (XEXP (SET_DEST (x
), 1)))
7385 inner
= XEXP (SET_DEST (x
), 0);
7386 if (!GET_MODE_PRECISION (GET_MODE (inner
)).is_constant (&inner_len
))
7389 len
= INTVAL (XEXP (SET_DEST (x
), 1));
7390 pos
= XEXP (SET_DEST (x
), 2);
7392 /* A constant position should stay within the width of INNER. */
7393 if (CONST_INT_P (pos
) && INTVAL (pos
) + len
> inner_len
)
7396 if (BITS_BIG_ENDIAN
)
7398 if (CONST_INT_P (pos
))
7399 pos
= GEN_INT (inner_len
- len
- INTVAL (pos
));
7400 else if (GET_CODE (pos
) == MINUS
7401 && CONST_INT_P (XEXP (pos
, 1))
7402 && INTVAL (XEXP (pos
, 1)) == inner_len
- len
)
7403 /* If position is ADJUST - X, new position is X. */
7404 pos
= XEXP (pos
, 0);
7406 pos
= simplify_gen_binary (MINUS
, GET_MODE (pos
),
7407 gen_int_mode (inner_len
- len
,
7413 /* If the destination is a subreg that overwrites the whole of the inner
7414 register, we can move the subreg to the source. */
7415 else if (GET_CODE (SET_DEST (x
)) == SUBREG
7416 /* We need SUBREGs to compute nonzero_bits properly. */
7417 && nonzero_sign_valid
7418 && !read_modify_subreg_p (SET_DEST (x
)))
7420 x
= gen_rtx_SET (SUBREG_REG (SET_DEST (x
)),
7422 (GET_MODE (SUBREG_REG (SET_DEST (x
))),
7429 while (GET_CODE (inner
) == SUBREG
&& subreg_lowpart_p (inner
))
7430 inner
= SUBREG_REG (inner
);
7432 /* Don't attempt bitwise arithmetic on non scalar integer modes. */
7433 if (!is_a
<scalar_int_mode
> (GET_MODE (inner
), &compute_mode
))
7435 /* Don't do anything for vector or complex integral types. */
7436 if (! FLOAT_MODE_P (GET_MODE (inner
)))
7439 /* Try to find an integral mode to pun with. */
7440 if (!int_mode_for_size (GET_MODE_BITSIZE (GET_MODE (inner
)), 0)
7441 .exists (&compute_mode
))
7444 inner
= gen_lowpart (compute_mode
, inner
);
7447 /* Compute a mask of LEN bits, if we can do this on the host machine. */
7448 if (len
>= HOST_BITS_PER_WIDE_INT
)
7451 /* Don't try to compute in too wide unsupported modes. */
7452 if (!targetm
.scalar_mode_supported_p (compute_mode
))
7455 /* Now compute the equivalent expression. Make a copy of INNER
7456 for the SET_DEST in case it is a MEM into which we will substitute;
7457 we don't want shared RTL in that case. */
7458 mask
= gen_int_mode ((HOST_WIDE_INT_1U
<< len
) - 1,
7460 cleared
= simplify_gen_binary (AND
, compute_mode
,
7461 simplify_gen_unary (NOT
, compute_mode
,
7462 simplify_gen_binary (ASHIFT
,
7467 masked
= simplify_gen_binary (ASHIFT
, compute_mode
,
7468 simplify_gen_binary (
7470 gen_lowpart (compute_mode
, SET_SRC (x
)),
7474 x
= gen_rtx_SET (copy_rtx (inner
),
7475 simplify_gen_binary (IOR
, compute_mode
,
7482 /* Return an RTX for a reference to LEN bits of INNER. If POS_RTX is nonzero,
7483 it is an RTX that represents the (variable) starting position; otherwise,
7484 POS is the (constant) starting bit position. Both are counted from the LSB.
7486 UNSIGNEDP is nonzero for an unsigned reference and zero for a signed one.
7488 IN_DEST is nonzero if this is a reference in the destination of a SET.
7489 This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If nonzero,
7490 a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
7493 IN_COMPARE is nonzero if we are in a COMPARE. This means that a
7494 ZERO_EXTRACT should be built even for bits starting at bit 0.
7496 MODE is the desired mode of the result (if IN_DEST == 0).
7498 The result is an RTX for the extraction or NULL_RTX if the target
7502 make_extraction (machine_mode mode
, rtx inner
, HOST_WIDE_INT pos
,
7503 rtx pos_rtx
, unsigned HOST_WIDE_INT len
, int unsignedp
,
7504 int in_dest
, int in_compare
)
7506 /* This mode describes the size of the storage area
7507 to fetch the overall value from. Within that, we
7508 ignore the POS lowest bits, etc. */
7509 machine_mode is_mode
= GET_MODE (inner
);
7510 machine_mode inner_mode
;
7511 scalar_int_mode wanted_inner_mode
;
7512 scalar_int_mode wanted_inner_reg_mode
= word_mode
;
7513 scalar_int_mode pos_mode
= word_mode
;
7514 machine_mode extraction_mode
= word_mode
;
7516 rtx orig_pos_rtx
= pos_rtx
;
7517 HOST_WIDE_INT orig_pos
;
7519 if (pos_rtx
&& CONST_INT_P (pos_rtx
))
7520 pos
= INTVAL (pos_rtx
), pos_rtx
= 0;
7522 if (GET_CODE (inner
) == SUBREG
7523 && subreg_lowpart_p (inner
)
7524 && (paradoxical_subreg_p (inner
)
7525 /* If trying or potentionally trying to extract
7526 bits outside of is_mode, don't look through
7527 non-paradoxical SUBREGs. See PR82192. */
7528 || (pos_rtx
== NULL_RTX
7529 && known_le (pos
+ len
, GET_MODE_PRECISION (is_mode
)))))
7531 /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
7532 consider just the QI as the memory to extract from.
7533 The subreg adds or removes high bits; its mode is
7534 irrelevant to the meaning of this extraction,
7535 since POS and LEN count from the lsb. */
7536 if (MEM_P (SUBREG_REG (inner
)))
7537 is_mode
= GET_MODE (SUBREG_REG (inner
));
7538 inner
= SUBREG_REG (inner
);
7540 else if (GET_CODE (inner
) == ASHIFT
7541 && CONST_INT_P (XEXP (inner
, 1))
7542 && pos_rtx
== 0 && pos
== 0
7543 && len
> UINTVAL (XEXP (inner
, 1)))
7545 /* We're extracting the least significant bits of an rtx
7546 (ashift X (const_int C)), where LEN > C. Extract the
7547 least significant (LEN - C) bits of X, giving an rtx
7548 whose mode is MODE, then shift it left C times. */
7549 new_rtx
= make_extraction (mode
, XEXP (inner
, 0),
7550 0, 0, len
- INTVAL (XEXP (inner
, 1)),
7551 unsignedp
, in_dest
, in_compare
);
7553 return gen_rtx_ASHIFT (mode
, new_rtx
, XEXP (inner
, 1));
7555 else if (GET_CODE (inner
) == TRUNCATE
7556 /* If trying or potentionally trying to extract
7557 bits outside of is_mode, don't look through
7558 TRUNCATE. See PR82192. */
7559 && pos_rtx
== NULL_RTX
7560 && known_le (pos
+ len
, GET_MODE_PRECISION (is_mode
)))
7561 inner
= XEXP (inner
, 0);
7563 inner_mode
= GET_MODE (inner
);
7565 /* See if this can be done without an extraction. We never can if the
7566 width of the field is not the same as that of some integer mode. For
7567 registers, we can only avoid the extraction if the position is at the
7568 low-order bit and this is either not in the destination or we have the
7569 appropriate STRICT_LOW_PART operation available.
7571 For MEM, we can avoid an extract if the field starts on an appropriate
7572 boundary and we can change the mode of the memory reference. */
7574 scalar_int_mode tmode
;
7575 if (int_mode_for_size (len
, 1).exists (&tmode
)
7576 && ((pos_rtx
== 0 && (pos
% BITS_PER_WORD
) == 0
7578 && (pos
== 0 || REG_P (inner
))
7579 && (inner_mode
== tmode
7581 || TRULY_NOOP_TRUNCATION_MODES_P (tmode
, inner_mode
)
7582 || reg_truncated_to_mode (tmode
, inner
))
7585 && have_insn_for (STRICT_LOW_PART
, tmode
))))
7586 || (MEM_P (inner
) && pos_rtx
== 0
7588 % (STRICT_ALIGNMENT
? GET_MODE_ALIGNMENT (tmode
)
7589 : BITS_PER_UNIT
)) == 0
7590 /* We can't do this if we are widening INNER_MODE (it
7591 may not be aligned, for one thing). */
7592 && !paradoxical_subreg_p (tmode
, inner_mode
)
7593 && (inner_mode
== tmode
7594 || (! mode_dependent_address_p (XEXP (inner
, 0),
7595 MEM_ADDR_SPACE (inner
))
7596 && ! MEM_VOLATILE_P (inner
))))))
7598 /* If INNER is a MEM, make a new MEM that encompasses just the desired
7599 field. If the original and current mode are the same, we need not
7600 adjust the offset. Otherwise, we do if bytes big endian.
7602 If INNER is not a MEM, get a piece consisting of just the field
7603 of interest (in this case POS % BITS_PER_WORD must be 0). */
7609 /* POS counts from lsb, but make OFFSET count in memory order. */
7610 if (BYTES_BIG_ENDIAN
)
7611 offset
= bits_to_bytes_round_down (GET_MODE_PRECISION (is_mode
)
7614 offset
= pos
/ BITS_PER_UNIT
;
7616 new_rtx
= adjust_address_nv (inner
, tmode
, offset
);
7618 else if (REG_P (inner
))
7620 if (tmode
!= inner_mode
)
7622 /* We can't call gen_lowpart in a DEST since we
7623 always want a SUBREG (see below) and it would sometimes
7624 return a new hard register. */
7628 = subreg_offset_from_lsb (tmode
, inner_mode
, pos
);
7630 /* Avoid creating invalid subregs, for example when
7631 simplifying (x>>32)&255. */
7632 if (!validate_subreg (tmode
, inner_mode
, inner
, offset
))
7635 new_rtx
= gen_rtx_SUBREG (tmode
, inner
, offset
);
7638 new_rtx
= gen_lowpart (tmode
, inner
);
7644 new_rtx
= force_to_mode (inner
, tmode
,
7645 len
>= HOST_BITS_PER_WIDE_INT
7647 : (HOST_WIDE_INT_1U
<< len
) - 1, 0);
7649 /* If this extraction is going into the destination of a SET,
7650 make a STRICT_LOW_PART unless we made a MEM. */
7653 return (MEM_P (new_rtx
) ? new_rtx
7654 : (GET_CODE (new_rtx
) != SUBREG
7655 ? gen_rtx_CLOBBER (tmode
, const0_rtx
)
7656 : gen_rtx_STRICT_LOW_PART (VOIDmode
, new_rtx
)));
7661 if (CONST_SCALAR_INT_P (new_rtx
))
7662 return simplify_unary_operation (unsignedp
? ZERO_EXTEND
: SIGN_EXTEND
,
7663 mode
, new_rtx
, tmode
);
7665 /* If we know that no extraneous bits are set, and that the high
7666 bit is not set, convert the extraction to the cheaper of
7667 sign and zero extension, that are equivalent in these cases. */
7668 if (flag_expensive_optimizations
7669 && (HWI_COMPUTABLE_MODE_P (tmode
)
7670 && ((nonzero_bits (new_rtx
, tmode
)
7671 & ~(((unsigned HOST_WIDE_INT
)GET_MODE_MASK (tmode
)) >> 1))
7674 rtx temp
= gen_rtx_ZERO_EXTEND (mode
, new_rtx
);
7675 rtx temp1
= gen_rtx_SIGN_EXTEND (mode
, new_rtx
);
7677 /* Prefer ZERO_EXTENSION, since it gives more information to
7679 if (set_src_cost (temp
, mode
, optimize_this_for_speed_p
)
7680 <= set_src_cost (temp1
, mode
, optimize_this_for_speed_p
))
7685 /* Otherwise, sign- or zero-extend unless we already are in the
7688 return (gen_rtx_fmt_e (unsignedp
? ZERO_EXTEND
: SIGN_EXTEND
,
7692 /* Unless this is a COMPARE or we have a funny memory reference,
7693 don't do anything with zero-extending field extracts starting at
7694 the low-order bit since they are simple AND operations. */
7695 if (pos_rtx
== 0 && pos
== 0 && ! in_dest
7696 && ! in_compare
&& unsignedp
)
7699 /* Unless INNER is not MEM, reject this if we would be spanning bytes or
7700 if the position is not a constant and the length is not 1. In all
7701 other cases, we would only be going outside our object in cases when
7702 an original shift would have been undefined. */
7704 && ((pos_rtx
== 0 && maybe_gt (pos
+ len
, GET_MODE_PRECISION (is_mode
)))
7705 || (pos_rtx
!= 0 && len
!= 1)))
7708 enum extraction_pattern pattern
= (in_dest
? EP_insv
7709 : unsignedp
? EP_extzv
: EP_extv
);
7711 /* If INNER is not from memory, we want it to have the mode of a register
7712 extraction pattern's structure operand, or word_mode if there is no
7713 such pattern. The same applies to extraction_mode and pos_mode
7714 and their respective operands.
7716 For memory, assume that the desired extraction_mode and pos_mode
7717 are the same as for a register operation, since at present we don't
7718 have named patterns for aligned memory structures. */
7719 struct extraction_insn insn
;
7720 unsigned int inner_size
;
7721 if (GET_MODE_BITSIZE (inner_mode
).is_constant (&inner_size
)
7722 && get_best_reg_extraction_insn (&insn
, pattern
, inner_size
, mode
))
7724 wanted_inner_reg_mode
= insn
.struct_mode
.require ();
7725 pos_mode
= insn
.pos_mode
;
7726 extraction_mode
= insn
.field_mode
;
7729 /* Never narrow an object, since that might not be safe. */
7731 if (mode
!= VOIDmode
7732 && partial_subreg_p (extraction_mode
, mode
))
7733 extraction_mode
= mode
;
7736 wanted_inner_mode
= wanted_inner_reg_mode
;
7739 /* Be careful not to go beyond the extracted object and maintain the
7740 natural alignment of the memory. */
7741 wanted_inner_mode
= smallest_int_mode_for_size (len
);
7742 while (pos
% GET_MODE_BITSIZE (wanted_inner_mode
) + len
7743 > GET_MODE_BITSIZE (wanted_inner_mode
))
7744 wanted_inner_mode
= GET_MODE_WIDER_MODE (wanted_inner_mode
).require ();
7749 if (BITS_BIG_ENDIAN
)
7751 /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
7752 BITS_BIG_ENDIAN style. If position is constant, compute new
7753 position. Otherwise, build subtraction.
7754 Note that POS is relative to the mode of the original argument.
7755 If it's a MEM we need to recompute POS relative to that.
7756 However, if we're extracting from (or inserting into) a register,
7757 we want to recompute POS relative to wanted_inner_mode. */
7760 width
= GET_MODE_BITSIZE (wanted_inner_mode
);
7761 else if (!GET_MODE_BITSIZE (is_mode
).is_constant (&width
))
7765 pos
= width
- len
- pos
;
7768 = gen_rtx_MINUS (GET_MODE (pos_rtx
),
7769 gen_int_mode (width
- len
, GET_MODE (pos_rtx
)),
7771 /* POS may be less than 0 now, but we check for that below.
7772 Note that it can only be less than 0 if !MEM_P (inner). */
7775 /* If INNER has a wider mode, and this is a constant extraction, try to
7776 make it smaller and adjust the byte to point to the byte containing
7778 if (wanted_inner_mode
!= VOIDmode
7779 && inner_mode
!= wanted_inner_mode
7781 && partial_subreg_p (wanted_inner_mode
, is_mode
)
7783 && ! mode_dependent_address_p (XEXP (inner
, 0), MEM_ADDR_SPACE (inner
))
7784 && ! MEM_VOLATILE_P (inner
))
7786 poly_int64 offset
= 0;
7788 /* The computations below will be correct if the machine is big
7789 endian in both bits and bytes or little endian in bits and bytes.
7790 If it is mixed, we must adjust. */
7792 /* If bytes are big endian and we had a paradoxical SUBREG, we must
7793 adjust OFFSET to compensate. */
7794 if (BYTES_BIG_ENDIAN
7795 && paradoxical_subreg_p (is_mode
, inner_mode
))
7796 offset
-= GET_MODE_SIZE (is_mode
) - GET_MODE_SIZE (inner_mode
);
7798 /* We can now move to the desired byte. */
7799 offset
+= (pos
/ GET_MODE_BITSIZE (wanted_inner_mode
))
7800 * GET_MODE_SIZE (wanted_inner_mode
);
7801 pos
%= GET_MODE_BITSIZE (wanted_inner_mode
);
7803 if (BYTES_BIG_ENDIAN
!= BITS_BIG_ENDIAN
7804 && is_mode
!= wanted_inner_mode
)
7805 offset
= (GET_MODE_SIZE (is_mode
)
7806 - GET_MODE_SIZE (wanted_inner_mode
) - offset
);
7808 inner
= adjust_address_nv (inner
, wanted_inner_mode
, offset
);
7811 /* If INNER is not memory, get it into the proper mode. If we are changing
7812 its mode, POS must be a constant and smaller than the size of the new
7814 else if (!MEM_P (inner
))
7816 /* On the LHS, don't create paradoxical subregs implicitely truncating
7817 the register unless TARGET_TRULY_NOOP_TRUNCATION. */
7819 && !TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (inner
),
7823 if (GET_MODE (inner
) != wanted_inner_mode
7825 || orig_pos
+ len
> GET_MODE_BITSIZE (wanted_inner_mode
)))
7831 inner
= force_to_mode (inner
, wanted_inner_mode
,
7833 || len
+ orig_pos
>= HOST_BITS_PER_WIDE_INT
7835 : (((HOST_WIDE_INT_1U
<< len
) - 1)
7840 /* Adjust mode of POS_RTX, if needed. If we want a wider mode, we
7841 have to zero extend. Otherwise, we can just use a SUBREG.
7843 We dealt with constant rtxes earlier, so pos_rtx cannot
7844 have VOIDmode at this point. */
7846 && (GET_MODE_SIZE (pos_mode
)
7847 > GET_MODE_SIZE (as_a
<scalar_int_mode
> (GET_MODE (pos_rtx
)))))
7849 rtx temp
= simplify_gen_unary (ZERO_EXTEND
, pos_mode
, pos_rtx
,
7850 GET_MODE (pos_rtx
));
7852 /* If we know that no extraneous bits are set, and that the high
7853 bit is not set, convert extraction to cheaper one - either
7854 SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
7856 if (flag_expensive_optimizations
7857 && (HWI_COMPUTABLE_MODE_P (GET_MODE (pos_rtx
))
7858 && ((nonzero_bits (pos_rtx
, GET_MODE (pos_rtx
))
7859 & ~(((unsigned HOST_WIDE_INT
)
7860 GET_MODE_MASK (GET_MODE (pos_rtx
)))
7864 rtx temp1
= simplify_gen_unary (SIGN_EXTEND
, pos_mode
, pos_rtx
,
7865 GET_MODE (pos_rtx
));
7867 /* Prefer ZERO_EXTENSION, since it gives more information to
7869 if (set_src_cost (temp1
, pos_mode
, optimize_this_for_speed_p
)
7870 < set_src_cost (temp
, pos_mode
, optimize_this_for_speed_p
))
7876 /* Make POS_RTX unless we already have it and it is correct. If we don't
7877 have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
7879 if (pos_rtx
== 0 && orig_pos_rtx
!= 0 && INTVAL (orig_pos_rtx
) == pos
)
7880 pos_rtx
= orig_pos_rtx
;
7882 else if (pos_rtx
== 0)
7883 pos_rtx
= GEN_INT (pos
);
7885 /* Make the required operation. See if we can use existing rtx. */
7886 new_rtx
= gen_rtx_fmt_eee (unsignedp
? ZERO_EXTRACT
: SIGN_EXTRACT
,
7887 extraction_mode
, inner
, GEN_INT (len
), pos_rtx
);
7889 new_rtx
= gen_lowpart (mode
, new_rtx
);
7894 /* See if X (of mode MODE) contains an ASHIFT of COUNT or more bits that
7895 can be commuted with any other operations in X. Return X without
7896 that shift if so. */
7899 extract_left_shift (scalar_int_mode mode
, rtx x
, int count
)
7901 enum rtx_code code
= GET_CODE (x
);
7907 /* This is the shift itself. If it is wide enough, we will return
7908 either the value being shifted if the shift count is equal to
7909 COUNT or a shift for the difference. */
7910 if (CONST_INT_P (XEXP (x
, 1))
7911 && INTVAL (XEXP (x
, 1)) >= count
)
7912 return simplify_shift_const (NULL_RTX
, ASHIFT
, mode
, XEXP (x
, 0),
7913 INTVAL (XEXP (x
, 1)) - count
);
7917 if ((tem
= extract_left_shift (mode
, XEXP (x
, 0), count
)) != 0)
7918 return simplify_gen_unary (code
, mode
, tem
, mode
);
7922 case PLUS
: case IOR
: case XOR
: case AND
:
7923 /* If we can safely shift this constant and we find the inner shift,
7924 make a new operation. */
7925 if (CONST_INT_P (XEXP (x
, 1))
7926 && (UINTVAL (XEXP (x
, 1))
7927 & (((HOST_WIDE_INT_1U
<< count
)) - 1)) == 0
7928 && (tem
= extract_left_shift (mode
, XEXP (x
, 0), count
)) != 0)
7930 HOST_WIDE_INT val
= INTVAL (XEXP (x
, 1)) >> count
;
7931 return simplify_gen_binary (code
, mode
, tem
,
7932 gen_int_mode (val
, mode
));
7943 /* Subroutine of make_compound_operation. *X_PTR is the rtx at the current
7944 level of the expression and MODE is its mode. IN_CODE is as for
7945 make_compound_operation. *NEXT_CODE_PTR is the value of IN_CODE
7946 that should be used when recursing on operands of *X_PTR.
7948 There are two possible actions:
7950 - Return null. This tells the caller to recurse on *X_PTR with IN_CODE
7951 equal to *NEXT_CODE_PTR, after which *X_PTR holds the final value.
7953 - Return a new rtx, which the caller returns directly. */
7956 make_compound_operation_int (scalar_int_mode mode
, rtx
*x_ptr
,
7957 enum rtx_code in_code
,
7958 enum rtx_code
*next_code_ptr
)
7961 enum rtx_code next_code
= *next_code_ptr
;
7962 enum rtx_code code
= GET_CODE (x
);
7963 int mode_width
= GET_MODE_PRECISION (mode
);
7968 scalar_int_mode inner_mode
;
7969 bool equality_comparison
= false;
7973 equality_comparison
= true;
7977 /* Process depending on the code of this operation. If NEW is set
7978 nonzero, it will be returned. */
7983 /* Convert shifts by constants into multiplications if inside
7985 if (in_code
== MEM
&& CONST_INT_P (XEXP (x
, 1))
7986 && INTVAL (XEXP (x
, 1)) < HOST_BITS_PER_WIDE_INT
7987 && INTVAL (XEXP (x
, 1)) >= 0)
7989 HOST_WIDE_INT count
= INTVAL (XEXP (x
, 1));
7990 HOST_WIDE_INT multval
= HOST_WIDE_INT_1
<< count
;
7992 new_rtx
= make_compound_operation (XEXP (x
, 0), next_code
);
7993 if (GET_CODE (new_rtx
) == NEG
)
7995 new_rtx
= XEXP (new_rtx
, 0);
7998 multval
= trunc_int_for_mode (multval
, mode
);
7999 new_rtx
= gen_rtx_MULT (mode
, new_rtx
, gen_int_mode (multval
, mode
));
8006 lhs
= make_compound_operation (lhs
, next_code
);
8007 rhs
= make_compound_operation (rhs
, next_code
);
8008 if (GET_CODE (lhs
) == MULT
&& GET_CODE (XEXP (lhs
, 0)) == NEG
)
8010 tem
= simplify_gen_binary (MULT
, mode
, XEXP (XEXP (lhs
, 0), 0),
8012 new_rtx
= simplify_gen_binary (MINUS
, mode
, rhs
, tem
);
8014 else if (GET_CODE (lhs
) == MULT
8015 && (CONST_INT_P (XEXP (lhs
, 1)) && INTVAL (XEXP (lhs
, 1)) < 0))
8017 tem
= simplify_gen_binary (MULT
, mode
, XEXP (lhs
, 0),
8018 simplify_gen_unary (NEG
, mode
,
8021 new_rtx
= simplify_gen_binary (MINUS
, mode
, rhs
, tem
);
8025 SUBST (XEXP (x
, 0), lhs
);
8026 SUBST (XEXP (x
, 1), rhs
);
8028 maybe_swap_commutative_operands (x
);
8034 lhs
= make_compound_operation (lhs
, next_code
);
8035 rhs
= make_compound_operation (rhs
, next_code
);
8036 if (GET_CODE (rhs
) == MULT
&& GET_CODE (XEXP (rhs
, 0)) == NEG
)
8038 tem
= simplify_gen_binary (MULT
, mode
, XEXP (XEXP (rhs
, 0), 0),
8040 return simplify_gen_binary (PLUS
, mode
, tem
, lhs
);
8042 else if (GET_CODE (rhs
) == MULT
8043 && (CONST_INT_P (XEXP (rhs
, 1)) && INTVAL (XEXP (rhs
, 1)) < 0))
8045 tem
= simplify_gen_binary (MULT
, mode
, XEXP (rhs
, 0),
8046 simplify_gen_unary (NEG
, mode
,
8049 return simplify_gen_binary (PLUS
, mode
, tem
, lhs
);
8053 SUBST (XEXP (x
, 0), lhs
);
8054 SUBST (XEXP (x
, 1), rhs
);
8059 /* If the second operand is not a constant, we can't do anything
8061 if (!CONST_INT_P (XEXP (x
, 1)))
8064 /* If the constant is a power of two minus one and the first operand
8065 is a logical right shift, make an extraction. */
8066 if (GET_CODE (XEXP (x
, 0)) == LSHIFTRT
8067 && (i
= exact_log2 (UINTVAL (XEXP (x
, 1)) + 1)) >= 0)
8069 new_rtx
= make_compound_operation (XEXP (XEXP (x
, 0), 0), next_code
);
8070 new_rtx
= make_extraction (mode
, new_rtx
, 0, XEXP (XEXP (x
, 0), 1),
8071 i
, 1, 0, in_code
== COMPARE
);
8074 /* Same as previous, but for (subreg (lshiftrt ...)) in first op. */
8075 else if (GET_CODE (XEXP (x
, 0)) == SUBREG
8076 && subreg_lowpart_p (XEXP (x
, 0))
8077 && is_a
<scalar_int_mode
> (GET_MODE (SUBREG_REG (XEXP (x
, 0))),
8079 && GET_CODE (SUBREG_REG (XEXP (x
, 0))) == LSHIFTRT
8080 && (i
= exact_log2 (UINTVAL (XEXP (x
, 1)) + 1)) >= 0)
8082 rtx inner_x0
= SUBREG_REG (XEXP (x
, 0));
8083 new_rtx
= make_compound_operation (XEXP (inner_x0
, 0), next_code
);
8084 new_rtx
= make_extraction (inner_mode
, new_rtx
, 0,
8086 i
, 1, 0, in_code
== COMPARE
);
8088 /* If we narrowed the mode when dropping the subreg, then we lose. */
8089 if (GET_MODE_SIZE (inner_mode
) < GET_MODE_SIZE (mode
))
8092 /* If that didn't give anything, see if the AND simplifies on
8094 if (!new_rtx
&& i
>= 0)
8096 new_rtx
= make_compound_operation (XEXP (x
, 0), next_code
);
8097 new_rtx
= make_extraction (mode
, new_rtx
, 0, NULL_RTX
, i
, 1,
8098 0, in_code
== COMPARE
);
8101 /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)). */
8102 else if ((GET_CODE (XEXP (x
, 0)) == XOR
8103 || GET_CODE (XEXP (x
, 0)) == IOR
)
8104 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == LSHIFTRT
8105 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == LSHIFTRT
8106 && (i
= exact_log2 (UINTVAL (XEXP (x
, 1)) + 1)) >= 0)
8108 /* Apply the distributive law, and then try to make extractions. */
8109 new_rtx
= gen_rtx_fmt_ee (GET_CODE (XEXP (x
, 0)), mode
,
8110 gen_rtx_AND (mode
, XEXP (XEXP (x
, 0), 0),
8112 gen_rtx_AND (mode
, XEXP (XEXP (x
, 0), 1),
8114 new_rtx
= make_compound_operation (new_rtx
, in_code
);
8117 /* If we are have (and (rotate X C) M) and C is larger than the number
8118 of bits in M, this is an extraction. */
8120 else if (GET_CODE (XEXP (x
, 0)) == ROTATE
8121 && CONST_INT_P (XEXP (XEXP (x
, 0), 1))
8122 && (i
= exact_log2 (UINTVAL (XEXP (x
, 1)) + 1)) >= 0
8123 && i
<= INTVAL (XEXP (XEXP (x
, 0), 1)))
8125 new_rtx
= make_compound_operation (XEXP (XEXP (x
, 0), 0), next_code
);
8126 new_rtx
= make_extraction (mode
, new_rtx
,
8127 (GET_MODE_PRECISION (mode
)
8128 - INTVAL (XEXP (XEXP (x
, 0), 1))),
8129 NULL_RTX
, i
, 1, 0, in_code
== COMPARE
);
8132 /* On machines without logical shifts, if the operand of the AND is
8133 a logical shift and our mask turns off all the propagated sign
8134 bits, we can replace the logical shift with an arithmetic shift. */
8135 else if (GET_CODE (XEXP (x
, 0)) == LSHIFTRT
8136 && !have_insn_for (LSHIFTRT
, mode
)
8137 && have_insn_for (ASHIFTRT
, mode
)
8138 && CONST_INT_P (XEXP (XEXP (x
, 0), 1))
8139 && INTVAL (XEXP (XEXP (x
, 0), 1)) >= 0
8140 && INTVAL (XEXP (XEXP (x
, 0), 1)) < HOST_BITS_PER_WIDE_INT
8141 && mode_width
<= HOST_BITS_PER_WIDE_INT
)
8143 unsigned HOST_WIDE_INT mask
= GET_MODE_MASK (mode
);
8145 mask
>>= INTVAL (XEXP (XEXP (x
, 0), 1));
8146 if ((INTVAL (XEXP (x
, 1)) & ~mask
) == 0)
8148 gen_rtx_ASHIFTRT (mode
,
8149 make_compound_operation (XEXP (XEXP (x
,
8153 XEXP (XEXP (x
, 0), 1)));
8156 /* If the constant is one less than a power of two, this might be
8157 representable by an extraction even if no shift is present.
8158 If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
8159 we are in a COMPARE. */
8160 else if ((i
= exact_log2 (UINTVAL (XEXP (x
, 1)) + 1)) >= 0)
8161 new_rtx
= make_extraction (mode
,
8162 make_compound_operation (XEXP (x
, 0),
8164 0, NULL_RTX
, i
, 1, 0, in_code
== COMPARE
);
8166 /* If we are in a comparison and this is an AND with a power of two,
8167 convert this into the appropriate bit extract. */
8168 else if (in_code
== COMPARE
8169 && (i
= exact_log2 (UINTVAL (XEXP (x
, 1)))) >= 0
8170 && (equality_comparison
|| i
< GET_MODE_PRECISION (mode
) - 1))
8171 new_rtx
= make_extraction (mode
,
8172 make_compound_operation (XEXP (x
, 0),
8174 i
, NULL_RTX
, 1, 1, 0, 1);
8176 /* If the one operand is a paradoxical subreg of a register or memory and
8177 the constant (limited to the smaller mode) has only zero bits where
8178 the sub expression has known zero bits, this can be expressed as
8180 else if (GET_CODE (XEXP (x
, 0)) == SUBREG
)
8184 sub
= XEXP (XEXP (x
, 0), 0);
8185 machine_mode sub_mode
= GET_MODE (sub
);
8187 if ((REG_P (sub
) || MEM_P (sub
))
8188 && GET_MODE_PRECISION (sub_mode
).is_constant (&sub_width
)
8189 && sub_width
< mode_width
)
8191 unsigned HOST_WIDE_INT mode_mask
= GET_MODE_MASK (sub_mode
);
8192 unsigned HOST_WIDE_INT mask
;
8194 /* original AND constant with all the known zero bits set */
8195 mask
= UINTVAL (XEXP (x
, 1)) | (~nonzero_bits (sub
, sub_mode
));
8196 if ((mask
& mode_mask
) == mode_mask
)
8198 new_rtx
= make_compound_operation (sub
, next_code
);
8199 new_rtx
= make_extraction (mode
, new_rtx
, 0, 0, sub_width
,
8200 1, 0, in_code
== COMPARE
);
8208 /* If the sign bit is known to be zero, replace this with an
8209 arithmetic shift. */
8210 if (have_insn_for (ASHIFTRT
, mode
)
8211 && ! have_insn_for (LSHIFTRT
, mode
)
8212 && mode_width
<= HOST_BITS_PER_WIDE_INT
8213 && (nonzero_bits (XEXP (x
, 0), mode
) & (1 << (mode_width
- 1))) == 0)
8215 new_rtx
= gen_rtx_ASHIFTRT (mode
,
8216 make_compound_operation (XEXP (x
, 0),
8228 /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
8229 this is a SIGN_EXTRACT. */
8230 if (CONST_INT_P (rhs
)
8231 && GET_CODE (lhs
) == ASHIFT
8232 && CONST_INT_P (XEXP (lhs
, 1))
8233 && INTVAL (rhs
) >= INTVAL (XEXP (lhs
, 1))
8234 && INTVAL (XEXP (lhs
, 1)) >= 0
8235 && INTVAL (rhs
) < mode_width
)
8237 new_rtx
= make_compound_operation (XEXP (lhs
, 0), next_code
);
8238 new_rtx
= make_extraction (mode
, new_rtx
,
8239 INTVAL (rhs
) - INTVAL (XEXP (lhs
, 1)),
8240 NULL_RTX
, mode_width
- INTVAL (rhs
),
8241 code
== LSHIFTRT
, 0, in_code
== COMPARE
);
8245 /* See if we have operations between an ASHIFTRT and an ASHIFT.
8246 If so, try to merge the shifts into a SIGN_EXTEND. We could
8247 also do this for some cases of SIGN_EXTRACT, but it doesn't
8248 seem worth the effort; the case checked for occurs on Alpha. */
8251 && ! (GET_CODE (lhs
) == SUBREG
8252 && (OBJECT_P (SUBREG_REG (lhs
))))
8253 && CONST_INT_P (rhs
)
8254 && INTVAL (rhs
) >= 0
8255 && INTVAL (rhs
) < HOST_BITS_PER_WIDE_INT
8256 && INTVAL (rhs
) < mode_width
8257 && (new_rtx
= extract_left_shift (mode
, lhs
, INTVAL (rhs
))) != 0)
8258 new_rtx
= make_extraction (mode
, make_compound_operation (new_rtx
,
8260 0, NULL_RTX
, mode_width
- INTVAL (rhs
),
8261 code
== LSHIFTRT
, 0, in_code
== COMPARE
);
8266 /* Call ourselves recursively on the inner expression. If we are
8267 narrowing the object and it has a different RTL code from
8268 what it originally did, do this SUBREG as a force_to_mode. */
8270 rtx inner
= SUBREG_REG (x
), simplified
;
8271 enum rtx_code subreg_code
= in_code
;
8273 /* If the SUBREG is masking of a logical right shift,
8274 make an extraction. */
8275 if (GET_CODE (inner
) == LSHIFTRT
8276 && is_a
<scalar_int_mode
> (GET_MODE (inner
), &inner_mode
)
8277 && GET_MODE_SIZE (mode
) < GET_MODE_SIZE (inner_mode
)
8278 && CONST_INT_P (XEXP (inner
, 1))
8279 && UINTVAL (XEXP (inner
, 1)) < GET_MODE_PRECISION (inner_mode
)
8280 && subreg_lowpart_p (x
))
8282 new_rtx
= make_compound_operation (XEXP (inner
, 0), next_code
);
8283 int width
= GET_MODE_PRECISION (inner_mode
)
8284 - INTVAL (XEXP (inner
, 1));
8285 if (width
> mode_width
)
8287 new_rtx
= make_extraction (mode
, new_rtx
, 0, XEXP (inner
, 1),
8288 width
, 1, 0, in_code
== COMPARE
);
8292 /* If in_code is COMPARE, it isn't always safe to pass it through
8293 to the recursive make_compound_operation call. */
8294 if (subreg_code
== COMPARE
8295 && (!subreg_lowpart_p (x
)
8296 || GET_CODE (inner
) == SUBREG
8297 /* (subreg:SI (and:DI (reg:DI) (const_int 0x800000000)) 0)
8298 is (const_int 0), rather than
8299 (subreg:SI (lshiftrt:DI (reg:DI) (const_int 35)) 0).
8300 Similarly (subreg:QI (and:SI (reg:SI) (const_int 0x80)) 0)
8301 for non-equality comparisons against 0 is not equivalent
8302 to (subreg:QI (lshiftrt:SI (reg:SI) (const_int 7)) 0). */
8303 || (GET_CODE (inner
) == AND
8304 && CONST_INT_P (XEXP (inner
, 1))
8305 && partial_subreg_p (x
)
8306 && exact_log2 (UINTVAL (XEXP (inner
, 1)))
8307 >= GET_MODE_BITSIZE (mode
) - 1)))
8310 tem
= make_compound_operation (inner
, subreg_code
);
8313 = simplify_subreg (mode
, tem
, GET_MODE (inner
), SUBREG_BYTE (x
));
8317 if (GET_CODE (tem
) != GET_CODE (inner
)
8318 && partial_subreg_p (x
)
8319 && subreg_lowpart_p (x
))
8322 = force_to_mode (tem
, mode
, HOST_WIDE_INT_M1U
, 0);
8324 /* If we have something other than a SUBREG, we might have
8325 done an expansion, so rerun ourselves. */
8326 if (GET_CODE (newer
) != SUBREG
)
8327 newer
= make_compound_operation (newer
, in_code
);
8329 /* force_to_mode can expand compounds. If it just re-expanded
8330 the compound, use gen_lowpart to convert to the desired
8332 if (rtx_equal_p (newer
, x
)
8333 /* Likewise if it re-expanded the compound only partially.
8334 This happens for SUBREG of ZERO_EXTRACT if they extract
8335 the same number of bits. */
8336 || (GET_CODE (newer
) == SUBREG
8337 && (GET_CODE (SUBREG_REG (newer
)) == LSHIFTRT
8338 || GET_CODE (SUBREG_REG (newer
)) == ASHIFTRT
)
8339 && GET_CODE (inner
) == AND
8340 && rtx_equal_p (SUBREG_REG (newer
), XEXP (inner
, 0))))
8341 return gen_lowpart (GET_MODE (x
), tem
);
8356 *x_ptr
= gen_lowpart (mode
, new_rtx
);
8357 *next_code_ptr
= next_code
;
8361 /* Look at the expression rooted at X. Look for expressions
8362 equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
8363 Form these expressions.
8365 Return the new rtx, usually just X.
8367 Also, for machines like the VAX that don't have logical shift insns,
8368 try to convert logical to arithmetic shift operations in cases where
8369 they are equivalent. This undoes the canonicalizations to logical
8370 shifts done elsewhere.
8372 We try, as much as possible, to re-use rtl expressions to save memory.
8374 IN_CODE says what kind of expression we are processing. Normally, it is
8375 SET. In a memory address it is MEM. When processing the arguments of
8376 a comparison or a COMPARE against zero, it is COMPARE, or EQ if more
8377 precisely it is an equality comparison against zero. */
8380 make_compound_operation (rtx x
, enum rtx_code in_code
)
8382 enum rtx_code code
= GET_CODE (x
);
8385 enum rtx_code next_code
;
8388 /* Select the code to be used in recursive calls. Once we are inside an
8389 address, we stay there. If we have a comparison, set to COMPARE,
8390 but once inside, go back to our default of SET. */
8392 next_code
= (code
== MEM
? MEM
8393 : ((code
== COMPARE
|| COMPARISON_P (x
))
8394 && XEXP (x
, 1) == const0_rtx
) ? COMPARE
8395 : in_code
== COMPARE
|| in_code
== EQ
? SET
: in_code
);
8397 scalar_int_mode mode
;
8398 if (is_a
<scalar_int_mode
> (GET_MODE (x
), &mode
))
8400 rtx new_rtx
= make_compound_operation_int (mode
, &x
, in_code
,
8404 code
= GET_CODE (x
);
8407 /* Now recursively process each operand of this operation. We need to
8408 handle ZERO_EXTEND specially so that we don't lose track of the
8410 if (code
== ZERO_EXTEND
)
8412 new_rtx
= make_compound_operation (XEXP (x
, 0), next_code
);
8413 tem
= simplify_const_unary_operation (ZERO_EXTEND
, GET_MODE (x
),
8414 new_rtx
, GET_MODE (XEXP (x
, 0)));
8417 SUBST (XEXP (x
, 0), new_rtx
);
8421 fmt
= GET_RTX_FORMAT (code
);
8422 for (i
= 0; i
< GET_RTX_LENGTH (code
); i
++)
8425 new_rtx
= make_compound_operation (XEXP (x
, i
), next_code
);
8426 SUBST (XEXP (x
, i
), new_rtx
);
8428 else if (fmt
[i
] == 'E')
8429 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
8431 new_rtx
= make_compound_operation (XVECEXP (x
, i
, j
), next_code
);
8432 SUBST (XVECEXP (x
, i
, j
), new_rtx
);
8435 maybe_swap_commutative_operands (x
);
8439 /* Given M see if it is a value that would select a field of bits
8440 within an item, but not the entire word. Return -1 if not.
8441 Otherwise, return the starting position of the field, where 0 is the
8444 *PLEN is set to the length of the field. */
8447 get_pos_from_mask (unsigned HOST_WIDE_INT m
, unsigned HOST_WIDE_INT
*plen
)
8449 /* Get the bit number of the first 1 bit from the right, -1 if none. */
8450 int pos
= m
? ctz_hwi (m
) : -1;
8454 /* Now shift off the low-order zero bits and see if we have a
8455 power of two minus 1. */
8456 len
= exact_log2 ((m
>> pos
) + 1);
8465 /* If X refers to a register that equals REG in value, replace these
8466 references with REG. */
8468 canon_reg_for_combine (rtx x
, rtx reg
)
8475 enum rtx_code code
= GET_CODE (x
);
8476 switch (GET_RTX_CLASS (code
))
8479 op0
= canon_reg_for_combine (XEXP (x
, 0), reg
);
8480 if (op0
!= XEXP (x
, 0))
8481 return simplify_gen_unary (GET_CODE (x
), GET_MODE (x
), op0
,
8486 case RTX_COMM_ARITH
:
8487 op0
= canon_reg_for_combine (XEXP (x
, 0), reg
);
8488 op1
= canon_reg_for_combine (XEXP (x
, 1), reg
);
8489 if (op0
!= XEXP (x
, 0) || op1
!= XEXP (x
, 1))
8490 return simplify_gen_binary (GET_CODE (x
), GET_MODE (x
), op0
, op1
);
8494 case RTX_COMM_COMPARE
:
8495 op0
= canon_reg_for_combine (XEXP (x
, 0), reg
);
8496 op1
= canon_reg_for_combine (XEXP (x
, 1), reg
);
8497 if (op0
!= XEXP (x
, 0) || op1
!= XEXP (x
, 1))
8498 return simplify_gen_relational (GET_CODE (x
), GET_MODE (x
),
8499 GET_MODE (op0
), op0
, op1
);
8503 case RTX_BITFIELD_OPS
:
8504 op0
= canon_reg_for_combine (XEXP (x
, 0), reg
);
8505 op1
= canon_reg_for_combine (XEXP (x
, 1), reg
);
8506 op2
= canon_reg_for_combine (XEXP (x
, 2), reg
);
8507 if (op0
!= XEXP (x
, 0) || op1
!= XEXP (x
, 1) || op2
!= XEXP (x
, 2))
8508 return simplify_gen_ternary (GET_CODE (x
), GET_MODE (x
),
8509 GET_MODE (op0
), op0
, op1
, op2
);
8515 if (rtx_equal_p (get_last_value (reg
), x
)
8516 || rtx_equal_p (reg
, get_last_value (x
)))
8525 fmt
= GET_RTX_FORMAT (code
);
8527 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
8530 rtx op
= canon_reg_for_combine (XEXP (x
, i
), reg
);
8531 if (op
!= XEXP (x
, i
))
8541 else if (fmt
[i
] == 'E')
8544 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
8546 rtx op
= canon_reg_for_combine (XVECEXP (x
, i
, j
), reg
);
8547 if (op
!= XVECEXP (x
, i
, j
))
8554 XVECEXP (x
, i
, j
) = op
;
8565 /* Return X converted to MODE. If the value is already truncated to
8566 MODE we can just return a subreg even though in the general case we
8567 would need an explicit truncation. */
8570 gen_lowpart_or_truncate (machine_mode mode
, rtx x
)
8572 if (!CONST_INT_P (x
)
8573 && partial_subreg_p (mode
, GET_MODE (x
))
8574 && !TRULY_NOOP_TRUNCATION_MODES_P (mode
, GET_MODE (x
))
8575 && !(REG_P (x
) && reg_truncated_to_mode (mode
, x
)))
8577 /* Bit-cast X into an integer mode. */
8578 if (!SCALAR_INT_MODE_P (GET_MODE (x
)))
8579 x
= gen_lowpart (int_mode_for_mode (GET_MODE (x
)).require (), x
);
8580 x
= simplify_gen_unary (TRUNCATE
, int_mode_for_mode (mode
).require (),
8584 return gen_lowpart (mode
, x
);
8587 /* See if X can be simplified knowing that we will only refer to it in
8588 MODE and will only refer to those bits that are nonzero in MASK.
8589 If other bits are being computed or if masking operations are done
8590 that select a superset of the bits in MASK, they can sometimes be
8593 Return a possibly simplified expression, but always convert X to
8594 MODE. If X is a CONST_INT, AND the CONST_INT with MASK.
8596 If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
8597 are all off in X. This is used when X will be complemented, by either
8598 NOT, NEG, or XOR. */
8601 force_to_mode (rtx x
, machine_mode mode
, unsigned HOST_WIDE_INT mask
,
8604 enum rtx_code code
= GET_CODE (x
);
8605 int next_select
= just_select
|| code
== XOR
|| code
== NOT
|| code
== NEG
;
8606 machine_mode op_mode
;
8607 unsigned HOST_WIDE_INT nonzero
;
8609 /* If this is a CALL or ASM_OPERANDS, don't do anything. Some of the
8610 code below will do the wrong thing since the mode of such an
8611 expression is VOIDmode.
8613 Also do nothing if X is a CLOBBER; this can happen if X was
8614 the return value from a call to gen_lowpart. */
8615 if (code
== CALL
|| code
== ASM_OPERANDS
|| code
== CLOBBER
)
8618 /* We want to perform the operation in its present mode unless we know
8619 that the operation is valid in MODE, in which case we do the operation
8621 op_mode
= ((GET_MODE_CLASS (mode
) == GET_MODE_CLASS (GET_MODE (x
))
8622 && have_insn_for (code
, mode
))
8623 ? mode
: GET_MODE (x
));
8625 /* It is not valid to do a right-shift in a narrower mode
8626 than the one it came in with. */
8627 if ((code
== LSHIFTRT
|| code
== ASHIFTRT
)
8628 && partial_subreg_p (mode
, GET_MODE (x
)))
8629 op_mode
= GET_MODE (x
);
8631 /* Truncate MASK to fit OP_MODE. */
8633 mask
&= GET_MODE_MASK (op_mode
);
8635 /* Determine what bits of X are guaranteed to be (non)zero. */
8636 nonzero
= nonzero_bits (x
, mode
);
8638 /* If none of the bits in X are needed, return a zero. */
8639 if (!just_select
&& (nonzero
& mask
) == 0 && !side_effects_p (x
))
8642 /* If X is a CONST_INT, return a new one. Do this here since the
8643 test below will fail. */
8644 if (CONST_INT_P (x
))
8646 if (SCALAR_INT_MODE_P (mode
))
8647 return gen_int_mode (INTVAL (x
) & mask
, mode
);
8650 x
= GEN_INT (INTVAL (x
) & mask
);
8651 return gen_lowpart_common (mode
, x
);
8655 /* If X is narrower than MODE and we want all the bits in X's mode, just
8656 get X in the proper mode. */
8657 if (paradoxical_subreg_p (mode
, GET_MODE (x
))
8658 && (GET_MODE_MASK (GET_MODE (x
)) & ~mask
) == 0)
8659 return gen_lowpart (mode
, x
);
8661 /* We can ignore the effect of a SUBREG if it narrows the mode or
8662 if the constant masks to zero all the bits the mode doesn't have. */
8663 if (GET_CODE (x
) == SUBREG
8664 && subreg_lowpart_p (x
)
8665 && (partial_subreg_p (x
)
8667 & GET_MODE_MASK (GET_MODE (x
))
8668 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x
)))) == 0))
8669 return force_to_mode (SUBREG_REG (x
), mode
, mask
, next_select
);
8671 scalar_int_mode int_mode
, xmode
;
8672 if (is_a
<scalar_int_mode
> (mode
, &int_mode
)
8673 && is_a
<scalar_int_mode
> (GET_MODE (x
), &xmode
))
8674 /* OP_MODE is either MODE or XMODE, so it must be a scalar
8676 return force_int_to_mode (x
, int_mode
, xmode
,
8677 as_a
<scalar_int_mode
> (op_mode
),
8680 return gen_lowpart_or_truncate (mode
, x
);
8683 /* Subroutine of force_to_mode that handles cases in which both X and
8684 the result are scalar integers. MODE is the mode of the result,
8685 XMODE is the mode of X, and OP_MODE says which of MODE or XMODE
8686 is preferred for simplified versions of X. The other arguments
8687 are as for force_to_mode. */
8690 force_int_to_mode (rtx x
, scalar_int_mode mode
, scalar_int_mode xmode
,
8691 scalar_int_mode op_mode
, unsigned HOST_WIDE_INT mask
,
8694 enum rtx_code code
= GET_CODE (x
);
8695 int next_select
= just_select
|| code
== XOR
|| code
== NOT
|| code
== NEG
;
8696 unsigned HOST_WIDE_INT fuller_mask
;
8699 /* When we have an arithmetic operation, or a shift whose count we
8700 do not know, we need to assume that all bits up to the highest-order
8701 bit in MASK will be needed. This is how we form such a mask. */
8702 if (mask
& (HOST_WIDE_INT_1U
<< (HOST_BITS_PER_WIDE_INT
- 1)))
8703 fuller_mask
= HOST_WIDE_INT_M1U
;
8705 fuller_mask
= ((HOST_WIDE_INT_1U
<< (floor_log2 (mask
) + 1))
8711 /* If X is a (clobber (const_int)), return it since we know we are
8712 generating something that won't match. */
8719 x
= expand_compound_operation (x
);
8720 if (GET_CODE (x
) != code
)
8721 return force_to_mode (x
, mode
, mask
, next_select
);
8725 /* Similarly for a truncate. */
8726 return force_to_mode (XEXP (x
, 0), mode
, mask
, next_select
);
8729 /* If this is an AND with a constant, convert it into an AND
8730 whose constant is the AND of that constant with MASK. If it
8731 remains an AND of MASK, delete it since it is redundant. */
8733 if (CONST_INT_P (XEXP (x
, 1)))
8735 x
= simplify_and_const_int (x
, op_mode
, XEXP (x
, 0),
8736 mask
& INTVAL (XEXP (x
, 1)));
8739 /* If X is still an AND, see if it is an AND with a mask that
8740 is just some low-order bits. If so, and it is MASK, we don't
8743 if (GET_CODE (x
) == AND
&& CONST_INT_P (XEXP (x
, 1))
8744 && (INTVAL (XEXP (x
, 1)) & GET_MODE_MASK (xmode
)) == mask
)
8747 /* If it remains an AND, try making another AND with the bits
8748 in the mode mask that aren't in MASK turned on. If the
8749 constant in the AND is wide enough, this might make a
8750 cheaper constant. */
8752 if (GET_CODE (x
) == AND
&& CONST_INT_P (XEXP (x
, 1))
8753 && GET_MODE_MASK (xmode
) != mask
8754 && HWI_COMPUTABLE_MODE_P (xmode
))
8756 unsigned HOST_WIDE_INT cval
8757 = UINTVAL (XEXP (x
, 1)) | (GET_MODE_MASK (xmode
) & ~mask
);
8760 y
= simplify_gen_binary (AND
, xmode
, XEXP (x
, 0),
8761 gen_int_mode (cval
, xmode
));
8762 if (set_src_cost (y
, xmode
, optimize_this_for_speed_p
)
8763 < set_src_cost (x
, xmode
, optimize_this_for_speed_p
))
8773 /* In (and (plus FOO C1) M), if M is a mask that just turns off
8774 low-order bits (as in an alignment operation) and FOO is already
8775 aligned to that boundary, mask C1 to that boundary as well.
8776 This may eliminate that PLUS and, later, the AND. */
8779 unsigned int width
= GET_MODE_PRECISION (mode
);
8780 unsigned HOST_WIDE_INT smask
= mask
;
8782 /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
8783 number, sign extend it. */
8785 if (width
< HOST_BITS_PER_WIDE_INT
8786 && (smask
& (HOST_WIDE_INT_1U
<< (width
- 1))) != 0)
8787 smask
|= HOST_WIDE_INT_M1U
<< width
;
8789 if (CONST_INT_P (XEXP (x
, 1))
8790 && pow2p_hwi (- smask
)
8791 && (nonzero_bits (XEXP (x
, 0), mode
) & ~smask
) == 0
8792 && (INTVAL (XEXP (x
, 1)) & ~smask
) != 0)
8793 return force_to_mode (plus_constant (xmode
, XEXP (x
, 0),
8794 (INTVAL (XEXP (x
, 1)) & smask
)),
8795 mode
, smask
, next_select
);
8801 /* Substituting into the operands of a widening MULT is not likely to
8802 create RTL matching a machine insn. */
8804 && (GET_CODE (XEXP (x
, 0)) == ZERO_EXTEND
8805 || GET_CODE (XEXP (x
, 0)) == SIGN_EXTEND
)
8806 && (GET_CODE (XEXP (x
, 1)) == ZERO_EXTEND
8807 || GET_CODE (XEXP (x
, 1)) == SIGN_EXTEND
)
8808 && REG_P (XEXP (XEXP (x
, 0), 0))
8809 && REG_P (XEXP (XEXP (x
, 1), 0)))
8810 return gen_lowpart_or_truncate (mode
, x
);
8812 /* For PLUS, MINUS and MULT, we need any bits less significant than the
8813 most significant bit in MASK since carries from those bits will
8814 affect the bits we are interested in. */
8819 /* If X is (minus C Y) where C's least set bit is larger than any bit
8820 in the mask, then we may replace with (neg Y). */
8821 if (CONST_INT_P (XEXP (x
, 0))
8822 && least_bit_hwi (UINTVAL (XEXP (x
, 0))) > mask
)
8824 x
= simplify_gen_unary (NEG
, xmode
, XEXP (x
, 1), xmode
);
8825 return force_to_mode (x
, mode
, mask
, next_select
);
8828 /* Similarly, if C contains every bit in the fuller_mask, then we may
8829 replace with (not Y). */
8830 if (CONST_INT_P (XEXP (x
, 0))
8831 && ((UINTVAL (XEXP (x
, 0)) | fuller_mask
) == UINTVAL (XEXP (x
, 0))))
8833 x
= simplify_gen_unary (NOT
, xmode
, XEXP (x
, 1), xmode
);
8834 return force_to_mode (x
, mode
, mask
, next_select
);
8842 /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
8843 LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
8844 operation which may be a bitfield extraction. Ensure that the
8845 constant we form is not wider than the mode of X. */
8847 if (GET_CODE (XEXP (x
, 0)) == LSHIFTRT
8848 && CONST_INT_P (XEXP (XEXP (x
, 0), 1))
8849 && INTVAL (XEXP (XEXP (x
, 0), 1)) >= 0
8850 && INTVAL (XEXP (XEXP (x
, 0), 1)) < HOST_BITS_PER_WIDE_INT
8851 && CONST_INT_P (XEXP (x
, 1))
8852 && ((INTVAL (XEXP (XEXP (x
, 0), 1))
8853 + floor_log2 (INTVAL (XEXP (x
, 1))))
8854 < GET_MODE_PRECISION (xmode
))
8855 && (UINTVAL (XEXP (x
, 1))
8856 & ~nonzero_bits (XEXP (x
, 0), xmode
)) == 0)
8858 temp
= gen_int_mode ((INTVAL (XEXP (x
, 1)) & mask
)
8859 << INTVAL (XEXP (XEXP (x
, 0), 1)),
8861 temp
= simplify_gen_binary (GET_CODE (x
), xmode
,
8862 XEXP (XEXP (x
, 0), 0), temp
);
8863 x
= simplify_gen_binary (LSHIFTRT
, xmode
, temp
,
8864 XEXP (XEXP (x
, 0), 1));
8865 return force_to_mode (x
, mode
, mask
, next_select
);
8869 /* For most binary operations, just propagate into the operation and
8870 change the mode if we have an operation of that mode. */
8872 op0
= force_to_mode (XEXP (x
, 0), mode
, mask
, next_select
);
8873 op1
= force_to_mode (XEXP (x
, 1), mode
, mask
, next_select
);
8875 /* If we ended up truncating both operands, truncate the result of the
8876 operation instead. */
8877 if (GET_CODE (op0
) == TRUNCATE
8878 && GET_CODE (op1
) == TRUNCATE
)
8880 op0
= XEXP (op0
, 0);
8881 op1
= XEXP (op1
, 0);
8884 op0
= gen_lowpart_or_truncate (op_mode
, op0
);
8885 op1
= gen_lowpart_or_truncate (op_mode
, op1
);
8887 if (op_mode
!= xmode
|| op0
!= XEXP (x
, 0) || op1
!= XEXP (x
, 1))
8889 x
= simplify_gen_binary (code
, op_mode
, op0
, op1
);
8895 /* For left shifts, do the same, but just for the first operand.
8896 However, we cannot do anything with shifts where we cannot
8897 guarantee that the counts are smaller than the size of the mode
8898 because such a count will have a different meaning in a
8901 if (! (CONST_INT_P (XEXP (x
, 1))
8902 && INTVAL (XEXP (x
, 1)) >= 0
8903 && INTVAL (XEXP (x
, 1)) < GET_MODE_PRECISION (mode
))
8904 && ! (GET_MODE (XEXP (x
, 1)) != VOIDmode
8905 && (nonzero_bits (XEXP (x
, 1), GET_MODE (XEXP (x
, 1)))
8906 < (unsigned HOST_WIDE_INT
) GET_MODE_PRECISION (mode
))))
8909 /* If the shift count is a constant and we can do arithmetic in
8910 the mode of the shift, refine which bits we need. Otherwise, use the
8911 conservative form of the mask. */
8912 if (CONST_INT_P (XEXP (x
, 1))
8913 && INTVAL (XEXP (x
, 1)) >= 0
8914 && INTVAL (XEXP (x
, 1)) < GET_MODE_PRECISION (op_mode
)
8915 && HWI_COMPUTABLE_MODE_P (op_mode
))
8916 mask
>>= INTVAL (XEXP (x
, 1));
8920 op0
= gen_lowpart_or_truncate (op_mode
,
8921 force_to_mode (XEXP (x
, 0), mode
,
8922 mask
, next_select
));
8924 if (op_mode
!= xmode
|| op0
!= XEXP (x
, 0))
8926 x
= simplify_gen_binary (code
, op_mode
, op0
, XEXP (x
, 1));
8932 /* Here we can only do something if the shift count is a constant,
8933 this shift constant is valid for the host, and we can do arithmetic
8936 if (CONST_INT_P (XEXP (x
, 1))
8937 && INTVAL (XEXP (x
, 1)) >= 0
8938 && INTVAL (XEXP (x
, 1)) < HOST_BITS_PER_WIDE_INT
8939 && HWI_COMPUTABLE_MODE_P (op_mode
))
8941 rtx inner
= XEXP (x
, 0);
8942 unsigned HOST_WIDE_INT inner_mask
;
8944 /* Select the mask of the bits we need for the shift operand. */
8945 inner_mask
= mask
<< INTVAL (XEXP (x
, 1));
8947 /* We can only change the mode of the shift if we can do arithmetic
8948 in the mode of the shift and INNER_MASK is no wider than the
8949 width of X's mode. */
8950 if ((inner_mask
& ~GET_MODE_MASK (xmode
)) != 0)
8953 inner
= force_to_mode (inner
, op_mode
, inner_mask
, next_select
);
8955 if (xmode
!= op_mode
|| inner
!= XEXP (x
, 0))
8957 x
= simplify_gen_binary (LSHIFTRT
, op_mode
, inner
, XEXP (x
, 1));
8962 /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
8963 shift and AND produces only copies of the sign bit (C2 is one less
8964 than a power of two), we can do this with just a shift. */
8966 if (GET_CODE (x
) == LSHIFTRT
8967 && CONST_INT_P (XEXP (x
, 1))
8968 /* The shift puts one of the sign bit copies in the least significant
8970 && ((INTVAL (XEXP (x
, 1))
8971 + num_sign_bit_copies (XEXP (x
, 0), GET_MODE (XEXP (x
, 0))))
8972 >= GET_MODE_PRECISION (xmode
))
8973 && pow2p_hwi (mask
+ 1)
8974 /* Number of bits left after the shift must be more than the mask
8976 && ((INTVAL (XEXP (x
, 1)) + exact_log2 (mask
+ 1))
8977 <= GET_MODE_PRECISION (xmode
))
8978 /* Must be more sign bit copies than the mask needs. */
8979 && ((int) num_sign_bit_copies (XEXP (x
, 0), GET_MODE (XEXP (x
, 0)))
8980 >= exact_log2 (mask
+ 1)))
8982 int nbits
= GET_MODE_PRECISION (xmode
) - exact_log2 (mask
+ 1);
8983 x
= simplify_gen_binary (LSHIFTRT
, xmode
, XEXP (x
, 0),
8984 gen_int_shift_amount (xmode
, nbits
));
8989 /* If we are just looking for the sign bit, we don't need this shift at
8990 all, even if it has a variable count. */
8991 if (val_signbit_p (xmode
, mask
))
8992 return force_to_mode (XEXP (x
, 0), mode
, mask
, next_select
);
8994 /* If this is a shift by a constant, get a mask that contains those bits
8995 that are not copies of the sign bit. We then have two cases: If
8996 MASK only includes those bits, this can be a logical shift, which may
8997 allow simplifications. If MASK is a single-bit field not within
8998 those bits, we are requesting a copy of the sign bit and hence can
8999 shift the sign bit to the appropriate location. */
9001 if (CONST_INT_P (XEXP (x
, 1)) && INTVAL (XEXP (x
, 1)) >= 0
9002 && INTVAL (XEXP (x
, 1)) < HOST_BITS_PER_WIDE_INT
)
9004 unsigned HOST_WIDE_INT nonzero
;
9007 /* If the considered data is wider than HOST_WIDE_INT, we can't
9008 represent a mask for all its bits in a single scalar.
9009 But we only care about the lower bits, so calculate these. */
9011 if (GET_MODE_PRECISION (xmode
) > HOST_BITS_PER_WIDE_INT
)
9013 nonzero
= HOST_WIDE_INT_M1U
;
9015 /* GET_MODE_PRECISION (GET_MODE (x)) - INTVAL (XEXP (x, 1))
9016 is the number of bits a full-width mask would have set.
9017 We need only shift if these are fewer than nonzero can
9018 hold. If not, we must keep all bits set in nonzero. */
9020 if (GET_MODE_PRECISION (xmode
) - INTVAL (XEXP (x
, 1))
9021 < HOST_BITS_PER_WIDE_INT
)
9022 nonzero
>>= INTVAL (XEXP (x
, 1))
9023 + HOST_BITS_PER_WIDE_INT
9024 - GET_MODE_PRECISION (xmode
);
9028 nonzero
= GET_MODE_MASK (xmode
);
9029 nonzero
>>= INTVAL (XEXP (x
, 1));
9032 if ((mask
& ~nonzero
) == 0)
9034 x
= simplify_shift_const (NULL_RTX
, LSHIFTRT
, xmode
,
9035 XEXP (x
, 0), INTVAL (XEXP (x
, 1)));
9036 if (GET_CODE (x
) != ASHIFTRT
)
9037 return force_to_mode (x
, mode
, mask
, next_select
);
9040 else if ((i
= exact_log2 (mask
)) >= 0)
9042 x
= simplify_shift_const
9043 (NULL_RTX
, LSHIFTRT
, xmode
, XEXP (x
, 0),
9044 GET_MODE_PRECISION (xmode
) - 1 - i
);
9046 if (GET_CODE (x
) != ASHIFTRT
)
9047 return force_to_mode (x
, mode
, mask
, next_select
);
9051 /* If MASK is 1, convert this to an LSHIFTRT. This can be done
9052 even if the shift count isn't a constant. */
9054 x
= simplify_gen_binary (LSHIFTRT
, xmode
, XEXP (x
, 0), XEXP (x
, 1));
9058 /* If this is a zero- or sign-extension operation that just affects bits
9059 we don't care about, remove it. Be sure the call above returned
9060 something that is still a shift. */
9062 if ((GET_CODE (x
) == LSHIFTRT
|| GET_CODE (x
) == ASHIFTRT
)
9063 && CONST_INT_P (XEXP (x
, 1))
9064 && INTVAL (XEXP (x
, 1)) >= 0
9065 && (INTVAL (XEXP (x
, 1))
9066 <= GET_MODE_PRECISION (xmode
) - (floor_log2 (mask
) + 1))
9067 && GET_CODE (XEXP (x
, 0)) == ASHIFT
9068 && XEXP (XEXP (x
, 0), 1) == XEXP (x
, 1))
9069 return force_to_mode (XEXP (XEXP (x
, 0), 0), mode
, mask
,
9076 /* If the shift count is constant and we can do computations
9077 in the mode of X, compute where the bits we care about are.
9078 Otherwise, we can't do anything. Don't change the mode of
9079 the shift or propagate MODE into the shift, though. */
9080 if (CONST_INT_P (XEXP (x
, 1))
9081 && INTVAL (XEXP (x
, 1)) >= 0)
9083 temp
= simplify_binary_operation (code
== ROTATE
? ROTATERT
: ROTATE
,
9084 xmode
, gen_int_mode (mask
, xmode
),
9086 if (temp
&& CONST_INT_P (temp
))
9087 x
= simplify_gen_binary (code
, xmode
,
9088 force_to_mode (XEXP (x
, 0), xmode
,
9089 INTVAL (temp
), next_select
),
9095 /* If we just want the low-order bit, the NEG isn't needed since it
9096 won't change the low-order bit. */
9098 return force_to_mode (XEXP (x
, 0), mode
, mask
, just_select
);
9100 /* We need any bits less significant than the most significant bit in
9101 MASK since carries from those bits will affect the bits we are
9107 /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
9108 same as the XOR case above. Ensure that the constant we form is not
9109 wider than the mode of X. */
9111 if (GET_CODE (XEXP (x
, 0)) == LSHIFTRT
9112 && CONST_INT_P (XEXP (XEXP (x
, 0), 1))
9113 && INTVAL (XEXP (XEXP (x
, 0), 1)) >= 0
9114 && (INTVAL (XEXP (XEXP (x
, 0), 1)) + floor_log2 (mask
)
9115 < GET_MODE_PRECISION (xmode
))
9116 && INTVAL (XEXP (XEXP (x
, 0), 1)) < HOST_BITS_PER_WIDE_INT
)
9118 temp
= gen_int_mode (mask
<< INTVAL (XEXP (XEXP (x
, 0), 1)), xmode
);
9119 temp
= simplify_gen_binary (XOR
, xmode
, XEXP (XEXP (x
, 0), 0), temp
);
9120 x
= simplify_gen_binary (LSHIFTRT
, xmode
,
9121 temp
, XEXP (XEXP (x
, 0), 1));
9123 return force_to_mode (x
, mode
, mask
, next_select
);
9126 /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
9127 use the full mask inside the NOT. */
9131 op0
= gen_lowpart_or_truncate (op_mode
,
9132 force_to_mode (XEXP (x
, 0), mode
, mask
,
9134 if (op_mode
!= xmode
|| op0
!= XEXP (x
, 0))
9136 x
= simplify_gen_unary (code
, op_mode
, op0
, op_mode
);
9142 /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
9143 in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
9144 which is equal to STORE_FLAG_VALUE. */
9145 if ((mask
& ~STORE_FLAG_VALUE
) == 0
9146 && XEXP (x
, 1) == const0_rtx
9147 && GET_MODE (XEXP (x
, 0)) == mode
9148 && pow2p_hwi (nonzero_bits (XEXP (x
, 0), mode
))
9149 && (nonzero_bits (XEXP (x
, 0), mode
)
9150 == (unsigned HOST_WIDE_INT
) STORE_FLAG_VALUE
))
9151 return force_to_mode (XEXP (x
, 0), mode
, mask
, next_select
);
9156 /* We have no way of knowing if the IF_THEN_ELSE can itself be
9157 written in a narrower mode. We play it safe and do not do so. */
9159 op0
= gen_lowpart_or_truncate (xmode
,
9160 force_to_mode (XEXP (x
, 1), mode
,
9161 mask
, next_select
));
9162 op1
= gen_lowpart_or_truncate (xmode
,
9163 force_to_mode (XEXP (x
, 2), mode
,
9164 mask
, next_select
));
9165 if (op0
!= XEXP (x
, 1) || op1
!= XEXP (x
, 2))
9166 x
= simplify_gen_ternary (IF_THEN_ELSE
, xmode
,
9167 GET_MODE (XEXP (x
, 0)), XEXP (x
, 0),
9175 /* Ensure we return a value of the proper mode. */
9176 return gen_lowpart_or_truncate (mode
, x
);
9179 /* Return nonzero if X is an expression that has one of two values depending on
9180 whether some other value is zero or nonzero. In that case, we return the
9181 value that is being tested, *PTRUE is set to the value if the rtx being
9182 returned has a nonzero value, and *PFALSE is set to the other alternative.
9184 If we return zero, we set *PTRUE and *PFALSE to X. */
9187 if_then_else_cond (rtx x
, rtx
*ptrue
, rtx
*pfalse
)
9189 machine_mode mode
= GET_MODE (x
);
9190 enum rtx_code code
= GET_CODE (x
);
9191 rtx cond0
, cond1
, true0
, true1
, false0
, false1
;
9192 unsigned HOST_WIDE_INT nz
;
9193 scalar_int_mode int_mode
;
9195 /* If we are comparing a value against zero, we are done. */
9196 if ((code
== NE
|| code
== EQ
)
9197 && XEXP (x
, 1) == const0_rtx
)
9199 *ptrue
= (code
== NE
) ? const_true_rtx
: const0_rtx
;
9200 *pfalse
= (code
== NE
) ? const0_rtx
: const_true_rtx
;
9204 /* If this is a unary operation whose operand has one of two values, apply
9205 our opcode to compute those values. */
9206 else if (UNARY_P (x
)
9207 && (cond0
= if_then_else_cond (XEXP (x
, 0), &true0
, &false0
)) != 0)
9209 *ptrue
= simplify_gen_unary (code
, mode
, true0
, GET_MODE (XEXP (x
, 0)));
9210 *pfalse
= simplify_gen_unary (code
, mode
, false0
,
9211 GET_MODE (XEXP (x
, 0)));
9215 /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
9216 make can't possibly match and would suppress other optimizations. */
9217 else if (code
== COMPARE
)
9220 /* If this is a binary operation, see if either side has only one of two
9221 values. If either one does or if both do and they are conditional on
9222 the same value, compute the new true and false values. */
9223 else if (BINARY_P (x
))
9225 rtx op0
= XEXP (x
, 0);
9226 rtx op1
= XEXP (x
, 1);
9227 cond0
= if_then_else_cond (op0
, &true0
, &false0
);
9228 cond1
= if_then_else_cond (op1
, &true1
, &false1
);
9230 if ((cond0
!= 0 && cond1
!= 0 && !rtx_equal_p (cond0
, cond1
))
9231 && (REG_P (op0
) || REG_P (op1
)))
9233 /* Try to enable a simplification by undoing work done by
9234 if_then_else_cond if it converted a REG into something more
9239 true0
= false0
= op0
;
9244 true1
= false1
= op1
;
9248 if ((cond0
!= 0 || cond1
!= 0)
9249 && ! (cond0
!= 0 && cond1
!= 0 && !rtx_equal_p (cond0
, cond1
)))
9251 /* If if_then_else_cond returned zero, then true/false are the
9252 same rtl. We must copy one of them to prevent invalid rtl
9255 true0
= copy_rtx (true0
);
9256 else if (cond1
== 0)
9257 true1
= copy_rtx (true1
);
9259 if (COMPARISON_P (x
))
9261 *ptrue
= simplify_gen_relational (code
, mode
, VOIDmode
,
9263 *pfalse
= simplify_gen_relational (code
, mode
, VOIDmode
,
9268 *ptrue
= simplify_gen_binary (code
, mode
, true0
, true1
);
9269 *pfalse
= simplify_gen_binary (code
, mode
, false0
, false1
);
9272 return cond0
? cond0
: cond1
;
9275 /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
9276 operands is zero when the other is nonzero, and vice-versa,
9277 and STORE_FLAG_VALUE is 1 or -1. */
9279 if ((STORE_FLAG_VALUE
== 1 || STORE_FLAG_VALUE
== -1)
9280 && (code
== PLUS
|| code
== IOR
|| code
== XOR
|| code
== MINUS
9282 && GET_CODE (XEXP (x
, 0)) == MULT
&& GET_CODE (XEXP (x
, 1)) == MULT
)
9284 rtx op0
= XEXP (XEXP (x
, 0), 1);
9285 rtx op1
= XEXP (XEXP (x
, 1), 1);
9287 cond0
= XEXP (XEXP (x
, 0), 0);
9288 cond1
= XEXP (XEXP (x
, 1), 0);
9290 if (COMPARISON_P (cond0
)
9291 && COMPARISON_P (cond1
)
9292 && ((GET_CODE (cond0
) == reversed_comparison_code (cond1
, NULL
)
9293 && rtx_equal_p (XEXP (cond0
, 0), XEXP (cond1
, 0))
9294 && rtx_equal_p (XEXP (cond0
, 1), XEXP (cond1
, 1)))
9295 || ((swap_condition (GET_CODE (cond0
))
9296 == reversed_comparison_code (cond1
, NULL
))
9297 && rtx_equal_p (XEXP (cond0
, 0), XEXP (cond1
, 1))
9298 && rtx_equal_p (XEXP (cond0
, 1), XEXP (cond1
, 0))))
9299 && ! side_effects_p (x
))
9301 *ptrue
= simplify_gen_binary (MULT
, mode
, op0
, const_true_rtx
);
9302 *pfalse
= simplify_gen_binary (MULT
, mode
,
9304 ? simplify_gen_unary (NEG
, mode
,
9312 /* Similarly for MULT, AND and UMIN, except that for these the result
9314 if ((STORE_FLAG_VALUE
== 1 || STORE_FLAG_VALUE
== -1)
9315 && (code
== MULT
|| code
== AND
|| code
== UMIN
)
9316 && GET_CODE (XEXP (x
, 0)) == MULT
&& GET_CODE (XEXP (x
, 1)) == MULT
)
9318 cond0
= XEXP (XEXP (x
, 0), 0);
9319 cond1
= XEXP (XEXP (x
, 1), 0);
9321 if (COMPARISON_P (cond0
)
9322 && COMPARISON_P (cond1
)
9323 && ((GET_CODE (cond0
) == reversed_comparison_code (cond1
, NULL
)
9324 && rtx_equal_p (XEXP (cond0
, 0), XEXP (cond1
, 0))
9325 && rtx_equal_p (XEXP (cond0
, 1), XEXP (cond1
, 1)))
9326 || ((swap_condition (GET_CODE (cond0
))
9327 == reversed_comparison_code (cond1
, NULL
))
9328 && rtx_equal_p (XEXP (cond0
, 0), XEXP (cond1
, 1))
9329 && rtx_equal_p (XEXP (cond0
, 1), XEXP (cond1
, 0))))
9330 && ! side_effects_p (x
))
9332 *ptrue
= *pfalse
= const0_rtx
;
9338 else if (code
== IF_THEN_ELSE
)
9340 /* If we have IF_THEN_ELSE already, extract the condition and
9341 canonicalize it if it is NE or EQ. */
9342 cond0
= XEXP (x
, 0);
9343 *ptrue
= XEXP (x
, 1), *pfalse
= XEXP (x
, 2);
9344 if (GET_CODE (cond0
) == NE
&& XEXP (cond0
, 1) == const0_rtx
)
9345 return XEXP (cond0
, 0);
9346 else if (GET_CODE (cond0
) == EQ
&& XEXP (cond0
, 1) == const0_rtx
)
9348 *ptrue
= XEXP (x
, 2), *pfalse
= XEXP (x
, 1);
9349 return XEXP (cond0
, 0);
9355 /* If X is a SUBREG, we can narrow both the true and false values
9356 if the inner expression, if there is a condition. */
9357 else if (code
== SUBREG
9358 && (cond0
= if_then_else_cond (SUBREG_REG (x
), &true0
,
9361 true0
= simplify_gen_subreg (mode
, true0
,
9362 GET_MODE (SUBREG_REG (x
)), SUBREG_BYTE (x
));
9363 false0
= simplify_gen_subreg (mode
, false0
,
9364 GET_MODE (SUBREG_REG (x
)), SUBREG_BYTE (x
));
9365 if (true0
&& false0
)
9373 /* If X is a constant, this isn't special and will cause confusions
9374 if we treat it as such. Likewise if it is equivalent to a constant. */
9375 else if (CONSTANT_P (x
)
9376 || ((cond0
= get_last_value (x
)) != 0 && CONSTANT_P (cond0
)))
9379 /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
9380 will be least confusing to the rest of the compiler. */
9381 else if (mode
== BImode
)
9383 *ptrue
= GEN_INT (STORE_FLAG_VALUE
), *pfalse
= const0_rtx
;
9387 /* If X is known to be either 0 or -1, those are the true and
9388 false values when testing X. */
9389 else if (x
== constm1_rtx
|| x
== const0_rtx
9390 || (is_a
<scalar_int_mode
> (mode
, &int_mode
)
9391 && (num_sign_bit_copies (x
, int_mode
)
9392 == GET_MODE_PRECISION (int_mode
))))
9394 *ptrue
= constm1_rtx
, *pfalse
= const0_rtx
;
9398 /* Likewise for 0 or a single bit. */
9399 else if (HWI_COMPUTABLE_MODE_P (mode
)
9400 && pow2p_hwi (nz
= nonzero_bits (x
, mode
)))
9402 *ptrue
= gen_int_mode (nz
, mode
), *pfalse
= const0_rtx
;
9406 /* Otherwise fail; show no condition with true and false values the same. */
9407 *ptrue
= *pfalse
= x
;
9411 /* Return the value of expression X given the fact that condition COND
9412 is known to be true when applied to REG as its first operand and VAL
9413 as its second. X is known to not be shared and so can be modified in
9416 We only handle the simplest cases, and specifically those cases that
9417 arise with IF_THEN_ELSE expressions. */
9420 known_cond (rtx x
, enum rtx_code cond
, rtx reg
, rtx val
)
9422 enum rtx_code code
= GET_CODE (x
);
9426 if (side_effects_p (x
))
9429 /* If either operand of the condition is a floating point value,
9430 then we have to avoid collapsing an EQ comparison. */
9432 && rtx_equal_p (x
, reg
)
9433 && ! FLOAT_MODE_P (GET_MODE (x
))
9434 && ! FLOAT_MODE_P (GET_MODE (val
)))
9437 if (cond
== UNEQ
&& rtx_equal_p (x
, reg
))
9440 /* If X is (abs REG) and we know something about REG's relationship
9441 with zero, we may be able to simplify this. */
9443 if (code
== ABS
&& rtx_equal_p (XEXP (x
, 0), reg
) && val
== const0_rtx
)
9446 case GE
: case GT
: case EQ
:
9449 return simplify_gen_unary (NEG
, GET_MODE (XEXP (x
, 0)),
9451 GET_MODE (XEXP (x
, 0)));
9456 /* The only other cases we handle are MIN, MAX, and comparisons if the
9457 operands are the same as REG and VAL. */
9459 else if (COMPARISON_P (x
) || COMMUTATIVE_ARITH_P (x
))
9461 if (rtx_equal_p (XEXP (x
, 0), val
))
9463 std::swap (val
, reg
);
9464 cond
= swap_condition (cond
);
9467 if (rtx_equal_p (XEXP (x
, 0), reg
) && rtx_equal_p (XEXP (x
, 1), val
))
9469 if (COMPARISON_P (x
))
9471 if (comparison_dominates_p (cond
, code
))
9472 return const_true_rtx
;
9474 code
= reversed_comparison_code (x
, NULL
);
9476 && comparison_dominates_p (cond
, code
))
9481 else if (code
== SMAX
|| code
== SMIN
9482 || code
== UMIN
|| code
== UMAX
)
9484 int unsignedp
= (code
== UMIN
|| code
== UMAX
);
9486 /* Do not reverse the condition when it is NE or EQ.
9487 This is because we cannot conclude anything about
9488 the value of 'SMAX (x, y)' when x is not equal to y,
9489 but we can when x equals y. */
9490 if ((code
== SMAX
|| code
== UMAX
)
9491 && ! (cond
== EQ
|| cond
== NE
))
9492 cond
= reverse_condition (cond
);
9497 return unsignedp
? x
: XEXP (x
, 1);
9499 return unsignedp
? x
: XEXP (x
, 0);
9501 return unsignedp
? XEXP (x
, 1) : x
;
9503 return unsignedp
? XEXP (x
, 0) : x
;
9510 else if (code
== SUBREG
)
9512 machine_mode inner_mode
= GET_MODE (SUBREG_REG (x
));
9513 rtx new_rtx
, r
= known_cond (SUBREG_REG (x
), cond
, reg
, val
);
9515 if (SUBREG_REG (x
) != r
)
9517 /* We must simplify subreg here, before we lose track of the
9518 original inner_mode. */
9519 new_rtx
= simplify_subreg (GET_MODE (x
), r
,
9520 inner_mode
, SUBREG_BYTE (x
));
9524 SUBST (SUBREG_REG (x
), r
);
9529 /* We don't have to handle SIGN_EXTEND here, because even in the
9530 case of replacing something with a modeless CONST_INT, a
9531 CONST_INT is already (supposed to be) a valid sign extension for
9532 its narrower mode, which implies it's already properly
9533 sign-extended for the wider mode. Now, for ZERO_EXTEND, the
9534 story is different. */
9535 else if (code
== ZERO_EXTEND
)
9537 machine_mode inner_mode
= GET_MODE (XEXP (x
, 0));
9538 rtx new_rtx
, r
= known_cond (XEXP (x
, 0), cond
, reg
, val
);
9540 if (XEXP (x
, 0) != r
)
9542 /* We must simplify the zero_extend here, before we lose
9543 track of the original inner_mode. */
9544 new_rtx
= simplify_unary_operation (ZERO_EXTEND
, GET_MODE (x
),
9549 SUBST (XEXP (x
, 0), r
);
9555 fmt
= GET_RTX_FORMAT (code
);
9556 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
9559 SUBST (XEXP (x
, i
), known_cond (XEXP (x
, i
), cond
, reg
, val
));
9560 else if (fmt
[i
] == 'E')
9561 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
9562 SUBST (XVECEXP (x
, i
, j
), known_cond (XVECEXP (x
, i
, j
),
9569 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
9570 assignment as a field assignment. */
9573 rtx_equal_for_field_assignment_p (rtx x
, rtx y
, bool widen_x
)
9575 if (widen_x
&& GET_MODE (x
) != GET_MODE (y
))
9577 if (paradoxical_subreg_p (GET_MODE (x
), GET_MODE (y
)))
9579 if (BYTES_BIG_ENDIAN
!= WORDS_BIG_ENDIAN
)
9581 x
= adjust_address_nv (x
, GET_MODE (y
),
9582 byte_lowpart_offset (GET_MODE (y
),
9586 if (x
== y
|| rtx_equal_p (x
, y
))
9589 if (x
== 0 || y
== 0 || GET_MODE (x
) != GET_MODE (y
))
9592 /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
9593 Note that all SUBREGs of MEM are paradoxical; otherwise they
9594 would have been rewritten. */
9595 if (MEM_P (x
) && GET_CODE (y
) == SUBREG
9596 && MEM_P (SUBREG_REG (y
))
9597 && rtx_equal_p (SUBREG_REG (y
),
9598 gen_lowpart (GET_MODE (SUBREG_REG (y
)), x
)))
9601 if (MEM_P (y
) && GET_CODE (x
) == SUBREG
9602 && MEM_P (SUBREG_REG (x
))
9603 && rtx_equal_p (SUBREG_REG (x
),
9604 gen_lowpart (GET_MODE (SUBREG_REG (x
)), y
)))
9607 /* We used to see if get_last_value of X and Y were the same but that's
9608 not correct. In one direction, we'll cause the assignment to have
9609 the wrong destination and in the case, we'll import a register into this
9610 insn that might have already have been dead. So fail if none of the
9611 above cases are true. */
9615 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
9616 Return that assignment if so.
9618 We only handle the most common cases. */
9621 make_field_assignment (rtx x
)
9623 rtx dest
= SET_DEST (x
);
9624 rtx src
= SET_SRC (x
);
9629 unsigned HOST_WIDE_INT len
;
9632 /* All the rules in this function are specific to scalar integers. */
9633 scalar_int_mode mode
;
9634 if (!is_a
<scalar_int_mode
> (GET_MODE (dest
), &mode
))
9637 /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
9638 a clear of a one-bit field. We will have changed it to
9639 (and (rotate (const_int -2) POS) DEST), so check for that. Also check
9642 if (GET_CODE (src
) == AND
&& GET_CODE (XEXP (src
, 0)) == ROTATE
9643 && CONST_INT_P (XEXP (XEXP (src
, 0), 0))
9644 && INTVAL (XEXP (XEXP (src
, 0), 0)) == -2
9645 && rtx_equal_for_field_assignment_p (dest
, XEXP (src
, 1)))
9647 assign
= make_extraction (VOIDmode
, dest
, 0, XEXP (XEXP (src
, 0), 1),
9650 return gen_rtx_SET (assign
, const0_rtx
);
9654 if (GET_CODE (src
) == AND
&& GET_CODE (XEXP (src
, 0)) == SUBREG
9655 && subreg_lowpart_p (XEXP (src
, 0))
9656 && partial_subreg_p (XEXP (src
, 0))
9657 && GET_CODE (SUBREG_REG (XEXP (src
, 0))) == ROTATE
9658 && CONST_INT_P (XEXP (SUBREG_REG (XEXP (src
, 0)), 0))
9659 && INTVAL (XEXP (SUBREG_REG (XEXP (src
, 0)), 0)) == -2
9660 && rtx_equal_for_field_assignment_p (dest
, XEXP (src
, 1)))
9662 assign
= make_extraction (VOIDmode
, dest
, 0,
9663 XEXP (SUBREG_REG (XEXP (src
, 0)), 1),
9666 return gen_rtx_SET (assign
, const0_rtx
);
9670 /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
9672 if (GET_CODE (src
) == IOR
&& GET_CODE (XEXP (src
, 0)) == ASHIFT
9673 && XEXP (XEXP (src
, 0), 0) == const1_rtx
9674 && rtx_equal_for_field_assignment_p (dest
, XEXP (src
, 1)))
9676 assign
= make_extraction (VOIDmode
, dest
, 0, XEXP (XEXP (src
, 0), 1),
9679 return gen_rtx_SET (assign
, const1_rtx
);
9683 /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
9684 SRC is an AND with all bits of that field set, then we can discard
9686 if (GET_CODE (dest
) == ZERO_EXTRACT
9687 && CONST_INT_P (XEXP (dest
, 1))
9688 && GET_CODE (src
) == AND
9689 && CONST_INT_P (XEXP (src
, 1)))
9691 HOST_WIDE_INT width
= INTVAL (XEXP (dest
, 1));
9692 unsigned HOST_WIDE_INT and_mask
= INTVAL (XEXP (src
, 1));
9693 unsigned HOST_WIDE_INT ze_mask
;
9695 if (width
>= HOST_BITS_PER_WIDE_INT
)
9698 ze_mask
= ((unsigned HOST_WIDE_INT
)1 << width
) - 1;
9700 /* Complete overlap. We can remove the source AND. */
9701 if ((and_mask
& ze_mask
) == ze_mask
)
9702 return gen_rtx_SET (dest
, XEXP (src
, 0));
9704 /* Partial overlap. We can reduce the source AND. */
9705 if ((and_mask
& ze_mask
) != and_mask
)
9707 src
= gen_rtx_AND (mode
, XEXP (src
, 0),
9708 gen_int_mode (and_mask
& ze_mask
, mode
));
9709 return gen_rtx_SET (dest
, src
);
9713 /* The other case we handle is assignments into a constant-position
9714 field. They look like (ior/xor (and DEST C1) OTHER). If C1 represents
9715 a mask that has all one bits except for a group of zero bits and
9716 OTHER is known to have zeros where C1 has ones, this is such an
9717 assignment. Compute the position and length from C1. Shift OTHER
9718 to the appropriate position, force it to the required mode, and
9719 make the extraction. Check for the AND in both operands. */
9721 /* One or more SUBREGs might obscure the constant-position field
9722 assignment. The first one we are likely to encounter is an outer
9723 narrowing SUBREG, which we can just strip for the purposes of
9724 identifying the constant-field assignment. */
9725 scalar_int_mode src_mode
= mode
;
9726 if (GET_CODE (src
) == SUBREG
9727 && subreg_lowpart_p (src
)
9728 && is_a
<scalar_int_mode
> (GET_MODE (SUBREG_REG (src
)), &src_mode
))
9729 src
= SUBREG_REG (src
);
9731 if (GET_CODE (src
) != IOR
&& GET_CODE (src
) != XOR
)
9734 rhs
= expand_compound_operation (XEXP (src
, 0));
9735 lhs
= expand_compound_operation (XEXP (src
, 1));
9737 if (GET_CODE (rhs
) == AND
9738 && CONST_INT_P (XEXP (rhs
, 1))
9739 && rtx_equal_for_field_assignment_p (XEXP (rhs
, 0), dest
))
9740 c1
= INTVAL (XEXP (rhs
, 1)), other
= lhs
;
9741 /* The second SUBREG that might get in the way is a paradoxical
9742 SUBREG around the first operand of the AND. We want to
9743 pretend the operand is as wide as the destination here. We
9744 do this by adjusting the MEM to wider mode for the sole
9745 purpose of the call to rtx_equal_for_field_assignment_p. Also
9746 note this trick only works for MEMs. */
9747 else if (GET_CODE (rhs
) == AND
9748 && paradoxical_subreg_p (XEXP (rhs
, 0))
9749 && MEM_P (SUBREG_REG (XEXP (rhs
, 0)))
9750 && CONST_INT_P (XEXP (rhs
, 1))
9751 && rtx_equal_for_field_assignment_p (SUBREG_REG (XEXP (rhs
, 0)),
9753 c1
= INTVAL (XEXP (rhs
, 1)), other
= lhs
;
9754 else if (GET_CODE (lhs
) == AND
9755 && CONST_INT_P (XEXP (lhs
, 1))
9756 && rtx_equal_for_field_assignment_p (XEXP (lhs
, 0), dest
))
9757 c1
= INTVAL (XEXP (lhs
, 1)), other
= rhs
;
9758 /* The second SUBREG that might get in the way is a paradoxical
9759 SUBREG around the first operand of the AND. We want to
9760 pretend the operand is as wide as the destination here. We
9761 do this by adjusting the MEM to wider mode for the sole
9762 purpose of the call to rtx_equal_for_field_assignment_p. Also
9763 note this trick only works for MEMs. */
9764 else if (GET_CODE (lhs
) == AND
9765 && paradoxical_subreg_p (XEXP (lhs
, 0))
9766 && MEM_P (SUBREG_REG (XEXP (lhs
, 0)))
9767 && CONST_INT_P (XEXP (lhs
, 1))
9768 && rtx_equal_for_field_assignment_p (SUBREG_REG (XEXP (lhs
, 0)),
9770 c1
= INTVAL (XEXP (lhs
, 1)), other
= rhs
;
9774 pos
= get_pos_from_mask ((~c1
) & GET_MODE_MASK (mode
), &len
);
9776 || pos
+ len
> GET_MODE_PRECISION (mode
)
9777 || GET_MODE_PRECISION (mode
) > HOST_BITS_PER_WIDE_INT
9778 || (c1
& nonzero_bits (other
, mode
)) != 0)
9781 assign
= make_extraction (VOIDmode
, dest
, pos
, NULL_RTX
, len
, 1, 1, 0);
9785 /* The mode to use for the source is the mode of the assignment, or of
9786 what is inside a possible STRICT_LOW_PART. */
9787 machine_mode new_mode
= (GET_CODE (assign
) == STRICT_LOW_PART
9788 ? GET_MODE (XEXP (assign
, 0)) : GET_MODE (assign
));
9790 /* Shift OTHER right POS places and make it the source, restricting it
9791 to the proper length and mode. */
9793 src
= canon_reg_for_combine (simplify_shift_const (NULL_RTX
, LSHIFTRT
,
9794 src_mode
, other
, pos
),
9796 src
= force_to_mode (src
, new_mode
,
9797 len
>= HOST_BITS_PER_WIDE_INT
9799 : (HOST_WIDE_INT_1U
<< len
) - 1,
9802 /* If SRC is masked by an AND that does not make a difference in
9803 the value being stored, strip it. */
9804 if (GET_CODE (assign
) == ZERO_EXTRACT
9805 && CONST_INT_P (XEXP (assign
, 1))
9806 && INTVAL (XEXP (assign
, 1)) < HOST_BITS_PER_WIDE_INT
9807 && GET_CODE (src
) == AND
9808 && CONST_INT_P (XEXP (src
, 1))
9809 && UINTVAL (XEXP (src
, 1))
9810 == (HOST_WIDE_INT_1U
<< INTVAL (XEXP (assign
, 1))) - 1)
9811 src
= XEXP (src
, 0);
9813 return gen_rtx_SET (assign
, src
);
9816 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
9820 apply_distributive_law (rtx x
)
9822 enum rtx_code code
= GET_CODE (x
);
9823 enum rtx_code inner_code
;
9824 rtx lhs
, rhs
, other
;
9827 /* Distributivity is not true for floating point as it can change the
9828 value. So we don't do it unless -funsafe-math-optimizations. */
9829 if (FLOAT_MODE_P (GET_MODE (x
))
9830 && ! flag_unsafe_math_optimizations
)
9833 /* The outer operation can only be one of the following: */
9834 if (code
!= IOR
&& code
!= AND
&& code
!= XOR
9835 && code
!= PLUS
&& code
!= MINUS
)
9841 /* If either operand is a primitive we can't do anything, so get out
9843 if (OBJECT_P (lhs
) || OBJECT_P (rhs
))
9846 lhs
= expand_compound_operation (lhs
);
9847 rhs
= expand_compound_operation (rhs
);
9848 inner_code
= GET_CODE (lhs
);
9849 if (inner_code
!= GET_CODE (rhs
))
9852 /* See if the inner and outer operations distribute. */
9859 /* These all distribute except over PLUS. */
9860 if (code
== PLUS
|| code
== MINUS
)
9865 if (code
!= PLUS
&& code
!= MINUS
)
9870 /* This is also a multiply, so it distributes over everything. */
9873 /* This used to handle SUBREG, but this turned out to be counter-
9874 productive, since (subreg (op ...)) usually is not handled by
9875 insn patterns, and this "optimization" therefore transformed
9876 recognizable patterns into unrecognizable ones. Therefore the
9877 SUBREG case was removed from here.
9879 It is possible that distributing SUBREG over arithmetic operations
9880 leads to an intermediate result than can then be optimized further,
9881 e.g. by moving the outer SUBREG to the other side of a SET as done
9882 in simplify_set. This seems to have been the original intent of
9883 handling SUBREGs here.
9885 However, with current GCC this does not appear to actually happen,
9886 at least on major platforms. If some case is found where removing
9887 the SUBREG case here prevents follow-on optimizations, distributing
9888 SUBREGs ought to be re-added at that place, e.g. in simplify_set. */
9894 /* Set LHS and RHS to the inner operands (A and B in the example
9895 above) and set OTHER to the common operand (C in the example).
9896 There is only one way to do this unless the inner operation is
9898 if (COMMUTATIVE_ARITH_P (lhs
)
9899 && rtx_equal_p (XEXP (lhs
, 0), XEXP (rhs
, 0)))
9900 other
= XEXP (lhs
, 0), lhs
= XEXP (lhs
, 1), rhs
= XEXP (rhs
, 1);
9901 else if (COMMUTATIVE_ARITH_P (lhs
)
9902 && rtx_equal_p (XEXP (lhs
, 0), XEXP (rhs
, 1)))
9903 other
= XEXP (lhs
, 0), lhs
= XEXP (lhs
, 1), rhs
= XEXP (rhs
, 0);
9904 else if (COMMUTATIVE_ARITH_P (lhs
)
9905 && rtx_equal_p (XEXP (lhs
, 1), XEXP (rhs
, 0)))
9906 other
= XEXP (lhs
, 1), lhs
= XEXP (lhs
, 0), rhs
= XEXP (rhs
, 1);
9907 else if (rtx_equal_p (XEXP (lhs
, 1), XEXP (rhs
, 1)))
9908 other
= XEXP (lhs
, 1), lhs
= XEXP (lhs
, 0), rhs
= XEXP (rhs
, 0);
9912 /* Form the new inner operation, seeing if it simplifies first. */
9913 tem
= simplify_gen_binary (code
, GET_MODE (x
), lhs
, rhs
);
9915 /* There is one exception to the general way of distributing:
9916 (a | c) ^ (b | c) -> (a ^ b) & ~c */
9917 if (code
== XOR
&& inner_code
== IOR
)
9920 other
= simplify_gen_unary (NOT
, GET_MODE (x
), other
, GET_MODE (x
));
9923 /* We may be able to continuing distributing the result, so call
9924 ourselves recursively on the inner operation before forming the
9925 outer operation, which we return. */
9926 return simplify_gen_binary (inner_code
, GET_MODE (x
),
9927 apply_distributive_law (tem
), other
);
9930 /* See if X is of the form (* (+ A B) C), and if so convert to
9931 (+ (* A C) (* B C)) and try to simplify.
9933 Most of the time, this results in no change. However, if some of
9934 the operands are the same or inverses of each other, simplifications
9937 For example, (and (ior A B) (not B)) can occur as the result of
9938 expanding a bit field assignment. When we apply the distributive
9939 law to this, we get (ior (and (A (not B))) (and (B (not B)))),
9940 which then simplifies to (and (A (not B))).
9942 Note that no checks happen on the validity of applying the inverse
9943 distributive law. This is pointless since we can do it in the
9944 few places where this routine is called.
9946 N is the index of the term that is decomposed (the arithmetic operation,
9947 i.e. (+ A B) in the first example above). !N is the index of the term that
9948 is distributed, i.e. of C in the first example above. */
9950 distribute_and_simplify_rtx (rtx x
, int n
)
9953 enum rtx_code outer_code
, inner_code
;
9954 rtx decomposed
, distributed
, inner_op0
, inner_op1
, new_op0
, new_op1
, tmp
;
9956 /* Distributivity is not true for floating point as it can change the
9957 value. So we don't do it unless -funsafe-math-optimizations. */
9958 if (FLOAT_MODE_P (GET_MODE (x
))
9959 && ! flag_unsafe_math_optimizations
)
9962 decomposed
= XEXP (x
, n
);
9963 if (!ARITHMETIC_P (decomposed
))
9966 mode
= GET_MODE (x
);
9967 outer_code
= GET_CODE (x
);
9968 distributed
= XEXP (x
, !n
);
9970 inner_code
= GET_CODE (decomposed
);
9971 inner_op0
= XEXP (decomposed
, 0);
9972 inner_op1
= XEXP (decomposed
, 1);
9974 /* Special case (and (xor B C) (not A)), which is equivalent to
9975 (xor (ior A B) (ior A C)) */
9976 if (outer_code
== AND
&& inner_code
== XOR
&& GET_CODE (distributed
) == NOT
)
9978 distributed
= XEXP (distributed
, 0);
9984 /* Distribute the second term. */
9985 new_op0
= simplify_gen_binary (outer_code
, mode
, inner_op0
, distributed
);
9986 new_op1
= simplify_gen_binary (outer_code
, mode
, inner_op1
, distributed
);
9990 /* Distribute the first term. */
9991 new_op0
= simplify_gen_binary (outer_code
, mode
, distributed
, inner_op0
);
9992 new_op1
= simplify_gen_binary (outer_code
, mode
, distributed
, inner_op1
);
9995 tmp
= apply_distributive_law (simplify_gen_binary (inner_code
, mode
,
9997 if (GET_CODE (tmp
) != outer_code
9998 && (set_src_cost (tmp
, mode
, optimize_this_for_speed_p
)
9999 < set_src_cost (x
, mode
, optimize_this_for_speed_p
)))
10005 /* Simplify a logical `and' of VAROP with the constant CONSTOP, to be done
10006 in MODE. Return an equivalent form, if different from (and VAROP
10007 (const_int CONSTOP)). Otherwise, return NULL_RTX. */
10010 simplify_and_const_int_1 (scalar_int_mode mode
, rtx varop
,
10011 unsigned HOST_WIDE_INT constop
)
10013 unsigned HOST_WIDE_INT nonzero
;
10014 unsigned HOST_WIDE_INT orig_constop
;
10018 orig_varop
= varop
;
10019 orig_constop
= constop
;
10020 if (GET_CODE (varop
) == CLOBBER
)
10023 /* Simplify VAROP knowing that we will be only looking at some of the
10026 Note by passing in CONSTOP, we guarantee that the bits not set in
10027 CONSTOP are not significant and will never be examined. We must
10028 ensure that is the case by explicitly masking out those bits
10029 before returning. */
10030 varop
= force_to_mode (varop
, mode
, constop
, 0);
10032 /* If VAROP is a CLOBBER, we will fail so return it. */
10033 if (GET_CODE (varop
) == CLOBBER
)
10036 /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
10037 to VAROP and return the new constant. */
10038 if (CONST_INT_P (varop
))
10039 return gen_int_mode (INTVAL (varop
) & constop
, mode
);
10041 /* See what bits may be nonzero in VAROP. Unlike the general case of
10042 a call to nonzero_bits, here we don't care about bits outside
10045 nonzero
= nonzero_bits (varop
, mode
) & GET_MODE_MASK (mode
);
10047 /* Turn off all bits in the constant that are known to already be zero.
10048 Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
10049 which is tested below. */
10051 constop
&= nonzero
;
10053 /* If we don't have any bits left, return zero. */
10057 /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
10058 a power of two, we can replace this with an ASHIFT. */
10059 if (GET_CODE (varop
) == NEG
&& nonzero_bits (XEXP (varop
, 0), mode
) == 1
10060 && (i
= exact_log2 (constop
)) >= 0)
10061 return simplify_shift_const (NULL_RTX
, ASHIFT
, mode
, XEXP (varop
, 0), i
);
10063 /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
10064 or XOR, then try to apply the distributive law. This may eliminate
10065 operations if either branch can be simplified because of the AND.
10066 It may also make some cases more complex, but those cases probably
10067 won't match a pattern either with or without this. */
10069 if (GET_CODE (varop
) == IOR
|| GET_CODE (varop
) == XOR
)
10071 scalar_int_mode varop_mode
= as_a
<scalar_int_mode
> (GET_MODE (varop
));
10075 apply_distributive_law
10076 (simplify_gen_binary (GET_CODE (varop
), varop_mode
,
10077 simplify_and_const_int (NULL_RTX
, varop_mode
,
10080 simplify_and_const_int (NULL_RTX
, varop_mode
,
10085 /* If VAROP is PLUS, and the constant is a mask of low bits, distribute
10086 the AND and see if one of the operands simplifies to zero. If so, we
10087 may eliminate it. */
10089 if (GET_CODE (varop
) == PLUS
10090 && pow2p_hwi (constop
+ 1))
10094 o0
= simplify_and_const_int (NULL_RTX
, mode
, XEXP (varop
, 0), constop
);
10095 o1
= simplify_and_const_int (NULL_RTX
, mode
, XEXP (varop
, 1), constop
);
10096 if (o0
== const0_rtx
)
10098 if (o1
== const0_rtx
)
10102 /* Make a SUBREG if necessary. If we can't make it, fail. */
10103 varop
= gen_lowpart (mode
, varop
);
10104 if (varop
== NULL_RTX
|| GET_CODE (varop
) == CLOBBER
)
10107 /* If we are only masking insignificant bits, return VAROP. */
10108 if (constop
== nonzero
)
10111 if (varop
== orig_varop
&& constop
== orig_constop
)
10114 /* Otherwise, return an AND. */
10115 return simplify_gen_binary (AND
, mode
, varop
, gen_int_mode (constop
, mode
));
10119 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
10122 Return an equivalent form, if different from X. Otherwise, return X. If
10123 X is zero, we are to always construct the equivalent form. */
10126 simplify_and_const_int (rtx x
, scalar_int_mode mode
, rtx varop
,
10127 unsigned HOST_WIDE_INT constop
)
10129 rtx tem
= simplify_and_const_int_1 (mode
, varop
, constop
);
10134 x
= simplify_gen_binary (AND
, GET_MODE (varop
), varop
,
10135 gen_int_mode (constop
, mode
));
10136 if (GET_MODE (x
) != mode
)
10137 x
= gen_lowpart (mode
, x
);
10141 /* Given a REG X of mode XMODE, compute which bits in X can be nonzero.
10142 We don't care about bits outside of those defined in MODE.
10144 For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
10145 a shift, AND, or zero_extract, we can do better. */
10148 reg_nonzero_bits_for_combine (const_rtx x
, scalar_int_mode xmode
,
10149 scalar_int_mode mode
,
10150 unsigned HOST_WIDE_INT
*nonzero
)
10153 reg_stat_type
*rsp
;
10155 /* If X is a register whose nonzero bits value is current, use it.
10156 Otherwise, if X is a register whose value we can find, use that
10157 value. Otherwise, use the previously-computed global nonzero bits
10158 for this register. */
10160 rsp
= ®_stat
[REGNO (x
)];
10161 if (rsp
->last_set_value
!= 0
10162 && (rsp
->last_set_mode
== mode
10163 || (GET_MODE_CLASS (rsp
->last_set_mode
) == MODE_INT
10164 && GET_MODE_CLASS (mode
) == MODE_INT
))
10165 && ((rsp
->last_set_label
>= label_tick_ebb_start
10166 && rsp
->last_set_label
< label_tick
)
10167 || (rsp
->last_set_label
== label_tick
10168 && DF_INSN_LUID (rsp
->last_set
) < subst_low_luid
)
10169 || (REGNO (x
) >= FIRST_PSEUDO_REGISTER
10170 && REGNO (x
) < reg_n_sets_max
10171 && REG_N_SETS (REGNO (x
)) == 1
10172 && !REGNO_REG_SET_P
10173 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->next_bb
),
10176 /* Note that, even if the precision of last_set_mode is lower than that
10177 of mode, record_value_for_reg invoked nonzero_bits on the register
10178 with nonzero_bits_mode (because last_set_mode is necessarily integral
10179 and HWI_COMPUTABLE_MODE_P in this case) so bits in nonzero_bits_mode
10180 are all valid, hence in mode too since nonzero_bits_mode is defined
10181 to the largest HWI_COMPUTABLE_MODE_P mode. */
10182 *nonzero
&= rsp
->last_set_nonzero_bits
;
10186 tem
= get_last_value (x
);
10189 if (SHORT_IMMEDIATES_SIGN_EXTEND
)
10190 tem
= sign_extend_short_imm (tem
, xmode
, GET_MODE_PRECISION (mode
));
10195 if (nonzero_sign_valid
&& rsp
->nonzero_bits
)
10197 unsigned HOST_WIDE_INT mask
= rsp
->nonzero_bits
;
10199 if (GET_MODE_PRECISION (xmode
) < GET_MODE_PRECISION (mode
))
10200 /* We don't know anything about the upper bits. */
10201 mask
|= GET_MODE_MASK (mode
) ^ GET_MODE_MASK (xmode
);
10209 /* Given a reg X of mode XMODE, return the number of bits at the high-order
10210 end of X that are known to be equal to the sign bit. X will be used
10211 in mode MODE; the returned value will always be between 1 and the
10212 number of bits in MODE. */
10215 reg_num_sign_bit_copies_for_combine (const_rtx x
, scalar_int_mode xmode
,
10216 scalar_int_mode mode
,
10217 unsigned int *result
)
10220 reg_stat_type
*rsp
;
10222 rsp
= ®_stat
[REGNO (x
)];
10223 if (rsp
->last_set_value
!= 0
10224 && rsp
->last_set_mode
== mode
10225 && ((rsp
->last_set_label
>= label_tick_ebb_start
10226 && rsp
->last_set_label
< label_tick
)
10227 || (rsp
->last_set_label
== label_tick
10228 && DF_INSN_LUID (rsp
->last_set
) < subst_low_luid
)
10229 || (REGNO (x
) >= FIRST_PSEUDO_REGISTER
10230 && REGNO (x
) < reg_n_sets_max
10231 && REG_N_SETS (REGNO (x
)) == 1
10232 && !REGNO_REG_SET_P
10233 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->next_bb
),
10236 *result
= rsp
->last_set_sign_bit_copies
;
10240 tem
= get_last_value (x
);
10244 if (nonzero_sign_valid
&& rsp
->sign_bit_copies
!= 0
10245 && GET_MODE_PRECISION (xmode
) == GET_MODE_PRECISION (mode
))
10246 *result
= rsp
->sign_bit_copies
;
10251 /* Return the number of "extended" bits there are in X, when interpreted
10252 as a quantity in MODE whose signedness is indicated by UNSIGNEDP. For
10253 unsigned quantities, this is the number of high-order zero bits.
10254 For signed quantities, this is the number of copies of the sign bit
10255 minus 1. In both case, this function returns the number of "spare"
10256 bits. For example, if two quantities for which this function returns
10257 at least 1 are added, the addition is known not to overflow.
10259 This function will always return 0 unless called during combine, which
10260 implies that it must be called from a define_split. */
10263 extended_count (const_rtx x
, machine_mode mode
, int unsignedp
)
10265 if (nonzero_sign_valid
== 0)
10268 scalar_int_mode int_mode
;
10270 ? (is_a
<scalar_int_mode
> (mode
, &int_mode
)
10271 && HWI_COMPUTABLE_MODE_P (int_mode
)
10272 ? (unsigned int) (GET_MODE_PRECISION (int_mode
) - 1
10273 - floor_log2 (nonzero_bits (x
, int_mode
)))
10275 : num_sign_bit_copies (x
, mode
) - 1);
10278 /* This function is called from `simplify_shift_const' to merge two
10279 outer operations. Specifically, we have already found that we need
10280 to perform operation *POP0 with constant *PCONST0 at the outermost
10281 position. We would now like to also perform OP1 with constant CONST1
10282 (with *POP0 being done last).
10284 Return 1 if we can do the operation and update *POP0 and *PCONST0 with
10285 the resulting operation. *PCOMP_P is set to 1 if we would need to
10286 complement the innermost operand, otherwise it is unchanged.
10288 MODE is the mode in which the operation will be done. No bits outside
10289 the width of this mode matter. It is assumed that the width of this mode
10290 is smaller than or equal to HOST_BITS_PER_WIDE_INT.
10292 If *POP0 or OP1 are UNKNOWN, it means no operation is required. Only NEG, PLUS,
10293 IOR, XOR, and AND are supported. We may set *POP0 to SET if the proper
10294 result is simply *PCONST0.
10296 If the resulting operation cannot be expressed as one operation, we
10297 return 0 and do not change *POP0, *PCONST0, and *PCOMP_P. */
10300 merge_outer_ops (enum rtx_code
*pop0
, HOST_WIDE_INT
*pconst0
, enum rtx_code op1
, HOST_WIDE_INT const1
, machine_mode mode
, int *pcomp_p
)
10302 enum rtx_code op0
= *pop0
;
10303 HOST_WIDE_INT const0
= *pconst0
;
10305 const0
&= GET_MODE_MASK (mode
);
10306 const1
&= GET_MODE_MASK (mode
);
10308 /* If OP0 is an AND, clear unimportant bits in CONST1. */
10312 /* If OP0 or OP1 is UNKNOWN, this is easy. Similarly if they are the same or
10315 if (op1
== UNKNOWN
|| op0
== SET
)
10318 else if (op0
== UNKNOWN
)
10319 op0
= op1
, const0
= const1
;
10321 else if (op0
== op1
)
10345 /* Otherwise, if either is a PLUS or NEG, we can't do anything. */
10346 else if (op0
== PLUS
|| op1
== PLUS
|| op0
== NEG
|| op1
== NEG
)
10349 /* If the two constants aren't the same, we can't do anything. The
10350 remaining six cases can all be done. */
10351 else if (const0
!= const1
)
10359 /* (a & b) | b == b */
10361 else /* op1 == XOR */
10362 /* (a ^ b) | b == a | b */
10368 /* (a & b) ^ b == (~a) & b */
10369 op0
= AND
, *pcomp_p
= 1;
10370 else /* op1 == IOR */
10371 /* (a | b) ^ b == a & ~b */
10372 op0
= AND
, const0
= ~const0
;
10377 /* (a | b) & b == b */
10379 else /* op1 == XOR */
10380 /* (a ^ b) & b) == (~a) & b */
10387 /* Check for NO-OP cases. */
10388 const0
&= GET_MODE_MASK (mode
);
10390 && (op0
== IOR
|| op0
== XOR
|| op0
== PLUS
))
10392 else if (const0
== 0 && op0
== AND
)
10394 else if ((unsigned HOST_WIDE_INT
) const0
== GET_MODE_MASK (mode
)
10400 /* ??? Slightly redundant with the above mask, but not entirely.
10401 Moving this above means we'd have to sign-extend the mode mask
10402 for the final test. */
10403 if (op0
!= UNKNOWN
&& op0
!= NEG
)
10404 *pconst0
= trunc_int_for_mode (const0
, mode
);
10409 /* A helper to simplify_shift_const_1 to determine the mode we can perform
10410 the shift in. The original shift operation CODE is performed on OP in
10411 ORIG_MODE. Return the wider mode MODE if we can perform the operation
10412 in that mode. Return ORIG_MODE otherwise. We can also assume that the
10413 result of the shift is subject to operation OUTER_CODE with operand
10416 static scalar_int_mode
10417 try_widen_shift_mode (enum rtx_code code
, rtx op
, int count
,
10418 scalar_int_mode orig_mode
, scalar_int_mode mode
,
10419 enum rtx_code outer_code
, HOST_WIDE_INT outer_const
)
10421 gcc_assert (GET_MODE_PRECISION (mode
) > GET_MODE_PRECISION (orig_mode
));
10423 /* In general we can't perform in wider mode for right shift and rotate. */
10427 /* We can still widen if the bits brought in from the left are identical
10428 to the sign bit of ORIG_MODE. */
10429 if (num_sign_bit_copies (op
, mode
)
10430 > (unsigned) (GET_MODE_PRECISION (mode
)
10431 - GET_MODE_PRECISION (orig_mode
)))
10436 /* Similarly here but with zero bits. */
10437 if (HWI_COMPUTABLE_MODE_P (mode
)
10438 && (nonzero_bits (op
, mode
) & ~GET_MODE_MASK (orig_mode
)) == 0)
10441 /* We can also widen if the bits brought in will be masked off. This
10442 operation is performed in ORIG_MODE. */
10443 if (outer_code
== AND
)
10445 int care_bits
= low_bitmask_len (orig_mode
, outer_const
);
10448 && GET_MODE_PRECISION (orig_mode
) - care_bits
>= count
)
10457 gcc_unreachable ();
10464 /* Simplify a shift of VAROP by ORIG_COUNT bits. CODE says what kind
10465 of shift. The result of the shift is RESULT_MODE. Return NULL_RTX
10466 if we cannot simplify it. Otherwise, return a simplified value.
10468 The shift is normally computed in the widest mode we find in VAROP, as
10469 long as it isn't a different number of words than RESULT_MODE. Exceptions
10470 are ASHIFTRT and ROTATE, which are always done in their original mode. */
10473 simplify_shift_const_1 (enum rtx_code code
, machine_mode result_mode
,
10474 rtx varop
, int orig_count
)
10476 enum rtx_code orig_code
= code
;
10477 rtx orig_varop
= varop
;
10479 machine_mode mode
= result_mode
;
10480 machine_mode shift_mode
;
10481 scalar_int_mode tmode
, inner_mode
, int_mode
, int_varop_mode
, int_result_mode
;
10482 /* We form (outer_op (code varop count) (outer_const)). */
10483 enum rtx_code outer_op
= UNKNOWN
;
10484 HOST_WIDE_INT outer_const
= 0;
10485 int complement_p
= 0;
10488 /* Make sure and truncate the "natural" shift on the way in. We don't
10489 want to do this inside the loop as it makes it more difficult to
10491 if (SHIFT_COUNT_TRUNCATED
)
10492 orig_count
&= GET_MODE_UNIT_BITSIZE (mode
) - 1;
10494 /* If we were given an invalid count, don't do anything except exactly
10495 what was requested. */
10497 if (orig_count
< 0 || orig_count
>= (int) GET_MODE_UNIT_PRECISION (mode
))
10500 count
= orig_count
;
10502 /* Unless one of the branches of the `if' in this loop does a `continue',
10503 we will `break' the loop after the `if'. */
10507 /* If we have an operand of (clobber (const_int 0)), fail. */
10508 if (GET_CODE (varop
) == CLOBBER
)
10511 /* Convert ROTATERT to ROTATE. */
10512 if (code
== ROTATERT
)
10514 unsigned int bitsize
= GET_MODE_UNIT_PRECISION (result_mode
);
10516 count
= bitsize
- count
;
10519 shift_mode
= result_mode
;
10520 if (shift_mode
!= mode
)
10522 /* We only change the modes of scalar shifts. */
10523 int_mode
= as_a
<scalar_int_mode
> (mode
);
10524 int_result_mode
= as_a
<scalar_int_mode
> (result_mode
);
10525 shift_mode
= try_widen_shift_mode (code
, varop
, count
,
10526 int_result_mode
, int_mode
,
10527 outer_op
, outer_const
);
10530 scalar_int_mode shift_unit_mode
10531 = as_a
<scalar_int_mode
> (GET_MODE_INNER (shift_mode
));
10533 /* Handle cases where the count is greater than the size of the mode
10534 minus 1. For ASHIFT, use the size minus one as the count (this can
10535 occur when simplifying (lshiftrt (ashiftrt ..))). For rotates,
10536 take the count modulo the size. For other shifts, the result is
10539 Since these shifts are being produced by the compiler by combining
10540 multiple operations, each of which are defined, we know what the
10541 result is supposed to be. */
10543 if (count
> (GET_MODE_PRECISION (shift_unit_mode
) - 1))
10545 if (code
== ASHIFTRT
)
10546 count
= GET_MODE_PRECISION (shift_unit_mode
) - 1;
10547 else if (code
== ROTATE
|| code
== ROTATERT
)
10548 count
%= GET_MODE_PRECISION (shift_unit_mode
);
10551 /* We can't simply return zero because there may be an
10553 varop
= const0_rtx
;
10559 /* If we discovered we had to complement VAROP, leave. Making a NOT
10560 here would cause an infinite loop. */
10564 if (shift_mode
== shift_unit_mode
)
10566 /* An arithmetic right shift of a quantity known to be -1 or 0
10568 if (code
== ASHIFTRT
10569 && (num_sign_bit_copies (varop
, shift_unit_mode
)
10570 == GET_MODE_PRECISION (shift_unit_mode
)))
10576 /* If we are doing an arithmetic right shift and discarding all but
10577 the sign bit copies, this is equivalent to doing a shift by the
10578 bitsize minus one. Convert it into that shift because it will
10579 often allow other simplifications. */
10581 if (code
== ASHIFTRT
10582 && (count
+ num_sign_bit_copies (varop
, shift_unit_mode
)
10583 >= GET_MODE_PRECISION (shift_unit_mode
)))
10584 count
= GET_MODE_PRECISION (shift_unit_mode
) - 1;
10586 /* We simplify the tests below and elsewhere by converting
10587 ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
10588 `make_compound_operation' will convert it to an ASHIFTRT for
10589 those machines (such as VAX) that don't have an LSHIFTRT. */
10590 if (code
== ASHIFTRT
10591 && HWI_COMPUTABLE_MODE_P (shift_unit_mode
)
10592 && val_signbit_known_clear_p (shift_unit_mode
,
10593 nonzero_bits (varop
,
10597 if (((code
== LSHIFTRT
10598 && HWI_COMPUTABLE_MODE_P (shift_unit_mode
)
10599 && !(nonzero_bits (varop
, shift_unit_mode
) >> count
))
10601 && HWI_COMPUTABLE_MODE_P (shift_unit_mode
)
10602 && !((nonzero_bits (varop
, shift_unit_mode
) << count
)
10603 & GET_MODE_MASK (shift_unit_mode
))))
10604 && !side_effects_p (varop
))
10605 varop
= const0_rtx
;
10608 switch (GET_CODE (varop
))
10614 new_rtx
= expand_compound_operation (varop
);
10615 if (new_rtx
!= varop
)
10623 /* The following rules apply only to scalars. */
10624 if (shift_mode
!= shift_unit_mode
)
10626 int_mode
= as_a
<scalar_int_mode
> (mode
);
10628 /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
10629 minus the width of a smaller mode, we can do this with a
10630 SIGN_EXTEND or ZERO_EXTEND from the narrower memory location. */
10631 if ((code
== ASHIFTRT
|| code
== LSHIFTRT
)
10632 && ! mode_dependent_address_p (XEXP (varop
, 0),
10633 MEM_ADDR_SPACE (varop
))
10634 && ! MEM_VOLATILE_P (varop
)
10635 && (int_mode_for_size (GET_MODE_BITSIZE (int_mode
) - count
, 1)
10638 new_rtx
= adjust_address_nv (varop
, tmode
,
10639 BYTES_BIG_ENDIAN
? 0
10640 : count
/ BITS_PER_UNIT
);
10642 varop
= gen_rtx_fmt_e (code
== ASHIFTRT
? SIGN_EXTEND
10643 : ZERO_EXTEND
, int_mode
, new_rtx
);
10650 /* The following rules apply only to scalars. */
10651 if (shift_mode
!= shift_unit_mode
)
10653 int_mode
= as_a
<scalar_int_mode
> (mode
);
10654 int_varop_mode
= as_a
<scalar_int_mode
> (GET_MODE (varop
));
10656 /* If VAROP is a SUBREG, strip it as long as the inner operand has
10657 the same number of words as what we've seen so far. Then store
10658 the widest mode in MODE. */
10659 if (subreg_lowpart_p (varop
)
10660 && is_int_mode (GET_MODE (SUBREG_REG (varop
)), &inner_mode
)
10661 && GET_MODE_SIZE (inner_mode
) > GET_MODE_SIZE (int_varop_mode
)
10662 && (CEIL (GET_MODE_SIZE (inner_mode
), UNITS_PER_WORD
)
10663 == CEIL (GET_MODE_SIZE (int_mode
), UNITS_PER_WORD
))
10664 && GET_MODE_CLASS (int_varop_mode
) == MODE_INT
)
10666 varop
= SUBREG_REG (varop
);
10667 if (GET_MODE_SIZE (inner_mode
) > GET_MODE_SIZE (int_mode
))
10674 /* Some machines use MULT instead of ASHIFT because MULT
10675 is cheaper. But it is still better on those machines to
10676 merge two shifts into one. */
10677 if (CONST_INT_P (XEXP (varop
, 1))
10678 && (log2
= exact_log2 (UINTVAL (XEXP (varop
, 1)))) >= 0)
10680 rtx log2_rtx
= gen_int_shift_amount (GET_MODE (varop
), log2
);
10681 varop
= simplify_gen_binary (ASHIFT
, GET_MODE (varop
),
10682 XEXP (varop
, 0), log2_rtx
);
10688 /* Similar, for when divides are cheaper. */
10689 if (CONST_INT_P (XEXP (varop
, 1))
10690 && (log2
= exact_log2 (UINTVAL (XEXP (varop
, 1)))) >= 0)
10692 rtx log2_rtx
= gen_int_shift_amount (GET_MODE (varop
), log2
);
10693 varop
= simplify_gen_binary (LSHIFTRT
, GET_MODE (varop
),
10694 XEXP (varop
, 0), log2_rtx
);
10700 /* If we are extracting just the sign bit of an arithmetic
10701 right shift, that shift is not needed. However, the sign
10702 bit of a wider mode may be different from what would be
10703 interpreted as the sign bit in a narrower mode, so, if
10704 the result is narrower, don't discard the shift. */
10705 if (code
== LSHIFTRT
10706 && count
== (GET_MODE_UNIT_BITSIZE (result_mode
) - 1)
10707 && (GET_MODE_UNIT_BITSIZE (result_mode
)
10708 >= GET_MODE_UNIT_BITSIZE (GET_MODE (varop
))))
10710 varop
= XEXP (varop
, 0);
10719 /* The following rules apply only to scalars. */
10720 if (shift_mode
!= shift_unit_mode
)
10722 int_mode
= as_a
<scalar_int_mode
> (mode
);
10723 int_varop_mode
= as_a
<scalar_int_mode
> (GET_MODE (varop
));
10724 int_result_mode
= as_a
<scalar_int_mode
> (result_mode
);
10726 /* Here we have two nested shifts. The result is usually the
10727 AND of a new shift with a mask. We compute the result below. */
10728 if (CONST_INT_P (XEXP (varop
, 1))
10729 && INTVAL (XEXP (varop
, 1)) >= 0
10730 && INTVAL (XEXP (varop
, 1)) < GET_MODE_PRECISION (int_varop_mode
)
10731 && HWI_COMPUTABLE_MODE_P (int_result_mode
)
10732 && HWI_COMPUTABLE_MODE_P (int_mode
))
10734 enum rtx_code first_code
= GET_CODE (varop
);
10735 unsigned int first_count
= INTVAL (XEXP (varop
, 1));
10736 unsigned HOST_WIDE_INT mask
;
10739 /* We have one common special case. We can't do any merging if
10740 the inner code is an ASHIFTRT of a smaller mode. However, if
10741 we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
10742 with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
10743 we can convert it to
10744 (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0) C3) C2) C1).
10745 This simplifies certain SIGN_EXTEND operations. */
10746 if (code
== ASHIFT
&& first_code
== ASHIFTRT
10747 && count
== (GET_MODE_PRECISION (int_result_mode
)
10748 - GET_MODE_PRECISION (int_varop_mode
)))
10750 /* C3 has the low-order C1 bits zero. */
10752 mask
= GET_MODE_MASK (int_mode
)
10753 & ~((HOST_WIDE_INT_1U
<< first_count
) - 1);
10755 varop
= simplify_and_const_int (NULL_RTX
, int_result_mode
,
10756 XEXP (varop
, 0), mask
);
10757 varop
= simplify_shift_const (NULL_RTX
, ASHIFT
,
10758 int_result_mode
, varop
, count
);
10759 count
= first_count
;
10764 /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
10765 than C1 high-order bits equal to the sign bit, we can convert
10766 this to either an ASHIFT or an ASHIFTRT depending on the
10769 We cannot do this if VAROP's mode is not SHIFT_UNIT_MODE. */
10771 if (code
== ASHIFTRT
&& first_code
== ASHIFT
10772 && int_varop_mode
== shift_unit_mode
10773 && (num_sign_bit_copies (XEXP (varop
, 0), shift_unit_mode
)
10776 varop
= XEXP (varop
, 0);
10777 count
-= first_count
;
10787 /* There are some cases we can't do. If CODE is ASHIFTRT,
10788 we can only do this if FIRST_CODE is also ASHIFTRT.
10790 We can't do the case when CODE is ROTATE and FIRST_CODE is
10793 If the mode of this shift is not the mode of the outer shift,
10794 we can't do this if either shift is a right shift or ROTATE.
10796 Finally, we can't do any of these if the mode is too wide
10797 unless the codes are the same.
10799 Handle the case where the shift codes are the same
10802 if (code
== first_code
)
10804 if (int_varop_mode
!= int_result_mode
10805 && (code
== ASHIFTRT
|| code
== LSHIFTRT
10806 || code
== ROTATE
))
10809 count
+= first_count
;
10810 varop
= XEXP (varop
, 0);
10814 if (code
== ASHIFTRT
10815 || (code
== ROTATE
&& first_code
== ASHIFTRT
)
10816 || GET_MODE_PRECISION (int_mode
) > HOST_BITS_PER_WIDE_INT
10817 || (int_varop_mode
!= int_result_mode
10818 && (first_code
== ASHIFTRT
|| first_code
== LSHIFTRT
10819 || first_code
== ROTATE
10820 || code
== ROTATE
)))
10823 /* To compute the mask to apply after the shift, shift the
10824 nonzero bits of the inner shift the same way the
10825 outer shift will. */
10827 mask_rtx
= gen_int_mode (nonzero_bits (varop
, int_varop_mode
),
10829 rtx count_rtx
= gen_int_shift_amount (int_result_mode
, count
);
10831 = simplify_const_binary_operation (code
, int_result_mode
,
10832 mask_rtx
, count_rtx
);
10834 /* Give up if we can't compute an outer operation to use. */
10836 || !CONST_INT_P (mask_rtx
)
10837 || ! merge_outer_ops (&outer_op
, &outer_const
, AND
,
10839 int_result_mode
, &complement_p
))
10842 /* If the shifts are in the same direction, we add the
10843 counts. Otherwise, we subtract them. */
10844 if ((code
== ASHIFTRT
|| code
== LSHIFTRT
)
10845 == (first_code
== ASHIFTRT
|| first_code
== LSHIFTRT
))
10846 count
+= first_count
;
10848 count
-= first_count
;
10850 /* If COUNT is positive, the new shift is usually CODE,
10851 except for the two exceptions below, in which case it is
10852 FIRST_CODE. If the count is negative, FIRST_CODE should
10855 && ((first_code
== ROTATE
&& code
== ASHIFT
)
10856 || (first_code
== ASHIFTRT
&& code
== LSHIFTRT
)))
10858 else if (count
< 0)
10859 code
= first_code
, count
= -count
;
10861 varop
= XEXP (varop
, 0);
10865 /* If we have (A << B << C) for any shift, we can convert this to
10866 (A << C << B). This wins if A is a constant. Only try this if
10867 B is not a constant. */
10869 else if (GET_CODE (varop
) == code
10870 && CONST_INT_P (XEXP (varop
, 0))
10871 && !CONST_INT_P (XEXP (varop
, 1)))
10873 /* For ((unsigned) (cstULL >> count)) >> cst2 we have to make
10874 sure the result will be masked. See PR70222. */
10875 if (code
== LSHIFTRT
10876 && int_mode
!= int_result_mode
10877 && !merge_outer_ops (&outer_op
, &outer_const
, AND
,
10878 GET_MODE_MASK (int_result_mode
)
10879 >> orig_count
, int_result_mode
,
10882 /* For ((int) (cstLL >> count)) >> cst2 just give up. Queuing
10883 up outer sign extension (often left and right shift) is
10884 hardly more efficient than the original. See PR70429. */
10885 if (code
== ASHIFTRT
&& int_mode
!= int_result_mode
)
10888 rtx count_rtx
= gen_int_shift_amount (int_result_mode
, count
);
10889 rtx new_rtx
= simplify_const_binary_operation (code
, int_mode
,
10892 varop
= gen_rtx_fmt_ee (code
, int_mode
, new_rtx
, XEXP (varop
, 1));
10899 /* The following rules apply only to scalars. */
10900 if (shift_mode
!= shift_unit_mode
)
10903 /* Make this fit the case below. */
10904 varop
= gen_rtx_XOR (mode
, XEXP (varop
, 0), constm1_rtx
);
10910 /* The following rules apply only to scalars. */
10911 if (shift_mode
!= shift_unit_mode
)
10913 int_varop_mode
= as_a
<scalar_int_mode
> (GET_MODE (varop
));
10914 int_result_mode
= as_a
<scalar_int_mode
> (result_mode
);
10916 /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
10917 with C the size of VAROP - 1 and the shift is logical if
10918 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
10919 we have an (le X 0) operation. If we have an arithmetic shift
10920 and STORE_FLAG_VALUE is 1 or we have a logical shift with
10921 STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation. */
10923 if (GET_CODE (varop
) == IOR
&& GET_CODE (XEXP (varop
, 0)) == PLUS
10924 && XEXP (XEXP (varop
, 0), 1) == constm1_rtx
10925 && (STORE_FLAG_VALUE
== 1 || STORE_FLAG_VALUE
== -1)
10926 && (code
== LSHIFTRT
|| code
== ASHIFTRT
)
10927 && count
== (GET_MODE_PRECISION (int_varop_mode
) - 1)
10928 && rtx_equal_p (XEXP (XEXP (varop
, 0), 0), XEXP (varop
, 1)))
10931 varop
= gen_rtx_LE (int_varop_mode
, XEXP (varop
, 1),
10934 if (STORE_FLAG_VALUE
== 1 ? code
== ASHIFTRT
: code
== LSHIFTRT
)
10935 varop
= gen_rtx_NEG (int_varop_mode
, varop
);
10940 /* If we have (shift (logical)), move the logical to the outside
10941 to allow it to possibly combine with another logical and the
10942 shift to combine with another shift. This also canonicalizes to
10943 what a ZERO_EXTRACT looks like. Also, some machines have
10944 (and (shift)) insns. */
10946 if (CONST_INT_P (XEXP (varop
, 1))
10947 /* We can't do this if we have (ashiftrt (xor)) and the
10948 constant has its sign bit set in shift_unit_mode with
10949 shift_unit_mode wider than result_mode. */
10950 && !(code
== ASHIFTRT
&& GET_CODE (varop
) == XOR
10951 && int_result_mode
!= shift_unit_mode
10952 && trunc_int_for_mode (INTVAL (XEXP (varop
, 1)),
10953 shift_unit_mode
) < 0)
10954 && (new_rtx
= simplify_const_binary_operation
10955 (code
, int_result_mode
,
10956 gen_int_mode (INTVAL (XEXP (varop
, 1)), int_result_mode
),
10957 gen_int_shift_amount (int_result_mode
, count
))) != 0
10958 && CONST_INT_P (new_rtx
)
10959 && merge_outer_ops (&outer_op
, &outer_const
, GET_CODE (varop
),
10960 INTVAL (new_rtx
), int_result_mode
,
10963 varop
= XEXP (varop
, 0);
10967 /* If we can't do that, try to simplify the shift in each arm of the
10968 logical expression, make a new logical expression, and apply
10969 the inverse distributive law. This also can't be done for
10970 (ashiftrt (xor)) where we've widened the shift and the constant
10971 changes the sign bit. */
10972 if (CONST_INT_P (XEXP (varop
, 1))
10973 && !(code
== ASHIFTRT
&& GET_CODE (varop
) == XOR
10974 && int_result_mode
!= shift_unit_mode
10975 && trunc_int_for_mode (INTVAL (XEXP (varop
, 1)),
10976 shift_unit_mode
) < 0))
10978 rtx lhs
= simplify_shift_const (NULL_RTX
, code
, shift_unit_mode
,
10979 XEXP (varop
, 0), count
);
10980 rtx rhs
= simplify_shift_const (NULL_RTX
, code
, shift_unit_mode
,
10981 XEXP (varop
, 1), count
);
10983 varop
= simplify_gen_binary (GET_CODE (varop
), shift_unit_mode
,
10985 varop
= apply_distributive_law (varop
);
10993 /* The following rules apply only to scalars. */
10994 if (shift_mode
!= shift_unit_mode
)
10996 int_result_mode
= as_a
<scalar_int_mode
> (result_mode
);
10998 /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
10999 says that the sign bit can be tested, FOO has mode MODE, C is
11000 GET_MODE_PRECISION (MODE) - 1, and FOO has only its low-order bit
11001 that may be nonzero. */
11002 if (code
== LSHIFTRT
11003 && XEXP (varop
, 1) == const0_rtx
11004 && GET_MODE (XEXP (varop
, 0)) == int_result_mode
11005 && count
== (GET_MODE_PRECISION (int_result_mode
) - 1)
11006 && HWI_COMPUTABLE_MODE_P (int_result_mode
)
11007 && STORE_FLAG_VALUE
== -1
11008 && nonzero_bits (XEXP (varop
, 0), int_result_mode
) == 1
11009 && merge_outer_ops (&outer_op
, &outer_const
, XOR
, 1,
11010 int_result_mode
, &complement_p
))
11012 varop
= XEXP (varop
, 0);
11019 /* The following rules apply only to scalars. */
11020 if (shift_mode
!= shift_unit_mode
)
11022 int_result_mode
= as_a
<scalar_int_mode
> (result_mode
);
11024 /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
11025 than the number of bits in the mode is equivalent to A. */
11026 if (code
== LSHIFTRT
11027 && count
== (GET_MODE_PRECISION (int_result_mode
) - 1)
11028 && nonzero_bits (XEXP (varop
, 0), int_result_mode
) == 1)
11030 varop
= XEXP (varop
, 0);
11035 /* NEG commutes with ASHIFT since it is multiplication. Move the
11036 NEG outside to allow shifts to combine. */
11038 && merge_outer_ops (&outer_op
, &outer_const
, NEG
, 0,
11039 int_result_mode
, &complement_p
))
11041 varop
= XEXP (varop
, 0);
11047 /* The following rules apply only to scalars. */
11048 if (shift_mode
!= shift_unit_mode
)
11050 int_result_mode
= as_a
<scalar_int_mode
> (result_mode
);
11052 /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
11053 is one less than the number of bits in the mode is
11054 equivalent to (xor A 1). */
11055 if (code
== LSHIFTRT
11056 && count
== (GET_MODE_PRECISION (int_result_mode
) - 1)
11057 && XEXP (varop
, 1) == constm1_rtx
11058 && nonzero_bits (XEXP (varop
, 0), int_result_mode
) == 1
11059 && merge_outer_ops (&outer_op
, &outer_const
, XOR
, 1,
11060 int_result_mode
, &complement_p
))
11063 varop
= XEXP (varop
, 0);
11067 /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
11068 that might be nonzero in BAR are those being shifted out and those
11069 bits are known zero in FOO, we can replace the PLUS with FOO.
11070 Similarly in the other operand order. This code occurs when
11071 we are computing the size of a variable-size array. */
11073 if ((code
== ASHIFTRT
|| code
== LSHIFTRT
)
11074 && count
< HOST_BITS_PER_WIDE_INT
11075 && nonzero_bits (XEXP (varop
, 1), int_result_mode
) >> count
== 0
11076 && (nonzero_bits (XEXP (varop
, 1), int_result_mode
)
11077 & nonzero_bits (XEXP (varop
, 0), int_result_mode
)) == 0)
11079 varop
= XEXP (varop
, 0);
11082 else if ((code
== ASHIFTRT
|| code
== LSHIFTRT
)
11083 && count
< HOST_BITS_PER_WIDE_INT
11084 && HWI_COMPUTABLE_MODE_P (int_result_mode
)
11085 && (nonzero_bits (XEXP (varop
, 0), int_result_mode
)
11087 && (nonzero_bits (XEXP (varop
, 0), int_result_mode
)
11088 & nonzero_bits (XEXP (varop
, 1), int_result_mode
)) == 0)
11090 varop
= XEXP (varop
, 1);
11094 /* (ashift (plus foo C) N) is (plus (ashift foo N) C'). */
11096 && CONST_INT_P (XEXP (varop
, 1))
11097 && (new_rtx
= simplify_const_binary_operation
11098 (ASHIFT
, int_result_mode
,
11099 gen_int_mode (INTVAL (XEXP (varop
, 1)), int_result_mode
),
11100 gen_int_shift_amount (int_result_mode
, count
))) != 0
11101 && CONST_INT_P (new_rtx
)
11102 && merge_outer_ops (&outer_op
, &outer_const
, PLUS
,
11103 INTVAL (new_rtx
), int_result_mode
,
11106 varop
= XEXP (varop
, 0);
11110 /* Check for 'PLUS signbit', which is the canonical form of 'XOR
11111 signbit', and attempt to change the PLUS to an XOR and move it to
11112 the outer operation as is done above in the AND/IOR/XOR case
11113 leg for shift(logical). See details in logical handling above
11114 for reasoning in doing so. */
11115 if (code
== LSHIFTRT
11116 && CONST_INT_P (XEXP (varop
, 1))
11117 && mode_signbit_p (int_result_mode
, XEXP (varop
, 1))
11118 && (new_rtx
= simplify_const_binary_operation
11119 (code
, int_result_mode
,
11120 gen_int_mode (INTVAL (XEXP (varop
, 1)), int_result_mode
),
11121 gen_int_shift_amount (int_result_mode
, count
))) != 0
11122 && CONST_INT_P (new_rtx
)
11123 && merge_outer_ops (&outer_op
, &outer_const
, XOR
,
11124 INTVAL (new_rtx
), int_result_mode
,
11127 varop
= XEXP (varop
, 0);
11134 /* The following rules apply only to scalars. */
11135 if (shift_mode
!= shift_unit_mode
)
11137 int_varop_mode
= as_a
<scalar_int_mode
> (GET_MODE (varop
));
11139 /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
11140 with C the size of VAROP - 1 and the shift is logical if
11141 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
11142 we have a (gt X 0) operation. If the shift is arithmetic with
11143 STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
11144 we have a (neg (gt X 0)) operation. */
11146 if ((STORE_FLAG_VALUE
== 1 || STORE_FLAG_VALUE
== -1)
11147 && GET_CODE (XEXP (varop
, 0)) == ASHIFTRT
11148 && count
== (GET_MODE_PRECISION (int_varop_mode
) - 1)
11149 && (code
== LSHIFTRT
|| code
== ASHIFTRT
)
11150 && CONST_INT_P (XEXP (XEXP (varop
, 0), 1))
11151 && INTVAL (XEXP (XEXP (varop
, 0), 1)) == count
11152 && rtx_equal_p (XEXP (XEXP (varop
, 0), 0), XEXP (varop
, 1)))
11155 varop
= gen_rtx_GT (int_varop_mode
, XEXP (varop
, 1),
11158 if (STORE_FLAG_VALUE
== 1 ? code
== ASHIFTRT
: code
== LSHIFTRT
)
11159 varop
= gen_rtx_NEG (int_varop_mode
, varop
);
11166 /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
11167 if the truncate does not affect the value. */
11168 if (code
== LSHIFTRT
11169 && GET_CODE (XEXP (varop
, 0)) == LSHIFTRT
11170 && CONST_INT_P (XEXP (XEXP (varop
, 0), 1))
11171 && (INTVAL (XEXP (XEXP (varop
, 0), 1))
11172 >= (GET_MODE_UNIT_PRECISION (GET_MODE (XEXP (varop
, 0)))
11173 - GET_MODE_UNIT_PRECISION (GET_MODE (varop
)))))
11175 rtx varop_inner
= XEXP (varop
, 0);
11176 int new_count
= count
+ INTVAL (XEXP (varop_inner
, 1));
11177 rtx new_count_rtx
= gen_int_shift_amount (GET_MODE (varop_inner
),
11179 varop_inner
= gen_rtx_LSHIFTRT (GET_MODE (varop_inner
),
11180 XEXP (varop_inner
, 0),
11182 varop
= gen_rtx_TRUNCATE (GET_MODE (varop
), varop_inner
);
11195 shift_mode
= result_mode
;
11196 if (shift_mode
!= mode
)
11198 /* We only change the modes of scalar shifts. */
11199 int_mode
= as_a
<scalar_int_mode
> (mode
);
11200 int_result_mode
= as_a
<scalar_int_mode
> (result_mode
);
11201 shift_mode
= try_widen_shift_mode (code
, varop
, count
, int_result_mode
,
11202 int_mode
, outer_op
, outer_const
);
11205 /* We have now finished analyzing the shift. The result should be
11206 a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places. If
11207 OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
11208 to the result of the shift. OUTER_CONST is the relevant constant,
11209 but we must turn off all bits turned off in the shift. */
11211 if (outer_op
== UNKNOWN
11212 && orig_code
== code
&& orig_count
== count
11213 && varop
== orig_varop
11214 && shift_mode
== GET_MODE (varop
))
11217 /* Make a SUBREG if necessary. If we can't make it, fail. */
11218 varop
= gen_lowpart (shift_mode
, varop
);
11219 if (varop
== NULL_RTX
|| GET_CODE (varop
) == CLOBBER
)
11222 /* If we have an outer operation and we just made a shift, it is
11223 possible that we could have simplified the shift were it not
11224 for the outer operation. So try to do the simplification
11227 if (outer_op
!= UNKNOWN
)
11228 x
= simplify_shift_const_1 (code
, shift_mode
, varop
, count
);
11233 x
= simplify_gen_binary (code
, shift_mode
, varop
,
11234 gen_int_shift_amount (shift_mode
, count
));
11236 /* If we were doing an LSHIFTRT in a wider mode than it was originally,
11237 turn off all the bits that the shift would have turned off. */
11238 if (orig_code
== LSHIFTRT
&& result_mode
!= shift_mode
)
11239 /* We only change the modes of scalar shifts. */
11240 x
= simplify_and_const_int (NULL_RTX
, as_a
<scalar_int_mode
> (shift_mode
),
11241 x
, GET_MODE_MASK (result_mode
) >> orig_count
);
11243 /* Do the remainder of the processing in RESULT_MODE. */
11244 x
= gen_lowpart_or_truncate (result_mode
, x
);
11246 /* If COMPLEMENT_P is set, we have to complement X before doing the outer
11249 x
= simplify_gen_unary (NOT
, result_mode
, x
, result_mode
);
11251 if (outer_op
!= UNKNOWN
)
11253 int_result_mode
= as_a
<scalar_int_mode
> (result_mode
);
11255 if (GET_RTX_CLASS (outer_op
) != RTX_UNARY
11256 && GET_MODE_PRECISION (int_result_mode
) < HOST_BITS_PER_WIDE_INT
)
11257 outer_const
= trunc_int_for_mode (outer_const
, int_result_mode
);
11259 if (outer_op
== AND
)
11260 x
= simplify_and_const_int (NULL_RTX
, int_result_mode
, x
, outer_const
);
11261 else if (outer_op
== SET
)
11263 /* This means that we have determined that the result is
11264 equivalent to a constant. This should be rare. */
11265 if (!side_effects_p (x
))
11266 x
= GEN_INT (outer_const
);
11268 else if (GET_RTX_CLASS (outer_op
) == RTX_UNARY
)
11269 x
= simplify_gen_unary (outer_op
, int_result_mode
, x
, int_result_mode
);
11271 x
= simplify_gen_binary (outer_op
, int_result_mode
, x
,
11272 GEN_INT (outer_const
));
11278 /* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift.
11279 The result of the shift is RESULT_MODE. If we cannot simplify it,
11280 return X or, if it is NULL, synthesize the expression with
11281 simplify_gen_binary. Otherwise, return a simplified value.
11283 The shift is normally computed in the widest mode we find in VAROP, as
11284 long as it isn't a different number of words than RESULT_MODE. Exceptions
11285 are ASHIFTRT and ROTATE, which are always done in their original mode. */
11288 simplify_shift_const (rtx x
, enum rtx_code code
, machine_mode result_mode
,
11289 rtx varop
, int count
)
11291 rtx tem
= simplify_shift_const_1 (code
, result_mode
, varop
, count
);
11296 x
= simplify_gen_binary (code
, GET_MODE (varop
), varop
,
11297 gen_int_shift_amount (GET_MODE (varop
), count
));
11298 if (GET_MODE (x
) != result_mode
)
11299 x
= gen_lowpart (result_mode
, x
);
11304 /* A subroutine of recog_for_combine. See there for arguments and
11308 recog_for_combine_1 (rtx
*pnewpat
, rtx_insn
*insn
, rtx
*pnotes
)
11310 rtx pat
= *pnewpat
;
11311 rtx pat_without_clobbers
;
11312 int insn_code_number
;
11313 int num_clobbers_to_add
= 0;
11315 rtx notes
= NULL_RTX
;
11316 rtx old_notes
, old_pat
;
11319 /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
11320 we use to indicate that something didn't match. If we find such a
11321 thing, force rejection. */
11322 if (GET_CODE (pat
) == PARALLEL
)
11323 for (i
= XVECLEN (pat
, 0) - 1; i
>= 0; i
--)
11324 if (GET_CODE (XVECEXP (pat
, 0, i
)) == CLOBBER
11325 && XEXP (XVECEXP (pat
, 0, i
), 0) == const0_rtx
)
11328 old_pat
= PATTERN (insn
);
11329 old_notes
= REG_NOTES (insn
);
11330 PATTERN (insn
) = pat
;
11331 REG_NOTES (insn
) = NULL_RTX
;
11333 insn_code_number
= recog (pat
, insn
, &num_clobbers_to_add
);
11334 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
11336 if (insn_code_number
< 0)
11337 fputs ("Failed to match this instruction:\n", dump_file
);
11339 fputs ("Successfully matched this instruction:\n", dump_file
);
11340 print_rtl_single (dump_file
, pat
);
11343 /* If it isn't, there is the possibility that we previously had an insn
11344 that clobbered some register as a side effect, but the combined
11345 insn doesn't need to do that. So try once more without the clobbers
11346 unless this represents an ASM insn. */
11348 if (insn_code_number
< 0 && ! check_asm_operands (pat
)
11349 && GET_CODE (pat
) == PARALLEL
)
11353 for (pos
= 0, i
= 0; i
< XVECLEN (pat
, 0); i
++)
11354 if (GET_CODE (XVECEXP (pat
, 0, i
)) != CLOBBER
)
11357 SUBST (XVECEXP (pat
, 0, pos
), XVECEXP (pat
, 0, i
));
11361 SUBST_INT (XVECLEN (pat
, 0), pos
);
11364 pat
= XVECEXP (pat
, 0, 0);
11366 PATTERN (insn
) = pat
;
11367 insn_code_number
= recog (pat
, insn
, &num_clobbers_to_add
);
11368 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
11370 if (insn_code_number
< 0)
11371 fputs ("Failed to match this instruction:\n", dump_file
);
11373 fputs ("Successfully matched this instruction:\n", dump_file
);
11374 print_rtl_single (dump_file
, pat
);
11378 pat_without_clobbers
= pat
;
11380 PATTERN (insn
) = old_pat
;
11381 REG_NOTES (insn
) = old_notes
;
11383 /* Recognize all noop sets, these will be killed by followup pass. */
11384 if (insn_code_number
< 0 && GET_CODE (pat
) == SET
&& set_noop_p (pat
))
11385 insn_code_number
= NOOP_MOVE_INSN_CODE
, num_clobbers_to_add
= 0;
11387 /* If we had any clobbers to add, make a new pattern than contains
11388 them. Then check to make sure that all of them are dead. */
11389 if (num_clobbers_to_add
)
11391 rtx newpat
= gen_rtx_PARALLEL (VOIDmode
,
11392 rtvec_alloc (GET_CODE (pat
) == PARALLEL
11393 ? (XVECLEN (pat
, 0)
11394 + num_clobbers_to_add
)
11395 : num_clobbers_to_add
+ 1));
11397 if (GET_CODE (pat
) == PARALLEL
)
11398 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
11399 XVECEXP (newpat
, 0, i
) = XVECEXP (pat
, 0, i
);
11401 XVECEXP (newpat
, 0, 0) = pat
;
11403 add_clobbers (newpat
, insn_code_number
);
11405 for (i
= XVECLEN (newpat
, 0) - num_clobbers_to_add
;
11406 i
< XVECLEN (newpat
, 0); i
++)
11408 if (REG_P (XEXP (XVECEXP (newpat
, 0, i
), 0))
11409 && ! reg_dead_at_p (XEXP (XVECEXP (newpat
, 0, i
), 0), insn
))
11411 if (GET_CODE (XEXP (XVECEXP (newpat
, 0, i
), 0)) != SCRATCH
)
11413 gcc_assert (REG_P (XEXP (XVECEXP (newpat
, 0, i
), 0)));
11414 notes
= alloc_reg_note (REG_UNUSED
,
11415 XEXP (XVECEXP (newpat
, 0, i
), 0), notes
);
11421 if (insn_code_number
>= 0
11422 && insn_code_number
!= NOOP_MOVE_INSN_CODE
)
11424 old_pat
= PATTERN (insn
);
11425 old_notes
= REG_NOTES (insn
);
11426 old_icode
= INSN_CODE (insn
);
11427 PATTERN (insn
) = pat
;
11428 REG_NOTES (insn
) = notes
;
11429 INSN_CODE (insn
) = insn_code_number
;
11431 /* Allow targets to reject combined insn. */
11432 if (!targetm
.legitimate_combined_insn (insn
))
11434 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
11435 fputs ("Instruction not appropriate for target.",
11438 /* Callers expect recog_for_combine to strip
11439 clobbers from the pattern on failure. */
11440 pat
= pat_without_clobbers
;
11443 insn_code_number
= -1;
11446 PATTERN (insn
) = old_pat
;
11447 REG_NOTES (insn
) = old_notes
;
11448 INSN_CODE (insn
) = old_icode
;
11454 return insn_code_number
;
11457 /* Change every ZERO_EXTRACT and ZERO_EXTEND of a SUBREG that can be
11458 expressed as an AND and maybe an LSHIFTRT, to that formulation.
11459 Return whether anything was so changed. */
11462 change_zero_ext (rtx pat
)
11464 bool changed
= false;
11465 rtx
*src
= &SET_SRC (pat
);
11467 subrtx_ptr_iterator::array_type array
;
11468 FOR_EACH_SUBRTX_PTR (iter
, array
, src
, NONCONST
)
11471 scalar_int_mode mode
, inner_mode
;
11472 if (!is_a
<scalar_int_mode
> (GET_MODE (x
), &mode
))
11476 if (GET_CODE (x
) == ZERO_EXTRACT
11477 && CONST_INT_P (XEXP (x
, 1))
11478 && CONST_INT_P (XEXP (x
, 2))
11479 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (x
, 0)), &inner_mode
)
11480 && GET_MODE_PRECISION (inner_mode
) <= GET_MODE_PRECISION (mode
))
11482 size
= INTVAL (XEXP (x
, 1));
11484 int start
= INTVAL (XEXP (x
, 2));
11485 if (BITS_BIG_ENDIAN
)
11486 start
= GET_MODE_PRECISION (inner_mode
) - size
- start
;
11489 x
= gen_rtx_LSHIFTRT (inner_mode
, XEXP (x
, 0),
11490 gen_int_shift_amount (inner_mode
, start
));
11494 if (mode
!= inner_mode
)
11496 if (REG_P (x
) && HARD_REGISTER_P (x
)
11497 && !can_change_dest_mode (x
, 0, mode
))
11500 x
= gen_lowpart_SUBREG (mode
, x
);
11503 else if (GET_CODE (x
) == ZERO_EXTEND
11504 && GET_CODE (XEXP (x
, 0)) == SUBREG
11505 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (XEXP (x
, 0))))
11506 && !paradoxical_subreg_p (XEXP (x
, 0))
11507 && subreg_lowpart_p (XEXP (x
, 0)))
11509 inner_mode
= as_a
<scalar_int_mode
> (GET_MODE (XEXP (x
, 0)));
11510 size
= GET_MODE_PRECISION (inner_mode
);
11511 x
= SUBREG_REG (XEXP (x
, 0));
11512 if (GET_MODE (x
) != mode
)
11514 if (REG_P (x
) && HARD_REGISTER_P (x
)
11515 && !can_change_dest_mode (x
, 0, mode
))
11518 x
= gen_lowpart_SUBREG (mode
, x
);
11521 else if (GET_CODE (x
) == ZERO_EXTEND
11522 && REG_P (XEXP (x
, 0))
11523 && HARD_REGISTER_P (XEXP (x
, 0))
11524 && can_change_dest_mode (XEXP (x
, 0), 0, mode
))
11526 inner_mode
= as_a
<scalar_int_mode
> (GET_MODE (XEXP (x
, 0)));
11527 size
= GET_MODE_PRECISION (inner_mode
);
11528 x
= gen_rtx_REG (mode
, REGNO (XEXP (x
, 0)));
11533 if (!(GET_CODE (x
) == LSHIFTRT
11534 && CONST_INT_P (XEXP (x
, 1))
11535 && size
+ INTVAL (XEXP (x
, 1)) == GET_MODE_PRECISION (mode
)))
11537 wide_int mask
= wi::mask (size
, false, GET_MODE_PRECISION (mode
));
11538 x
= gen_rtx_AND (mode
, x
, immed_wide_int_const (mask
, mode
));
11546 FOR_EACH_SUBRTX_PTR (iter
, array
, src
, NONCONST
)
11547 maybe_swap_commutative_operands (**iter
);
11549 rtx
*dst
= &SET_DEST (pat
);
11550 scalar_int_mode mode
;
11551 if (GET_CODE (*dst
) == ZERO_EXTRACT
11552 && REG_P (XEXP (*dst
, 0))
11553 && is_a
<scalar_int_mode
> (GET_MODE (XEXP (*dst
, 0)), &mode
)
11554 && CONST_INT_P (XEXP (*dst
, 1))
11555 && CONST_INT_P (XEXP (*dst
, 2)))
11557 rtx reg
= XEXP (*dst
, 0);
11558 int width
= INTVAL (XEXP (*dst
, 1));
11559 int offset
= INTVAL (XEXP (*dst
, 2));
11560 int reg_width
= GET_MODE_PRECISION (mode
);
11561 if (BITS_BIG_ENDIAN
)
11562 offset
= reg_width
- width
- offset
;
11565 wide_int mask
= wi::shifted_mask (offset
, width
, true, reg_width
);
11566 wide_int mask2
= wi::shifted_mask (offset
, width
, false, reg_width
);
11567 x
= gen_rtx_AND (mode
, reg
, immed_wide_int_const (mask
, mode
));
11569 y
= gen_rtx_ASHIFT (mode
, SET_SRC (pat
), GEN_INT (offset
));
11572 z
= gen_rtx_AND (mode
, y
, immed_wide_int_const (mask2
, mode
));
11573 w
= gen_rtx_IOR (mode
, x
, z
);
11574 SUBST (SET_DEST (pat
), reg
);
11575 SUBST (SET_SRC (pat
), w
);
11583 /* Like recog, but we receive the address of a pointer to a new pattern.
11584 We try to match the rtx that the pointer points to.
11585 If that fails, we may try to modify or replace the pattern,
11586 storing the replacement into the same pointer object.
11588 Modifications include deletion or addition of CLOBBERs. If the
11589 instruction will still not match, we change ZERO_EXTEND and ZERO_EXTRACT
11590 to the equivalent AND and perhaps LSHIFTRT patterns, and try with that
11591 (and undo if that fails).
11593 PNOTES is a pointer to a location where any REG_UNUSED notes added for
11594 the CLOBBERs are placed.
11596 The value is the final insn code from the pattern ultimately matched,
11600 recog_for_combine (rtx
*pnewpat
, rtx_insn
*insn
, rtx
*pnotes
)
11602 rtx pat
= *pnewpat
;
11603 int insn_code_number
= recog_for_combine_1 (pnewpat
, insn
, pnotes
);
11604 if (insn_code_number
>= 0 || check_asm_operands (pat
))
11605 return insn_code_number
;
11607 void *marker
= get_undo_marker ();
11608 bool changed
= false;
11610 if (GET_CODE (pat
) == SET
)
11611 changed
= change_zero_ext (pat
);
11612 else if (GET_CODE (pat
) == PARALLEL
)
11615 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
11617 rtx set
= XVECEXP (pat
, 0, i
);
11618 if (GET_CODE (set
) == SET
)
11619 changed
|= change_zero_ext (set
);
11625 insn_code_number
= recog_for_combine_1 (pnewpat
, insn
, pnotes
);
11627 if (insn_code_number
< 0)
11628 undo_to_marker (marker
);
11631 return insn_code_number
;
11634 /* Like gen_lowpart_general but for use by combine. In combine it
11635 is not possible to create any new pseudoregs. However, it is
11636 safe to create invalid memory addresses, because combine will
11637 try to recognize them and all they will do is make the combine
11640 If for some reason this cannot do its job, an rtx
11641 (clobber (const_int 0)) is returned.
11642 An insn containing that will not be recognized. */
11645 gen_lowpart_for_combine (machine_mode omode
, rtx x
)
11647 machine_mode imode
= GET_MODE (x
);
11650 if (omode
== imode
)
11653 /* We can only support MODE being wider than a word if X is a
11654 constant integer or has a mode the same size. */
11655 if (maybe_gt (GET_MODE_SIZE (omode
), UNITS_PER_WORD
)
11656 && ! (CONST_SCALAR_INT_P (x
)
11657 || known_eq (GET_MODE_SIZE (imode
), GET_MODE_SIZE (omode
))))
11660 /* X might be a paradoxical (subreg (mem)). In that case, gen_lowpart
11661 won't know what to do. So we will strip off the SUBREG here and
11662 process normally. */
11663 if (GET_CODE (x
) == SUBREG
&& MEM_P (SUBREG_REG (x
)))
11665 x
= SUBREG_REG (x
);
11667 /* For use in case we fall down into the address adjustments
11668 further below, we need to adjust the known mode and size of
11669 x; imode and isize, since we just adjusted x. */
11670 imode
= GET_MODE (x
);
11672 if (imode
== omode
)
11676 result
= gen_lowpart_common (omode
, x
);
11683 /* Refuse to work on a volatile memory ref or one with a mode-dependent
11685 if (MEM_VOLATILE_P (x
)
11686 || mode_dependent_address_p (XEXP (x
, 0), MEM_ADDR_SPACE (x
)))
11689 /* If we want to refer to something bigger than the original memref,
11690 generate a paradoxical subreg instead. That will force a reload
11691 of the original memref X. */
11692 if (paradoxical_subreg_p (omode
, imode
))
11693 return gen_rtx_SUBREG (omode
, x
, 0);
11695 poly_int64 offset
= byte_lowpart_offset (omode
, imode
);
11696 return adjust_address_nv (x
, omode
, offset
);
11699 /* If X is a comparison operator, rewrite it in a new mode. This
11700 probably won't match, but may allow further simplifications. */
11701 else if (COMPARISON_P (x
))
11702 return gen_rtx_fmt_ee (GET_CODE (x
), omode
, XEXP (x
, 0), XEXP (x
, 1));
11704 /* If we couldn't simplify X any other way, just enclose it in a
11705 SUBREG. Normally, this SUBREG won't match, but some patterns may
11706 include an explicit SUBREG or we may simplify it further in combine. */
11711 if (imode
== VOIDmode
)
11713 imode
= int_mode_for_mode (omode
).require ();
11714 x
= gen_lowpart_common (imode
, x
);
11718 res
= lowpart_subreg (omode
, x
, imode
);
11724 return gen_rtx_CLOBBER (omode
, const0_rtx
);
11727 /* Try to simplify a comparison between OP0 and a constant OP1,
11728 where CODE is the comparison code that will be tested, into a
11729 (CODE OP0 const0_rtx) form.
11731 The result is a possibly different comparison code to use.
11732 *POP1 may be updated. */
11734 static enum rtx_code
11735 simplify_compare_const (enum rtx_code code
, machine_mode mode
,
11736 rtx op0
, rtx
*pop1
)
11738 scalar_int_mode int_mode
;
11739 HOST_WIDE_INT const_op
= INTVAL (*pop1
);
11741 /* Get the constant we are comparing against and turn off all bits
11742 not on in our mode. */
11743 if (mode
!= VOIDmode
)
11744 const_op
= trunc_int_for_mode (const_op
, mode
);
11746 /* If we are comparing against a constant power of two and the value
11747 being compared can only have that single bit nonzero (e.g., it was
11748 `and'ed with that bit), we can replace this with a comparison
11751 && (code
== EQ
|| code
== NE
|| code
== GE
|| code
== GEU
11752 || code
== LT
|| code
== LTU
)
11753 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
11754 && GET_MODE_PRECISION (int_mode
) - 1 < HOST_BITS_PER_WIDE_INT
11755 && pow2p_hwi (const_op
& GET_MODE_MASK (int_mode
))
11756 && (nonzero_bits (op0
, int_mode
)
11757 == (unsigned HOST_WIDE_INT
) (const_op
& GET_MODE_MASK (int_mode
))))
11759 code
= (code
== EQ
|| code
== GE
|| code
== GEU
? NE
: EQ
);
11763 /* Similarly, if we are comparing a value known to be either -1 or
11764 0 with -1, change it to the opposite comparison against zero. */
11766 && (code
== EQ
|| code
== NE
|| code
== GT
|| code
== LE
11767 || code
== GEU
|| code
== LTU
)
11768 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
11769 && num_sign_bit_copies (op0
, int_mode
) == GET_MODE_PRECISION (int_mode
))
11771 code
= (code
== EQ
|| code
== LE
|| code
== GEU
? NE
: EQ
);
11775 /* Do some canonicalizations based on the comparison code. We prefer
11776 comparisons against zero and then prefer equality comparisons.
11777 If we can reduce the size of a constant, we will do that too. */
11781 /* < C is equivalent to <= (C - 1) */
11786 /* ... fall through to LE case below. */
11787 gcc_fallthrough ();
11793 /* <= C is equivalent to < (C + 1); we do this for C < 0 */
11800 /* If we are doing a <= 0 comparison on a value known to have
11801 a zero sign bit, we can replace this with == 0. */
11802 else if (const_op
== 0
11803 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
11804 && GET_MODE_PRECISION (int_mode
) - 1 < HOST_BITS_PER_WIDE_INT
11805 && (nonzero_bits (op0
, int_mode
)
11806 & (HOST_WIDE_INT_1U
<< (GET_MODE_PRECISION (int_mode
) - 1)))
11812 /* >= C is equivalent to > (C - 1). */
11817 /* ... fall through to GT below. */
11818 gcc_fallthrough ();
11824 /* > C is equivalent to >= (C + 1); we do this for C < 0. */
11831 /* If we are doing a > 0 comparison on a value known to have
11832 a zero sign bit, we can replace this with != 0. */
11833 else if (const_op
== 0
11834 && is_a
<scalar_int_mode
> (mode
, &int_mode
)
11835 && GET_MODE_PRECISION (int_mode
) - 1 < HOST_BITS_PER_WIDE_INT
11836 && (nonzero_bits (op0
, int_mode
)
11837 & (HOST_WIDE_INT_1U
<< (GET_MODE_PRECISION (int_mode
) - 1)))
11843 /* < C is equivalent to <= (C - 1). */
11848 /* ... fall through ... */
11849 gcc_fallthrough ();
11851 /* (unsigned) < 0x80000000 is equivalent to >= 0. */
11852 else if (is_a
<scalar_int_mode
> (mode
, &int_mode
)
11853 && GET_MODE_PRECISION (int_mode
) - 1 < HOST_BITS_PER_WIDE_INT
11854 && ((unsigned HOST_WIDE_INT
) const_op
11855 == HOST_WIDE_INT_1U
<< (GET_MODE_PRECISION (int_mode
) - 1)))
11865 /* unsigned <= 0 is equivalent to == 0 */
11868 /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */
11869 else if (is_a
<scalar_int_mode
> (mode
, &int_mode
)
11870 && GET_MODE_PRECISION (int_mode
) - 1 < HOST_BITS_PER_WIDE_INT
11871 && ((unsigned HOST_WIDE_INT
) const_op
11872 == ((HOST_WIDE_INT_1U
11873 << (GET_MODE_PRECISION (int_mode
) - 1)) - 1)))
11881 /* >= C is equivalent to > (C - 1). */
11886 /* ... fall through ... */
11887 gcc_fallthrough ();
11890 /* (unsigned) >= 0x80000000 is equivalent to < 0. */
11891 else if (is_a
<scalar_int_mode
> (mode
, &int_mode
)
11892 && GET_MODE_PRECISION (int_mode
) - 1 < HOST_BITS_PER_WIDE_INT
11893 && ((unsigned HOST_WIDE_INT
) const_op
11894 == HOST_WIDE_INT_1U
<< (GET_MODE_PRECISION (int_mode
) - 1)))
11904 /* unsigned > 0 is equivalent to != 0 */
11907 /* (unsigned) > 0x7fffffff is equivalent to < 0. */
11908 else if (is_a
<scalar_int_mode
> (mode
, &int_mode
)
11909 && GET_MODE_PRECISION (int_mode
) - 1 < HOST_BITS_PER_WIDE_INT
11910 && ((unsigned HOST_WIDE_INT
) const_op
11911 == (HOST_WIDE_INT_1U
11912 << (GET_MODE_PRECISION (int_mode
) - 1)) - 1))
11923 *pop1
= GEN_INT (const_op
);
11927 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
11928 comparison code that will be tested.
11930 The result is a possibly different comparison code to use. *POP0 and
11931 *POP1 may be updated.
11933 It is possible that we might detect that a comparison is either always
11934 true or always false. However, we do not perform general constant
11935 folding in combine, so this knowledge isn't useful. Such tautologies
11936 should have been detected earlier. Hence we ignore all such cases. */
11938 static enum rtx_code
11939 simplify_comparison (enum rtx_code code
, rtx
*pop0
, rtx
*pop1
)
11945 scalar_int_mode mode
, inner_mode
, tmode
;
11946 opt_scalar_int_mode tmode_iter
;
11948 /* Try a few ways of applying the same transformation to both operands. */
11951 /* The test below this one won't handle SIGN_EXTENDs on these machines,
11952 so check specially. */
11953 if (!WORD_REGISTER_OPERATIONS
11954 && code
!= GTU
&& code
!= GEU
&& code
!= LTU
&& code
!= LEU
11955 && GET_CODE (op0
) == ASHIFTRT
&& GET_CODE (op1
) == ASHIFTRT
11956 && GET_CODE (XEXP (op0
, 0)) == ASHIFT
11957 && GET_CODE (XEXP (op1
, 0)) == ASHIFT
11958 && GET_CODE (XEXP (XEXP (op0
, 0), 0)) == SUBREG
11959 && GET_CODE (XEXP (XEXP (op1
, 0), 0)) == SUBREG
11960 && is_a
<scalar_int_mode
> (GET_MODE (op0
), &mode
)
11961 && (is_a
<scalar_int_mode
>
11962 (GET_MODE (SUBREG_REG (XEXP (XEXP (op0
, 0), 0))), &inner_mode
))
11963 && inner_mode
== GET_MODE (SUBREG_REG (XEXP (XEXP (op1
, 0), 0)))
11964 && CONST_INT_P (XEXP (op0
, 1))
11965 && XEXP (op0
, 1) == XEXP (op1
, 1)
11966 && XEXP (op0
, 1) == XEXP (XEXP (op0
, 0), 1)
11967 && XEXP (op0
, 1) == XEXP (XEXP (op1
, 0), 1)
11968 && (INTVAL (XEXP (op0
, 1))
11969 == (GET_MODE_PRECISION (mode
)
11970 - GET_MODE_PRECISION (inner_mode
))))
11972 op0
= SUBREG_REG (XEXP (XEXP (op0
, 0), 0));
11973 op1
= SUBREG_REG (XEXP (XEXP (op1
, 0), 0));
11976 /* If both operands are the same constant shift, see if we can ignore the
11977 shift. We can if the shift is a rotate or if the bits shifted out of
11978 this shift are known to be zero for both inputs and if the type of
11979 comparison is compatible with the shift. */
11980 if (GET_CODE (op0
) == GET_CODE (op1
)
11981 && HWI_COMPUTABLE_MODE_P (GET_MODE (op0
))
11982 && ((GET_CODE (op0
) == ROTATE
&& (code
== NE
|| code
== EQ
))
11983 || ((GET_CODE (op0
) == LSHIFTRT
|| GET_CODE (op0
) == ASHIFT
)
11984 && (code
!= GT
&& code
!= LT
&& code
!= GE
&& code
!= LE
))
11985 || (GET_CODE (op0
) == ASHIFTRT
11986 && (code
!= GTU
&& code
!= LTU
11987 && code
!= GEU
&& code
!= LEU
)))
11988 && CONST_INT_P (XEXP (op0
, 1))
11989 && INTVAL (XEXP (op0
, 1)) >= 0
11990 && INTVAL (XEXP (op0
, 1)) < HOST_BITS_PER_WIDE_INT
11991 && XEXP (op0
, 1) == XEXP (op1
, 1))
11993 machine_mode mode
= GET_MODE (op0
);
11994 unsigned HOST_WIDE_INT mask
= GET_MODE_MASK (mode
);
11995 int shift_count
= INTVAL (XEXP (op0
, 1));
11997 if (GET_CODE (op0
) == LSHIFTRT
|| GET_CODE (op0
) == ASHIFTRT
)
11998 mask
&= (mask
>> shift_count
) << shift_count
;
11999 else if (GET_CODE (op0
) == ASHIFT
)
12000 mask
= (mask
& (mask
<< shift_count
)) >> shift_count
;
12002 if ((nonzero_bits (XEXP (op0
, 0), mode
) & ~mask
) == 0
12003 && (nonzero_bits (XEXP (op1
, 0), mode
) & ~mask
) == 0)
12004 op0
= XEXP (op0
, 0), op1
= XEXP (op1
, 0);
12009 /* If both operands are AND's of a paradoxical SUBREG by constant, the
12010 SUBREGs are of the same mode, and, in both cases, the AND would
12011 be redundant if the comparison was done in the narrower mode,
12012 do the comparison in the narrower mode (e.g., we are AND'ing with 1
12013 and the operand's possibly nonzero bits are 0xffffff01; in that case
12014 if we only care about QImode, we don't need the AND). This case
12015 occurs if the output mode of an scc insn is not SImode and
12016 STORE_FLAG_VALUE == 1 (e.g., the 386).
12018 Similarly, check for a case where the AND's are ZERO_EXTEND
12019 operations from some narrower mode even though a SUBREG is not
12022 else if (GET_CODE (op0
) == AND
&& GET_CODE (op1
) == AND
12023 && CONST_INT_P (XEXP (op0
, 1))
12024 && CONST_INT_P (XEXP (op1
, 1)))
12026 rtx inner_op0
= XEXP (op0
, 0);
12027 rtx inner_op1
= XEXP (op1
, 0);
12028 HOST_WIDE_INT c0
= INTVAL (XEXP (op0
, 1));
12029 HOST_WIDE_INT c1
= INTVAL (XEXP (op1
, 1));
12032 if (paradoxical_subreg_p (inner_op0
)
12033 && GET_CODE (inner_op1
) == SUBREG
12034 && HWI_COMPUTABLE_MODE_P (GET_MODE (SUBREG_REG (inner_op0
)))
12035 && (GET_MODE (SUBREG_REG (inner_op0
))
12036 == GET_MODE (SUBREG_REG (inner_op1
)))
12037 && ((~c0
) & nonzero_bits (SUBREG_REG (inner_op0
),
12038 GET_MODE (SUBREG_REG (inner_op0
)))) == 0
12039 && ((~c1
) & nonzero_bits (SUBREG_REG (inner_op1
),
12040 GET_MODE (SUBREG_REG (inner_op1
)))) == 0)
12042 op0
= SUBREG_REG (inner_op0
);
12043 op1
= SUBREG_REG (inner_op1
);
12045 /* The resulting comparison is always unsigned since we masked
12046 off the original sign bit. */
12047 code
= unsigned_condition (code
);
12053 FOR_EACH_MODE_UNTIL (tmode
,
12054 as_a
<scalar_int_mode
> (GET_MODE (op0
)))
12055 if ((unsigned HOST_WIDE_INT
) c0
== GET_MODE_MASK (tmode
))
12057 op0
= gen_lowpart_or_truncate (tmode
, inner_op0
);
12058 op1
= gen_lowpart_or_truncate (tmode
, inner_op1
);
12059 code
= unsigned_condition (code
);
12068 /* If both operands are NOT, we can strip off the outer operation
12069 and adjust the comparison code for swapped operands; similarly for
12070 NEG, except that this must be an equality comparison. */
12071 else if ((GET_CODE (op0
) == NOT
&& GET_CODE (op1
) == NOT
)
12072 || (GET_CODE (op0
) == NEG
&& GET_CODE (op1
) == NEG
12073 && (code
== EQ
|| code
== NE
)))
12074 op0
= XEXP (op0
, 0), op1
= XEXP (op1
, 0), code
= swap_condition (code
);
12080 /* If the first operand is a constant, swap the operands and adjust the
12081 comparison code appropriately, but don't do this if the second operand
12082 is already a constant integer. */
12083 if (swap_commutative_operands_p (op0
, op1
))
12085 std::swap (op0
, op1
);
12086 code
= swap_condition (code
);
12089 /* We now enter a loop during which we will try to simplify the comparison.
12090 For the most part, we only are concerned with comparisons with zero,
12091 but some things may really be comparisons with zero but not start
12092 out looking that way. */
12094 while (CONST_INT_P (op1
))
12096 machine_mode raw_mode
= GET_MODE (op0
);
12097 scalar_int_mode int_mode
;
12098 int equality_comparison_p
;
12099 int sign_bit_comparison_p
;
12100 int unsigned_comparison_p
;
12101 HOST_WIDE_INT const_op
;
12103 /* We only want to handle integral modes. This catches VOIDmode,
12104 CCmode, and the floating-point modes. An exception is that we
12105 can handle VOIDmode if OP0 is a COMPARE or a comparison
12108 if (GET_MODE_CLASS (raw_mode
) != MODE_INT
12109 && ! (raw_mode
== VOIDmode
12110 && (GET_CODE (op0
) == COMPARE
|| COMPARISON_P (op0
))))
12113 /* Try to simplify the compare to constant, possibly changing the
12114 comparison op, and/or changing op1 to zero. */
12115 code
= simplify_compare_const (code
, raw_mode
, op0
, &op1
);
12116 const_op
= INTVAL (op1
);
12118 /* Compute some predicates to simplify code below. */
12120 equality_comparison_p
= (code
== EQ
|| code
== NE
);
12121 sign_bit_comparison_p
= ((code
== LT
|| code
== GE
) && const_op
== 0);
12122 unsigned_comparison_p
= (code
== LTU
|| code
== LEU
|| code
== GTU
12125 /* If this is a sign bit comparison and we can do arithmetic in
12126 MODE, say that we will only be needing the sign bit of OP0. */
12127 if (sign_bit_comparison_p
12128 && is_a
<scalar_int_mode
> (raw_mode
, &int_mode
)
12129 && HWI_COMPUTABLE_MODE_P (int_mode
))
12130 op0
= force_to_mode (op0
, int_mode
,
12132 << (GET_MODE_PRECISION (int_mode
) - 1),
12135 if (COMPARISON_P (op0
))
12137 /* We can't do anything if OP0 is a condition code value, rather
12138 than an actual data value. */
12140 || CC0_P (XEXP (op0
, 0))
12141 || GET_MODE_CLASS (GET_MODE (XEXP (op0
, 0))) == MODE_CC
)
12144 /* Get the two operands being compared. */
12145 if (GET_CODE (XEXP (op0
, 0)) == COMPARE
)
12146 tem
= XEXP (XEXP (op0
, 0), 0), tem1
= XEXP (XEXP (op0
, 0), 1);
12148 tem
= XEXP (op0
, 0), tem1
= XEXP (op0
, 1);
12150 /* Check for the cases where we simply want the result of the
12151 earlier test or the opposite of that result. */
12152 if (code
== NE
|| code
== EQ
12153 || (val_signbit_known_set_p (raw_mode
, STORE_FLAG_VALUE
)
12154 && (code
== LT
|| code
== GE
)))
12156 enum rtx_code new_code
;
12157 if (code
== LT
|| code
== NE
)
12158 new_code
= GET_CODE (op0
);
12160 new_code
= reversed_comparison_code (op0
, NULL
);
12162 if (new_code
!= UNKNOWN
)
12173 if (raw_mode
== VOIDmode
)
12175 scalar_int_mode mode
= as_a
<scalar_int_mode
> (raw_mode
);
12177 /* Now try cases based on the opcode of OP0. If none of the cases
12178 does a "continue", we exit this loop immediately after the
12181 unsigned int mode_width
= GET_MODE_PRECISION (mode
);
12182 unsigned HOST_WIDE_INT mask
= GET_MODE_MASK (mode
);
12183 switch (GET_CODE (op0
))
12186 /* If we are extracting a single bit from a variable position in
12187 a constant that has only a single bit set and are comparing it
12188 with zero, we can convert this into an equality comparison
12189 between the position and the location of the single bit. */
12190 /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
12191 have already reduced the shift count modulo the word size. */
12192 if (!SHIFT_COUNT_TRUNCATED
12193 && CONST_INT_P (XEXP (op0
, 0))
12194 && XEXP (op0
, 1) == const1_rtx
12195 && equality_comparison_p
&& const_op
== 0
12196 && (i
= exact_log2 (UINTVAL (XEXP (op0
, 0)))) >= 0)
12198 if (BITS_BIG_ENDIAN
)
12199 i
= BITS_PER_WORD
- 1 - i
;
12201 op0
= XEXP (op0
, 2);
12205 /* Result is nonzero iff shift count is equal to I. */
12206 code
= reverse_condition (code
);
12213 tem
= expand_compound_operation (op0
);
12222 /* If testing for equality, we can take the NOT of the constant. */
12223 if (equality_comparison_p
12224 && (tem
= simplify_unary_operation (NOT
, mode
, op1
, mode
)) != 0)
12226 op0
= XEXP (op0
, 0);
12231 /* If just looking at the sign bit, reverse the sense of the
12233 if (sign_bit_comparison_p
)
12235 op0
= XEXP (op0
, 0);
12236 code
= (code
== GE
? LT
: GE
);
12242 /* If testing for equality, we can take the NEG of the constant. */
12243 if (equality_comparison_p
12244 && (tem
= simplify_unary_operation (NEG
, mode
, op1
, mode
)) != 0)
12246 op0
= XEXP (op0
, 0);
12251 /* The remaining cases only apply to comparisons with zero. */
12255 /* When X is ABS or is known positive,
12256 (neg X) is < 0 if and only if X != 0. */
12258 if (sign_bit_comparison_p
12259 && (GET_CODE (XEXP (op0
, 0)) == ABS
12260 || (mode_width
<= HOST_BITS_PER_WIDE_INT
12261 && (nonzero_bits (XEXP (op0
, 0), mode
)
12262 & (HOST_WIDE_INT_1U
<< (mode_width
- 1)))
12265 op0
= XEXP (op0
, 0);
12266 code
= (code
== LT
? NE
: EQ
);
12270 /* If we have NEG of something whose two high-order bits are the
12271 same, we know that "(-a) < 0" is equivalent to "a > 0". */
12272 if (num_sign_bit_copies (op0
, mode
) >= 2)
12274 op0
= XEXP (op0
, 0);
12275 code
= swap_condition (code
);
12281 /* If we are testing equality and our count is a constant, we
12282 can perform the inverse operation on our RHS. */
12283 if (equality_comparison_p
&& CONST_INT_P (XEXP (op0
, 1))
12284 && (tem
= simplify_binary_operation (ROTATERT
, mode
,
12285 op1
, XEXP (op0
, 1))) != 0)
12287 op0
= XEXP (op0
, 0);
12292 /* If we are doing a < 0 or >= 0 comparison, it means we are testing
12293 a particular bit. Convert it to an AND of a constant of that
12294 bit. This will be converted into a ZERO_EXTRACT. */
12295 if (const_op
== 0 && sign_bit_comparison_p
12296 && CONST_INT_P (XEXP (op0
, 1))
12297 && mode_width
<= HOST_BITS_PER_WIDE_INT
)
12299 op0
= simplify_and_const_int (NULL_RTX
, mode
, XEXP (op0
, 0),
12302 - INTVAL (XEXP (op0
, 1)))));
12303 code
= (code
== LT
? NE
: EQ
);
12307 /* Fall through. */
12310 /* ABS is ignorable inside an equality comparison with zero. */
12311 if (const_op
== 0 && equality_comparison_p
)
12313 op0
= XEXP (op0
, 0);
12319 /* Can simplify (compare (zero/sign_extend FOO) CONST) to
12320 (compare FOO CONST) if CONST fits in FOO's mode and we
12321 are either testing inequality or have an unsigned
12322 comparison with ZERO_EXTEND or a signed comparison with
12323 SIGN_EXTEND. But don't do it if we don't have a compare
12324 insn of the given mode, since we'd have to revert it
12325 later on, and then we wouldn't know whether to sign- or
12327 if (is_int_mode (GET_MODE (XEXP (op0
, 0)), &mode
)
12328 && ! unsigned_comparison_p
12329 && HWI_COMPUTABLE_MODE_P (mode
)
12330 && trunc_int_for_mode (const_op
, mode
) == const_op
12331 && have_insn_for (COMPARE
, mode
))
12333 op0
= XEXP (op0
, 0);
12339 /* Check for the case where we are comparing A - C1 with C2, that is
12341 (subreg:MODE (plus (A) (-C1))) op (C2)
12343 with C1 a constant, and try to lift the SUBREG, i.e. to do the
12344 comparison in the wider mode. One of the following two conditions
12345 must be true in order for this to be valid:
12347 1. The mode extension results in the same bit pattern being added
12348 on both sides and the comparison is equality or unsigned. As
12349 C2 has been truncated to fit in MODE, the pattern can only be
12352 2. The mode extension results in the sign bit being copied on
12355 The difficulty here is that we have predicates for A but not for
12356 (A - C1) so we need to check that C1 is within proper bounds so
12357 as to perturbate A as little as possible. */
12359 if (mode_width
<= HOST_BITS_PER_WIDE_INT
12360 && subreg_lowpart_p (op0
)
12361 && is_a
<scalar_int_mode
> (GET_MODE (SUBREG_REG (op0
)),
12363 && GET_MODE_PRECISION (inner_mode
) > mode_width
12364 && GET_CODE (SUBREG_REG (op0
)) == PLUS
12365 && CONST_INT_P (XEXP (SUBREG_REG (op0
), 1)))
12367 rtx a
= XEXP (SUBREG_REG (op0
), 0);
12368 HOST_WIDE_INT c1
= -INTVAL (XEXP (SUBREG_REG (op0
), 1));
12371 && (unsigned HOST_WIDE_INT
) c1
12372 < HOST_WIDE_INT_1U
<< (mode_width
- 1)
12373 && (equality_comparison_p
|| unsigned_comparison_p
)
12374 /* (A - C1) zero-extends if it is positive and sign-extends
12375 if it is negative, C2 both zero- and sign-extends. */
12376 && (((nonzero_bits (a
, inner_mode
)
12377 & ~GET_MODE_MASK (mode
)) == 0
12379 /* (A - C1) sign-extends if it is positive and 1-extends
12380 if it is negative, C2 both sign- and 1-extends. */
12381 || (num_sign_bit_copies (a
, inner_mode
)
12382 > (unsigned int) (GET_MODE_PRECISION (inner_mode
)
12385 || ((unsigned HOST_WIDE_INT
) c1
12386 < HOST_WIDE_INT_1U
<< (mode_width
- 2)
12387 /* (A - C1) always sign-extends, like C2. */
12388 && num_sign_bit_copies (a
, inner_mode
)
12389 > (unsigned int) (GET_MODE_PRECISION (inner_mode
)
12390 - (mode_width
- 1))))
12392 op0
= SUBREG_REG (op0
);
12397 /* If the inner mode is narrower and we are extracting the low part,
12398 we can treat the SUBREG as if it were a ZERO_EXTEND. */
12399 if (paradoxical_subreg_p (op0
))
12401 else if (subreg_lowpart_p (op0
)
12402 && GET_MODE_CLASS (mode
) == MODE_INT
12403 && is_int_mode (GET_MODE (SUBREG_REG (op0
)), &inner_mode
)
12404 && (code
== NE
|| code
== EQ
)
12405 && GET_MODE_PRECISION (inner_mode
) <= HOST_BITS_PER_WIDE_INT
12406 && !paradoxical_subreg_p (op0
)
12407 && (nonzero_bits (SUBREG_REG (op0
), inner_mode
)
12408 & ~GET_MODE_MASK (mode
)) == 0)
12410 /* Remove outer subregs that don't do anything. */
12411 tem
= gen_lowpart (inner_mode
, op1
);
12413 if ((nonzero_bits (tem
, inner_mode
)
12414 & ~GET_MODE_MASK (mode
)) == 0)
12416 op0
= SUBREG_REG (op0
);
12428 if (is_int_mode (GET_MODE (XEXP (op0
, 0)), &mode
)
12429 && (unsigned_comparison_p
|| equality_comparison_p
)
12430 && HWI_COMPUTABLE_MODE_P (mode
)
12431 && (unsigned HOST_WIDE_INT
) const_op
<= GET_MODE_MASK (mode
)
12433 && have_insn_for (COMPARE
, mode
))
12435 op0
= XEXP (op0
, 0);
12441 /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do
12442 this for equality comparisons due to pathological cases involving
12444 if (equality_comparison_p
12445 && (tem
= simplify_binary_operation (MINUS
, mode
,
12446 op1
, XEXP (op0
, 1))) != 0)
12448 op0
= XEXP (op0
, 0);
12453 /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0. */
12454 if (const_op
== 0 && XEXP (op0
, 1) == constm1_rtx
12455 && GET_CODE (XEXP (op0
, 0)) == ABS
&& sign_bit_comparison_p
)
12457 op0
= XEXP (XEXP (op0
, 0), 0);
12458 code
= (code
== LT
? EQ
: NE
);
12464 /* We used to optimize signed comparisons against zero, but that
12465 was incorrect. Unsigned comparisons against zero (GTU, LEU)
12466 arrive here as equality comparisons, or (GEU, LTU) are
12467 optimized away. No need to special-case them. */
12469 /* (eq (minus A B) C) -> (eq A (plus B C)) or
12470 (eq B (minus A C)), whichever simplifies. We can only do
12471 this for equality comparisons due to pathological cases involving
12473 if (equality_comparison_p
12474 && (tem
= simplify_binary_operation (PLUS
, mode
,
12475 XEXP (op0
, 1), op1
)) != 0)
12477 op0
= XEXP (op0
, 0);
12482 if (equality_comparison_p
12483 && (tem
= simplify_binary_operation (MINUS
, mode
,
12484 XEXP (op0
, 0), op1
)) != 0)
12486 op0
= XEXP (op0
, 1);
12491 /* The sign bit of (minus (ashiftrt X C) X), where C is the number
12492 of bits in X minus 1, is one iff X > 0. */
12493 if (sign_bit_comparison_p
&& GET_CODE (XEXP (op0
, 0)) == ASHIFTRT
12494 && CONST_INT_P (XEXP (XEXP (op0
, 0), 1))
12495 && UINTVAL (XEXP (XEXP (op0
, 0), 1)) == mode_width
- 1
12496 && rtx_equal_p (XEXP (XEXP (op0
, 0), 0), XEXP (op0
, 1)))
12498 op0
= XEXP (op0
, 1);
12499 code
= (code
== GE
? LE
: GT
);
12505 /* (eq (xor A B) C) -> (eq A (xor B C)). This is a simplification
12506 if C is zero or B is a constant. */
12507 if (equality_comparison_p
12508 && (tem
= simplify_binary_operation (XOR
, mode
,
12509 XEXP (op0
, 1), op1
)) != 0)
12511 op0
= XEXP (op0
, 0);
12519 /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
12521 if (sign_bit_comparison_p
&& GET_CODE (XEXP (op0
, 0)) == PLUS
12522 && XEXP (XEXP (op0
, 0), 1) == constm1_rtx
12523 && rtx_equal_p (XEXP (XEXP (op0
, 0), 0), XEXP (op0
, 1)))
12525 op0
= XEXP (op0
, 1);
12526 code
= (code
== GE
? GT
: LE
);
12532 /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1). This
12533 will be converted to a ZERO_EXTRACT later. */
12534 if (const_op
== 0 && equality_comparison_p
12535 && GET_CODE (XEXP (op0
, 0)) == ASHIFT
12536 && XEXP (XEXP (op0
, 0), 0) == const1_rtx
)
12538 op0
= gen_rtx_LSHIFTRT (mode
, XEXP (op0
, 1),
12539 XEXP (XEXP (op0
, 0), 1));
12540 op0
= simplify_and_const_int (NULL_RTX
, mode
, op0
, 1);
12544 /* If we are comparing (and (lshiftrt X C1) C2) for equality with
12545 zero and X is a comparison and C1 and C2 describe only bits set
12546 in STORE_FLAG_VALUE, we can compare with X. */
12547 if (const_op
== 0 && equality_comparison_p
12548 && mode_width
<= HOST_BITS_PER_WIDE_INT
12549 && CONST_INT_P (XEXP (op0
, 1))
12550 && GET_CODE (XEXP (op0
, 0)) == LSHIFTRT
12551 && CONST_INT_P (XEXP (XEXP (op0
, 0), 1))
12552 && INTVAL (XEXP (XEXP (op0
, 0), 1)) >= 0
12553 && INTVAL (XEXP (XEXP (op0
, 0), 1)) < HOST_BITS_PER_WIDE_INT
)
12555 mask
= ((INTVAL (XEXP (op0
, 1)) & GET_MODE_MASK (mode
))
12556 << INTVAL (XEXP (XEXP (op0
, 0), 1)));
12557 if ((~STORE_FLAG_VALUE
& mask
) == 0
12558 && (COMPARISON_P (XEXP (XEXP (op0
, 0), 0))
12559 || ((tem
= get_last_value (XEXP (XEXP (op0
, 0), 0))) != 0
12560 && COMPARISON_P (tem
))))
12562 op0
= XEXP (XEXP (op0
, 0), 0);
12567 /* If we are doing an equality comparison of an AND of a bit equal
12568 to the sign bit, replace this with a LT or GE comparison of
12569 the underlying value. */
12570 if (equality_comparison_p
12572 && CONST_INT_P (XEXP (op0
, 1))
12573 && mode_width
<= HOST_BITS_PER_WIDE_INT
12574 && ((INTVAL (XEXP (op0
, 1)) & GET_MODE_MASK (mode
))
12575 == HOST_WIDE_INT_1U
<< (mode_width
- 1)))
12577 op0
= XEXP (op0
, 0);
12578 code
= (code
== EQ
? GE
: LT
);
12582 /* If this AND operation is really a ZERO_EXTEND from a narrower
12583 mode, the constant fits within that mode, and this is either an
12584 equality or unsigned comparison, try to do this comparison in
12589 (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
12590 -> (ne:DI (reg:SI 4) (const_int 0))
12592 unless TARGET_TRULY_NOOP_TRUNCATION allows it or the register is
12593 known to hold a value of the required mode the
12594 transformation is invalid. */
12595 if ((equality_comparison_p
|| unsigned_comparison_p
)
12596 && CONST_INT_P (XEXP (op0
, 1))
12597 && (i
= exact_log2 ((UINTVAL (XEXP (op0
, 1))
12598 & GET_MODE_MASK (mode
))
12600 && const_op
>> i
== 0
12601 && int_mode_for_size (i
, 1).exists (&tmode
))
12603 op0
= gen_lowpart_or_truncate (tmode
, XEXP (op0
, 0));
12607 /* If this is (and:M1 (subreg:M1 X:M2 0) (const_int C1)) where C1
12608 fits in both M1 and M2 and the SUBREG is either paradoxical
12609 or represents the low part, permute the SUBREG and the AND
12611 if (GET_CODE (XEXP (op0
, 0)) == SUBREG
12612 && CONST_INT_P (XEXP (op0
, 1)))
12614 unsigned HOST_WIDE_INT c1
= INTVAL (XEXP (op0
, 1));
12615 /* Require an integral mode, to avoid creating something like
12617 if ((is_a
<scalar_int_mode
>
12618 (GET_MODE (SUBREG_REG (XEXP (op0
, 0))), &tmode
))
12619 /* It is unsafe to commute the AND into the SUBREG if the
12620 SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
12621 not defined. As originally written the upper bits
12622 have a defined value due to the AND operation.
12623 However, if we commute the AND inside the SUBREG then
12624 they no longer have defined values and the meaning of
12625 the code has been changed.
12626 Also C1 should not change value in the smaller mode,
12627 see PR67028 (a positive C1 can become negative in the
12628 smaller mode, so that the AND does no longer mask the
12630 && ((WORD_REGISTER_OPERATIONS
12631 && mode_width
> GET_MODE_PRECISION (tmode
)
12632 && mode_width
<= BITS_PER_WORD
12633 && trunc_int_for_mode (c1
, tmode
) == (HOST_WIDE_INT
) c1
)
12634 || (mode_width
<= GET_MODE_PRECISION (tmode
)
12635 && subreg_lowpart_p (XEXP (op0
, 0))))
12636 && mode_width
<= HOST_BITS_PER_WIDE_INT
12637 && HWI_COMPUTABLE_MODE_P (tmode
)
12638 && (c1
& ~mask
) == 0
12639 && (c1
& ~GET_MODE_MASK (tmode
)) == 0
12641 && c1
!= GET_MODE_MASK (tmode
))
12643 op0
= simplify_gen_binary (AND
, tmode
,
12644 SUBREG_REG (XEXP (op0
, 0)),
12645 gen_int_mode (c1
, tmode
));
12646 op0
= gen_lowpart (mode
, op0
);
12651 /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0). */
12652 if (const_op
== 0 && equality_comparison_p
12653 && XEXP (op0
, 1) == const1_rtx
12654 && GET_CODE (XEXP (op0
, 0)) == NOT
)
12656 op0
= simplify_and_const_int (NULL_RTX
, mode
,
12657 XEXP (XEXP (op0
, 0), 0), 1);
12658 code
= (code
== NE
? EQ
: NE
);
12662 /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
12663 (eq (and (lshiftrt X) 1) 0).
12664 Also handle the case where (not X) is expressed using xor. */
12665 if (const_op
== 0 && equality_comparison_p
12666 && XEXP (op0
, 1) == const1_rtx
12667 && GET_CODE (XEXP (op0
, 0)) == LSHIFTRT
)
12669 rtx shift_op
= XEXP (XEXP (op0
, 0), 0);
12670 rtx shift_count
= XEXP (XEXP (op0
, 0), 1);
12672 if (GET_CODE (shift_op
) == NOT
12673 || (GET_CODE (shift_op
) == XOR
12674 && CONST_INT_P (XEXP (shift_op
, 1))
12675 && CONST_INT_P (shift_count
)
12676 && HWI_COMPUTABLE_MODE_P (mode
)
12677 && (UINTVAL (XEXP (shift_op
, 1))
12678 == HOST_WIDE_INT_1U
12679 << INTVAL (shift_count
))))
12682 = gen_rtx_LSHIFTRT (mode
, XEXP (shift_op
, 0), shift_count
);
12683 op0
= simplify_and_const_int (NULL_RTX
, mode
, op0
, 1);
12684 code
= (code
== NE
? EQ
: NE
);
12691 /* If we have (compare (ashift FOO N) (const_int C)) and
12692 the high order N bits of FOO (N+1 if an inequality comparison)
12693 are known to be zero, we can do this by comparing FOO with C
12694 shifted right N bits so long as the low-order N bits of C are
12696 if (CONST_INT_P (XEXP (op0
, 1))
12697 && INTVAL (XEXP (op0
, 1)) >= 0
12698 && ((INTVAL (XEXP (op0
, 1)) + ! equality_comparison_p
)
12699 < HOST_BITS_PER_WIDE_INT
)
12700 && (((unsigned HOST_WIDE_INT
) const_op
12701 & ((HOST_WIDE_INT_1U
<< INTVAL (XEXP (op0
, 1)))
12703 && mode_width
<= HOST_BITS_PER_WIDE_INT
12704 && (nonzero_bits (XEXP (op0
, 0), mode
)
12705 & ~(mask
>> (INTVAL (XEXP (op0
, 1))
12706 + ! equality_comparison_p
))) == 0)
12708 /* We must perform a logical shift, not an arithmetic one,
12709 as we want the top N bits of C to be zero. */
12710 unsigned HOST_WIDE_INT temp
= const_op
& GET_MODE_MASK (mode
);
12712 temp
>>= INTVAL (XEXP (op0
, 1));
12713 op1
= gen_int_mode (temp
, mode
);
12714 op0
= XEXP (op0
, 0);
12718 /* If we are doing a sign bit comparison, it means we are testing
12719 a particular bit. Convert it to the appropriate AND. */
12720 if (sign_bit_comparison_p
&& CONST_INT_P (XEXP (op0
, 1))
12721 && mode_width
<= HOST_BITS_PER_WIDE_INT
)
12723 op0
= simplify_and_const_int (NULL_RTX
, mode
, XEXP (op0
, 0),
12726 - INTVAL (XEXP (op0
, 1)))));
12727 code
= (code
== LT
? NE
: EQ
);
12731 /* If this an equality comparison with zero and we are shifting
12732 the low bit to the sign bit, we can convert this to an AND of the
12734 if (const_op
== 0 && equality_comparison_p
12735 && CONST_INT_P (XEXP (op0
, 1))
12736 && UINTVAL (XEXP (op0
, 1)) == mode_width
- 1)
12738 op0
= simplify_and_const_int (NULL_RTX
, mode
, XEXP (op0
, 0), 1);
12744 /* If this is an equality comparison with zero, we can do this
12745 as a logical shift, which might be much simpler. */
12746 if (equality_comparison_p
&& const_op
== 0
12747 && CONST_INT_P (XEXP (op0
, 1)))
12749 op0
= simplify_shift_const (NULL_RTX
, LSHIFTRT
, mode
,
12751 INTVAL (XEXP (op0
, 1)));
12755 /* If OP0 is a sign extension and CODE is not an unsigned comparison,
12756 do the comparison in a narrower mode. */
12757 if (! unsigned_comparison_p
12758 && CONST_INT_P (XEXP (op0
, 1))
12759 && GET_CODE (XEXP (op0
, 0)) == ASHIFT
12760 && XEXP (op0
, 1) == XEXP (XEXP (op0
, 0), 1)
12761 && (int_mode_for_size (mode_width
- INTVAL (XEXP (op0
, 1)), 1)
12763 && (((unsigned HOST_WIDE_INT
) const_op
12764 + (GET_MODE_MASK (tmode
) >> 1) + 1)
12765 <= GET_MODE_MASK (tmode
)))
12767 op0
= gen_lowpart (tmode
, XEXP (XEXP (op0
, 0), 0));
12771 /* Likewise if OP0 is a PLUS of a sign extension with a
12772 constant, which is usually represented with the PLUS
12773 between the shifts. */
12774 if (! unsigned_comparison_p
12775 && CONST_INT_P (XEXP (op0
, 1))
12776 && GET_CODE (XEXP (op0
, 0)) == PLUS
12777 && CONST_INT_P (XEXP (XEXP (op0
, 0), 1))
12778 && GET_CODE (XEXP (XEXP (op0
, 0), 0)) == ASHIFT
12779 && XEXP (op0
, 1) == XEXP (XEXP (XEXP (op0
, 0), 0), 1)
12780 && (int_mode_for_size (mode_width
- INTVAL (XEXP (op0
, 1)), 1)
12782 && (((unsigned HOST_WIDE_INT
) const_op
12783 + (GET_MODE_MASK (tmode
) >> 1) + 1)
12784 <= GET_MODE_MASK (tmode
)))
12786 rtx inner
= XEXP (XEXP (XEXP (op0
, 0), 0), 0);
12787 rtx add_const
= XEXP (XEXP (op0
, 0), 1);
12788 rtx new_const
= simplify_gen_binary (ASHIFTRT
, mode
,
12789 add_const
, XEXP (op0
, 1));
12791 op0
= simplify_gen_binary (PLUS
, tmode
,
12792 gen_lowpart (tmode
, inner
),
12799 /* If we have (compare (xshiftrt FOO N) (const_int C)) and
12800 the low order N bits of FOO are known to be zero, we can do this
12801 by comparing FOO with C shifted left N bits so long as no
12802 overflow occurs. Even if the low order N bits of FOO aren't known
12803 to be zero, if the comparison is >= or < we can use the same
12804 optimization and for > or <= by setting all the low
12805 order N bits in the comparison constant. */
12806 if (CONST_INT_P (XEXP (op0
, 1))
12807 && INTVAL (XEXP (op0
, 1)) > 0
12808 && INTVAL (XEXP (op0
, 1)) < HOST_BITS_PER_WIDE_INT
12809 && mode_width
<= HOST_BITS_PER_WIDE_INT
12810 && (((unsigned HOST_WIDE_INT
) const_op
12811 + (GET_CODE (op0
) != LSHIFTRT
12812 ? ((GET_MODE_MASK (mode
) >> INTVAL (XEXP (op0
, 1)) >> 1)
12815 <= GET_MODE_MASK (mode
) >> INTVAL (XEXP (op0
, 1))))
12817 unsigned HOST_WIDE_INT low_bits
12818 = (nonzero_bits (XEXP (op0
, 0), mode
)
12819 & ((HOST_WIDE_INT_1U
12820 << INTVAL (XEXP (op0
, 1))) - 1));
12821 if (low_bits
== 0 || !equality_comparison_p
)
12823 /* If the shift was logical, then we must make the condition
12825 if (GET_CODE (op0
) == LSHIFTRT
)
12826 code
= unsigned_condition (code
);
12828 const_op
= (unsigned HOST_WIDE_INT
) const_op
12829 << INTVAL (XEXP (op0
, 1));
12831 && (code
== GT
|| code
== GTU
12832 || code
== LE
|| code
== LEU
))
12834 |= ((HOST_WIDE_INT_1
<< INTVAL (XEXP (op0
, 1))) - 1);
12835 op1
= GEN_INT (const_op
);
12836 op0
= XEXP (op0
, 0);
12841 /* If we are using this shift to extract just the sign bit, we
12842 can replace this with an LT or GE comparison. */
12844 && (equality_comparison_p
|| sign_bit_comparison_p
)
12845 && CONST_INT_P (XEXP (op0
, 1))
12846 && UINTVAL (XEXP (op0
, 1)) == mode_width
- 1)
12848 op0
= XEXP (op0
, 0);
12849 code
= (code
== NE
|| code
== GT
? LT
: GE
);
12861 /* Now make any compound operations involved in this comparison. Then,
12862 check for an outmost SUBREG on OP0 that is not doing anything or is
12863 paradoxical. The latter transformation must only be performed when
12864 it is known that the "extra" bits will be the same in op0 and op1 or
12865 that they don't matter. There are three cases to consider:
12867 1. SUBREG_REG (op0) is a register. In this case the bits are don't
12868 care bits and we can assume they have any convenient value. So
12869 making the transformation is safe.
12871 2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is UNKNOWN.
12872 In this case the upper bits of op0 are undefined. We should not make
12873 the simplification in that case as we do not know the contents of
12876 3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not UNKNOWN.
12877 In that case we know those bits are zeros or ones. We must also be
12878 sure that they are the same as the upper bits of op1.
12880 We can never remove a SUBREG for a non-equality comparison because
12881 the sign bit is in a different place in the underlying object. */
12883 rtx_code op0_mco_code
= SET
;
12884 if (op1
== const0_rtx
)
12885 op0_mco_code
= code
== NE
|| code
== EQ
? EQ
: COMPARE
;
12887 op0
= make_compound_operation (op0
, op0_mco_code
);
12888 op1
= make_compound_operation (op1
, SET
);
12890 if (GET_CODE (op0
) == SUBREG
&& subreg_lowpart_p (op0
)
12891 && is_int_mode (GET_MODE (op0
), &mode
)
12892 && is_int_mode (GET_MODE (SUBREG_REG (op0
)), &inner_mode
)
12893 && (code
== NE
|| code
== EQ
))
12895 if (paradoxical_subreg_p (op0
))
12897 /* For paradoxical subregs, allow case 1 as above. Case 3 isn't
12899 if (REG_P (SUBREG_REG (op0
)))
12901 op0
= SUBREG_REG (op0
);
12902 op1
= gen_lowpart (inner_mode
, op1
);
12905 else if (GET_MODE_PRECISION (inner_mode
) <= HOST_BITS_PER_WIDE_INT
12906 && (nonzero_bits (SUBREG_REG (op0
), inner_mode
)
12907 & ~GET_MODE_MASK (mode
)) == 0)
12909 tem
= gen_lowpart (inner_mode
, op1
);
12911 if ((nonzero_bits (tem
, inner_mode
) & ~GET_MODE_MASK (mode
)) == 0)
12912 op0
= SUBREG_REG (op0
), op1
= tem
;
12916 /* We now do the opposite procedure: Some machines don't have compare
12917 insns in all modes. If OP0's mode is an integer mode smaller than a
12918 word and we can't do a compare in that mode, see if there is a larger
12919 mode for which we can do the compare. There are a number of cases in
12920 which we can use the wider mode. */
12922 if (is_int_mode (GET_MODE (op0
), &mode
)
12923 && GET_MODE_SIZE (mode
) < UNITS_PER_WORD
12924 && ! have_insn_for (COMPARE
, mode
))
12925 FOR_EACH_WIDER_MODE (tmode_iter
, mode
)
12927 tmode
= tmode_iter
.require ();
12928 if (!HWI_COMPUTABLE_MODE_P (tmode
))
12930 if (have_insn_for (COMPARE
, tmode
))
12934 /* If this is a test for negative, we can make an explicit
12935 test of the sign bit. Test this first so we can use
12936 a paradoxical subreg to extend OP0. */
12938 if (op1
== const0_rtx
&& (code
== LT
|| code
== GE
)
12939 && HWI_COMPUTABLE_MODE_P (mode
))
12941 unsigned HOST_WIDE_INT sign
12942 = HOST_WIDE_INT_1U
<< (GET_MODE_BITSIZE (mode
) - 1);
12943 op0
= simplify_gen_binary (AND
, tmode
,
12944 gen_lowpart (tmode
, op0
),
12945 gen_int_mode (sign
, tmode
));
12946 code
= (code
== LT
) ? NE
: EQ
;
12950 /* If the only nonzero bits in OP0 and OP1 are those in the
12951 narrower mode and this is an equality or unsigned comparison,
12952 we can use the wider mode. Similarly for sign-extended
12953 values, in which case it is true for all comparisons. */
12954 zero_extended
= ((code
== EQ
|| code
== NE
12955 || code
== GEU
|| code
== GTU
12956 || code
== LEU
|| code
== LTU
)
12957 && (nonzero_bits (op0
, tmode
)
12958 & ~GET_MODE_MASK (mode
)) == 0
12959 && ((CONST_INT_P (op1
)
12960 || (nonzero_bits (op1
, tmode
)
12961 & ~GET_MODE_MASK (mode
)) == 0)));
12964 || ((num_sign_bit_copies (op0
, tmode
)
12965 > (unsigned int) (GET_MODE_PRECISION (tmode
)
12966 - GET_MODE_PRECISION (mode
)))
12967 && (num_sign_bit_copies (op1
, tmode
)
12968 > (unsigned int) (GET_MODE_PRECISION (tmode
)
12969 - GET_MODE_PRECISION (mode
)))))
12971 /* If OP0 is an AND and we don't have an AND in MODE either,
12972 make a new AND in the proper mode. */
12973 if (GET_CODE (op0
) == AND
12974 && !have_insn_for (AND
, mode
))
12975 op0
= simplify_gen_binary (AND
, tmode
,
12976 gen_lowpart (tmode
,
12978 gen_lowpart (tmode
,
12984 op0
= simplify_gen_unary (ZERO_EXTEND
, tmode
,
12986 op1
= simplify_gen_unary (ZERO_EXTEND
, tmode
,
12991 op0
= simplify_gen_unary (SIGN_EXTEND
, tmode
,
12993 op1
= simplify_gen_unary (SIGN_EXTEND
, tmode
,
13002 /* We may have changed the comparison operands. Re-canonicalize. */
13003 if (swap_commutative_operands_p (op0
, op1
))
13005 std::swap (op0
, op1
);
13006 code
= swap_condition (code
);
13009 /* If this machine only supports a subset of valid comparisons, see if we
13010 can convert an unsupported one into a supported one. */
13011 target_canonicalize_comparison (&code
, &op0
, &op1
, 0);
13019 /* Utility function for record_value_for_reg. Count number of
13024 enum rtx_code code
= GET_CODE (x
);
13028 if (GET_RTX_CLASS (code
) == RTX_BIN_ARITH
13029 || GET_RTX_CLASS (code
) == RTX_COMM_ARITH
)
13031 rtx x0
= XEXP (x
, 0);
13032 rtx x1
= XEXP (x
, 1);
13035 return 1 + 2 * count_rtxs (x0
);
13037 if ((GET_RTX_CLASS (GET_CODE (x1
)) == RTX_BIN_ARITH
13038 || GET_RTX_CLASS (GET_CODE (x1
)) == RTX_COMM_ARITH
)
13039 && (x0
== XEXP (x1
, 0) || x0
== XEXP (x1
, 1)))
13040 return 2 + 2 * count_rtxs (x0
)
13041 + count_rtxs (x
== XEXP (x1
, 0)
13042 ? XEXP (x1
, 1) : XEXP (x1
, 0));
13044 if ((GET_RTX_CLASS (GET_CODE (x0
)) == RTX_BIN_ARITH
13045 || GET_RTX_CLASS (GET_CODE (x0
)) == RTX_COMM_ARITH
)
13046 && (x1
== XEXP (x0
, 0) || x1
== XEXP (x0
, 1)))
13047 return 2 + 2 * count_rtxs (x1
)
13048 + count_rtxs (x
== XEXP (x0
, 0)
13049 ? XEXP (x0
, 1) : XEXP (x0
, 0));
13052 fmt
= GET_RTX_FORMAT (code
);
13053 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
13055 ret
+= count_rtxs (XEXP (x
, i
));
13056 else if (fmt
[i
] == 'E')
13057 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
13058 ret
+= count_rtxs (XVECEXP (x
, i
, j
));
13063 /* Utility function for following routine. Called when X is part of a value
13064 being stored into last_set_value. Sets last_set_table_tick
13065 for each register mentioned. Similar to mention_regs in cse.c */
13068 update_table_tick (rtx x
)
13070 enum rtx_code code
= GET_CODE (x
);
13071 const char *fmt
= GET_RTX_FORMAT (code
);
13076 unsigned int regno
= REGNO (x
);
13077 unsigned int endregno
= END_REGNO (x
);
13080 for (r
= regno
; r
< endregno
; r
++)
13082 reg_stat_type
*rsp
= ®_stat
[r
];
13083 rsp
->last_set_table_tick
= label_tick
;
13089 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
13092 /* Check for identical subexpressions. If x contains
13093 identical subexpression we only have to traverse one of
13095 if (i
== 0 && ARITHMETIC_P (x
))
13097 /* Note that at this point x1 has already been
13099 rtx x0
= XEXP (x
, 0);
13100 rtx x1
= XEXP (x
, 1);
13102 /* If x0 and x1 are identical then there is no need to
13107 /* If x0 is identical to a subexpression of x1 then while
13108 processing x1, x0 has already been processed. Thus we
13109 are done with x. */
13110 if (ARITHMETIC_P (x1
)
13111 && (x0
== XEXP (x1
, 0) || x0
== XEXP (x1
, 1)))
13114 /* If x1 is identical to a subexpression of x0 then we
13115 still have to process the rest of x0. */
13116 if (ARITHMETIC_P (x0
)
13117 && (x1
== XEXP (x0
, 0) || x1
== XEXP (x0
, 1)))
13119 update_table_tick (XEXP (x0
, x1
== XEXP (x0
, 0) ? 1 : 0));
13124 update_table_tick (XEXP (x
, i
));
13126 else if (fmt
[i
] == 'E')
13127 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
13128 update_table_tick (XVECEXP (x
, i
, j
));
13131 /* Record that REG is set to VALUE in insn INSN. If VALUE is zero, we
13132 are saying that the register is clobbered and we no longer know its
13133 value. If INSN is zero, don't update reg_stat[].last_set; this is
13134 only permitted with VALUE also zero and is used to invalidate the
13138 record_value_for_reg (rtx reg
, rtx_insn
*insn
, rtx value
)
13140 unsigned int regno
= REGNO (reg
);
13141 unsigned int endregno
= END_REGNO (reg
);
13143 reg_stat_type
*rsp
;
13145 /* If VALUE contains REG and we have a previous value for REG, substitute
13146 the previous value. */
13147 if (value
&& insn
&& reg_overlap_mentioned_p (reg
, value
))
13151 /* Set things up so get_last_value is allowed to see anything set up to
13153 subst_low_luid
= DF_INSN_LUID (insn
);
13154 tem
= get_last_value (reg
);
13156 /* If TEM is simply a binary operation with two CLOBBERs as operands,
13157 it isn't going to be useful and will take a lot of time to process,
13158 so just use the CLOBBER. */
13162 if (ARITHMETIC_P (tem
)
13163 && GET_CODE (XEXP (tem
, 0)) == CLOBBER
13164 && GET_CODE (XEXP (tem
, 1)) == CLOBBER
)
13165 tem
= XEXP (tem
, 0);
13166 else if (count_occurrences (value
, reg
, 1) >= 2)
13168 /* If there are two or more occurrences of REG in VALUE,
13169 prevent the value from growing too much. */
13170 if (count_rtxs (tem
) > MAX_LAST_VALUE_RTL
)
13171 tem
= gen_rtx_CLOBBER (GET_MODE (tem
), const0_rtx
);
13174 value
= replace_rtx (copy_rtx (value
), reg
, tem
);
13178 /* For each register modified, show we don't know its value, that
13179 we don't know about its bitwise content, that its value has been
13180 updated, and that we don't know the location of the death of the
13182 for (i
= regno
; i
< endregno
; i
++)
13184 rsp
= ®_stat
[i
];
13187 rsp
->last_set
= insn
;
13189 rsp
->last_set_value
= 0;
13190 rsp
->last_set_mode
= VOIDmode
;
13191 rsp
->last_set_nonzero_bits
= 0;
13192 rsp
->last_set_sign_bit_copies
= 0;
13193 rsp
->last_death
= 0;
13194 rsp
->truncated_to_mode
= VOIDmode
;
13197 /* Mark registers that are being referenced in this value. */
13199 update_table_tick (value
);
13201 /* Now update the status of each register being set.
13202 If someone is using this register in this block, set this register
13203 to invalid since we will get confused between the two lives in this
13204 basic block. This makes using this register always invalid. In cse, we
13205 scan the table to invalidate all entries using this register, but this
13206 is too much work for us. */
13208 for (i
= regno
; i
< endregno
; i
++)
13210 rsp
= ®_stat
[i
];
13211 rsp
->last_set_label
= label_tick
;
13213 || (value
&& rsp
->last_set_table_tick
>= label_tick_ebb_start
))
13214 rsp
->last_set_invalid
= 1;
13216 rsp
->last_set_invalid
= 0;
13219 /* The value being assigned might refer to X (like in "x++;"). In that
13220 case, we must replace it with (clobber (const_int 0)) to prevent
13222 rsp
= ®_stat
[regno
];
13223 if (value
&& !get_last_value_validate (&value
, insn
, label_tick
, 0))
13225 value
= copy_rtx (value
);
13226 if (!get_last_value_validate (&value
, insn
, label_tick
, 1))
13230 /* For the main register being modified, update the value, the mode, the
13231 nonzero bits, and the number of sign bit copies. */
13233 rsp
->last_set_value
= value
;
13237 machine_mode mode
= GET_MODE (reg
);
13238 subst_low_luid
= DF_INSN_LUID (insn
);
13239 rsp
->last_set_mode
= mode
;
13240 if (GET_MODE_CLASS (mode
) == MODE_INT
13241 && HWI_COMPUTABLE_MODE_P (mode
))
13242 mode
= nonzero_bits_mode
;
13243 rsp
->last_set_nonzero_bits
= nonzero_bits (value
, mode
);
13244 rsp
->last_set_sign_bit_copies
13245 = num_sign_bit_copies (value
, GET_MODE (reg
));
13249 /* Called via note_stores from record_dead_and_set_regs to handle one
13250 SET or CLOBBER in an insn. DATA is the instruction in which the
13251 set is occurring. */
13254 record_dead_and_set_regs_1 (rtx dest
, const_rtx setter
, void *data
)
13256 rtx_insn
*record_dead_insn
= (rtx_insn
*) data
;
13258 if (GET_CODE (dest
) == SUBREG
)
13259 dest
= SUBREG_REG (dest
);
13261 if (!record_dead_insn
)
13264 record_value_for_reg (dest
, NULL
, NULL_RTX
);
13270 /* If we are setting the whole register, we know its value. Otherwise
13271 show that we don't know the value. We can handle a SUBREG if it's
13272 the low part, but we must be careful with paradoxical SUBREGs on
13273 RISC architectures because we cannot strip e.g. an extension around
13274 a load and record the naked load since the RTL middle-end considers
13275 that the upper bits are defined according to LOAD_EXTEND_OP. */
13276 if (GET_CODE (setter
) == SET
&& dest
== SET_DEST (setter
))
13277 record_value_for_reg (dest
, record_dead_insn
, SET_SRC (setter
));
13278 else if (GET_CODE (setter
) == SET
13279 && GET_CODE (SET_DEST (setter
)) == SUBREG
13280 && SUBREG_REG (SET_DEST (setter
)) == dest
13281 && known_le (GET_MODE_PRECISION (GET_MODE (dest
)),
13283 && subreg_lowpart_p (SET_DEST (setter
)))
13284 record_value_for_reg (dest
, record_dead_insn
,
13285 WORD_REGISTER_OPERATIONS
13286 && paradoxical_subreg_p (SET_DEST (setter
))
13288 : gen_lowpart (GET_MODE (dest
),
13289 SET_SRC (setter
)));
13291 record_value_for_reg (dest
, record_dead_insn
, NULL_RTX
);
13293 else if (MEM_P (dest
)
13294 /* Ignore pushes, they clobber nothing. */
13295 && ! push_operand (dest
, GET_MODE (dest
)))
13296 mem_last_set
= DF_INSN_LUID (record_dead_insn
);
13299 /* Update the records of when each REG was most recently set or killed
13300 for the things done by INSN. This is the last thing done in processing
13301 INSN in the combiner loop.
13303 We update reg_stat[], in particular fields last_set, last_set_value,
13304 last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
13305 last_death, and also the similar information mem_last_set (which insn
13306 most recently modified memory) and last_call_luid (which insn was the
13307 most recent subroutine call). */
13310 record_dead_and_set_regs (rtx_insn
*insn
)
13315 for (link
= REG_NOTES (insn
); link
; link
= XEXP (link
, 1))
13317 if (REG_NOTE_KIND (link
) == REG_DEAD
13318 && REG_P (XEXP (link
, 0)))
13320 unsigned int regno
= REGNO (XEXP (link
, 0));
13321 unsigned int endregno
= END_REGNO (XEXP (link
, 0));
13323 for (i
= regno
; i
< endregno
; i
++)
13325 reg_stat_type
*rsp
;
13327 rsp
= ®_stat
[i
];
13328 rsp
->last_death
= insn
;
13331 else if (REG_NOTE_KIND (link
) == REG_INC
)
13332 record_value_for_reg (XEXP (link
, 0), insn
, NULL_RTX
);
13337 hard_reg_set_iterator hrsi
;
13338 EXECUTE_IF_SET_IN_HARD_REG_SET (regs_invalidated_by_call
, 0, i
, hrsi
)
13340 reg_stat_type
*rsp
;
13342 rsp
= ®_stat
[i
];
13343 rsp
->last_set_invalid
= 1;
13344 rsp
->last_set
= insn
;
13345 rsp
->last_set_value
= 0;
13346 rsp
->last_set_mode
= VOIDmode
;
13347 rsp
->last_set_nonzero_bits
= 0;
13348 rsp
->last_set_sign_bit_copies
= 0;
13349 rsp
->last_death
= 0;
13350 rsp
->truncated_to_mode
= VOIDmode
;
13353 last_call_luid
= mem_last_set
= DF_INSN_LUID (insn
);
13355 /* We can't combine into a call pattern. Remember, though, that
13356 the return value register is set at this LUID. We could
13357 still replace a register with the return value from the
13358 wrong subroutine call! */
13359 note_stores (PATTERN (insn
), record_dead_and_set_regs_1
, NULL_RTX
);
13362 note_stores (PATTERN (insn
), record_dead_and_set_regs_1
, insn
);
13365 /* If a SUBREG has the promoted bit set, it is in fact a property of the
13366 register present in the SUBREG, so for each such SUBREG go back and
13367 adjust nonzero and sign bit information of the registers that are
13368 known to have some zero/sign bits set.
13370 This is needed because when combine blows the SUBREGs away, the
13371 information on zero/sign bits is lost and further combines can be
13372 missed because of that. */
13375 record_promoted_value (rtx_insn
*insn
, rtx subreg
)
13377 struct insn_link
*links
;
13379 unsigned int regno
= REGNO (SUBREG_REG (subreg
));
13380 machine_mode mode
= GET_MODE (subreg
);
13382 if (!HWI_COMPUTABLE_MODE_P (mode
))
13385 for (links
= LOG_LINKS (insn
); links
;)
13387 reg_stat_type
*rsp
;
13389 insn
= links
->insn
;
13390 set
= single_set (insn
);
13392 if (! set
|| !REG_P (SET_DEST (set
))
13393 || REGNO (SET_DEST (set
)) != regno
13394 || GET_MODE (SET_DEST (set
)) != GET_MODE (SUBREG_REG (subreg
)))
13396 links
= links
->next
;
13400 rsp
= ®_stat
[regno
];
13401 if (rsp
->last_set
== insn
)
13403 if (SUBREG_PROMOTED_UNSIGNED_P (subreg
))
13404 rsp
->last_set_nonzero_bits
&= GET_MODE_MASK (mode
);
13407 if (REG_P (SET_SRC (set
)))
13409 regno
= REGNO (SET_SRC (set
));
13410 links
= LOG_LINKS (insn
);
13417 /* Check if X, a register, is known to contain a value already
13418 truncated to MODE. In this case we can use a subreg to refer to
13419 the truncated value even though in the generic case we would need
13420 an explicit truncation. */
13423 reg_truncated_to_mode (machine_mode mode
, const_rtx x
)
13425 reg_stat_type
*rsp
= ®_stat
[REGNO (x
)];
13426 machine_mode truncated
= rsp
->truncated_to_mode
;
13429 || rsp
->truncation_label
< label_tick_ebb_start
)
13431 if (!partial_subreg_p (mode
, truncated
))
13433 if (TRULY_NOOP_TRUNCATION_MODES_P (mode
, truncated
))
13438 /* If X is a hard reg or a subreg record the mode that the register is
13439 accessed in. For non-TARGET_TRULY_NOOP_TRUNCATION targets we might be
13440 able to turn a truncate into a subreg using this information. Return true
13441 if traversing X is complete. */
13444 record_truncated_value (rtx x
)
13446 machine_mode truncated_mode
;
13447 reg_stat_type
*rsp
;
13449 if (GET_CODE (x
) == SUBREG
&& REG_P (SUBREG_REG (x
)))
13451 machine_mode original_mode
= GET_MODE (SUBREG_REG (x
));
13452 truncated_mode
= GET_MODE (x
);
13454 if (!partial_subreg_p (truncated_mode
, original_mode
))
13457 truncated_mode
= GET_MODE (x
);
13458 if (TRULY_NOOP_TRUNCATION_MODES_P (truncated_mode
, original_mode
))
13461 x
= SUBREG_REG (x
);
13463 /* ??? For hard-regs we now record everything. We might be able to
13464 optimize this using last_set_mode. */
13465 else if (REG_P (x
) && REGNO (x
) < FIRST_PSEUDO_REGISTER
)
13466 truncated_mode
= GET_MODE (x
);
13470 rsp
= ®_stat
[REGNO (x
)];
13471 if (rsp
->truncated_to_mode
== 0
13472 || rsp
->truncation_label
< label_tick_ebb_start
13473 || partial_subreg_p (truncated_mode
, rsp
->truncated_to_mode
))
13475 rsp
->truncated_to_mode
= truncated_mode
;
13476 rsp
->truncation_label
= label_tick
;
13482 /* Callback for note_uses. Find hardregs and subregs of pseudos and
13483 the modes they are used in. This can help truning TRUNCATEs into
13487 record_truncated_values (rtx
*loc
, void *data ATTRIBUTE_UNUSED
)
13489 subrtx_var_iterator::array_type array
;
13490 FOR_EACH_SUBRTX_VAR (iter
, array
, *loc
, NONCONST
)
13491 if (record_truncated_value (*iter
))
13492 iter
.skip_subrtxes ();
13495 /* Scan X for promoted SUBREGs. For each one found,
13496 note what it implies to the registers used in it. */
13499 check_promoted_subreg (rtx_insn
*insn
, rtx x
)
13501 if (GET_CODE (x
) == SUBREG
13502 && SUBREG_PROMOTED_VAR_P (x
)
13503 && REG_P (SUBREG_REG (x
)))
13504 record_promoted_value (insn
, x
);
13507 const char *format
= GET_RTX_FORMAT (GET_CODE (x
));
13510 for (i
= 0; i
< GET_RTX_LENGTH (GET_CODE (x
)); i
++)
13514 check_promoted_subreg (insn
, XEXP (x
, i
));
13518 if (XVEC (x
, i
) != 0)
13519 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
13520 check_promoted_subreg (insn
, XVECEXP (x
, i
, j
));
13526 /* Verify that all the registers and memory references mentioned in *LOC are
13527 still valid. *LOC was part of a value set in INSN when label_tick was
13528 equal to TICK. Return 0 if some are not. If REPLACE is nonzero, replace
13529 the invalid references with (clobber (const_int 0)) and return 1. This
13530 replacement is useful because we often can get useful information about
13531 the form of a value (e.g., if it was produced by a shift that always
13532 produces -1 or 0) even though we don't know exactly what registers it
13533 was produced from. */
13536 get_last_value_validate (rtx
*loc
, rtx_insn
*insn
, int tick
, int replace
)
13539 const char *fmt
= GET_RTX_FORMAT (GET_CODE (x
));
13540 int len
= GET_RTX_LENGTH (GET_CODE (x
));
13545 unsigned int regno
= REGNO (x
);
13546 unsigned int endregno
= END_REGNO (x
);
13549 for (j
= regno
; j
< endregno
; j
++)
13551 reg_stat_type
*rsp
= ®_stat
[j
];
13552 if (rsp
->last_set_invalid
13553 /* If this is a pseudo-register that was only set once and not
13554 live at the beginning of the function, it is always valid. */
13555 || (! (regno
>= FIRST_PSEUDO_REGISTER
13556 && regno
< reg_n_sets_max
13557 && REG_N_SETS (regno
) == 1
13558 && (!REGNO_REG_SET_P
13559 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->next_bb
),
13561 && rsp
->last_set_label
> tick
))
13564 *loc
= gen_rtx_CLOBBER (GET_MODE (x
), const0_rtx
);
13571 /* If this is a memory reference, make sure that there were no stores after
13572 it that might have clobbered the value. We don't have alias info, so we
13573 assume any store invalidates it. Moreover, we only have local UIDs, so
13574 we also assume that there were stores in the intervening basic blocks. */
13575 else if (MEM_P (x
) && !MEM_READONLY_P (x
)
13576 && (tick
!= label_tick
|| DF_INSN_LUID (insn
) <= mem_last_set
))
13579 *loc
= gen_rtx_CLOBBER (GET_MODE (x
), const0_rtx
);
13583 for (i
= 0; i
< len
; i
++)
13587 /* Check for identical subexpressions. If x contains
13588 identical subexpression we only have to traverse one of
13590 if (i
== 1 && ARITHMETIC_P (x
))
13592 /* Note that at this point x0 has already been checked
13593 and found valid. */
13594 rtx x0
= XEXP (x
, 0);
13595 rtx x1
= XEXP (x
, 1);
13597 /* If x0 and x1 are identical then x is also valid. */
13601 /* If x1 is identical to a subexpression of x0 then
13602 while checking x0, x1 has already been checked. Thus
13603 it is valid and so as x. */
13604 if (ARITHMETIC_P (x0
)
13605 && (x1
== XEXP (x0
, 0) || x1
== XEXP (x0
, 1)))
13608 /* If x0 is identical to a subexpression of x1 then x is
13609 valid iff the rest of x1 is valid. */
13610 if (ARITHMETIC_P (x1
)
13611 && (x0
== XEXP (x1
, 0) || x0
== XEXP (x1
, 1)))
13613 get_last_value_validate (&XEXP (x1
,
13614 x0
== XEXP (x1
, 0) ? 1 : 0),
13615 insn
, tick
, replace
);
13618 if (get_last_value_validate (&XEXP (x
, i
), insn
, tick
,
13622 else if (fmt
[i
] == 'E')
13623 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
13624 if (get_last_value_validate (&XVECEXP (x
, i
, j
),
13625 insn
, tick
, replace
) == 0)
13629 /* If we haven't found a reason for it to be invalid, it is valid. */
13633 /* Get the last value assigned to X, if known. Some registers
13634 in the value may be replaced with (clobber (const_int 0)) if their value
13635 is known longer known reliably. */
13638 get_last_value (const_rtx x
)
13640 unsigned int regno
;
13642 reg_stat_type
*rsp
;
13644 /* If this is a non-paradoxical SUBREG, get the value of its operand and
13645 then convert it to the desired mode. If this is a paradoxical SUBREG,
13646 we cannot predict what values the "extra" bits might have. */
13647 if (GET_CODE (x
) == SUBREG
13648 && subreg_lowpart_p (x
)
13649 && !paradoxical_subreg_p (x
)
13650 && (value
= get_last_value (SUBREG_REG (x
))) != 0)
13651 return gen_lowpart (GET_MODE (x
), value
);
13657 rsp
= ®_stat
[regno
];
13658 value
= rsp
->last_set_value
;
13660 /* If we don't have a value, or if it isn't for this basic block and
13661 it's either a hard register, set more than once, or it's a live
13662 at the beginning of the function, return 0.
13664 Because if it's not live at the beginning of the function then the reg
13665 is always set before being used (is never used without being set).
13666 And, if it's set only once, and it's always set before use, then all
13667 uses must have the same last value, even if it's not from this basic
13671 || (rsp
->last_set_label
< label_tick_ebb_start
13672 && (regno
< FIRST_PSEUDO_REGISTER
13673 || regno
>= reg_n_sets_max
13674 || REG_N_SETS (regno
) != 1
13676 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->next_bb
), regno
))))
13679 /* If the value was set in a later insn than the ones we are processing,
13680 we can't use it even if the register was only set once. */
13681 if (rsp
->last_set_label
== label_tick
13682 && DF_INSN_LUID (rsp
->last_set
) >= subst_low_luid
)
13685 /* If fewer bits were set than what we are asked for now, we cannot use
13687 if (maybe_lt (GET_MODE_PRECISION (rsp
->last_set_mode
),
13688 GET_MODE_PRECISION (GET_MODE (x
))))
13691 /* If the value has all its registers valid, return it. */
13692 if (get_last_value_validate (&value
, rsp
->last_set
, rsp
->last_set_label
, 0))
13695 /* Otherwise, make a copy and replace any invalid register with
13696 (clobber (const_int 0)). If that fails for some reason, return 0. */
13698 value
= copy_rtx (value
);
13699 if (get_last_value_validate (&value
, rsp
->last_set
, rsp
->last_set_label
, 1))
13705 /* Define three variables used for communication between the following
13708 static unsigned int reg_dead_regno
, reg_dead_endregno
;
13709 static int reg_dead_flag
;
13711 /* Function called via note_stores from reg_dead_at_p.
13713 If DEST is within [reg_dead_regno, reg_dead_endregno), set
13714 reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET. */
13717 reg_dead_at_p_1 (rtx dest
, const_rtx x
, void *data ATTRIBUTE_UNUSED
)
13719 unsigned int regno
, endregno
;
13724 regno
= REGNO (dest
);
13725 endregno
= END_REGNO (dest
);
13726 if (reg_dead_endregno
> regno
&& reg_dead_regno
< endregno
)
13727 reg_dead_flag
= (GET_CODE (x
) == CLOBBER
) ? 1 : -1;
13730 /* Return nonzero if REG is known to be dead at INSN.
13732 We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER
13733 referencing REG, it is dead. If we hit a SET referencing REG, it is
13734 live. Otherwise, see if it is live or dead at the start of the basic
13735 block we are in. Hard regs marked as being live in NEWPAT_USED_REGS
13736 must be assumed to be always live. */
13739 reg_dead_at_p (rtx reg
, rtx_insn
*insn
)
13744 /* Set variables for reg_dead_at_p_1. */
13745 reg_dead_regno
= REGNO (reg
);
13746 reg_dead_endregno
= END_REGNO (reg
);
13750 /* Check that reg isn't mentioned in NEWPAT_USED_REGS. For fixed registers
13751 we allow the machine description to decide whether use-and-clobber
13752 patterns are OK. */
13753 if (reg_dead_regno
< FIRST_PSEUDO_REGISTER
)
13755 for (i
= reg_dead_regno
; i
< reg_dead_endregno
; i
++)
13756 if (!fixed_regs
[i
] && TEST_HARD_REG_BIT (newpat_used_regs
, i
))
13760 /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, or
13761 beginning of basic block. */
13762 block
= BLOCK_FOR_INSN (insn
);
13767 if (find_regno_note (insn
, REG_UNUSED
, reg_dead_regno
))
13770 note_stores (PATTERN (insn
), reg_dead_at_p_1
, NULL
);
13772 return reg_dead_flag
== 1 ? 1 : 0;
13774 if (find_regno_note (insn
, REG_DEAD
, reg_dead_regno
))
13778 if (insn
== BB_HEAD (block
))
13781 insn
= PREV_INSN (insn
);
13784 /* Look at live-in sets for the basic block that we were in. */
13785 for (i
= reg_dead_regno
; i
< reg_dead_endregno
; i
++)
13786 if (REGNO_REG_SET_P (df_get_live_in (block
), i
))
13792 /* Note hard registers in X that are used. */
13795 mark_used_regs_combine (rtx x
)
13797 RTX_CODE code
= GET_CODE (x
);
13798 unsigned int regno
;
13809 case ADDR_DIFF_VEC
:
13811 /* CC0 must die in the insn after it is set, so we don't need to take
13812 special note of it here. */
13817 /* If we are clobbering a MEM, mark any hard registers inside the
13818 address as used. */
13819 if (MEM_P (XEXP (x
, 0)))
13820 mark_used_regs_combine (XEXP (XEXP (x
, 0), 0));
13825 /* A hard reg in a wide mode may really be multiple registers.
13826 If so, mark all of them just like the first. */
13827 if (regno
< FIRST_PSEUDO_REGISTER
)
13829 /* None of this applies to the stack, frame or arg pointers. */
13830 if (regno
== STACK_POINTER_REGNUM
13831 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER
13832 && regno
== HARD_FRAME_POINTER_REGNUM
)
13833 || (FRAME_POINTER_REGNUM
!= ARG_POINTER_REGNUM
13834 && regno
== ARG_POINTER_REGNUM
&& fixed_regs
[regno
])
13835 || regno
== FRAME_POINTER_REGNUM
)
13838 add_to_hard_reg_set (&newpat_used_regs
, GET_MODE (x
), regno
);
13844 /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
13846 rtx testreg
= SET_DEST (x
);
13848 while (GET_CODE (testreg
) == SUBREG
13849 || GET_CODE (testreg
) == ZERO_EXTRACT
13850 || GET_CODE (testreg
) == STRICT_LOW_PART
)
13851 testreg
= XEXP (testreg
, 0);
13853 if (MEM_P (testreg
))
13854 mark_used_regs_combine (XEXP (testreg
, 0));
13856 mark_used_regs_combine (SET_SRC (x
));
13864 /* Recursively scan the operands of this expression. */
13867 const char *fmt
= GET_RTX_FORMAT (code
);
13869 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
13872 mark_used_regs_combine (XEXP (x
, i
));
13873 else if (fmt
[i
] == 'E')
13877 for (j
= 0; j
< XVECLEN (x
, i
); j
++)
13878 mark_used_regs_combine (XVECEXP (x
, i
, j
));
13884 /* Remove register number REGNO from the dead registers list of INSN.
13886 Return the note used to record the death, if there was one. */
13889 remove_death (unsigned int regno
, rtx_insn
*insn
)
13891 rtx note
= find_regno_note (insn
, REG_DEAD
, regno
);
13894 remove_note (insn
, note
);
13899 /* For each register (hardware or pseudo) used within expression X, if its
13900 death is in an instruction with luid between FROM_LUID (inclusive) and
13901 TO_INSN (exclusive), put a REG_DEAD note for that register in the
13902 list headed by PNOTES.
13904 That said, don't move registers killed by maybe_kill_insn.
13906 This is done when X is being merged by combination into TO_INSN. These
13907 notes will then be distributed as needed. */
13910 move_deaths (rtx x
, rtx maybe_kill_insn
, int from_luid
, rtx_insn
*to_insn
,
13915 enum rtx_code code
= GET_CODE (x
);
13919 unsigned int regno
= REGNO (x
);
13920 rtx_insn
*where_dead
= reg_stat
[regno
].last_death
;
13922 /* If we do not know where the register died, it may still die between
13923 FROM_LUID and TO_INSN. If so, find it. This is PR83304. */
13924 if (!where_dead
|| DF_INSN_LUID (where_dead
) >= DF_INSN_LUID (to_insn
))
13926 rtx_insn
*insn
= prev_real_nondebug_insn (to_insn
);
13928 && BLOCK_FOR_INSN (insn
) == BLOCK_FOR_INSN (to_insn
)
13929 && DF_INSN_LUID (insn
) >= from_luid
)
13931 if (dead_or_set_regno_p (insn
, regno
))
13933 if (find_regno_note (insn
, REG_DEAD
, regno
))
13938 insn
= prev_real_nondebug_insn (insn
);
13942 /* Don't move the register if it gets killed in between from and to. */
13943 if (maybe_kill_insn
&& reg_set_p (x
, maybe_kill_insn
)
13944 && ! reg_referenced_p (x
, maybe_kill_insn
))
13948 && BLOCK_FOR_INSN (where_dead
) == BLOCK_FOR_INSN (to_insn
)
13949 && DF_INSN_LUID (where_dead
) >= from_luid
13950 && DF_INSN_LUID (where_dead
) < DF_INSN_LUID (to_insn
))
13952 rtx note
= remove_death (regno
, where_dead
);
13954 /* It is possible for the call above to return 0. This can occur
13955 when last_death points to I2 or I1 that we combined with.
13956 In that case make a new note.
13958 We must also check for the case where X is a hard register
13959 and NOTE is a death note for a range of hard registers
13960 including X. In that case, we must put REG_DEAD notes for
13961 the remaining registers in place of NOTE. */
13963 if (note
!= 0 && regno
< FIRST_PSEUDO_REGISTER
13964 && partial_subreg_p (GET_MODE (x
), GET_MODE (XEXP (note
, 0))))
13966 unsigned int deadregno
= REGNO (XEXP (note
, 0));
13967 unsigned int deadend
= END_REGNO (XEXP (note
, 0));
13968 unsigned int ourend
= END_REGNO (x
);
13971 for (i
= deadregno
; i
< deadend
; i
++)
13972 if (i
< regno
|| i
>= ourend
)
13973 add_reg_note (where_dead
, REG_DEAD
, regno_reg_rtx
[i
]);
13976 /* If we didn't find any note, or if we found a REG_DEAD note that
13977 covers only part of the given reg, and we have a multi-reg hard
13978 register, then to be safe we must check for REG_DEAD notes
13979 for each register other than the first. They could have
13980 their own REG_DEAD notes lying around. */
13981 else if ((note
== 0
13983 && partial_subreg_p (GET_MODE (XEXP (note
, 0)),
13985 && regno
< FIRST_PSEUDO_REGISTER
13986 && REG_NREGS (x
) > 1)
13988 unsigned int ourend
= END_REGNO (x
);
13989 unsigned int i
, offset
;
13993 offset
= hard_regno_nregs (regno
, GET_MODE (XEXP (note
, 0)));
13997 for (i
= regno
+ offset
; i
< ourend
; i
++)
13998 move_deaths (regno_reg_rtx
[i
],
13999 maybe_kill_insn
, from_luid
, to_insn
, &oldnotes
);
14002 if (note
!= 0 && GET_MODE (XEXP (note
, 0)) == GET_MODE (x
))
14004 XEXP (note
, 1) = *pnotes
;
14008 *pnotes
= alloc_reg_note (REG_DEAD
, x
, *pnotes
);
14014 else if (GET_CODE (x
) == SET
)
14016 rtx dest
= SET_DEST (x
);
14018 move_deaths (SET_SRC (x
), maybe_kill_insn
, from_luid
, to_insn
, pnotes
);
14020 /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
14021 that accesses one word of a multi-word item, some
14022 piece of everything register in the expression is used by
14023 this insn, so remove any old death. */
14024 /* ??? So why do we test for equality of the sizes? */
14026 if (GET_CODE (dest
) == ZERO_EXTRACT
14027 || GET_CODE (dest
) == STRICT_LOW_PART
14028 || (GET_CODE (dest
) == SUBREG
14029 && !read_modify_subreg_p (dest
)))
14031 move_deaths (dest
, maybe_kill_insn
, from_luid
, to_insn
, pnotes
);
14035 /* If this is some other SUBREG, we know it replaces the entire
14036 value, so use that as the destination. */
14037 if (GET_CODE (dest
) == SUBREG
)
14038 dest
= SUBREG_REG (dest
);
14040 /* If this is a MEM, adjust deaths of anything used in the address.
14041 For a REG (the only other possibility), the entire value is
14042 being replaced so the old value is not used in this insn. */
14045 move_deaths (XEXP (dest
, 0), maybe_kill_insn
, from_luid
,
14050 else if (GET_CODE (x
) == CLOBBER
)
14053 len
= GET_RTX_LENGTH (code
);
14054 fmt
= GET_RTX_FORMAT (code
);
14056 for (i
= 0; i
< len
; i
++)
14061 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
14062 move_deaths (XVECEXP (x
, i
, j
), maybe_kill_insn
, from_luid
,
14065 else if (fmt
[i
] == 'e')
14066 move_deaths (XEXP (x
, i
), maybe_kill_insn
, from_luid
, to_insn
, pnotes
);
14070 /* Return 1 if X is the target of a bit-field assignment in BODY, the
14071 pattern of an insn. X must be a REG. */
14074 reg_bitfield_target_p (rtx x
, rtx body
)
14078 if (GET_CODE (body
) == SET
)
14080 rtx dest
= SET_DEST (body
);
14082 unsigned int regno
, tregno
, endregno
, endtregno
;
14084 if (GET_CODE (dest
) == ZERO_EXTRACT
)
14085 target
= XEXP (dest
, 0);
14086 else if (GET_CODE (dest
) == STRICT_LOW_PART
)
14087 target
= SUBREG_REG (XEXP (dest
, 0));
14091 if (GET_CODE (target
) == SUBREG
)
14092 target
= SUBREG_REG (target
);
14094 if (!REG_P (target
))
14097 tregno
= REGNO (target
), regno
= REGNO (x
);
14098 if (tregno
>= FIRST_PSEUDO_REGISTER
|| regno
>= FIRST_PSEUDO_REGISTER
)
14099 return target
== x
;
14101 endtregno
= end_hard_regno (GET_MODE (target
), tregno
);
14102 endregno
= end_hard_regno (GET_MODE (x
), regno
);
14104 return endregno
> tregno
&& regno
< endtregno
;
14107 else if (GET_CODE (body
) == PARALLEL
)
14108 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
14109 if (reg_bitfield_target_p (x
, XVECEXP (body
, 0, i
)))
14115 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
14116 as appropriate. I3 and I2 are the insns resulting from the combination
14117 insns including FROM (I2 may be zero).
14119 ELIM_I2 and ELIM_I1 are either zero or registers that we know will
14120 not need REG_DEAD notes because they are being substituted for. This
14121 saves searching in the most common cases.
14123 Each note in the list is either ignored or placed on some insns, depending
14124 on the type of note. */
14127 distribute_notes (rtx notes
, rtx_insn
*from_insn
, rtx_insn
*i3
, rtx_insn
*i2
,
14128 rtx elim_i2
, rtx elim_i1
, rtx elim_i0
)
14130 rtx note
, next_note
;
14132 rtx_insn
*tem_insn
;
14134 for (note
= notes
; note
; note
= next_note
)
14136 rtx_insn
*place
= 0, *place2
= 0;
14138 next_note
= XEXP (note
, 1);
14139 switch (REG_NOTE_KIND (note
))
14143 /* Doesn't matter much where we put this, as long as it's somewhere.
14144 It is preferable to keep these notes on branches, which is most
14145 likely to be i3. */
14149 case REG_NON_LOCAL_GOTO
:
14154 gcc_assert (i2
&& JUMP_P (i2
));
14159 case REG_EH_REGION
:
14160 /* These notes must remain with the call or trapping instruction. */
14163 else if (i2
&& CALL_P (i2
))
14167 gcc_assert (cfun
->can_throw_non_call_exceptions
);
14168 if (may_trap_p (i3
))
14170 else if (i2
&& may_trap_p (i2
))
14172 /* ??? Otherwise assume we've combined things such that we
14173 can now prove that the instructions can't trap. Drop the
14174 note in this case. */
14178 case REG_ARGS_SIZE
:
14179 /* ??? How to distribute between i3-i1. Assume i3 contains the
14180 entire adjustment. Assert i3 contains at least some adjust. */
14181 if (!noop_move_p (i3
))
14183 poly_int64 old_size
, args_size
= get_args_size (note
);
14184 /* fixup_args_size_notes looks at REG_NORETURN note,
14185 so ensure the note is placed there first. */
14189 for (np
= &next_note
; *np
; np
= &XEXP (*np
, 1))
14190 if (REG_NOTE_KIND (*np
) == REG_NORETURN
)
14194 XEXP (n
, 1) = REG_NOTES (i3
);
14195 REG_NOTES (i3
) = n
;
14199 old_size
= fixup_args_size_notes (PREV_INSN (i3
), i3
, args_size
);
14200 /* emit_call_1 adds for !ACCUMULATE_OUTGOING_ARGS
14201 REG_ARGS_SIZE note to all noreturn calls, allow that here. */
14202 gcc_assert (maybe_ne (old_size
, args_size
)
14204 && !ACCUMULATE_OUTGOING_ARGS
14205 && find_reg_note (i3
, REG_NORETURN
, NULL_RTX
)));
14212 case REG_CALL_DECL
:
14213 case REG_CALL_NOCF_CHECK
:
14214 /* These notes must remain with the call. It should not be
14215 possible for both I2 and I3 to be a call. */
14220 gcc_assert (i2
&& CALL_P (i2
));
14226 /* Any clobbers for i3 may still exist, and so we must process
14227 REG_UNUSED notes from that insn.
14229 Any clobbers from i2 or i1 can only exist if they were added by
14230 recog_for_combine. In that case, recog_for_combine created the
14231 necessary REG_UNUSED notes. Trying to keep any original
14232 REG_UNUSED notes from these insns can cause incorrect output
14233 if it is for the same register as the original i3 dest.
14234 In that case, we will notice that the register is set in i3,
14235 and then add a REG_UNUSED note for the destination of i3, which
14236 is wrong. However, it is possible to have REG_UNUSED notes from
14237 i2 or i1 for register which were both used and clobbered, so
14238 we keep notes from i2 or i1 if they will turn into REG_DEAD
14241 /* If this register is set or clobbered in I3, put the note there
14242 unless there is one already. */
14243 if (reg_set_p (XEXP (note
, 0), PATTERN (i3
)))
14245 if (from_insn
!= i3
)
14248 if (! (REG_P (XEXP (note
, 0))
14249 ? find_regno_note (i3
, REG_UNUSED
, REGNO (XEXP (note
, 0)))
14250 : find_reg_note (i3
, REG_UNUSED
, XEXP (note
, 0))))
14253 /* Otherwise, if this register is used by I3, then this register
14254 now dies here, so we must put a REG_DEAD note here unless there
14256 else if (reg_referenced_p (XEXP (note
, 0), PATTERN (i3
))
14257 && ! (REG_P (XEXP (note
, 0))
14258 ? find_regno_note (i3
, REG_DEAD
,
14259 REGNO (XEXP (note
, 0)))
14260 : find_reg_note (i3
, REG_DEAD
, XEXP (note
, 0))))
14262 PUT_REG_NOTE_KIND (note
, REG_DEAD
);
14266 /* A SET or CLOBBER of the REG_UNUSED reg has been removed,
14267 but we can't tell which at this point. We must reset any
14268 expectations we had about the value that was previously
14269 stored in the reg. ??? Ideally, we'd adjust REG_N_SETS
14270 and, if appropriate, restore its previous value, but we
14271 don't have enough information for that at this point. */
14274 record_value_for_reg (XEXP (note
, 0), NULL
, NULL_RTX
);
14276 /* Otherwise, if this register is now referenced in i2
14277 then the register used to be modified in one of the
14278 original insns. If it was i3 (say, in an unused
14279 parallel), it's now completely gone, so the note can
14280 be discarded. But if it was modified in i2, i1 or i0
14281 and we still reference it in i2, then we're
14282 referencing the previous value, and since the
14283 register was modified and REG_UNUSED, we know that
14284 the previous value is now dead. So, if we only
14285 reference the register in i2, we change the note to
14286 REG_DEAD, to reflect the previous value. However, if
14287 we're also setting or clobbering the register as
14288 scratch, we know (because the register was not
14289 referenced in i3) that it's unused, just as it was
14290 unused before, and we place the note in i2. */
14291 if (from_insn
!= i3
&& i2
&& INSN_P (i2
)
14292 && reg_referenced_p (XEXP (note
, 0), PATTERN (i2
)))
14294 if (!reg_set_p (XEXP (note
, 0), PATTERN (i2
)))
14295 PUT_REG_NOTE_KIND (note
, REG_DEAD
);
14296 if (! (REG_P (XEXP (note
, 0))
14297 ? find_regno_note (i2
, REG_NOTE_KIND (note
),
14298 REGNO (XEXP (note
, 0)))
14299 : find_reg_note (i2
, REG_NOTE_KIND (note
),
14310 /* These notes say something about results of an insn. We can
14311 only support them if they used to be on I3 in which case they
14312 remain on I3. Otherwise they are ignored.
14314 If the note refers to an expression that is not a constant, we
14315 must also ignore the note since we cannot tell whether the
14316 equivalence is still true. It might be possible to do
14317 slightly better than this (we only have a problem if I2DEST
14318 or I1DEST is present in the expression), but it doesn't
14319 seem worth the trouble. */
14321 if (from_insn
== i3
14322 && (XEXP (note
, 0) == 0 || CONSTANT_P (XEXP (note
, 0))))
14327 /* These notes say something about how a register is used. They must
14328 be present on any use of the register in I2 or I3. */
14329 if (reg_mentioned_p (XEXP (note
, 0), PATTERN (i3
)))
14332 if (i2
&& reg_mentioned_p (XEXP (note
, 0), PATTERN (i2
)))
14341 case REG_LABEL_TARGET
:
14342 case REG_LABEL_OPERAND
:
14343 /* This can show up in several ways -- either directly in the
14344 pattern, or hidden off in the constant pool with (or without?)
14345 a REG_EQUAL note. */
14346 /* ??? Ignore the without-reg_equal-note problem for now. */
14347 if (reg_mentioned_p (XEXP (note
, 0), PATTERN (i3
))
14348 || ((tem_note
= find_reg_note (i3
, REG_EQUAL
, NULL_RTX
))
14349 && GET_CODE (XEXP (tem_note
, 0)) == LABEL_REF
14350 && label_ref_label (XEXP (tem_note
, 0)) == XEXP (note
, 0)))
14354 && (reg_mentioned_p (XEXP (note
, 0), PATTERN (i2
))
14355 || ((tem_note
= find_reg_note (i2
, REG_EQUAL
, NULL_RTX
))
14356 && GET_CODE (XEXP (tem_note
, 0)) == LABEL_REF
14357 && label_ref_label (XEXP (tem_note
, 0)) == XEXP (note
, 0))))
14365 /* For REG_LABEL_TARGET on a JUMP_P, we prefer to put the note
14366 as a JUMP_LABEL or decrement LABEL_NUSES if it's already
14368 if (place
&& JUMP_P (place
)
14369 && REG_NOTE_KIND (note
) == REG_LABEL_TARGET
14370 && (JUMP_LABEL (place
) == NULL
14371 || JUMP_LABEL (place
) == XEXP (note
, 0)))
14373 rtx label
= JUMP_LABEL (place
);
14376 JUMP_LABEL (place
) = XEXP (note
, 0);
14377 else if (LABEL_P (label
))
14378 LABEL_NUSES (label
)--;
14381 if (place2
&& JUMP_P (place2
)
14382 && REG_NOTE_KIND (note
) == REG_LABEL_TARGET
14383 && (JUMP_LABEL (place2
) == NULL
14384 || JUMP_LABEL (place2
) == XEXP (note
, 0)))
14386 rtx label
= JUMP_LABEL (place2
);
14389 JUMP_LABEL (place2
) = XEXP (note
, 0);
14390 else if (LABEL_P (label
))
14391 LABEL_NUSES (label
)--;
14397 /* This note says something about the value of a register prior
14398 to the execution of an insn. It is too much trouble to see
14399 if the note is still correct in all situations. It is better
14400 to simply delete it. */
14404 /* If we replaced the right hand side of FROM_INSN with a
14405 REG_EQUAL note, the original use of the dying register
14406 will not have been combined into I3 and I2. In such cases,
14407 FROM_INSN is guaranteed to be the first of the combined
14408 instructions, so we simply need to search back before
14409 FROM_INSN for the previous use or set of this register,
14410 then alter the notes there appropriately.
14412 If the register is used as an input in I3, it dies there.
14413 Similarly for I2, if it is nonzero and adjacent to I3.
14415 If the register is not used as an input in either I3 or I2
14416 and it is not one of the registers we were supposed to eliminate,
14417 there are two possibilities. We might have a non-adjacent I2
14418 or we might have somehow eliminated an additional register
14419 from a computation. For example, we might have had A & B where
14420 we discover that B will always be zero. In this case we will
14421 eliminate the reference to A.
14423 In both cases, we must search to see if we can find a previous
14424 use of A and put the death note there. */
14427 && from_insn
== i2mod
14428 && !reg_overlap_mentioned_p (XEXP (note
, 0), i2mod_new_rhs
))
14429 tem_insn
= from_insn
;
14433 && CALL_P (from_insn
)
14434 && find_reg_fusage (from_insn
, USE
, XEXP (note
, 0)))
14436 else if (i2
&& reg_set_p (XEXP (note
, 0), PATTERN (i2
)))
14438 /* If the new I2 sets the same register that is marked
14439 dead in the note, we do not in general know where to
14440 put the note. One important case we _can_ handle is
14441 when the note comes from I3. */
14442 if (from_insn
== i3
)
14447 else if (reg_referenced_p (XEXP (note
, 0), PATTERN (i3
)))
14449 else if (i2
!= 0 && next_nonnote_nondebug_insn (i2
) == i3
14450 && reg_referenced_p (XEXP (note
, 0), PATTERN (i2
)))
14452 else if ((rtx_equal_p (XEXP (note
, 0), elim_i2
)
14454 && reg_overlap_mentioned_p (XEXP (note
, 0),
14456 || rtx_equal_p (XEXP (note
, 0), elim_i1
)
14457 || rtx_equal_p (XEXP (note
, 0), elim_i0
))
14464 basic_block bb
= this_basic_block
;
14466 for (tem_insn
= PREV_INSN (tem_insn
); place
== 0; tem_insn
= PREV_INSN (tem_insn
))
14468 if (!NONDEBUG_INSN_P (tem_insn
))
14470 if (tem_insn
== BB_HEAD (bb
))
14475 /* If the register is being set at TEM_INSN, see if that is all
14476 TEM_INSN is doing. If so, delete TEM_INSN. Otherwise, make this
14477 into a REG_UNUSED note instead. Don't delete sets to
14478 global register vars. */
14479 if ((REGNO (XEXP (note
, 0)) >= FIRST_PSEUDO_REGISTER
14480 || !global_regs
[REGNO (XEXP (note
, 0))])
14481 && reg_set_p (XEXP (note
, 0), PATTERN (tem_insn
)))
14483 rtx set
= single_set (tem_insn
);
14484 rtx inner_dest
= 0;
14485 rtx_insn
*cc0_setter
= NULL
;
14488 for (inner_dest
= SET_DEST (set
);
14489 (GET_CODE (inner_dest
) == STRICT_LOW_PART
14490 || GET_CODE (inner_dest
) == SUBREG
14491 || GET_CODE (inner_dest
) == ZERO_EXTRACT
);
14492 inner_dest
= XEXP (inner_dest
, 0))
14495 /* Verify that it was the set, and not a clobber that
14496 modified the register.
14498 CC0 targets must be careful to maintain setter/user
14499 pairs. If we cannot delete the setter due to side
14500 effects, mark the user with an UNUSED note instead
14503 if (set
!= 0 && ! side_effects_p (SET_SRC (set
))
14504 && rtx_equal_p (XEXP (note
, 0), inner_dest
)
14506 || (! reg_mentioned_p (cc0_rtx
, SET_SRC (set
))
14507 || ((cc0_setter
= prev_cc0_setter (tem_insn
)) != NULL
14508 && sets_cc0_p (PATTERN (cc0_setter
)) > 0))))
14510 /* Move the notes and links of TEM_INSN elsewhere.
14511 This might delete other dead insns recursively.
14512 First set the pattern to something that won't use
14514 rtx old_notes
= REG_NOTES (tem_insn
);
14516 PATTERN (tem_insn
) = pc_rtx
;
14517 REG_NOTES (tem_insn
) = NULL
;
14519 distribute_notes (old_notes
, tem_insn
, tem_insn
, NULL
,
14520 NULL_RTX
, NULL_RTX
, NULL_RTX
);
14521 distribute_links (LOG_LINKS (tem_insn
));
14523 unsigned int regno
= REGNO (XEXP (note
, 0));
14524 reg_stat_type
*rsp
= ®_stat
[regno
];
14525 if (rsp
->last_set
== tem_insn
)
14526 record_value_for_reg (XEXP (note
, 0), NULL
, NULL_RTX
);
14528 SET_INSN_DELETED (tem_insn
);
14529 if (tem_insn
== i2
)
14532 /* Delete the setter too. */
14535 PATTERN (cc0_setter
) = pc_rtx
;
14536 old_notes
= REG_NOTES (cc0_setter
);
14537 REG_NOTES (cc0_setter
) = NULL
;
14539 distribute_notes (old_notes
, cc0_setter
,
14541 NULL_RTX
, NULL_RTX
, NULL_RTX
);
14542 distribute_links (LOG_LINKS (cc0_setter
));
14544 SET_INSN_DELETED (cc0_setter
);
14545 if (cc0_setter
== i2
)
14551 PUT_REG_NOTE_KIND (note
, REG_UNUSED
);
14553 /* If there isn't already a REG_UNUSED note, put one
14554 here. Do not place a REG_DEAD note, even if
14555 the register is also used here; that would not
14556 match the algorithm used in lifetime analysis
14557 and can cause the consistency check in the
14558 scheduler to fail. */
14559 if (! find_regno_note (tem_insn
, REG_UNUSED
,
14560 REGNO (XEXP (note
, 0))))
14565 else if (reg_referenced_p (XEXP (note
, 0), PATTERN (tem_insn
))
14566 || (CALL_P (tem_insn
)
14567 && find_reg_fusage (tem_insn
, USE
, XEXP (note
, 0))))
14571 /* If we are doing a 3->2 combination, and we have a
14572 register which formerly died in i3 and was not used
14573 by i2, which now no longer dies in i3 and is used in
14574 i2 but does not die in i2, and place is between i2
14575 and i3, then we may need to move a link from place to
14577 if (i2
&& DF_INSN_LUID (place
) > DF_INSN_LUID (i2
)
14579 && DF_INSN_LUID (from_insn
) > DF_INSN_LUID (i2
)
14580 && reg_referenced_p (XEXP (note
, 0), PATTERN (i2
)))
14582 struct insn_link
*links
= LOG_LINKS (place
);
14583 LOG_LINKS (place
) = NULL
;
14584 distribute_links (links
);
14589 if (tem_insn
== BB_HEAD (bb
))
14595 /* If the register is set or already dead at PLACE, we needn't do
14596 anything with this note if it is still a REG_DEAD note.
14597 We check here if it is set at all, not if is it totally replaced,
14598 which is what `dead_or_set_p' checks, so also check for it being
14601 if (place
&& REG_NOTE_KIND (note
) == REG_DEAD
)
14603 unsigned int regno
= REGNO (XEXP (note
, 0));
14604 reg_stat_type
*rsp
= ®_stat
[regno
];
14606 if (dead_or_set_p (place
, XEXP (note
, 0))
14607 || reg_bitfield_target_p (XEXP (note
, 0), PATTERN (place
)))
14609 /* Unless the register previously died in PLACE, clear
14610 last_death. [I no longer understand why this is
14612 if (rsp
->last_death
!= place
)
14613 rsp
->last_death
= 0;
14617 rsp
->last_death
= place
;
14619 /* If this is a death note for a hard reg that is occupying
14620 multiple registers, ensure that we are still using all
14621 parts of the object. If we find a piece of the object
14622 that is unused, we must arrange for an appropriate REG_DEAD
14623 note to be added for it. However, we can't just emit a USE
14624 and tag the note to it, since the register might actually
14625 be dead; so we recourse, and the recursive call then finds
14626 the previous insn that used this register. */
14628 if (place
&& REG_NREGS (XEXP (note
, 0)) > 1)
14630 unsigned int endregno
= END_REGNO (XEXP (note
, 0));
14631 bool all_used
= true;
14634 for (i
= regno
; i
< endregno
; i
++)
14635 if ((! refers_to_regno_p (i
, PATTERN (place
))
14636 && ! find_regno_fusage (place
, USE
, i
))
14637 || dead_or_set_regno_p (place
, i
))
14645 /* Put only REG_DEAD notes for pieces that are
14646 not already dead or set. */
14648 for (i
= regno
; i
< endregno
;
14649 i
+= hard_regno_nregs (i
, reg_raw_mode
[i
]))
14651 rtx piece
= regno_reg_rtx
[i
];
14652 basic_block bb
= this_basic_block
;
14654 if (! dead_or_set_p (place
, piece
)
14655 && ! reg_bitfield_target_p (piece
,
14658 rtx new_note
= alloc_reg_note (REG_DEAD
, piece
,
14661 distribute_notes (new_note
, place
, place
,
14662 NULL
, NULL_RTX
, NULL_RTX
,
14665 else if (! refers_to_regno_p (i
, PATTERN (place
))
14666 && ! find_regno_fusage (place
, USE
, i
))
14667 for (tem_insn
= PREV_INSN (place
); ;
14668 tem_insn
= PREV_INSN (tem_insn
))
14670 if (!NONDEBUG_INSN_P (tem_insn
))
14672 if (tem_insn
== BB_HEAD (bb
))
14676 if (dead_or_set_p (tem_insn
, piece
)
14677 || reg_bitfield_target_p (piece
,
14678 PATTERN (tem_insn
)))
14680 add_reg_note (tem_insn
, REG_UNUSED
, piece
);
14693 /* Any other notes should not be present at this point in the
14695 gcc_unreachable ();
14700 XEXP (note
, 1) = REG_NOTES (place
);
14701 REG_NOTES (place
) = note
;
14703 /* Set added_notes_insn to the earliest insn we added a note to. */
14704 if (added_notes_insn
== 0
14705 || DF_INSN_LUID (added_notes_insn
) > DF_INSN_LUID (place
))
14706 added_notes_insn
= place
;
14711 add_shallow_copy_of_reg_note (place2
, note
);
14713 /* Set added_notes_insn to the earliest insn we added a note to. */
14714 if (added_notes_insn
== 0
14715 || DF_INSN_LUID (added_notes_insn
) > DF_INSN_LUID (place2
))
14716 added_notes_insn
= place2
;
14721 /* Similarly to above, distribute the LOG_LINKS that used to be present on
14722 I3, I2, and I1 to new locations. This is also called to add a link
14723 pointing at I3 when I3's destination is changed. */
14726 distribute_links (struct insn_link
*links
)
14728 struct insn_link
*link
, *next_link
;
14730 for (link
= links
; link
; link
= next_link
)
14732 rtx_insn
*place
= 0;
14736 next_link
= link
->next
;
14738 /* If the insn that this link points to is a NOTE, ignore it. */
14739 if (NOTE_P (link
->insn
))
14743 rtx pat
= PATTERN (link
->insn
);
14744 if (GET_CODE (pat
) == SET
)
14746 else if (GET_CODE (pat
) == PARALLEL
)
14749 for (i
= 0; i
< XVECLEN (pat
, 0); i
++)
14751 set
= XVECEXP (pat
, 0, i
);
14752 if (GET_CODE (set
) != SET
)
14755 reg
= SET_DEST (set
);
14756 while (GET_CODE (reg
) == ZERO_EXTRACT
14757 || GET_CODE (reg
) == STRICT_LOW_PART
14758 || GET_CODE (reg
) == SUBREG
)
14759 reg
= XEXP (reg
, 0);
14764 if (REGNO (reg
) == link
->regno
)
14767 if (i
== XVECLEN (pat
, 0))
14773 reg
= SET_DEST (set
);
14775 while (GET_CODE (reg
) == ZERO_EXTRACT
14776 || GET_CODE (reg
) == STRICT_LOW_PART
14777 || GET_CODE (reg
) == SUBREG
)
14778 reg
= XEXP (reg
, 0);
14780 /* A LOG_LINK is defined as being placed on the first insn that uses
14781 a register and points to the insn that sets the register. Start
14782 searching at the next insn after the target of the link and stop
14783 when we reach a set of the register or the end of the basic block.
14785 Note that this correctly handles the link that used to point from
14786 I3 to I2. Also note that not much searching is typically done here
14787 since most links don't point very far away. */
14789 for (insn
= NEXT_INSN (link
->insn
);
14790 (insn
&& (this_basic_block
->next_bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
)
14791 || BB_HEAD (this_basic_block
->next_bb
) != insn
));
14792 insn
= NEXT_INSN (insn
))
14793 if (DEBUG_INSN_P (insn
))
14795 else if (INSN_P (insn
) && reg_overlap_mentioned_p (reg
, PATTERN (insn
)))
14797 if (reg_referenced_p (reg
, PATTERN (insn
)))
14801 else if (CALL_P (insn
)
14802 && find_reg_fusage (insn
, USE
, reg
))
14807 else if (INSN_P (insn
) && reg_set_p (reg
, insn
))
14810 /* If we found a place to put the link, place it there unless there
14811 is already a link to the same insn as LINK at that point. */
14815 struct insn_link
*link2
;
14817 FOR_EACH_LOG_LINK (link2
, place
)
14818 if (link2
->insn
== link
->insn
&& link2
->regno
== link
->regno
)
14823 link
->next
= LOG_LINKS (place
);
14824 LOG_LINKS (place
) = link
;
14826 /* Set added_links_insn to the earliest insn we added a
14828 if (added_links_insn
== 0
14829 || DF_INSN_LUID (added_links_insn
) > DF_INSN_LUID (place
))
14830 added_links_insn
= place
;
14836 /* Check for any register or memory mentioned in EQUIV that is not
14837 mentioned in EXPR. This is used to restrict EQUIV to "specializations"
14838 of EXPR where some registers may have been replaced by constants. */
14841 unmentioned_reg_p (rtx equiv
, rtx expr
)
14843 subrtx_iterator::array_type array
;
14844 FOR_EACH_SUBRTX (iter
, array
, equiv
, NONCONST
)
14846 const_rtx x
= *iter
;
14847 if ((REG_P (x
) || MEM_P (x
))
14848 && !reg_mentioned_p (x
, expr
))
14854 DEBUG_FUNCTION
void
14855 dump_combine_stats (FILE *file
)
14859 ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
14860 combine_attempts
, combine_merges
, combine_extras
, combine_successes
);
14864 dump_combine_total_stats (FILE *file
)
14868 "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
14869 total_attempts
, total_merges
, total_extras
, total_successes
);
14872 /* Try combining insns through substitution. */
14873 static unsigned int
14874 rest_of_handle_combine (void)
14876 int rebuild_jump_labels_after_combine
;
14878 df_set_flags (DF_LR_RUN_DCE
+ DF_DEFER_INSN_RESCAN
);
14879 df_note_add_problem ();
14882 regstat_init_n_sets_and_refs ();
14883 reg_n_sets_max
= max_reg_num ();
14885 rebuild_jump_labels_after_combine
14886 = combine_instructions (get_insns (), max_reg_num ());
14888 /* Combining insns may have turned an indirect jump into a
14889 direct jump. Rebuild the JUMP_LABEL fields of jumping
14891 if (rebuild_jump_labels_after_combine
)
14893 if (dom_info_available_p (CDI_DOMINATORS
))
14894 free_dominance_info (CDI_DOMINATORS
);
14895 timevar_push (TV_JUMP
);
14896 rebuild_jump_labels (get_insns ());
14898 timevar_pop (TV_JUMP
);
14901 regstat_free_n_sets_and_refs ();
14907 const pass_data pass_data_combine
=
14909 RTL_PASS
, /* type */
14910 "combine", /* name */
14911 OPTGROUP_NONE
, /* optinfo_flags */
14912 TV_COMBINE
, /* tv_id */
14913 PROP_cfglayout
, /* properties_required */
14914 0, /* properties_provided */
14915 0, /* properties_destroyed */
14916 0, /* todo_flags_start */
14917 TODO_df_finish
, /* todo_flags_finish */
14920 class pass_combine
: public rtl_opt_pass
14923 pass_combine (gcc::context
*ctxt
)
14924 : rtl_opt_pass (pass_data_combine
, ctxt
)
14927 /* opt_pass methods: */
14928 virtual bool gate (function
*) { return (optimize
> 0); }
14929 virtual unsigned int execute (function
*)
14931 return rest_of_handle_combine ();
14934 }; // class pass_combine
14936 } // anon namespace
14939 make_pass_combine (gcc::context
*ctxt
)
14941 return new pass_combine (ctxt
);