[26/77] Use is_a <scalar_int_mode> in subreg/extract simplifications
[gcc.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2 Copyright (C) 1987-2017 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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
9 version.
10
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
14 for more details.
15
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/>. */
19
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.
23
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).
29
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.
35
36 LOG_LINKS does not have links for use of the CC0. They don't
37 need to, because the insn that sets the CC0 is always immediately
38 before the insn that tests it. So we always regard a branch
39 insn as having a logical link to the preceding insn. The same is true
40 for an insn explicitly using CC0.
41
42 We check (with use_crosses_set_p) to avoid combining in such a way
43 as to move a computation to a place where its value would be different.
44
45 Combination is done by mathematically substituting the previous
46 insn(s) values for the regs they set into the expressions in
47 the later insns that refer to these regs. If the result is a valid insn
48 for our target machine, according to the machine description,
49 we install it, delete the earlier insns, and update the data flow
50 information (LOG_LINKS and REG_NOTES) for what we did.
51
52 There are a few exceptions where the dataflow information isn't
53 completely updated (however this is only a local issue since it is
54 regenerated before the next pass that uses it):
55
56 - reg_live_length is not updated
57 - reg_n_refs is not adjusted in the rare case when a register is
58 no longer required in a computation
59 - there are extremely rare cases (see distribute_notes) when a
60 REG_DEAD note is lost
61 - a LOG_LINKS entry that refers to an insn with multiple SETs may be
62 removed because there is no way to know which register it was
63 linking
64
65 To simplify substitution, we combine only when the earlier insn(s)
66 consist of only a single assignment. To simplify updating afterward,
67 we never combine when a subroutine call appears in the middle.
68
69 Since we do not represent assignments to CC0 explicitly except when that
70 is all an insn does, there is no LOG_LINKS entry in an insn that uses
71 the condition code for the insn that set the condition code.
72 Fortunately, these two insns must be consecutive.
73 Therefore, every JUMP_INSN is taken to have an implicit logical link
74 to the preceding insn. This is not quite right, since non-jumps can
75 also use the condition code; but in practice such insns would not
76 combine anyway. */
77
78 #include "config.h"
79 #include "system.h"
80 #include "coretypes.h"
81 #include "backend.h"
82 #include "target.h"
83 #include "rtl.h"
84 #include "tree.h"
85 #include "cfghooks.h"
86 #include "predict.h"
87 #include "df.h"
88 #include "memmodel.h"
89 #include "tm_p.h"
90 #include "optabs.h"
91 #include "regs.h"
92 #include "emit-rtl.h"
93 #include "recog.h"
94 #include "cgraph.h"
95 #include "stor-layout.h"
96 #include "cfgrtl.h"
97 #include "cfgcleanup.h"
98 /* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
99 #include "explow.h"
100 #include "insn-attr.h"
101 #include "rtlhooks-def.h"
102 #include "params.h"
103 #include "tree-pass.h"
104 #include "valtrack.h"
105 #include "rtl-iter.h"
106 #include "print-rtl.h"
107
108 /* Number of attempts to combine instructions in this function. */
109
110 static int combine_attempts;
111
112 /* Number of attempts that got as far as substitution in this function. */
113
114 static int combine_merges;
115
116 /* Number of instructions combined with added SETs in this function. */
117
118 static int combine_extras;
119
120 /* Number of instructions combined in this function. */
121
122 static int combine_successes;
123
124 /* Totals over entire compilation. */
125
126 static int total_attempts, total_merges, total_extras, total_successes;
127
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. */
134
135 static rtx_insn *i2mod;
136
137 /* When I2MOD is nonnull, this is a copy of the old right hand side. */
138
139 static rtx i2mod_old_rhs;
140
141 /* When I2MOD is nonnull, this is a copy of the new right hand side. */
142
143 static rtx i2mod_new_rhs;
144 \f
145 struct reg_stat_type {
146 /* Record last point of death of (hard or pseudo) register n. */
147 rtx_insn *last_death;
148
149 /* Record last point of modification of (hard or pseudo) register n. */
150 rtx_insn *last_set;
151
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.
157
158 We use an approach similar to that used by cse, but change it in the
159 following ways:
160
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.
164
165 Therefore, we maintain the following fields:
166
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
174 register's value
175
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
179 table.
180
181 (The next two parameters are out of date).
182
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.
185
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.
190
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)). */
194
195 /* Record last value assigned to (hard or pseudo) register n. */
196
197 rtx last_set_value;
198
199 /* Record the value of label_tick when an expression involving register n
200 is placed in last_set_value. */
201
202 int last_set_table_tick;
203
204 /* Record the value of label_tick when the value for register n is placed in
205 last_set_value. */
206
207 int last_set_label;
208
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. */
213
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;
217
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. */
221
222 char last_set_invalid;
223
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.
228
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
232 zero.
233
234 If an entry is zero, it means that we don't know anything special. */
235
236 unsigned char sign_bit_copies;
237
238 unsigned HOST_WIDE_INT nonzero_bits;
239
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. */
243
244 int truncation_label;
245
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
249 value. */
250
251 ENUM_BITFIELD(machine_mode) truncated_to_mode : 8;
252 };
253
254
255 static vec<reg_stat_type> reg_stat;
256
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. */
264
265 static unsigned int reg_n_sets_max;
266
267 /* Record the luid of the last insn that invalidated memory
268 (anything that writes memory, and subroutine calls, but not pushes). */
269
270 static int mem_last_set;
271
272 /* Record the luid of the last CALL_INSN
273 so we can tell whether a potential combination crosses any calls. */
274
275 static int last_call_luid;
276
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. */
282
283 static rtx_insn *subst_insn;
284
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. */
291
292 static int subst_low_luid;
293
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. */
296
297 static HARD_REG_SET newpat_used_regs;
298
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
301 that location. */
302
303 static rtx_insn *added_links_insn;
304
305 /* Basic block in which we are performing combines. */
306 static basic_block this_basic_block;
307 static bool optimize_this_for_speed_p;
308
309 \f
310 /* Length of the currently allocated uid_insn_cost array. */
311
312 static int max_uid_known;
313
314 /* The following array records the insn_rtx_cost for every insn
315 in the instruction stream. */
316
317 static int *uid_insn_cost;
318
319 /* The following array records the LOG_LINKS for every insn in the
320 instruction stream as struct insn_link pointers. */
321
322 struct insn_link {
323 rtx_insn *insn;
324 unsigned int regno;
325 struct insn_link *next;
326 };
327
328 static struct insn_link **uid_log_links;
329
330 static inline int
331 insn_uid_check (const_rtx insn)
332 {
333 int uid = INSN_UID (insn);
334 gcc_checking_assert (uid <= max_uid_known);
335 return uid;
336 }
337
338 #define INSN_COST(INSN) (uid_insn_cost[insn_uid_check (INSN)])
339 #define LOG_LINKS(INSN) (uid_log_links[insn_uid_check (INSN)])
340
341 #define FOR_EACH_LOG_LINK(L, INSN) \
342 for ((L) = LOG_LINKS (INSN); (L); (L) = (L)->next)
343
344 /* Links for LOG_LINKS are allocated from this obstack. */
345
346 static struct obstack insn_link_obstack;
347
348 /* Allocate a link. */
349
350 static inline struct insn_link *
351 alloc_insn_link (rtx_insn *insn, unsigned int regno, struct insn_link *next)
352 {
353 struct insn_link *l
354 = (struct insn_link *) obstack_alloc (&insn_link_obstack,
355 sizeof (struct insn_link));
356 l->insn = insn;
357 l->regno = regno;
358 l->next = next;
359 return l;
360 }
361
362 /* Incremented for each basic block. */
363
364 static int label_tick;
365
366 /* Reset to label_tick for each extended basic block in scanning order. */
367
368 static int label_tick_ebb_start;
369
370 /* Mode used to compute significance in reg_stat[].nonzero_bits. It is the
371 largest integer mode that can fit in HOST_BITS_PER_WIDE_INT. */
372
373 static machine_mode nonzero_bits_mode;
374
375 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
376 be safely used. It is zero while computing them and after combine has
377 completed. This former test prevents propagating values based on
378 previously set values, which can be incorrect if a variable is modified
379 in a loop. */
380
381 static int nonzero_sign_valid;
382
383 \f
384 /* Record one modification to rtl structure
385 to be undone by storing old_contents into *where. */
386
387 enum undo_kind { UNDO_RTX, UNDO_INT, UNDO_MODE, UNDO_LINKS };
388
389 struct undo
390 {
391 struct undo *next;
392 enum undo_kind kind;
393 union { rtx r; int i; machine_mode m; struct insn_link *l; } old_contents;
394 union { rtx *r; int *i; struct insn_link **l; } where;
395 };
396
397 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
398 num_undo says how many are currently recorded.
399
400 other_insn is nonzero if we have modified some other insn in the process
401 of working on subst_insn. It must be verified too. */
402
403 struct undobuf
404 {
405 struct undo *undos;
406 struct undo *frees;
407 rtx_insn *other_insn;
408 };
409
410 static struct undobuf undobuf;
411
412 /* Number of times the pseudo being substituted for
413 was found and replaced. */
414
415 static int n_occurrences;
416
417 static rtx reg_nonzero_bits_for_combine (const_rtx, machine_mode, const_rtx,
418 machine_mode,
419 unsigned HOST_WIDE_INT,
420 unsigned HOST_WIDE_INT *);
421 static rtx reg_num_sign_bit_copies_for_combine (const_rtx, machine_mode, const_rtx,
422 machine_mode,
423 unsigned int, unsigned int *);
424 static void do_SUBST (rtx *, rtx);
425 static void do_SUBST_INT (int *, int);
426 static void init_reg_last (void);
427 static void setup_incoming_promotions (rtx_insn *);
428 static void set_nonzero_bits_and_sign_copies (rtx, const_rtx, void *);
429 static int cant_combine_insn_p (rtx_insn *);
430 static int can_combine_p (rtx_insn *, rtx_insn *, rtx_insn *, rtx_insn *,
431 rtx_insn *, rtx_insn *, rtx *, rtx *);
432 static int combinable_i3pat (rtx_insn *, rtx *, rtx, rtx, rtx, int, int, rtx *);
433 static int contains_muldiv (rtx);
434 static rtx_insn *try_combine (rtx_insn *, rtx_insn *, rtx_insn *, rtx_insn *,
435 int *, rtx_insn *);
436 static void undo_all (void);
437 static void undo_commit (void);
438 static rtx *find_split_point (rtx *, rtx_insn *, bool);
439 static rtx subst (rtx, rtx, rtx, int, int, int);
440 static rtx combine_simplify_rtx (rtx, machine_mode, int, int);
441 static rtx simplify_if_then_else (rtx);
442 static rtx simplify_set (rtx);
443 static rtx simplify_logical (rtx);
444 static rtx expand_compound_operation (rtx);
445 static const_rtx expand_field_assignment (const_rtx);
446 static rtx make_extraction (machine_mode, rtx, HOST_WIDE_INT,
447 rtx, unsigned HOST_WIDE_INT, int, int, int);
448 static rtx extract_left_shift (rtx, int);
449 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
450 unsigned HOST_WIDE_INT *);
451 static rtx canon_reg_for_combine (rtx, rtx);
452 static rtx force_to_mode (rtx, machine_mode,
453 unsigned HOST_WIDE_INT, int);
454 static rtx if_then_else_cond (rtx, rtx *, rtx *);
455 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
456 static int rtx_equal_for_field_assignment_p (rtx, rtx, bool = false);
457 static rtx make_field_assignment (rtx);
458 static rtx apply_distributive_law (rtx);
459 static rtx distribute_and_simplify_rtx (rtx, int);
460 static rtx simplify_and_const_int_1 (machine_mode, rtx,
461 unsigned HOST_WIDE_INT);
462 static rtx simplify_and_const_int (rtx, machine_mode, rtx,
463 unsigned HOST_WIDE_INT);
464 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
465 HOST_WIDE_INT, machine_mode, int *);
466 static rtx simplify_shift_const_1 (enum rtx_code, machine_mode, rtx, int);
467 static rtx simplify_shift_const (rtx, enum rtx_code, machine_mode, rtx,
468 int);
469 static int recog_for_combine (rtx *, rtx_insn *, rtx *);
470 static rtx gen_lowpart_for_combine (machine_mode, rtx);
471 static enum rtx_code simplify_compare_const (enum rtx_code, machine_mode,
472 rtx, rtx *);
473 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
474 static void update_table_tick (rtx);
475 static void record_value_for_reg (rtx, rtx_insn *, rtx);
476 static void check_promoted_subreg (rtx_insn *, rtx);
477 static void record_dead_and_set_regs_1 (rtx, const_rtx, void *);
478 static void record_dead_and_set_regs (rtx_insn *);
479 static int get_last_value_validate (rtx *, rtx_insn *, int, int);
480 static rtx get_last_value (const_rtx);
481 static int use_crosses_set_p (const_rtx, int);
482 static void reg_dead_at_p_1 (rtx, const_rtx, void *);
483 static int reg_dead_at_p (rtx, rtx_insn *);
484 static void move_deaths (rtx, rtx, int, rtx_insn *, rtx *);
485 static int reg_bitfield_target_p (rtx, rtx);
486 static void distribute_notes (rtx, rtx_insn *, rtx_insn *, rtx_insn *, rtx, rtx, rtx);
487 static void distribute_links (struct insn_link *);
488 static void mark_used_regs_combine (rtx);
489 static void record_promoted_value (rtx_insn *, rtx);
490 static bool unmentioned_reg_p (rtx, rtx);
491 static void record_truncated_values (rtx *, void *);
492 static bool reg_truncated_to_mode (machine_mode, const_rtx);
493 static rtx gen_lowpart_or_truncate (machine_mode, rtx);
494 \f
495
496 /* It is not safe to use ordinary gen_lowpart in combine.
497 See comments in gen_lowpart_for_combine. */
498 #undef RTL_HOOKS_GEN_LOWPART
499 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_for_combine
500
501 /* Our implementation of gen_lowpart never emits a new pseudo. */
502 #undef RTL_HOOKS_GEN_LOWPART_NO_EMIT
503 #define RTL_HOOKS_GEN_LOWPART_NO_EMIT gen_lowpart_for_combine
504
505 #undef RTL_HOOKS_REG_NONZERO_REG_BITS
506 #define RTL_HOOKS_REG_NONZERO_REG_BITS reg_nonzero_bits_for_combine
507
508 #undef RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES
509 #define RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES reg_num_sign_bit_copies_for_combine
510
511 #undef RTL_HOOKS_REG_TRUNCATED_TO_MODE
512 #define RTL_HOOKS_REG_TRUNCATED_TO_MODE reg_truncated_to_mode
513
514 static const struct rtl_hooks combine_rtl_hooks = RTL_HOOKS_INITIALIZER;
515
516 \f
517 /* Convenience wrapper for the canonicalize_comparison target hook.
518 Target hooks cannot use enum rtx_code. */
519 static inline void
520 target_canonicalize_comparison (enum rtx_code *code, rtx *op0, rtx *op1,
521 bool op0_preserve_value)
522 {
523 int code_int = (int)*code;
524 targetm.canonicalize_comparison (&code_int, op0, op1, op0_preserve_value);
525 *code = (enum rtx_code)code_int;
526 }
527
528 /* Try to split PATTERN found in INSN. This returns NULL_RTX if
529 PATTERN can not be split. Otherwise, it returns an insn sequence.
530 This is a wrapper around split_insns which ensures that the
531 reg_stat vector is made larger if the splitter creates a new
532 register. */
533
534 static rtx_insn *
535 combine_split_insns (rtx pattern, rtx_insn *insn)
536 {
537 rtx_insn *ret;
538 unsigned int nregs;
539
540 ret = split_insns (pattern, insn);
541 nregs = max_reg_num ();
542 if (nregs > reg_stat.length ())
543 reg_stat.safe_grow_cleared (nregs);
544 return ret;
545 }
546
547 /* This is used by find_single_use to locate an rtx in LOC that
548 contains exactly one use of DEST, which is typically either a REG
549 or CC0. It returns a pointer to the innermost rtx expression
550 containing DEST. Appearances of DEST that are being used to
551 totally replace it are not counted. */
552
553 static rtx *
554 find_single_use_1 (rtx dest, rtx *loc)
555 {
556 rtx x = *loc;
557 enum rtx_code code = GET_CODE (x);
558 rtx *result = NULL;
559 rtx *this_result;
560 int i;
561 const char *fmt;
562
563 switch (code)
564 {
565 case CONST:
566 case LABEL_REF:
567 case SYMBOL_REF:
568 CASE_CONST_ANY:
569 case CLOBBER:
570 return 0;
571
572 case SET:
573 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
574 of a REG that occupies all of the REG, the insn uses DEST if
575 it is mentioned in the destination or the source. Otherwise, we
576 need just check the source. */
577 if (GET_CODE (SET_DEST (x)) != CC0
578 && GET_CODE (SET_DEST (x)) != PC
579 && !REG_P (SET_DEST (x))
580 && ! (GET_CODE (SET_DEST (x)) == SUBREG
581 && REG_P (SUBREG_REG (SET_DEST (x)))
582 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
583 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
584 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
585 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
586 break;
587
588 return find_single_use_1 (dest, &SET_SRC (x));
589
590 case MEM:
591 case SUBREG:
592 return find_single_use_1 (dest, &XEXP (x, 0));
593
594 default:
595 break;
596 }
597
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. */
600
601 fmt = GET_RTX_FORMAT (code);
602 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
603 {
604 if (fmt[i] == 'e')
605 {
606 if (dest == XEXP (x, i)
607 || (REG_P (dest) && REG_P (XEXP (x, i))
608 && REGNO (dest) == REGNO (XEXP (x, i))))
609 this_result = loc;
610 else
611 this_result = find_single_use_1 (dest, &XEXP (x, i));
612
613 if (result == NULL)
614 result = this_result;
615 else if (this_result)
616 /* Duplicate usage. */
617 return NULL;
618 }
619 else if (fmt[i] == 'E')
620 {
621 int j;
622
623 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
624 {
625 if (XVECEXP (x, i, j) == dest
626 || (REG_P (dest)
627 && REG_P (XVECEXP (x, i, j))
628 && REGNO (XVECEXP (x, i, j)) == REGNO (dest)))
629 this_result = loc;
630 else
631 this_result = find_single_use_1 (dest, &XVECEXP (x, i, j));
632
633 if (result == NULL)
634 result = this_result;
635 else if (this_result)
636 return NULL;
637 }
638 }
639 }
640
641 return result;
642 }
643
644
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
647 it is used.
648
649 If PLOC is nonzero, *PLOC is set to the insn containing the single use.
650
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.
653
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. */
658
659 static rtx *
660 find_single_use (rtx dest, rtx_insn *insn, rtx_insn **ploc)
661 {
662 basic_block bb;
663 rtx_insn *next;
664 rtx *result;
665 struct insn_link *link;
666
667 if (dest == cc0_rtx)
668 {
669 next = NEXT_INSN (insn);
670 if (next == 0
671 || (!NONJUMP_INSN_P (next) && !JUMP_P (next)))
672 return 0;
673
674 result = find_single_use_1 (dest, &PATTERN (next));
675 if (result && ploc)
676 *ploc = next;
677 return result;
678 }
679
680 if (!REG_P (dest))
681 return 0;
682
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))
688 {
689 FOR_EACH_LOG_LINK (link, next)
690 if (link->insn == insn && link->regno == REGNO (dest))
691 break;
692
693 if (link)
694 {
695 result = find_single_use_1 (dest, &PATTERN (next));
696 if (ploc)
697 *ploc = next;
698 return result;
699 }
700 }
701
702 return 0;
703 }
704 \f
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
709 the undo table. */
710
711 static void
712 do_SUBST (rtx *into, rtx newval)
713 {
714 struct undo *buf;
715 rtx oldval = *into;
716
717 if (oldval == newval)
718 return;
719
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))
727 {
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)));
732
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))));
743 }
744
745 if (undobuf.frees)
746 buf = undobuf.frees, undobuf.frees = buf->next;
747 else
748 buf = XNEW (struct undo);
749
750 buf->kind = UNDO_RTX;
751 buf->where.r = into;
752 buf->old_contents.r = oldval;
753 *into = newval;
754
755 buf->next = undobuf.undos, undobuf.undos = buf;
756 }
757
758 #define SUBST(INTO, NEWVAL) do_SUBST (&(INTO), (NEWVAL))
759
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
762 not safe. */
763
764 static void
765 do_SUBST_INT (int *into, int newval)
766 {
767 struct undo *buf;
768 int oldval = *into;
769
770 if (oldval == newval)
771 return;
772
773 if (undobuf.frees)
774 buf = undobuf.frees, undobuf.frees = buf->next;
775 else
776 buf = XNEW (struct undo);
777
778 buf->kind = UNDO_INT;
779 buf->where.i = into;
780 buf->old_contents.i = oldval;
781 *into = newval;
782
783 buf->next = undobuf.undos, undobuf.undos = buf;
784 }
785
786 #define SUBST_INT(INTO, NEWVAL) do_SUBST_INT (&(INTO), (NEWVAL))
787
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
791 well. */
792
793 static void
794 do_SUBST_MODE (rtx *into, machine_mode newval)
795 {
796 struct undo *buf;
797 machine_mode oldval = GET_MODE (*into);
798
799 if (oldval == newval)
800 return;
801
802 if (undobuf.frees)
803 buf = undobuf.frees, undobuf.frees = buf->next;
804 else
805 buf = XNEW (struct undo);
806
807 buf->kind = UNDO_MODE;
808 buf->where.r = into;
809 buf->old_contents.m = oldval;
810 adjust_reg_mode (*into, newval);
811
812 buf->next = undobuf.undos, undobuf.undos = buf;
813 }
814
815 #define SUBST_MODE(INTO, NEWVAL) do_SUBST_MODE (&(INTO), (NEWVAL))
816
817 /* Similar to SUBST, but NEWVAL is a LOG_LINKS expression. */
818
819 static void
820 do_SUBST_LINK (struct insn_link **into, struct insn_link *newval)
821 {
822 struct undo *buf;
823 struct insn_link * oldval = *into;
824
825 if (oldval == newval)
826 return;
827
828 if (undobuf.frees)
829 buf = undobuf.frees, undobuf.frees = buf->next;
830 else
831 buf = XNEW (struct undo);
832
833 buf->kind = UNDO_LINKS;
834 buf->where.l = into;
835 buf->old_contents.l = oldval;
836 *into = newval;
837
838 buf->next = undobuf.undos, undobuf.undos = buf;
839 }
840
841 #define SUBST_LINK(oldval, newval) do_SUBST_LINK (&oldval, newval)
842 \f
843 /* Subroutine of try_combine. Determine whether the replacement patterns
844 NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to insn_rtx_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. */
850
851 static bool
852 combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3,
853 rtx newpat, rtx newi2pat, rtx newotherpat)
854 {
855 int i0_cost, i1_cost, i2_cost, i3_cost;
856 int new_i2_cost, new_i3_cost;
857 int old_cost, new_cost;
858
859 /* Lookup the original insn_rtx_costs. */
860 i2_cost = INSN_COST (i2);
861 i3_cost = INSN_COST (i3);
862
863 if (i1)
864 {
865 i1_cost = INSN_COST (i1);
866 if (i0)
867 {
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);
871 }
872 else
873 {
874 old_cost = (i1_cost > 0 && i2_cost > 0 && i3_cost > 0
875 ? i1_cost + i2_cost + i3_cost : 0);
876 i0_cost = 0;
877 }
878 }
879 else
880 {
881 old_cost = (i2_cost > 0 && i3_cost > 0) ? i2_cost + i3_cost : 0;
882 i1_cost = i0_cost = 0;
883 }
884
885 /* If we have split a PARALLEL I2 to I1,I2, we have counted its cost twice;
886 correct that. */
887 if (old_cost && i1 && INSN_UID (i1) == INSN_UID (i2))
888 old_cost -= i1_cost;
889
890
891 /* Calculate the replacement insn_rtx_costs. */
892 new_i3_cost = insn_rtx_cost (newpat, optimize_this_for_speed_p);
893 if (newi2pat)
894 {
895 new_i2_cost = insn_rtx_cost (newi2pat, optimize_this_for_speed_p);
896 new_cost = (new_i2_cost > 0 && new_i3_cost > 0)
897 ? new_i2_cost + new_i3_cost : 0;
898 }
899 else
900 {
901 new_cost = new_i3_cost;
902 new_i2_cost = 0;
903 }
904
905 if (undobuf.other_insn)
906 {
907 int old_other_cost, new_other_cost;
908
909 old_other_cost = INSN_COST (undobuf.other_insn);
910 new_other_cost = insn_rtx_cost (newotherpat, optimize_this_for_speed_p);
911 if (old_other_cost > 0 && new_other_cost > 0)
912 {
913 old_cost += old_other_cost;
914 new_cost += new_other_cost;
915 }
916 else
917 old_cost = 0;
918 }
919
920 /* Disallow this combination if both new_cost and old_cost are greater than
921 zero, and new_cost is greater than old cost. */
922 int reject = old_cost > 0 && new_cost > old_cost;
923
924 if (dump_file)
925 {
926 fprintf (dump_file, "%s combination of insns ",
927 reject ? "rejecting" : "allowing");
928 if (i0)
929 fprintf (dump_file, "%d, ", INSN_UID (i0));
930 if (i1 && INSN_UID (i1) != INSN_UID (i2))
931 fprintf (dump_file, "%d, ", INSN_UID (i1));
932 fprintf (dump_file, "%d and %d\n", INSN_UID (i2), INSN_UID (i3));
933
934 fprintf (dump_file, "original costs ");
935 if (i0)
936 fprintf (dump_file, "%d + ", i0_cost);
937 if (i1 && INSN_UID (i1) != INSN_UID (i2))
938 fprintf (dump_file, "%d + ", i1_cost);
939 fprintf (dump_file, "%d + %d = %d\n", i2_cost, i3_cost, old_cost);
940
941 if (newi2pat)
942 fprintf (dump_file, "replacement costs %d + %d = %d\n",
943 new_i2_cost, new_i3_cost, new_cost);
944 else
945 fprintf (dump_file, "replacement cost %d\n", new_cost);
946 }
947
948 if (reject)
949 return false;
950
951 /* Update the uid_insn_cost array with the replacement costs. */
952 INSN_COST (i2) = new_i2_cost;
953 INSN_COST (i3) = new_i3_cost;
954 if (i1)
955 {
956 INSN_COST (i1) = 0;
957 if (i0)
958 INSN_COST (i0) = 0;
959 }
960
961 return true;
962 }
963
964
965 /* Delete any insns that copy a register to itself. */
966
967 static void
968 delete_noop_moves (void)
969 {
970 rtx_insn *insn, *next;
971 basic_block bb;
972
973 FOR_EACH_BB_FN (bb, cfun)
974 {
975 for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next)
976 {
977 next = NEXT_INSN (insn);
978 if (INSN_P (insn) && noop_move_p (insn))
979 {
980 if (dump_file)
981 fprintf (dump_file, "deleting noop move %d\n", INSN_UID (insn));
982
983 delete_insn_and_edges (insn);
984 }
985 }
986 }
987 }
988
989 \f
990 /* Return false if we do not want to (or cannot) combine DEF. */
991 static bool
992 can_combine_def_p (df_ref def)
993 {
994 /* Do not consider if it is pre/post modification in MEM. */
995 if (DF_REF_FLAGS (def) & DF_REF_PRE_POST_MODIFY)
996 return false;
997
998 unsigned int regno = DF_REF_REGNO (def);
999
1000 /* Do not combine frame pointer adjustments. */
1001 if ((regno == FRAME_POINTER_REGNUM
1002 && (!reload_completed || frame_pointer_needed))
1003 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER
1004 && regno == HARD_FRAME_POINTER_REGNUM
1005 && (!reload_completed || frame_pointer_needed))
1006 || (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1007 && regno == ARG_POINTER_REGNUM && fixed_regs[regno]))
1008 return false;
1009
1010 return true;
1011 }
1012
1013 /* Return false if we do not want to (or cannot) combine USE. */
1014 static bool
1015 can_combine_use_p (df_ref use)
1016 {
1017 /* Do not consider the usage of the stack pointer by function call. */
1018 if (DF_REF_FLAGS (use) & DF_REF_CALL_STACK_USAGE)
1019 return false;
1020
1021 return true;
1022 }
1023
1024 /* Fill in log links field for all insns. */
1025
1026 static void
1027 create_log_links (void)
1028 {
1029 basic_block bb;
1030 rtx_insn **next_use;
1031 rtx_insn *insn;
1032 df_ref def, use;
1033
1034 next_use = XCNEWVEC (rtx_insn *, max_reg_num ());
1035
1036 /* Pass through each block from the end, recording the uses of each
1037 register and establishing log links when def is encountered.
1038 Note that we do not clear next_use array in order to save time,
1039 so we have to test whether the use is in the same basic block as def.
1040
1041 There are a few cases below when we do not consider the definition or
1042 usage -- these are taken from original flow.c did. Don't ask me why it is
1043 done this way; I don't know and if it works, I don't want to know. */
1044
1045 FOR_EACH_BB_FN (bb, cfun)
1046 {
1047 FOR_BB_INSNS_REVERSE (bb, insn)
1048 {
1049 if (!NONDEBUG_INSN_P (insn))
1050 continue;
1051
1052 /* Log links are created only once. */
1053 gcc_assert (!LOG_LINKS (insn));
1054
1055 FOR_EACH_INSN_DEF (def, insn)
1056 {
1057 unsigned int regno = DF_REF_REGNO (def);
1058 rtx_insn *use_insn;
1059
1060 if (!next_use[regno])
1061 continue;
1062
1063 if (!can_combine_def_p (def))
1064 continue;
1065
1066 use_insn = next_use[regno];
1067 next_use[regno] = NULL;
1068
1069 if (BLOCK_FOR_INSN (use_insn) != bb)
1070 continue;
1071
1072 /* flow.c claimed:
1073
1074 We don't build a LOG_LINK for hard registers contained
1075 in ASM_OPERANDs. If these registers get replaced,
1076 we might wind up changing the semantics of the insn,
1077 even if reload can make what appear to be valid
1078 assignments later. */
1079 if (regno < FIRST_PSEUDO_REGISTER
1080 && asm_noperands (PATTERN (use_insn)) >= 0)
1081 continue;
1082
1083 /* Don't add duplicate links between instructions. */
1084 struct insn_link *links;
1085 FOR_EACH_LOG_LINK (links, use_insn)
1086 if (insn == links->insn && regno == links->regno)
1087 break;
1088
1089 if (!links)
1090 LOG_LINKS (use_insn)
1091 = alloc_insn_link (insn, regno, LOG_LINKS (use_insn));
1092 }
1093
1094 FOR_EACH_INSN_USE (use, insn)
1095 if (can_combine_use_p (use))
1096 next_use[DF_REF_REGNO (use)] = insn;
1097 }
1098 }
1099
1100 free (next_use);
1101 }
1102
1103 /* Walk the LOG_LINKS of insn B to see if we find a reference to A. Return
1104 true if we found a LOG_LINK that proves that A feeds B. This only works
1105 if there are no instructions between A and B which could have a link
1106 depending on A, since in that case we would not record a link for B.
1107 We also check the implicit dependency created by a cc0 setter/user
1108 pair. */
1109
1110 static bool
1111 insn_a_feeds_b (rtx_insn *a, rtx_insn *b)
1112 {
1113 struct insn_link *links;
1114 FOR_EACH_LOG_LINK (links, b)
1115 if (links->insn == a)
1116 return true;
1117 if (HAVE_cc0 && sets_cc0_p (a))
1118 return true;
1119 return false;
1120 }
1121 \f
1122 /* Main entry point for combiner. F is the first insn of the function.
1123 NREGS is the first unused pseudo-reg number.
1124
1125 Return nonzero if the combiner has turned an indirect jump
1126 instruction into a direct jump. */
1127 static int
1128 combine_instructions (rtx_insn *f, unsigned int nregs)
1129 {
1130 rtx_insn *insn, *next;
1131 rtx_insn *prev;
1132 struct insn_link *links, *nextlinks;
1133 rtx_insn *first;
1134 basic_block last_bb;
1135
1136 int new_direct_jump_p = 0;
1137
1138 for (first = f; first && !NONDEBUG_INSN_P (first); )
1139 first = NEXT_INSN (first);
1140 if (!first)
1141 return 0;
1142
1143 combine_attempts = 0;
1144 combine_merges = 0;
1145 combine_extras = 0;
1146 combine_successes = 0;
1147
1148 rtl_hooks = combine_rtl_hooks;
1149
1150 reg_stat.safe_grow_cleared (nregs);
1151
1152 init_recog_no_volatile ();
1153
1154 /* Allocate array for insn info. */
1155 max_uid_known = get_max_uid ();
1156 uid_log_links = XCNEWVEC (struct insn_link *, max_uid_known + 1);
1157 uid_insn_cost = XCNEWVEC (int, max_uid_known + 1);
1158 gcc_obstack_init (&insn_link_obstack);
1159
1160 nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
1161
1162 /* Don't use reg_stat[].nonzero_bits when computing it. This can cause
1163 problems when, for example, we have j <<= 1 in a loop. */
1164
1165 nonzero_sign_valid = 0;
1166 label_tick = label_tick_ebb_start = 1;
1167
1168 /* Scan all SETs and see if we can deduce anything about what
1169 bits are known to be zero for some registers and how many copies
1170 of the sign bit are known to exist for those registers.
1171
1172 Also set any known values so that we can use it while searching
1173 for what bits are known to be set. */
1174
1175 setup_incoming_promotions (first);
1176 /* Allow the entry block and the first block to fall into the same EBB.
1177 Conceptually the incoming promotions are assigned to the entry block. */
1178 last_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1179
1180 create_log_links ();
1181 FOR_EACH_BB_FN (this_basic_block, cfun)
1182 {
1183 optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1184 last_call_luid = 0;
1185 mem_last_set = -1;
1186
1187 label_tick++;
1188 if (!single_pred_p (this_basic_block)
1189 || single_pred (this_basic_block) != last_bb)
1190 label_tick_ebb_start = label_tick;
1191 last_bb = this_basic_block;
1192
1193 FOR_BB_INSNS (this_basic_block, insn)
1194 if (INSN_P (insn) && BLOCK_FOR_INSN (insn))
1195 {
1196 rtx links;
1197
1198 subst_low_luid = DF_INSN_LUID (insn);
1199 subst_insn = insn;
1200
1201 note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
1202 insn);
1203 record_dead_and_set_regs (insn);
1204
1205 if (AUTO_INC_DEC)
1206 for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
1207 if (REG_NOTE_KIND (links) == REG_INC)
1208 set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
1209 insn);
1210
1211 /* Record the current insn_rtx_cost of this instruction. */
1212 if (NONJUMP_INSN_P (insn))
1213 INSN_COST (insn) = insn_rtx_cost (PATTERN (insn),
1214 optimize_this_for_speed_p);
1215 if (dump_file)
1216 {
1217 fprintf (dump_file, "insn_cost %d for ", INSN_COST (insn));
1218 dump_insn_slim (dump_file, insn);
1219 }
1220 }
1221 }
1222
1223 nonzero_sign_valid = 1;
1224
1225 /* Now scan all the insns in forward order. */
1226 label_tick = label_tick_ebb_start = 1;
1227 init_reg_last ();
1228 setup_incoming_promotions (first);
1229 last_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1230 int max_combine = PARAM_VALUE (PARAM_MAX_COMBINE_INSNS);
1231
1232 FOR_EACH_BB_FN (this_basic_block, cfun)
1233 {
1234 rtx_insn *last_combined_insn = NULL;
1235 optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1236 last_call_luid = 0;
1237 mem_last_set = -1;
1238
1239 label_tick++;
1240 if (!single_pred_p (this_basic_block)
1241 || single_pred (this_basic_block) != last_bb)
1242 label_tick_ebb_start = label_tick;
1243 last_bb = this_basic_block;
1244
1245 rtl_profile_for_bb (this_basic_block);
1246 for (insn = BB_HEAD (this_basic_block);
1247 insn != NEXT_INSN (BB_END (this_basic_block));
1248 insn = next ? next : NEXT_INSN (insn))
1249 {
1250 next = 0;
1251 if (!NONDEBUG_INSN_P (insn))
1252 continue;
1253
1254 while (last_combined_insn
1255 && (!NONDEBUG_INSN_P (last_combined_insn)
1256 || last_combined_insn->deleted ()))
1257 last_combined_insn = PREV_INSN (last_combined_insn);
1258 if (last_combined_insn == NULL_RTX
1259 || BLOCK_FOR_INSN (last_combined_insn) != this_basic_block
1260 || DF_INSN_LUID (last_combined_insn) <= DF_INSN_LUID (insn))
1261 last_combined_insn = insn;
1262
1263 /* See if we know about function return values before this
1264 insn based upon SUBREG flags. */
1265 check_promoted_subreg (insn, PATTERN (insn));
1266
1267 /* See if we can find hardregs and subreg of pseudos in
1268 narrower modes. This could help turning TRUNCATEs
1269 into SUBREGs. */
1270 note_uses (&PATTERN (insn), record_truncated_values, NULL);
1271
1272 /* Try this insn with each insn it links back to. */
1273
1274 FOR_EACH_LOG_LINK (links, insn)
1275 if ((next = try_combine (insn, links->insn, NULL,
1276 NULL, &new_direct_jump_p,
1277 last_combined_insn)) != 0)
1278 {
1279 statistics_counter_event (cfun, "two-insn combine", 1);
1280 goto retry;
1281 }
1282
1283 /* Try each sequence of three linked insns ending with this one. */
1284
1285 if (max_combine >= 3)
1286 FOR_EACH_LOG_LINK (links, insn)
1287 {
1288 rtx_insn *link = links->insn;
1289
1290 /* If the linked insn has been replaced by a note, then there
1291 is no point in pursuing this chain any further. */
1292 if (NOTE_P (link))
1293 continue;
1294
1295 FOR_EACH_LOG_LINK (nextlinks, link)
1296 if ((next = try_combine (insn, link, nextlinks->insn,
1297 NULL, &new_direct_jump_p,
1298 last_combined_insn)) != 0)
1299 {
1300 statistics_counter_event (cfun, "three-insn combine", 1);
1301 goto retry;
1302 }
1303 }
1304
1305 /* Try to combine a jump insn that uses CC0
1306 with a preceding insn that sets CC0, and maybe with its
1307 logical predecessor as well.
1308 This is how we make decrement-and-branch insns.
1309 We need this special code because data flow connections
1310 via CC0 do not get entered in LOG_LINKS. */
1311
1312 if (HAVE_cc0
1313 && JUMP_P (insn)
1314 && (prev = prev_nonnote_insn (insn)) != 0
1315 && NONJUMP_INSN_P (prev)
1316 && sets_cc0_p (PATTERN (prev)))
1317 {
1318 if ((next = try_combine (insn, prev, NULL, NULL,
1319 &new_direct_jump_p,
1320 last_combined_insn)) != 0)
1321 goto retry;
1322
1323 FOR_EACH_LOG_LINK (nextlinks, prev)
1324 if ((next = try_combine (insn, prev, nextlinks->insn,
1325 NULL, &new_direct_jump_p,
1326 last_combined_insn)) != 0)
1327 goto retry;
1328 }
1329
1330 /* Do the same for an insn that explicitly references CC0. */
1331 if (HAVE_cc0 && NONJUMP_INSN_P (insn)
1332 && (prev = prev_nonnote_insn (insn)) != 0
1333 && NONJUMP_INSN_P (prev)
1334 && sets_cc0_p (PATTERN (prev))
1335 && GET_CODE (PATTERN (insn)) == SET
1336 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
1337 {
1338 if ((next = try_combine (insn, prev, NULL, NULL,
1339 &new_direct_jump_p,
1340 last_combined_insn)) != 0)
1341 goto retry;
1342
1343 FOR_EACH_LOG_LINK (nextlinks, prev)
1344 if ((next = try_combine (insn, prev, nextlinks->insn,
1345 NULL, &new_direct_jump_p,
1346 last_combined_insn)) != 0)
1347 goto retry;
1348 }
1349
1350 /* Finally, see if any of the insns that this insn links to
1351 explicitly references CC0. If so, try this insn, that insn,
1352 and its predecessor if it sets CC0. */
1353 if (HAVE_cc0)
1354 {
1355 FOR_EACH_LOG_LINK (links, insn)
1356 if (NONJUMP_INSN_P (links->insn)
1357 && GET_CODE (PATTERN (links->insn)) == SET
1358 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (links->insn)))
1359 && (prev = prev_nonnote_insn (links->insn)) != 0
1360 && NONJUMP_INSN_P (prev)
1361 && sets_cc0_p (PATTERN (prev))
1362 && (next = try_combine (insn, links->insn,
1363 prev, NULL, &new_direct_jump_p,
1364 last_combined_insn)) != 0)
1365 goto retry;
1366 }
1367
1368 /* Try combining an insn with two different insns whose results it
1369 uses. */
1370 if (max_combine >= 3)
1371 FOR_EACH_LOG_LINK (links, insn)
1372 for (nextlinks = links->next; nextlinks;
1373 nextlinks = nextlinks->next)
1374 if ((next = try_combine (insn, links->insn,
1375 nextlinks->insn, NULL,
1376 &new_direct_jump_p,
1377 last_combined_insn)) != 0)
1378
1379 {
1380 statistics_counter_event (cfun, "three-insn combine", 1);
1381 goto retry;
1382 }
1383
1384 /* Try four-instruction combinations. */
1385 if (max_combine >= 4)
1386 FOR_EACH_LOG_LINK (links, insn)
1387 {
1388 struct insn_link *next1;
1389 rtx_insn *link = links->insn;
1390
1391 /* If the linked insn has been replaced by a note, then there
1392 is no point in pursuing this chain any further. */
1393 if (NOTE_P (link))
1394 continue;
1395
1396 FOR_EACH_LOG_LINK (next1, link)
1397 {
1398 rtx_insn *link1 = next1->insn;
1399 if (NOTE_P (link1))
1400 continue;
1401 /* I0 -> I1 -> I2 -> I3. */
1402 FOR_EACH_LOG_LINK (nextlinks, link1)
1403 if ((next = try_combine (insn, link, link1,
1404 nextlinks->insn,
1405 &new_direct_jump_p,
1406 last_combined_insn)) != 0)
1407 {
1408 statistics_counter_event (cfun, "four-insn combine", 1);
1409 goto retry;
1410 }
1411 /* I0, I1 -> I2, I2 -> I3. */
1412 for (nextlinks = next1->next; nextlinks;
1413 nextlinks = nextlinks->next)
1414 if ((next = try_combine (insn, link, link1,
1415 nextlinks->insn,
1416 &new_direct_jump_p,
1417 last_combined_insn)) != 0)
1418 {
1419 statistics_counter_event (cfun, "four-insn combine", 1);
1420 goto retry;
1421 }
1422 }
1423
1424 for (next1 = links->next; next1; next1 = next1->next)
1425 {
1426 rtx_insn *link1 = next1->insn;
1427 if (NOTE_P (link1))
1428 continue;
1429 /* I0 -> I2; I1, I2 -> I3. */
1430 FOR_EACH_LOG_LINK (nextlinks, link)
1431 if ((next = try_combine (insn, link, link1,
1432 nextlinks->insn,
1433 &new_direct_jump_p,
1434 last_combined_insn)) != 0)
1435 {
1436 statistics_counter_event (cfun, "four-insn combine", 1);
1437 goto retry;
1438 }
1439 /* I0 -> I1; I1, I2 -> I3. */
1440 FOR_EACH_LOG_LINK (nextlinks, link1)
1441 if ((next = try_combine (insn, link, link1,
1442 nextlinks->insn,
1443 &new_direct_jump_p,
1444 last_combined_insn)) != 0)
1445 {
1446 statistics_counter_event (cfun, "four-insn combine", 1);
1447 goto retry;
1448 }
1449 }
1450 }
1451
1452 /* Try this insn with each REG_EQUAL note it links back to. */
1453 FOR_EACH_LOG_LINK (links, insn)
1454 {
1455 rtx set, note;
1456 rtx_insn *temp = links->insn;
1457 if ((set = single_set (temp)) != 0
1458 && (note = find_reg_equal_equiv_note (temp)) != 0
1459 && (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST
1460 /* Avoid using a register that may already been marked
1461 dead by an earlier instruction. */
1462 && ! unmentioned_reg_p (note, SET_SRC (set))
1463 && (GET_MODE (note) == VOIDmode
1464 ? SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set)))
1465 : (GET_MODE (SET_DEST (set)) == GET_MODE (note)
1466 && (GET_CODE (SET_DEST (set)) != ZERO_EXTRACT
1467 || (GET_MODE (XEXP (SET_DEST (set), 0))
1468 == GET_MODE (note))))))
1469 {
1470 /* Temporarily replace the set's source with the
1471 contents of the REG_EQUAL note. The insn will
1472 be deleted or recognized by try_combine. */
1473 rtx orig_src = SET_SRC (set);
1474 rtx orig_dest = SET_DEST (set);
1475 if (GET_CODE (SET_DEST (set)) == ZERO_EXTRACT)
1476 SET_DEST (set) = XEXP (SET_DEST (set), 0);
1477 SET_SRC (set) = note;
1478 i2mod = temp;
1479 i2mod_old_rhs = copy_rtx (orig_src);
1480 i2mod_new_rhs = copy_rtx (note);
1481 next = try_combine (insn, i2mod, NULL, NULL,
1482 &new_direct_jump_p,
1483 last_combined_insn);
1484 i2mod = NULL;
1485 if (next)
1486 {
1487 statistics_counter_event (cfun, "insn-with-note combine", 1);
1488 goto retry;
1489 }
1490 SET_SRC (set) = orig_src;
1491 SET_DEST (set) = orig_dest;
1492 }
1493 }
1494
1495 if (!NOTE_P (insn))
1496 record_dead_and_set_regs (insn);
1497
1498 retry:
1499 ;
1500 }
1501 }
1502
1503 default_rtl_profile ();
1504 clear_bb_flags ();
1505 new_direct_jump_p |= purge_all_dead_edges ();
1506 delete_noop_moves ();
1507
1508 /* Clean up. */
1509 obstack_free (&insn_link_obstack, NULL);
1510 free (uid_log_links);
1511 free (uid_insn_cost);
1512 reg_stat.release ();
1513
1514 {
1515 struct undo *undo, *next;
1516 for (undo = undobuf.frees; undo; undo = next)
1517 {
1518 next = undo->next;
1519 free (undo);
1520 }
1521 undobuf.frees = 0;
1522 }
1523
1524 total_attempts += combine_attempts;
1525 total_merges += combine_merges;
1526 total_extras += combine_extras;
1527 total_successes += combine_successes;
1528
1529 nonzero_sign_valid = 0;
1530 rtl_hooks = general_rtl_hooks;
1531
1532 /* Make recognizer allow volatile MEMs again. */
1533 init_recog ();
1534
1535 return new_direct_jump_p;
1536 }
1537
1538 /* Wipe the last_xxx fields of reg_stat in preparation for another pass. */
1539
1540 static void
1541 init_reg_last (void)
1542 {
1543 unsigned int i;
1544 reg_stat_type *p;
1545
1546 FOR_EACH_VEC_ELT (reg_stat, i, p)
1547 memset (p, 0, offsetof (reg_stat_type, sign_bit_copies));
1548 }
1549 \f
1550 /* Set up any promoted values for incoming argument registers. */
1551
1552 static void
1553 setup_incoming_promotions (rtx_insn *first)
1554 {
1555 tree arg;
1556 bool strictly_local = false;
1557
1558 for (arg = DECL_ARGUMENTS (current_function_decl); arg;
1559 arg = DECL_CHAIN (arg))
1560 {
1561 rtx x, reg = DECL_INCOMING_RTL (arg);
1562 int uns1, uns3;
1563 machine_mode mode1, mode2, mode3, mode4;
1564
1565 /* Only continue if the incoming argument is in a register. */
1566 if (!REG_P (reg))
1567 continue;
1568
1569 /* Determine, if possible, whether all call sites of the current
1570 function lie within the current compilation unit. (This does
1571 take into account the exporting of a function via taking its
1572 address, and so forth.) */
1573 strictly_local = cgraph_node::local_info (current_function_decl)->local;
1574
1575 /* The mode and signedness of the argument before any promotions happen
1576 (equal to the mode of the pseudo holding it at that stage). */
1577 mode1 = TYPE_MODE (TREE_TYPE (arg));
1578 uns1 = TYPE_UNSIGNED (TREE_TYPE (arg));
1579
1580 /* The mode and signedness of the argument after any source language and
1581 TARGET_PROMOTE_PROTOTYPES-driven promotions. */
1582 mode2 = TYPE_MODE (DECL_ARG_TYPE (arg));
1583 uns3 = TYPE_UNSIGNED (DECL_ARG_TYPE (arg));
1584
1585 /* The mode and signedness of the argument as it is actually passed,
1586 see assign_parm_setup_reg in function.c. */
1587 mode3 = promote_function_mode (TREE_TYPE (arg), mode1, &uns3,
1588 TREE_TYPE (cfun->decl), 0);
1589
1590 /* The mode of the register in which the argument is being passed. */
1591 mode4 = GET_MODE (reg);
1592
1593 /* Eliminate sign extensions in the callee when:
1594 (a) A mode promotion has occurred; */
1595 if (mode1 == mode3)
1596 continue;
1597 /* (b) The mode of the register is the same as the mode of
1598 the argument as it is passed; */
1599 if (mode3 != mode4)
1600 continue;
1601 /* (c) There's no language level extension; */
1602 if (mode1 == mode2)
1603 ;
1604 /* (c.1) All callers are from the current compilation unit. If that's
1605 the case we don't have to rely on an ABI, we only have to know
1606 what we're generating right now, and we know that we will do the
1607 mode1 to mode2 promotion with the given sign. */
1608 else if (!strictly_local)
1609 continue;
1610 /* (c.2) The combination of the two promotions is useful. This is
1611 true when the signs match, or if the first promotion is unsigned.
1612 In the later case, (sign_extend (zero_extend x)) is the same as
1613 (zero_extend (zero_extend x)), so make sure to force UNS3 true. */
1614 else if (uns1)
1615 uns3 = true;
1616 else if (uns3)
1617 continue;
1618
1619 /* Record that the value was promoted from mode1 to mode3,
1620 so that any sign extension at the head of the current
1621 function may be eliminated. */
1622 x = gen_rtx_CLOBBER (mode1, const0_rtx);
1623 x = gen_rtx_fmt_e ((uns3 ? ZERO_EXTEND : SIGN_EXTEND), mode3, x);
1624 record_value_for_reg (reg, first, x);
1625 }
1626 }
1627
1628 /* If MODE has a precision lower than PREC and SRC is a non-negative constant
1629 that would appear negative in MODE, sign-extend SRC for use in nonzero_bits
1630 because some machines (maybe most) will actually do the sign-extension and
1631 this is the conservative approach.
1632
1633 ??? For 2.5, try to tighten up the MD files in this regard instead of this
1634 kludge. */
1635
1636 static rtx
1637 sign_extend_short_imm (rtx src, machine_mode mode, unsigned int prec)
1638 {
1639 if (GET_MODE_PRECISION (mode) < prec
1640 && CONST_INT_P (src)
1641 && INTVAL (src) > 0
1642 && val_signbit_known_set_p (mode, INTVAL (src)))
1643 src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (mode));
1644
1645 return src;
1646 }
1647
1648 /* Update RSP for pseudo-register X from INSN's REG_EQUAL note (if one exists)
1649 and SET. */
1650
1651 static void
1652 update_rsp_from_reg_equal (reg_stat_type *rsp, rtx_insn *insn, const_rtx set,
1653 rtx x)
1654 {
1655 rtx reg_equal_note = insn ? find_reg_equal_equiv_note (insn) : NULL_RTX;
1656 unsigned HOST_WIDE_INT bits = 0;
1657 rtx reg_equal = NULL, src = SET_SRC (set);
1658 unsigned int num = 0;
1659
1660 if (reg_equal_note)
1661 reg_equal = XEXP (reg_equal_note, 0);
1662
1663 if (SHORT_IMMEDIATES_SIGN_EXTEND)
1664 {
1665 src = sign_extend_short_imm (src, GET_MODE (x), BITS_PER_WORD);
1666 if (reg_equal)
1667 reg_equal = sign_extend_short_imm (reg_equal, GET_MODE (x), BITS_PER_WORD);
1668 }
1669
1670 /* Don't call nonzero_bits if it cannot change anything. */
1671 if (rsp->nonzero_bits != HOST_WIDE_INT_M1U)
1672 {
1673 bits = nonzero_bits (src, nonzero_bits_mode);
1674 if (reg_equal && bits)
1675 bits &= nonzero_bits (reg_equal, nonzero_bits_mode);
1676 rsp->nonzero_bits |= bits;
1677 }
1678
1679 /* Don't call num_sign_bit_copies if it cannot change anything. */
1680 if (rsp->sign_bit_copies != 1)
1681 {
1682 num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1683 if (reg_equal && num != GET_MODE_PRECISION (GET_MODE (x)))
1684 {
1685 unsigned int numeq = num_sign_bit_copies (reg_equal, GET_MODE (x));
1686 if (num == 0 || numeq > num)
1687 num = numeq;
1688 }
1689 if (rsp->sign_bit_copies == 0 || num < rsp->sign_bit_copies)
1690 rsp->sign_bit_copies = num;
1691 }
1692 }
1693
1694 /* Called via note_stores. If X is a pseudo that is narrower than
1695 HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
1696
1697 If we are setting only a portion of X and we can't figure out what
1698 portion, assume all bits will be used since we don't know what will
1699 be happening.
1700
1701 Similarly, set how many bits of X are known to be copies of the sign bit
1702 at all locations in the function. This is the smallest number implied
1703 by any set of X. */
1704
1705 static void
1706 set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
1707 {
1708 rtx_insn *insn = (rtx_insn *) data;
1709 scalar_int_mode mode;
1710
1711 if (REG_P (x)
1712 && REGNO (x) >= FIRST_PSEUDO_REGISTER
1713 /* If this register is undefined at the start of the file, we can't
1714 say what its contents were. */
1715 && ! REGNO_REG_SET_P
1716 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb), REGNO (x))
1717 && is_a <scalar_int_mode> (GET_MODE (x), &mode)
1718 && HWI_COMPUTABLE_MODE_P (mode))
1719 {
1720 reg_stat_type *rsp = &reg_stat[REGNO (x)];
1721
1722 if (set == 0 || GET_CODE (set) == CLOBBER)
1723 {
1724 rsp->nonzero_bits = GET_MODE_MASK (mode);
1725 rsp->sign_bit_copies = 1;
1726 return;
1727 }
1728
1729 /* If this register is being initialized using itself, and the
1730 register is uninitialized in this basic block, and there are
1731 no LOG_LINKS which set the register, then part of the
1732 register is uninitialized. In that case we can't assume
1733 anything about the number of nonzero bits.
1734
1735 ??? We could do better if we checked this in
1736 reg_{nonzero_bits,num_sign_bit_copies}_for_combine. Then we
1737 could avoid making assumptions about the insn which initially
1738 sets the register, while still using the information in other
1739 insns. We would have to be careful to check every insn
1740 involved in the combination. */
1741
1742 if (insn
1743 && reg_referenced_p (x, PATTERN (insn))
1744 && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)),
1745 REGNO (x)))
1746 {
1747 struct insn_link *link;
1748
1749 FOR_EACH_LOG_LINK (link, insn)
1750 if (dead_or_set_p (link->insn, x))
1751 break;
1752 if (!link)
1753 {
1754 rsp->nonzero_bits = GET_MODE_MASK (mode);
1755 rsp->sign_bit_copies = 1;
1756 return;
1757 }
1758 }
1759
1760 /* If this is a complex assignment, see if we can convert it into a
1761 simple assignment. */
1762 set = expand_field_assignment (set);
1763
1764 /* If this is a simple assignment, or we have a paradoxical SUBREG,
1765 set what we know about X. */
1766
1767 if (SET_DEST (set) == x
1768 || (paradoxical_subreg_p (SET_DEST (set))
1769 && SUBREG_REG (SET_DEST (set)) == x))
1770 update_rsp_from_reg_equal (rsp, insn, set, x);
1771 else
1772 {
1773 rsp->nonzero_bits = GET_MODE_MASK (mode);
1774 rsp->sign_bit_copies = 1;
1775 }
1776 }
1777 }
1778 \f
1779 /* See if INSN can be combined into I3. PRED, PRED2, SUCC and SUCC2 are
1780 optionally insns that were previously combined into I3 or that will be
1781 combined into the merger of INSN and I3. The order is PRED, PRED2,
1782 INSN, SUCC, SUCC2, I3.
1783
1784 Return 0 if the combination is not allowed for any reason.
1785
1786 If the combination is allowed, *PDEST will be set to the single
1787 destination of INSN and *PSRC to the single source, and this function
1788 will return 1. */
1789
1790 static int
1791 can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED,
1792 rtx_insn *pred2 ATTRIBUTE_UNUSED, rtx_insn *succ, rtx_insn *succ2,
1793 rtx *pdest, rtx *psrc)
1794 {
1795 int i;
1796 const_rtx set = 0;
1797 rtx src, dest;
1798 rtx_insn *p;
1799 rtx link;
1800 bool all_adjacent = true;
1801 int (*is_volatile_p) (const_rtx);
1802
1803 if (succ)
1804 {
1805 if (succ2)
1806 {
1807 if (next_active_insn (succ2) != i3)
1808 all_adjacent = false;
1809 if (next_active_insn (succ) != succ2)
1810 all_adjacent = false;
1811 }
1812 else if (next_active_insn (succ) != i3)
1813 all_adjacent = false;
1814 if (next_active_insn (insn) != succ)
1815 all_adjacent = false;
1816 }
1817 else if (next_active_insn (insn) != i3)
1818 all_adjacent = false;
1819
1820 /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1821 or a PARALLEL consisting of such a SET and CLOBBERs.
1822
1823 If INSN has CLOBBER parallel parts, ignore them for our processing.
1824 By definition, these happen during the execution of the insn. When it
1825 is merged with another insn, all bets are off. If they are, in fact,
1826 needed and aren't also supplied in I3, they may be added by
1827 recog_for_combine. Otherwise, it won't match.
1828
1829 We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1830 note.
1831
1832 Get the source and destination of INSN. If more than one, can't
1833 combine. */
1834
1835 if (GET_CODE (PATTERN (insn)) == SET)
1836 set = PATTERN (insn);
1837 else if (GET_CODE (PATTERN (insn)) == PARALLEL
1838 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1839 {
1840 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1841 {
1842 rtx elt = XVECEXP (PATTERN (insn), 0, i);
1843
1844 switch (GET_CODE (elt))
1845 {
1846 /* This is important to combine floating point insns
1847 for the SH4 port. */
1848 case USE:
1849 /* Combining an isolated USE doesn't make sense.
1850 We depend here on combinable_i3pat to reject them. */
1851 /* The code below this loop only verifies that the inputs of
1852 the SET in INSN do not change. We call reg_set_between_p
1853 to verify that the REG in the USE does not change between
1854 I3 and INSN.
1855 If the USE in INSN was for a pseudo register, the matching
1856 insn pattern will likely match any register; combining this
1857 with any other USE would only be safe if we knew that the
1858 used registers have identical values, or if there was
1859 something to tell them apart, e.g. different modes. For
1860 now, we forgo such complicated tests and simply disallow
1861 combining of USES of pseudo registers with any other USE. */
1862 if (REG_P (XEXP (elt, 0))
1863 && GET_CODE (PATTERN (i3)) == PARALLEL)
1864 {
1865 rtx i3pat = PATTERN (i3);
1866 int i = XVECLEN (i3pat, 0) - 1;
1867 unsigned int regno = REGNO (XEXP (elt, 0));
1868
1869 do
1870 {
1871 rtx i3elt = XVECEXP (i3pat, 0, i);
1872
1873 if (GET_CODE (i3elt) == USE
1874 && REG_P (XEXP (i3elt, 0))
1875 && (REGNO (XEXP (i3elt, 0)) == regno
1876 ? reg_set_between_p (XEXP (elt, 0),
1877 PREV_INSN (insn), i3)
1878 : regno >= FIRST_PSEUDO_REGISTER))
1879 return 0;
1880 }
1881 while (--i >= 0);
1882 }
1883 break;
1884
1885 /* We can ignore CLOBBERs. */
1886 case CLOBBER:
1887 break;
1888
1889 case SET:
1890 /* Ignore SETs whose result isn't used but not those that
1891 have side-effects. */
1892 if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1893 && insn_nothrow_p (insn)
1894 && !side_effects_p (elt))
1895 break;
1896
1897 /* If we have already found a SET, this is a second one and
1898 so we cannot combine with this insn. */
1899 if (set)
1900 return 0;
1901
1902 set = elt;
1903 break;
1904
1905 default:
1906 /* Anything else means we can't combine. */
1907 return 0;
1908 }
1909 }
1910
1911 if (set == 0
1912 /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1913 so don't do anything with it. */
1914 || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1915 return 0;
1916 }
1917 else
1918 return 0;
1919
1920 if (set == 0)
1921 return 0;
1922
1923 /* The simplification in expand_field_assignment may call back to
1924 get_last_value, so set safe guard here. */
1925 subst_low_luid = DF_INSN_LUID (insn);
1926
1927 set = expand_field_assignment (set);
1928 src = SET_SRC (set), dest = SET_DEST (set);
1929
1930 /* Do not eliminate user-specified register if it is in an
1931 asm input because we may break the register asm usage defined
1932 in GCC manual if allow to do so.
1933 Be aware that this may cover more cases than we expect but this
1934 should be harmless. */
1935 if (REG_P (dest) && REG_USERVAR_P (dest) && HARD_REGISTER_P (dest)
1936 && extract_asm_operands (PATTERN (i3)))
1937 return 0;
1938
1939 /* Don't eliminate a store in the stack pointer. */
1940 if (dest == stack_pointer_rtx
1941 /* Don't combine with an insn that sets a register to itself if it has
1942 a REG_EQUAL note. This may be part of a LIBCALL sequence. */
1943 || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1944 /* Can't merge an ASM_OPERANDS. */
1945 || GET_CODE (src) == ASM_OPERANDS
1946 /* Can't merge a function call. */
1947 || GET_CODE (src) == CALL
1948 /* Don't eliminate a function call argument. */
1949 || (CALL_P (i3)
1950 && (find_reg_fusage (i3, USE, dest)
1951 || (REG_P (dest)
1952 && REGNO (dest) < FIRST_PSEUDO_REGISTER
1953 && global_regs[REGNO (dest)])))
1954 /* Don't substitute into an incremented register. */
1955 || FIND_REG_INC_NOTE (i3, dest)
1956 || (succ && FIND_REG_INC_NOTE (succ, dest))
1957 || (succ2 && FIND_REG_INC_NOTE (succ2, dest))
1958 /* Don't substitute into a non-local goto, this confuses CFG. */
1959 || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1960 /* Make sure that DEST is not used after INSN but before SUCC, or
1961 after SUCC and before SUCC2, or after SUCC2 but before I3. */
1962 || (!all_adjacent
1963 && ((succ2
1964 && (reg_used_between_p (dest, succ2, i3)
1965 || reg_used_between_p (dest, succ, succ2)))
1966 || (!succ2 && succ && reg_used_between_p (dest, succ, i3))
1967 || (succ
1968 /* SUCC and SUCC2 can be split halves from a PARALLEL; in
1969 that case SUCC is not in the insn stream, so use SUCC2
1970 instead for this test. */
1971 && reg_used_between_p (dest, insn,
1972 succ2
1973 && INSN_UID (succ) == INSN_UID (succ2)
1974 ? succ2 : succ))))
1975 /* Make sure that the value that is to be substituted for the register
1976 does not use any registers whose values alter in between. However,
1977 If the insns are adjacent, a use can't cross a set even though we
1978 think it might (this can happen for a sequence of insns each setting
1979 the same destination; last_set of that register might point to
1980 a NOTE). If INSN has a REG_EQUIV note, the register is always
1981 equivalent to the memory so the substitution is valid even if there
1982 are intervening stores. Also, don't move a volatile asm or
1983 UNSPEC_VOLATILE across any other insns. */
1984 || (! all_adjacent
1985 && (((!MEM_P (src)
1986 || ! find_reg_note (insn, REG_EQUIV, src))
1987 && use_crosses_set_p (src, DF_INSN_LUID (insn)))
1988 || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1989 || GET_CODE (src) == UNSPEC_VOLATILE))
1990 /* Don't combine across a CALL_INSN, because that would possibly
1991 change whether the life span of some REGs crosses calls or not,
1992 and it is a pain to update that information.
1993 Exception: if source is a constant, moving it later can't hurt.
1994 Accept that as a special case. */
1995 || (DF_INSN_LUID (insn) < last_call_luid && ! CONSTANT_P (src)))
1996 return 0;
1997
1998 /* DEST must either be a REG or CC0. */
1999 if (REG_P (dest))
2000 {
2001 /* If register alignment is being enforced for multi-word items in all
2002 cases except for parameters, it is possible to have a register copy
2003 insn referencing a hard register that is not allowed to contain the
2004 mode being copied and which would not be valid as an operand of most
2005 insns. Eliminate this problem by not combining with such an insn.
2006
2007 Also, on some machines we don't want to extend the life of a hard
2008 register. */
2009
2010 if (REG_P (src)
2011 && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
2012 && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
2013 /* Don't extend the life of a hard register unless it is
2014 user variable (if we have few registers) or it can't
2015 fit into the desired register (meaning something special
2016 is going on).
2017 Also avoid substituting a return register into I3, because
2018 reload can't handle a conflict with constraints of other
2019 inputs. */
2020 || (REGNO (src) < FIRST_PSEUDO_REGISTER
2021 && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
2022 return 0;
2023 }
2024 else if (GET_CODE (dest) != CC0)
2025 return 0;
2026
2027
2028 if (GET_CODE (PATTERN (i3)) == PARALLEL)
2029 for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
2030 if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
2031 {
2032 rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
2033
2034 /* If the clobber represents an earlyclobber operand, we must not
2035 substitute an expression containing the clobbered register.
2036 As we do not analyze the constraint strings here, we have to
2037 make the conservative assumption. However, if the register is
2038 a fixed hard reg, the clobber cannot represent any operand;
2039 we leave it up to the machine description to either accept or
2040 reject use-and-clobber patterns. */
2041 if (!REG_P (reg)
2042 || REGNO (reg) >= FIRST_PSEUDO_REGISTER
2043 || !fixed_regs[REGNO (reg)])
2044 if (reg_overlap_mentioned_p (reg, src))
2045 return 0;
2046 }
2047
2048 /* If INSN contains anything volatile, or is an `asm' (whether volatile
2049 or not), reject, unless nothing volatile comes between it and I3 */
2050
2051 if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
2052 {
2053 /* Make sure neither succ nor succ2 contains a volatile reference. */
2054 if (succ2 != 0 && volatile_refs_p (PATTERN (succ2)))
2055 return 0;
2056 if (succ != 0 && volatile_refs_p (PATTERN (succ)))
2057 return 0;
2058 /* We'll check insns between INSN and I3 below. */
2059 }
2060
2061 /* If INSN is an asm, and DEST is a hard register, reject, since it has
2062 to be an explicit register variable, and was chosen for a reason. */
2063
2064 if (GET_CODE (src) == ASM_OPERANDS
2065 && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
2066 return 0;
2067
2068 /* If INSN contains volatile references (specifically volatile MEMs),
2069 we cannot combine across any other volatile references.
2070 Even if INSN doesn't contain volatile references, any intervening
2071 volatile insn might affect machine state. */
2072
2073 is_volatile_p = volatile_refs_p (PATTERN (insn))
2074 ? volatile_refs_p
2075 : volatile_insn_p;
2076
2077 for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
2078 if (INSN_P (p) && p != succ && p != succ2 && is_volatile_p (PATTERN (p)))
2079 return 0;
2080
2081 /* If INSN contains an autoincrement or autodecrement, make sure that
2082 register is not used between there and I3, and not already used in
2083 I3 either. Neither must it be used in PRED or SUCC, if they exist.
2084 Also insist that I3 not be a jump; if it were one
2085 and the incremented register were spilled, we would lose. */
2086
2087 if (AUTO_INC_DEC)
2088 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
2089 if (REG_NOTE_KIND (link) == REG_INC
2090 && (JUMP_P (i3)
2091 || reg_used_between_p (XEXP (link, 0), insn, i3)
2092 || (pred != NULL_RTX
2093 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
2094 || (pred2 != NULL_RTX
2095 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred2)))
2096 || (succ != NULL_RTX
2097 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
2098 || (succ2 != NULL_RTX
2099 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ2)))
2100 || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
2101 return 0;
2102
2103 /* Don't combine an insn that follows a CC0-setting insn.
2104 An insn that uses CC0 must not be separated from the one that sets it.
2105 We do, however, allow I2 to follow a CC0-setting insn if that insn
2106 is passed as I1; in that case it will be deleted also.
2107 We also allow combining in this case if all the insns are adjacent
2108 because that would leave the two CC0 insns adjacent as well.
2109 It would be more logical to test whether CC0 occurs inside I1 or I2,
2110 but that would be much slower, and this ought to be equivalent. */
2111
2112 if (HAVE_cc0)
2113 {
2114 p = prev_nonnote_insn (insn);
2115 if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
2116 && ! all_adjacent)
2117 return 0;
2118 }
2119
2120 /* If we get here, we have passed all the tests and the combination is
2121 to be allowed. */
2122
2123 *pdest = dest;
2124 *psrc = src;
2125
2126 return 1;
2127 }
2128 \f
2129 /* LOC is the location within I3 that contains its pattern or the component
2130 of a PARALLEL of the pattern. We validate that it is valid for combining.
2131
2132 One problem is if I3 modifies its output, as opposed to replacing it
2133 entirely, we can't allow the output to contain I2DEST, I1DEST or I0DEST as
2134 doing so would produce an insn that is not equivalent to the original insns.
2135
2136 Consider:
2137
2138 (set (reg:DI 101) (reg:DI 100))
2139 (set (subreg:SI (reg:DI 101) 0) <foo>)
2140
2141 This is NOT equivalent to:
2142
2143 (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
2144 (set (reg:DI 101) (reg:DI 100))])
2145
2146 Not only does this modify 100 (in which case it might still be valid
2147 if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
2148
2149 We can also run into a problem if I2 sets a register that I1
2150 uses and I1 gets directly substituted into I3 (not via I2). In that
2151 case, we would be getting the wrong value of I2DEST into I3, so we
2152 must reject the combination. This case occurs when I2 and I1 both
2153 feed into I3, rather than when I1 feeds into I2, which feeds into I3.
2154 If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
2155 of a SET must prevent combination from occurring. The same situation
2156 can occur for I0, in which case I0_NOT_IN_SRC is set.
2157
2158 Before doing the above check, we first try to expand a field assignment
2159 into a set of logical operations.
2160
2161 If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
2162 we place a register that is both set and used within I3. If more than one
2163 such register is detected, we fail.
2164
2165 Return 1 if the combination is valid, zero otherwise. */
2166
2167 static int
2168 combinable_i3pat (rtx_insn *i3, rtx *loc, rtx i2dest, rtx i1dest, rtx i0dest,
2169 int i1_not_in_src, int i0_not_in_src, rtx *pi3dest_killed)
2170 {
2171 rtx x = *loc;
2172
2173 if (GET_CODE (x) == SET)
2174 {
2175 rtx set = x ;
2176 rtx dest = SET_DEST (set);
2177 rtx src = SET_SRC (set);
2178 rtx inner_dest = dest;
2179 rtx subdest;
2180
2181 while (GET_CODE (inner_dest) == STRICT_LOW_PART
2182 || GET_CODE (inner_dest) == SUBREG
2183 || GET_CODE (inner_dest) == ZERO_EXTRACT)
2184 inner_dest = XEXP (inner_dest, 0);
2185
2186 /* Check for the case where I3 modifies its output, as discussed
2187 above. We don't want to prevent pseudos from being combined
2188 into the address of a MEM, so only prevent the combination if
2189 i1 or i2 set the same MEM. */
2190 if ((inner_dest != dest &&
2191 (!MEM_P (inner_dest)
2192 || rtx_equal_p (i2dest, inner_dest)
2193 || (i1dest && rtx_equal_p (i1dest, inner_dest))
2194 || (i0dest && rtx_equal_p (i0dest, inner_dest)))
2195 && (reg_overlap_mentioned_p (i2dest, inner_dest)
2196 || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))
2197 || (i0dest && reg_overlap_mentioned_p (i0dest, inner_dest))))
2198
2199 /* This is the same test done in can_combine_p except we can't test
2200 all_adjacent; we don't have to, since this instruction will stay
2201 in place, thus we are not considering increasing the lifetime of
2202 INNER_DEST.
2203
2204 Also, if this insn sets a function argument, combining it with
2205 something that might need a spill could clobber a previous
2206 function argument; the all_adjacent test in can_combine_p also
2207 checks this; here, we do a more specific test for this case. */
2208
2209 || (REG_P (inner_dest)
2210 && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
2211 && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
2212 GET_MODE (inner_dest))))
2213 || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src))
2214 || (i0_not_in_src && reg_overlap_mentioned_p (i0dest, src)))
2215 return 0;
2216
2217 /* If DEST is used in I3, it is being killed in this insn, so
2218 record that for later. We have to consider paradoxical
2219 subregs here, since they kill the whole register, but we
2220 ignore partial subregs, STRICT_LOW_PART, etc.
2221 Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
2222 STACK_POINTER_REGNUM, since these are always considered to be
2223 live. Similarly for ARG_POINTER_REGNUM if it is fixed. */
2224 subdest = dest;
2225 if (GET_CODE (subdest) == SUBREG
2226 && (GET_MODE_SIZE (GET_MODE (subdest))
2227 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (subdest)))))
2228 subdest = SUBREG_REG (subdest);
2229 if (pi3dest_killed
2230 && REG_P (subdest)
2231 && reg_referenced_p (subdest, PATTERN (i3))
2232 && REGNO (subdest) != FRAME_POINTER_REGNUM
2233 && (HARD_FRAME_POINTER_IS_FRAME_POINTER
2234 || REGNO (subdest) != HARD_FRAME_POINTER_REGNUM)
2235 && (FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
2236 || (REGNO (subdest) != ARG_POINTER_REGNUM
2237 || ! fixed_regs [REGNO (subdest)]))
2238 && REGNO (subdest) != STACK_POINTER_REGNUM)
2239 {
2240 if (*pi3dest_killed)
2241 return 0;
2242
2243 *pi3dest_killed = subdest;
2244 }
2245 }
2246
2247 else if (GET_CODE (x) == PARALLEL)
2248 {
2249 int i;
2250
2251 for (i = 0; i < XVECLEN (x, 0); i++)
2252 if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest, i0dest,
2253 i1_not_in_src, i0_not_in_src, pi3dest_killed))
2254 return 0;
2255 }
2256
2257 return 1;
2258 }
2259 \f
2260 /* Return 1 if X is an arithmetic expression that contains a multiplication
2261 and division. We don't count multiplications by powers of two here. */
2262
2263 static int
2264 contains_muldiv (rtx x)
2265 {
2266 switch (GET_CODE (x))
2267 {
2268 case MOD: case DIV: case UMOD: case UDIV:
2269 return 1;
2270
2271 case MULT:
2272 return ! (CONST_INT_P (XEXP (x, 1))
2273 && pow2p_hwi (UINTVAL (XEXP (x, 1))));
2274 default:
2275 if (BINARY_P (x))
2276 return contains_muldiv (XEXP (x, 0))
2277 || contains_muldiv (XEXP (x, 1));
2278
2279 if (UNARY_P (x))
2280 return contains_muldiv (XEXP (x, 0));
2281
2282 return 0;
2283 }
2284 }
2285 \f
2286 /* Determine whether INSN can be used in a combination. Return nonzero if
2287 not. This is used in try_combine to detect early some cases where we
2288 can't perform combinations. */
2289
2290 static int
2291 cant_combine_insn_p (rtx_insn *insn)
2292 {
2293 rtx set;
2294 rtx src, dest;
2295
2296 /* If this isn't really an insn, we can't do anything.
2297 This can occur when flow deletes an insn that it has merged into an
2298 auto-increment address. */
2299 if (!NONDEBUG_INSN_P (insn))
2300 return 1;
2301
2302 /* Never combine loads and stores involving hard regs that are likely
2303 to be spilled. The register allocator can usually handle such
2304 reg-reg moves by tying. If we allow the combiner to make
2305 substitutions of likely-spilled regs, reload might die.
2306 As an exception, we allow combinations involving fixed regs; these are
2307 not available to the register allocator so there's no risk involved. */
2308
2309 set = single_set (insn);
2310 if (! set)
2311 return 0;
2312 src = SET_SRC (set);
2313 dest = SET_DEST (set);
2314 if (GET_CODE (src) == SUBREG)
2315 src = SUBREG_REG (src);
2316 if (GET_CODE (dest) == SUBREG)
2317 dest = SUBREG_REG (dest);
2318 if (REG_P (src) && REG_P (dest)
2319 && ((HARD_REGISTER_P (src)
2320 && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (src))
2321 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (src))))
2322 || (HARD_REGISTER_P (dest)
2323 && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (dest))
2324 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (dest))))))
2325 return 1;
2326
2327 return 0;
2328 }
2329
2330 struct likely_spilled_retval_info
2331 {
2332 unsigned regno, nregs;
2333 unsigned mask;
2334 };
2335
2336 /* Called via note_stores by likely_spilled_retval_p. Remove from info->mask
2337 hard registers that are known to be written to / clobbered in full. */
2338 static void
2339 likely_spilled_retval_1 (rtx x, const_rtx set, void *data)
2340 {
2341 struct likely_spilled_retval_info *const info =
2342 (struct likely_spilled_retval_info *) data;
2343 unsigned regno, nregs;
2344 unsigned new_mask;
2345
2346 if (!REG_P (XEXP (set, 0)))
2347 return;
2348 regno = REGNO (x);
2349 if (regno >= info->regno + info->nregs)
2350 return;
2351 nregs = REG_NREGS (x);
2352 if (regno + nregs <= info->regno)
2353 return;
2354 new_mask = (2U << (nregs - 1)) - 1;
2355 if (regno < info->regno)
2356 new_mask >>= info->regno - regno;
2357 else
2358 new_mask <<= regno - info->regno;
2359 info->mask &= ~new_mask;
2360 }
2361
2362 /* Return nonzero iff part of the return value is live during INSN, and
2363 it is likely spilled. This can happen when more than one insn is needed
2364 to copy the return value, e.g. when we consider to combine into the
2365 second copy insn for a complex value. */
2366
2367 static int
2368 likely_spilled_retval_p (rtx_insn *insn)
2369 {
2370 rtx_insn *use = BB_END (this_basic_block);
2371 rtx reg;
2372 rtx_insn *p;
2373 unsigned regno, nregs;
2374 /* We assume here that no machine mode needs more than
2375 32 hard registers when the value overlaps with a register
2376 for which TARGET_FUNCTION_VALUE_REGNO_P is true. */
2377 unsigned mask;
2378 struct likely_spilled_retval_info info;
2379
2380 if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
2381 return 0;
2382 reg = XEXP (PATTERN (use), 0);
2383 if (!REG_P (reg) || !targetm.calls.function_value_regno_p (REGNO (reg)))
2384 return 0;
2385 regno = REGNO (reg);
2386 nregs = REG_NREGS (reg);
2387 if (nregs == 1)
2388 return 0;
2389 mask = (2U << (nregs - 1)) - 1;
2390
2391 /* Disregard parts of the return value that are set later. */
2392 info.regno = regno;
2393 info.nregs = nregs;
2394 info.mask = mask;
2395 for (p = PREV_INSN (use); info.mask && p != insn; p = PREV_INSN (p))
2396 if (INSN_P (p))
2397 note_stores (PATTERN (p), likely_spilled_retval_1, &info);
2398 mask = info.mask;
2399
2400 /* Check if any of the (probably) live return value registers is
2401 likely spilled. */
2402 nregs --;
2403 do
2404 {
2405 if ((mask & 1 << nregs)
2406 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno + nregs)))
2407 return 1;
2408 } while (nregs--);
2409 return 0;
2410 }
2411
2412 /* Adjust INSN after we made a change to its destination.
2413
2414 Changing the destination can invalidate notes that say something about
2415 the results of the insn and a LOG_LINK pointing to the insn. */
2416
2417 static void
2418 adjust_for_new_dest (rtx_insn *insn)
2419 {
2420 /* For notes, be conservative and simply remove them. */
2421 remove_reg_equal_equiv_notes (insn);
2422
2423 /* The new insn will have a destination that was previously the destination
2424 of an insn just above it. Call distribute_links to make a LOG_LINK from
2425 the next use of that destination. */
2426
2427 rtx set = single_set (insn);
2428 gcc_assert (set);
2429
2430 rtx reg = SET_DEST (set);
2431
2432 while (GET_CODE (reg) == ZERO_EXTRACT
2433 || GET_CODE (reg) == STRICT_LOW_PART
2434 || GET_CODE (reg) == SUBREG)
2435 reg = XEXP (reg, 0);
2436 gcc_assert (REG_P (reg));
2437
2438 distribute_links (alloc_insn_link (insn, REGNO (reg), NULL));
2439
2440 df_insn_rescan (insn);
2441 }
2442
2443 /* Return TRUE if combine can reuse reg X in mode MODE.
2444 ADDED_SETS is nonzero if the original set is still required. */
2445 static bool
2446 can_change_dest_mode (rtx x, int added_sets, machine_mode mode)
2447 {
2448 unsigned int regno;
2449
2450 if (!REG_P (x))
2451 return false;
2452
2453 regno = REGNO (x);
2454 /* Allow hard registers if the new mode is legal, and occupies no more
2455 registers than the old mode. */
2456 if (regno < FIRST_PSEUDO_REGISTER)
2457 return (HARD_REGNO_MODE_OK (regno, mode)
2458 && REG_NREGS (x) >= hard_regno_nregs[regno][mode]);
2459
2460 /* Or a pseudo that is only used once. */
2461 return (regno < reg_n_sets_max
2462 && REG_N_SETS (regno) == 1
2463 && !added_sets
2464 && !REG_USERVAR_P (x));
2465 }
2466
2467
2468 /* Check whether X, the destination of a set, refers to part of
2469 the register specified by REG. */
2470
2471 static bool
2472 reg_subword_p (rtx x, rtx reg)
2473 {
2474 /* Check that reg is an integer mode register. */
2475 if (!REG_P (reg) || GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
2476 return false;
2477
2478 if (GET_CODE (x) == STRICT_LOW_PART
2479 || GET_CODE (x) == ZERO_EXTRACT)
2480 x = XEXP (x, 0);
2481
2482 return GET_CODE (x) == SUBREG
2483 && SUBREG_REG (x) == reg
2484 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT;
2485 }
2486
2487 /* Delete the unconditional jump INSN and adjust the CFG correspondingly.
2488 Note that the INSN should be deleted *after* removing dead edges, so
2489 that the kept edge is the fallthrough edge for a (set (pc) (pc))
2490 but not for a (set (pc) (label_ref FOO)). */
2491
2492 static void
2493 update_cfg_for_uncondjump (rtx_insn *insn)
2494 {
2495 basic_block bb = BLOCK_FOR_INSN (insn);
2496 gcc_assert (BB_END (bb) == insn);
2497
2498 purge_dead_edges (bb);
2499
2500 delete_insn (insn);
2501 if (EDGE_COUNT (bb->succs) == 1)
2502 {
2503 rtx_insn *insn;
2504
2505 single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2506
2507 /* Remove barriers from the footer if there are any. */
2508 for (insn = BB_FOOTER (bb); insn; insn = NEXT_INSN (insn))
2509 if (BARRIER_P (insn))
2510 {
2511 if (PREV_INSN (insn))
2512 SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2513 else
2514 BB_FOOTER (bb) = NEXT_INSN (insn);
2515 if (NEXT_INSN (insn))
2516 SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2517 }
2518 else if (LABEL_P (insn))
2519 break;
2520 }
2521 }
2522
2523 /* Return whether PAT is a PARALLEL of exactly N register SETs followed
2524 by an arbitrary number of CLOBBERs. */
2525 static bool
2526 is_parallel_of_n_reg_sets (rtx pat, int n)
2527 {
2528 if (GET_CODE (pat) != PARALLEL)
2529 return false;
2530
2531 int len = XVECLEN (pat, 0);
2532 if (len < n)
2533 return false;
2534
2535 int i;
2536 for (i = 0; i < n; i++)
2537 if (GET_CODE (XVECEXP (pat, 0, i)) != SET
2538 || !REG_P (SET_DEST (XVECEXP (pat, 0, i))))
2539 return false;
2540 for ( ; i < len; i++)
2541 if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER
2542 || XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
2543 return false;
2544
2545 return true;
2546 }
2547
2548 /* Return whether INSN, a PARALLEL of N register SETs (and maybe some
2549 CLOBBERs), can be split into individual SETs in that order, without
2550 changing semantics. */
2551 static bool
2552 can_split_parallel_of_n_reg_sets (rtx_insn *insn, int n)
2553 {
2554 if (!insn_nothrow_p (insn))
2555 return false;
2556
2557 rtx pat = PATTERN (insn);
2558
2559 int i, j;
2560 for (i = 0; i < n; i++)
2561 {
2562 if (side_effects_p (SET_SRC (XVECEXP (pat, 0, i))))
2563 return false;
2564
2565 rtx reg = SET_DEST (XVECEXP (pat, 0, i));
2566
2567 for (j = i + 1; j < n; j++)
2568 if (reg_referenced_p (reg, XVECEXP (pat, 0, j)))
2569 return false;
2570 }
2571
2572 return true;
2573 }
2574
2575 /* Try to combine the insns I0, I1 and I2 into I3.
2576 Here I0, I1 and I2 appear earlier than I3.
2577 I0 and I1 can be zero; then we combine just I2 into I3, or I1 and I2 into
2578 I3.
2579
2580 If we are combining more than two insns and the resulting insn is not
2581 recognized, try splitting it into two insns. If that happens, I2 and I3
2582 are retained and I1/I0 are pseudo-deleted by turning them into a NOTE.
2583 Otherwise, I0, I1 and I2 are pseudo-deleted.
2584
2585 Return 0 if the combination does not work. Then nothing is changed.
2586 If we did the combination, return the insn at which combine should
2587 resume scanning.
2588
2589 Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
2590 new direct jump instruction.
2591
2592 LAST_COMBINED_INSN is either I3, or some insn after I3 that has
2593 been I3 passed to an earlier try_combine within the same basic
2594 block. */
2595
2596 static rtx_insn *
2597 try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
2598 int *new_direct_jump_p, rtx_insn *last_combined_insn)
2599 {
2600 /* New patterns for I3 and I2, respectively. */
2601 rtx newpat, newi2pat = 0;
2602 rtvec newpat_vec_with_clobbers = 0;
2603 int substed_i2 = 0, substed_i1 = 0, substed_i0 = 0;
2604 /* Indicates need to preserve SET in I0, I1 or I2 in I3 if it is not
2605 dead. */
2606 int added_sets_0, added_sets_1, added_sets_2;
2607 /* Total number of SETs to put into I3. */
2608 int total_sets;
2609 /* Nonzero if I2's or I1's body now appears in I3. */
2610 int i2_is_used = 0, i1_is_used = 0;
2611 /* INSN_CODEs for new I3, new I2, and user of condition code. */
2612 int insn_code_number, i2_code_number = 0, other_code_number = 0;
2613 /* Contains I3 if the destination of I3 is used in its source, which means
2614 that the old life of I3 is being killed. If that usage is placed into
2615 I2 and not in I3, a REG_DEAD note must be made. */
2616 rtx i3dest_killed = 0;
2617 /* SET_DEST and SET_SRC of I2, I1 and I0. */
2618 rtx i2dest = 0, i2src = 0, i1dest = 0, i1src = 0, i0dest = 0, i0src = 0;
2619 /* Copy of SET_SRC of I1 and I0, if needed. */
2620 rtx i1src_copy = 0, i0src_copy = 0, i0src_copy2 = 0;
2621 /* Set if I2DEST was reused as a scratch register. */
2622 bool i2scratch = false;
2623 /* The PATTERNs of I0, I1, and I2, or a copy of them in certain cases. */
2624 rtx i0pat = 0, i1pat = 0, i2pat = 0;
2625 /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC. */
2626 int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
2627 int i0dest_in_i0src = 0, i1dest_in_i0src = 0, i2dest_in_i0src = 0;
2628 int i2dest_killed = 0, i1dest_killed = 0, i0dest_killed = 0;
2629 int i1_feeds_i2_n = 0, i0_feeds_i2_n = 0, i0_feeds_i1_n = 0;
2630 /* Notes that must be added to REG_NOTES in I3 and I2. */
2631 rtx new_i3_notes, new_i2_notes;
2632 /* Notes that we substituted I3 into I2 instead of the normal case. */
2633 int i3_subst_into_i2 = 0;
2634 /* Notes that I1, I2 or I3 is a MULT operation. */
2635 int have_mult = 0;
2636 int swap_i2i3 = 0;
2637 int changed_i3_dest = 0;
2638
2639 int maxreg;
2640 rtx_insn *temp_insn;
2641 rtx temp_expr;
2642 struct insn_link *link;
2643 rtx other_pat = 0;
2644 rtx new_other_notes;
2645 int i;
2646
2647 /* Immediately return if any of I0,I1,I2 are the same insn (I3 can
2648 never be). */
2649 if (i1 == i2 || i0 == i2 || (i0 && i0 == i1))
2650 return 0;
2651
2652 /* Only try four-insn combinations when there's high likelihood of
2653 success. Look for simple insns, such as loads of constants or
2654 binary operations involving a constant. */
2655 if (i0)
2656 {
2657 int i;
2658 int ngood = 0;
2659 int nshift = 0;
2660 rtx set0, set3;
2661
2662 if (!flag_expensive_optimizations)
2663 return 0;
2664
2665 for (i = 0; i < 4; i++)
2666 {
2667 rtx_insn *insn = i == 0 ? i0 : i == 1 ? i1 : i == 2 ? i2 : i3;
2668 rtx set = single_set (insn);
2669 rtx src;
2670 if (!set)
2671 continue;
2672 src = SET_SRC (set);
2673 if (CONSTANT_P (src))
2674 {
2675 ngood += 2;
2676 break;
2677 }
2678 else if (BINARY_P (src) && CONSTANT_P (XEXP (src, 1)))
2679 ngood++;
2680 else if (GET_CODE (src) == ASHIFT || GET_CODE (src) == ASHIFTRT
2681 || GET_CODE (src) == LSHIFTRT)
2682 nshift++;
2683 }
2684
2685 /* If I0 loads a memory and I3 sets the same memory, then I1 and I2
2686 are likely manipulating its value. Ideally we'll be able to combine
2687 all four insns into a bitfield insertion of some kind.
2688
2689 Note the source in I0 might be inside a sign/zero extension and the
2690 memory modes in I0 and I3 might be different. So extract the address
2691 from the destination of I3 and search for it in the source of I0.
2692
2693 In the event that there's a match but the source/dest do not actually
2694 refer to the same memory, the worst that happens is we try some
2695 combinations that we wouldn't have otherwise. */
2696 if ((set0 = single_set (i0))
2697 /* Ensure the source of SET0 is a MEM, possibly buried inside
2698 an extension. */
2699 && (GET_CODE (SET_SRC (set0)) == MEM
2700 || ((GET_CODE (SET_SRC (set0)) == ZERO_EXTEND
2701 || GET_CODE (SET_SRC (set0)) == SIGN_EXTEND)
2702 && GET_CODE (XEXP (SET_SRC (set0), 0)) == MEM))
2703 && (set3 = single_set (i3))
2704 /* Ensure the destination of SET3 is a MEM. */
2705 && GET_CODE (SET_DEST (set3)) == MEM
2706 /* Would it be better to extract the base address for the MEM
2707 in SET3 and look for that? I don't have cases where it matters
2708 but I could envision such cases. */
2709 && rtx_referenced_p (XEXP (SET_DEST (set3), 0), SET_SRC (set0)))
2710 ngood += 2;
2711
2712 if (ngood < 2 && nshift < 2)
2713 return 0;
2714 }
2715
2716 /* Exit early if one of the insns involved can't be used for
2717 combinations. */
2718 if (CALL_P (i2)
2719 || (i1 && CALL_P (i1))
2720 || (i0 && CALL_P (i0))
2721 || cant_combine_insn_p (i3)
2722 || cant_combine_insn_p (i2)
2723 || (i1 && cant_combine_insn_p (i1))
2724 || (i0 && cant_combine_insn_p (i0))
2725 || likely_spilled_retval_p (i3))
2726 return 0;
2727
2728 combine_attempts++;
2729 undobuf.other_insn = 0;
2730
2731 /* Reset the hard register usage information. */
2732 CLEAR_HARD_REG_SET (newpat_used_regs);
2733
2734 if (dump_file && (dump_flags & TDF_DETAILS))
2735 {
2736 if (i0)
2737 fprintf (dump_file, "\nTrying %d, %d, %d -> %d:\n",
2738 INSN_UID (i0), INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2739 else if (i1)
2740 fprintf (dump_file, "\nTrying %d, %d -> %d:\n",
2741 INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2742 else
2743 fprintf (dump_file, "\nTrying %d -> %d:\n",
2744 INSN_UID (i2), INSN_UID (i3));
2745 }
2746
2747 /* If multiple insns feed into one of I2 or I3, they can be in any
2748 order. To simplify the code below, reorder them in sequence. */
2749 if (i0 && DF_INSN_LUID (i0) > DF_INSN_LUID (i2))
2750 std::swap (i0, i2);
2751 if (i0 && DF_INSN_LUID (i0) > DF_INSN_LUID (i1))
2752 std::swap (i0, i1);
2753 if (i1 && DF_INSN_LUID (i1) > DF_INSN_LUID (i2))
2754 std::swap (i1, i2);
2755
2756 added_links_insn = 0;
2757
2758 /* First check for one important special case that the code below will
2759 not handle. Namely, the case where I1 is zero, I2 is a PARALLEL
2760 and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case,
2761 we may be able to replace that destination with the destination of I3.
2762 This occurs in the common code where we compute both a quotient and
2763 remainder into a structure, in which case we want to do the computation
2764 directly into the structure to avoid register-register copies.
2765
2766 Note that this case handles both multiple sets in I2 and also cases
2767 where I2 has a number of CLOBBERs inside the PARALLEL.
2768
2769 We make very conservative checks below and only try to handle the
2770 most common cases of this. For example, we only handle the case
2771 where I2 and I3 are adjacent to avoid making difficult register
2772 usage tests. */
2773
2774 if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
2775 && REG_P (SET_SRC (PATTERN (i3)))
2776 && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
2777 && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
2778 && GET_CODE (PATTERN (i2)) == PARALLEL
2779 && ! side_effects_p (SET_DEST (PATTERN (i3)))
2780 /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
2781 below would need to check what is inside (and reg_overlap_mentioned_p
2782 doesn't support those codes anyway). Don't allow those destinations;
2783 the resulting insn isn't likely to be recognized anyway. */
2784 && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
2785 && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
2786 && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
2787 SET_DEST (PATTERN (i3)))
2788 && next_active_insn (i2) == i3)
2789 {
2790 rtx p2 = PATTERN (i2);
2791
2792 /* Make sure that the destination of I3,
2793 which we are going to substitute into one output of I2,
2794 is not used within another output of I2. We must avoid making this:
2795 (parallel [(set (mem (reg 69)) ...)
2796 (set (reg 69) ...)])
2797 which is not well-defined as to order of actions.
2798 (Besides, reload can't handle output reloads for this.)
2799
2800 The problem can also happen if the dest of I3 is a memory ref,
2801 if another dest in I2 is an indirect memory ref.
2802
2803 Neither can this PARALLEL be an asm. We do not allow combining
2804 that usually (see can_combine_p), so do not here either. */
2805 bool ok = true;
2806 for (i = 0; ok && i < XVECLEN (p2, 0); i++)
2807 {
2808 if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2809 || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2810 && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
2811 SET_DEST (XVECEXP (p2, 0, i))))
2812 ok = false;
2813 else if (GET_CODE (XVECEXP (p2, 0, i)) == SET
2814 && GET_CODE (SET_SRC (XVECEXP (p2, 0, i))) == ASM_OPERANDS)
2815 ok = false;
2816 }
2817
2818 if (ok)
2819 for (i = 0; i < XVECLEN (p2, 0); i++)
2820 if (GET_CODE (XVECEXP (p2, 0, i)) == SET
2821 && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
2822 {
2823 combine_merges++;
2824
2825 subst_insn = i3;
2826 subst_low_luid = DF_INSN_LUID (i2);
2827
2828 added_sets_2 = added_sets_1 = added_sets_0 = 0;
2829 i2src = SET_SRC (XVECEXP (p2, 0, i));
2830 i2dest = SET_DEST (XVECEXP (p2, 0, i));
2831 i2dest_killed = dead_or_set_p (i2, i2dest);
2832
2833 /* Replace the dest in I2 with our dest and make the resulting
2834 insn the new pattern for I3. Then skip to where we validate
2835 the pattern. Everything was set up above. */
2836 SUBST (SET_DEST (XVECEXP (p2, 0, i)), SET_DEST (PATTERN (i3)));
2837 newpat = p2;
2838 i3_subst_into_i2 = 1;
2839 goto validate_replacement;
2840 }
2841 }
2842
2843 /* If I2 is setting a pseudo to a constant and I3 is setting some
2844 sub-part of it to another constant, merge them by making a new
2845 constant. */
2846 if (i1 == 0
2847 && (temp_expr = single_set (i2)) != 0
2848 && CONST_SCALAR_INT_P (SET_SRC (temp_expr))
2849 && GET_CODE (PATTERN (i3)) == SET
2850 && CONST_SCALAR_INT_P (SET_SRC (PATTERN (i3)))
2851 && reg_subword_p (SET_DEST (PATTERN (i3)), SET_DEST (temp_expr)))
2852 {
2853 rtx dest = SET_DEST (PATTERN (i3));
2854 int offset = -1;
2855 int width = 0;
2856
2857 if (GET_CODE (dest) == ZERO_EXTRACT)
2858 {
2859 if (CONST_INT_P (XEXP (dest, 1))
2860 && CONST_INT_P (XEXP (dest, 2)))
2861 {
2862 width = INTVAL (XEXP (dest, 1));
2863 offset = INTVAL (XEXP (dest, 2));
2864 dest = XEXP (dest, 0);
2865 if (BITS_BIG_ENDIAN)
2866 offset = GET_MODE_PRECISION (GET_MODE (dest)) - width - offset;
2867 }
2868 }
2869 else
2870 {
2871 if (GET_CODE (dest) == STRICT_LOW_PART)
2872 dest = XEXP (dest, 0);
2873 width = GET_MODE_PRECISION (GET_MODE (dest));
2874 offset = 0;
2875 }
2876
2877 if (offset >= 0)
2878 {
2879 /* If this is the low part, we're done. */
2880 if (subreg_lowpart_p (dest))
2881 ;
2882 /* Handle the case where inner is twice the size of outer. */
2883 else if (GET_MODE_PRECISION (GET_MODE (SET_DEST (temp_expr)))
2884 == 2 * GET_MODE_PRECISION (GET_MODE (dest)))
2885 offset += GET_MODE_PRECISION (GET_MODE (dest));
2886 /* Otherwise give up for now. */
2887 else
2888 offset = -1;
2889 }
2890
2891 if (offset >= 0)
2892 {
2893 rtx inner = SET_SRC (PATTERN (i3));
2894 rtx outer = SET_SRC (temp_expr);
2895
2896 wide_int o
2897 = wi::insert (rtx_mode_t (outer, GET_MODE (SET_DEST (temp_expr))),
2898 rtx_mode_t (inner, GET_MODE (dest)),
2899 offset, width);
2900
2901 combine_merges++;
2902 subst_insn = i3;
2903 subst_low_luid = DF_INSN_LUID (i2);
2904 added_sets_2 = added_sets_1 = added_sets_0 = 0;
2905 i2dest = SET_DEST (temp_expr);
2906 i2dest_killed = dead_or_set_p (i2, i2dest);
2907
2908 /* Replace the source in I2 with the new constant and make the
2909 resulting insn the new pattern for I3. Then skip to where we
2910 validate the pattern. Everything was set up above. */
2911 SUBST (SET_SRC (temp_expr),
2912 immed_wide_int_const (o, GET_MODE (SET_DEST (temp_expr))));
2913
2914 newpat = PATTERN (i2);
2915
2916 /* The dest of I3 has been replaced with the dest of I2. */
2917 changed_i3_dest = 1;
2918 goto validate_replacement;
2919 }
2920 }
2921
2922 /* If we have no I1 and I2 looks like:
2923 (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
2924 (set Y OP)])
2925 make up a dummy I1 that is
2926 (set Y OP)
2927 and change I2 to be
2928 (set (reg:CC X) (compare:CC Y (const_int 0)))
2929
2930 (We can ignore any trailing CLOBBERs.)
2931
2932 This undoes a previous combination and allows us to match a branch-and-
2933 decrement insn. */
2934
2935 if (!HAVE_cc0 && i1 == 0
2936 && is_parallel_of_n_reg_sets (PATTERN (i2), 2)
2937 && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
2938 == MODE_CC)
2939 && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
2940 && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
2941 && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
2942 SET_SRC (XVECEXP (PATTERN (i2), 0, 1)))
2943 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)), i2, i3)
2944 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)), i2, i3))
2945 {
2946 /* We make I1 with the same INSN_UID as I2. This gives it
2947 the same DF_INSN_LUID for value tracking. Our fake I1 will
2948 never appear in the insn stream so giving it the same INSN_UID
2949 as I2 will not cause a problem. */
2950
2951 i1 = gen_rtx_INSN (VOIDmode, NULL, i2, BLOCK_FOR_INSN (i2),
2952 XVECEXP (PATTERN (i2), 0, 1), INSN_LOCATION (i2),
2953 -1, NULL_RTX);
2954 INSN_UID (i1) = INSN_UID (i2);
2955
2956 SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
2957 SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
2958 SET_DEST (PATTERN (i1)));
2959 unsigned int regno = REGNO (SET_DEST (PATTERN (i1)));
2960 SUBST_LINK (LOG_LINKS (i2),
2961 alloc_insn_link (i1, regno, LOG_LINKS (i2)));
2962 }
2963
2964 /* If I2 is a PARALLEL of two SETs of REGs (and perhaps some CLOBBERs),
2965 make those two SETs separate I1 and I2 insns, and make an I0 that is
2966 the original I1. */
2967 if (!HAVE_cc0 && i0 == 0
2968 && is_parallel_of_n_reg_sets (PATTERN (i2), 2)
2969 && can_split_parallel_of_n_reg_sets (i2, 2)
2970 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)), i2, i3)
2971 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)), i2, i3))
2972 {
2973 /* If there is no I1, there is no I0 either. */
2974 i0 = i1;
2975
2976 /* We make I1 with the same INSN_UID as I2. This gives it
2977 the same DF_INSN_LUID for value tracking. Our fake I1 will
2978 never appear in the insn stream so giving it the same INSN_UID
2979 as I2 will not cause a problem. */
2980
2981 i1 = gen_rtx_INSN (VOIDmode, NULL, i2, BLOCK_FOR_INSN (i2),
2982 XVECEXP (PATTERN (i2), 0, 0), INSN_LOCATION (i2),
2983 -1, NULL_RTX);
2984 INSN_UID (i1) = INSN_UID (i2);
2985
2986 SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 1));
2987 }
2988
2989 /* Verify that I2 and I1 are valid for combining. */
2990 if (! can_combine_p (i2, i3, i0, i1, NULL, NULL, &i2dest, &i2src)
2991 || (i1 && ! can_combine_p (i1, i3, i0, NULL, i2, NULL,
2992 &i1dest, &i1src))
2993 || (i0 && ! can_combine_p (i0, i3, NULL, NULL, i1, i2,
2994 &i0dest, &i0src)))
2995 {
2996 undo_all ();
2997 return 0;
2998 }
2999
3000 /* Record whether I2DEST is used in I2SRC and similarly for the other
3001 cases. Knowing this will help in register status updating below. */
3002 i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
3003 i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
3004 i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
3005 i0dest_in_i0src = i0 && reg_overlap_mentioned_p (i0dest, i0src);
3006 i1dest_in_i0src = i0 && reg_overlap_mentioned_p (i1dest, i0src);
3007 i2dest_in_i0src = i0 && reg_overlap_mentioned_p (i2dest, i0src);
3008 i2dest_killed = dead_or_set_p (i2, i2dest);
3009 i1dest_killed = i1 && dead_or_set_p (i1, i1dest);
3010 i0dest_killed = i0 && dead_or_set_p (i0, i0dest);
3011
3012 /* For the earlier insns, determine which of the subsequent ones they
3013 feed. */
3014 i1_feeds_i2_n = i1 && insn_a_feeds_b (i1, i2);
3015 i0_feeds_i1_n = i0 && insn_a_feeds_b (i0, i1);
3016 i0_feeds_i2_n = (i0 && (!i0_feeds_i1_n ? insn_a_feeds_b (i0, i2)
3017 : (!reg_overlap_mentioned_p (i1dest, i0dest)
3018 && reg_overlap_mentioned_p (i0dest, i2src))));
3019
3020 /* Ensure that I3's pattern can be the destination of combines. */
3021 if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest, i0dest,
3022 i1 && i2dest_in_i1src && !i1_feeds_i2_n,
3023 i0 && ((i2dest_in_i0src && !i0_feeds_i2_n)
3024 || (i1dest_in_i0src && !i0_feeds_i1_n)),
3025 &i3dest_killed))
3026 {
3027 undo_all ();
3028 return 0;
3029 }
3030
3031 /* See if any of the insns is a MULT operation. Unless one is, we will
3032 reject a combination that is, since it must be slower. Be conservative
3033 here. */
3034 if (GET_CODE (i2src) == MULT
3035 || (i1 != 0 && GET_CODE (i1src) == MULT)
3036 || (i0 != 0 && GET_CODE (i0src) == MULT)
3037 || (GET_CODE (PATTERN (i3)) == SET
3038 && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
3039 have_mult = 1;
3040
3041 /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
3042 We used to do this EXCEPT in one case: I3 has a post-inc in an
3043 output operand. However, that exception can give rise to insns like
3044 mov r3,(r3)+
3045 which is a famous insn on the PDP-11 where the value of r3 used as the
3046 source was model-dependent. Avoid this sort of thing. */
3047
3048 #if 0
3049 if (!(GET_CODE (PATTERN (i3)) == SET
3050 && REG_P (SET_SRC (PATTERN (i3)))
3051 && MEM_P (SET_DEST (PATTERN (i3)))
3052 && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
3053 || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
3054 /* It's not the exception. */
3055 #endif
3056 if (AUTO_INC_DEC)
3057 {
3058 rtx link;
3059 for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
3060 if (REG_NOTE_KIND (link) == REG_INC
3061 && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
3062 || (i1 != 0
3063 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
3064 {
3065 undo_all ();
3066 return 0;
3067 }
3068 }
3069
3070 /* See if the SETs in I1 or I2 need to be kept around in the merged
3071 instruction: whenever the value set there is still needed past I3.
3072 For the SET in I2, this is easy: we see if I2DEST dies or is set in I3.
3073
3074 For the SET in I1, we have two cases: if I1 and I2 independently feed
3075 into I3, the set in I1 needs to be kept around unless I1DEST dies
3076 or is set in I3. Otherwise (if I1 feeds I2 which feeds I3), the set
3077 in I1 needs to be kept around unless I1DEST dies or is set in either
3078 I2 or I3. The same considerations apply to I0. */
3079
3080 added_sets_2 = !dead_or_set_p (i3, i2dest);
3081
3082 if (i1)
3083 added_sets_1 = !(dead_or_set_p (i3, i1dest)
3084 || (i1_feeds_i2_n && dead_or_set_p (i2, i1dest)));
3085 else
3086 added_sets_1 = 0;
3087
3088 if (i0)
3089 added_sets_0 = !(dead_or_set_p (i3, i0dest)
3090 || (i0_feeds_i1_n && dead_or_set_p (i1, i0dest))
3091 || ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n))
3092 && dead_or_set_p (i2, i0dest)));
3093 else
3094 added_sets_0 = 0;
3095
3096 /* We are about to copy insns for the case where they need to be kept
3097 around. Check that they can be copied in the merged instruction. */
3098
3099 if (targetm.cannot_copy_insn_p
3100 && ((added_sets_2 && targetm.cannot_copy_insn_p (i2))
3101 || (i1 && added_sets_1 && targetm.cannot_copy_insn_p (i1))
3102 || (i0 && added_sets_0 && targetm.cannot_copy_insn_p (i0))))
3103 {
3104 undo_all ();
3105 return 0;
3106 }
3107
3108 /* If the set in I2 needs to be kept around, we must make a copy of
3109 PATTERN (I2), so that when we substitute I1SRC for I1DEST in
3110 PATTERN (I2), we are only substituting for the original I1DEST, not into
3111 an already-substituted copy. This also prevents making self-referential
3112 rtx. If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
3113 I2DEST. */
3114
3115 if (added_sets_2)
3116 {
3117 if (GET_CODE (PATTERN (i2)) == PARALLEL)
3118 i2pat = gen_rtx_SET (i2dest, copy_rtx (i2src));
3119 else
3120 i2pat = copy_rtx (PATTERN (i2));
3121 }
3122
3123 if (added_sets_1)
3124 {
3125 if (GET_CODE (PATTERN (i1)) == PARALLEL)
3126 i1pat = gen_rtx_SET (i1dest, copy_rtx (i1src));
3127 else
3128 i1pat = copy_rtx (PATTERN (i1));
3129 }
3130
3131 if (added_sets_0)
3132 {
3133 if (GET_CODE (PATTERN (i0)) == PARALLEL)
3134 i0pat = gen_rtx_SET (i0dest, copy_rtx (i0src));
3135 else
3136 i0pat = copy_rtx (PATTERN (i0));
3137 }
3138
3139 combine_merges++;
3140
3141 /* Substitute in the latest insn for the regs set by the earlier ones. */
3142
3143 maxreg = max_reg_num ();
3144
3145 subst_insn = i3;
3146
3147 /* Many machines that don't use CC0 have insns that can both perform an
3148 arithmetic operation and set the condition code. These operations will
3149 be represented as a PARALLEL with the first element of the vector
3150 being a COMPARE of an arithmetic operation with the constant zero.
3151 The second element of the vector will set some pseudo to the result
3152 of the same arithmetic operation. If we simplify the COMPARE, we won't
3153 match such a pattern and so will generate an extra insn. Here we test
3154 for this case, where both the comparison and the operation result are
3155 needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
3156 I2SRC. Later we will make the PARALLEL that contains I2. */
3157
3158 if (!HAVE_cc0 && i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
3159 && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
3160 && CONST_INT_P (XEXP (SET_SRC (PATTERN (i3)), 1))
3161 && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
3162 {
3163 rtx newpat_dest;
3164 rtx *cc_use_loc = NULL;
3165 rtx_insn *cc_use_insn = NULL;
3166 rtx op0 = i2src, op1 = XEXP (SET_SRC (PATTERN (i3)), 1);
3167 machine_mode compare_mode, orig_compare_mode;
3168 enum rtx_code compare_code = UNKNOWN, orig_compare_code = UNKNOWN;
3169
3170 newpat = PATTERN (i3);
3171 newpat_dest = SET_DEST (newpat);
3172 compare_mode = orig_compare_mode = GET_MODE (newpat_dest);
3173
3174 if (undobuf.other_insn == 0
3175 && (cc_use_loc = find_single_use (SET_DEST (newpat), i3,
3176 &cc_use_insn)))
3177 {
3178 compare_code = orig_compare_code = GET_CODE (*cc_use_loc);
3179 compare_code = simplify_compare_const (compare_code,
3180 GET_MODE (i2dest), op0, &op1);
3181 target_canonicalize_comparison (&compare_code, &op0, &op1, 1);
3182 }
3183
3184 /* Do the rest only if op1 is const0_rtx, which may be the
3185 result of simplification. */
3186 if (op1 == const0_rtx)
3187 {
3188 /* If a single use of the CC is found, prepare to modify it
3189 when SELECT_CC_MODE returns a new CC-class mode, or when
3190 the above simplify_compare_const() returned a new comparison
3191 operator. undobuf.other_insn is assigned the CC use insn
3192 when modifying it. */
3193 if (cc_use_loc)
3194 {
3195 #ifdef SELECT_CC_MODE
3196 machine_mode new_mode
3197 = SELECT_CC_MODE (compare_code, op0, op1);
3198 if (new_mode != orig_compare_mode
3199 && can_change_dest_mode (SET_DEST (newpat),
3200 added_sets_2, new_mode))
3201 {
3202 unsigned int regno = REGNO (newpat_dest);
3203 compare_mode = new_mode;
3204 if (regno < FIRST_PSEUDO_REGISTER)
3205 newpat_dest = gen_rtx_REG (compare_mode, regno);
3206 else
3207 {
3208 SUBST_MODE (regno_reg_rtx[regno], compare_mode);
3209 newpat_dest = regno_reg_rtx[regno];
3210 }
3211 }
3212 #endif
3213 /* Cases for modifying the CC-using comparison. */
3214 if (compare_code != orig_compare_code
3215 /* ??? Do we need to verify the zero rtx? */
3216 && XEXP (*cc_use_loc, 1) == const0_rtx)
3217 {
3218 /* Replace cc_use_loc with entire new RTX. */
3219 SUBST (*cc_use_loc,
3220 gen_rtx_fmt_ee (compare_code, compare_mode,
3221 newpat_dest, const0_rtx));
3222 undobuf.other_insn = cc_use_insn;
3223 }
3224 else if (compare_mode != orig_compare_mode)
3225 {
3226 /* Just replace the CC reg with a new mode. */
3227 SUBST (XEXP (*cc_use_loc, 0), newpat_dest);
3228 undobuf.other_insn = cc_use_insn;
3229 }
3230 }
3231
3232 /* Now we modify the current newpat:
3233 First, SET_DEST(newpat) is updated if the CC mode has been
3234 altered. For targets without SELECT_CC_MODE, this should be
3235 optimized away. */
3236 if (compare_mode != orig_compare_mode)
3237 SUBST (SET_DEST (newpat), newpat_dest);
3238 /* This is always done to propagate i2src into newpat. */
3239 SUBST (SET_SRC (newpat),
3240 gen_rtx_COMPARE (compare_mode, op0, op1));
3241 /* Create new version of i2pat if needed; the below PARALLEL
3242 creation needs this to work correctly. */
3243 if (! rtx_equal_p (i2src, op0))
3244 i2pat = gen_rtx_SET (i2dest, op0);
3245 i2_is_used = 1;
3246 }
3247 }
3248
3249 if (i2_is_used == 0)
3250 {
3251 /* It is possible that the source of I2 or I1 may be performing
3252 an unneeded operation, such as a ZERO_EXTEND of something
3253 that is known to have the high part zero. Handle that case
3254 by letting subst look at the inner insns.
3255
3256 Another way to do this would be to have a function that tries
3257 to simplify a single insn instead of merging two or more
3258 insns. We don't do this because of the potential of infinite
3259 loops and because of the potential extra memory required.
3260 However, doing it the way we are is a bit of a kludge and
3261 doesn't catch all cases.
3262
3263 But only do this if -fexpensive-optimizations since it slows
3264 things down and doesn't usually win.
3265
3266 This is not done in the COMPARE case above because the
3267 unmodified I2PAT is used in the PARALLEL and so a pattern
3268 with a modified I2SRC would not match. */
3269
3270 if (flag_expensive_optimizations)
3271 {
3272 /* Pass pc_rtx so no substitutions are done, just
3273 simplifications. */
3274 if (i1)
3275 {
3276 subst_low_luid = DF_INSN_LUID (i1);
3277 i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0, 0);
3278 }
3279
3280 subst_low_luid = DF_INSN_LUID (i2);
3281 i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0, 0);
3282 }
3283
3284 n_occurrences = 0; /* `subst' counts here */
3285 subst_low_luid = DF_INSN_LUID (i2);
3286
3287 /* If I1 feeds into I2 and I1DEST is in I1SRC, we need to make a unique
3288 copy of I2SRC each time we substitute it, in order to avoid creating
3289 self-referential RTL when we will be substituting I1SRC for I1DEST
3290 later. Likewise if I0 feeds into I2, either directly or indirectly
3291 through I1, and I0DEST is in I0SRC. */
3292 newpat = subst (PATTERN (i3), i2dest, i2src, 0, 0,
3293 (i1_feeds_i2_n && i1dest_in_i1src)
3294 || ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n))
3295 && i0dest_in_i0src));
3296 substed_i2 = 1;
3297
3298 /* Record whether I2's body now appears within I3's body. */
3299 i2_is_used = n_occurrences;
3300 }
3301
3302 /* If we already got a failure, don't try to do more. Otherwise, try to
3303 substitute I1 if we have it. */
3304
3305 if (i1 && GET_CODE (newpat) != CLOBBER)
3306 {
3307 /* Check that an autoincrement side-effect on I1 has not been lost.
3308 This happens if I1DEST is mentioned in I2 and dies there, and
3309 has disappeared from the new pattern. */
3310 if ((FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
3311 && i1_feeds_i2_n
3312 && dead_or_set_p (i2, i1dest)
3313 && !reg_overlap_mentioned_p (i1dest, newpat))
3314 /* Before we can do this substitution, we must redo the test done
3315 above (see detailed comments there) that ensures I1DEST isn't
3316 mentioned in any SETs in NEWPAT that are field assignments. */
3317 || !combinable_i3pat (NULL, &newpat, i1dest, NULL_RTX, NULL_RTX,
3318 0, 0, 0))
3319 {
3320 undo_all ();
3321 return 0;
3322 }
3323
3324 n_occurrences = 0;
3325 subst_low_luid = DF_INSN_LUID (i1);
3326
3327 /* If the following substitution will modify I1SRC, make a copy of it
3328 for the case where it is substituted for I1DEST in I2PAT later. */
3329 if (added_sets_2 && i1_feeds_i2_n)
3330 i1src_copy = copy_rtx (i1src);
3331
3332 /* If I0 feeds into I1 and I0DEST is in I0SRC, we need to make a unique
3333 copy of I1SRC each time we substitute it, in order to avoid creating
3334 self-referential RTL when we will be substituting I0SRC for I0DEST
3335 later. */
3336 newpat = subst (newpat, i1dest, i1src, 0, 0,
3337 i0_feeds_i1_n && i0dest_in_i0src);
3338 substed_i1 = 1;
3339
3340 /* Record whether I1's body now appears within I3's body. */
3341 i1_is_used = n_occurrences;
3342 }
3343
3344 /* Likewise for I0 if we have it. */
3345
3346 if (i0 && GET_CODE (newpat) != CLOBBER)
3347 {
3348 if ((FIND_REG_INC_NOTE (i0, NULL_RTX) != 0
3349 && ((i0_feeds_i2_n && dead_or_set_p (i2, i0dest))
3350 || (i0_feeds_i1_n && dead_or_set_p (i1, i0dest)))
3351 && !reg_overlap_mentioned_p (i0dest, newpat))
3352 || !combinable_i3pat (NULL, &newpat, i0dest, NULL_RTX, NULL_RTX,
3353 0, 0, 0))
3354 {
3355 undo_all ();
3356 return 0;
3357 }
3358
3359 /* If the following substitution will modify I0SRC, make a copy of it
3360 for the case where it is substituted for I0DEST in I1PAT later. */
3361 if (added_sets_1 && i0_feeds_i1_n)
3362 i0src_copy = copy_rtx (i0src);
3363 /* And a copy for I0DEST in I2PAT substitution. */
3364 if (added_sets_2 && ((i0_feeds_i1_n && i1_feeds_i2_n)
3365 || (i0_feeds_i2_n)))
3366 i0src_copy2 = copy_rtx (i0src);
3367
3368 n_occurrences = 0;
3369 subst_low_luid = DF_INSN_LUID (i0);
3370 newpat = subst (newpat, i0dest, i0src, 0, 0, 0);
3371 substed_i0 = 1;
3372 }
3373
3374 /* Fail if an autoincrement side-effect has been duplicated. Be careful
3375 to count all the ways that I2SRC and I1SRC can be used. */
3376 if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
3377 && i2_is_used + added_sets_2 > 1)
3378 || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
3379 && (i1_is_used + added_sets_1 + (added_sets_2 && i1_feeds_i2_n)
3380 > 1))
3381 || (i0 != 0 && FIND_REG_INC_NOTE (i0, NULL_RTX) != 0
3382 && (n_occurrences + added_sets_0
3383 + (added_sets_1 && i0_feeds_i1_n)
3384 + (added_sets_2 && i0_feeds_i2_n)
3385 > 1))
3386 /* Fail if we tried to make a new register. */
3387 || max_reg_num () != maxreg
3388 /* Fail if we couldn't do something and have a CLOBBER. */
3389 || GET_CODE (newpat) == CLOBBER
3390 /* Fail if this new pattern is a MULT and we didn't have one before
3391 at the outer level. */
3392 || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
3393 && ! have_mult))
3394 {
3395 undo_all ();
3396 return 0;
3397 }
3398
3399 /* If the actions of the earlier insns must be kept
3400 in addition to substituting them into the latest one,
3401 we must make a new PARALLEL for the latest insn
3402 to hold additional the SETs. */
3403
3404 if (added_sets_0 || added_sets_1 || added_sets_2)
3405 {
3406 int extra_sets = added_sets_0 + added_sets_1 + added_sets_2;
3407 combine_extras++;
3408
3409 if (GET_CODE (newpat) == PARALLEL)
3410 {
3411 rtvec old = XVEC (newpat, 0);
3412 total_sets = XVECLEN (newpat, 0) + extra_sets;
3413 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3414 memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
3415 sizeof (old->elem[0]) * old->num_elem);
3416 }
3417 else
3418 {
3419 rtx old = newpat;
3420 total_sets = 1 + extra_sets;
3421 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3422 XVECEXP (newpat, 0, 0) = old;
3423 }
3424
3425 if (added_sets_0)
3426 XVECEXP (newpat, 0, --total_sets) = i0pat;
3427
3428 if (added_sets_1)
3429 {
3430 rtx t = i1pat;
3431 if (i0_feeds_i1_n)
3432 t = subst (t, i0dest, i0src_copy ? i0src_copy : i0src, 0, 0, 0);
3433
3434 XVECEXP (newpat, 0, --total_sets) = t;
3435 }
3436 if (added_sets_2)
3437 {
3438 rtx t = i2pat;
3439 if (i1_feeds_i2_n)
3440 t = subst (t, i1dest, i1src_copy ? i1src_copy : i1src, 0, 0,
3441 i0_feeds_i1_n && i0dest_in_i0src);
3442 if ((i0_feeds_i1_n && i1_feeds_i2_n) || i0_feeds_i2_n)
3443 t = subst (t, i0dest, i0src_copy2 ? i0src_copy2 : i0src, 0, 0, 0);
3444
3445 XVECEXP (newpat, 0, --total_sets) = t;
3446 }
3447 }
3448
3449 validate_replacement:
3450
3451 /* Note which hard regs this insn has as inputs. */
3452 mark_used_regs_combine (newpat);
3453
3454 /* If recog_for_combine fails, it strips existing clobbers. If we'll
3455 consider splitting this pattern, we might need these clobbers. */
3456 if (i1 && GET_CODE (newpat) == PARALLEL
3457 && GET_CODE (XVECEXP (newpat, 0, XVECLEN (newpat, 0) - 1)) == CLOBBER)
3458 {
3459 int len = XVECLEN (newpat, 0);
3460
3461 newpat_vec_with_clobbers = rtvec_alloc (len);
3462 for (i = 0; i < len; i++)
3463 RTVEC_ELT (newpat_vec_with_clobbers, i) = XVECEXP (newpat, 0, i);
3464 }
3465
3466 /* We have recognized nothing yet. */
3467 insn_code_number = -1;
3468
3469 /* See if this is a PARALLEL of two SETs where one SET's destination is
3470 a register that is unused and this isn't marked as an instruction that
3471 might trap in an EH region. In that case, we just need the other SET.
3472 We prefer this over the PARALLEL.
3473
3474 This can occur when simplifying a divmod insn. We *must* test for this
3475 case here because the code below that splits two independent SETs doesn't
3476 handle this case correctly when it updates the register status.
3477
3478 It's pointless doing this if we originally had two sets, one from
3479 i3, and one from i2. Combining then splitting the parallel results
3480 in the original i2 again plus an invalid insn (which we delete).
3481 The net effect is only to move instructions around, which makes
3482 debug info less accurate. */
3483
3484 if (!(added_sets_2 && i1 == 0)
3485 && is_parallel_of_n_reg_sets (newpat, 2)
3486 && asm_noperands (newpat) < 0)
3487 {
3488 rtx set0 = XVECEXP (newpat, 0, 0);
3489 rtx set1 = XVECEXP (newpat, 0, 1);
3490 rtx oldpat = newpat;
3491
3492 if (((REG_P (SET_DEST (set1))
3493 && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
3494 || (GET_CODE (SET_DEST (set1)) == SUBREG
3495 && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
3496 && insn_nothrow_p (i3)
3497 && !side_effects_p (SET_SRC (set1)))
3498 {
3499 newpat = set0;
3500 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3501 }
3502
3503 else if (((REG_P (SET_DEST (set0))
3504 && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
3505 || (GET_CODE (SET_DEST (set0)) == SUBREG
3506 && find_reg_note (i3, REG_UNUSED,
3507 SUBREG_REG (SET_DEST (set0)))))
3508 && insn_nothrow_p (i3)
3509 && !side_effects_p (SET_SRC (set0)))
3510 {
3511 newpat = set1;
3512 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3513
3514 if (insn_code_number >= 0)
3515 changed_i3_dest = 1;
3516 }
3517
3518 if (insn_code_number < 0)
3519 newpat = oldpat;
3520 }
3521
3522 /* Is the result of combination a valid instruction? */
3523 if (insn_code_number < 0)
3524 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3525
3526 /* If we were combining three insns and the result is a simple SET
3527 with no ASM_OPERANDS that wasn't recognized, try to split it into two
3528 insns. There are two ways to do this. It can be split using a
3529 machine-specific method (like when you have an addition of a large
3530 constant) or by combine in the function find_split_point. */
3531
3532 if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
3533 && asm_noperands (newpat) < 0)
3534 {
3535 rtx parallel, *split;
3536 rtx_insn *m_split_insn;
3537
3538 /* See if the MD file can split NEWPAT. If it can't, see if letting it
3539 use I2DEST as a scratch register will help. In the latter case,
3540 convert I2DEST to the mode of the source of NEWPAT if we can. */
3541
3542 m_split_insn = combine_split_insns (newpat, i3);
3543
3544 /* We can only use I2DEST as a scratch reg if it doesn't overlap any
3545 inputs of NEWPAT. */
3546
3547 /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
3548 possible to try that as a scratch reg. This would require adding
3549 more code to make it work though. */
3550
3551 if (m_split_insn == 0 && ! reg_overlap_mentioned_p (i2dest, newpat))
3552 {
3553 machine_mode new_mode = GET_MODE (SET_DEST (newpat));
3554
3555 /* ??? Reusing i2dest without resetting the reg_stat entry for it
3556 (temporarily, until we are committed to this instruction
3557 combination) does not work: for example, any call to nonzero_bits
3558 on the register (from a splitter in the MD file, for example)
3559 will get the old information, which is invalid.
3560
3561 Since nowadays we can create registers during combine just fine,
3562 we should just create a new one here, not reuse i2dest. */
3563
3564 /* First try to split using the original register as a
3565 scratch register. */
3566 parallel = gen_rtx_PARALLEL (VOIDmode,
3567 gen_rtvec (2, newpat,
3568 gen_rtx_CLOBBER (VOIDmode,
3569 i2dest)));
3570 m_split_insn = combine_split_insns (parallel, i3);
3571
3572 /* If that didn't work, try changing the mode of I2DEST if
3573 we can. */
3574 if (m_split_insn == 0
3575 && new_mode != GET_MODE (i2dest)
3576 && new_mode != VOIDmode
3577 && can_change_dest_mode (i2dest, added_sets_2, new_mode))
3578 {
3579 machine_mode old_mode = GET_MODE (i2dest);
3580 rtx ni2dest;
3581
3582 if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3583 ni2dest = gen_rtx_REG (new_mode, REGNO (i2dest));
3584 else
3585 {
3586 SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], new_mode);
3587 ni2dest = regno_reg_rtx[REGNO (i2dest)];
3588 }
3589
3590 parallel = (gen_rtx_PARALLEL
3591 (VOIDmode,
3592 gen_rtvec (2, newpat,
3593 gen_rtx_CLOBBER (VOIDmode,
3594 ni2dest))));
3595 m_split_insn = combine_split_insns (parallel, i3);
3596
3597 if (m_split_insn == 0
3598 && REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
3599 {
3600 struct undo *buf;
3601
3602 adjust_reg_mode (regno_reg_rtx[REGNO (i2dest)], old_mode);
3603 buf = undobuf.undos;
3604 undobuf.undos = buf->next;
3605 buf->next = undobuf.frees;
3606 undobuf.frees = buf;
3607 }
3608 }
3609
3610 i2scratch = m_split_insn != 0;
3611 }
3612
3613 /* If recog_for_combine has discarded clobbers, try to use them
3614 again for the split. */
3615 if (m_split_insn == 0 && newpat_vec_with_clobbers)
3616 {
3617 parallel = gen_rtx_PARALLEL (VOIDmode, newpat_vec_with_clobbers);
3618 m_split_insn = combine_split_insns (parallel, i3);
3619 }
3620
3621 if (m_split_insn && NEXT_INSN (m_split_insn) == NULL_RTX)
3622 {
3623 rtx m_split_pat = PATTERN (m_split_insn);
3624 insn_code_number = recog_for_combine (&m_split_pat, i3, &new_i3_notes);
3625 if (insn_code_number >= 0)
3626 newpat = m_split_pat;
3627 }
3628 else if (m_split_insn && NEXT_INSN (NEXT_INSN (m_split_insn)) == NULL_RTX
3629 && (next_nonnote_nondebug_insn (i2) == i3
3630 || ! use_crosses_set_p (PATTERN (m_split_insn), DF_INSN_LUID (i2))))
3631 {
3632 rtx i2set, i3set;
3633 rtx newi3pat = PATTERN (NEXT_INSN (m_split_insn));
3634 newi2pat = PATTERN (m_split_insn);
3635
3636 i3set = single_set (NEXT_INSN (m_split_insn));
3637 i2set = single_set (m_split_insn);
3638
3639 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3640
3641 /* If I2 or I3 has multiple SETs, we won't know how to track
3642 register status, so don't use these insns. If I2's destination
3643 is used between I2 and I3, we also can't use these insns. */
3644
3645 if (i2_code_number >= 0 && i2set && i3set
3646 && (next_nonnote_nondebug_insn (i2) == i3
3647 || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
3648 insn_code_number = recog_for_combine (&newi3pat, i3,
3649 &new_i3_notes);
3650 if (insn_code_number >= 0)
3651 newpat = newi3pat;
3652
3653 /* It is possible that both insns now set the destination of I3.
3654 If so, we must show an extra use of it. */
3655
3656 if (insn_code_number >= 0)
3657 {
3658 rtx new_i3_dest = SET_DEST (i3set);
3659 rtx new_i2_dest = SET_DEST (i2set);
3660
3661 while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
3662 || GET_CODE (new_i3_dest) == STRICT_LOW_PART
3663 || GET_CODE (new_i3_dest) == SUBREG)
3664 new_i3_dest = XEXP (new_i3_dest, 0);
3665
3666 while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
3667 || GET_CODE (new_i2_dest) == STRICT_LOW_PART
3668 || GET_CODE (new_i2_dest) == SUBREG)
3669 new_i2_dest = XEXP (new_i2_dest, 0);
3670
3671 if (REG_P (new_i3_dest)
3672 && REG_P (new_i2_dest)
3673 && REGNO (new_i3_dest) == REGNO (new_i2_dest)
3674 && REGNO (new_i2_dest) < reg_n_sets_max)
3675 INC_REG_N_SETS (REGNO (new_i2_dest), 1);
3676 }
3677 }
3678
3679 /* If we can split it and use I2DEST, go ahead and see if that
3680 helps things be recognized. Verify that none of the registers
3681 are set between I2 and I3. */
3682 if (insn_code_number < 0
3683 && (split = find_split_point (&newpat, i3, false)) != 0
3684 && (!HAVE_cc0 || REG_P (i2dest))
3685 /* We need I2DEST in the proper mode. If it is a hard register
3686 or the only use of a pseudo, we can change its mode.
3687 Make sure we don't change a hard register to have a mode that
3688 isn't valid for it, or change the number of registers. */
3689 && (GET_MODE (*split) == GET_MODE (i2dest)
3690 || GET_MODE (*split) == VOIDmode
3691 || can_change_dest_mode (i2dest, added_sets_2,
3692 GET_MODE (*split)))
3693 && (next_nonnote_nondebug_insn (i2) == i3
3694 || ! use_crosses_set_p (*split, DF_INSN_LUID (i2)))
3695 /* We can't overwrite I2DEST if its value is still used by
3696 NEWPAT. */
3697 && ! reg_referenced_p (i2dest, newpat))
3698 {
3699 rtx newdest = i2dest;
3700 enum rtx_code split_code = GET_CODE (*split);
3701 machine_mode split_mode = GET_MODE (*split);
3702 bool subst_done = false;
3703 newi2pat = NULL_RTX;
3704
3705 i2scratch = true;
3706
3707 /* *SPLIT may be part of I2SRC, so make sure we have the
3708 original expression around for later debug processing.
3709 We should not need I2SRC any more in other cases. */
3710 if (MAY_HAVE_DEBUG_INSNS)
3711 i2src = copy_rtx (i2src);
3712 else
3713 i2src = NULL;
3714
3715 /* Get NEWDEST as a register in the proper mode. We have already
3716 validated that we can do this. */
3717 if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
3718 {
3719 if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3720 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
3721 else
3722 {
3723 SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], split_mode);
3724 newdest = regno_reg_rtx[REGNO (i2dest)];
3725 }
3726 }
3727
3728 /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
3729 an ASHIFT. This can occur if it was inside a PLUS and hence
3730 appeared to be a memory address. This is a kludge. */
3731 if (split_code == MULT
3732 && CONST_INT_P (XEXP (*split, 1))
3733 && INTVAL (XEXP (*split, 1)) > 0
3734 && (i = exact_log2 (UINTVAL (XEXP (*split, 1)))) >= 0)
3735 {
3736 SUBST (*split, gen_rtx_ASHIFT (split_mode,
3737 XEXP (*split, 0), GEN_INT (i)));
3738 /* Update split_code because we may not have a multiply
3739 anymore. */
3740 split_code = GET_CODE (*split);
3741 }
3742
3743 /* Similarly for (plus (mult FOO (const_int pow2))). */
3744 if (split_code == PLUS
3745 && GET_CODE (XEXP (*split, 0)) == MULT
3746 && CONST_INT_P (XEXP (XEXP (*split, 0), 1))
3747 && INTVAL (XEXP (XEXP (*split, 0), 1)) > 0
3748 && (i = exact_log2 (UINTVAL (XEXP (XEXP (*split, 0), 1)))) >= 0)
3749 {
3750 rtx nsplit = XEXP (*split, 0);
3751 SUBST (XEXP (*split, 0), gen_rtx_ASHIFT (GET_MODE (nsplit),
3752 XEXP (nsplit, 0), GEN_INT (i)));
3753 /* Update split_code because we may not have a multiply
3754 anymore. */
3755 split_code = GET_CODE (*split);
3756 }
3757
3758 #ifdef INSN_SCHEDULING
3759 /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
3760 be written as a ZERO_EXTEND. */
3761 if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
3762 {
3763 /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
3764 what it really is. */
3765 if (load_extend_op (GET_MODE (SUBREG_REG (*split)))
3766 == SIGN_EXTEND)
3767 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
3768 SUBREG_REG (*split)));
3769 else
3770 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
3771 SUBREG_REG (*split)));
3772 }
3773 #endif
3774
3775 /* Attempt to split binary operators using arithmetic identities. */
3776 if (BINARY_P (SET_SRC (newpat))
3777 && split_mode == GET_MODE (SET_SRC (newpat))
3778 && ! side_effects_p (SET_SRC (newpat)))
3779 {
3780 rtx setsrc = SET_SRC (newpat);
3781 machine_mode mode = GET_MODE (setsrc);
3782 enum rtx_code code = GET_CODE (setsrc);
3783 rtx src_op0 = XEXP (setsrc, 0);
3784 rtx src_op1 = XEXP (setsrc, 1);
3785
3786 /* Split "X = Y op Y" as "Z = Y; X = Z op Z". */
3787 if (rtx_equal_p (src_op0, src_op1))
3788 {
3789 newi2pat = gen_rtx_SET (newdest, src_op0);
3790 SUBST (XEXP (setsrc, 0), newdest);
3791 SUBST (XEXP (setsrc, 1), newdest);
3792 subst_done = true;
3793 }
3794 /* Split "((P op Q) op R) op S" where op is PLUS or MULT. */
3795 else if ((code == PLUS || code == MULT)
3796 && GET_CODE (src_op0) == code
3797 && GET_CODE (XEXP (src_op0, 0)) == code
3798 && (INTEGRAL_MODE_P (mode)
3799 || (FLOAT_MODE_P (mode)
3800 && flag_unsafe_math_optimizations)))
3801 {
3802 rtx p = XEXP (XEXP (src_op0, 0), 0);
3803 rtx q = XEXP (XEXP (src_op0, 0), 1);
3804 rtx r = XEXP (src_op0, 1);
3805 rtx s = src_op1;
3806
3807 /* Split both "((X op Y) op X) op Y" and
3808 "((X op Y) op Y) op X" as "T op T" where T is
3809 "X op Y". */
3810 if ((rtx_equal_p (p,r) && rtx_equal_p (q,s))
3811 || (rtx_equal_p (p,s) && rtx_equal_p (q,r)))
3812 {
3813 newi2pat = gen_rtx_SET (newdest, XEXP (src_op0, 0));
3814 SUBST (XEXP (setsrc, 0), newdest);
3815 SUBST (XEXP (setsrc, 1), newdest);
3816 subst_done = true;
3817 }
3818 /* Split "((X op X) op Y) op Y)" as "T op T" where
3819 T is "X op Y". */
3820 else if (rtx_equal_p (p,q) && rtx_equal_p (r,s))
3821 {
3822 rtx tmp = simplify_gen_binary (code, mode, p, r);
3823 newi2pat = gen_rtx_SET (newdest, tmp);
3824 SUBST (XEXP (setsrc, 0), newdest);
3825 SUBST (XEXP (setsrc, 1), newdest);
3826 subst_done = true;
3827 }
3828 }
3829 }
3830
3831 if (!subst_done)
3832 {
3833 newi2pat = gen_rtx_SET (newdest, *split);
3834 SUBST (*split, newdest);
3835 }
3836
3837 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3838
3839 /* recog_for_combine might have added CLOBBERs to newi2pat.
3840 Make sure NEWPAT does not depend on the clobbered regs. */
3841 if (GET_CODE (newi2pat) == PARALLEL)
3842 for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3843 if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3844 {
3845 rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3846 if (reg_overlap_mentioned_p (reg, newpat))
3847 {
3848 undo_all ();
3849 return 0;
3850 }
3851 }
3852
3853 /* If the split point was a MULT and we didn't have one before,
3854 don't use one now. */
3855 if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
3856 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3857 }
3858 }
3859
3860 /* Check for a case where we loaded from memory in a narrow mode and
3861 then sign extended it, but we need both registers. In that case,
3862 we have a PARALLEL with both loads from the same memory location.
3863 We can split this into a load from memory followed by a register-register
3864 copy. This saves at least one insn, more if register allocation can
3865 eliminate the copy.
3866
3867 We cannot do this if the destination of the first assignment is a
3868 condition code register or cc0. We eliminate this case by making sure
3869 the SET_DEST and SET_SRC have the same mode.
3870
3871 We cannot do this if the destination of the second assignment is
3872 a register that we have already assumed is zero-extended. Similarly
3873 for a SUBREG of such a register. */
3874
3875 else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3876 && GET_CODE (newpat) == PARALLEL
3877 && XVECLEN (newpat, 0) == 2
3878 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3879 && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
3880 && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
3881 == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
3882 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3883 && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3884 XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
3885 && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3886 DF_INSN_LUID (i2))
3887 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3888 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3889 && ! (temp_expr = SET_DEST (XVECEXP (newpat, 0, 1)),
3890 (REG_P (temp_expr)
3891 && reg_stat[REGNO (temp_expr)].nonzero_bits != 0
3892 && GET_MODE_PRECISION (GET_MODE (temp_expr)) < BITS_PER_WORD
3893 && GET_MODE_PRECISION (GET_MODE (temp_expr)) < HOST_BITS_PER_INT
3894 && (reg_stat[REGNO (temp_expr)].nonzero_bits
3895 != GET_MODE_MASK (word_mode))))
3896 && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
3897 && (temp_expr = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
3898 (REG_P (temp_expr)
3899 && reg_stat[REGNO (temp_expr)].nonzero_bits != 0
3900 && GET_MODE_PRECISION (GET_MODE (temp_expr)) < BITS_PER_WORD
3901 && GET_MODE_PRECISION (GET_MODE (temp_expr)) < HOST_BITS_PER_INT
3902 && (reg_stat[REGNO (temp_expr)].nonzero_bits
3903 != GET_MODE_MASK (word_mode)))))
3904 && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3905 SET_SRC (XVECEXP (newpat, 0, 1)))
3906 && ! find_reg_note (i3, REG_UNUSED,
3907 SET_DEST (XVECEXP (newpat, 0, 0))))
3908 {
3909 rtx ni2dest;
3910
3911 newi2pat = XVECEXP (newpat, 0, 0);
3912 ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
3913 newpat = XVECEXP (newpat, 0, 1);
3914 SUBST (SET_SRC (newpat),
3915 gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
3916 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3917
3918 if (i2_code_number >= 0)
3919 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3920
3921 if (insn_code_number >= 0)
3922 swap_i2i3 = 1;
3923 }
3924
3925 /* Similarly, check for a case where we have a PARALLEL of two independent
3926 SETs but we started with three insns. In this case, we can do the sets
3927 as two separate insns. This case occurs when some SET allows two
3928 other insns to combine, but the destination of that SET is still live.
3929
3930 Also do this if we started with two insns and (at least) one of the
3931 resulting sets is a noop; this noop will be deleted later. */
3932
3933 else if (insn_code_number < 0 && asm_noperands (newpat) < 0
3934 && GET_CODE (newpat) == PARALLEL
3935 && XVECLEN (newpat, 0) == 2
3936 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3937 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3938 && (i1 || set_noop_p (XVECEXP (newpat, 0, 0))
3939 || set_noop_p (XVECEXP (newpat, 0, 1)))
3940 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
3941 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
3942 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3943 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3944 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3945 XVECEXP (newpat, 0, 0))
3946 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
3947 XVECEXP (newpat, 0, 1))
3948 && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
3949 && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
3950 {
3951 rtx set0 = XVECEXP (newpat, 0, 0);
3952 rtx set1 = XVECEXP (newpat, 0, 1);
3953
3954 /* Normally, it doesn't matter which of the two is done first,
3955 but the one that references cc0 can't be the second, and
3956 one which uses any regs/memory set in between i2 and i3 can't
3957 be first. The PARALLEL might also have been pre-existing in i3,
3958 so we need to make sure that we won't wrongly hoist a SET to i2
3959 that would conflict with a death note present in there. */
3960 if (!use_crosses_set_p (SET_SRC (set1), DF_INSN_LUID (i2))
3961 && !(REG_P (SET_DEST (set1))
3962 && find_reg_note (i2, REG_DEAD, SET_DEST (set1)))
3963 && !(GET_CODE (SET_DEST (set1)) == SUBREG
3964 && find_reg_note (i2, REG_DEAD,
3965 SUBREG_REG (SET_DEST (set1))))
3966 && (!HAVE_cc0 || !reg_referenced_p (cc0_rtx, set0))
3967 /* If I3 is a jump, ensure that set0 is a jump so that
3968 we do not create invalid RTL. */
3969 && (!JUMP_P (i3) || SET_DEST (set0) == pc_rtx)
3970 )
3971 {
3972 newi2pat = set1;
3973 newpat = set0;
3974 }
3975 else if (!use_crosses_set_p (SET_SRC (set0), DF_INSN_LUID (i2))
3976 && !(REG_P (SET_DEST (set0))
3977 && find_reg_note (i2, REG_DEAD, SET_DEST (set0)))
3978 && !(GET_CODE (SET_DEST (set0)) == SUBREG
3979 && find_reg_note (i2, REG_DEAD,
3980 SUBREG_REG (SET_DEST (set0))))
3981 && (!HAVE_cc0 || !reg_referenced_p (cc0_rtx, set1))
3982 /* If I3 is a jump, ensure that set1 is a jump so that
3983 we do not create invalid RTL. */
3984 && (!JUMP_P (i3) || SET_DEST (set1) == pc_rtx)
3985 )
3986 {
3987 newi2pat = set0;
3988 newpat = set1;
3989 }
3990 else
3991 {
3992 undo_all ();
3993 return 0;
3994 }
3995
3996 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3997
3998 if (i2_code_number >= 0)
3999 {
4000 /* recog_for_combine might have added CLOBBERs to newi2pat.
4001 Make sure NEWPAT does not depend on the clobbered regs. */
4002 if (GET_CODE (newi2pat) == PARALLEL)
4003 {
4004 for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
4005 if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
4006 {
4007 rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
4008 if (reg_overlap_mentioned_p (reg, newpat))
4009 {
4010 undo_all ();
4011 return 0;
4012 }
4013 }
4014 }
4015
4016 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
4017 }
4018 }
4019
4020 /* If it still isn't recognized, fail and change things back the way they
4021 were. */
4022 if ((insn_code_number < 0
4023 /* Is the result a reasonable ASM_OPERANDS? */
4024 && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
4025 {
4026 undo_all ();
4027 return 0;
4028 }
4029
4030 /* If we had to change another insn, make sure it is valid also. */
4031 if (undobuf.other_insn)
4032 {
4033 CLEAR_HARD_REG_SET (newpat_used_regs);
4034
4035 other_pat = PATTERN (undobuf.other_insn);
4036 other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
4037 &new_other_notes);
4038
4039 if (other_code_number < 0 && ! check_asm_operands (other_pat))
4040 {
4041 undo_all ();
4042 return 0;
4043 }
4044 }
4045
4046 /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
4047 they are adjacent to each other or not. */
4048 if (HAVE_cc0)
4049 {
4050 rtx_insn *p = prev_nonnote_insn (i3);
4051 if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
4052 && sets_cc0_p (newi2pat))
4053 {
4054 undo_all ();
4055 return 0;
4056 }
4057 }
4058
4059 /* Only allow this combination if insn_rtx_costs reports that the
4060 replacement instructions are cheaper than the originals. */
4061 if (!combine_validate_cost (i0, i1, i2, i3, newpat, newi2pat, other_pat))
4062 {
4063 undo_all ();
4064 return 0;
4065 }
4066
4067 if (MAY_HAVE_DEBUG_INSNS)
4068 {
4069 struct undo *undo;
4070
4071 for (undo = undobuf.undos; undo; undo = undo->next)
4072 if (undo->kind == UNDO_MODE)
4073 {
4074 rtx reg = *undo->where.r;
4075 machine_mode new_mode = GET_MODE (reg);
4076 machine_mode old_mode = undo->old_contents.m;
4077
4078 /* Temporarily revert mode back. */
4079 adjust_reg_mode (reg, old_mode);
4080
4081 if (reg == i2dest && i2scratch)
4082 {
4083 /* If we used i2dest as a scratch register with a
4084 different mode, substitute it for the original
4085 i2src while its original mode is temporarily
4086 restored, and then clear i2scratch so that we don't
4087 do it again later. */
4088 propagate_for_debug (i2, last_combined_insn, reg, i2src,
4089 this_basic_block);
4090 i2scratch = false;
4091 /* Put back the new mode. */
4092 adjust_reg_mode (reg, new_mode);
4093 }
4094 else
4095 {
4096 rtx tempreg = gen_raw_REG (old_mode, REGNO (reg));
4097 rtx_insn *first, *last;
4098
4099 if (reg == i2dest)
4100 {
4101 first = i2;
4102 last = last_combined_insn;
4103 }
4104 else
4105 {
4106 first = i3;
4107 last = undobuf.other_insn;
4108 gcc_assert (last);
4109 if (DF_INSN_LUID (last)
4110 < DF_INSN_LUID (last_combined_insn))
4111 last = last_combined_insn;
4112 }
4113
4114 /* We're dealing with a reg that changed mode but not
4115 meaning, so we want to turn it into a subreg for
4116 the new mode. However, because of REG sharing and
4117 because its mode had already changed, we have to do
4118 it in two steps. First, replace any debug uses of
4119 reg, with its original mode temporarily restored,
4120 with this copy we have created; then, replace the
4121 copy with the SUBREG of the original shared reg,
4122 once again changed to the new mode. */
4123 propagate_for_debug (first, last, reg, tempreg,
4124 this_basic_block);
4125 adjust_reg_mode (reg, new_mode);
4126 propagate_for_debug (first, last, tempreg,
4127 lowpart_subreg (old_mode, reg, new_mode),
4128 this_basic_block);
4129 }
4130 }
4131 }
4132
4133 /* If we will be able to accept this, we have made a
4134 change to the destination of I3. This requires us to
4135 do a few adjustments. */
4136
4137 if (changed_i3_dest)
4138 {
4139 PATTERN (i3) = newpat;
4140 adjust_for_new_dest (i3);
4141 }
4142
4143 /* We now know that we can do this combination. Merge the insns and
4144 update the status of registers and LOG_LINKS. */
4145
4146 if (undobuf.other_insn)
4147 {
4148 rtx note, next;
4149
4150 PATTERN (undobuf.other_insn) = other_pat;
4151
4152 /* If any of the notes in OTHER_INSN were REG_DEAD or REG_UNUSED,
4153 ensure that they are still valid. Then add any non-duplicate
4154 notes added by recog_for_combine. */
4155 for (note = REG_NOTES (undobuf.other_insn); note; note = next)
4156 {
4157 next = XEXP (note, 1);
4158
4159 if ((REG_NOTE_KIND (note) == REG_DEAD
4160 && !reg_referenced_p (XEXP (note, 0),
4161 PATTERN (undobuf.other_insn)))
4162 ||(REG_NOTE_KIND (note) == REG_UNUSED
4163 && !reg_set_p (XEXP (note, 0),
4164 PATTERN (undobuf.other_insn)))
4165 /* Simply drop equal note since it may be no longer valid
4166 for other_insn. It may be possible to record that CC
4167 register is changed and only discard those notes, but
4168 in practice it's unnecessary complication and doesn't
4169 give any meaningful improvement.
4170
4171 See PR78559. */
4172 || REG_NOTE_KIND (note) == REG_EQUAL
4173 || REG_NOTE_KIND (note) == REG_EQUIV)
4174 remove_note (undobuf.other_insn, note);
4175 }
4176
4177 distribute_notes (new_other_notes, undobuf.other_insn,
4178 undobuf.other_insn, NULL, NULL_RTX, NULL_RTX,
4179 NULL_RTX);
4180 }
4181
4182 if (swap_i2i3)
4183 {
4184 rtx_insn *insn;
4185 struct insn_link *link;
4186 rtx ni2dest;
4187
4188 /* I3 now uses what used to be its destination and which is now
4189 I2's destination. This requires us to do a few adjustments. */
4190 PATTERN (i3) = newpat;
4191 adjust_for_new_dest (i3);
4192
4193 /* We need a LOG_LINK from I3 to I2. But we used to have one,
4194 so we still will.
4195
4196 However, some later insn might be using I2's dest and have
4197 a LOG_LINK pointing at I3. We must remove this link.
4198 The simplest way to remove the link is to point it at I1,
4199 which we know will be a NOTE. */
4200
4201 /* newi2pat is usually a SET here; however, recog_for_combine might
4202 have added some clobbers. */
4203 if (GET_CODE (newi2pat) == PARALLEL)
4204 ni2dest = SET_DEST (XVECEXP (newi2pat, 0, 0));
4205 else
4206 ni2dest = SET_DEST (newi2pat);
4207
4208 for (insn = NEXT_INSN (i3);
4209 insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
4210 || insn != BB_HEAD (this_basic_block->next_bb));
4211 insn = NEXT_INSN (insn))
4212 {
4213 if (NONDEBUG_INSN_P (insn)
4214 && reg_referenced_p (ni2dest, PATTERN (insn)))
4215 {
4216 FOR_EACH_LOG_LINK (link, insn)
4217 if (link->insn == i3)
4218 link->insn = i1;
4219
4220 break;
4221 }
4222 }
4223 }
4224
4225 {
4226 rtx i3notes, i2notes, i1notes = 0, i0notes = 0;
4227 struct insn_link *i3links, *i2links, *i1links = 0, *i0links = 0;
4228 rtx midnotes = 0;
4229 int from_luid;
4230 /* Compute which registers we expect to eliminate. newi2pat may be setting
4231 either i3dest or i2dest, so we must check it. */
4232 rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
4233 || i2dest_in_i2src || i2dest_in_i1src || i2dest_in_i0src
4234 || !i2dest_killed
4235 ? 0 : i2dest);
4236 /* For i1, we need to compute both local elimination and global
4237 elimination information with respect to newi2pat because i1dest
4238 may be the same as i3dest, in which case newi2pat may be setting
4239 i1dest. Global information is used when distributing REG_DEAD
4240 note for i2 and i3, in which case it does matter if newi2pat sets
4241 i1dest or not.
4242
4243 Local information is used when distributing REG_DEAD note for i1,
4244 in which case it doesn't matter if newi2pat sets i1dest or not.
4245 See PR62151, if we have four insns combination:
4246 i0: r0 <- i0src
4247 i1: r1 <- i1src (using r0)
4248 REG_DEAD (r0)
4249 i2: r0 <- i2src (using r1)
4250 i3: r3 <- i3src (using r0)
4251 ix: using r0
4252 From i1's point of view, r0 is eliminated, no matter if it is set
4253 by newi2pat or not. In other words, REG_DEAD info for r0 in i1
4254 should be discarded.
4255
4256 Note local information only affects cases in forms like "I1->I2->I3",
4257 "I0->I1->I2->I3" or "I0&I1->I2, I2->I3". For other cases like
4258 "I0->I1, I1&I2->I3" or "I1&I2->I3", newi2pat won't set i1dest or
4259 i0dest anyway. */
4260 rtx local_elim_i1 = (i1 == 0 || i1dest_in_i1src || i1dest_in_i0src
4261 || !i1dest_killed
4262 ? 0 : i1dest);
4263 rtx elim_i1 = (local_elim_i1 == 0
4264 || (newi2pat && reg_set_p (i1dest, newi2pat))
4265 ? 0 : i1dest);
4266 /* Same case as i1. */
4267 rtx local_elim_i0 = (i0 == 0 || i0dest_in_i0src || !i0dest_killed
4268 ? 0 : i0dest);
4269 rtx elim_i0 = (local_elim_i0 == 0
4270 || (newi2pat && reg_set_p (i0dest, newi2pat))
4271 ? 0 : i0dest);
4272
4273 /* Get the old REG_NOTES and LOG_LINKS from all our insns and
4274 clear them. */
4275 i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
4276 i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
4277 if (i1)
4278 i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
4279 if (i0)
4280 i0notes = REG_NOTES (i0), i0links = LOG_LINKS (i0);
4281
4282 /* Ensure that we do not have something that should not be shared but
4283 occurs multiple times in the new insns. Check this by first
4284 resetting all the `used' flags and then copying anything is shared. */
4285
4286 reset_used_flags (i3notes);
4287 reset_used_flags (i2notes);
4288 reset_used_flags (i1notes);
4289 reset_used_flags (i0notes);
4290 reset_used_flags (newpat);
4291 reset_used_flags (newi2pat);
4292 if (undobuf.other_insn)
4293 reset_used_flags (PATTERN (undobuf.other_insn));
4294
4295 i3notes = copy_rtx_if_shared (i3notes);
4296 i2notes = copy_rtx_if_shared (i2notes);
4297 i1notes = copy_rtx_if_shared (i1notes);
4298 i0notes = copy_rtx_if_shared (i0notes);
4299 newpat = copy_rtx_if_shared (newpat);
4300 newi2pat = copy_rtx_if_shared (newi2pat);
4301 if (undobuf.other_insn)
4302 reset_used_flags (PATTERN (undobuf.other_insn));
4303
4304 INSN_CODE (i3) = insn_code_number;
4305 PATTERN (i3) = newpat;
4306
4307 if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
4308 {
4309 for (rtx link = CALL_INSN_FUNCTION_USAGE (i3); link;
4310 link = XEXP (link, 1))
4311 {
4312 if (substed_i2)
4313 {
4314 /* I2SRC must still be meaningful at this point. Some
4315 splitting operations can invalidate I2SRC, but those
4316 operations do not apply to calls. */
4317 gcc_assert (i2src);
4318 XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
4319 i2dest, i2src);
4320 }
4321 if (substed_i1)
4322 XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
4323 i1dest, i1src);
4324 if (substed_i0)
4325 XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
4326 i0dest, i0src);
4327 }
4328 }
4329
4330 if (undobuf.other_insn)
4331 INSN_CODE (undobuf.other_insn) = other_code_number;
4332
4333 /* We had one special case above where I2 had more than one set and
4334 we replaced a destination of one of those sets with the destination
4335 of I3. In that case, we have to update LOG_LINKS of insns later
4336 in this basic block. Note that this (expensive) case is rare.
4337
4338 Also, in this case, we must pretend that all REG_NOTEs for I2
4339 actually came from I3, so that REG_UNUSED notes from I2 will be
4340 properly handled. */
4341
4342 if (i3_subst_into_i2)
4343 {
4344 for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
4345 if ((GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == SET
4346 || GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == CLOBBER)
4347 && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
4348 && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
4349 && ! find_reg_note (i2, REG_UNUSED,
4350 SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
4351 for (temp_insn = NEXT_INSN (i2);
4352 temp_insn
4353 && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
4354 || BB_HEAD (this_basic_block) != temp_insn);
4355 temp_insn = NEXT_INSN (temp_insn))
4356 if (temp_insn != i3 && NONDEBUG_INSN_P (temp_insn))
4357 FOR_EACH_LOG_LINK (link, temp_insn)
4358 if (link->insn == i2)
4359 link->insn = i3;
4360
4361 if (i3notes)
4362 {
4363 rtx link = i3notes;
4364 while (XEXP (link, 1))
4365 link = XEXP (link, 1);
4366 XEXP (link, 1) = i2notes;
4367 }
4368 else
4369 i3notes = i2notes;
4370 i2notes = 0;
4371 }
4372
4373 LOG_LINKS (i3) = NULL;
4374 REG_NOTES (i3) = 0;
4375 LOG_LINKS (i2) = NULL;
4376 REG_NOTES (i2) = 0;
4377
4378 if (newi2pat)
4379 {
4380 if (MAY_HAVE_DEBUG_INSNS && i2scratch)
4381 propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
4382 this_basic_block);
4383 INSN_CODE (i2) = i2_code_number;
4384 PATTERN (i2) = newi2pat;
4385 }
4386 else
4387 {
4388 if (MAY_HAVE_DEBUG_INSNS && i2src)
4389 propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
4390 this_basic_block);
4391 SET_INSN_DELETED (i2);
4392 }
4393
4394 if (i1)
4395 {
4396 LOG_LINKS (i1) = NULL;
4397 REG_NOTES (i1) = 0;
4398 if (MAY_HAVE_DEBUG_INSNS)
4399 propagate_for_debug (i1, last_combined_insn, i1dest, i1src,
4400 this_basic_block);
4401 SET_INSN_DELETED (i1);
4402 }
4403
4404 if (i0)
4405 {
4406 LOG_LINKS (i0) = NULL;
4407 REG_NOTES (i0) = 0;
4408 if (MAY_HAVE_DEBUG_INSNS)
4409 propagate_for_debug (i0, last_combined_insn, i0dest, i0src,
4410 this_basic_block);
4411 SET_INSN_DELETED (i0);
4412 }
4413
4414 /* Get death notes for everything that is now used in either I3 or
4415 I2 and used to die in a previous insn. If we built two new
4416 patterns, move from I1 to I2 then I2 to I3 so that we get the
4417 proper movement on registers that I2 modifies. */
4418
4419 if (i0)
4420 from_luid = DF_INSN_LUID (i0);
4421 else if (i1)
4422 from_luid = DF_INSN_LUID (i1);
4423 else
4424 from_luid = DF_INSN_LUID (i2);
4425 if (newi2pat)
4426 move_deaths (newi2pat, NULL_RTX, from_luid, i2, &midnotes);
4427 move_deaths (newpat, newi2pat, from_luid, i3, &midnotes);
4428
4429 /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */
4430 if (i3notes)
4431 distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL,
4432 elim_i2, elim_i1, elim_i0);
4433 if (i2notes)
4434 distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL,
4435 elim_i2, elim_i1, elim_i0);
4436 if (i1notes)
4437 distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL,
4438 elim_i2, local_elim_i1, local_elim_i0);
4439 if (i0notes)
4440 distribute_notes (i0notes, i0, i3, newi2pat ? i2 : NULL,
4441 elim_i2, elim_i1, local_elim_i0);
4442 if (midnotes)
4443 distribute_notes (midnotes, NULL, i3, newi2pat ? i2 : NULL,
4444 elim_i2, elim_i1, elim_i0);
4445
4446 /* Distribute any notes added to I2 or I3 by recog_for_combine. We
4447 know these are REG_UNUSED and want them to go to the desired insn,
4448 so we always pass it as i3. */
4449
4450 if (newi2pat && new_i2_notes)
4451 distribute_notes (new_i2_notes, i2, i2, NULL, NULL_RTX, NULL_RTX,
4452 NULL_RTX);
4453
4454 if (new_i3_notes)
4455 distribute_notes (new_i3_notes, i3, i3, NULL, NULL_RTX, NULL_RTX,
4456 NULL_RTX);
4457
4458 /* If I3DEST was used in I3SRC, it really died in I3. We may need to
4459 put a REG_DEAD note for it somewhere. If NEWI2PAT exists and sets
4460 I3DEST, the death must be somewhere before I2, not I3. If we passed I3
4461 in that case, it might delete I2. Similarly for I2 and I1.
4462 Show an additional death due to the REG_DEAD note we make here. If
4463 we discard it in distribute_notes, we will decrement it again. */
4464
4465 if (i3dest_killed)
4466 {
4467 rtx new_note = alloc_reg_note (REG_DEAD, i3dest_killed, NULL_RTX);
4468 if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
4469 distribute_notes (new_note, NULL, i2, NULL, elim_i2,
4470 elim_i1, elim_i0);
4471 else
4472 distribute_notes (new_note, NULL, i3, newi2pat ? i2 : NULL,
4473 elim_i2, elim_i1, elim_i0);
4474 }
4475
4476 if (i2dest_in_i2src)
4477 {
4478 rtx new_note = alloc_reg_note (REG_DEAD, i2dest, NULL_RTX);
4479 if (newi2pat && reg_set_p (i2dest, newi2pat))
4480 distribute_notes (new_note, NULL, i2, NULL, NULL_RTX,
4481 NULL_RTX, NULL_RTX);
4482 else
4483 distribute_notes (new_note, NULL, i3, newi2pat ? i2 : NULL,
4484 NULL_RTX, NULL_RTX, NULL_RTX);
4485 }
4486
4487 if (i1dest_in_i1src)
4488 {
4489 rtx new_note = alloc_reg_note (REG_DEAD, i1dest, NULL_RTX);
4490 if (newi2pat && reg_set_p (i1dest, newi2pat))
4491 distribute_notes (new_note, NULL, i2, NULL, NULL_RTX,
4492 NULL_RTX, NULL_RTX);
4493 else
4494 distribute_notes (new_note, NULL, i3, newi2pat ? i2 : NULL,
4495 NULL_RTX, NULL_RTX, NULL_RTX);
4496 }
4497
4498 if (i0dest_in_i0src)
4499 {
4500 rtx new_note = alloc_reg_note (REG_DEAD, i0dest, NULL_RTX);
4501 if (newi2pat && reg_set_p (i0dest, newi2pat))
4502 distribute_notes (new_note, NULL, i2, NULL, NULL_RTX,
4503 NULL_RTX, NULL_RTX);
4504 else
4505 distribute_notes (new_note, NULL, i3, newi2pat ? i2 : NULL,
4506 NULL_RTX, NULL_RTX, NULL_RTX);
4507 }
4508
4509 distribute_links (i3links);
4510 distribute_links (i2links);
4511 distribute_links (i1links);
4512 distribute_links (i0links);
4513
4514 if (REG_P (i2dest))
4515 {
4516 struct insn_link *link;
4517 rtx_insn *i2_insn = 0;
4518 rtx i2_val = 0, set;
4519
4520 /* The insn that used to set this register doesn't exist, and
4521 this life of the register may not exist either. See if one of
4522 I3's links points to an insn that sets I2DEST. If it does,
4523 that is now the last known value for I2DEST. If we don't update
4524 this and I2 set the register to a value that depended on its old
4525 contents, we will get confused. If this insn is used, thing
4526 will be set correctly in combine_instructions. */
4527 FOR_EACH_LOG_LINK (link, i3)
4528 if ((set = single_set (link->insn)) != 0
4529 && rtx_equal_p (i2dest, SET_DEST (set)))
4530 i2_insn = link->insn, i2_val = SET_SRC (set);
4531
4532 record_value_for_reg (i2dest, i2_insn, i2_val);
4533
4534 /* If the reg formerly set in I2 died only once and that was in I3,
4535 zero its use count so it won't make `reload' do any work. */
4536 if (! added_sets_2
4537 && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
4538 && ! i2dest_in_i2src
4539 && REGNO (i2dest) < reg_n_sets_max)
4540 INC_REG_N_SETS (REGNO (i2dest), -1);
4541 }
4542
4543 if (i1 && REG_P (i1dest))
4544 {
4545 struct insn_link *link;
4546 rtx_insn *i1_insn = 0;
4547 rtx i1_val = 0, set;
4548
4549 FOR_EACH_LOG_LINK (link, i3)
4550 if ((set = single_set (link->insn)) != 0
4551 && rtx_equal_p (i1dest, SET_DEST (set)))
4552 i1_insn = link->insn, i1_val = SET_SRC (set);
4553
4554 record_value_for_reg (i1dest, i1_insn, i1_val);
4555
4556 if (! added_sets_1
4557 && ! i1dest_in_i1src
4558 && REGNO (i1dest) < reg_n_sets_max)
4559 INC_REG_N_SETS (REGNO (i1dest), -1);
4560 }
4561
4562 if (i0 && REG_P (i0dest))
4563 {
4564 struct insn_link *link;
4565 rtx_insn *i0_insn = 0;
4566 rtx i0_val = 0, set;
4567
4568 FOR_EACH_LOG_LINK (link, i3)
4569 if ((set = single_set (link->insn)) != 0
4570 && rtx_equal_p (i0dest, SET_DEST (set)))
4571 i0_insn = link->insn, i0_val = SET_SRC (set);
4572
4573 record_value_for_reg (i0dest, i0_insn, i0_val);
4574
4575 if (! added_sets_0
4576 && ! i0dest_in_i0src
4577 && REGNO (i0dest) < reg_n_sets_max)
4578 INC_REG_N_SETS (REGNO (i0dest), -1);
4579 }
4580
4581 /* Update reg_stat[].nonzero_bits et al for any changes that may have
4582 been made to this insn. The order is important, because newi2pat
4583 can affect nonzero_bits of newpat. */
4584 if (newi2pat)
4585 note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
4586 note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
4587 }
4588
4589 if (undobuf.other_insn != NULL_RTX)
4590 {
4591 if (dump_file)
4592 {
4593 fprintf (dump_file, "modifying other_insn ");
4594 dump_insn_slim (dump_file, undobuf.other_insn);
4595 }
4596 df_insn_rescan (undobuf.other_insn);
4597 }
4598
4599 if (i0 && !(NOTE_P (i0) && (NOTE_KIND (i0) == NOTE_INSN_DELETED)))
4600 {
4601 if (dump_file)
4602 {
4603 fprintf (dump_file, "modifying insn i0 ");
4604 dump_insn_slim (dump_file, i0);
4605 }
4606 df_insn_rescan (i0);
4607 }
4608
4609 if (i1 && !(NOTE_P (i1) && (NOTE_KIND (i1) == NOTE_INSN_DELETED)))
4610 {
4611 if (dump_file)
4612 {
4613 fprintf (dump_file, "modifying insn i1 ");
4614 dump_insn_slim (dump_file, i1);
4615 }
4616 df_insn_rescan (i1);
4617 }
4618
4619 if (i2 && !(NOTE_P (i2) && (NOTE_KIND (i2) == NOTE_INSN_DELETED)))
4620 {
4621 if (dump_file)
4622 {
4623 fprintf (dump_file, "modifying insn i2 ");
4624 dump_insn_slim (dump_file, i2);
4625 }
4626 df_insn_rescan (i2);
4627 }
4628
4629 if (i3 && !(NOTE_P (i3) && (NOTE_KIND (i3) == NOTE_INSN_DELETED)))
4630 {
4631 if (dump_file)
4632 {
4633 fprintf (dump_file, "modifying insn i3 ");
4634 dump_insn_slim (dump_file, i3);
4635 }
4636 df_insn_rescan (i3);
4637 }
4638
4639 /* Set new_direct_jump_p if a new return or simple jump instruction
4640 has been created. Adjust the CFG accordingly. */
4641 if (returnjump_p (i3) || any_uncondjump_p (i3))
4642 {
4643 *new_direct_jump_p = 1;
4644 mark_jump_label (PATTERN (i3), i3, 0);
4645 update_cfg_for_uncondjump (i3);
4646 }
4647
4648 if (undobuf.other_insn != NULL_RTX
4649 && (returnjump_p (undobuf.other_insn)
4650 || any_uncondjump_p (undobuf.other_insn)))
4651 {
4652 *new_direct_jump_p = 1;
4653 update_cfg_for_uncondjump (undobuf.other_insn);
4654 }
4655
4656 if (GET_CODE (PATTERN (i3)) == TRAP_IF
4657 && XEXP (PATTERN (i3), 0) == const1_rtx)
4658 {
4659 basic_block bb = BLOCK_FOR_INSN (i3);
4660 gcc_assert (bb);
4661 remove_edge (split_block (bb, i3));
4662 emit_barrier_after_bb (bb);
4663 *new_direct_jump_p = 1;
4664 }
4665
4666 if (undobuf.other_insn
4667 && GET_CODE (PATTERN (undobuf.other_insn)) == TRAP_IF
4668 && XEXP (PATTERN (undobuf.other_insn), 0) == const1_rtx)
4669 {
4670 basic_block bb = BLOCK_FOR_INSN (undobuf.other_insn);
4671 gcc_assert (bb);
4672 remove_edge (split_block (bb, undobuf.other_insn));
4673 emit_barrier_after_bb (bb);
4674 *new_direct_jump_p = 1;
4675 }
4676
4677 /* A noop might also need cleaning up of CFG, if it comes from the
4678 simplification of a jump. */
4679 if (JUMP_P (i3)
4680 && GET_CODE (newpat) == SET
4681 && SET_SRC (newpat) == pc_rtx
4682 && SET_DEST (newpat) == pc_rtx)
4683 {
4684 *new_direct_jump_p = 1;
4685 update_cfg_for_uncondjump (i3);
4686 }
4687
4688 if (undobuf.other_insn != NULL_RTX
4689 && JUMP_P (undobuf.other_insn)
4690 && GET_CODE (PATTERN (undobuf.other_insn)) == SET
4691 && SET_SRC (PATTERN (undobuf.other_insn)) == pc_rtx
4692 && SET_DEST (PATTERN (undobuf.other_insn)) == pc_rtx)
4693 {
4694 *new_direct_jump_p = 1;
4695 update_cfg_for_uncondjump (undobuf.other_insn);
4696 }
4697
4698 combine_successes++;
4699 undo_commit ();
4700
4701 if (added_links_insn
4702 && (newi2pat == 0 || DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i2))
4703 && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i3))
4704 return added_links_insn;
4705 else
4706 return newi2pat ? i2 : i3;
4707 }
4708 \f
4709 /* Get a marker for undoing to the current state. */
4710
4711 static void *
4712 get_undo_marker (void)
4713 {
4714 return undobuf.undos;
4715 }
4716
4717 /* Undo the modifications up to the marker. */
4718
4719 static void
4720 undo_to_marker (void *marker)
4721 {
4722 struct undo *undo, *next;
4723
4724 for (undo = undobuf.undos; undo != marker; undo = next)
4725 {
4726 gcc_assert (undo);
4727
4728 next = undo->next;
4729 switch (undo->kind)
4730 {
4731 case UNDO_RTX:
4732 *undo->where.r = undo->old_contents.r;
4733 break;
4734 case UNDO_INT:
4735 *undo->where.i = undo->old_contents.i;
4736 break;
4737 case UNDO_MODE:
4738 adjust_reg_mode (*undo->where.r, undo->old_contents.m);
4739 break;
4740 case UNDO_LINKS:
4741 *undo->where.l = undo->old_contents.l;
4742 break;
4743 default:
4744 gcc_unreachable ();
4745 }
4746
4747 undo->next = undobuf.frees;
4748 undobuf.frees = undo;
4749 }
4750
4751 undobuf.undos = (struct undo *) marker;
4752 }
4753
4754 /* Undo all the modifications recorded in undobuf. */
4755
4756 static void
4757 undo_all (void)
4758 {
4759 undo_to_marker (0);
4760 }
4761
4762 /* We've committed to accepting the changes we made. Move all
4763 of the undos to the free list. */
4764
4765 static void
4766 undo_commit (void)
4767 {
4768 struct undo *undo, *next;
4769
4770 for (undo = undobuf.undos; undo; undo = next)
4771 {
4772 next = undo->next;
4773 undo->next = undobuf.frees;
4774 undobuf.frees = undo;
4775 }
4776 undobuf.undos = 0;
4777 }
4778 \f
4779 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
4780 where we have an arithmetic expression and return that point. LOC will
4781 be inside INSN.
4782
4783 try_combine will call this function to see if an insn can be split into
4784 two insns. */
4785
4786 static rtx *
4787 find_split_point (rtx *loc, rtx_insn *insn, bool set_src)
4788 {
4789 rtx x = *loc;
4790 enum rtx_code code = GET_CODE (x);
4791 rtx *split;
4792 unsigned HOST_WIDE_INT len = 0;
4793 HOST_WIDE_INT pos = 0;
4794 int unsignedp = 0;
4795 rtx inner = NULL_RTX;
4796 scalar_int_mode mode, inner_mode;
4797
4798 /* First special-case some codes. */
4799 switch (code)
4800 {
4801 case SUBREG:
4802 #ifdef INSN_SCHEDULING
4803 /* If we are making a paradoxical SUBREG invalid, it becomes a split
4804 point. */
4805 if (MEM_P (SUBREG_REG (x)))
4806 return loc;
4807 #endif
4808 return find_split_point (&SUBREG_REG (x), insn, false);
4809
4810 case MEM:
4811 /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
4812 using LO_SUM and HIGH. */
4813 if (HAVE_lo_sum && (GET_CODE (XEXP (x, 0)) == CONST
4814 || GET_CODE (XEXP (x, 0)) == SYMBOL_REF))
4815 {
4816 machine_mode address_mode = get_address_mode (x);
4817
4818 SUBST (XEXP (x, 0),
4819 gen_rtx_LO_SUM (address_mode,
4820 gen_rtx_HIGH (address_mode, XEXP (x, 0)),
4821 XEXP (x, 0)));
4822 return &XEXP (XEXP (x, 0), 0);
4823 }
4824
4825 /* If we have a PLUS whose second operand is a constant and the
4826 address is not valid, perhaps will can split it up using
4827 the machine-specific way to split large constants. We use
4828 the first pseudo-reg (one of the virtual regs) as a placeholder;
4829 it will not remain in the result. */
4830 if (GET_CODE (XEXP (x, 0)) == PLUS
4831 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
4832 && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4833 MEM_ADDR_SPACE (x)))
4834 {
4835 rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
4836 rtx_insn *seq = combine_split_insns (gen_rtx_SET (reg, XEXP (x, 0)),
4837 subst_insn);
4838
4839 /* This should have produced two insns, each of which sets our
4840 placeholder. If the source of the second is a valid address,
4841 we can make put both sources together and make a split point
4842 in the middle. */
4843
4844 if (seq
4845 && NEXT_INSN (seq) != NULL_RTX
4846 && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
4847 && NONJUMP_INSN_P (seq)
4848 && GET_CODE (PATTERN (seq)) == SET
4849 && SET_DEST (PATTERN (seq)) == reg
4850 && ! reg_mentioned_p (reg,
4851 SET_SRC (PATTERN (seq)))
4852 && NONJUMP_INSN_P (NEXT_INSN (seq))
4853 && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
4854 && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
4855 && memory_address_addr_space_p
4856 (GET_MODE (x), SET_SRC (PATTERN (NEXT_INSN (seq))),
4857 MEM_ADDR_SPACE (x)))
4858 {
4859 rtx src1 = SET_SRC (PATTERN (seq));
4860 rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
4861
4862 /* Replace the placeholder in SRC2 with SRC1. If we can
4863 find where in SRC2 it was placed, that can become our
4864 split point and we can replace this address with SRC2.
4865 Just try two obvious places. */
4866
4867 src2 = replace_rtx (src2, reg, src1);
4868 split = 0;
4869 if (XEXP (src2, 0) == src1)
4870 split = &XEXP (src2, 0);
4871 else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
4872 && XEXP (XEXP (src2, 0), 0) == src1)
4873 split = &XEXP (XEXP (src2, 0), 0);
4874
4875 if (split)
4876 {
4877 SUBST (XEXP (x, 0), src2);
4878 return split;
4879 }
4880 }
4881
4882 /* If that didn't work, perhaps the first operand is complex and
4883 needs to be computed separately, so make a split point there.
4884 This will occur on machines that just support REG + CONST
4885 and have a constant moved through some previous computation. */
4886
4887 else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
4888 && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4889 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4890 return &XEXP (XEXP (x, 0), 0);
4891 }
4892
4893 /* If we have a PLUS whose first operand is complex, try computing it
4894 separately by making a split there. */
4895 if (GET_CODE (XEXP (x, 0)) == PLUS
4896 && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4897 MEM_ADDR_SPACE (x))
4898 && ! OBJECT_P (XEXP (XEXP (x, 0), 0))
4899 && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4900 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4901 return &XEXP (XEXP (x, 0), 0);
4902 break;
4903
4904 case SET:
4905 /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
4906 ZERO_EXTRACT, the most likely reason why this doesn't match is that
4907 we need to put the operand into a register. So split at that
4908 point. */
4909
4910 if (SET_DEST (x) == cc0_rtx
4911 && GET_CODE (SET_SRC (x)) != COMPARE
4912 && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
4913 && !OBJECT_P (SET_SRC (x))
4914 && ! (GET_CODE (SET_SRC (x)) == SUBREG
4915 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
4916 return &SET_SRC (x);
4917
4918 /* See if we can split SET_SRC as it stands. */
4919 split = find_split_point (&SET_SRC (x), insn, true);
4920 if (split && split != &SET_SRC (x))
4921 return split;
4922
4923 /* See if we can split SET_DEST as it stands. */
4924 split = find_split_point (&SET_DEST (x), insn, false);
4925 if (split && split != &SET_DEST (x))
4926 return split;
4927
4928 /* See if this is a bitfield assignment with everything constant. If
4929 so, this is an IOR of an AND, so split it into that. */
4930 if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
4931 && is_a <scalar_int_mode> (GET_MODE (XEXP (SET_DEST (x), 0)),
4932 &inner_mode)
4933 && HWI_COMPUTABLE_MODE_P (inner_mode)
4934 && CONST_INT_P (XEXP (SET_DEST (x), 1))
4935 && CONST_INT_P (XEXP (SET_DEST (x), 2))
4936 && CONST_INT_P (SET_SRC (x))
4937 && ((INTVAL (XEXP (SET_DEST (x), 1))
4938 + INTVAL (XEXP (SET_DEST (x), 2)))
4939 <= GET_MODE_PRECISION (inner_mode))
4940 && ! side_effects_p (XEXP (SET_DEST (x), 0)))
4941 {
4942 HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
4943 unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
4944 unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
4945 rtx dest = XEXP (SET_DEST (x), 0);
4946 unsigned HOST_WIDE_INT mask
4947 = (HOST_WIDE_INT_1U << len) - 1;
4948 rtx or_mask;
4949
4950 if (BITS_BIG_ENDIAN)
4951 pos = GET_MODE_PRECISION (inner_mode) - len - pos;
4952
4953 or_mask = gen_int_mode (src << pos, inner_mode);
4954 if (src == mask)
4955 SUBST (SET_SRC (x),
4956 simplify_gen_binary (IOR, inner_mode, dest, or_mask));
4957 else
4958 {
4959 rtx negmask = gen_int_mode (~(mask << pos), inner_mode);
4960 SUBST (SET_SRC (x),
4961 simplify_gen_binary (IOR, inner_mode,
4962 simplify_gen_binary (AND, inner_mode,
4963 dest, negmask),
4964 or_mask));
4965 }
4966
4967 SUBST (SET_DEST (x), dest);
4968
4969 split = find_split_point (&SET_SRC (x), insn, true);
4970 if (split && split != &SET_SRC (x))
4971 return split;
4972 }
4973
4974 /* Otherwise, see if this is an operation that we can split into two.
4975 If so, try to split that. */
4976 code = GET_CODE (SET_SRC (x));
4977
4978 switch (code)
4979 {
4980 case AND:
4981 /* If we are AND'ing with a large constant that is only a single
4982 bit and the result is only being used in a context where we
4983 need to know if it is zero or nonzero, replace it with a bit
4984 extraction. This will avoid the large constant, which might
4985 have taken more than one insn to make. If the constant were
4986 not a valid argument to the AND but took only one insn to make,
4987 this is no worse, but if it took more than one insn, it will
4988 be better. */
4989
4990 if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4991 && REG_P (XEXP (SET_SRC (x), 0))
4992 && (pos = exact_log2 (UINTVAL (XEXP (SET_SRC (x), 1)))) >= 7
4993 && REG_P (SET_DEST (x))
4994 && (split = find_single_use (SET_DEST (x), insn, NULL)) != 0
4995 && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
4996 && XEXP (*split, 0) == SET_DEST (x)
4997 && XEXP (*split, 1) == const0_rtx)
4998 {
4999 rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
5000 XEXP (SET_SRC (x), 0),
5001 pos, NULL_RTX, 1, 1, 0, 0);
5002 if (extraction != 0)
5003 {
5004 SUBST (SET_SRC (x), extraction);
5005 return find_split_point (loc, insn, false);
5006 }
5007 }
5008 break;
5009
5010 case NE:
5011 /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
5012 is known to be on, this can be converted into a NEG of a shift. */
5013 if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
5014 && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
5015 && 1 <= (pos = exact_log2
5016 (nonzero_bits (XEXP (SET_SRC (x), 0),
5017 GET_MODE (XEXP (SET_SRC (x), 0))))))
5018 {
5019 machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
5020
5021 SUBST (SET_SRC (x),
5022 gen_rtx_NEG (mode,
5023 gen_rtx_LSHIFTRT (mode,
5024 XEXP (SET_SRC (x), 0),
5025 GEN_INT (pos))));
5026
5027 split = find_split_point (&SET_SRC (x), insn, true);
5028 if (split && split != &SET_SRC (x))
5029 return split;
5030 }
5031 break;
5032
5033 case SIGN_EXTEND:
5034 inner = XEXP (SET_SRC (x), 0);
5035
5036 /* We can't optimize if either mode is a partial integer
5037 mode as we don't know how many bits are significant
5038 in those modes. */
5039 if (!is_int_mode (GET_MODE (inner), &inner_mode)
5040 || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
5041 break;
5042
5043 pos = 0;
5044 len = GET_MODE_PRECISION (inner_mode);
5045 unsignedp = 0;
5046 break;
5047
5048 case SIGN_EXTRACT:
5049 case ZERO_EXTRACT:
5050 if (is_a <scalar_int_mode> (GET_MODE (XEXP (SET_SRC (x), 0)),
5051 &inner_mode)
5052 && CONST_INT_P (XEXP (SET_SRC (x), 1))
5053 && CONST_INT_P (XEXP (SET_SRC (x), 2)))
5054 {
5055 inner = XEXP (SET_SRC (x), 0);
5056 len = INTVAL (XEXP (SET_SRC (x), 1));
5057 pos = INTVAL (XEXP (SET_SRC (x), 2));
5058
5059 if (BITS_BIG_ENDIAN)
5060 pos = GET_MODE_PRECISION (inner_mode) - len - pos;
5061 unsignedp = (code == ZERO_EXTRACT);
5062 }
5063 break;
5064
5065 default:
5066 break;
5067 }
5068
5069 if (len && pos >= 0
5070 && pos + len <= GET_MODE_PRECISION (GET_MODE (inner))
5071 && is_a <scalar_int_mode> (GET_MODE (SET_SRC (x)), &mode))
5072 {
5073 /* For unsigned, we have a choice of a shift followed by an
5074 AND or two shifts. Use two shifts for field sizes where the
5075 constant might be too large. We assume here that we can
5076 always at least get 8-bit constants in an AND insn, which is
5077 true for every current RISC. */
5078
5079 if (unsignedp && len <= 8)
5080 {
5081 unsigned HOST_WIDE_INT mask
5082 = (HOST_WIDE_INT_1U << len) - 1;
5083 SUBST (SET_SRC (x),
5084 gen_rtx_AND (mode,
5085 gen_rtx_LSHIFTRT
5086 (mode, gen_lowpart (mode, inner),
5087 GEN_INT (pos)),
5088 gen_int_mode (mask, mode)));
5089
5090 split = find_split_point (&SET_SRC (x), insn, true);
5091 if (split && split != &SET_SRC (x))
5092 return split;
5093 }
5094 else
5095 {
5096 SUBST (SET_SRC (x),
5097 gen_rtx_fmt_ee
5098 (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
5099 gen_rtx_ASHIFT (mode,
5100 gen_lowpart (mode, inner),
5101 GEN_INT (GET_MODE_PRECISION (mode)
5102 - len - pos)),
5103 GEN_INT (GET_MODE_PRECISION (mode) - len)));
5104
5105 split = find_split_point (&SET_SRC (x), insn, true);
5106 if (split && split != &SET_SRC (x))
5107 return split;
5108 }
5109 }
5110
5111 /* See if this is a simple operation with a constant as the second
5112 operand. It might be that this constant is out of range and hence
5113 could be used as a split point. */
5114 if (BINARY_P (SET_SRC (x))
5115 && CONSTANT_P (XEXP (SET_SRC (x), 1))
5116 && (OBJECT_P (XEXP (SET_SRC (x), 0))
5117 || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
5118 && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
5119 return &XEXP (SET_SRC (x), 1);
5120
5121 /* Finally, see if this is a simple operation with its first operand
5122 not in a register. The operation might require this operand in a
5123 register, so return it as a split point. We can always do this
5124 because if the first operand were another operation, we would have
5125 already found it as a split point. */
5126 if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
5127 && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
5128 return &XEXP (SET_SRC (x), 0);
5129
5130 return 0;
5131
5132 case AND:
5133 case IOR:
5134 /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
5135 it is better to write this as (not (ior A B)) so we can split it.
5136 Similarly for IOR. */
5137 if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
5138 {
5139 SUBST (*loc,
5140 gen_rtx_NOT (GET_MODE (x),
5141 gen_rtx_fmt_ee (code == IOR ? AND : IOR,
5142 GET_MODE (x),
5143 XEXP (XEXP (x, 0), 0),
5144 XEXP (XEXP (x, 1), 0))));
5145 return find_split_point (loc, insn, set_src);
5146 }
5147
5148 /* Many RISC machines have a large set of logical insns. If the
5149 second operand is a NOT, put it first so we will try to split the
5150 other operand first. */
5151 if (GET_CODE (XEXP (x, 1)) == NOT)
5152 {
5153 rtx tem = XEXP (x, 0);
5154 SUBST (XEXP (x, 0), XEXP (x, 1));
5155 SUBST (XEXP (x, 1), tem);
5156 }
5157 break;
5158
5159 case PLUS:
5160 case MINUS:
5161 /* Canonicalization can produce (minus A (mult B C)), where C is a
5162 constant. It may be better to try splitting (plus (mult B -C) A)
5163 instead if this isn't a multiply by a power of two. */
5164 if (set_src && code == MINUS && GET_CODE (XEXP (x, 1)) == MULT
5165 && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
5166 && !pow2p_hwi (INTVAL (XEXP (XEXP (x, 1), 1))))
5167 {
5168 machine_mode mode = GET_MODE (x);
5169 unsigned HOST_WIDE_INT this_int = INTVAL (XEXP (XEXP (x, 1), 1));
5170 HOST_WIDE_INT other_int = trunc_int_for_mode (-this_int, mode);
5171 SUBST (*loc, gen_rtx_PLUS (mode,
5172 gen_rtx_MULT (mode,
5173 XEXP (XEXP (x, 1), 0),
5174 gen_int_mode (other_int,
5175 mode)),
5176 XEXP (x, 0)));
5177 return find_split_point (loc, insn, set_src);
5178 }
5179
5180 /* Split at a multiply-accumulate instruction. However if this is
5181 the SET_SRC, we likely do not have such an instruction and it's
5182 worthless to try this split. */
5183 if (!set_src
5184 && (GET_CODE (XEXP (x, 0)) == MULT
5185 || (GET_CODE (XEXP (x, 0)) == ASHIFT
5186 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)))
5187 return loc;
5188
5189 default:
5190 break;
5191 }
5192
5193 /* Otherwise, select our actions depending on our rtx class. */
5194 switch (GET_RTX_CLASS (code))
5195 {
5196 case RTX_BITFIELD_OPS: /* This is ZERO_EXTRACT and SIGN_EXTRACT. */
5197 case RTX_TERNARY:
5198 split = find_split_point (&XEXP (x, 2), insn, false);
5199 if (split)
5200 return split;
5201 /* fall through */
5202 case RTX_BIN_ARITH:
5203 case RTX_COMM_ARITH:
5204 case RTX_COMPARE:
5205 case RTX_COMM_COMPARE:
5206 split = find_split_point (&XEXP (x, 1), insn, false);
5207 if (split)
5208 return split;
5209 /* fall through */
5210 case RTX_UNARY:
5211 /* Some machines have (and (shift ...) ...) insns. If X is not
5212 an AND, but XEXP (X, 0) is, use it as our split point. */
5213 if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
5214 return &XEXP (x, 0);
5215
5216 split = find_split_point (&XEXP (x, 0), insn, false);
5217 if (split)
5218 return split;
5219 return loc;
5220
5221 default:
5222 /* Otherwise, we don't have a split point. */
5223 return 0;
5224 }
5225 }
5226 \f
5227 /* Throughout X, replace FROM with TO, and return the result.
5228 The result is TO if X is FROM;
5229 otherwise the result is X, but its contents may have been modified.
5230 If they were modified, a record was made in undobuf so that
5231 undo_all will (among other things) return X to its original state.
5232
5233 If the number of changes necessary is too much to record to undo,
5234 the excess changes are not made, so the result is invalid.
5235 The changes already made can still be undone.
5236 undobuf.num_undo is incremented for such changes, so by testing that
5237 the caller can tell whether the result is valid.
5238
5239 `n_occurrences' is incremented each time FROM is replaced.
5240
5241 IN_DEST is nonzero if we are processing the SET_DEST of a SET.
5242
5243 IN_COND is nonzero if we are at the top level of a condition.
5244
5245 UNIQUE_COPY is nonzero if each substitution must be unique. We do this
5246 by copying if `n_occurrences' is nonzero. */
5247
5248 static rtx
5249 subst (rtx x, rtx from, rtx to, int in_dest, int in_cond, int unique_copy)
5250 {
5251 enum rtx_code code = GET_CODE (x);
5252 machine_mode op0_mode = VOIDmode;
5253 const char *fmt;
5254 int len, i;
5255 rtx new_rtx;
5256
5257 /* Two expressions are equal if they are identical copies of a shared
5258 RTX or if they are both registers with the same register number
5259 and mode. */
5260
5261 #define COMBINE_RTX_EQUAL_P(X,Y) \
5262 ((X) == (Y) \
5263 || (REG_P (X) && REG_P (Y) \
5264 && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
5265
5266 /* Do not substitute into clobbers of regs -- this will never result in
5267 valid RTL. */
5268 if (GET_CODE (x) == CLOBBER && REG_P (XEXP (x, 0)))
5269 return x;
5270
5271 if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
5272 {
5273 n_occurrences++;
5274 return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
5275 }
5276
5277 /* If X and FROM are the same register but different modes, they
5278 will not have been seen as equal above. However, the log links code
5279 will make a LOG_LINKS entry for that case. If we do nothing, we
5280 will try to rerecognize our original insn and, when it succeeds,
5281 we will delete the feeding insn, which is incorrect.
5282
5283 So force this insn not to match in this (rare) case. */
5284 if (! in_dest && code == REG && REG_P (from)
5285 && reg_overlap_mentioned_p (x, from))
5286 return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
5287
5288 /* If this is an object, we are done unless it is a MEM or LO_SUM, both
5289 of which may contain things that can be combined. */
5290 if (code != MEM && code != LO_SUM && OBJECT_P (x))
5291 return x;
5292
5293 /* It is possible to have a subexpression appear twice in the insn.
5294 Suppose that FROM is a register that appears within TO.
5295 Then, after that subexpression has been scanned once by `subst',
5296 the second time it is scanned, TO may be found. If we were
5297 to scan TO here, we would find FROM within it and create a
5298 self-referent rtl structure which is completely wrong. */
5299 if (COMBINE_RTX_EQUAL_P (x, to))
5300 return to;
5301
5302 /* Parallel asm_operands need special attention because all of the
5303 inputs are shared across the arms. Furthermore, unsharing the
5304 rtl results in recognition failures. Failure to handle this case
5305 specially can result in circular rtl.
5306
5307 Solve this by doing a normal pass across the first entry of the
5308 parallel, and only processing the SET_DESTs of the subsequent
5309 entries. Ug. */
5310
5311 if (code == PARALLEL
5312 && GET_CODE (XVECEXP (x, 0, 0)) == SET
5313 && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
5314 {
5315 new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, 0, unique_copy);
5316
5317 /* If this substitution failed, this whole thing fails. */
5318 if (GET_CODE (new_rtx) == CLOBBER
5319 && XEXP (new_rtx, 0) == const0_rtx)
5320 return new_rtx;
5321
5322 SUBST (XVECEXP (x, 0, 0), new_rtx);
5323
5324 for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
5325 {
5326 rtx dest = SET_DEST (XVECEXP (x, 0, i));
5327
5328 if (!REG_P (dest)
5329 && GET_CODE (dest) != CC0
5330 && GET_CODE (dest) != PC)
5331 {
5332 new_rtx = subst (dest, from, to, 0, 0, unique_copy);
5333
5334 /* If this substitution failed, this whole thing fails. */
5335 if (GET_CODE (new_rtx) == CLOBBER
5336 && XEXP (new_rtx, 0) == const0_rtx)
5337 return new_rtx;
5338
5339 SUBST (SET_DEST (XVECEXP (x, 0, i)), new_rtx);
5340 }
5341 }
5342 }
5343 else
5344 {
5345 len = GET_RTX_LENGTH (code);
5346 fmt = GET_RTX_FORMAT (code);
5347
5348 /* We don't need to process a SET_DEST that is a register, CC0,
5349 or PC, so set up to skip this common case. All other cases
5350 where we want to suppress replacing something inside a
5351 SET_SRC are handled via the IN_DEST operand. */
5352 if (code == SET
5353 && (REG_P (SET_DEST (x))
5354 || GET_CODE (SET_DEST (x)) == CC0
5355 || GET_CODE (SET_DEST (x)) == PC))
5356 fmt = "ie";
5357
5358 /* Trying to simplify the operands of a widening MULT is not likely
5359 to create RTL matching a machine insn. */
5360 if (code == MULT
5361 && (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
5362 || GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
5363 && (GET_CODE (XEXP (x, 1)) == ZERO_EXTEND
5364 || GET_CODE (XEXP (x, 1)) == SIGN_EXTEND)
5365 && REG_P (XEXP (XEXP (x, 0), 0))
5366 && REG_P (XEXP (XEXP (x, 1), 0))
5367 && from == to)
5368 return x;
5369
5370
5371 /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
5372 constant. */
5373 if (fmt[0] == 'e')
5374 op0_mode = GET_MODE (XEXP (x, 0));
5375
5376 for (i = 0; i < len; i++)
5377 {
5378 if (fmt[i] == 'E')
5379 {
5380 int j;
5381 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
5382 {
5383 if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
5384 {
5385 new_rtx = (unique_copy && n_occurrences
5386 ? copy_rtx (to) : to);
5387 n_occurrences++;
5388 }
5389 else
5390 {
5391 new_rtx = subst (XVECEXP (x, i, j), from, to, 0, 0,
5392 unique_copy);
5393
5394 /* If this substitution failed, this whole thing
5395 fails. */
5396 if (GET_CODE (new_rtx) == CLOBBER
5397 && XEXP (new_rtx, 0) == const0_rtx)
5398 return new_rtx;
5399 }
5400
5401 SUBST (XVECEXP (x, i, j), new_rtx);
5402 }
5403 }
5404 else if (fmt[i] == 'e')
5405 {
5406 /* If this is a register being set, ignore it. */
5407 new_rtx = XEXP (x, i);
5408 if (in_dest
5409 && i == 0
5410 && (((code == SUBREG || code == ZERO_EXTRACT)
5411 && REG_P (new_rtx))
5412 || code == STRICT_LOW_PART))
5413 ;
5414
5415 else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
5416 {
5417 /* In general, don't install a subreg involving two
5418 modes not tieable. It can worsen register
5419 allocation, and can even make invalid reload
5420 insns, since the reg inside may need to be copied
5421 from in the outside mode, and that may be invalid
5422 if it is an fp reg copied in integer mode.
5423
5424 We allow two exceptions to this: It is valid if
5425 it is inside another SUBREG and the mode of that
5426 SUBREG and the mode of the inside of TO is
5427 tieable and it is valid if X is a SET that copies
5428 FROM to CC0. */
5429
5430 if (GET_CODE (to) == SUBREG
5431 && ! MODES_TIEABLE_P (GET_MODE (to),
5432 GET_MODE (SUBREG_REG (to)))
5433 && ! (code == SUBREG
5434 && MODES_TIEABLE_P (GET_MODE (x),
5435 GET_MODE (SUBREG_REG (to))))
5436 && (!HAVE_cc0
5437 || (! (code == SET
5438 && i == 1
5439 && XEXP (x, 0) == cc0_rtx))))
5440 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5441
5442 if (code == SUBREG
5443 && REG_P (to)
5444 && REGNO (to) < FIRST_PSEUDO_REGISTER
5445 && simplify_subreg_regno (REGNO (to), GET_MODE (to),
5446 SUBREG_BYTE (x),
5447 GET_MODE (x)) < 0)
5448 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5449
5450 new_rtx = (unique_copy && n_occurrences ? copy_rtx (to) : to);
5451 n_occurrences++;
5452 }
5453 else
5454 /* If we are in a SET_DEST, suppress most cases unless we
5455 have gone inside a MEM, in which case we want to
5456 simplify the address. We assume here that things that
5457 are actually part of the destination have their inner
5458 parts in the first expression. This is true for SUBREG,
5459 STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
5460 things aside from REG and MEM that should appear in a
5461 SET_DEST. */
5462 new_rtx = subst (XEXP (x, i), from, to,
5463 (((in_dest
5464 && (code == SUBREG || code == STRICT_LOW_PART
5465 || code == ZERO_EXTRACT))
5466 || code == SET)
5467 && i == 0),
5468 code == IF_THEN_ELSE && i == 0,
5469 unique_copy);
5470
5471 /* If we found that we will have to reject this combination,
5472 indicate that by returning the CLOBBER ourselves, rather than
5473 an expression containing it. This will speed things up as
5474 well as prevent accidents where two CLOBBERs are considered
5475 to be equal, thus producing an incorrect simplification. */
5476
5477 if (GET_CODE (new_rtx) == CLOBBER && XEXP (new_rtx, 0) == const0_rtx)
5478 return new_rtx;
5479
5480 if (GET_CODE (x) == SUBREG && CONST_SCALAR_INT_P (new_rtx))
5481 {
5482 machine_mode mode = GET_MODE (x);
5483
5484 x = simplify_subreg (GET_MODE (x), new_rtx,
5485 GET_MODE (SUBREG_REG (x)),
5486 SUBREG_BYTE (x));
5487 if (! x)
5488 x = gen_rtx_CLOBBER (mode, const0_rtx);
5489 }
5490 else if (CONST_SCALAR_INT_P (new_rtx)
5491 && GET_CODE (x) == ZERO_EXTEND)
5492 {
5493 x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
5494 new_rtx, GET_MODE (XEXP (x, 0)));
5495 gcc_assert (x);
5496 }
5497 else
5498 SUBST (XEXP (x, i), new_rtx);
5499 }
5500 }
5501 }
5502
5503 /* Check if we are loading something from the constant pool via float
5504 extension; in this case we would undo compress_float_constant
5505 optimization and degenerate constant load to an immediate value. */
5506 if (GET_CODE (x) == FLOAT_EXTEND
5507 && MEM_P (XEXP (x, 0))
5508 && MEM_READONLY_P (XEXP (x, 0)))
5509 {
5510 rtx tmp = avoid_constant_pool_reference (x);
5511 if (x != tmp)
5512 return x;
5513 }
5514
5515 /* Try to simplify X. If the simplification changed the code, it is likely
5516 that further simplification will help, so loop, but limit the number
5517 of repetitions that will be performed. */
5518
5519 for (i = 0; i < 4; i++)
5520 {
5521 /* If X is sufficiently simple, don't bother trying to do anything
5522 with it. */
5523 if (code != CONST_INT && code != REG && code != CLOBBER)
5524 x = combine_simplify_rtx (x, op0_mode, in_dest, in_cond);
5525
5526 if (GET_CODE (x) == code)
5527 break;
5528
5529 code = GET_CODE (x);
5530
5531 /* We no longer know the original mode of operand 0 since we
5532 have changed the form of X) */
5533 op0_mode = VOIDmode;
5534 }
5535
5536 return x;
5537 }
5538 \f
5539 /* If X is a commutative operation whose operands are not in the canonical
5540 order, use substitutions to swap them. */
5541
5542 static void
5543 maybe_swap_commutative_operands (rtx x)
5544 {
5545 if (COMMUTATIVE_ARITH_P (x)
5546 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
5547 {
5548 rtx temp = XEXP (x, 0);
5549 SUBST (XEXP (x, 0), XEXP (x, 1));
5550 SUBST (XEXP (x, 1), temp);
5551 }
5552 }
5553
5554 /* Simplify X, a piece of RTL. We just operate on the expression at the
5555 outer level; call `subst' to simplify recursively. Return the new
5556 expression.
5557
5558 OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero
5559 if we are inside a SET_DEST. IN_COND is nonzero if we are at the top level
5560 of a condition. */
5561
5562 static rtx
5563 combine_simplify_rtx (rtx x, machine_mode op0_mode, int in_dest,
5564 int in_cond)
5565 {
5566 enum rtx_code code = GET_CODE (x);
5567 machine_mode mode = GET_MODE (x);
5568 scalar_int_mode int_mode;
5569 rtx temp;
5570 int i;
5571
5572 /* If this is a commutative operation, put a constant last and a complex
5573 expression first. We don't need to do this for comparisons here. */
5574 maybe_swap_commutative_operands (x);
5575
5576 /* Try to fold this expression in case we have constants that weren't
5577 present before. */
5578 temp = 0;
5579 switch (GET_RTX_CLASS (code))
5580 {
5581 case RTX_UNARY:
5582 if (op0_mode == VOIDmode)
5583 op0_mode = GET_MODE (XEXP (x, 0));
5584 temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
5585 break;
5586 case RTX_COMPARE:
5587 case RTX_COMM_COMPARE:
5588 {
5589 machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
5590 if (cmp_mode == VOIDmode)
5591 {
5592 cmp_mode = GET_MODE (XEXP (x, 1));
5593 if (cmp_mode == VOIDmode)
5594 cmp_mode = op0_mode;
5595 }
5596 temp = simplify_relational_operation (code, mode, cmp_mode,
5597 XEXP (x, 0), XEXP (x, 1));
5598 }
5599 break;
5600 case RTX_COMM_ARITH:
5601 case RTX_BIN_ARITH:
5602 temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
5603 break;
5604 case RTX_BITFIELD_OPS:
5605 case RTX_TERNARY:
5606 temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
5607 XEXP (x, 1), XEXP (x, 2));
5608 break;
5609 default:
5610 break;
5611 }
5612
5613 if (temp)
5614 {
5615 x = temp;
5616 code = GET_CODE (temp);
5617 op0_mode = VOIDmode;
5618 mode = GET_MODE (temp);
5619 }
5620
5621 /* If this is a simple operation applied to an IF_THEN_ELSE, try
5622 applying it to the arms of the IF_THEN_ELSE. This often simplifies
5623 things. Check for cases where both arms are testing the same
5624 condition.
5625
5626 Don't do anything if all operands are very simple. */
5627
5628 if ((BINARY_P (x)
5629 && ((!OBJECT_P (XEXP (x, 0))
5630 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5631 && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
5632 || (!OBJECT_P (XEXP (x, 1))
5633 && ! (GET_CODE (XEXP (x, 1)) == SUBREG
5634 && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
5635 || (UNARY_P (x)
5636 && (!OBJECT_P (XEXP (x, 0))
5637 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5638 && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
5639 {
5640 rtx cond, true_rtx, false_rtx;
5641
5642 cond = if_then_else_cond (x, &true_rtx, &false_rtx);
5643 if (cond != 0
5644 /* If everything is a comparison, what we have is highly unlikely
5645 to be simpler, so don't use it. */
5646 && ! (COMPARISON_P (x)
5647 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
5648 {
5649 rtx cop1 = const0_rtx;
5650 enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
5651
5652 if (cond_code == NE && COMPARISON_P (cond))
5653 return x;
5654
5655 /* Simplify the alternative arms; this may collapse the true and
5656 false arms to store-flag values. Be careful to use copy_rtx
5657 here since true_rtx or false_rtx might share RTL with x as a
5658 result of the if_then_else_cond call above. */
5659 true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0, 0);
5660 false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0, 0);
5661
5662 /* If true_rtx and false_rtx are not general_operands, an if_then_else
5663 is unlikely to be simpler. */
5664 if (general_operand (true_rtx, VOIDmode)
5665 && general_operand (false_rtx, VOIDmode))
5666 {
5667 enum rtx_code reversed;
5668
5669 /* Restarting if we generate a store-flag expression will cause
5670 us to loop. Just drop through in this case. */
5671
5672 /* If the result values are STORE_FLAG_VALUE and zero, we can
5673 just make the comparison operation. */
5674 if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
5675 x = simplify_gen_relational (cond_code, mode, VOIDmode,
5676 cond, cop1);
5677 else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
5678 && ((reversed = reversed_comparison_code_parts
5679 (cond_code, cond, cop1, NULL))
5680 != UNKNOWN))
5681 x = simplify_gen_relational (reversed, mode, VOIDmode,
5682 cond, cop1);
5683
5684 /* Likewise, we can make the negate of a comparison operation
5685 if the result values are - STORE_FLAG_VALUE and zero. */
5686 else if (CONST_INT_P (true_rtx)
5687 && INTVAL (true_rtx) == - STORE_FLAG_VALUE
5688 && false_rtx == const0_rtx)
5689 x = simplify_gen_unary (NEG, mode,
5690 simplify_gen_relational (cond_code,
5691 mode, VOIDmode,
5692 cond, cop1),
5693 mode);
5694 else if (CONST_INT_P (false_rtx)
5695 && INTVAL (false_rtx) == - STORE_FLAG_VALUE
5696 && true_rtx == const0_rtx
5697 && ((reversed = reversed_comparison_code_parts
5698 (cond_code, cond, cop1, NULL))
5699 != UNKNOWN))
5700 x = simplify_gen_unary (NEG, mode,
5701 simplify_gen_relational (reversed,
5702 mode, VOIDmode,
5703 cond, cop1),
5704 mode);
5705 else
5706 return gen_rtx_IF_THEN_ELSE (mode,
5707 simplify_gen_relational (cond_code,
5708 mode,
5709 VOIDmode,
5710 cond,
5711 cop1),
5712 true_rtx, false_rtx);
5713
5714 code = GET_CODE (x);
5715 op0_mode = VOIDmode;
5716 }
5717 }
5718 }
5719
5720 /* First see if we can apply the inverse distributive law. */
5721 if (code == PLUS || code == MINUS
5722 || code == AND || code == IOR || code == XOR)
5723 {
5724 x = apply_distributive_law (x);
5725 code = GET_CODE (x);
5726 op0_mode = VOIDmode;
5727 }
5728
5729 /* If CODE is an associative operation not otherwise handled, see if we
5730 can associate some operands. This can win if they are constants or
5731 if they are logically related (i.e. (a & b) & a). */
5732 if ((code == PLUS || code == MINUS || code == MULT || code == DIV
5733 || code == AND || code == IOR || code == XOR
5734 || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
5735 && ((INTEGRAL_MODE_P (mode) && code != DIV)
5736 || (flag_associative_math && FLOAT_MODE_P (mode))))
5737 {
5738 if (GET_CODE (XEXP (x, 0)) == code)
5739 {
5740 rtx other = XEXP (XEXP (x, 0), 0);
5741 rtx inner_op0 = XEXP (XEXP (x, 0), 1);
5742 rtx inner_op1 = XEXP (x, 1);
5743 rtx inner;
5744
5745 /* Make sure we pass the constant operand if any as the second
5746 one if this is a commutative operation. */
5747 if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
5748 std::swap (inner_op0, inner_op1);
5749 inner = simplify_binary_operation (code == MINUS ? PLUS
5750 : code == DIV ? MULT
5751 : code,
5752 mode, inner_op0, inner_op1);
5753
5754 /* For commutative operations, try the other pair if that one
5755 didn't simplify. */
5756 if (inner == 0 && COMMUTATIVE_ARITH_P (x))
5757 {
5758 other = XEXP (XEXP (x, 0), 1);
5759 inner = simplify_binary_operation (code, mode,
5760 XEXP (XEXP (x, 0), 0),
5761 XEXP (x, 1));
5762 }
5763
5764 if (inner)
5765 return simplify_gen_binary (code, mode, other, inner);
5766 }
5767 }
5768
5769 /* A little bit of algebraic simplification here. */
5770 switch (code)
5771 {
5772 case MEM:
5773 /* Ensure that our address has any ASHIFTs converted to MULT in case
5774 address-recognizing predicates are called later. */
5775 temp = make_compound_operation (XEXP (x, 0), MEM);
5776 SUBST (XEXP (x, 0), temp);
5777 break;
5778
5779 case SUBREG:
5780 if (op0_mode == VOIDmode)
5781 op0_mode = GET_MODE (SUBREG_REG (x));
5782
5783 /* See if this can be moved to simplify_subreg. */
5784 if (CONSTANT_P (SUBREG_REG (x))
5785 && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
5786 /* Don't call gen_lowpart if the inner mode
5787 is VOIDmode and we cannot simplify it, as SUBREG without
5788 inner mode is invalid. */
5789 && (GET_MODE (SUBREG_REG (x)) != VOIDmode
5790 || gen_lowpart_common (mode, SUBREG_REG (x))))
5791 return gen_lowpart (mode, SUBREG_REG (x));
5792
5793 if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
5794 break;
5795 {
5796 rtx temp;
5797 temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
5798 SUBREG_BYTE (x));
5799 if (temp)
5800 return temp;
5801
5802 /* If op is known to have all lower bits zero, the result is zero. */
5803 scalar_int_mode int_mode, int_op0_mode;
5804 if (!in_dest
5805 && is_a <scalar_int_mode> (mode, &int_mode)
5806 && is_a <scalar_int_mode> (op0_mode, &int_op0_mode)
5807 && (GET_MODE_PRECISION (int_mode)
5808 < GET_MODE_PRECISION (int_op0_mode))
5809 && (subreg_lowpart_offset (int_mode, int_op0_mode)
5810 == SUBREG_BYTE (x))
5811 && HWI_COMPUTABLE_MODE_P (int_op0_mode)
5812 && (nonzero_bits (SUBREG_REG (x), int_op0_mode)
5813 & GET_MODE_MASK (int_mode)) == 0)
5814 return CONST0_RTX (int_mode);
5815 }
5816
5817 /* Don't change the mode of the MEM if that would change the meaning
5818 of the address. */
5819 if (MEM_P (SUBREG_REG (x))
5820 && (MEM_VOLATILE_P (SUBREG_REG (x))
5821 || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0),
5822 MEM_ADDR_SPACE (SUBREG_REG (x)))))
5823 return gen_rtx_CLOBBER (mode, const0_rtx);
5824
5825 /* Note that we cannot do any narrowing for non-constants since
5826 we might have been counting on using the fact that some bits were
5827 zero. We now do this in the SET. */
5828
5829 break;
5830
5831 case NEG:
5832 temp = expand_compound_operation (XEXP (x, 0));
5833
5834 /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
5835 replaced by (lshiftrt X C). This will convert
5836 (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */
5837
5838 if (GET_CODE (temp) == ASHIFTRT
5839 && CONST_INT_P (XEXP (temp, 1))
5840 && INTVAL (XEXP (temp, 1)) == GET_MODE_PRECISION (mode) - 1)
5841 return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (temp, 0),
5842 INTVAL (XEXP (temp, 1)));
5843
5844 /* If X has only a single bit that might be nonzero, say, bit I, convert
5845 (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
5846 MODE minus 1. This will convert (neg (zero_extract X 1 Y)) to
5847 (sign_extract X 1 Y). But only do this if TEMP isn't a register
5848 or a SUBREG of one since we'd be making the expression more
5849 complex if it was just a register. */
5850
5851 if (!REG_P (temp)
5852 && ! (GET_CODE (temp) == SUBREG
5853 && REG_P (SUBREG_REG (temp)))
5854 && is_a <scalar_int_mode> (mode, &int_mode)
5855 && (i = exact_log2 (nonzero_bits (temp, int_mode))) >= 0)
5856 {
5857 rtx temp1 = simplify_shift_const
5858 (NULL_RTX, ASHIFTRT, int_mode,
5859 simplify_shift_const (NULL_RTX, ASHIFT, int_mode, temp,
5860 GET_MODE_PRECISION (int_mode) - 1 - i),
5861 GET_MODE_PRECISION (int_mode) - 1 - i);
5862
5863 /* If all we did was surround TEMP with the two shifts, we
5864 haven't improved anything, so don't use it. Otherwise,
5865 we are better off with TEMP1. */
5866 if (GET_CODE (temp1) != ASHIFTRT
5867 || GET_CODE (XEXP (temp1, 0)) != ASHIFT
5868 || XEXP (XEXP (temp1, 0), 0) != temp)
5869 return temp1;
5870 }
5871 break;
5872
5873 case TRUNCATE:
5874 /* We can't handle truncation to a partial integer mode here
5875 because we don't know the real bitsize of the partial
5876 integer mode. */
5877 if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
5878 break;
5879
5880 if (HWI_COMPUTABLE_MODE_P (mode))
5881 SUBST (XEXP (x, 0),
5882 force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
5883 GET_MODE_MASK (mode), 0));
5884
5885 /* We can truncate a constant value and return it. */
5886 if (CONST_INT_P (XEXP (x, 0)))
5887 return gen_int_mode (INTVAL (XEXP (x, 0)), mode);
5888
5889 /* Similarly to what we do in simplify-rtx.c, a truncate of a register
5890 whose value is a comparison can be replaced with a subreg if
5891 STORE_FLAG_VALUE permits. */
5892 if (HWI_COMPUTABLE_MODE_P (mode)
5893 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
5894 && (temp = get_last_value (XEXP (x, 0)))
5895 && COMPARISON_P (temp))
5896 return gen_lowpart (mode, XEXP (x, 0));
5897 break;
5898
5899 case CONST:
5900 /* (const (const X)) can become (const X). Do it this way rather than
5901 returning the inner CONST since CONST can be shared with a
5902 REG_EQUAL note. */
5903 if (GET_CODE (XEXP (x, 0)) == CONST)
5904 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
5905 break;
5906
5907 case LO_SUM:
5908 /* Convert (lo_sum (high FOO) FOO) to FOO. This is necessary so we
5909 can add in an offset. find_split_point will split this address up
5910 again if it doesn't match. */
5911 if (HAVE_lo_sum && GET_CODE (XEXP (x, 0)) == HIGH
5912 && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
5913 return XEXP (x, 1);
5914 break;
5915
5916 case PLUS:
5917 /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
5918 when c is (const_int (pow2 + 1) / 2) is a sign extension of a
5919 bit-field and can be replaced by either a sign_extend or a
5920 sign_extract. The `and' may be a zero_extend and the two
5921 <c>, -<c> constants may be reversed. */
5922 if (GET_CODE (XEXP (x, 0)) == XOR
5923 && is_a <scalar_int_mode> (mode, &int_mode)
5924 && CONST_INT_P (XEXP (x, 1))
5925 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
5926 && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
5927 && ((i = exact_log2 (UINTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
5928 || (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0)
5929 && HWI_COMPUTABLE_MODE_P (int_mode)
5930 && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
5931 && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
5932 && (UINTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
5933 == (HOST_WIDE_INT_1U << (i + 1)) - 1))
5934 || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
5935 && (GET_MODE_PRECISION (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
5936 == (unsigned int) i + 1))))
5937 return simplify_shift_const
5938 (NULL_RTX, ASHIFTRT, int_mode,
5939 simplify_shift_const (NULL_RTX, ASHIFT, int_mode,
5940 XEXP (XEXP (XEXP (x, 0), 0), 0),
5941 GET_MODE_PRECISION (int_mode) - (i + 1)),
5942 GET_MODE_PRECISION (int_mode) - (i + 1));
5943
5944 /* If only the low-order bit of X is possibly nonzero, (plus x -1)
5945 can become (ashiftrt (ashift (xor x 1) C) C) where C is
5946 the bitsize of the mode - 1. This allows simplification of
5947 "a = (b & 8) == 0;" */
5948 if (XEXP (x, 1) == constm1_rtx
5949 && !REG_P (XEXP (x, 0))
5950 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5951 && REG_P (SUBREG_REG (XEXP (x, 0))))
5952 && is_a <scalar_int_mode> (mode, &int_mode)
5953 && nonzero_bits (XEXP (x, 0), int_mode) == 1)
5954 return simplify_shift_const
5955 (NULL_RTX, ASHIFTRT, int_mode,
5956 simplify_shift_const (NULL_RTX, ASHIFT, int_mode,
5957 gen_rtx_XOR (int_mode, XEXP (x, 0),
5958 const1_rtx),
5959 GET_MODE_PRECISION (int_mode) - 1),
5960 GET_MODE_PRECISION (int_mode) - 1);
5961
5962 /* If we are adding two things that have no bits in common, convert
5963 the addition into an IOR. This will often be further simplified,
5964 for example in cases like ((a & 1) + (a & 2)), which can
5965 become a & 3. */
5966
5967 if (HWI_COMPUTABLE_MODE_P (mode)
5968 && (nonzero_bits (XEXP (x, 0), mode)
5969 & nonzero_bits (XEXP (x, 1), mode)) == 0)
5970 {
5971 /* Try to simplify the expression further. */
5972 rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
5973 temp = combine_simplify_rtx (tor, VOIDmode, in_dest, 0);
5974
5975 /* If we could, great. If not, do not go ahead with the IOR
5976 replacement, since PLUS appears in many special purpose
5977 address arithmetic instructions. */
5978 if (GET_CODE (temp) != CLOBBER
5979 && (GET_CODE (temp) != IOR
5980 || ((XEXP (temp, 0) != XEXP (x, 0)
5981 || XEXP (temp, 1) != XEXP (x, 1))
5982 && (XEXP (temp, 0) != XEXP (x, 1)
5983 || XEXP (temp, 1) != XEXP (x, 0)))))
5984 return temp;
5985 }
5986
5987 /* Canonicalize x + x into x << 1. */
5988 if (GET_MODE_CLASS (mode) == MODE_INT
5989 && rtx_equal_p (XEXP (x, 0), XEXP (x, 1))
5990 && !side_effects_p (XEXP (x, 0)))
5991 return simplify_gen_binary (ASHIFT, mode, XEXP (x, 0), const1_rtx);
5992
5993 break;
5994
5995 case MINUS:
5996 /* (minus <foo> (and <foo> (const_int -pow2))) becomes
5997 (and <foo> (const_int pow2-1)) */
5998 if (is_a <scalar_int_mode> (mode, &int_mode)
5999 && GET_CODE (XEXP (x, 1)) == AND
6000 && CONST_INT_P (XEXP (XEXP (x, 1), 1))
6001 && pow2p_hwi (-UINTVAL (XEXP (XEXP (x, 1), 1)))
6002 && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
6003 return simplify_and_const_int (NULL_RTX, int_mode, XEXP (x, 0),
6004 -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
6005 break;
6006
6007 case MULT:
6008 /* If we have (mult (plus A B) C), apply the distributive law and then
6009 the inverse distributive law to see if things simplify. This
6010 occurs mostly in addresses, often when unrolling loops. */
6011
6012 if (GET_CODE (XEXP (x, 0)) == PLUS)
6013 {
6014 rtx result = distribute_and_simplify_rtx (x, 0);
6015 if (result)
6016 return result;
6017 }
6018
6019 /* Try simplify a*(b/c) as (a*b)/c. */
6020 if (FLOAT_MODE_P (mode) && flag_associative_math
6021 && GET_CODE (XEXP (x, 0)) == DIV)
6022 {
6023 rtx tem = simplify_binary_operation (MULT, mode,
6024 XEXP (XEXP (x, 0), 0),
6025 XEXP (x, 1));
6026 if (tem)
6027 return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
6028 }
6029 break;
6030
6031 case UDIV:
6032 /* If this is a divide by a power of two, treat it as a shift if
6033 its first operand is a shift. */
6034 if (is_a <scalar_int_mode> (mode, &int_mode)
6035 && CONST_INT_P (XEXP (x, 1))
6036 && (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0
6037 && (GET_CODE (XEXP (x, 0)) == ASHIFT
6038 || GET_CODE (XEXP (x, 0)) == LSHIFTRT
6039 || GET_CODE (XEXP (x, 0)) == ASHIFTRT
6040 || GET_CODE (XEXP (x, 0)) == ROTATE
6041 || GET_CODE (XEXP (x, 0)) == ROTATERT))
6042 return simplify_shift_const (NULL_RTX, LSHIFTRT, int_mode,
6043 XEXP (x, 0), i);
6044 break;
6045
6046 case EQ: case NE:
6047 case GT: case GTU: case GE: case GEU:
6048 case LT: case LTU: case LE: case LEU:
6049 case UNEQ: case LTGT:
6050 case UNGT: case UNGE:
6051 case UNLT: case UNLE:
6052 case UNORDERED: case ORDERED:
6053 /* If the first operand is a condition code, we can't do anything
6054 with it. */
6055 if (GET_CODE (XEXP (x, 0)) == COMPARE
6056 || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
6057 && ! CC0_P (XEXP (x, 0))))
6058 {
6059 rtx op0 = XEXP (x, 0);
6060 rtx op1 = XEXP (x, 1);
6061 enum rtx_code new_code;
6062
6063 if (GET_CODE (op0) == COMPARE)
6064 op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
6065
6066 /* Simplify our comparison, if possible. */
6067 new_code = simplify_comparison (code, &op0, &op1);
6068
6069 /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
6070 if only the low-order bit is possibly nonzero in X (such as when
6071 X is a ZERO_EXTRACT of one bit). Similarly, we can convert EQ to
6072 (xor X 1) or (minus 1 X); we use the former. Finally, if X is
6073 known to be either 0 or -1, NE becomes a NEG and EQ becomes
6074 (plus X 1).
6075
6076 Remove any ZERO_EXTRACT we made when thinking this was a
6077 comparison. It may now be simpler to use, e.g., an AND. If a
6078 ZERO_EXTRACT is indeed appropriate, it will be placed back by
6079 the call to make_compound_operation in the SET case.
6080
6081 Don't apply these optimizations if the caller would
6082 prefer a comparison rather than a value.
6083 E.g., for the condition in an IF_THEN_ELSE most targets need
6084 an explicit comparison. */
6085
6086 if (in_cond)
6087 ;
6088
6089 else if (STORE_FLAG_VALUE == 1
6090 && new_code == NE
6091 && is_int_mode (mode, &int_mode)
6092 && op1 == const0_rtx
6093 && int_mode == GET_MODE (op0)
6094 && nonzero_bits (op0, int_mode) == 1)
6095 return gen_lowpart (int_mode,
6096 expand_compound_operation (op0));
6097
6098 else if (STORE_FLAG_VALUE == 1
6099 && new_code == NE
6100 && is_int_mode (mode, &int_mode)
6101 && op1 == const0_rtx
6102 && int_mode == GET_MODE (op0)
6103 && (num_sign_bit_copies (op0, int_mode)
6104 == GET_MODE_PRECISION (int_mode)))
6105 {
6106 op0 = expand_compound_operation (op0);
6107 return simplify_gen_unary (NEG, int_mode,
6108 gen_lowpart (int_mode, op0),
6109 int_mode);
6110 }
6111
6112 else if (STORE_FLAG_VALUE == 1
6113 && new_code == EQ
6114 && is_int_mode (mode, &int_mode)
6115 && op1 == const0_rtx
6116 && int_mode == GET_MODE (op0)
6117 && nonzero_bits (op0, int_mode) == 1)
6118 {
6119 op0 = expand_compound_operation (op0);
6120 return simplify_gen_binary (XOR, int_mode,
6121 gen_lowpart (int_mode, op0),
6122 const1_rtx);
6123 }
6124
6125 else if (STORE_FLAG_VALUE == 1
6126 && new_code == EQ
6127 && is_int_mode (mode, &int_mode)
6128 && op1 == const0_rtx
6129 && int_mode == GET_MODE (op0)
6130 && (num_sign_bit_copies (op0, int_mode)
6131 == GET_MODE_PRECISION (int_mode)))
6132 {
6133 op0 = expand_compound_operation (op0);
6134 return plus_constant (int_mode, gen_lowpart (int_mode, op0), 1);
6135 }
6136
6137 /* If STORE_FLAG_VALUE is -1, we have cases similar to
6138 those above. */
6139 if (in_cond)
6140 ;
6141
6142 else if (STORE_FLAG_VALUE == -1
6143 && new_code == NE
6144 && is_int_mode (mode, &int_mode)
6145 && op1 == const0_rtx
6146 && int_mode == GET_MODE (op0)
6147 && (num_sign_bit_copies (op0, int_mode)
6148 == GET_MODE_PRECISION (int_mode)))
6149 return gen_lowpart (int_mode, expand_compound_operation (op0));
6150
6151 else if (STORE_FLAG_VALUE == -1
6152 && new_code == NE
6153 && is_int_mode (mode, &int_mode)
6154 && op1 == const0_rtx
6155 && int_mode == GET_MODE (op0)
6156 && nonzero_bits (op0, int_mode) == 1)
6157 {
6158 op0 = expand_compound_operation (op0);
6159 return simplify_gen_unary (NEG, int_mode,
6160 gen_lowpart (int_mode, op0),
6161 int_mode);
6162 }
6163
6164 else if (STORE_FLAG_VALUE == -1
6165 && new_code == EQ
6166 && is_int_mode (mode, &int_mode)
6167 && op1 == const0_rtx
6168 && int_mode == GET_MODE (op0)
6169 && (num_sign_bit_copies (op0, int_mode)
6170 == GET_MODE_PRECISION (int_mode)))
6171 {
6172 op0 = expand_compound_operation (op0);
6173 return simplify_gen_unary (NOT, int_mode,
6174 gen_lowpart (int_mode, op0),
6175 int_mode);
6176 }
6177
6178 /* If X is 0/1, (eq X 0) is X-1. */
6179 else if (STORE_FLAG_VALUE == -1
6180 && new_code == EQ
6181 && is_int_mode (mode, &int_mode)
6182 && op1 == const0_rtx
6183 && int_mode == GET_MODE (op0)
6184 && nonzero_bits (op0, int_mode) == 1)
6185 {
6186 op0 = expand_compound_operation (op0);
6187 return plus_constant (int_mode, gen_lowpart (int_mode, op0), -1);
6188 }
6189
6190 /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
6191 one bit that might be nonzero, we can convert (ne x 0) to
6192 (ashift x c) where C puts the bit in the sign bit. Remove any
6193 AND with STORE_FLAG_VALUE when we are done, since we are only
6194 going to test the sign bit. */
6195 if (new_code == NE
6196 && is_int_mode (mode, &int_mode)
6197 && HWI_COMPUTABLE_MODE_P (int_mode)
6198 && val_signbit_p (int_mode, STORE_FLAG_VALUE)
6199 && op1 == const0_rtx
6200 && int_mode == GET_MODE (op0)
6201 && (i = exact_log2 (nonzero_bits (op0, int_mode))) >= 0)
6202 {
6203 x = simplify_shift_const (NULL_RTX, ASHIFT, int_mode,
6204 expand_compound_operation (op0),
6205 GET_MODE_PRECISION (int_mode) - 1 - i);
6206 if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
6207 return XEXP (x, 0);
6208 else
6209 return x;
6210 }
6211
6212 /* If the code changed, return a whole new comparison.
6213 We also need to avoid using SUBST in cases where
6214 simplify_comparison has widened a comparison with a CONST_INT,
6215 since in that case the wider CONST_INT may fail the sanity
6216 checks in do_SUBST. */
6217 if (new_code != code
6218 || (CONST_INT_P (op1)
6219 && GET_MODE (op0) != GET_MODE (XEXP (x, 0))
6220 && GET_MODE (op0) != GET_MODE (XEXP (x, 1))))
6221 return gen_rtx_fmt_ee (new_code, mode, op0, op1);
6222
6223 /* Otherwise, keep this operation, but maybe change its operands.
6224 This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR). */
6225 SUBST (XEXP (x, 0), op0);
6226 SUBST (XEXP (x, 1), op1);
6227 }
6228 break;
6229
6230 case IF_THEN_ELSE:
6231 return simplify_if_then_else (x);
6232
6233 case ZERO_EXTRACT:
6234 case SIGN_EXTRACT:
6235 case ZERO_EXTEND:
6236 case SIGN_EXTEND:
6237 /* If we are processing SET_DEST, we are done. */
6238 if (in_dest)
6239 return x;
6240
6241 return expand_compound_operation (x);
6242
6243 case SET:
6244 return simplify_set (x);
6245
6246 case AND:
6247 case IOR:
6248 return simplify_logical (x);
6249
6250 case ASHIFT:
6251 case LSHIFTRT:
6252 case ASHIFTRT:
6253 case ROTATE:
6254 case ROTATERT:
6255 /* If this is a shift by a constant amount, simplify it. */
6256 if (CONST_INT_P (XEXP (x, 1)))
6257 return simplify_shift_const (x, code, mode, XEXP (x, 0),
6258 INTVAL (XEXP (x, 1)));
6259
6260 else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
6261 SUBST (XEXP (x, 1),
6262 force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
6263 (HOST_WIDE_INT_1U
6264 << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
6265 - 1,
6266 0));
6267 break;
6268
6269 default:
6270 break;
6271 }
6272
6273 return x;
6274 }
6275 \f
6276 /* Simplify X, an IF_THEN_ELSE expression. Return the new expression. */
6277
6278 static rtx
6279 simplify_if_then_else (rtx x)
6280 {
6281 machine_mode mode = GET_MODE (x);
6282 rtx cond = XEXP (x, 0);
6283 rtx true_rtx = XEXP (x, 1);
6284 rtx false_rtx = XEXP (x, 2);
6285 enum rtx_code true_code = GET_CODE (cond);
6286 int comparison_p = COMPARISON_P (cond);
6287 rtx temp;
6288 int i;
6289 enum rtx_code false_code;
6290 rtx reversed;
6291 scalar_int_mode int_mode;
6292
6293 /* Simplify storing of the truth value. */
6294 if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
6295 return simplify_gen_relational (true_code, mode, VOIDmode,
6296 XEXP (cond, 0), XEXP (cond, 1));
6297
6298 /* Also when the truth value has to be reversed. */
6299 if (comparison_p
6300 && true_rtx == const0_rtx && false_rtx == const_true_rtx
6301 && (reversed = reversed_comparison (cond, mode)))
6302 return reversed;
6303
6304 /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
6305 in it is being compared against certain values. Get the true and false
6306 comparisons and see if that says anything about the value of each arm. */
6307
6308 if (comparison_p
6309 && ((false_code = reversed_comparison_code (cond, NULL))
6310 != UNKNOWN)
6311 && REG_P (XEXP (cond, 0)))
6312 {
6313 HOST_WIDE_INT nzb;
6314 rtx from = XEXP (cond, 0);
6315 rtx true_val = XEXP (cond, 1);
6316 rtx false_val = true_val;
6317 int swapped = 0;
6318
6319 /* If FALSE_CODE is EQ, swap the codes and arms. */
6320
6321 if (false_code == EQ)
6322 {
6323 swapped = 1, true_code = EQ, false_code = NE;
6324 std::swap (true_rtx, false_rtx);
6325 }
6326
6327 scalar_int_mode from_mode;
6328 if (is_a <scalar_int_mode> (GET_MODE (from), &from_mode))
6329 {
6330 /* If we are comparing against zero and the expression being
6331 tested has only a single bit that might be nonzero, that is
6332 its value when it is not equal to zero. Similarly if it is
6333 known to be -1 or 0. */
6334 if (true_code == EQ
6335 && true_val == const0_rtx
6336 && pow2p_hwi (nzb = nonzero_bits (from, from_mode)))
6337 {
6338 false_code = EQ;
6339 false_val = gen_int_mode (nzb, from_mode);
6340 }
6341 else if (true_code == EQ
6342 && true_val == const0_rtx
6343 && (num_sign_bit_copies (from, from_mode)
6344 == GET_MODE_PRECISION (from_mode)))
6345 {
6346 false_code = EQ;
6347 false_val = constm1_rtx;
6348 }
6349 }
6350
6351 /* Now simplify an arm if we know the value of the register in the
6352 branch and it is used in the arm. Be careful due to the potential
6353 of locally-shared RTL. */
6354
6355 if (reg_mentioned_p (from, true_rtx))
6356 true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
6357 from, true_val),
6358 pc_rtx, pc_rtx, 0, 0, 0);
6359 if (reg_mentioned_p (from, false_rtx))
6360 false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
6361 from, false_val),
6362 pc_rtx, pc_rtx, 0, 0, 0);
6363
6364 SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
6365 SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
6366
6367 true_rtx = XEXP (x, 1);
6368 false_rtx = XEXP (x, 2);
6369 true_code = GET_CODE (cond);
6370 }
6371
6372 /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
6373 reversed, do so to avoid needing two sets of patterns for
6374 subtract-and-branch insns. Similarly if we have a constant in the true
6375 arm, the false arm is the same as the first operand of the comparison, or
6376 the false arm is more complicated than the true arm. */
6377
6378 if (comparison_p
6379 && reversed_comparison_code (cond, NULL) != UNKNOWN
6380 && (true_rtx == pc_rtx
6381 || (CONSTANT_P (true_rtx)
6382 && !CONST_INT_P (false_rtx) && false_rtx != pc_rtx)
6383 || true_rtx == const0_rtx
6384 || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
6385 || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
6386 && !OBJECT_P (false_rtx))
6387 || reg_mentioned_p (true_rtx, false_rtx)
6388 || rtx_equal_p (false_rtx, XEXP (cond, 0))))
6389 {
6390 true_code = reversed_comparison_code (cond, NULL);
6391 SUBST (XEXP (x, 0), reversed_comparison (cond, GET_MODE (cond)));
6392 SUBST (XEXP (x, 1), false_rtx);
6393 SUBST (XEXP (x, 2), true_rtx);
6394
6395 std::swap (true_rtx, false_rtx);
6396 cond = XEXP (x, 0);
6397
6398 /* It is possible that the conditional has been simplified out. */
6399 true_code = GET_CODE (cond);
6400 comparison_p = COMPARISON_P (cond);
6401 }
6402
6403 /* If the two arms are identical, we don't need the comparison. */
6404
6405 if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
6406 return true_rtx;
6407
6408 /* Convert a == b ? b : a to "a". */
6409 if (true_code == EQ && ! side_effects_p (cond)
6410 && !HONOR_NANS (mode)
6411 && rtx_equal_p (XEXP (cond, 0), false_rtx)
6412 && rtx_equal_p (XEXP (cond, 1), true_rtx))
6413 return false_rtx;
6414 else if (true_code == NE && ! side_effects_p (cond)
6415 && !HONOR_NANS (mode)
6416 && rtx_equal_p (XEXP (cond, 0), true_rtx)
6417 && rtx_equal_p (XEXP (cond, 1), false_rtx))
6418 return true_rtx;
6419
6420 /* Look for cases where we have (abs x) or (neg (abs X)). */
6421
6422 if (GET_MODE_CLASS (mode) == MODE_INT
6423 && comparison_p
6424 && XEXP (cond, 1) == const0_rtx
6425 && GET_CODE (false_rtx) == NEG
6426 && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
6427 && rtx_equal_p (true_rtx, XEXP (cond, 0))
6428 && ! side_effects_p (true_rtx))
6429 switch (true_code)
6430 {
6431 case GT:
6432 case GE:
6433 return simplify_gen_unary (ABS, mode, true_rtx, mode);
6434 case LT:
6435 case LE:
6436 return
6437 simplify_gen_unary (NEG, mode,
6438 simplify_gen_unary (ABS, mode, true_rtx, mode),
6439 mode);
6440 default:
6441 break;
6442 }
6443
6444 /* Look for MIN or MAX. */
6445
6446 if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
6447 && comparison_p
6448 && rtx_equal_p (XEXP (cond, 0), true_rtx)
6449 && rtx_equal_p (XEXP (cond, 1), false_rtx)
6450 && ! side_effects_p (cond))
6451 switch (true_code)
6452 {
6453 case GE:
6454 case GT:
6455 return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
6456 case LE:
6457 case LT:
6458 return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
6459 case GEU:
6460 case GTU:
6461 return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
6462 case LEU:
6463 case LTU:
6464 return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
6465 default:
6466 break;
6467 }
6468
6469 /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
6470 second operand is zero, this can be done as (OP Z (mult COND C2)) where
6471 C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
6472 SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
6473 We can do this kind of thing in some cases when STORE_FLAG_VALUE is
6474 neither 1 or -1, but it isn't worth checking for. */
6475
6476 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
6477 && comparison_p
6478 && is_int_mode (mode, &int_mode)
6479 && ! side_effects_p (x))
6480 {
6481 rtx t = make_compound_operation (true_rtx, SET);
6482 rtx f = make_compound_operation (false_rtx, SET);
6483 rtx cond_op0 = XEXP (cond, 0);
6484 rtx cond_op1 = XEXP (cond, 1);
6485 enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
6486 machine_mode m = int_mode;
6487 rtx z = 0, c1 = NULL_RTX;
6488
6489 if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
6490 || GET_CODE (t) == IOR || GET_CODE (t) == XOR
6491 || GET_CODE (t) == ASHIFT
6492 || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
6493 && rtx_equal_p (XEXP (t, 0), f))
6494 c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
6495
6496 /* If an identity-zero op is commutative, check whether there
6497 would be a match if we swapped the operands. */
6498 else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
6499 || GET_CODE (t) == XOR)
6500 && rtx_equal_p (XEXP (t, 1), f))
6501 c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
6502 else if (GET_CODE (t) == SIGN_EXTEND
6503 && (GET_CODE (XEXP (t, 0)) == PLUS
6504 || GET_CODE (XEXP (t, 0)) == MINUS
6505 || GET_CODE (XEXP (t, 0)) == IOR
6506 || GET_CODE (XEXP (t, 0)) == XOR
6507 || GET_CODE (XEXP (t, 0)) == ASHIFT
6508 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
6509 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
6510 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
6511 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
6512 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
6513 && (num_sign_bit_copies (f, GET_MODE (f))
6514 > (unsigned int)
6515 (GET_MODE_PRECISION (int_mode)
6516 - GET_MODE_PRECISION (GET_MODE (XEXP (XEXP (t, 0), 0))))))
6517 {
6518 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
6519 extend_op = SIGN_EXTEND;
6520 m = GET_MODE (XEXP (t, 0));
6521 }
6522 else if (GET_CODE (t) == SIGN_EXTEND
6523 && (GET_CODE (XEXP (t, 0)) == PLUS
6524 || GET_CODE (XEXP (t, 0)) == IOR
6525 || GET_CODE (XEXP (t, 0)) == XOR)
6526 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
6527 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
6528 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
6529 && (num_sign_bit_copies (f, GET_MODE (f))
6530 > (unsigned int)
6531 (GET_MODE_PRECISION (int_mode)
6532 - GET_MODE_PRECISION (GET_MODE (XEXP (XEXP (t, 0), 1))))))
6533 {
6534 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
6535 extend_op = SIGN_EXTEND;
6536 m = GET_MODE (XEXP (t, 0));
6537 }
6538 else if (GET_CODE (t) == ZERO_EXTEND
6539 && (GET_CODE (XEXP (t, 0)) == PLUS
6540 || GET_CODE (XEXP (t, 0)) == MINUS
6541 || GET_CODE (XEXP (t, 0)) == IOR
6542 || GET_CODE (XEXP (t, 0)) == XOR
6543 || GET_CODE (XEXP (t, 0)) == ASHIFT
6544 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
6545 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
6546 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
6547 && HWI_COMPUTABLE_MODE_P (int_mode)
6548 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
6549 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
6550 && ((nonzero_bits (f, GET_MODE (f))
6551 & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
6552 == 0))
6553 {
6554 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
6555 extend_op = ZERO_EXTEND;
6556 m = GET_MODE (XEXP (t, 0));
6557 }
6558 else if (GET_CODE (t) == ZERO_EXTEND
6559 && (GET_CODE (XEXP (t, 0)) == PLUS
6560 || GET_CODE (XEXP (t, 0)) == IOR
6561 || GET_CODE (XEXP (t, 0)) == XOR)
6562 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
6563 && HWI_COMPUTABLE_MODE_P (int_mode)
6564 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
6565 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
6566 && ((nonzero_bits (f, GET_MODE (f))
6567 & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
6568 == 0))
6569 {
6570 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
6571 extend_op = ZERO_EXTEND;
6572 m = GET_MODE (XEXP (t, 0));
6573 }
6574
6575 if (z)
6576 {
6577 temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
6578 cond_op0, cond_op1),
6579 pc_rtx, pc_rtx, 0, 0, 0);
6580 temp = simplify_gen_binary (MULT, m, temp,
6581 simplify_gen_binary (MULT, m, c1,
6582 const_true_rtx));
6583 temp = subst (temp, pc_rtx, pc_rtx, 0, 0, 0);
6584 temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
6585
6586 if (extend_op != UNKNOWN)
6587 temp = simplify_gen_unary (extend_op, int_mode, temp, m);
6588
6589 return temp;
6590 }
6591 }
6592
6593 /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
6594 1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
6595 negation of a single bit, we can convert this operation to a shift. We
6596 can actually do this more generally, but it doesn't seem worth it. */
6597
6598 if (true_code == NE
6599 && is_a <scalar_int_mode> (mode, &int_mode)
6600 && XEXP (cond, 1) == const0_rtx
6601 && false_rtx == const0_rtx
6602 && CONST_INT_P (true_rtx)
6603 && ((1 == nonzero_bits (XEXP (cond, 0), int_mode)
6604 && (i = exact_log2 (UINTVAL (true_rtx))) >= 0)
6605 || ((num_sign_bit_copies (XEXP (cond, 0), int_mode)
6606 == GET_MODE_PRECISION (int_mode))
6607 && (i = exact_log2 (-UINTVAL (true_rtx))) >= 0)))
6608 return
6609 simplify_shift_const (NULL_RTX, ASHIFT, int_mode,
6610 gen_lowpart (int_mode, XEXP (cond, 0)), i);
6611
6612 /* (IF_THEN_ELSE (NE A 0) C1 0) is A or a zero-extend of A if the only
6613 non-zero bit in A is C1. */
6614 if (true_code == NE && XEXP (cond, 1) == const0_rtx
6615 && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
6616 && INTEGRAL_MODE_P (GET_MODE (XEXP (cond, 0)))
6617 && (UINTVAL (true_rtx) & GET_MODE_MASK (mode))
6618 == nonzero_bits (XEXP (cond, 0), GET_MODE (XEXP (cond, 0)))
6619 && (i = exact_log2 (UINTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
6620 {
6621 rtx val = XEXP (cond, 0);
6622 machine_mode val_mode = GET_MODE (val);
6623 if (val_mode == mode)
6624 return val;
6625 else if (GET_MODE_PRECISION (val_mode) < GET_MODE_PRECISION (mode))
6626 return simplify_gen_unary (ZERO_EXTEND, mode, val, val_mode);
6627 }
6628
6629 return x;
6630 }
6631 \f
6632 /* Simplify X, a SET expression. Return the new expression. */
6633
6634 static rtx
6635 simplify_set (rtx x)
6636 {
6637 rtx src = SET_SRC (x);
6638 rtx dest = SET_DEST (x);
6639 machine_mode mode
6640 = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
6641 rtx_insn *other_insn;
6642 rtx *cc_use;
6643 scalar_int_mode int_mode;
6644
6645 /* (set (pc) (return)) gets written as (return). */
6646 if (GET_CODE (dest) == PC && ANY_RETURN_P (src))
6647 return src;
6648
6649 /* Now that we know for sure which bits of SRC we are using, see if we can
6650 simplify the expression for the object knowing that we only need the
6651 low-order bits. */
6652
6653 if (GET_MODE_CLASS (mode) == MODE_INT && HWI_COMPUTABLE_MODE_P (mode))
6654 {
6655 src = force_to_mode (src, mode, HOST_WIDE_INT_M1U, 0);
6656 SUBST (SET_SRC (x), src);
6657 }
6658
6659 /* If we are setting CC0 or if the source is a COMPARE, look for the use of
6660 the comparison result and try to simplify it unless we already have used
6661 undobuf.other_insn. */
6662 if ((GET_MODE_CLASS (mode) == MODE_CC
6663 || GET_CODE (src) == COMPARE
6664 || CC0_P (dest))
6665 && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
6666 && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
6667 && COMPARISON_P (*cc_use)
6668 && rtx_equal_p (XEXP (*cc_use, 0), dest))
6669 {
6670 enum rtx_code old_code = GET_CODE (*cc_use);
6671 enum rtx_code new_code;
6672 rtx op0, op1, tmp;
6673 int other_changed = 0;
6674 rtx inner_compare = NULL_RTX;
6675 machine_mode compare_mode = GET_MODE (dest);
6676
6677 if (GET_CODE (src) == COMPARE)
6678 {
6679 op0 = XEXP (src, 0), op1 = XEXP (src, 1);
6680 if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
6681 {
6682 inner_compare = op0;
6683 op0 = XEXP (inner_compare, 0), op1 = XEXP (inner_compare, 1);
6684 }
6685 }
6686 else
6687 op0 = src, op1 = CONST0_RTX (GET_MODE (src));
6688
6689 tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
6690 op0, op1);
6691 if (!tmp)
6692 new_code = old_code;
6693 else if (!CONSTANT_P (tmp))
6694 {
6695 new_code = GET_CODE (tmp);
6696 op0 = XEXP (tmp, 0);
6697 op1 = XEXP (tmp, 1);
6698 }
6699 else
6700 {
6701 rtx pat = PATTERN (other_insn);
6702 undobuf.other_insn = other_insn;
6703 SUBST (*cc_use, tmp);
6704
6705 /* Attempt to simplify CC user. */
6706 if (GET_CODE (pat) == SET)
6707 {
6708 rtx new_rtx = simplify_rtx (SET_SRC (pat));
6709 if (new_rtx != NULL_RTX)
6710 SUBST (SET_SRC (pat), new_rtx);
6711 }
6712
6713 /* Convert X into a no-op move. */
6714 SUBST (SET_DEST (x), pc_rtx);
6715 SUBST (SET_SRC (x), pc_rtx);
6716 return x;
6717 }
6718
6719 /* Simplify our comparison, if possible. */
6720 new_code = simplify_comparison (new_code, &op0, &op1);
6721
6722 #ifdef SELECT_CC_MODE
6723 /* If this machine has CC modes other than CCmode, check to see if we
6724 need to use a different CC mode here. */
6725 if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
6726 compare_mode = GET_MODE (op0);
6727 else if (inner_compare
6728 && GET_MODE_CLASS (GET_MODE (inner_compare)) == MODE_CC
6729 && new_code == old_code
6730 && op0 == XEXP (inner_compare, 0)
6731 && op1 == XEXP (inner_compare, 1))
6732 compare_mode = GET_MODE (inner_compare);
6733 else
6734 compare_mode = SELECT_CC_MODE (new_code, op0, op1);
6735
6736 /* If the mode changed, we have to change SET_DEST, the mode in the
6737 compare, and the mode in the place SET_DEST is used. If SET_DEST is
6738 a hard register, just build new versions with the proper mode. If it
6739 is a pseudo, we lose unless it is only time we set the pseudo, in
6740 which case we can safely change its mode. */
6741 if (!HAVE_cc0 && compare_mode != GET_MODE (dest))
6742 {
6743 if (can_change_dest_mode (dest, 0, compare_mode))
6744 {
6745 unsigned int regno = REGNO (dest);
6746 rtx new_dest;
6747
6748 if (regno < FIRST_PSEUDO_REGISTER)
6749 new_dest = gen_rtx_REG (compare_mode, regno);
6750 else
6751 {
6752 SUBST_MODE (regno_reg_rtx[regno], compare_mode);
6753 new_dest = regno_reg_rtx[regno];
6754 }
6755
6756 SUBST (SET_DEST (x), new_dest);
6757 SUBST (XEXP (*cc_use, 0), new_dest);
6758 other_changed = 1;
6759
6760 dest = new_dest;
6761 }
6762 }
6763 #endif /* SELECT_CC_MODE */
6764
6765 /* If the code changed, we have to build a new comparison in
6766 undobuf.other_insn. */
6767 if (new_code != old_code)
6768 {
6769 int other_changed_previously = other_changed;
6770 unsigned HOST_WIDE_INT mask;
6771 rtx old_cc_use = *cc_use;
6772
6773 SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
6774 dest, const0_rtx));
6775 other_changed = 1;
6776
6777 /* If the only change we made was to change an EQ into an NE or
6778 vice versa, OP0 has only one bit that might be nonzero, and OP1
6779 is zero, check if changing the user of the condition code will
6780 produce a valid insn. If it won't, we can keep the original code
6781 in that insn by surrounding our operation with an XOR. */
6782
6783 if (((old_code == NE && new_code == EQ)
6784 || (old_code == EQ && new_code == NE))
6785 && ! other_changed_previously && op1 == const0_rtx
6786 && HWI_COMPUTABLE_MODE_P (GET_MODE (op0))
6787 && pow2p_hwi (mask = nonzero_bits (op0, GET_MODE (op0))))
6788 {
6789 rtx pat = PATTERN (other_insn), note = 0;
6790
6791 if ((recog_for_combine (&pat, other_insn, &note) < 0
6792 && ! check_asm_operands (pat)))
6793 {
6794 *cc_use = old_cc_use;
6795 other_changed = 0;
6796
6797 op0 = simplify_gen_binary (XOR, GET_MODE (op0), op0,
6798 gen_int_mode (mask,
6799 GET_MODE (op0)));
6800 }
6801 }
6802 }
6803
6804 if (other_changed)
6805 undobuf.other_insn = other_insn;
6806
6807 /* Don't generate a compare of a CC with 0, just use that CC. */
6808 if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
6809 {
6810 SUBST (SET_SRC (x), op0);
6811 src = SET_SRC (x);
6812 }
6813 /* Otherwise, if we didn't previously have the same COMPARE we
6814 want, create it from scratch. */
6815 else if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode
6816 || XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
6817 {
6818 SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
6819 src = SET_SRC (x);
6820 }
6821 }
6822 else
6823 {
6824 /* Get SET_SRC in a form where we have placed back any
6825 compound expressions. Then do the checks below. */
6826 src = make_compound_operation (src, SET);
6827 SUBST (SET_SRC (x), src);
6828 }
6829
6830 /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
6831 and X being a REG or (subreg (reg)), we may be able to convert this to
6832 (set (subreg:m2 x) (op)).
6833
6834 We can always do this if M1 is narrower than M2 because that means that
6835 we only care about the low bits of the result.
6836
6837 However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
6838 perform a narrower operation than requested since the high-order bits will
6839 be undefined. On machine where it is defined, this transformation is safe
6840 as long as M1 and M2 have the same number of words. */
6841
6842 if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6843 && !OBJECT_P (SUBREG_REG (src))
6844 && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
6845 / UNITS_PER_WORD)
6846 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
6847 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
6848 && (WORD_REGISTER_OPERATIONS || !paradoxical_subreg_p (src))
6849 #ifdef CANNOT_CHANGE_MODE_CLASS
6850 && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
6851 && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
6852 GET_MODE (SUBREG_REG (src)),
6853 GET_MODE (src)))
6854 #endif
6855 && (REG_P (dest)
6856 || (GET_CODE (dest) == SUBREG
6857 && REG_P (SUBREG_REG (dest)))))
6858 {
6859 SUBST (SET_DEST (x),
6860 gen_lowpart (GET_MODE (SUBREG_REG (src)),
6861 dest));
6862 SUBST (SET_SRC (x), SUBREG_REG (src));
6863
6864 src = SET_SRC (x), dest = SET_DEST (x);
6865 }
6866
6867 /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
6868 in SRC. */
6869 if (dest == cc0_rtx
6870 && GET_CODE (src) == SUBREG
6871 && subreg_lowpart_p (src)
6872 && (GET_MODE_PRECISION (GET_MODE (src))
6873 < GET_MODE_PRECISION (GET_MODE (SUBREG_REG (src)))))
6874 {
6875 rtx inner = SUBREG_REG (src);
6876 machine_mode inner_mode = GET_MODE (inner);
6877
6878 /* Here we make sure that we don't have a sign bit on. */
6879 if (val_signbit_known_clear_p (GET_MODE (src),
6880 nonzero_bits (inner, inner_mode)))
6881 {
6882 SUBST (SET_SRC (x), inner);
6883 src = SET_SRC (x);
6884 }
6885 }
6886
6887 /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
6888 would require a paradoxical subreg. Replace the subreg with a
6889 zero_extend to avoid the reload that would otherwise be required. */
6890
6891 enum rtx_code extend_op;
6892 if (paradoxical_subreg_p (src)
6893 && MEM_P (SUBREG_REG (src))
6894 && (extend_op = load_extend_op (GET_MODE (SUBREG_REG (src)))) != UNKNOWN)
6895 {
6896 SUBST (SET_SRC (x),
6897 gen_rtx_fmt_e (extend_op, GET_MODE (src), SUBREG_REG (src)));
6898
6899 src = SET_SRC (x);
6900 }
6901
6902 /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
6903 are comparing an item known to be 0 or -1 against 0, use a logical
6904 operation instead. Check for one of the arms being an IOR of the other
6905 arm with some value. We compute three terms to be IOR'ed together. In
6906 practice, at most two will be nonzero. Then we do the IOR's. */
6907
6908 if (GET_CODE (dest) != PC
6909 && GET_CODE (src) == IF_THEN_ELSE
6910 && is_int_mode (GET_MODE (src), &int_mode)
6911 && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
6912 && XEXP (XEXP (src, 0), 1) == const0_rtx
6913 && int_mode == GET_MODE (XEXP (XEXP (src, 0), 0))
6914 && (!HAVE_conditional_move
6915 || ! can_conditionally_move_p (int_mode))
6916 && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0), int_mode)
6917 == GET_MODE_PRECISION (int_mode))
6918 && ! side_effects_p (src))
6919 {
6920 rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
6921 ? XEXP (src, 1) : XEXP (src, 2));
6922 rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
6923 ? XEXP (src, 2) : XEXP (src, 1));
6924 rtx term1 = const0_rtx, term2, term3;
6925
6926 if (GET_CODE (true_rtx) == IOR
6927 && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
6928 term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
6929 else if (GET_CODE (true_rtx) == IOR
6930 && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
6931 term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
6932 else if (GET_CODE (false_rtx) == IOR
6933 && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
6934 term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
6935 else if (GET_CODE (false_rtx) == IOR
6936 && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
6937 term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
6938
6939 term2 = simplify_gen_binary (AND, int_mode,
6940 XEXP (XEXP (src, 0), 0), true_rtx);
6941 term3 = simplify_gen_binary (AND, int_mode,
6942 simplify_gen_unary (NOT, int_mode,
6943 XEXP (XEXP (src, 0), 0),
6944 int_mode),
6945 false_rtx);
6946
6947 SUBST (SET_SRC (x),
6948 simplify_gen_binary (IOR, int_mode,
6949 simplify_gen_binary (IOR, int_mode,
6950 term1, term2),
6951 term3));
6952
6953 src = SET_SRC (x);
6954 }
6955
6956 /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
6957 whole thing fail. */
6958 if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
6959 return src;
6960 else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
6961 return dest;
6962 else
6963 /* Convert this into a field assignment operation, if possible. */
6964 return make_field_assignment (x);
6965 }
6966 \f
6967 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
6968 result. */
6969
6970 static rtx
6971 simplify_logical (rtx x)
6972 {
6973 rtx op0 = XEXP (x, 0);
6974 rtx op1 = XEXP (x, 1);
6975 scalar_int_mode mode;
6976
6977 switch (GET_CODE (x))
6978 {
6979 case AND:
6980 /* We can call simplify_and_const_int only if we don't lose
6981 any (sign) bits when converting INTVAL (op1) to
6982 "unsigned HOST_WIDE_INT". */
6983 if (is_a <scalar_int_mode> (GET_MODE (x), &mode)
6984 && CONST_INT_P (op1)
6985 && (HWI_COMPUTABLE_MODE_P (mode)
6986 || INTVAL (op1) > 0))
6987 {
6988 x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
6989 if (GET_CODE (x) != AND)
6990 return x;
6991
6992 op0 = XEXP (x, 0);
6993 op1 = XEXP (x, 1);
6994 }
6995
6996 /* If we have any of (and (ior A B) C) or (and (xor A B) C),
6997 apply the distributive law and then the inverse distributive
6998 law to see if things simplify. */
6999 if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
7000 {
7001 rtx result = distribute_and_simplify_rtx (x, 0);
7002 if (result)
7003 return result;
7004 }
7005 if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
7006 {
7007 rtx result = distribute_and_simplify_rtx (x, 1);
7008 if (result)
7009 return result;
7010 }
7011 break;
7012
7013 case IOR:
7014 /* If we have (ior (and A B) C), apply the distributive law and then
7015 the inverse distributive law to see if things simplify. */
7016
7017 if (GET_CODE (op0) == AND)
7018 {
7019 rtx result = distribute_and_simplify_rtx (x, 0);
7020 if (result)
7021 return result;
7022 }
7023
7024 if (GET_CODE (op1) == AND)
7025 {
7026 rtx result = distribute_and_simplify_rtx (x, 1);
7027 if (result)
7028 return result;
7029 }
7030 break;
7031
7032 default:
7033 gcc_unreachable ();
7034 }
7035
7036 return x;
7037 }
7038 \f
7039 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
7040 operations" because they can be replaced with two more basic operations.
7041 ZERO_EXTEND is also considered "compound" because it can be replaced with
7042 an AND operation, which is simpler, though only one operation.
7043
7044 The function expand_compound_operation is called with an rtx expression
7045 and will convert it to the appropriate shifts and AND operations,
7046 simplifying at each stage.
7047
7048 The function make_compound_operation is called to convert an expression
7049 consisting of shifts and ANDs into the equivalent compound expression.
7050 It is the inverse of this function, loosely speaking. */
7051
7052 static rtx
7053 expand_compound_operation (rtx x)
7054 {
7055 unsigned HOST_WIDE_INT pos = 0, len;
7056 int unsignedp = 0;
7057 unsigned int modewidth;
7058 rtx tem;
7059 scalar_int_mode inner_mode;
7060
7061 switch (GET_CODE (x))
7062 {
7063 case ZERO_EXTEND:
7064 unsignedp = 1;
7065 /* FALLTHRU */
7066 case SIGN_EXTEND:
7067 /* We can't necessarily use a const_int for a multiword mode;
7068 it depends on implicitly extending the value.
7069 Since we don't know the right way to extend it,
7070 we can't tell whether the implicit way is right.
7071
7072 Even for a mode that is no wider than a const_int,
7073 we can't win, because we need to sign extend one of its bits through
7074 the rest of it, and we don't know which bit. */
7075 if (CONST_INT_P (XEXP (x, 0)))
7076 return x;
7077
7078 /* Reject modes that aren't scalar integers because turning vector
7079 or complex modes into shifts causes problems. */
7080 if (!is_a <scalar_int_mode> (GET_MODE (XEXP (x, 0)), &inner_mode))
7081 return x;
7082
7083 /* Return if (subreg:MODE FROM 0) is not a safe replacement for
7084 (zero_extend:MODE FROM) or (sign_extend:MODE FROM). It is for any MEM
7085 because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
7086 reloaded. If not for that, MEM's would very rarely be safe.
7087
7088 Reject modes bigger than a word, because we might not be able
7089 to reference a two-register group starting with an arbitrary register
7090 (and currently gen_lowpart might crash for a SUBREG). */
7091
7092 if (GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
7093 return x;
7094
7095 len = GET_MODE_PRECISION (inner_mode);
7096 /* If the inner object has VOIDmode (the only way this can happen
7097 is if it is an ASM_OPERANDS), we can't do anything since we don't
7098 know how much masking to do. */
7099 if (len == 0)
7100 return x;
7101
7102 break;
7103
7104 case ZERO_EXTRACT:
7105 unsignedp = 1;
7106
7107 /* fall through */
7108
7109 case SIGN_EXTRACT:
7110 /* If the operand is a CLOBBER, just return it. */
7111 if (GET_CODE (XEXP (x, 0)) == CLOBBER)
7112 return XEXP (x, 0);
7113
7114 if (!CONST_INT_P (XEXP (x, 1))
7115 || !CONST_INT_P (XEXP (x, 2)))
7116 return x;
7117
7118 /* Reject modes that aren't scalar integers because turning vector
7119 or complex modes into shifts causes problems. */
7120 if (!is_a <scalar_int_mode> (GET_MODE (XEXP (x, 0)), &inner_mode))
7121 return x;
7122
7123 len = INTVAL (XEXP (x, 1));
7124 pos = INTVAL (XEXP (x, 2));
7125
7126 /* This should stay within the object being extracted, fail otherwise. */
7127 if (len + pos > GET_MODE_PRECISION (inner_mode))
7128 return x;
7129
7130 if (BITS_BIG_ENDIAN)
7131 pos = GET_MODE_PRECISION (inner_mode) - len - pos;
7132
7133 break;
7134
7135 default:
7136 return x;
7137 }
7138 /* Convert sign extension to zero extension, if we know that the high
7139 bit is not set, as this is easier to optimize. It will be converted
7140 back to cheaper alternative in make_extraction. */
7141 if (GET_CODE (x) == SIGN_EXTEND
7142 && HWI_COMPUTABLE_MODE_P (GET_MODE (x))
7143 && ((nonzero_bits (XEXP (x, 0), inner_mode)
7144 & ~(((unsigned HOST_WIDE_INT) GET_MODE_MASK (inner_mode)) >> 1))
7145 == 0))
7146 {
7147 machine_mode mode = GET_MODE (x);
7148 rtx temp = gen_rtx_ZERO_EXTEND (mode, XEXP (x, 0));
7149 rtx temp2 = expand_compound_operation (temp);
7150
7151 /* Make sure this is a profitable operation. */
7152 if (set_src_cost (x, mode, optimize_this_for_speed_p)
7153 > set_src_cost (temp2, mode, optimize_this_for_speed_p))
7154 return temp2;
7155 else if (set_src_cost (x, mode, optimize_this_for_speed_p)
7156 > set_src_cost (temp, mode, optimize_this_for_speed_p))
7157 return temp;
7158 else
7159 return x;
7160 }
7161
7162 /* We can optimize some special cases of ZERO_EXTEND. */
7163 if (GET_CODE (x) == ZERO_EXTEND)
7164 {
7165 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
7166 know that the last value didn't have any inappropriate bits
7167 set. */
7168 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
7169 && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
7170 && HWI_COMPUTABLE_MODE_P (GET_MODE (x))
7171 && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
7172 & ~GET_MODE_MASK (inner_mode)) == 0)
7173 return XEXP (XEXP (x, 0), 0);
7174
7175 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
7176 if (GET_CODE (XEXP (x, 0)) == SUBREG
7177 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
7178 && subreg_lowpart_p (XEXP (x, 0))
7179 && HWI_COMPUTABLE_MODE_P (GET_MODE (x))
7180 && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
7181 & ~GET_MODE_MASK (inner_mode)) == 0)
7182 return SUBREG_REG (XEXP (x, 0));
7183
7184 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
7185 is a comparison and STORE_FLAG_VALUE permits. This is like
7186 the first case, but it works even when GET_MODE (x) is larger
7187 than HOST_WIDE_INT. */
7188 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
7189 && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
7190 && COMPARISON_P (XEXP (XEXP (x, 0), 0))
7191 && GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT
7192 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (inner_mode)) == 0)
7193 return XEXP (XEXP (x, 0), 0);
7194
7195 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
7196 if (GET_CODE (XEXP (x, 0)) == SUBREG
7197 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
7198 && subreg_lowpart_p (XEXP (x, 0))
7199 && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
7200 && GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT
7201 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (inner_mode)) == 0)
7202 return SUBREG_REG (XEXP (x, 0));
7203
7204 }
7205
7206 /* If we reach here, we want to return a pair of shifts. The inner
7207 shift is a left shift of BITSIZE - POS - LEN bits. The outer
7208 shift is a right shift of BITSIZE - LEN bits. It is arithmetic or
7209 logical depending on the value of UNSIGNEDP.
7210
7211 If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
7212 converted into an AND of a shift.
7213
7214 We must check for the case where the left shift would have a negative
7215 count. This can happen in a case like (x >> 31) & 255 on machines
7216 that can't shift by a constant. On those machines, we would first
7217 combine the shift with the AND to produce a variable-position
7218 extraction. Then the constant of 31 would be substituted in
7219 to produce such a position. */
7220
7221 modewidth = GET_MODE_PRECISION (GET_MODE (x));
7222 if (modewidth >= pos + len)
7223 {
7224 machine_mode mode = GET_MODE (x);
7225 tem = gen_lowpart (mode, XEXP (x, 0));
7226 if (!tem || GET_CODE (tem) == CLOBBER)
7227 return x;
7228 tem = simplify_shift_const (NULL_RTX, ASHIFT, mode,
7229 tem, modewidth - pos - len);
7230 tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
7231 mode, tem, modewidth - len);
7232 }
7233 else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
7234 tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
7235 simplify_shift_const (NULL_RTX, LSHIFTRT,
7236 GET_MODE (x),
7237 XEXP (x, 0), pos),
7238 (HOST_WIDE_INT_1U << len) - 1);
7239 else
7240 /* Any other cases we can't handle. */
7241 return x;
7242
7243 /* If we couldn't do this for some reason, return the original
7244 expression. */
7245 if (GET_CODE (tem) == CLOBBER)
7246 return x;
7247
7248 return tem;
7249 }
7250 \f
7251 /* X is a SET which contains an assignment of one object into
7252 a part of another (such as a bit-field assignment, STRICT_LOW_PART,
7253 or certain SUBREGS). If possible, convert it into a series of
7254 logical operations.
7255
7256 We half-heartedly support variable positions, but do not at all
7257 support variable lengths. */
7258
7259 static const_rtx
7260 expand_field_assignment (const_rtx x)
7261 {
7262 rtx inner;
7263 rtx pos; /* Always counts from low bit. */
7264 int len;
7265 rtx mask, cleared, masked;
7266 scalar_int_mode compute_mode;
7267
7268 /* Loop until we find something we can't simplify. */
7269 while (1)
7270 {
7271 if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
7272 && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
7273 {
7274 inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
7275 len = GET_MODE_PRECISION (GET_MODE (XEXP (SET_DEST (x), 0)));
7276 pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
7277 }
7278 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
7279 && CONST_INT_P (XEXP (SET_DEST (x), 1)))
7280 {
7281 inner = XEXP (SET_DEST (x), 0);
7282 len = INTVAL (XEXP (SET_DEST (x), 1));
7283 pos = XEXP (SET_DEST (x), 2);
7284
7285 /* A constant position should stay within the width of INNER. */
7286 if (CONST_INT_P (pos)
7287 && INTVAL (pos) + len > GET_MODE_PRECISION (GET_MODE (inner)))
7288 break;
7289
7290 if (BITS_BIG_ENDIAN)
7291 {
7292 if (CONST_INT_P (pos))
7293 pos = GEN_INT (GET_MODE_PRECISION (GET_MODE (inner)) - len
7294 - INTVAL (pos));
7295 else if (GET_CODE (pos) == MINUS
7296 && CONST_INT_P (XEXP (pos, 1))
7297 && (INTVAL (XEXP (pos, 1))
7298 == GET_MODE_PRECISION (GET_MODE (inner)) - len))
7299 /* If position is ADJUST - X, new position is X. */
7300 pos = XEXP (pos, 0);
7301 else
7302 {
7303 HOST_WIDE_INT prec = GET_MODE_PRECISION (GET_MODE (inner));
7304 pos = simplify_gen_binary (MINUS, GET_MODE (pos),
7305 gen_int_mode (prec - len,
7306 GET_MODE (pos)),
7307 pos);
7308 }
7309 }
7310 }
7311
7312 /* A SUBREG between two modes that occupy the same numbers of words
7313 can be done by moving the SUBREG to the source. */
7314 else if (GET_CODE (SET_DEST (x)) == SUBREG
7315 /* We need SUBREGs to compute nonzero_bits properly. */
7316 && nonzero_sign_valid
7317 && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
7318 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
7319 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
7320 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
7321 {
7322 x = gen_rtx_SET (SUBREG_REG (SET_DEST (x)),
7323 gen_lowpart
7324 (GET_MODE (SUBREG_REG (SET_DEST (x))),
7325 SET_SRC (x)));
7326 continue;
7327 }
7328 else
7329 break;
7330
7331 while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
7332 inner = SUBREG_REG (inner);
7333
7334 /* Don't attempt bitwise arithmetic on non scalar integer modes. */
7335 if (!is_a <scalar_int_mode> (GET_MODE (inner), &compute_mode))
7336 {
7337 /* Don't do anything for vector or complex integral types. */
7338 if (! FLOAT_MODE_P (GET_MODE (inner)))
7339 break;
7340
7341 /* Try to find an integral mode to pun with. */
7342 if (!int_mode_for_size (GET_MODE_BITSIZE (GET_MODE (inner)), 0)
7343 .exists (&compute_mode))
7344 break;
7345
7346 inner = gen_lowpart (compute_mode, inner);
7347 }
7348
7349 /* Compute a mask of LEN bits, if we can do this on the host machine. */
7350 if (len >= HOST_BITS_PER_WIDE_INT)
7351 break;
7352
7353 /* Don't try to compute in too wide unsupported modes. */
7354 if (!targetm.scalar_mode_supported_p (compute_mode))
7355 break;
7356
7357 /* Now compute the equivalent expression. Make a copy of INNER
7358 for the SET_DEST in case it is a MEM into which we will substitute;
7359 we don't want shared RTL in that case. */
7360 mask = gen_int_mode ((HOST_WIDE_INT_1U << len) - 1,
7361 compute_mode);
7362 cleared = simplify_gen_binary (AND, compute_mode,
7363 simplify_gen_unary (NOT, compute_mode,
7364 simplify_gen_binary (ASHIFT,
7365 compute_mode,
7366 mask, pos),
7367 compute_mode),
7368 inner);
7369 masked = simplify_gen_binary (ASHIFT, compute_mode,
7370 simplify_gen_binary (
7371 AND, compute_mode,
7372 gen_lowpart (compute_mode, SET_SRC (x)),
7373 mask),
7374 pos);
7375
7376 x = gen_rtx_SET (copy_rtx (inner),
7377 simplify_gen_binary (IOR, compute_mode,
7378 cleared, masked));
7379 }
7380
7381 return x;
7382 }
7383 \f
7384 /* Return an RTX for a reference to LEN bits of INNER. If POS_RTX is nonzero,
7385 it is an RTX that represents the (variable) starting position; otherwise,
7386 POS is the (constant) starting bit position. Both are counted from the LSB.
7387
7388 UNSIGNEDP is nonzero for an unsigned reference and zero for a signed one.
7389
7390 IN_DEST is nonzero if this is a reference in the destination of a SET.
7391 This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If nonzero,
7392 a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
7393 be used.
7394
7395 IN_COMPARE is nonzero if we are in a COMPARE. This means that a
7396 ZERO_EXTRACT should be built even for bits starting at bit 0.
7397
7398 MODE is the desired mode of the result (if IN_DEST == 0).
7399
7400 The result is an RTX for the extraction or NULL_RTX if the target
7401 can't handle it. */
7402
7403 static rtx
7404 make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos,
7405 rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
7406 int in_dest, int in_compare)
7407 {
7408 /* This mode describes the size of the storage area
7409 to fetch the overall value from. Within that, we
7410 ignore the POS lowest bits, etc. */
7411 machine_mode is_mode = GET_MODE (inner);
7412 machine_mode inner_mode;
7413 machine_mode wanted_inner_mode;
7414 machine_mode wanted_inner_reg_mode = word_mode;
7415 machine_mode pos_mode = word_mode;
7416 machine_mode extraction_mode = word_mode;
7417 rtx new_rtx = 0;
7418 rtx orig_pos_rtx = pos_rtx;
7419 HOST_WIDE_INT orig_pos;
7420
7421 if (pos_rtx && CONST_INT_P (pos_rtx))
7422 pos = INTVAL (pos_rtx), pos_rtx = 0;
7423
7424 if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
7425 {
7426 /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
7427 consider just the QI as the memory to extract from.
7428 The subreg adds or removes high bits; its mode is
7429 irrelevant to the meaning of this extraction,
7430 since POS and LEN count from the lsb. */
7431 if (MEM_P (SUBREG_REG (inner)))
7432 is_mode = GET_MODE (SUBREG_REG (inner));
7433 inner = SUBREG_REG (inner);
7434 }
7435 else if (GET_CODE (inner) == ASHIFT
7436 && CONST_INT_P (XEXP (inner, 1))
7437 && pos_rtx == 0 && pos == 0
7438 && len > UINTVAL (XEXP (inner, 1)))
7439 {
7440 /* We're extracting the least significant bits of an rtx
7441 (ashift X (const_int C)), where LEN > C. Extract the
7442 least significant (LEN - C) bits of X, giving an rtx
7443 whose mode is MODE, then shift it left C times. */
7444 new_rtx = make_extraction (mode, XEXP (inner, 0),
7445 0, 0, len - INTVAL (XEXP (inner, 1)),
7446 unsignedp, in_dest, in_compare);
7447 if (new_rtx != 0)
7448 return gen_rtx_ASHIFT (mode, new_rtx, XEXP (inner, 1));
7449 }
7450 else if (GET_CODE (inner) == TRUNCATE)
7451 inner = XEXP (inner, 0);
7452
7453 inner_mode = GET_MODE (inner);
7454
7455 /* See if this can be done without an extraction. We never can if the
7456 width of the field is not the same as that of some integer mode. For
7457 registers, we can only avoid the extraction if the position is at the
7458 low-order bit and this is either not in the destination or we have the
7459 appropriate STRICT_LOW_PART operation available.
7460
7461 For MEM, we can avoid an extract if the field starts on an appropriate
7462 boundary and we can change the mode of the memory reference. */
7463
7464 scalar_int_mode tmode;
7465 if (int_mode_for_size (len, 1).exists (&tmode)
7466 && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
7467 && !MEM_P (inner)
7468 && (pos == 0 || REG_P (inner))
7469 && (inner_mode == tmode
7470 || !REG_P (inner)
7471 || TRULY_NOOP_TRUNCATION_MODES_P (tmode, inner_mode)
7472 || reg_truncated_to_mode (tmode, inner))
7473 && (! in_dest
7474 || (REG_P (inner)
7475 && have_insn_for (STRICT_LOW_PART, tmode))))
7476 || (MEM_P (inner) && pos_rtx == 0
7477 && (pos
7478 % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
7479 : BITS_PER_UNIT)) == 0
7480 /* We can't do this if we are widening INNER_MODE (it
7481 may not be aligned, for one thing). */
7482 && !paradoxical_subreg_p (tmode, inner_mode)
7483 && (inner_mode == tmode
7484 || (! mode_dependent_address_p (XEXP (inner, 0),
7485 MEM_ADDR_SPACE (inner))
7486 && ! MEM_VOLATILE_P (inner))))))
7487 {
7488 /* If INNER is a MEM, make a new MEM that encompasses just the desired
7489 field. If the original and current mode are the same, we need not
7490 adjust the offset. Otherwise, we do if bytes big endian.
7491
7492 If INNER is not a MEM, get a piece consisting of just the field
7493 of interest (in this case POS % BITS_PER_WORD must be 0). */
7494
7495 if (MEM_P (inner))
7496 {
7497 HOST_WIDE_INT offset;
7498
7499 /* POS counts from lsb, but make OFFSET count in memory order. */
7500 if (BYTES_BIG_ENDIAN)
7501 offset = (GET_MODE_PRECISION (is_mode) - len - pos) / BITS_PER_UNIT;
7502 else
7503 offset = pos / BITS_PER_UNIT;
7504
7505 new_rtx = adjust_address_nv (inner, tmode, offset);
7506 }
7507 else if (REG_P (inner))
7508 {
7509 if (tmode != inner_mode)
7510 {
7511 /* We can't call gen_lowpart in a DEST since we
7512 always want a SUBREG (see below) and it would sometimes
7513 return a new hard register. */
7514 if (pos || in_dest)
7515 {
7516 unsigned int offset
7517 = subreg_offset_from_lsb (tmode, inner_mode, pos);
7518
7519 /* Avoid creating invalid subregs, for example when
7520 simplifying (x>>32)&255. */
7521 if (!validate_subreg (tmode, inner_mode, inner, offset))
7522 return NULL_RTX;
7523
7524 new_rtx = gen_rtx_SUBREG (tmode, inner, offset);
7525 }
7526 else
7527 new_rtx = gen_lowpart (tmode, inner);
7528 }
7529 else
7530 new_rtx = inner;
7531 }
7532 else
7533 new_rtx = force_to_mode (inner, tmode,
7534 len >= HOST_BITS_PER_WIDE_INT
7535 ? HOST_WIDE_INT_M1U
7536 : (HOST_WIDE_INT_1U << len) - 1, 0);
7537
7538 /* If this extraction is going into the destination of a SET,
7539 make a STRICT_LOW_PART unless we made a MEM. */
7540
7541 if (in_dest)
7542 return (MEM_P (new_rtx) ? new_rtx
7543 : (GET_CODE (new_rtx) != SUBREG
7544 ? gen_rtx_CLOBBER (tmode, const0_rtx)
7545 : gen_rtx_STRICT_LOW_PART (VOIDmode, new_rtx)));
7546
7547 if (mode == tmode)
7548 return new_rtx;
7549
7550 if (CONST_SCALAR_INT_P (new_rtx))
7551 return simplify_unary_operation (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
7552 mode, new_rtx, tmode);
7553
7554 /* If we know that no extraneous bits are set, and that the high
7555 bit is not set, convert the extraction to the cheaper of
7556 sign and zero extension, that are equivalent in these cases. */
7557 if (flag_expensive_optimizations
7558 && (HWI_COMPUTABLE_MODE_P (tmode)
7559 && ((nonzero_bits (new_rtx, tmode)
7560 & ~(((unsigned HOST_WIDE_INT)GET_MODE_MASK (tmode)) >> 1))
7561 == 0)))
7562 {
7563 rtx temp = gen_rtx_ZERO_EXTEND (mode, new_rtx);
7564 rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new_rtx);
7565
7566 /* Prefer ZERO_EXTENSION, since it gives more information to
7567 backends. */
7568 if (set_src_cost (temp, mode, optimize_this_for_speed_p)
7569 <= set_src_cost (temp1, mode, optimize_this_for_speed_p))
7570 return temp;
7571 return temp1;
7572 }
7573
7574 /* Otherwise, sign- or zero-extend unless we already are in the
7575 proper mode. */
7576
7577 return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
7578 mode, new_rtx));
7579 }
7580
7581 /* Unless this is a COMPARE or we have a funny memory reference,
7582 don't do anything with zero-extending field extracts starting at
7583 the low-order bit since they are simple AND operations. */
7584 if (pos_rtx == 0 && pos == 0 && ! in_dest
7585 && ! in_compare && unsignedp)
7586 return 0;
7587
7588 /* Unless INNER is not MEM, reject this if we would be spanning bytes or
7589 if the position is not a constant and the length is not 1. In all
7590 other cases, we would only be going outside our object in cases when
7591 an original shift would have been undefined. */
7592 if (MEM_P (inner)
7593 && ((pos_rtx == 0 && pos + len > GET_MODE_PRECISION (is_mode))
7594 || (pos_rtx != 0 && len != 1)))
7595 return 0;
7596
7597 enum extraction_pattern pattern = (in_dest ? EP_insv
7598 : unsignedp ? EP_extzv : EP_extv);
7599
7600 /* If INNER is not from memory, we want it to have the mode of a register
7601 extraction pattern's structure operand, or word_mode if there is no
7602 such pattern. The same applies to extraction_mode and pos_mode
7603 and their respective operands.
7604
7605 For memory, assume that the desired extraction_mode and pos_mode
7606 are the same as for a register operation, since at present we don't
7607 have named patterns for aligned memory structures. */
7608 struct extraction_insn insn;
7609 if (get_best_reg_extraction_insn (&insn, pattern,
7610 GET_MODE_BITSIZE (inner_mode), mode))
7611 {
7612 wanted_inner_reg_mode = insn.struct_mode;
7613 pos_mode = insn.pos_mode;
7614 extraction_mode = insn.field_mode;
7615 }
7616
7617 /* Never narrow an object, since that might not be safe. */
7618
7619 if (mode != VOIDmode
7620 && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
7621 extraction_mode = mode;
7622
7623 if (!MEM_P (inner))
7624 wanted_inner_mode = wanted_inner_reg_mode;
7625 else
7626 {
7627 /* Be careful not to go beyond the extracted object and maintain the
7628 natural alignment of the memory. */
7629 wanted_inner_mode = smallest_int_mode_for_size (len);
7630 while (pos % GET_MODE_BITSIZE (wanted_inner_mode) + len
7631 > GET_MODE_BITSIZE (wanted_inner_mode))
7632 wanted_inner_mode = GET_MODE_WIDER_MODE (wanted_inner_mode).require ();
7633 }
7634
7635 orig_pos = pos;
7636
7637 if (BITS_BIG_ENDIAN)
7638 {
7639 /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
7640 BITS_BIG_ENDIAN style. If position is constant, compute new
7641 position. Otherwise, build subtraction.
7642 Note that POS is relative to the mode of the original argument.
7643 If it's a MEM we need to recompute POS relative to that.
7644 However, if we're extracting from (or inserting into) a register,
7645 we want to recompute POS relative to wanted_inner_mode. */
7646 int width = (MEM_P (inner)
7647 ? GET_MODE_BITSIZE (is_mode)
7648 : GET_MODE_BITSIZE (wanted_inner_mode));
7649
7650 if (pos_rtx == 0)
7651 pos = width - len - pos;
7652 else
7653 pos_rtx
7654 = gen_rtx_MINUS (GET_MODE (pos_rtx),
7655 gen_int_mode (width - len, GET_MODE (pos_rtx)),
7656 pos_rtx);
7657 /* POS may be less than 0 now, but we check for that below.
7658 Note that it can only be less than 0 if !MEM_P (inner). */
7659 }
7660
7661 /* If INNER has a wider mode, and this is a constant extraction, try to
7662 make it smaller and adjust the byte to point to the byte containing
7663 the value. */
7664 if (wanted_inner_mode != VOIDmode
7665 && inner_mode != wanted_inner_mode
7666 && ! pos_rtx
7667 && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
7668 && MEM_P (inner)
7669 && ! mode_dependent_address_p (XEXP (inner, 0), MEM_ADDR_SPACE (inner))
7670 && ! MEM_VOLATILE_P (inner))
7671 {
7672 int offset = 0;
7673
7674 /* The computations below will be correct if the machine is big
7675 endian in both bits and bytes or little endian in bits and bytes.
7676 If it is mixed, we must adjust. */
7677
7678 /* If bytes are big endian and we had a paradoxical SUBREG, we must
7679 adjust OFFSET to compensate. */
7680 if (BYTES_BIG_ENDIAN
7681 && paradoxical_subreg_p (is_mode, inner_mode))
7682 offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
7683
7684 /* We can now move to the desired byte. */
7685 offset += (pos / GET_MODE_BITSIZE (wanted_inner_mode))
7686 * GET_MODE_SIZE (wanted_inner_mode);
7687 pos %= GET_MODE_BITSIZE (wanted_inner_mode);
7688
7689 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
7690 && is_mode != wanted_inner_mode)
7691 offset = (GET_MODE_SIZE (is_mode)
7692 - GET_MODE_SIZE (wanted_inner_mode) - offset);
7693
7694 inner = adjust_address_nv (inner, wanted_inner_mode, offset);
7695 }
7696
7697 /* If INNER is not memory, get it into the proper mode. If we are changing
7698 its mode, POS must be a constant and smaller than the size of the new
7699 mode. */
7700 else if (!MEM_P (inner))
7701 {
7702 /* On the LHS, don't create paradoxical subregs implicitely truncating
7703 the register unless TRULY_NOOP_TRUNCATION. */
7704 if (in_dest
7705 && !TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (inner),
7706 wanted_inner_mode))
7707 return NULL_RTX;
7708
7709 if (GET_MODE (inner) != wanted_inner_mode
7710 && (pos_rtx != 0
7711 || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
7712 return NULL_RTX;
7713
7714 if (orig_pos < 0)
7715 return NULL_RTX;
7716
7717 inner = force_to_mode (inner, wanted_inner_mode,
7718 pos_rtx
7719 || len + orig_pos >= HOST_BITS_PER_WIDE_INT
7720 ? HOST_WIDE_INT_M1U
7721 : (((HOST_WIDE_INT_1U << len) - 1)
7722 << orig_pos),
7723 0);
7724 }
7725
7726 /* Adjust mode of POS_RTX, if needed. If we want a wider mode, we
7727 have to zero extend. Otherwise, we can just use a SUBREG. */
7728 if (pos_rtx != 0
7729 && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
7730 {
7731 rtx temp = simplify_gen_unary (ZERO_EXTEND, pos_mode, pos_rtx,
7732 GET_MODE (pos_rtx));
7733
7734 /* If we know that no extraneous bits are set, and that the high
7735 bit is not set, convert extraction to cheaper one - either
7736 SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
7737 cases. */
7738 if (flag_expensive_optimizations
7739 && (HWI_COMPUTABLE_MODE_P (GET_MODE (pos_rtx))
7740 && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
7741 & ~(((unsigned HOST_WIDE_INT)
7742 GET_MODE_MASK (GET_MODE (pos_rtx)))
7743 >> 1))
7744 == 0)))
7745 {
7746 rtx temp1 = simplify_gen_unary (SIGN_EXTEND, pos_mode, pos_rtx,
7747 GET_MODE (pos_rtx));
7748
7749 /* Prefer ZERO_EXTENSION, since it gives more information to
7750 backends. */
7751 if (set_src_cost (temp1, pos_mode, optimize_this_for_speed_p)
7752 < set_src_cost (temp, pos_mode, optimize_this_for_speed_p))
7753 temp = temp1;
7754 }
7755 pos_rtx = temp;
7756 }
7757
7758 /* Make POS_RTX unless we already have it and it is correct. If we don't
7759 have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
7760 be a CONST_INT. */
7761 if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
7762 pos_rtx = orig_pos_rtx;
7763
7764 else if (pos_rtx == 0)
7765 pos_rtx = GEN_INT (pos);
7766
7767 /* Make the required operation. See if we can use existing rtx. */
7768 new_rtx = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
7769 extraction_mode, inner, GEN_INT (len), pos_rtx);
7770 if (! in_dest)
7771 new_rtx = gen_lowpart (mode, new_rtx);
7772
7773 return new_rtx;
7774 }
7775 \f
7776 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
7777 with any other operations in X. Return X without that shift if so. */
7778
7779 static rtx
7780 extract_left_shift (rtx x, int count)
7781 {
7782 enum rtx_code code = GET_CODE (x);
7783 machine_mode mode = GET_MODE (x);
7784 rtx tem;
7785
7786 switch (code)
7787 {
7788 case ASHIFT:
7789 /* This is the shift itself. If it is wide enough, we will return
7790 either the value being shifted if the shift count is equal to
7791 COUNT or a shift for the difference. */
7792 if (CONST_INT_P (XEXP (x, 1))
7793 && INTVAL (XEXP (x, 1)) >= count)
7794 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
7795 INTVAL (XEXP (x, 1)) - count);
7796 break;
7797
7798 case NEG: case NOT:
7799 if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7800 return simplify_gen_unary (code, mode, tem, mode);
7801
7802 break;
7803
7804 case PLUS: case IOR: case XOR: case AND:
7805 /* If we can safely shift this constant and we find the inner shift,
7806 make a new operation. */
7807 if (CONST_INT_P (XEXP (x, 1))
7808 && (UINTVAL (XEXP (x, 1))
7809 & (((HOST_WIDE_INT_1U << count)) - 1)) == 0
7810 && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7811 {
7812 HOST_WIDE_INT val = INTVAL (XEXP (x, 1)) >> count;
7813 return simplify_gen_binary (code, mode, tem,
7814 gen_int_mode (val, mode));
7815 }
7816 break;
7817
7818 default:
7819 break;
7820 }
7821
7822 return 0;
7823 }
7824 \f
7825 /* Subroutine of make_compound_operation. *X_PTR is the rtx at the current
7826 level of the expression and MODE is its mode. IN_CODE is as for
7827 make_compound_operation. *NEXT_CODE_PTR is the value of IN_CODE
7828 that should be used when recursing on operands of *X_PTR.
7829
7830 There are two possible actions:
7831
7832 - Return null. This tells the caller to recurse on *X_PTR with IN_CODE
7833 equal to *NEXT_CODE_PTR, after which *X_PTR holds the final value.
7834
7835 - Return a new rtx, which the caller returns directly. */
7836
7837 static rtx
7838 make_compound_operation_int (machine_mode mode, rtx *x_ptr,
7839 enum rtx_code in_code,
7840 enum rtx_code *next_code_ptr)
7841 {
7842 rtx x = *x_ptr;
7843 enum rtx_code next_code = *next_code_ptr;
7844 enum rtx_code code = GET_CODE (x);
7845 int mode_width = GET_MODE_PRECISION (mode);
7846 rtx rhs, lhs;
7847 rtx new_rtx = 0;
7848 int i;
7849 rtx tem;
7850 scalar_int_mode inner_mode;
7851 bool equality_comparison = false;
7852
7853 if (in_code == EQ)
7854 {
7855 equality_comparison = true;
7856 in_code = COMPARE;
7857 }
7858
7859 /* Process depending on the code of this operation. If NEW is set
7860 nonzero, it will be returned. */
7861
7862 switch (code)
7863 {
7864 case ASHIFT:
7865 /* Convert shifts by constants into multiplications if inside
7866 an address. */
7867 if (in_code == MEM && CONST_INT_P (XEXP (x, 1))
7868 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7869 && INTVAL (XEXP (x, 1)) >= 0)
7870 {
7871 HOST_WIDE_INT count = INTVAL (XEXP (x, 1));
7872 HOST_WIDE_INT multval = HOST_WIDE_INT_1 << count;
7873
7874 new_rtx = make_compound_operation (XEXP (x, 0), next_code);
7875 if (GET_CODE (new_rtx) == NEG)
7876 {
7877 new_rtx = XEXP (new_rtx, 0);
7878 multval = -multval;
7879 }
7880 multval = trunc_int_for_mode (multval, mode);
7881 new_rtx = gen_rtx_MULT (mode, new_rtx, gen_int_mode (multval, mode));
7882 }
7883 break;
7884
7885 case PLUS:
7886 lhs = XEXP (x, 0);
7887 rhs = XEXP (x, 1);
7888 lhs = make_compound_operation (lhs, next_code);
7889 rhs = make_compound_operation (rhs, next_code);
7890 if (GET_CODE (lhs) == MULT && GET_CODE (XEXP (lhs, 0)) == NEG)
7891 {
7892 tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (lhs, 0), 0),
7893 XEXP (lhs, 1));
7894 new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
7895 }
7896 else if (GET_CODE (lhs) == MULT
7897 && (CONST_INT_P (XEXP (lhs, 1)) && INTVAL (XEXP (lhs, 1)) < 0))
7898 {
7899 tem = simplify_gen_binary (MULT, mode, XEXP (lhs, 0),
7900 simplify_gen_unary (NEG, mode,
7901 XEXP (lhs, 1),
7902 mode));
7903 new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
7904 }
7905 else
7906 {
7907 SUBST (XEXP (x, 0), lhs);
7908 SUBST (XEXP (x, 1), rhs);
7909 }
7910 maybe_swap_commutative_operands (x);
7911 return x;
7912
7913 case MINUS:
7914 lhs = XEXP (x, 0);
7915 rhs = XEXP (x, 1);
7916 lhs = make_compound_operation (lhs, next_code);
7917 rhs = make_compound_operation (rhs, next_code);
7918 if (GET_CODE (rhs) == MULT && GET_CODE (XEXP (rhs, 0)) == NEG)
7919 {
7920 tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (rhs, 0), 0),
7921 XEXP (rhs, 1));
7922 return simplify_gen_binary (PLUS, mode, tem, lhs);
7923 }
7924 else if (GET_CODE (rhs) == MULT
7925 && (CONST_INT_P (XEXP (rhs, 1)) && INTVAL (XEXP (rhs, 1)) < 0))
7926 {
7927 tem = simplify_gen_binary (MULT, mode, XEXP (rhs, 0),
7928 simplify_gen_unary (NEG, mode,
7929 XEXP (rhs, 1),
7930 mode));
7931 return simplify_gen_binary (PLUS, mode, tem, lhs);
7932 }
7933 else
7934 {
7935 SUBST (XEXP (x, 0), lhs);
7936 SUBST (XEXP (x, 1), rhs);
7937 return x;
7938 }
7939
7940 case AND:
7941 /* If the second operand is not a constant, we can't do anything
7942 with it. */
7943 if (!CONST_INT_P (XEXP (x, 1)))
7944 break;
7945
7946 /* If the constant is a power of two minus one and the first operand
7947 is a logical right shift, make an extraction. */
7948 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7949 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7950 {
7951 new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7952 new_rtx = make_extraction (mode, new_rtx, 0, XEXP (XEXP (x, 0), 1), i, 1,
7953 0, in_code == COMPARE);
7954 }
7955
7956 /* Same as previous, but for (subreg (lshiftrt ...)) in first op. */
7957 else if (GET_CODE (XEXP (x, 0)) == SUBREG
7958 && subreg_lowpart_p (XEXP (x, 0))
7959 && is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (XEXP (x, 0))),
7960 &inner_mode)
7961 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
7962 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7963 {
7964 rtx inner_x0 = SUBREG_REG (XEXP (x, 0));
7965 new_rtx = make_compound_operation (XEXP (inner_x0, 0), next_code);
7966 new_rtx = make_extraction (inner_mode, new_rtx, 0,
7967 XEXP (inner_x0, 1),
7968 i, 1, 0, in_code == COMPARE);
7969
7970 /* If we narrowed the mode when dropping the subreg, then we lose. */
7971 if (GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (mode))
7972 new_rtx = NULL;
7973
7974 /* If that didn't give anything, see if the AND simplifies on
7975 its own. */
7976 if (!new_rtx && i >= 0)
7977 {
7978 new_rtx = make_compound_operation (XEXP (x, 0), next_code);
7979 new_rtx = make_extraction (mode, new_rtx, 0, NULL_RTX, i, 1,
7980 0, in_code == COMPARE);
7981 }
7982 }
7983 /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)). */
7984 else if ((GET_CODE (XEXP (x, 0)) == XOR
7985 || GET_CODE (XEXP (x, 0)) == IOR)
7986 && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
7987 && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
7988 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7989 {
7990 /* Apply the distributive law, and then try to make extractions. */
7991 new_rtx = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
7992 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
7993 XEXP (x, 1)),
7994 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
7995 XEXP (x, 1)));
7996 new_rtx = make_compound_operation (new_rtx, in_code);
7997 }
7998
7999 /* If we are have (and (rotate X C) M) and C is larger than the number
8000 of bits in M, this is an extraction. */
8001
8002 else if (GET_CODE (XEXP (x, 0)) == ROTATE
8003 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8004 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0
8005 && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
8006 {
8007 new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
8008 new_rtx = make_extraction (mode, new_rtx,
8009 (GET_MODE_PRECISION (mode)
8010 - INTVAL (XEXP (XEXP (x, 0), 1))),
8011 NULL_RTX, i, 1, 0, in_code == COMPARE);
8012 }
8013
8014 /* On machines without logical shifts, if the operand of the AND is
8015 a logical shift and our mask turns off all the propagated sign
8016 bits, we can replace the logical shift with an arithmetic shift. */
8017 else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8018 && !have_insn_for (LSHIFTRT, mode)
8019 && have_insn_for (ASHIFTRT, mode)
8020 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8021 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8022 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
8023 && mode_width <= HOST_BITS_PER_WIDE_INT)
8024 {
8025 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
8026
8027 mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
8028 if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
8029 SUBST (XEXP (x, 0),
8030 gen_rtx_ASHIFTRT (mode,
8031 make_compound_operation
8032 (XEXP (XEXP (x, 0), 0), next_code),
8033 XEXP (XEXP (x, 0), 1)));
8034 }
8035
8036 /* If the constant is one less than a power of two, this might be
8037 representable by an extraction even if no shift is present.
8038 If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
8039 we are in a COMPARE. */
8040 else if ((i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
8041 new_rtx = make_extraction (mode,
8042 make_compound_operation (XEXP (x, 0),
8043 next_code),
8044 0, NULL_RTX, i, 1, 0, in_code == COMPARE);
8045
8046 /* If we are in a comparison and this is an AND with a power of two,
8047 convert this into the appropriate bit extract. */
8048 else if (in_code == COMPARE
8049 && (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0
8050 && (equality_comparison || i < GET_MODE_PRECISION (mode) - 1))
8051 new_rtx = make_extraction (mode,
8052 make_compound_operation (XEXP (x, 0),
8053 next_code),
8054 i, NULL_RTX, 1, 1, 0, 1);
8055
8056 /* If the one operand is a paradoxical subreg of a register or memory and
8057 the constant (limited to the smaller mode) has only zero bits where
8058 the sub expression has known zero bits, this can be expressed as
8059 a zero_extend. */
8060 else if (GET_CODE (XEXP (x, 0)) == SUBREG)
8061 {
8062 rtx sub;
8063
8064 sub = XEXP (XEXP (x, 0), 0);
8065 machine_mode sub_mode = GET_MODE (sub);
8066 if ((REG_P (sub) || MEM_P (sub))
8067 && GET_MODE_PRECISION (sub_mode) < mode_width)
8068 {
8069 unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (sub_mode);
8070 unsigned HOST_WIDE_INT mask;
8071
8072 /* original AND constant with all the known zero bits set */
8073 mask = UINTVAL (XEXP (x, 1)) | (~nonzero_bits (sub, sub_mode));
8074 if ((mask & mode_mask) == mode_mask)
8075 {
8076 new_rtx = make_compound_operation (sub, next_code);
8077 new_rtx = make_extraction (mode, new_rtx, 0, 0,
8078 GET_MODE_PRECISION (sub_mode),
8079 1, 0, in_code == COMPARE);
8080 }
8081 }
8082 }
8083
8084 break;
8085
8086 case LSHIFTRT:
8087 /* If the sign bit is known to be zero, replace this with an
8088 arithmetic shift. */
8089 if (have_insn_for (ASHIFTRT, mode)
8090 && ! have_insn_for (LSHIFTRT, mode)
8091 && mode_width <= HOST_BITS_PER_WIDE_INT
8092 && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
8093 {
8094 new_rtx = gen_rtx_ASHIFTRT (mode,
8095 make_compound_operation (XEXP (x, 0),
8096 next_code),
8097 XEXP (x, 1));
8098 break;
8099 }
8100
8101 /* fall through */
8102
8103 case ASHIFTRT:
8104 lhs = XEXP (x, 0);
8105 rhs = XEXP (x, 1);
8106
8107 /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
8108 this is a SIGN_EXTRACT. */
8109 if (CONST_INT_P (rhs)
8110 && GET_CODE (lhs) == ASHIFT
8111 && CONST_INT_P (XEXP (lhs, 1))
8112 && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))
8113 && INTVAL (XEXP (lhs, 1)) >= 0
8114 && INTVAL (rhs) < mode_width)
8115 {
8116 new_rtx = make_compound_operation (XEXP (lhs, 0), next_code);
8117 new_rtx = make_extraction (mode, new_rtx,
8118 INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
8119 NULL_RTX, mode_width - INTVAL (rhs),
8120 code == LSHIFTRT, 0, in_code == COMPARE);
8121 break;
8122 }
8123
8124 /* See if we have operations between an ASHIFTRT and an ASHIFT.
8125 If so, try to merge the shifts into a SIGN_EXTEND. We could
8126 also do this for some cases of SIGN_EXTRACT, but it doesn't
8127 seem worth the effort; the case checked for occurs on Alpha. */
8128
8129 if (!OBJECT_P (lhs)
8130 && ! (GET_CODE (lhs) == SUBREG
8131 && (OBJECT_P (SUBREG_REG (lhs))))
8132 && CONST_INT_P (rhs)
8133 && INTVAL (rhs) >= 0
8134 && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
8135 && INTVAL (rhs) < mode_width
8136 && (new_rtx = extract_left_shift (lhs, INTVAL (rhs))) != 0)
8137 new_rtx = make_extraction (mode, make_compound_operation (new_rtx, next_code),
8138 0, NULL_RTX, mode_width - INTVAL (rhs),
8139 code == LSHIFTRT, 0, in_code == COMPARE);
8140
8141 break;
8142
8143 case SUBREG:
8144 /* Call ourselves recursively on the inner expression. If we are
8145 narrowing the object and it has a different RTL code from
8146 what it originally did, do this SUBREG as a force_to_mode. */
8147 {
8148 rtx inner = SUBREG_REG (x), simplified;
8149 enum rtx_code subreg_code = in_code;
8150
8151 /* If the SUBREG is masking of a logical right shift,
8152 make an extraction. */
8153 if (GET_CODE (inner) == LSHIFTRT
8154 && is_a <scalar_int_mode> (GET_MODE (inner), &inner_mode)
8155 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (inner_mode)
8156 && CONST_INT_P (XEXP (inner, 1))
8157 && UINTVAL (XEXP (inner, 1)) < GET_MODE_PRECISION (inner_mode)
8158 && subreg_lowpart_p (x))
8159 {
8160 new_rtx = make_compound_operation (XEXP (inner, 0), next_code);
8161 int width = GET_MODE_PRECISION (inner_mode)
8162 - INTVAL (XEXP (inner, 1));
8163 if (width > mode_width)
8164 width = mode_width;
8165 new_rtx = make_extraction (mode, new_rtx, 0, XEXP (inner, 1),
8166 width, 1, 0, in_code == COMPARE);
8167 break;
8168 }
8169
8170 /* If in_code is COMPARE, it isn't always safe to pass it through
8171 to the recursive make_compound_operation call. */
8172 if (subreg_code == COMPARE
8173 && (!subreg_lowpart_p (x)
8174 || GET_CODE (inner) == SUBREG
8175 /* (subreg:SI (and:DI (reg:DI) (const_int 0x800000000)) 0)
8176 is (const_int 0), rather than
8177 (subreg:SI (lshiftrt:DI (reg:DI) (const_int 35)) 0).
8178 Similarly (subreg:QI (and:SI (reg:SI) (const_int 0x80)) 0)
8179 for non-equality comparisons against 0 is not equivalent
8180 to (subreg:QI (lshiftrt:SI (reg:SI) (const_int 7)) 0). */
8181 || (GET_CODE (inner) == AND
8182 && CONST_INT_P (XEXP (inner, 1))
8183 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner))
8184 && exact_log2 (UINTVAL (XEXP (inner, 1)))
8185 >= GET_MODE_BITSIZE (mode) - 1)))
8186 subreg_code = SET;
8187
8188 tem = make_compound_operation (inner, subreg_code);
8189
8190 simplified
8191 = simplify_subreg (mode, tem, GET_MODE (inner), SUBREG_BYTE (x));
8192 if (simplified)
8193 tem = simplified;
8194
8195 if (GET_CODE (tem) != GET_CODE (inner)
8196 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner))
8197 && subreg_lowpart_p (x))
8198 {
8199 rtx newer
8200 = force_to_mode (tem, mode, HOST_WIDE_INT_M1U, 0);
8201
8202 /* If we have something other than a SUBREG, we might have
8203 done an expansion, so rerun ourselves. */
8204 if (GET_CODE (newer) != SUBREG)
8205 newer = make_compound_operation (newer, in_code);
8206
8207 /* force_to_mode can expand compounds. If it just re-expanded the
8208 compound, use gen_lowpart to convert to the desired mode. */
8209 if (rtx_equal_p (newer, x)
8210 /* Likewise if it re-expanded the compound only partially.
8211 This happens for SUBREG of ZERO_EXTRACT if they extract
8212 the same number of bits. */
8213 || (GET_CODE (newer) == SUBREG
8214 && (GET_CODE (SUBREG_REG (newer)) == LSHIFTRT
8215 || GET_CODE (SUBREG_REG (newer)) == ASHIFTRT)
8216 && GET_CODE (inner) == AND
8217 && rtx_equal_p (SUBREG_REG (newer), XEXP (inner, 0))))
8218 return gen_lowpart (GET_MODE (x), tem);
8219
8220 return newer;
8221 }
8222
8223 if (simplified)
8224 return tem;
8225 }
8226 break;
8227
8228 default:
8229 break;
8230 }
8231
8232 if (new_rtx)
8233 *x_ptr = gen_lowpart (mode, new_rtx);
8234 *next_code_ptr = next_code;
8235 return NULL_RTX;
8236 }
8237
8238 /* Look at the expression rooted at X. Look for expressions
8239 equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
8240 Form these expressions.
8241
8242 Return the new rtx, usually just X.
8243
8244 Also, for machines like the VAX that don't have logical shift insns,
8245 try to convert logical to arithmetic shift operations in cases where
8246 they are equivalent. This undoes the canonicalizations to logical
8247 shifts done elsewhere.
8248
8249 We try, as much as possible, to re-use rtl expressions to save memory.
8250
8251 IN_CODE says what kind of expression we are processing. Normally, it is
8252 SET. In a memory address it is MEM. When processing the arguments of
8253 a comparison or a COMPARE against zero, it is COMPARE, or EQ if more
8254 precisely it is an equality comparison against zero. */
8255
8256 rtx
8257 make_compound_operation (rtx x, enum rtx_code in_code)
8258 {
8259 enum rtx_code code = GET_CODE (x);
8260 const char *fmt;
8261 int i, j;
8262 enum rtx_code next_code;
8263 rtx new_rtx, tem;
8264
8265 /* Select the code to be used in recursive calls. Once we are inside an
8266 address, we stay there. If we have a comparison, set to COMPARE,
8267 but once inside, go back to our default of SET. */
8268
8269 next_code = (code == MEM ? MEM
8270 : ((code == COMPARE || COMPARISON_P (x))
8271 && XEXP (x, 1) == const0_rtx) ? COMPARE
8272 : in_code == COMPARE || in_code == EQ ? SET : in_code);
8273
8274 scalar_int_mode mode;
8275 if (is_a <scalar_int_mode> (GET_MODE (x), &mode))
8276 {
8277 rtx new_rtx = make_compound_operation_int (mode, &x, in_code,
8278 &next_code);
8279 if (new_rtx)
8280 return new_rtx;
8281 code = GET_CODE (x);
8282 }
8283
8284 /* Now recursively process each operand of this operation. We need to
8285 handle ZERO_EXTEND specially so that we don't lose track of the
8286 inner mode. */
8287 if (code == ZERO_EXTEND)
8288 {
8289 new_rtx = make_compound_operation (XEXP (x, 0), next_code);
8290 tem = simplify_const_unary_operation (ZERO_EXTEND, GET_MODE (x),
8291 new_rtx, GET_MODE (XEXP (x, 0)));
8292 if (tem)
8293 return tem;
8294 SUBST (XEXP (x, 0), new_rtx);
8295 return x;
8296 }
8297
8298 fmt = GET_RTX_FORMAT (code);
8299 for (i = 0; i < GET_RTX_LENGTH (code); i++)
8300 if (fmt[i] == 'e')
8301 {
8302 new_rtx = make_compound_operation (XEXP (x, i), next_code);
8303 SUBST (XEXP (x, i), new_rtx);
8304 }
8305 else if (fmt[i] == 'E')
8306 for (j = 0; j < XVECLEN (x, i); j++)
8307 {
8308 new_rtx = make_compound_operation (XVECEXP (x, i, j), next_code);
8309 SUBST (XVECEXP (x, i, j), new_rtx);
8310 }
8311
8312 maybe_swap_commutative_operands (x);
8313 return x;
8314 }
8315 \f
8316 /* Given M see if it is a value that would select a field of bits
8317 within an item, but not the entire word. Return -1 if not.
8318 Otherwise, return the starting position of the field, where 0 is the
8319 low-order bit.
8320
8321 *PLEN is set to the length of the field. */
8322
8323 static int
8324 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
8325 {
8326 /* Get the bit number of the first 1 bit from the right, -1 if none. */
8327 int pos = m ? ctz_hwi (m) : -1;
8328 int len = 0;
8329
8330 if (pos >= 0)
8331 /* Now shift off the low-order zero bits and see if we have a
8332 power of two minus 1. */
8333 len = exact_log2 ((m >> pos) + 1);
8334
8335 if (len <= 0)
8336 pos = -1;
8337
8338 *plen = len;
8339 return pos;
8340 }
8341 \f
8342 /* If X refers to a register that equals REG in value, replace these
8343 references with REG. */
8344 static rtx
8345 canon_reg_for_combine (rtx x, rtx reg)
8346 {
8347 rtx op0, op1, op2;
8348 const char *fmt;
8349 int i;
8350 bool copied;
8351
8352 enum rtx_code code = GET_CODE (x);
8353 switch (GET_RTX_CLASS (code))
8354 {
8355 case RTX_UNARY:
8356 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
8357 if (op0 != XEXP (x, 0))
8358 return simplify_gen_unary (GET_CODE (x), GET_MODE (x), op0,
8359 GET_MODE (reg));
8360 break;
8361
8362 case RTX_BIN_ARITH:
8363 case RTX_COMM_ARITH:
8364 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
8365 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
8366 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
8367 return simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
8368 break;
8369
8370 case RTX_COMPARE:
8371 case RTX_COMM_COMPARE:
8372 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
8373 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
8374 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
8375 return simplify_gen_relational (GET_CODE (x), GET_MODE (x),
8376 GET_MODE (op0), op0, op1);
8377 break;
8378
8379 case RTX_TERNARY:
8380 case RTX_BITFIELD_OPS:
8381 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
8382 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
8383 op2 = canon_reg_for_combine (XEXP (x, 2), reg);
8384 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1) || op2 != XEXP (x, 2))
8385 return simplify_gen_ternary (GET_CODE (x), GET_MODE (x),
8386 GET_MODE (op0), op0, op1, op2);
8387 /* FALLTHRU */
8388
8389 case RTX_OBJ:
8390 if (REG_P (x))
8391 {
8392 if (rtx_equal_p (get_last_value (reg), x)
8393 || rtx_equal_p (reg, get_last_value (x)))
8394 return reg;
8395 else
8396 break;
8397 }
8398
8399 /* fall through */
8400
8401 default:
8402 fmt = GET_RTX_FORMAT (code);
8403 copied = false;
8404 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8405 if (fmt[i] == 'e')
8406 {
8407 rtx op = canon_reg_for_combine (XEXP (x, i), reg);
8408 if (op != XEXP (x, i))
8409 {
8410 if (!copied)
8411 {
8412 copied = true;
8413 x = copy_rtx (x);
8414 }
8415 XEXP (x, i) = op;
8416 }
8417 }
8418 else if (fmt[i] == 'E')
8419 {
8420 int j;
8421 for (j = 0; j < XVECLEN (x, i); j++)
8422 {
8423 rtx op = canon_reg_for_combine (XVECEXP (x, i, j), reg);
8424 if (op != XVECEXP (x, i, j))
8425 {
8426 if (!copied)
8427 {
8428 copied = true;
8429 x = copy_rtx (x);
8430 }
8431 XVECEXP (x, i, j) = op;
8432 }
8433 }
8434 }
8435
8436 break;
8437 }
8438
8439 return x;
8440 }
8441
8442 /* Return X converted to MODE. If the value is already truncated to
8443 MODE we can just return a subreg even though in the general case we
8444 would need an explicit truncation. */
8445
8446 static rtx
8447 gen_lowpart_or_truncate (machine_mode mode, rtx x)
8448 {
8449 if (!CONST_INT_P (x)
8450 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x))
8451 && !TRULY_NOOP_TRUNCATION_MODES_P (mode, GET_MODE (x))
8452 && !(REG_P (x) && reg_truncated_to_mode (mode, x)))
8453 {
8454 /* Bit-cast X into an integer mode. */
8455 if (!SCALAR_INT_MODE_P (GET_MODE (x)))
8456 x = gen_lowpart (int_mode_for_mode (GET_MODE (x)).require (), x);
8457 x = simplify_gen_unary (TRUNCATE, int_mode_for_mode (mode).require (),
8458 x, GET_MODE (x));
8459 }
8460
8461 return gen_lowpart (mode, x);
8462 }
8463
8464 /* See if X can be simplified knowing that we will only refer to it in
8465 MODE and will only refer to those bits that are nonzero in MASK.
8466 If other bits are being computed or if masking operations are done
8467 that select a superset of the bits in MASK, they can sometimes be
8468 ignored.
8469
8470 Return a possibly simplified expression, but always convert X to
8471 MODE. If X is a CONST_INT, AND the CONST_INT with MASK.
8472
8473 If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
8474 are all off in X. This is used when X will be complemented, by either
8475 NOT, NEG, or XOR. */
8476
8477 static rtx
8478 force_to_mode (rtx x, machine_mode mode, unsigned HOST_WIDE_INT mask,
8479 int just_select)
8480 {
8481 enum rtx_code code = GET_CODE (x);
8482 int next_select = just_select || code == XOR || code == NOT || code == NEG;
8483 machine_mode op_mode;
8484 unsigned HOST_WIDE_INT fuller_mask, nonzero;
8485 rtx op0, op1, temp;
8486
8487 /* If this is a CALL or ASM_OPERANDS, don't do anything. Some of the
8488 code below will do the wrong thing since the mode of such an
8489 expression is VOIDmode.
8490
8491 Also do nothing if X is a CLOBBER; this can happen if X was
8492 the return value from a call to gen_lowpart. */
8493 if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
8494 return x;
8495
8496 /* We want to perform the operation in its present mode unless we know
8497 that the operation is valid in MODE, in which case we do the operation
8498 in MODE. */
8499 op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
8500 && have_insn_for (code, mode))
8501 ? mode : GET_MODE (x));
8502
8503 /* It is not valid to do a right-shift in a narrower mode
8504 than the one it came in with. */
8505 if ((code == LSHIFTRT || code == ASHIFTRT)
8506 && GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (GET_MODE (x)))
8507 op_mode = GET_MODE (x);
8508
8509 /* Truncate MASK to fit OP_MODE. */
8510 if (op_mode)
8511 mask &= GET_MODE_MASK (op_mode);
8512
8513 /* When we have an arithmetic operation, or a shift whose count we
8514 do not know, we need to assume that all bits up to the highest-order
8515 bit in MASK will be needed. This is how we form such a mask. */
8516 if (mask & (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1)))
8517 fuller_mask = HOST_WIDE_INT_M1U;
8518 else
8519 fuller_mask = ((HOST_WIDE_INT_1U << (floor_log2 (mask) + 1))
8520 - 1);
8521
8522 /* Determine what bits of X are guaranteed to be (non)zero. */
8523 nonzero = nonzero_bits (x, mode);
8524
8525 /* If none of the bits in X are needed, return a zero. */
8526 if (!just_select && (nonzero & mask) == 0 && !side_effects_p (x))
8527 x = const0_rtx;
8528
8529 /* If X is a CONST_INT, return a new one. Do this here since the
8530 test below will fail. */
8531 if (CONST_INT_P (x))
8532 {
8533 if (SCALAR_INT_MODE_P (mode))
8534 return gen_int_mode (INTVAL (x) & mask, mode);
8535 else
8536 {
8537 x = GEN_INT (INTVAL (x) & mask);
8538 return gen_lowpart_common (mode, x);
8539 }
8540 }
8541
8542 /* If X is narrower than MODE and we want all the bits in X's mode, just
8543 get X in the proper mode. */
8544 if (paradoxical_subreg_p (mode, GET_MODE (x))
8545 && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
8546 return gen_lowpart (mode, x);
8547
8548 /* We can ignore the effect of a SUBREG if it narrows the mode or
8549 if the constant masks to zero all the bits the mode doesn't have. */
8550 if (GET_CODE (x) == SUBREG
8551 && subreg_lowpart_p (x)
8552 && ((GET_MODE_SIZE (GET_MODE (x))
8553 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8554 || (0 == (mask
8555 & GET_MODE_MASK (GET_MODE (x))
8556 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
8557 return force_to_mode (SUBREG_REG (x), mode, mask, next_select);
8558
8559 /* The arithmetic simplifications here only work for scalar integer modes. */
8560 if (!SCALAR_INT_MODE_P (mode) || !SCALAR_INT_MODE_P (GET_MODE (x)))
8561 return gen_lowpart_or_truncate (mode, x);
8562
8563 switch (code)
8564 {
8565 case CLOBBER:
8566 /* If X is a (clobber (const_int)), return it since we know we are
8567 generating something that won't match. */
8568 return x;
8569
8570 case SIGN_EXTEND:
8571 case ZERO_EXTEND:
8572 case ZERO_EXTRACT:
8573 case SIGN_EXTRACT:
8574 x = expand_compound_operation (x);
8575 if (GET_CODE (x) != code)
8576 return force_to_mode (x, mode, mask, next_select);
8577 break;
8578
8579 case TRUNCATE:
8580 /* Similarly for a truncate. */
8581 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8582
8583 case AND:
8584 /* If this is an AND with a constant, convert it into an AND
8585 whose constant is the AND of that constant with MASK. If it
8586 remains an AND of MASK, delete it since it is redundant. */
8587
8588 if (CONST_INT_P (XEXP (x, 1)))
8589 {
8590 x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
8591 mask & INTVAL (XEXP (x, 1)));
8592
8593 /* If X is still an AND, see if it is an AND with a mask that
8594 is just some low-order bits. If so, and it is MASK, we don't
8595 need it. */
8596
8597 if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
8598 && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
8599 == mask))
8600 x = XEXP (x, 0);
8601
8602 /* If it remains an AND, try making another AND with the bits
8603 in the mode mask that aren't in MASK turned on. If the
8604 constant in the AND is wide enough, this might make a
8605 cheaper constant. */
8606
8607 if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
8608 && GET_MODE_MASK (GET_MODE (x)) != mask
8609 && HWI_COMPUTABLE_MODE_P (GET_MODE (x)))
8610 {
8611 unsigned HOST_WIDE_INT cval
8612 = UINTVAL (XEXP (x, 1))
8613 | (GET_MODE_MASK (GET_MODE (x)) & ~mask);
8614 rtx y;
8615
8616 y = simplify_gen_binary (AND, GET_MODE (x), XEXP (x, 0),
8617 gen_int_mode (cval, GET_MODE (x)));
8618 if (set_src_cost (y, GET_MODE (x), optimize_this_for_speed_p)
8619 < set_src_cost (x, GET_MODE (x), optimize_this_for_speed_p))
8620 x = y;
8621 }
8622
8623 break;
8624 }
8625
8626 goto binop;
8627
8628 case PLUS:
8629 /* In (and (plus FOO C1) M), if M is a mask that just turns off
8630 low-order bits (as in an alignment operation) and FOO is already
8631 aligned to that boundary, mask C1 to that boundary as well.
8632 This may eliminate that PLUS and, later, the AND. */
8633
8634 {
8635 unsigned int width = GET_MODE_PRECISION (mode);
8636 unsigned HOST_WIDE_INT smask = mask;
8637
8638 /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
8639 number, sign extend it. */
8640
8641 if (width < HOST_BITS_PER_WIDE_INT
8642 && (smask & (HOST_WIDE_INT_1U << (width - 1))) != 0)
8643 smask |= HOST_WIDE_INT_M1U << width;
8644
8645 if (CONST_INT_P (XEXP (x, 1))
8646 && pow2p_hwi (- smask)
8647 && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
8648 && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
8649 return force_to_mode (plus_constant (GET_MODE (x), XEXP (x, 0),
8650 (INTVAL (XEXP (x, 1)) & smask)),
8651 mode, smask, next_select);
8652 }
8653
8654 /* fall through */
8655
8656 case MULT:
8657 /* Substituting into the operands of a widening MULT is not likely to
8658 create RTL matching a machine insn. */
8659 if (code == MULT
8660 && (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
8661 || GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
8662 && (GET_CODE (XEXP (x, 1)) == ZERO_EXTEND
8663 || GET_CODE (XEXP (x, 1)) == SIGN_EXTEND)
8664 && REG_P (XEXP (XEXP (x, 0), 0))
8665 && REG_P (XEXP (XEXP (x, 1), 0)))
8666 return gen_lowpart_or_truncate (mode, x);
8667
8668 /* For PLUS, MINUS and MULT, we need any bits less significant than the
8669 most significant bit in MASK since carries from those bits will
8670 affect the bits we are interested in. */
8671 mask = fuller_mask;
8672 goto binop;
8673
8674 case MINUS:
8675 /* If X is (minus C Y) where C's least set bit is larger than any bit
8676 in the mask, then we may replace with (neg Y). */
8677 if (CONST_INT_P (XEXP (x, 0))
8678 && least_bit_hwi (UINTVAL (XEXP (x, 0))) > mask)
8679 {
8680 x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
8681 GET_MODE (x));
8682 return force_to_mode (x, mode, mask, next_select);
8683 }
8684
8685 /* Similarly, if C contains every bit in the fuller_mask, then we may
8686 replace with (not Y). */
8687 if (CONST_INT_P (XEXP (x, 0))
8688 && ((UINTVAL (XEXP (x, 0)) | fuller_mask) == UINTVAL (XEXP (x, 0))))
8689 {
8690 x = simplify_gen_unary (NOT, GET_MODE (x),
8691 XEXP (x, 1), GET_MODE (x));
8692 return force_to_mode (x, mode, mask, next_select);
8693 }
8694
8695 mask = fuller_mask;
8696 goto binop;
8697
8698 case IOR:
8699 case XOR:
8700 /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
8701 LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
8702 operation which may be a bitfield extraction. Ensure that the
8703 constant we form is not wider than the mode of X. */
8704
8705 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8706 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8707 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8708 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
8709 && CONST_INT_P (XEXP (x, 1))
8710 && ((INTVAL (XEXP (XEXP (x, 0), 1))
8711 + floor_log2 (INTVAL (XEXP (x, 1))))
8712 < GET_MODE_PRECISION (GET_MODE (x)))
8713 && (UINTVAL (XEXP (x, 1))
8714 & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
8715 {
8716 temp = gen_int_mode ((INTVAL (XEXP (x, 1)) & mask)
8717 << INTVAL (XEXP (XEXP (x, 0), 1)),
8718 GET_MODE (x));
8719 temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
8720 XEXP (XEXP (x, 0), 0), temp);
8721 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
8722 XEXP (XEXP (x, 0), 1));
8723 return force_to_mode (x, mode, mask, next_select);
8724 }
8725
8726 binop:
8727 /* For most binary operations, just propagate into the operation and
8728 change the mode if we have an operation of that mode. */
8729
8730 op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
8731 op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
8732
8733 /* If we ended up truncating both operands, truncate the result of the
8734 operation instead. */
8735 if (GET_CODE (op0) == TRUNCATE
8736 && GET_CODE (op1) == TRUNCATE)
8737 {
8738 op0 = XEXP (op0, 0);
8739 op1 = XEXP (op1, 0);
8740 }
8741
8742 op0 = gen_lowpart_or_truncate (op_mode, op0);
8743 op1 = gen_lowpart_or_truncate (op_mode, op1);
8744
8745 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
8746 x = simplify_gen_binary (code, op_mode, op0, op1);
8747 break;
8748
8749 case ASHIFT:
8750 /* For left shifts, do the same, but just for the first operand.
8751 However, we cannot do anything with shifts where we cannot
8752 guarantee that the counts are smaller than the size of the mode
8753 because such a count will have a different meaning in a
8754 wider mode. */
8755
8756 if (! (CONST_INT_P (XEXP (x, 1))
8757 && INTVAL (XEXP (x, 1)) >= 0
8758 && INTVAL (XEXP (x, 1)) < GET_MODE_PRECISION (mode))
8759 && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
8760 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
8761 < (unsigned HOST_WIDE_INT) GET_MODE_PRECISION (mode))))
8762 break;
8763
8764 /* If the shift count is a constant and we can do arithmetic in
8765 the mode of the shift, refine which bits we need. Otherwise, use the
8766 conservative form of the mask. */
8767 if (CONST_INT_P (XEXP (x, 1))
8768 && INTVAL (XEXP (x, 1)) >= 0
8769 && INTVAL (XEXP (x, 1)) < GET_MODE_PRECISION (op_mode)
8770 && HWI_COMPUTABLE_MODE_P (op_mode))
8771 mask >>= INTVAL (XEXP (x, 1));
8772 else
8773 mask = fuller_mask;
8774
8775 op0 = gen_lowpart_or_truncate (op_mode,
8776 force_to_mode (XEXP (x, 0), op_mode,
8777 mask, next_select));
8778
8779 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
8780 x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
8781 break;
8782
8783 case LSHIFTRT:
8784 /* Here we can only do something if the shift count is a constant,
8785 this shift constant is valid for the host, and we can do arithmetic
8786 in OP_MODE. */
8787
8788 if (CONST_INT_P (XEXP (x, 1))
8789 && INTVAL (XEXP (x, 1)) >= 0
8790 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
8791 && HWI_COMPUTABLE_MODE_P (op_mode))
8792 {
8793 rtx inner = XEXP (x, 0);
8794 unsigned HOST_WIDE_INT inner_mask;
8795
8796 /* Select the mask of the bits we need for the shift operand. */
8797 inner_mask = mask << INTVAL (XEXP (x, 1));
8798
8799 /* We can only change the mode of the shift if we can do arithmetic
8800 in the mode of the shift and INNER_MASK is no wider than the
8801 width of X's mode. */
8802 if ((inner_mask & ~GET_MODE_MASK (GET_MODE (x))) != 0)
8803 op_mode = GET_MODE (x);
8804
8805 inner = force_to_mode (inner, op_mode, inner_mask, next_select);
8806
8807 if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
8808 x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
8809 }
8810
8811 /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
8812 shift and AND produces only copies of the sign bit (C2 is one less
8813 than a power of two), we can do this with just a shift. */
8814
8815 if (GET_CODE (x) == LSHIFTRT
8816 && CONST_INT_P (XEXP (x, 1))
8817 /* The shift puts one of the sign bit copies in the least significant
8818 bit. */
8819 && ((INTVAL (XEXP (x, 1))
8820 + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
8821 >= GET_MODE_PRECISION (GET_MODE (x)))
8822 && pow2p_hwi (mask + 1)
8823 /* Number of bits left after the shift must be more than the mask
8824 needs. */
8825 && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
8826 <= GET_MODE_PRECISION (GET_MODE (x)))
8827 /* Must be more sign bit copies than the mask needs. */
8828 && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
8829 >= exact_log2 (mask + 1)))
8830 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
8831 GEN_INT (GET_MODE_PRECISION (GET_MODE (x))
8832 - exact_log2 (mask + 1)));
8833
8834 goto shiftrt;
8835
8836 case ASHIFTRT:
8837 /* If we are just looking for the sign bit, we don't need this shift at
8838 all, even if it has a variable count. */
8839 if (val_signbit_p (GET_MODE (x), mask))
8840 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8841
8842 /* If this is a shift by a constant, get a mask that contains those bits
8843 that are not copies of the sign bit. We then have two cases: If
8844 MASK only includes those bits, this can be a logical shift, which may
8845 allow simplifications. If MASK is a single-bit field not within
8846 those bits, we are requesting a copy of the sign bit and hence can
8847 shift the sign bit to the appropriate location. */
8848
8849 if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0
8850 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
8851 {
8852 int i;
8853
8854 /* If the considered data is wider than HOST_WIDE_INT, we can't
8855 represent a mask for all its bits in a single scalar.
8856 But we only care about the lower bits, so calculate these. */
8857
8858 if (GET_MODE_PRECISION (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
8859 {
8860 nonzero = HOST_WIDE_INT_M1U;
8861
8862 /* GET_MODE_PRECISION (GET_MODE (x)) - INTVAL (XEXP (x, 1))
8863 is the number of bits a full-width mask would have set.
8864 We need only shift if these are fewer than nonzero can
8865 hold. If not, we must keep all bits set in nonzero. */
8866
8867 if (GET_MODE_PRECISION (GET_MODE (x)) - INTVAL (XEXP (x, 1))
8868 < HOST_BITS_PER_WIDE_INT)
8869 nonzero >>= INTVAL (XEXP (x, 1))
8870 + HOST_BITS_PER_WIDE_INT
8871 - GET_MODE_PRECISION (GET_MODE (x)) ;
8872 }
8873 else
8874 {
8875 nonzero = GET_MODE_MASK (GET_MODE (x));
8876 nonzero >>= INTVAL (XEXP (x, 1));
8877 }
8878
8879 if ((mask & ~nonzero) == 0)
8880 {
8881 x = simplify_shift_const (NULL_RTX, LSHIFTRT, GET_MODE (x),
8882 XEXP (x, 0), INTVAL (XEXP (x, 1)));
8883 if (GET_CODE (x) != ASHIFTRT)
8884 return force_to_mode (x, mode, mask, next_select);
8885 }
8886
8887 else if ((i = exact_log2 (mask)) >= 0)
8888 {
8889 x = simplify_shift_const
8890 (NULL_RTX, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
8891 GET_MODE_PRECISION (GET_MODE (x)) - 1 - i);
8892
8893 if (GET_CODE (x) != ASHIFTRT)
8894 return force_to_mode (x, mode, mask, next_select);
8895 }
8896 }
8897
8898 /* If MASK is 1, convert this to an LSHIFTRT. This can be done
8899 even if the shift count isn't a constant. */
8900 if (mask == 1)
8901 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8902 XEXP (x, 0), XEXP (x, 1));
8903
8904 shiftrt:
8905
8906 /* If this is a zero- or sign-extension operation that just affects bits
8907 we don't care about, remove it. Be sure the call above returned
8908 something that is still a shift. */
8909
8910 if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
8911 && CONST_INT_P (XEXP (x, 1))
8912 && INTVAL (XEXP (x, 1)) >= 0
8913 && (INTVAL (XEXP (x, 1))
8914 <= GET_MODE_PRECISION (GET_MODE (x)) - (floor_log2 (mask) + 1))
8915 && GET_CODE (XEXP (x, 0)) == ASHIFT
8916 && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
8917 return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
8918 next_select);
8919
8920 break;
8921
8922 case ROTATE:
8923 case ROTATERT:
8924 /* If the shift count is constant and we can do computations
8925 in the mode of X, compute where the bits we care about are.
8926 Otherwise, we can't do anything. Don't change the mode of
8927 the shift or propagate MODE into the shift, though. */
8928 if (CONST_INT_P (XEXP (x, 1))
8929 && INTVAL (XEXP (x, 1)) >= 0)
8930 {
8931 temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
8932 GET_MODE (x),
8933 gen_int_mode (mask, GET_MODE (x)),
8934 XEXP (x, 1));
8935 if (temp && CONST_INT_P (temp))
8936 x = simplify_gen_binary (code, GET_MODE (x),
8937 force_to_mode (XEXP (x, 0), GET_MODE (x),
8938 INTVAL (temp), next_select),
8939 XEXP (x, 1));
8940 }
8941 break;
8942
8943 case NEG:
8944 /* If we just want the low-order bit, the NEG isn't needed since it
8945 won't change the low-order bit. */
8946 if (mask == 1)
8947 return force_to_mode (XEXP (x, 0), mode, mask, just_select);
8948
8949 /* We need any bits less significant than the most significant bit in
8950 MASK since carries from those bits will affect the bits we are
8951 interested in. */
8952 mask = fuller_mask;
8953 goto unop;
8954
8955 case NOT:
8956 /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
8957 same as the XOR case above. Ensure that the constant we form is not
8958 wider than the mode of X. */
8959
8960 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8961 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8962 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8963 && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
8964 < GET_MODE_PRECISION (GET_MODE (x)))
8965 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
8966 {
8967 temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
8968 GET_MODE (x));
8969 temp = simplify_gen_binary (XOR, GET_MODE (x),
8970 XEXP (XEXP (x, 0), 0), temp);
8971 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8972 temp, XEXP (XEXP (x, 0), 1));
8973
8974 return force_to_mode (x, mode, mask, next_select);
8975 }
8976
8977 /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
8978 use the full mask inside the NOT. */
8979 mask = fuller_mask;
8980
8981 unop:
8982 op0 = gen_lowpart_or_truncate (op_mode,
8983 force_to_mode (XEXP (x, 0), mode, mask,
8984 next_select));
8985 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
8986 x = simplify_gen_unary (code, op_mode, op0, op_mode);
8987 break;
8988
8989 case NE:
8990 /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
8991 in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
8992 which is equal to STORE_FLAG_VALUE. */
8993 if ((mask & ~STORE_FLAG_VALUE) == 0
8994 && XEXP (x, 1) == const0_rtx
8995 && GET_MODE (XEXP (x, 0)) == mode
8996 && pow2p_hwi (nonzero_bits (XEXP (x, 0), mode))
8997 && (nonzero_bits (XEXP (x, 0), mode)
8998 == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
8999 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
9000
9001 break;
9002
9003 case IF_THEN_ELSE:
9004 /* We have no way of knowing if the IF_THEN_ELSE can itself be
9005 written in a narrower mode. We play it safe and do not do so. */
9006
9007 op0 = gen_lowpart_or_truncate (GET_MODE (x),
9008 force_to_mode (XEXP (x, 1), mode,
9009 mask, next_select));
9010 op1 = gen_lowpart_or_truncate (GET_MODE (x),
9011 force_to_mode (XEXP (x, 2), mode,
9012 mask, next_select));
9013 if (op0 != XEXP (x, 1) || op1 != XEXP (x, 2))
9014 x = simplify_gen_ternary (IF_THEN_ELSE, GET_MODE (x),
9015 GET_MODE (XEXP (x, 0)), XEXP (x, 0),
9016 op0, op1);
9017 break;
9018
9019 default:
9020 break;
9021 }
9022
9023 /* Ensure we return a value of the proper mode. */
9024 return gen_lowpart_or_truncate (mode, x);
9025 }
9026 \f
9027 /* Return nonzero if X is an expression that has one of two values depending on
9028 whether some other value is zero or nonzero. In that case, we return the
9029 value that is being tested, *PTRUE is set to the value if the rtx being
9030 returned has a nonzero value, and *PFALSE is set to the other alternative.
9031
9032 If we return zero, we set *PTRUE and *PFALSE to X. */
9033
9034 static rtx
9035 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
9036 {
9037 machine_mode mode = GET_MODE (x);
9038 enum rtx_code code = GET_CODE (x);
9039 rtx cond0, cond1, true0, true1, false0, false1;
9040 unsigned HOST_WIDE_INT nz;
9041 scalar_int_mode int_mode;
9042
9043 /* If we are comparing a value against zero, we are done. */
9044 if ((code == NE || code == EQ)
9045 && XEXP (x, 1) == const0_rtx)
9046 {
9047 *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
9048 *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
9049 return XEXP (x, 0);
9050 }
9051
9052 /* If this is a unary operation whose operand has one of two values, apply
9053 our opcode to compute those values. */
9054 else if (UNARY_P (x)
9055 && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
9056 {
9057 *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
9058 *pfalse = simplify_gen_unary (code, mode, false0,
9059 GET_MODE (XEXP (x, 0)));
9060 return cond0;
9061 }
9062
9063 /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
9064 make can't possibly match and would suppress other optimizations. */
9065 else if (code == COMPARE)
9066 ;
9067
9068 /* If this is a binary operation, see if either side has only one of two
9069 values. If either one does or if both do and they are conditional on
9070 the same value, compute the new true and false values. */
9071 else if (BINARY_P (x))
9072 {
9073 rtx op0 = XEXP (x, 0);
9074 rtx op1 = XEXP (x, 1);
9075 cond0 = if_then_else_cond (op0, &true0, &false0);
9076 cond1 = if_then_else_cond (op1, &true1, &false1);
9077
9078 if ((cond0 != 0 && cond1 != 0 && !rtx_equal_p (cond0, cond1))
9079 && (REG_P (op0) || REG_P (op1)))
9080 {
9081 /* Try to enable a simplification by undoing work done by
9082 if_then_else_cond if it converted a REG into something more
9083 complex. */
9084 if (REG_P (op0))
9085 {
9086 cond0 = 0;
9087 true0 = false0 = op0;
9088 }
9089 else
9090 {
9091 cond1 = 0;
9092 true1 = false1 = op1;
9093 }
9094 }
9095
9096 if ((cond0 != 0 || cond1 != 0)
9097 && ! (cond0 != 0 && cond1 != 0 && !rtx_equal_p (cond0, cond1)))
9098 {
9099 /* If if_then_else_cond returned zero, then true/false are the
9100 same rtl. We must copy one of them to prevent invalid rtl
9101 sharing. */
9102 if (cond0 == 0)
9103 true0 = copy_rtx (true0);
9104 else if (cond1 == 0)
9105 true1 = copy_rtx (true1);
9106
9107 if (COMPARISON_P (x))
9108 {
9109 *ptrue = simplify_gen_relational (code, mode, VOIDmode,
9110 true0, true1);
9111 *pfalse = simplify_gen_relational (code, mode, VOIDmode,
9112 false0, false1);
9113 }
9114 else
9115 {
9116 *ptrue = simplify_gen_binary (code, mode, true0, true1);
9117 *pfalse = simplify_gen_binary (code, mode, false0, false1);
9118 }
9119
9120 return cond0 ? cond0 : cond1;
9121 }
9122
9123 /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
9124 operands is zero when the other is nonzero, and vice-versa,
9125 and STORE_FLAG_VALUE is 1 or -1. */
9126
9127 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9128 && (code == PLUS || code == IOR || code == XOR || code == MINUS
9129 || code == UMAX)
9130 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
9131 {
9132 rtx op0 = XEXP (XEXP (x, 0), 1);
9133 rtx op1 = XEXP (XEXP (x, 1), 1);
9134
9135 cond0 = XEXP (XEXP (x, 0), 0);
9136 cond1 = XEXP (XEXP (x, 1), 0);
9137
9138 if (COMPARISON_P (cond0)
9139 && COMPARISON_P (cond1)
9140 && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
9141 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
9142 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
9143 || ((swap_condition (GET_CODE (cond0))
9144 == reversed_comparison_code (cond1, NULL))
9145 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
9146 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
9147 && ! side_effects_p (x))
9148 {
9149 *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
9150 *pfalse = simplify_gen_binary (MULT, mode,
9151 (code == MINUS
9152 ? simplify_gen_unary (NEG, mode,
9153 op1, mode)
9154 : op1),
9155 const_true_rtx);
9156 return cond0;
9157 }
9158 }
9159
9160 /* Similarly for MULT, AND and UMIN, except that for these the result
9161 is always zero. */
9162 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9163 && (code == MULT || code == AND || code == UMIN)
9164 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
9165 {
9166 cond0 = XEXP (XEXP (x, 0), 0);
9167 cond1 = XEXP (XEXP (x, 1), 0);
9168
9169 if (COMPARISON_P (cond0)
9170 && COMPARISON_P (cond1)
9171 && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
9172 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
9173 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
9174 || ((swap_condition (GET_CODE (cond0))
9175 == reversed_comparison_code (cond1, NULL))
9176 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
9177 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
9178 && ! side_effects_p (x))
9179 {
9180 *ptrue = *pfalse = const0_rtx;
9181 return cond0;
9182 }
9183 }
9184 }
9185
9186 else if (code == IF_THEN_ELSE)
9187 {
9188 /* If we have IF_THEN_ELSE already, extract the condition and
9189 canonicalize it if it is NE or EQ. */
9190 cond0 = XEXP (x, 0);
9191 *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
9192 if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
9193 return XEXP (cond0, 0);
9194 else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
9195 {
9196 *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
9197 return XEXP (cond0, 0);
9198 }
9199 else
9200 return cond0;
9201 }
9202
9203 /* If X is a SUBREG, we can narrow both the true and false values
9204 if the inner expression, if there is a condition. */
9205 else if (code == SUBREG
9206 && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
9207 &true0, &false0)))
9208 {
9209 true0 = simplify_gen_subreg (mode, true0,
9210 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
9211 false0 = simplify_gen_subreg (mode, false0,
9212 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
9213 if (true0 && false0)
9214 {
9215 *ptrue = true0;
9216 *pfalse = false0;
9217 return cond0;
9218 }
9219 }
9220
9221 /* If X is a constant, this isn't special and will cause confusions
9222 if we treat it as such. Likewise if it is equivalent to a constant. */
9223 else if (CONSTANT_P (x)
9224 || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
9225 ;
9226
9227 /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
9228 will be least confusing to the rest of the compiler. */
9229 else if (mode == BImode)
9230 {
9231 *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
9232 return x;
9233 }
9234
9235 /* If X is known to be either 0 or -1, those are the true and
9236 false values when testing X. */
9237 else if (x == constm1_rtx || x == const0_rtx
9238 || (is_a <scalar_int_mode> (mode, &int_mode)
9239 && (num_sign_bit_copies (x, int_mode)
9240 == GET_MODE_PRECISION (int_mode))))
9241 {
9242 *ptrue = constm1_rtx, *pfalse = const0_rtx;
9243 return x;
9244 }
9245
9246 /* Likewise for 0 or a single bit. */
9247 else if (HWI_COMPUTABLE_MODE_P (mode)
9248 && pow2p_hwi (nz = nonzero_bits (x, mode)))
9249 {
9250 *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
9251 return x;
9252 }
9253
9254 /* Otherwise fail; show no condition with true and false values the same. */
9255 *ptrue = *pfalse = x;
9256 return 0;
9257 }
9258 \f
9259 /* Return the value of expression X given the fact that condition COND
9260 is known to be true when applied to REG as its first operand and VAL
9261 as its second. X is known to not be shared and so can be modified in
9262 place.
9263
9264 We only handle the simplest cases, and specifically those cases that
9265 arise with IF_THEN_ELSE expressions. */
9266
9267 static rtx
9268 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
9269 {
9270 enum rtx_code code = GET_CODE (x);
9271 const char *fmt;
9272 int i, j;
9273
9274 if (side_effects_p (x))
9275 return x;
9276
9277 /* If either operand of the condition is a floating point value,
9278 then we have to avoid collapsing an EQ comparison. */
9279 if (cond == EQ
9280 && rtx_equal_p (x, reg)
9281 && ! FLOAT_MODE_P (GET_MODE (x))
9282 && ! FLOAT_MODE_P (GET_MODE (val)))
9283 return val;
9284
9285 if (cond == UNEQ && rtx_equal_p (x, reg))
9286 return val;
9287
9288 /* If X is (abs REG) and we know something about REG's relationship
9289 with zero, we may be able to simplify this. */
9290
9291 if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
9292 switch (cond)
9293 {
9294 case GE: case GT: case EQ:
9295 return XEXP (x, 0);
9296 case LT: case LE:
9297 return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
9298 XEXP (x, 0),
9299 GET_MODE (XEXP (x, 0)));
9300 default:
9301 break;
9302 }
9303
9304 /* The only other cases we handle are MIN, MAX, and comparisons if the
9305 operands are the same as REG and VAL. */
9306
9307 else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
9308 {
9309 if (rtx_equal_p (XEXP (x, 0), val))
9310 {
9311 std::swap (val, reg);
9312 cond = swap_condition (cond);
9313 }
9314
9315 if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
9316 {
9317 if (COMPARISON_P (x))
9318 {
9319 if (comparison_dominates_p (cond, code))
9320 return const_true_rtx;
9321
9322 code = reversed_comparison_code (x, NULL);
9323 if (code != UNKNOWN
9324 && comparison_dominates_p (cond, code))
9325 return const0_rtx;
9326 else
9327 return x;
9328 }
9329 else if (code == SMAX || code == SMIN
9330 || code == UMIN || code == UMAX)
9331 {
9332 int unsignedp = (code == UMIN || code == UMAX);
9333
9334 /* Do not reverse the condition when it is NE or EQ.
9335 This is because we cannot conclude anything about
9336 the value of 'SMAX (x, y)' when x is not equal to y,
9337 but we can when x equals y. */
9338 if ((code == SMAX || code == UMAX)
9339 && ! (cond == EQ || cond == NE))
9340 cond = reverse_condition (cond);
9341
9342 switch (cond)
9343 {
9344 case GE: case GT:
9345 return unsignedp ? x : XEXP (x, 1);
9346 case LE: case LT:
9347 return unsignedp ? x : XEXP (x, 0);
9348 case GEU: case GTU:
9349 return unsignedp ? XEXP (x, 1) : x;
9350 case LEU: case LTU:
9351 return unsignedp ? XEXP (x, 0) : x;
9352 default:
9353 break;
9354 }
9355 }
9356 }
9357 }
9358 else if (code == SUBREG)
9359 {
9360 machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
9361 rtx new_rtx, r = known_cond (SUBREG_REG (x), cond, reg, val);
9362
9363 if (SUBREG_REG (x) != r)
9364 {
9365 /* We must simplify subreg here, before we lose track of the
9366 original inner_mode. */
9367 new_rtx = simplify_subreg (GET_MODE (x), r,
9368 inner_mode, SUBREG_BYTE (x));
9369 if (new_rtx)
9370 return new_rtx;
9371 else
9372 SUBST (SUBREG_REG (x), r);
9373 }
9374
9375 return x;
9376 }
9377 /* We don't have to handle SIGN_EXTEND here, because even in the
9378 case of replacing something with a modeless CONST_INT, a
9379 CONST_INT is already (supposed to be) a valid sign extension for
9380 its narrower mode, which implies it's already properly
9381 sign-extended for the wider mode. Now, for ZERO_EXTEND, the
9382 story is different. */
9383 else if (code == ZERO_EXTEND)
9384 {
9385 machine_mode inner_mode = GET_MODE (XEXP (x, 0));
9386 rtx new_rtx, r = known_cond (XEXP (x, 0), cond, reg, val);
9387
9388 if (XEXP (x, 0) != r)
9389 {
9390 /* We must simplify the zero_extend here, before we lose
9391 track of the original inner_mode. */
9392 new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
9393 r, inner_mode);
9394 if (new_rtx)
9395 return new_rtx;
9396 else
9397 SUBST (XEXP (x, 0), r);
9398 }
9399
9400 return x;
9401 }
9402
9403 fmt = GET_RTX_FORMAT (code);
9404 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
9405 {
9406 if (fmt[i] == 'e')
9407 SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
9408 else if (fmt[i] == 'E')
9409 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
9410 SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
9411 cond, reg, val));
9412 }
9413
9414 return x;
9415 }
9416 \f
9417 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
9418 assignment as a field assignment. */
9419
9420 static int
9421 rtx_equal_for_field_assignment_p (rtx x, rtx y, bool widen_x)
9422 {
9423 if (widen_x && GET_MODE (x) != GET_MODE (y))
9424 {
9425 if (paradoxical_subreg_p (GET_MODE (x), GET_MODE (y)))
9426 return 0;
9427 if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
9428 return 0;
9429 /* For big endian, adjust the memory offset. */
9430 if (BYTES_BIG_ENDIAN)
9431 x = adjust_address_nv (x, GET_MODE (y),
9432 -subreg_lowpart_offset (GET_MODE (x),
9433 GET_MODE (y)));
9434 else
9435 x = adjust_address_nv (x, GET_MODE (y), 0);
9436 }
9437
9438 if (x == y || rtx_equal_p (x, y))
9439 return 1;
9440
9441 if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
9442 return 0;
9443
9444 /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
9445 Note that all SUBREGs of MEM are paradoxical; otherwise they
9446 would have been rewritten. */
9447 if (MEM_P (x) && GET_CODE (y) == SUBREG
9448 && MEM_P (SUBREG_REG (y))
9449 && rtx_equal_p (SUBREG_REG (y),
9450 gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
9451 return 1;
9452
9453 if (MEM_P (y) && GET_CODE (x) == SUBREG
9454 && MEM_P (SUBREG_REG (x))
9455 && rtx_equal_p (SUBREG_REG (x),
9456 gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
9457 return 1;
9458
9459 /* We used to see if get_last_value of X and Y were the same but that's
9460 not correct. In one direction, we'll cause the assignment to have
9461 the wrong destination and in the case, we'll import a register into this
9462 insn that might have already have been dead. So fail if none of the
9463 above cases are true. */
9464 return 0;
9465 }
9466 \f
9467 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
9468 Return that assignment if so.
9469
9470 We only handle the most common cases. */
9471
9472 static rtx
9473 make_field_assignment (rtx x)
9474 {
9475 rtx dest = SET_DEST (x);
9476 rtx src = SET_SRC (x);
9477 rtx assign;
9478 rtx rhs, lhs;
9479 HOST_WIDE_INT c1;
9480 HOST_WIDE_INT pos;
9481 unsigned HOST_WIDE_INT len;
9482 rtx other;
9483
9484 /* All the rules in this function are specific to scalar integers. */
9485 scalar_int_mode mode;
9486 if (!is_a <scalar_int_mode> (GET_MODE (dest), &mode))
9487 return x;
9488
9489 /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
9490 a clear of a one-bit field. We will have changed it to
9491 (and (rotate (const_int -2) POS) DEST), so check for that. Also check
9492 for a SUBREG. */
9493
9494 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
9495 && CONST_INT_P (XEXP (XEXP (src, 0), 0))
9496 && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
9497 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
9498 {
9499 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
9500 1, 1, 1, 0);
9501 if (assign != 0)
9502 return gen_rtx_SET (assign, const0_rtx);
9503 return x;
9504 }
9505
9506 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
9507 && subreg_lowpart_p (XEXP (src, 0))
9508 && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
9509 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
9510 && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
9511 && CONST_INT_P (XEXP (SUBREG_REG (XEXP (src, 0)), 0))
9512 && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
9513 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
9514 {
9515 assign = make_extraction (VOIDmode, dest, 0,
9516 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
9517 1, 1, 1, 0);
9518 if (assign != 0)
9519 return gen_rtx_SET (assign, const0_rtx);
9520 return x;
9521 }
9522
9523 /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
9524 one-bit field. */
9525 if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
9526 && XEXP (XEXP (src, 0), 0) == const1_rtx
9527 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
9528 {
9529 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
9530 1, 1, 1, 0);
9531 if (assign != 0)
9532 return gen_rtx_SET (assign, const1_rtx);
9533 return x;
9534 }
9535
9536 /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
9537 SRC is an AND with all bits of that field set, then we can discard
9538 the AND. */
9539 if (GET_CODE (dest) == ZERO_EXTRACT
9540 && CONST_INT_P (XEXP (dest, 1))
9541 && GET_CODE (src) == AND
9542 && CONST_INT_P (XEXP (src, 1)))
9543 {
9544 HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
9545 unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
9546 unsigned HOST_WIDE_INT ze_mask;
9547
9548 if (width >= HOST_BITS_PER_WIDE_INT)
9549 ze_mask = -1;
9550 else
9551 ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
9552
9553 /* Complete overlap. We can remove the source AND. */
9554 if ((and_mask & ze_mask) == ze_mask)
9555 return gen_rtx_SET (dest, XEXP (src, 0));
9556
9557 /* Partial overlap. We can reduce the source AND. */
9558 if ((and_mask & ze_mask) != and_mask)
9559 {
9560 src = gen_rtx_AND (mode, XEXP (src, 0),
9561 gen_int_mode (and_mask & ze_mask, mode));
9562 return gen_rtx_SET (dest, src);
9563 }
9564 }
9565
9566 /* The other case we handle is assignments into a constant-position
9567 field. They look like (ior/xor (and DEST C1) OTHER). If C1 represents
9568 a mask that has all one bits except for a group of zero bits and
9569 OTHER is known to have zeros where C1 has ones, this is such an
9570 assignment. Compute the position and length from C1. Shift OTHER
9571 to the appropriate position, force it to the required mode, and
9572 make the extraction. Check for the AND in both operands. */
9573
9574 /* One or more SUBREGs might obscure the constant-position field
9575 assignment. The first one we are likely to encounter is an outer
9576 narrowing SUBREG, which we can just strip for the purposes of
9577 identifying the constant-field assignment. */
9578 scalar_int_mode src_mode = mode;
9579 if (GET_CODE (src) == SUBREG
9580 && subreg_lowpart_p (src)
9581 && is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (src)), &src_mode))
9582 src = SUBREG_REG (src);
9583
9584 if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
9585 return x;
9586
9587 rhs = expand_compound_operation (XEXP (src, 0));
9588 lhs = expand_compound_operation (XEXP (src, 1));
9589
9590 if (GET_CODE (rhs) == AND
9591 && CONST_INT_P (XEXP (rhs, 1))
9592 && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
9593 c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
9594 /* The second SUBREG that might get in the way is a paradoxical
9595 SUBREG around the first operand of the AND. We want to
9596 pretend the operand is as wide as the destination here. We
9597 do this by adjusting the MEM to wider mode for the sole
9598 purpose of the call to rtx_equal_for_field_assignment_p. Also
9599 note this trick only works for MEMs. */
9600 else if (GET_CODE (rhs) == AND
9601 && paradoxical_subreg_p (XEXP (rhs, 0))
9602 && MEM_P (SUBREG_REG (XEXP (rhs, 0)))
9603 && CONST_INT_P (XEXP (rhs, 1))
9604 && rtx_equal_for_field_assignment_p (SUBREG_REG (XEXP (rhs, 0)),
9605 dest, true))
9606 c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
9607 else if (GET_CODE (lhs) == AND
9608 && CONST_INT_P (XEXP (lhs, 1))
9609 && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
9610 c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
9611 /* The second SUBREG that might get in the way is a paradoxical
9612 SUBREG around the first operand of the AND. We want to
9613 pretend the operand is as wide as the destination here. We
9614 do this by adjusting the MEM to wider mode for the sole
9615 purpose of the call to rtx_equal_for_field_assignment_p. Also
9616 note this trick only works for MEMs. */
9617 else if (GET_CODE (lhs) == AND
9618 && paradoxical_subreg_p (XEXP (lhs, 0))
9619 && MEM_P (SUBREG_REG (XEXP (lhs, 0)))
9620 && CONST_INT_P (XEXP (lhs, 1))
9621 && rtx_equal_for_field_assignment_p (SUBREG_REG (XEXP (lhs, 0)),
9622 dest, true))
9623 c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
9624 else
9625 return x;
9626
9627 pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (mode), &len);
9628 if (pos < 0
9629 || pos + len > GET_MODE_PRECISION (mode)
9630 || GET_MODE_PRECISION (mode) > HOST_BITS_PER_WIDE_INT
9631 || (c1 & nonzero_bits (other, mode)) != 0)
9632 return x;
9633
9634 assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
9635 if (assign == 0)
9636 return x;
9637
9638 /* The mode to use for the source is the mode of the assignment, or of
9639 what is inside a possible STRICT_LOW_PART. */
9640 machine_mode new_mode = (GET_CODE (assign) == STRICT_LOW_PART
9641 ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
9642
9643 /* Shift OTHER right POS places and make it the source, restricting it
9644 to the proper length and mode. */
9645
9646 src = canon_reg_for_combine (simplify_shift_const (NULL_RTX, LSHIFTRT,
9647 src_mode, other, pos),
9648 dest);
9649 src = force_to_mode (src, new_mode,
9650 len >= HOST_BITS_PER_WIDE_INT
9651 ? HOST_WIDE_INT_M1U
9652 : (HOST_WIDE_INT_1U << len) - 1,
9653 0);
9654
9655 /* If SRC is masked by an AND that does not make a difference in
9656 the value being stored, strip it. */
9657 if (GET_CODE (assign) == ZERO_EXTRACT
9658 && CONST_INT_P (XEXP (assign, 1))
9659 && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
9660 && GET_CODE (src) == AND
9661 && CONST_INT_P (XEXP (src, 1))
9662 && UINTVAL (XEXP (src, 1))
9663 == (HOST_WIDE_INT_1U << INTVAL (XEXP (assign, 1))) - 1)
9664 src = XEXP (src, 0);
9665
9666 return gen_rtx_SET (assign, src);
9667 }
9668 \f
9669 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
9670 if so. */
9671
9672 static rtx
9673 apply_distributive_law (rtx x)
9674 {
9675 enum rtx_code code = GET_CODE (x);
9676 enum rtx_code inner_code;
9677 rtx lhs, rhs, other;
9678 rtx tem;
9679
9680 /* Distributivity is not true for floating point as it can change the
9681 value. So we don't do it unless -funsafe-math-optimizations. */
9682 if (FLOAT_MODE_P (GET_MODE (x))
9683 && ! flag_unsafe_math_optimizations)
9684 return x;
9685
9686 /* The outer operation can only be one of the following: */
9687 if (code != IOR && code != AND && code != XOR
9688 && code != PLUS && code != MINUS)
9689 return x;
9690
9691 lhs = XEXP (x, 0);
9692 rhs = XEXP (x, 1);
9693
9694 /* If either operand is a primitive we can't do anything, so get out
9695 fast. */
9696 if (OBJECT_P (lhs) || OBJECT_P (rhs))
9697 return x;
9698
9699 lhs = expand_compound_operation (lhs);
9700 rhs = expand_compound_operation (rhs);
9701 inner_code = GET_CODE (lhs);
9702 if (inner_code != GET_CODE (rhs))
9703 return x;
9704
9705 /* See if the inner and outer operations distribute. */
9706 switch (inner_code)
9707 {
9708 case LSHIFTRT:
9709 case ASHIFTRT:
9710 case AND:
9711 case IOR:
9712 /* These all distribute except over PLUS. */
9713 if (code == PLUS || code == MINUS)
9714 return x;
9715 break;
9716
9717 case MULT:
9718 if (code != PLUS && code != MINUS)
9719 return x;
9720 break;
9721
9722 case ASHIFT:
9723 /* This is also a multiply, so it distributes over everything. */
9724 break;
9725
9726 /* This used to handle SUBREG, but this turned out to be counter-
9727 productive, since (subreg (op ...)) usually is not handled by
9728 insn patterns, and this "optimization" therefore transformed
9729 recognizable patterns into unrecognizable ones. Therefore the
9730 SUBREG case was removed from here.
9731
9732 It is possible that distributing SUBREG over arithmetic operations
9733 leads to an intermediate result than can then be optimized further,
9734 e.g. by moving the outer SUBREG to the other side of a SET as done
9735 in simplify_set. This seems to have been the original intent of
9736 handling SUBREGs here.
9737
9738 However, with current GCC this does not appear to actually happen,
9739 at least on major platforms. If some case is found where removing
9740 the SUBREG case here prevents follow-on optimizations, distributing
9741 SUBREGs ought to be re-added at that place, e.g. in simplify_set. */
9742
9743 default:
9744 return x;
9745 }
9746
9747 /* Set LHS and RHS to the inner operands (A and B in the example
9748 above) and set OTHER to the common operand (C in the example).
9749 There is only one way to do this unless the inner operation is
9750 commutative. */
9751 if (COMMUTATIVE_ARITH_P (lhs)
9752 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
9753 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
9754 else if (COMMUTATIVE_ARITH_P (lhs)
9755 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
9756 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
9757 else if (COMMUTATIVE_ARITH_P (lhs)
9758 && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
9759 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
9760 else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
9761 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
9762 else
9763 return x;
9764
9765 /* Form the new inner operation, seeing if it simplifies first. */
9766 tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
9767
9768 /* There is one exception to the general way of distributing:
9769 (a | c) ^ (b | c) -> (a ^ b) & ~c */
9770 if (code == XOR && inner_code == IOR)
9771 {
9772 inner_code = AND;
9773 other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
9774 }
9775
9776 /* We may be able to continuing distributing the result, so call
9777 ourselves recursively on the inner operation before forming the
9778 outer operation, which we return. */
9779 return simplify_gen_binary (inner_code, GET_MODE (x),
9780 apply_distributive_law (tem), other);
9781 }
9782
9783 /* See if X is of the form (* (+ A B) C), and if so convert to
9784 (+ (* A C) (* B C)) and try to simplify.
9785
9786 Most of the time, this results in no change. However, if some of
9787 the operands are the same or inverses of each other, simplifications
9788 will result.
9789
9790 For example, (and (ior A B) (not B)) can occur as the result of
9791 expanding a bit field assignment. When we apply the distributive
9792 law to this, we get (ior (and (A (not B))) (and (B (not B)))),
9793 which then simplifies to (and (A (not B))).
9794
9795 Note that no checks happen on the validity of applying the inverse
9796 distributive law. This is pointless since we can do it in the
9797 few places where this routine is called.
9798
9799 N is the index of the term that is decomposed (the arithmetic operation,
9800 i.e. (+ A B) in the first example above). !N is the index of the term that
9801 is distributed, i.e. of C in the first example above. */
9802 static rtx
9803 distribute_and_simplify_rtx (rtx x, int n)
9804 {
9805 machine_mode mode;
9806 enum rtx_code outer_code, inner_code;
9807 rtx decomposed, distributed, inner_op0, inner_op1, new_op0, new_op1, tmp;
9808
9809 /* Distributivity is not true for floating point as it can change the
9810 value. So we don't do it unless -funsafe-math-optimizations. */
9811 if (FLOAT_MODE_P (GET_MODE (x))
9812 && ! flag_unsafe_math_optimizations)
9813 return NULL_RTX;
9814
9815 decomposed = XEXP (x, n);
9816 if (!ARITHMETIC_P (decomposed))
9817 return NULL_RTX;
9818
9819 mode = GET_MODE (x);
9820 outer_code = GET_CODE (x);
9821 distributed = XEXP (x, !n);
9822
9823 inner_code = GET_CODE (decomposed);
9824 inner_op0 = XEXP (decomposed, 0);
9825 inner_op1 = XEXP (decomposed, 1);
9826
9827 /* Special case (and (xor B C) (not A)), which is equivalent to
9828 (xor (ior A B) (ior A C)) */
9829 if (outer_code == AND && inner_code == XOR && GET_CODE (distributed) == NOT)
9830 {
9831 distributed = XEXP (distributed, 0);
9832 outer_code = IOR;
9833 }
9834
9835 if (n == 0)
9836 {
9837 /* Distribute the second term. */
9838 new_op0 = simplify_gen_binary (outer_code, mode, inner_op0, distributed);
9839 new_op1 = simplify_gen_binary (outer_code, mode, inner_op1, distributed);
9840 }
9841 else
9842 {
9843 /* Distribute the first term. */
9844 new_op0 = simplify_gen_binary (outer_code, mode, distributed, inner_op0);
9845 new_op1 = simplify_gen_binary (outer_code, mode, distributed, inner_op1);
9846 }
9847
9848 tmp = apply_distributive_law (simplify_gen_binary (inner_code, mode,
9849 new_op0, new_op1));
9850 if (GET_CODE (tmp) != outer_code
9851 && (set_src_cost (tmp, mode, optimize_this_for_speed_p)
9852 < set_src_cost (x, mode, optimize_this_for_speed_p)))
9853 return tmp;
9854
9855 return NULL_RTX;
9856 }
9857 \f
9858 /* Simplify a logical `and' of VAROP with the constant CONSTOP, to be done
9859 in MODE. Return an equivalent form, if different from (and VAROP
9860 (const_int CONSTOP)). Otherwise, return NULL_RTX. */
9861
9862 static rtx
9863 simplify_and_const_int_1 (machine_mode mode, rtx varop,
9864 unsigned HOST_WIDE_INT constop)
9865 {
9866 unsigned HOST_WIDE_INT nonzero;
9867 unsigned HOST_WIDE_INT orig_constop;
9868 rtx orig_varop;
9869 int i;
9870
9871 orig_varop = varop;
9872 orig_constop = constop;
9873 if (GET_CODE (varop) == CLOBBER)
9874 return NULL_RTX;
9875
9876 /* Simplify VAROP knowing that we will be only looking at some of the
9877 bits in it.
9878
9879 Note by passing in CONSTOP, we guarantee that the bits not set in
9880 CONSTOP are not significant and will never be examined. We must
9881 ensure that is the case by explicitly masking out those bits
9882 before returning. */
9883 varop = force_to_mode (varop, mode, constop, 0);
9884
9885 /* If VAROP is a CLOBBER, we will fail so return it. */
9886 if (GET_CODE (varop) == CLOBBER)
9887 return varop;
9888
9889 /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
9890 to VAROP and return the new constant. */
9891 if (CONST_INT_P (varop))
9892 return gen_int_mode (INTVAL (varop) & constop, mode);
9893
9894 /* See what bits may be nonzero in VAROP. Unlike the general case of
9895 a call to nonzero_bits, here we don't care about bits outside
9896 MODE. */
9897
9898 nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
9899
9900 /* Turn off all bits in the constant that are known to already be zero.
9901 Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
9902 which is tested below. */
9903
9904 constop &= nonzero;
9905
9906 /* If we don't have any bits left, return zero. */
9907 if (constop == 0)
9908 return const0_rtx;
9909
9910 /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
9911 a power of two, we can replace this with an ASHIFT. */
9912 if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
9913 && (i = exact_log2 (constop)) >= 0)
9914 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
9915
9916 /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
9917 or XOR, then try to apply the distributive law. This may eliminate
9918 operations if either branch can be simplified because of the AND.
9919 It may also make some cases more complex, but those cases probably
9920 won't match a pattern either with or without this. */
9921
9922 if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
9923 return
9924 gen_lowpart
9925 (mode,
9926 apply_distributive_law
9927 (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
9928 simplify_and_const_int (NULL_RTX,
9929 GET_MODE (varop),
9930 XEXP (varop, 0),
9931 constop),
9932 simplify_and_const_int (NULL_RTX,
9933 GET_MODE (varop),
9934 XEXP (varop, 1),
9935 constop))));
9936
9937 /* If VAROP is PLUS, and the constant is a mask of low bits, distribute
9938 the AND and see if one of the operands simplifies to zero. If so, we
9939 may eliminate it. */
9940
9941 if (GET_CODE (varop) == PLUS
9942 && pow2p_hwi (constop + 1))
9943 {
9944 rtx o0, o1;
9945
9946 o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
9947 o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
9948 if (o0 == const0_rtx)
9949 return o1;
9950 if (o1 == const0_rtx)
9951 return o0;
9952 }
9953
9954 /* Make a SUBREG if necessary. If we can't make it, fail. */
9955 varop = gen_lowpart (mode, varop);
9956 if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
9957 return NULL_RTX;
9958
9959 /* If we are only masking insignificant bits, return VAROP. */
9960 if (constop == nonzero)
9961 return varop;
9962
9963 if (varop == orig_varop && constop == orig_constop)
9964 return NULL_RTX;
9965
9966 /* Otherwise, return an AND. */
9967 return simplify_gen_binary (AND, mode, varop, gen_int_mode (constop, mode));
9968 }
9969
9970
9971 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
9972 in MODE.
9973
9974 Return an equivalent form, if different from X. Otherwise, return X. If
9975 X is zero, we are to always construct the equivalent form. */
9976
9977 static rtx
9978 simplify_and_const_int (rtx x, machine_mode mode, rtx varop,
9979 unsigned HOST_WIDE_INT constop)
9980 {
9981 rtx tem = simplify_and_const_int_1 (mode, varop, constop);
9982 if (tem)
9983 return tem;
9984
9985 if (!x)
9986 x = simplify_gen_binary (AND, GET_MODE (varop), varop,
9987 gen_int_mode (constop, mode));
9988 if (GET_MODE (x) != mode)
9989 x = gen_lowpart (mode, x);
9990 return x;
9991 }
9992 \f
9993 /* Given a REG, X, compute which bits in X can be nonzero.
9994 We don't care about bits outside of those defined in MODE.
9995
9996 For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
9997 a shift, AND, or zero_extract, we can do better. */
9998
9999 static rtx
10000 reg_nonzero_bits_for_combine (const_rtx x, machine_mode mode,
10001 const_rtx known_x ATTRIBUTE_UNUSED,
10002 machine_mode known_mode ATTRIBUTE_UNUSED,
10003 unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
10004 unsigned HOST_WIDE_INT *nonzero)
10005 {
10006 rtx tem;
10007 reg_stat_type *rsp;
10008
10009 /* If X is a register whose nonzero bits value is current, use it.
10010 Otherwise, if X is a register whose value we can find, use that
10011 value. Otherwise, use the previously-computed global nonzero bits
10012 for this register. */
10013
10014 rsp = &reg_stat[REGNO (x)];
10015 if (rsp->last_set_value != 0
10016 && (rsp->last_set_mode == mode
10017 || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
10018 && GET_MODE_CLASS (mode) == MODE_INT))
10019 && ((rsp->last_set_label >= label_tick_ebb_start
10020 && rsp->last_set_label < label_tick)
10021 || (rsp->last_set_label == label_tick
10022 && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
10023 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
10024 && REGNO (x) < reg_n_sets_max
10025 && REG_N_SETS (REGNO (x)) == 1
10026 && !REGNO_REG_SET_P
10027 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
10028 REGNO (x)))))
10029 {
10030 /* Note that, even if the precision of last_set_mode is lower than that
10031 of mode, record_value_for_reg invoked nonzero_bits on the register
10032 with nonzero_bits_mode (because last_set_mode is necessarily integral
10033 and HWI_COMPUTABLE_MODE_P in this case) so bits in nonzero_bits_mode
10034 are all valid, hence in mode too since nonzero_bits_mode is defined
10035 to the largest HWI_COMPUTABLE_MODE_P mode. */
10036 *nonzero &= rsp->last_set_nonzero_bits;
10037 return NULL;
10038 }
10039
10040 tem = get_last_value (x);
10041 if (tem)
10042 {
10043 if (SHORT_IMMEDIATES_SIGN_EXTEND)
10044 tem = sign_extend_short_imm (tem, GET_MODE (x),
10045 GET_MODE_PRECISION (mode));
10046
10047 return tem;
10048 }
10049
10050 if (nonzero_sign_valid && rsp->nonzero_bits)
10051 {
10052 unsigned HOST_WIDE_INT mask = rsp->nonzero_bits;
10053
10054 if (GET_MODE_PRECISION (GET_MODE (x)) < GET_MODE_PRECISION (mode))
10055 /* We don't know anything about the upper bits. */
10056 mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
10057
10058 *nonzero &= mask;
10059 }
10060
10061 return NULL;
10062 }
10063
10064 /* Return the number of bits at the high-order end of X that are known to
10065 be equal to the sign bit. X will be used in mode MODE; if MODE is
10066 VOIDmode, X will be used in its own mode. The returned value will always
10067 be between 1 and the number of bits in MODE. */
10068
10069 static rtx
10070 reg_num_sign_bit_copies_for_combine (const_rtx x, machine_mode mode,
10071 const_rtx known_x ATTRIBUTE_UNUSED,
10072 machine_mode known_mode
10073 ATTRIBUTE_UNUSED,
10074 unsigned int known_ret ATTRIBUTE_UNUSED,
10075 unsigned int *result)
10076 {
10077 rtx tem;
10078 reg_stat_type *rsp;
10079
10080 rsp = &reg_stat[REGNO (x)];
10081 if (rsp->last_set_value != 0
10082 && rsp->last_set_mode == mode
10083 && ((rsp->last_set_label >= label_tick_ebb_start
10084 && rsp->last_set_label < label_tick)
10085 || (rsp->last_set_label == label_tick
10086 && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
10087 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
10088 && REGNO (x) < reg_n_sets_max
10089 && REG_N_SETS (REGNO (x)) == 1
10090 && !REGNO_REG_SET_P
10091 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
10092 REGNO (x)))))
10093 {
10094 *result = rsp->last_set_sign_bit_copies;
10095 return NULL;
10096 }
10097
10098 tem = get_last_value (x);
10099 if (tem != 0)
10100 return tem;
10101
10102 if (nonzero_sign_valid && rsp->sign_bit_copies != 0
10103 && GET_MODE_PRECISION (GET_MODE (x)) == GET_MODE_PRECISION (mode))
10104 *result = rsp->sign_bit_copies;
10105
10106 return NULL;
10107 }
10108 \f
10109 /* Return the number of "extended" bits there are in X, when interpreted
10110 as a quantity in MODE whose signedness is indicated by UNSIGNEDP. For
10111 unsigned quantities, this is the number of high-order zero bits.
10112 For signed quantities, this is the number of copies of the sign bit
10113 minus 1. In both case, this function returns the number of "spare"
10114 bits. For example, if two quantities for which this function returns
10115 at least 1 are added, the addition is known not to overflow.
10116
10117 This function will always return 0 unless called during combine, which
10118 implies that it must be called from a define_split. */
10119
10120 unsigned int
10121 extended_count (const_rtx x, machine_mode mode, int unsignedp)
10122 {
10123 if (nonzero_sign_valid == 0)
10124 return 0;
10125
10126 scalar_int_mode int_mode;
10127 return (unsignedp
10128 ? (is_a <scalar_int_mode> (mode, &int_mode)
10129 && HWI_COMPUTABLE_MODE_P (int_mode)
10130 ? (unsigned int) (GET_MODE_PRECISION (int_mode) - 1
10131 - floor_log2 (nonzero_bits (x, int_mode)))
10132 : 0)
10133 : num_sign_bit_copies (x, mode) - 1);
10134 }
10135
10136 /* This function is called from `simplify_shift_const' to merge two
10137 outer operations. Specifically, we have already found that we need
10138 to perform operation *POP0 with constant *PCONST0 at the outermost
10139 position. We would now like to also perform OP1 with constant CONST1
10140 (with *POP0 being done last).
10141
10142 Return 1 if we can do the operation and update *POP0 and *PCONST0 with
10143 the resulting operation. *PCOMP_P is set to 1 if we would need to
10144 complement the innermost operand, otherwise it is unchanged.
10145
10146 MODE is the mode in which the operation will be done. No bits outside
10147 the width of this mode matter. It is assumed that the width of this mode
10148 is smaller than or equal to HOST_BITS_PER_WIDE_INT.
10149
10150 If *POP0 or OP1 are UNKNOWN, it means no operation is required. Only NEG, PLUS,
10151 IOR, XOR, and AND are supported. We may set *POP0 to SET if the proper
10152 result is simply *PCONST0.
10153
10154 If the resulting operation cannot be expressed as one operation, we
10155 return 0 and do not change *POP0, *PCONST0, and *PCOMP_P. */
10156
10157 static int
10158 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)
10159 {
10160 enum rtx_code op0 = *pop0;
10161 HOST_WIDE_INT const0 = *pconst0;
10162
10163 const0 &= GET_MODE_MASK (mode);
10164 const1 &= GET_MODE_MASK (mode);
10165
10166 /* If OP0 is an AND, clear unimportant bits in CONST1. */
10167 if (op0 == AND)
10168 const1 &= const0;
10169
10170 /* If OP0 or OP1 is UNKNOWN, this is easy. Similarly if they are the same or
10171 if OP0 is SET. */
10172
10173 if (op1 == UNKNOWN || op0 == SET)
10174 return 1;
10175
10176 else if (op0 == UNKNOWN)
10177 op0 = op1, const0 = const1;
10178
10179 else if (op0 == op1)
10180 {
10181 switch (op0)
10182 {
10183 case AND:
10184 const0 &= const1;
10185 break;
10186 case IOR:
10187 const0 |= const1;
10188 break;
10189 case XOR:
10190 const0 ^= const1;
10191 break;
10192 case PLUS:
10193 const0 += const1;
10194 break;
10195 case NEG:
10196 op0 = UNKNOWN;
10197 break;
10198 default:
10199 break;
10200 }
10201 }
10202
10203 /* Otherwise, if either is a PLUS or NEG, we can't do anything. */
10204 else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
10205 return 0;
10206
10207 /* If the two constants aren't the same, we can't do anything. The
10208 remaining six cases can all be done. */
10209 else if (const0 != const1)
10210 return 0;
10211
10212 else
10213 switch (op0)
10214 {
10215 case IOR:
10216 if (op1 == AND)
10217 /* (a & b) | b == b */
10218 op0 = SET;
10219 else /* op1 == XOR */
10220 /* (a ^ b) | b == a | b */
10221 {;}
10222 break;
10223
10224 case XOR:
10225 if (op1 == AND)
10226 /* (a & b) ^ b == (~a) & b */
10227 op0 = AND, *pcomp_p = 1;
10228 else /* op1 == IOR */
10229 /* (a | b) ^ b == a & ~b */
10230 op0 = AND, const0 = ~const0;
10231 break;
10232
10233 case AND:
10234 if (op1 == IOR)
10235 /* (a | b) & b == b */
10236 op0 = SET;
10237 else /* op1 == XOR */
10238 /* (a ^ b) & b) == (~a) & b */
10239 *pcomp_p = 1;
10240 break;
10241 default:
10242 break;
10243 }
10244
10245 /* Check for NO-OP cases. */
10246 const0 &= GET_MODE_MASK (mode);
10247 if (const0 == 0
10248 && (op0 == IOR || op0 == XOR || op0 == PLUS))
10249 op0 = UNKNOWN;
10250 else if (const0 == 0 && op0 == AND)
10251 op0 = SET;
10252 else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
10253 && op0 == AND)
10254 op0 = UNKNOWN;
10255
10256 *pop0 = op0;
10257
10258 /* ??? Slightly redundant with the above mask, but not entirely.
10259 Moving this above means we'd have to sign-extend the mode mask
10260 for the final test. */
10261 if (op0 != UNKNOWN && op0 != NEG)
10262 *pconst0 = trunc_int_for_mode (const0, mode);
10263
10264 return 1;
10265 }
10266 \f
10267 /* A helper to simplify_shift_const_1 to determine the mode we can perform
10268 the shift in. The original shift operation CODE is performed on OP in
10269 ORIG_MODE. Return the wider mode MODE if we can perform the operation
10270 in that mode. Return ORIG_MODE otherwise. We can also assume that the
10271 result of the shift is subject to operation OUTER_CODE with operand
10272 OUTER_CONST. */
10273
10274 static machine_mode
10275 try_widen_shift_mode (enum rtx_code code, rtx op, int count,
10276 machine_mode orig_mode, machine_mode mode,
10277 enum rtx_code outer_code, HOST_WIDE_INT outer_const)
10278 {
10279 if (orig_mode == mode)
10280 return mode;
10281 gcc_assert (GET_MODE_PRECISION (mode) > GET_MODE_PRECISION (orig_mode));
10282
10283 /* In general we can't perform in wider mode for right shift and rotate. */
10284 switch (code)
10285 {
10286 case ASHIFTRT:
10287 /* We can still widen if the bits brought in from the left are identical
10288 to the sign bit of ORIG_MODE. */
10289 if (num_sign_bit_copies (op, mode)
10290 > (unsigned) (GET_MODE_PRECISION (mode)
10291 - GET_MODE_PRECISION (orig_mode)))
10292 return mode;
10293 return orig_mode;
10294
10295 case LSHIFTRT:
10296 /* Similarly here but with zero bits. */
10297 if (HWI_COMPUTABLE_MODE_P (mode)
10298 && (nonzero_bits (op, mode) & ~GET_MODE_MASK (orig_mode)) == 0)
10299 return mode;
10300
10301 /* We can also widen if the bits brought in will be masked off. This
10302 operation is performed in ORIG_MODE. */
10303 if (outer_code == AND)
10304 {
10305 int care_bits = low_bitmask_len (orig_mode, outer_const);
10306
10307 if (care_bits >= 0
10308 && GET_MODE_PRECISION (orig_mode) - care_bits >= count)
10309 return mode;
10310 }
10311 /* fall through */
10312
10313 case ROTATE:
10314 return orig_mode;
10315
10316 case ROTATERT:
10317 gcc_unreachable ();
10318
10319 default:
10320 return mode;
10321 }
10322 }
10323
10324 /* Simplify a shift of VAROP by ORIG_COUNT bits. CODE says what kind
10325 of shift. The result of the shift is RESULT_MODE. Return NULL_RTX
10326 if we cannot simplify it. Otherwise, return a simplified value.
10327
10328 The shift is normally computed in the widest mode we find in VAROP, as
10329 long as it isn't a different number of words than RESULT_MODE. Exceptions
10330 are ASHIFTRT and ROTATE, which are always done in their original mode. */
10331
10332 static rtx
10333 simplify_shift_const_1 (enum rtx_code code, machine_mode result_mode,
10334 rtx varop, int orig_count)
10335 {
10336 enum rtx_code orig_code = code;
10337 rtx orig_varop = varop;
10338 int count;
10339 machine_mode mode = result_mode;
10340 machine_mode shift_mode;
10341 scalar_int_mode tmode, inner_mode;
10342 unsigned int mode_words
10343 = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
10344 /* We form (outer_op (code varop count) (outer_const)). */
10345 enum rtx_code outer_op = UNKNOWN;
10346 HOST_WIDE_INT outer_const = 0;
10347 int complement_p = 0;
10348 rtx new_rtx, x;
10349
10350 /* Make sure and truncate the "natural" shift on the way in. We don't
10351 want to do this inside the loop as it makes it more difficult to
10352 combine shifts. */
10353 if (SHIFT_COUNT_TRUNCATED)
10354 orig_count &= GET_MODE_UNIT_BITSIZE (mode) - 1;
10355
10356 /* If we were given an invalid count, don't do anything except exactly
10357 what was requested. */
10358
10359 if (orig_count < 0 || orig_count >= (int) GET_MODE_UNIT_PRECISION (mode))
10360 return NULL_RTX;
10361
10362 count = orig_count;
10363
10364 /* Unless one of the branches of the `if' in this loop does a `continue',
10365 we will `break' the loop after the `if'. */
10366
10367 while (count != 0)
10368 {
10369 /* If we have an operand of (clobber (const_int 0)), fail. */
10370 if (GET_CODE (varop) == CLOBBER)
10371 return NULL_RTX;
10372
10373 /* Convert ROTATERT to ROTATE. */
10374 if (code == ROTATERT)
10375 {
10376 unsigned int bitsize = GET_MODE_UNIT_PRECISION (result_mode);
10377 code = ROTATE;
10378 count = bitsize - count;
10379 }
10380
10381 shift_mode = try_widen_shift_mode (code, varop, count, result_mode,
10382 mode, outer_op, outer_const);
10383 machine_mode shift_unit_mode = GET_MODE_INNER (shift_mode);
10384
10385 /* Handle cases where the count is greater than the size of the mode
10386 minus 1. For ASHIFT, use the size minus one as the count (this can
10387 occur when simplifying (lshiftrt (ashiftrt ..))). For rotates,
10388 take the count modulo the size. For other shifts, the result is
10389 zero.
10390
10391 Since these shifts are being produced by the compiler by combining
10392 multiple operations, each of which are defined, we know what the
10393 result is supposed to be. */
10394
10395 if (count > (GET_MODE_PRECISION (shift_unit_mode) - 1))
10396 {
10397 if (code == ASHIFTRT)
10398 count = GET_MODE_PRECISION (shift_unit_mode) - 1;
10399 else if (code == ROTATE || code == ROTATERT)
10400 count %= GET_MODE_PRECISION (shift_unit_mode);
10401 else
10402 {
10403 /* We can't simply return zero because there may be an
10404 outer op. */
10405 varop = const0_rtx;
10406 count = 0;
10407 break;
10408 }
10409 }
10410
10411 /* If we discovered we had to complement VAROP, leave. Making a NOT
10412 here would cause an infinite loop. */
10413 if (complement_p)
10414 break;
10415
10416 if (shift_mode == shift_unit_mode)
10417 {
10418 /* An arithmetic right shift of a quantity known to be -1 or 0
10419 is a no-op. */
10420 if (code == ASHIFTRT
10421 && (num_sign_bit_copies (varop, shift_unit_mode)
10422 == GET_MODE_PRECISION (shift_unit_mode)))
10423 {
10424 count = 0;
10425 break;
10426 }
10427
10428 /* If we are doing an arithmetic right shift and discarding all but
10429 the sign bit copies, this is equivalent to doing a shift by the
10430 bitsize minus one. Convert it into that shift because it will
10431 often allow other simplifications. */
10432
10433 if (code == ASHIFTRT
10434 && (count + num_sign_bit_copies (varop, shift_unit_mode)
10435 >= GET_MODE_PRECISION (shift_unit_mode)))
10436 count = GET_MODE_PRECISION (shift_unit_mode) - 1;
10437
10438 /* We simplify the tests below and elsewhere by converting
10439 ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
10440 `make_compound_operation' will convert it to an ASHIFTRT for
10441 those machines (such as VAX) that don't have an LSHIFTRT. */
10442 if (code == ASHIFTRT
10443 && HWI_COMPUTABLE_MODE_P (shift_unit_mode)
10444 && val_signbit_known_clear_p (shift_unit_mode,
10445 nonzero_bits (varop,
10446 shift_unit_mode)))
10447 code = LSHIFTRT;
10448
10449 if (((code == LSHIFTRT
10450 && HWI_COMPUTABLE_MODE_P (shift_unit_mode)
10451 && !(nonzero_bits (varop, shift_unit_mode) >> count))
10452 || (code == ASHIFT
10453 && HWI_COMPUTABLE_MODE_P (shift_unit_mode)
10454 && !((nonzero_bits (varop, shift_unit_mode) << count)
10455 & GET_MODE_MASK (shift_unit_mode))))
10456 && !side_effects_p (varop))
10457 varop = const0_rtx;
10458 }
10459
10460 switch (GET_CODE (varop))
10461 {
10462 case SIGN_EXTEND:
10463 case ZERO_EXTEND:
10464 case SIGN_EXTRACT:
10465 case ZERO_EXTRACT:
10466 new_rtx = expand_compound_operation (varop);
10467 if (new_rtx != varop)
10468 {
10469 varop = new_rtx;
10470 continue;
10471 }
10472 break;
10473
10474 case MEM:
10475 /* The following rules apply only to scalars. */
10476 if (shift_mode != shift_unit_mode)
10477 break;
10478
10479 /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
10480 minus the width of a smaller mode, we can do this with a
10481 SIGN_EXTEND or ZERO_EXTEND from the narrower memory location. */
10482 if ((code == ASHIFTRT || code == LSHIFTRT)
10483 && ! mode_dependent_address_p (XEXP (varop, 0),
10484 MEM_ADDR_SPACE (varop))
10485 && ! MEM_VOLATILE_P (varop)
10486 && (int_mode_for_size (GET_MODE_BITSIZE (mode) - count, 1)
10487 .exists (&tmode)))
10488 {
10489 new_rtx = adjust_address_nv (varop, tmode,
10490 BYTES_BIG_ENDIAN ? 0
10491 : count / BITS_PER_UNIT);
10492
10493 varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
10494 : ZERO_EXTEND, mode, new_rtx);
10495 count = 0;
10496 continue;
10497 }
10498 break;
10499
10500 case SUBREG:
10501 /* The following rules apply only to scalars. */
10502 if (shift_mode != shift_unit_mode)
10503 break;
10504
10505 /* If VAROP is a SUBREG, strip it as long as the inner operand has
10506 the same number of words as what we've seen so far. Then store
10507 the widest mode in MODE. */
10508 if (subreg_lowpart_p (varop)
10509 && is_int_mode (GET_MODE (SUBREG_REG (varop)), &inner_mode)
10510 && GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (GET_MODE (varop))
10511 && (unsigned int) ((GET_MODE_SIZE (inner_mode)
10512 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
10513 == mode_words
10514 && GET_MODE_CLASS (GET_MODE (varop)) == MODE_INT)
10515 {
10516 varop = SUBREG_REG (varop);
10517 if (GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (mode))
10518 mode = inner_mode;
10519 continue;
10520 }
10521 break;
10522
10523 case MULT:
10524 /* Some machines use MULT instead of ASHIFT because MULT
10525 is cheaper. But it is still better on those machines to
10526 merge two shifts into one. */
10527 if (CONST_INT_P (XEXP (varop, 1))
10528 && exact_log2 (UINTVAL (XEXP (varop, 1))) >= 0)
10529 {
10530 varop
10531 = simplify_gen_binary (ASHIFT, GET_MODE (varop),
10532 XEXP (varop, 0),
10533 GEN_INT (exact_log2 (
10534 UINTVAL (XEXP (varop, 1)))));
10535 continue;
10536 }
10537 break;
10538
10539 case UDIV:
10540 /* Similar, for when divides are cheaper. */
10541 if (CONST_INT_P (XEXP (varop, 1))
10542 && exact_log2 (UINTVAL (XEXP (varop, 1))) >= 0)
10543 {
10544 varop
10545 = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
10546 XEXP (varop, 0),
10547 GEN_INT (exact_log2 (
10548 UINTVAL (XEXP (varop, 1)))));
10549 continue;
10550 }
10551 break;
10552
10553 case ASHIFTRT:
10554 /* If we are extracting just the sign bit of an arithmetic
10555 right shift, that shift is not needed. However, the sign
10556 bit of a wider mode may be different from what would be
10557 interpreted as the sign bit in a narrower mode, so, if
10558 the result is narrower, don't discard the shift. */
10559 if (code == LSHIFTRT
10560 && count == (GET_MODE_UNIT_BITSIZE (result_mode) - 1)
10561 && (GET_MODE_UNIT_BITSIZE (result_mode)
10562 >= GET_MODE_UNIT_BITSIZE (GET_MODE (varop))))
10563 {
10564 varop = XEXP (varop, 0);
10565 continue;
10566 }
10567
10568 /* fall through */
10569
10570 case LSHIFTRT:
10571 case ASHIFT:
10572 case ROTATE:
10573 /* The following rules apply only to scalars. */
10574 if (shift_mode != shift_unit_mode)
10575 break;
10576
10577 /* Here we have two nested shifts. The result is usually the
10578 AND of a new shift with a mask. We compute the result below. */
10579 if (CONST_INT_P (XEXP (varop, 1))
10580 && INTVAL (XEXP (varop, 1)) >= 0
10581 && INTVAL (XEXP (varop, 1)) < GET_MODE_PRECISION (GET_MODE (varop))
10582 && HWI_COMPUTABLE_MODE_P (result_mode)
10583 && HWI_COMPUTABLE_MODE_P (mode))
10584 {
10585 enum rtx_code first_code = GET_CODE (varop);
10586 unsigned int first_count = INTVAL (XEXP (varop, 1));
10587 unsigned HOST_WIDE_INT mask;
10588 rtx mask_rtx;
10589
10590 /* We have one common special case. We can't do any merging if
10591 the inner code is an ASHIFTRT of a smaller mode. However, if
10592 we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
10593 with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
10594 we can convert it to
10595 (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0) C3) C2) C1).
10596 This simplifies certain SIGN_EXTEND operations. */
10597 if (code == ASHIFT && first_code == ASHIFTRT
10598 && count == (GET_MODE_PRECISION (result_mode)
10599 - GET_MODE_PRECISION (GET_MODE (varop))))
10600 {
10601 /* C3 has the low-order C1 bits zero. */
10602
10603 mask = GET_MODE_MASK (mode)
10604 & ~((HOST_WIDE_INT_1U << first_count) - 1);
10605
10606 varop = simplify_and_const_int (NULL_RTX, result_mode,
10607 XEXP (varop, 0), mask);
10608 varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
10609 varop, count);
10610 count = first_count;
10611 code = ASHIFTRT;
10612 continue;
10613 }
10614
10615 /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
10616 than C1 high-order bits equal to the sign bit, we can convert
10617 this to either an ASHIFT or an ASHIFTRT depending on the
10618 two counts.
10619
10620 We cannot do this if VAROP's mode is not SHIFT_MODE. */
10621
10622 if (code == ASHIFTRT && first_code == ASHIFT
10623 && GET_MODE (varop) == shift_mode
10624 && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
10625 > first_count))
10626 {
10627 varop = XEXP (varop, 0);
10628 count -= first_count;
10629 if (count < 0)
10630 {
10631 count = -count;
10632 code = ASHIFT;
10633 }
10634
10635 continue;
10636 }
10637
10638 /* There are some cases we can't do. If CODE is ASHIFTRT,
10639 we can only do this if FIRST_CODE is also ASHIFTRT.
10640
10641 We can't do the case when CODE is ROTATE and FIRST_CODE is
10642 ASHIFTRT.
10643
10644 If the mode of this shift is not the mode of the outer shift,
10645 we can't do this if either shift is a right shift or ROTATE.
10646
10647 Finally, we can't do any of these if the mode is too wide
10648 unless the codes are the same.
10649
10650 Handle the case where the shift codes are the same
10651 first. */
10652
10653 if (code == first_code)
10654 {
10655 if (GET_MODE (varop) != result_mode
10656 && (code == ASHIFTRT || code == LSHIFTRT
10657 || code == ROTATE))
10658 break;
10659
10660 count += first_count;
10661 varop = XEXP (varop, 0);
10662 continue;
10663 }
10664
10665 if (code == ASHIFTRT
10666 || (code == ROTATE && first_code == ASHIFTRT)
10667 || GET_MODE_PRECISION (mode) > HOST_BITS_PER_WIDE_INT
10668 || (GET_MODE (varop) != result_mode
10669 && (first_code == ASHIFTRT || first_code == LSHIFTRT
10670 || first_code == ROTATE
10671 || code == ROTATE)))
10672 break;
10673
10674 /* To compute the mask to apply after the shift, shift the
10675 nonzero bits of the inner shift the same way the
10676 outer shift will. */
10677
10678 mask_rtx = gen_int_mode (nonzero_bits (varop, GET_MODE (varop)),
10679 result_mode);
10680
10681 mask_rtx
10682 = simplify_const_binary_operation (code, result_mode, mask_rtx,
10683 GEN_INT (count));
10684
10685 /* Give up if we can't compute an outer operation to use. */
10686 if (mask_rtx == 0
10687 || !CONST_INT_P (mask_rtx)
10688 || ! merge_outer_ops (&outer_op, &outer_const, AND,
10689 INTVAL (mask_rtx),
10690 result_mode, &complement_p))
10691 break;
10692
10693 /* If the shifts are in the same direction, we add the
10694 counts. Otherwise, we subtract them. */
10695 if ((code == ASHIFTRT || code == LSHIFTRT)
10696 == (first_code == ASHIFTRT || first_code == LSHIFTRT))
10697 count += first_count;
10698 else
10699 count -= first_count;
10700
10701 /* If COUNT is positive, the new shift is usually CODE,
10702 except for the two exceptions below, in which case it is
10703 FIRST_CODE. If the count is negative, FIRST_CODE should
10704 always be used */
10705 if (count > 0
10706 && ((first_code == ROTATE && code == ASHIFT)
10707 || (first_code == ASHIFTRT && code == LSHIFTRT)))
10708 code = first_code;
10709 else if (count < 0)
10710 code = first_code, count = -count;
10711
10712 varop = XEXP (varop, 0);
10713 continue;
10714 }
10715
10716 /* If we have (A << B << C) for any shift, we can convert this to
10717 (A << C << B). This wins if A is a constant. Only try this if
10718 B is not a constant. */
10719
10720 else if (GET_CODE (varop) == code
10721 && CONST_INT_P (XEXP (varop, 0))
10722 && !CONST_INT_P (XEXP (varop, 1)))
10723 {
10724 /* For ((unsigned) (cstULL >> count)) >> cst2 we have to make
10725 sure the result will be masked. See PR70222. */
10726 if (code == LSHIFTRT
10727 && mode != result_mode
10728 && !merge_outer_ops (&outer_op, &outer_const, AND,
10729 GET_MODE_MASK (result_mode)
10730 >> orig_count, result_mode,
10731 &complement_p))
10732 break;
10733 /* For ((int) (cstLL >> count)) >> cst2 just give up. Queuing
10734 up outer sign extension (often left and right shift) is
10735 hardly more efficient than the original. See PR70429. */
10736 if (code == ASHIFTRT && mode != result_mode)
10737 break;
10738
10739 rtx new_rtx = simplify_const_binary_operation (code, mode,
10740 XEXP (varop, 0),
10741 GEN_INT (count));
10742 varop = gen_rtx_fmt_ee (code, mode, new_rtx, XEXP (varop, 1));
10743 count = 0;
10744 continue;
10745 }
10746 break;
10747
10748 case NOT:
10749 /* The following rules apply only to scalars. */
10750 if (shift_mode != shift_unit_mode)
10751 break;
10752
10753 /* Make this fit the case below. */
10754 varop = gen_rtx_XOR (mode, XEXP (varop, 0), constm1_rtx);
10755 continue;
10756
10757 case IOR:
10758 case AND:
10759 case XOR:
10760 /* The following rules apply only to scalars. */
10761 if (shift_mode != shift_unit_mode)
10762 break;
10763
10764 /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
10765 with C the size of VAROP - 1 and the shift is logical if
10766 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
10767 we have an (le X 0) operation. If we have an arithmetic shift
10768 and STORE_FLAG_VALUE is 1 or we have a logical shift with
10769 STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation. */
10770
10771 if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
10772 && XEXP (XEXP (varop, 0), 1) == constm1_rtx
10773 && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
10774 && (code == LSHIFTRT || code == ASHIFTRT)
10775 && count == (GET_MODE_PRECISION (GET_MODE (varop)) - 1)
10776 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
10777 {
10778 count = 0;
10779 varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
10780 const0_rtx);
10781
10782 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
10783 varop = gen_rtx_NEG (GET_MODE (varop), varop);
10784
10785 continue;
10786 }
10787
10788 /* If we have (shift (logical)), move the logical to the outside
10789 to allow it to possibly combine with another logical and the
10790 shift to combine with another shift. This also canonicalizes to
10791 what a ZERO_EXTRACT looks like. Also, some machines have
10792 (and (shift)) insns. */
10793
10794 if (CONST_INT_P (XEXP (varop, 1))
10795 /* We can't do this if we have (ashiftrt (xor)) and the
10796 constant has its sign bit set in shift_mode with shift_mode
10797 wider than result_mode. */
10798 && !(code == ASHIFTRT && GET_CODE (varop) == XOR
10799 && result_mode != shift_mode
10800 && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
10801 shift_mode))
10802 && (new_rtx = simplify_const_binary_operation
10803 (code, result_mode,
10804 gen_int_mode (INTVAL (XEXP (varop, 1)), result_mode),
10805 GEN_INT (count))) != 0
10806 && CONST_INT_P (new_rtx)
10807 && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
10808 INTVAL (new_rtx), result_mode, &complement_p))
10809 {
10810 varop = XEXP (varop, 0);
10811 continue;
10812 }
10813
10814 /* If we can't do that, try to simplify the shift in each arm of the
10815 logical expression, make a new logical expression, and apply
10816 the inverse distributive law. This also can't be done for
10817 (ashiftrt (xor)) where we've widened the shift and the constant
10818 changes the sign bit. */
10819 if (CONST_INT_P (XEXP (varop, 1))
10820 && !(code == ASHIFTRT && GET_CODE (varop) == XOR
10821 && result_mode != shift_mode
10822 && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
10823 shift_mode)))
10824 {
10825 rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
10826 XEXP (varop, 0), count);
10827 rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
10828 XEXP (varop, 1), count);
10829
10830 varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
10831 lhs, rhs);
10832 varop = apply_distributive_law (varop);
10833
10834 count = 0;
10835 continue;
10836 }
10837 break;
10838
10839 case EQ:
10840 /* The following rules apply only to scalars. */
10841 if (shift_mode != shift_unit_mode)
10842 break;
10843
10844 /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
10845 says that the sign bit can be tested, FOO has mode MODE, C is
10846 GET_MODE_PRECISION (MODE) - 1, and FOO has only its low-order bit
10847 that may be nonzero. */
10848 if (code == LSHIFTRT
10849 && XEXP (varop, 1) == const0_rtx
10850 && GET_MODE (XEXP (varop, 0)) == result_mode
10851 && count == (GET_MODE_PRECISION (result_mode) - 1)
10852 && HWI_COMPUTABLE_MODE_P (result_mode)
10853 && STORE_FLAG_VALUE == -1
10854 && nonzero_bits (XEXP (varop, 0), result_mode) == 1
10855 && merge_outer_ops (&outer_op, &outer_const, XOR, 1, result_mode,
10856 &complement_p))
10857 {
10858 varop = XEXP (varop, 0);
10859 count = 0;
10860 continue;
10861 }
10862 break;
10863
10864 case NEG:
10865 /* The following rules apply only to scalars. */
10866 if (shift_mode != shift_unit_mode)
10867 break;
10868
10869 /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
10870 than the number of bits in the mode is equivalent to A. */
10871 if (code == LSHIFTRT
10872 && count == (GET_MODE_PRECISION (result_mode) - 1)
10873 && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
10874 {
10875 varop = XEXP (varop, 0);
10876 count = 0;
10877 continue;
10878 }
10879
10880 /* NEG commutes with ASHIFT since it is multiplication. Move the
10881 NEG outside to allow shifts to combine. */
10882 if (code == ASHIFT
10883 && merge_outer_ops (&outer_op, &outer_const, NEG, 0, result_mode,
10884 &complement_p))
10885 {
10886 varop = XEXP (varop, 0);
10887 continue;
10888 }
10889 break;
10890
10891 case PLUS:
10892 /* The following rules apply only to scalars. */
10893 if (shift_mode != shift_unit_mode)
10894 break;
10895
10896 /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
10897 is one less than the number of bits in the mode is
10898 equivalent to (xor A 1). */
10899 if (code == LSHIFTRT
10900 && count == (GET_MODE_PRECISION (result_mode) - 1)
10901 && XEXP (varop, 1) == constm1_rtx
10902 && nonzero_bits (XEXP (varop, 0), result_mode) == 1
10903 && merge_outer_ops (&outer_op, &outer_const, XOR, 1, result_mode,
10904 &complement_p))
10905 {
10906 count = 0;
10907 varop = XEXP (varop, 0);
10908 continue;
10909 }
10910
10911 /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
10912 that might be nonzero in BAR are those being shifted out and those
10913 bits are known zero in FOO, we can replace the PLUS with FOO.
10914 Similarly in the other operand order. This code occurs when
10915 we are computing the size of a variable-size array. */
10916
10917 if ((code == ASHIFTRT || code == LSHIFTRT)
10918 && count < HOST_BITS_PER_WIDE_INT
10919 && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
10920 && (nonzero_bits (XEXP (varop, 1), result_mode)
10921 & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
10922 {
10923 varop = XEXP (varop, 0);
10924 continue;
10925 }
10926 else if ((code == ASHIFTRT || code == LSHIFTRT)
10927 && count < HOST_BITS_PER_WIDE_INT
10928 && HWI_COMPUTABLE_MODE_P (result_mode)
10929 && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
10930 >> count)
10931 && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
10932 & nonzero_bits (XEXP (varop, 1),
10933 result_mode)))
10934 {
10935 varop = XEXP (varop, 1);
10936 continue;
10937 }
10938
10939 /* (ashift (plus foo C) N) is (plus (ashift foo N) C'). */
10940 if (code == ASHIFT
10941 && CONST_INT_P (XEXP (varop, 1))
10942 && (new_rtx = simplify_const_binary_operation
10943 (ASHIFT, result_mode,
10944 gen_int_mode (INTVAL (XEXP (varop, 1)), result_mode),
10945 GEN_INT (count))) != 0
10946 && CONST_INT_P (new_rtx)
10947 && merge_outer_ops (&outer_op, &outer_const, PLUS,
10948 INTVAL (new_rtx), result_mode, &complement_p))
10949 {
10950 varop = XEXP (varop, 0);
10951 continue;
10952 }
10953
10954 /* Check for 'PLUS signbit', which is the canonical form of 'XOR
10955 signbit', and attempt to change the PLUS to an XOR and move it to
10956 the outer operation as is done above in the AND/IOR/XOR case
10957 leg for shift(logical). See details in logical handling above
10958 for reasoning in doing so. */
10959 if (code == LSHIFTRT
10960 && CONST_INT_P (XEXP (varop, 1))
10961 && mode_signbit_p (result_mode, XEXP (varop, 1))
10962 && (new_rtx = simplify_const_binary_operation
10963 (code, result_mode,
10964 gen_int_mode (INTVAL (XEXP (varop, 1)), result_mode),
10965 GEN_INT (count))) != 0
10966 && CONST_INT_P (new_rtx)
10967 && merge_outer_ops (&outer_op, &outer_const, XOR,
10968 INTVAL (new_rtx), result_mode, &complement_p))
10969 {
10970 varop = XEXP (varop, 0);
10971 continue;
10972 }
10973
10974 break;
10975
10976 case MINUS:
10977 /* The following rules apply only to scalars. */
10978 if (shift_mode != shift_unit_mode)
10979 break;
10980
10981 /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
10982 with C the size of VAROP - 1 and the shift is logical if
10983 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
10984 we have a (gt X 0) operation. If the shift is arithmetic with
10985 STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
10986 we have a (neg (gt X 0)) operation. */
10987
10988 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
10989 && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
10990 && count == (GET_MODE_PRECISION (GET_MODE (varop)) - 1)
10991 && (code == LSHIFTRT || code == ASHIFTRT)
10992 && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
10993 && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
10994 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
10995 {
10996 count = 0;
10997 varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
10998 const0_rtx);
10999
11000 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
11001 varop = gen_rtx_NEG (GET_MODE (varop), varop);
11002
11003 continue;
11004 }
11005 break;
11006
11007 case TRUNCATE:
11008 /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
11009 if the truncate does not affect the value. */
11010 if (code == LSHIFTRT
11011 && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
11012 && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
11013 && (INTVAL (XEXP (XEXP (varop, 0), 1))
11014 >= (GET_MODE_UNIT_PRECISION (GET_MODE (XEXP (varop, 0)))
11015 - GET_MODE_UNIT_PRECISION (GET_MODE (varop)))))
11016 {
11017 rtx varop_inner = XEXP (varop, 0);
11018
11019 varop_inner
11020 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
11021 XEXP (varop_inner, 0),
11022 GEN_INT
11023 (count + INTVAL (XEXP (varop_inner, 1))));
11024 varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
11025 count = 0;
11026 continue;
11027 }
11028 break;
11029
11030 default:
11031 break;
11032 }
11033
11034 break;
11035 }
11036
11037 shift_mode = try_widen_shift_mode (code, varop, count, result_mode, mode,
11038 outer_op, outer_const);
11039
11040 /* We have now finished analyzing the shift. The result should be
11041 a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places. If
11042 OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
11043 to the result of the shift. OUTER_CONST is the relevant constant,
11044 but we must turn off all bits turned off in the shift. */
11045
11046 if (outer_op == UNKNOWN
11047 && orig_code == code && orig_count == count
11048 && varop == orig_varop
11049 && shift_mode == GET_MODE (varop))
11050 return NULL_RTX;
11051
11052 /* Make a SUBREG if necessary. If we can't make it, fail. */
11053 varop = gen_lowpart (shift_mode, varop);
11054 if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
11055 return NULL_RTX;
11056
11057 /* If we have an outer operation and we just made a shift, it is
11058 possible that we could have simplified the shift were it not
11059 for the outer operation. So try to do the simplification
11060 recursively. */
11061
11062 if (outer_op != UNKNOWN)
11063 x = simplify_shift_const_1 (code, shift_mode, varop, count);
11064 else
11065 x = NULL_RTX;
11066
11067 if (x == NULL_RTX)
11068 x = simplify_gen_binary (code, shift_mode, varop, GEN_INT (count));
11069
11070 /* If we were doing an LSHIFTRT in a wider mode than it was originally,
11071 turn off all the bits that the shift would have turned off. */
11072 if (orig_code == LSHIFTRT && result_mode != shift_mode)
11073 x = simplify_and_const_int (NULL_RTX, shift_mode, x,
11074 GET_MODE_MASK (result_mode) >> orig_count);
11075
11076 /* Do the remainder of the processing in RESULT_MODE. */
11077 x = gen_lowpart_or_truncate (result_mode, x);
11078
11079 /* If COMPLEMENT_P is set, we have to complement X before doing the outer
11080 operation. */
11081 if (complement_p)
11082 x = simplify_gen_unary (NOT, result_mode, x, result_mode);
11083
11084 if (outer_op != UNKNOWN)
11085 {
11086 if (GET_RTX_CLASS (outer_op) != RTX_UNARY
11087 && GET_MODE_PRECISION (result_mode) < HOST_BITS_PER_WIDE_INT)
11088 outer_const = trunc_int_for_mode (outer_const, result_mode);
11089
11090 if (outer_op == AND)
11091 x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
11092 else if (outer_op == SET)
11093 {
11094 /* This means that we have determined that the result is
11095 equivalent to a constant. This should be rare. */
11096 if (!side_effects_p (x))
11097 x = GEN_INT (outer_const);
11098 }
11099 else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
11100 x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
11101 else
11102 x = simplify_gen_binary (outer_op, result_mode, x,
11103 GEN_INT (outer_const));
11104 }
11105
11106 return x;
11107 }
11108
11109 /* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift.
11110 The result of the shift is RESULT_MODE. If we cannot simplify it,
11111 return X or, if it is NULL, synthesize the expression with
11112 simplify_gen_binary. Otherwise, return a simplified value.
11113
11114 The shift is normally computed in the widest mode we find in VAROP, as
11115 long as it isn't a different number of words than RESULT_MODE. Exceptions
11116 are ASHIFTRT and ROTATE, which are always done in their original mode. */
11117
11118 static rtx
11119 simplify_shift_const (rtx x, enum rtx_code code, machine_mode result_mode,
11120 rtx varop, int count)
11121 {
11122 rtx tem = simplify_shift_const_1 (code, result_mode, varop, count);
11123 if (tem)
11124 return tem;
11125
11126 if (!x)
11127 x = simplify_gen_binary (code, GET_MODE (varop), varop, GEN_INT (count));
11128 if (GET_MODE (x) != result_mode)
11129 x = gen_lowpart (result_mode, x);
11130 return x;
11131 }
11132
11133 \f
11134 /* A subroutine of recog_for_combine. See there for arguments and
11135 return value. */
11136
11137 static int
11138 recog_for_combine_1 (rtx *pnewpat, rtx_insn *insn, rtx *pnotes)
11139 {
11140 rtx pat = *pnewpat;
11141 rtx pat_without_clobbers;
11142 int insn_code_number;
11143 int num_clobbers_to_add = 0;
11144 int i;
11145 rtx notes = NULL_RTX;
11146 rtx old_notes, old_pat;
11147 int old_icode;
11148
11149 /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
11150 we use to indicate that something didn't match. If we find such a
11151 thing, force rejection. */
11152 if (GET_CODE (pat) == PARALLEL)
11153 for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
11154 if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
11155 && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
11156 return -1;
11157
11158 old_pat = PATTERN (insn);
11159 old_notes = REG_NOTES (insn);
11160 PATTERN (insn) = pat;
11161 REG_NOTES (insn) = NULL_RTX;
11162
11163 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
11164 if (dump_file && (dump_flags & TDF_DETAILS))
11165 {
11166 if (insn_code_number < 0)
11167 fputs ("Failed to match this instruction:\n", dump_file);
11168 else
11169 fputs ("Successfully matched this instruction:\n", dump_file);
11170 print_rtl_single (dump_file, pat);
11171 }
11172
11173 /* If it isn't, there is the possibility that we previously had an insn
11174 that clobbered some register as a side effect, but the combined
11175 insn doesn't need to do that. So try once more without the clobbers
11176 unless this represents an ASM insn. */
11177
11178 if (insn_code_number < 0 && ! check_asm_operands (pat)
11179 && GET_CODE (pat) == PARALLEL)
11180 {
11181 int pos;
11182
11183 for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
11184 if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
11185 {
11186 if (i != pos)
11187 SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
11188 pos++;
11189 }
11190
11191 SUBST_INT (XVECLEN (pat, 0), pos);
11192
11193 if (pos == 1)
11194 pat = XVECEXP (pat, 0, 0);
11195
11196 PATTERN (insn) = pat;
11197 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
11198 if (dump_file && (dump_flags & TDF_DETAILS))
11199 {
11200 if (insn_code_number < 0)
11201 fputs ("Failed to match this instruction:\n", dump_file);
11202 else
11203 fputs ("Successfully matched this instruction:\n", dump_file);
11204 print_rtl_single (dump_file, pat);
11205 }
11206 }
11207
11208 pat_without_clobbers = pat;
11209
11210 PATTERN (insn) = old_pat;
11211 REG_NOTES (insn) = old_notes;
11212
11213 /* Recognize all noop sets, these will be killed by followup pass. */
11214 if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
11215 insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
11216
11217 /* If we had any clobbers to add, make a new pattern than contains
11218 them. Then check to make sure that all of them are dead. */
11219 if (num_clobbers_to_add)
11220 {
11221 rtx newpat = gen_rtx_PARALLEL (VOIDmode,
11222 rtvec_alloc (GET_CODE (pat) == PARALLEL
11223 ? (XVECLEN (pat, 0)
11224 + num_clobbers_to_add)
11225 : num_clobbers_to_add + 1));
11226
11227 if (GET_CODE (pat) == PARALLEL)
11228 for (i = 0; i < XVECLEN (pat, 0); i++)
11229 XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
11230 else
11231 XVECEXP (newpat, 0, 0) = pat;
11232
11233 add_clobbers (newpat, insn_code_number);
11234
11235 for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
11236 i < XVECLEN (newpat, 0); i++)
11237 {
11238 if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
11239 && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
11240 return -1;
11241 if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) != SCRATCH)
11242 {
11243 gcc_assert (REG_P (XEXP (XVECEXP (newpat, 0, i), 0)));
11244 notes = alloc_reg_note (REG_UNUSED,
11245 XEXP (XVECEXP (newpat, 0, i), 0), notes);
11246 }
11247 }
11248 pat = newpat;
11249 }
11250
11251 if (insn_code_number >= 0
11252 && insn_code_number != NOOP_MOVE_INSN_CODE)
11253 {
11254 old_pat = PATTERN (insn);
11255 old_notes = REG_NOTES (insn);
11256 old_icode = INSN_CODE (insn);
11257 PATTERN (insn) = pat;
11258 REG_NOTES (insn) = notes;
11259 INSN_CODE (insn) = insn_code_number;
11260
11261 /* Allow targets to reject combined insn. */
11262 if (!targetm.legitimate_combined_insn (insn))
11263 {
11264 if (dump_file && (dump_flags & TDF_DETAILS))
11265 fputs ("Instruction not appropriate for target.",
11266 dump_file);
11267
11268 /* Callers expect recog_for_combine to strip
11269 clobbers from the pattern on failure. */
11270 pat = pat_without_clobbers;
11271 notes = NULL_RTX;
11272
11273 insn_code_number = -1;
11274 }
11275
11276 PATTERN (insn) = old_pat;
11277 REG_NOTES (insn) = old_notes;
11278 INSN_CODE (insn) = old_icode;
11279 }
11280
11281 *pnewpat = pat;
11282 *pnotes = notes;
11283
11284 return insn_code_number;
11285 }
11286
11287 /* Change every ZERO_EXTRACT and ZERO_EXTEND of a SUBREG that can be
11288 expressed as an AND and maybe an LSHIFTRT, to that formulation.
11289 Return whether anything was so changed. */
11290
11291 static bool
11292 change_zero_ext (rtx pat)
11293 {
11294 bool changed = false;
11295 rtx *src = &SET_SRC (pat);
11296
11297 subrtx_ptr_iterator::array_type array;
11298 FOR_EACH_SUBRTX_PTR (iter, array, src, NONCONST)
11299 {
11300 rtx x = **iter;
11301 scalar_int_mode mode, inner_mode;
11302 if (!is_a <scalar_int_mode> (GET_MODE (x), &mode))
11303 continue;
11304 int size;
11305
11306 if (GET_CODE (x) == ZERO_EXTRACT
11307 && CONST_INT_P (XEXP (x, 1))
11308 && CONST_INT_P (XEXP (x, 2))
11309 && is_a <scalar_int_mode> (GET_MODE (XEXP (x, 0)), &inner_mode)
11310 && GET_MODE_PRECISION (inner_mode) <= GET_MODE_PRECISION (mode))
11311 {
11312 size = INTVAL (XEXP (x, 1));
11313
11314 int start = INTVAL (XEXP (x, 2));
11315 if (BITS_BIG_ENDIAN)
11316 start = GET_MODE_PRECISION (inner_mode) - size - start;
11317
11318 if (start)
11319 x = gen_rtx_LSHIFTRT (inner_mode, XEXP (x, 0), GEN_INT (start));
11320 else
11321 x = XEXP (x, 0);
11322 if (mode != inner_mode)
11323 x = gen_lowpart_SUBREG (mode, x);
11324 }
11325 else if (GET_CODE (x) == ZERO_EXTEND
11326 && GET_CODE (XEXP (x, 0)) == SUBREG
11327 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (XEXP (x, 0))))
11328 && !paradoxical_subreg_p (XEXP (x, 0))
11329 && subreg_lowpart_p (XEXP (x, 0)))
11330 {
11331 size = GET_MODE_PRECISION (GET_MODE (XEXP (x, 0)));
11332 x = SUBREG_REG (XEXP (x, 0));
11333 if (GET_MODE (x) != mode)
11334 x = gen_lowpart_SUBREG (mode, x);
11335 }
11336 else if (GET_CODE (x) == ZERO_EXTEND
11337 && REG_P (XEXP (x, 0))
11338 && HARD_REGISTER_P (XEXP (x, 0))
11339 && can_change_dest_mode (XEXP (x, 0), 0, mode))
11340 {
11341 size = GET_MODE_PRECISION (GET_MODE (XEXP (x, 0)));
11342 x = gen_rtx_REG (mode, REGNO (XEXP (x, 0)));
11343 }
11344 else
11345 continue;
11346
11347 if (!(GET_CODE (x) == LSHIFTRT
11348 && CONST_INT_P (XEXP (x, 1))
11349 && size + INTVAL (XEXP (x, 1)) == GET_MODE_PRECISION (mode)))
11350 {
11351 wide_int mask = wi::mask (size, false, GET_MODE_PRECISION (mode));
11352 x = gen_rtx_AND (mode, x, immed_wide_int_const (mask, mode));
11353 }
11354
11355 SUBST (**iter, x);
11356 changed = true;
11357 }
11358
11359 if (changed)
11360 FOR_EACH_SUBRTX_PTR (iter, array, src, NONCONST)
11361 maybe_swap_commutative_operands (**iter);
11362
11363 rtx *dst = &SET_DEST (pat);
11364 scalar_int_mode mode;
11365 if (GET_CODE (*dst) == ZERO_EXTRACT
11366 && REG_P (XEXP (*dst, 0))
11367 && is_a <scalar_int_mode> (GET_MODE (XEXP (*dst, 0)), &mode)
11368 && CONST_INT_P (XEXP (*dst, 1))
11369 && CONST_INT_P (XEXP (*dst, 2)))
11370 {
11371 rtx reg = XEXP (*dst, 0);
11372 int width = INTVAL (XEXP (*dst, 1));
11373 int offset = INTVAL (XEXP (*dst, 2));
11374 int reg_width = GET_MODE_PRECISION (mode);
11375 if (BITS_BIG_ENDIAN)
11376 offset = reg_width - width - offset;
11377
11378 rtx x, y, z, w;
11379 wide_int mask = wi::shifted_mask (offset, width, true, reg_width);
11380 wide_int mask2 = wi::shifted_mask (offset, width, false, reg_width);
11381 x = gen_rtx_AND (mode, reg, immed_wide_int_const (mask, mode));
11382 if (offset)
11383 y = gen_rtx_ASHIFT (mode, SET_SRC (pat), GEN_INT (offset));
11384 else
11385 y = SET_SRC (pat);
11386 z = gen_rtx_AND (mode, y, immed_wide_int_const (mask2, mode));
11387 w = gen_rtx_IOR (mode, x, z);
11388 SUBST (SET_DEST (pat), reg);
11389 SUBST (SET_SRC (pat), w);
11390
11391 changed = true;
11392 }
11393
11394 return changed;
11395 }
11396
11397 /* Like recog, but we receive the address of a pointer to a new pattern.
11398 We try to match the rtx that the pointer points to.
11399 If that fails, we may try to modify or replace the pattern,
11400 storing the replacement into the same pointer object.
11401
11402 Modifications include deletion or addition of CLOBBERs. If the
11403 instruction will still not match, we change ZERO_EXTEND and ZERO_EXTRACT
11404 to the equivalent AND and perhaps LSHIFTRT patterns, and try with that
11405 (and undo if that fails).
11406
11407 PNOTES is a pointer to a location where any REG_UNUSED notes added for
11408 the CLOBBERs are placed.
11409
11410 The value is the final insn code from the pattern ultimately matched,
11411 or -1. */
11412
11413 static int
11414 recog_for_combine (rtx *pnewpat, rtx_insn *insn, rtx *pnotes)
11415 {
11416 rtx pat = *pnewpat;
11417 int insn_code_number = recog_for_combine_1 (pnewpat, insn, pnotes);
11418 if (insn_code_number >= 0 || check_asm_operands (pat))
11419 return insn_code_number;
11420
11421 void *marker = get_undo_marker ();
11422 bool changed = false;
11423
11424 if (GET_CODE (pat) == SET)
11425 changed = change_zero_ext (pat);
11426 else if (GET_CODE (pat) == PARALLEL)
11427 {
11428 int i;
11429 for (i = 0; i < XVECLEN (pat, 0); i++)
11430 {
11431 rtx set = XVECEXP (pat, 0, i);
11432 if (GET_CODE (set) == SET)
11433 changed |= change_zero_ext (set);
11434 }
11435 }
11436
11437 if (changed)
11438 {
11439 insn_code_number = recog_for_combine_1 (pnewpat, insn, pnotes);
11440
11441 if (insn_code_number < 0)
11442 undo_to_marker (marker);
11443 }
11444
11445 return insn_code_number;
11446 }
11447 \f
11448 /* Like gen_lowpart_general but for use by combine. In combine it
11449 is not possible to create any new pseudoregs. However, it is
11450 safe to create invalid memory addresses, because combine will
11451 try to recognize them and all they will do is make the combine
11452 attempt fail.
11453
11454 If for some reason this cannot do its job, an rtx
11455 (clobber (const_int 0)) is returned.
11456 An insn containing that will not be recognized. */
11457
11458 static rtx
11459 gen_lowpart_for_combine (machine_mode omode, rtx x)
11460 {
11461 machine_mode imode = GET_MODE (x);
11462 unsigned int osize = GET_MODE_SIZE (omode);
11463 unsigned int isize = GET_MODE_SIZE (imode);
11464 rtx result;
11465
11466 if (omode == imode)
11467 return x;
11468
11469 /* We can only support MODE being wider than a word if X is a
11470 constant integer or has a mode the same size. */
11471 if (GET_MODE_SIZE (omode) > UNITS_PER_WORD
11472 && ! (CONST_SCALAR_INT_P (x) || isize == osize))
11473 goto fail;
11474
11475 /* X might be a paradoxical (subreg (mem)). In that case, gen_lowpart
11476 won't know what to do. So we will strip off the SUBREG here and
11477 process normally. */
11478 if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
11479 {
11480 x = SUBREG_REG (x);
11481
11482 /* For use in case we fall down into the address adjustments
11483 further below, we need to adjust the known mode and size of
11484 x; imode and isize, since we just adjusted x. */
11485 imode = GET_MODE (x);
11486
11487 if (imode == omode)
11488 return x;
11489
11490 isize = GET_MODE_SIZE (imode);
11491 }
11492
11493 result = gen_lowpart_common (omode, x);
11494
11495 if (result)
11496 return result;
11497
11498 if (MEM_P (x))
11499 {
11500 int offset = 0;
11501
11502 /* Refuse to work on a volatile memory ref or one with a mode-dependent
11503 address. */
11504 if (MEM_VOLATILE_P (x)
11505 || mode_dependent_address_p (XEXP (x, 0), MEM_ADDR_SPACE (x)))
11506 goto fail;
11507
11508 /* If we want to refer to something bigger than the original memref,
11509 generate a paradoxical subreg instead. That will force a reload
11510 of the original memref X. */
11511 if (paradoxical_subreg_p (omode, imode))
11512 return gen_rtx_SUBREG (omode, x, 0);
11513
11514 if (WORDS_BIG_ENDIAN)
11515 offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
11516
11517 /* Adjust the address so that the address-after-the-data is
11518 unchanged. */
11519 if (BYTES_BIG_ENDIAN)
11520 offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
11521
11522 return adjust_address_nv (x, omode, offset);
11523 }
11524
11525 /* If X is a comparison operator, rewrite it in a new mode. This
11526 probably won't match, but may allow further simplifications. */
11527 else if (COMPARISON_P (x))
11528 return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
11529
11530 /* If we couldn't simplify X any other way, just enclose it in a
11531 SUBREG. Normally, this SUBREG won't match, but some patterns may
11532 include an explicit SUBREG or we may simplify it further in combine. */
11533 else
11534 {
11535 rtx res;
11536
11537 if (imode == VOIDmode)
11538 {
11539 imode = int_mode_for_mode (omode).require ();
11540 x = gen_lowpart_common (imode, x);
11541 if (x == NULL)
11542 goto fail;
11543 }
11544 res = lowpart_subreg (omode, x, imode);
11545 if (res)
11546 return res;
11547 }
11548
11549 fail:
11550 return gen_rtx_CLOBBER (omode, const0_rtx);
11551 }
11552 \f
11553 /* Try to simplify a comparison between OP0 and a constant OP1,
11554 where CODE is the comparison code that will be tested, into a
11555 (CODE OP0 const0_rtx) form.
11556
11557 The result is a possibly different comparison code to use.
11558 *POP1 may be updated. */
11559
11560 static enum rtx_code
11561 simplify_compare_const (enum rtx_code code, machine_mode mode,
11562 rtx op0, rtx *pop1)
11563 {
11564 unsigned int mode_width = GET_MODE_PRECISION (mode);
11565 HOST_WIDE_INT const_op = INTVAL (*pop1);
11566
11567 /* Get the constant we are comparing against and turn off all bits
11568 not on in our mode. */
11569 if (mode != VOIDmode)
11570 const_op = trunc_int_for_mode (const_op, mode);
11571
11572 /* If we are comparing against a constant power of two and the value
11573 being compared can only have that single bit nonzero (e.g., it was
11574 `and'ed with that bit), we can replace this with a comparison
11575 with zero. */
11576 if (const_op
11577 && (code == EQ || code == NE || code == GE || code == GEU
11578 || code == LT || code == LTU)
11579 && mode_width - 1 < HOST_BITS_PER_WIDE_INT
11580 && pow2p_hwi (const_op & GET_MODE_MASK (mode))
11581 && (nonzero_bits (op0, mode)
11582 == (unsigned HOST_WIDE_INT) (const_op & GET_MODE_MASK (mode))))
11583 {
11584 code = (code == EQ || code == GE || code == GEU ? NE : EQ);
11585 const_op = 0;
11586 }
11587
11588 /* Similarly, if we are comparing a value known to be either -1 or
11589 0 with -1, change it to the opposite comparison against zero. */
11590 if (const_op == -1
11591 && (code == EQ || code == NE || code == GT || code == LE
11592 || code == GEU || code == LTU)
11593 && num_sign_bit_copies (op0, mode) == mode_width)
11594 {
11595 code = (code == EQ || code == LE || code == GEU ? NE : EQ);
11596 const_op = 0;
11597 }
11598
11599 /* Do some canonicalizations based on the comparison code. We prefer
11600 comparisons against zero and then prefer equality comparisons.
11601 If we can reduce the size of a constant, we will do that too. */
11602 switch (code)
11603 {
11604 case LT:
11605 /* < C is equivalent to <= (C - 1) */
11606 if (const_op > 0)
11607 {
11608 const_op -= 1;
11609 code = LE;
11610 /* ... fall through to LE case below. */
11611 gcc_fallthrough ();
11612 }
11613 else
11614 break;
11615
11616 case LE:
11617 /* <= C is equivalent to < (C + 1); we do this for C < 0 */
11618 if (const_op < 0)
11619 {
11620 const_op += 1;
11621 code = LT;
11622 }
11623
11624 /* If we are doing a <= 0 comparison on a value known to have
11625 a zero sign bit, we can replace this with == 0. */
11626 else if (const_op == 0
11627 && mode_width - 1 < HOST_BITS_PER_WIDE_INT
11628 && (nonzero_bits (op0, mode)
11629 & (HOST_WIDE_INT_1U << (mode_width - 1)))
11630 == 0)
11631 code = EQ;
11632 break;
11633
11634 case GE:
11635 /* >= C is equivalent to > (C - 1). */
11636 if (const_op > 0)
11637 {
11638 const_op -= 1;
11639 code = GT;
11640 /* ... fall through to GT below. */
11641 gcc_fallthrough ();
11642 }
11643 else
11644 break;
11645
11646 case GT:
11647 /* > C is equivalent to >= (C + 1); we do this for C < 0. */
11648 if (const_op < 0)
11649 {
11650 const_op += 1;
11651 code = GE;
11652 }
11653
11654 /* If we are doing a > 0 comparison on a value known to have
11655 a zero sign bit, we can replace this with != 0. */
11656 else if (const_op == 0
11657 && mode_width - 1 < HOST_BITS_PER_WIDE_INT
11658 && (nonzero_bits (op0, mode)
11659 & (HOST_WIDE_INT_1U << (mode_width - 1)))
11660 == 0)
11661 code = NE;
11662 break;
11663
11664 case LTU:
11665 /* < C is equivalent to <= (C - 1). */
11666 if (const_op > 0)
11667 {
11668 const_op -= 1;
11669 code = LEU;
11670 /* ... fall through ... */
11671 }
11672 /* (unsigned) < 0x80000000 is equivalent to >= 0. */
11673 else if (mode_width - 1 < HOST_BITS_PER_WIDE_INT
11674 && (unsigned HOST_WIDE_INT) const_op
11675 == HOST_WIDE_INT_1U << (mode_width - 1))
11676 {
11677 const_op = 0;
11678 code = GE;
11679 break;
11680 }
11681 else
11682 break;
11683
11684 case LEU:
11685 /* unsigned <= 0 is equivalent to == 0 */
11686 if (const_op == 0)
11687 code = EQ;
11688 /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */
11689 else if (mode_width - 1 < HOST_BITS_PER_WIDE_INT
11690 && (unsigned HOST_WIDE_INT) const_op
11691 == (HOST_WIDE_INT_1U << (mode_width - 1)) - 1)
11692 {
11693 const_op = 0;
11694 code = GE;
11695 }
11696 break;
11697
11698 case GEU:
11699 /* >= C is equivalent to > (C - 1). */
11700 if (const_op > 1)
11701 {
11702 const_op -= 1;
11703 code = GTU;
11704 /* ... fall through ... */
11705 }
11706
11707 /* (unsigned) >= 0x80000000 is equivalent to < 0. */
11708 else if (mode_width - 1 < HOST_BITS_PER_WIDE_INT
11709 && (unsigned HOST_WIDE_INT) const_op
11710 == HOST_WIDE_INT_1U << (mode_width - 1))
11711 {
11712 const_op = 0;
11713 code = LT;
11714 break;
11715 }
11716 else
11717 break;
11718
11719 case GTU:
11720 /* unsigned > 0 is equivalent to != 0 */
11721 if (const_op == 0)
11722 code = NE;
11723 /* (unsigned) > 0x7fffffff is equivalent to < 0. */
11724 else if (mode_width - 1 < HOST_BITS_PER_WIDE_INT
11725 && (unsigned HOST_WIDE_INT) const_op
11726 == (HOST_WIDE_INT_1U << (mode_width - 1)) - 1)
11727 {
11728 const_op = 0;
11729 code = LT;
11730 }
11731 break;
11732
11733 default:
11734 break;
11735 }
11736
11737 *pop1 = GEN_INT (const_op);
11738 return code;
11739 }
11740 \f
11741 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
11742 comparison code that will be tested.
11743
11744 The result is a possibly different comparison code to use. *POP0 and
11745 *POP1 may be updated.
11746
11747 It is possible that we might detect that a comparison is either always
11748 true or always false. However, we do not perform general constant
11749 folding in combine, so this knowledge isn't useful. Such tautologies
11750 should have been detected earlier. Hence we ignore all such cases. */
11751
11752 static enum rtx_code
11753 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
11754 {
11755 rtx op0 = *pop0;
11756 rtx op1 = *pop1;
11757 rtx tem, tem1;
11758 int i;
11759 scalar_int_mode mode, inner_mode;
11760 machine_mode tmode;
11761
11762 /* Try a few ways of applying the same transformation to both operands. */
11763 while (1)
11764 {
11765 /* The test below this one won't handle SIGN_EXTENDs on these machines,
11766 so check specially. */
11767 if (!WORD_REGISTER_OPERATIONS
11768 && code != GTU && code != GEU && code != LTU && code != LEU
11769 && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
11770 && GET_CODE (XEXP (op0, 0)) == ASHIFT
11771 && GET_CODE (XEXP (op1, 0)) == ASHIFT
11772 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
11773 && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
11774 && is_a <scalar_int_mode> (GET_MODE (op0), &mode)
11775 && (is_a <scalar_int_mode>
11776 (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))), &inner_mode))
11777 && inner_mode == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0)))
11778 && CONST_INT_P (XEXP (op0, 1))
11779 && XEXP (op0, 1) == XEXP (op1, 1)
11780 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
11781 && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
11782 && (INTVAL (XEXP (op0, 1))
11783 == (GET_MODE_PRECISION (mode)
11784 - GET_MODE_PRECISION (inner_mode))))
11785 {
11786 op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
11787 op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
11788 }
11789
11790 /* If both operands are the same constant shift, see if we can ignore the
11791 shift. We can if the shift is a rotate or if the bits shifted out of
11792 this shift are known to be zero for both inputs and if the type of
11793 comparison is compatible with the shift. */
11794 if (GET_CODE (op0) == GET_CODE (op1)
11795 && HWI_COMPUTABLE_MODE_P (GET_MODE (op0))
11796 && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
11797 || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
11798 && (code != GT && code != LT && code != GE && code != LE))
11799 || (GET_CODE (op0) == ASHIFTRT
11800 && (code != GTU && code != LTU
11801 && code != GEU && code != LEU)))
11802 && CONST_INT_P (XEXP (op0, 1))
11803 && INTVAL (XEXP (op0, 1)) >= 0
11804 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
11805 && XEXP (op0, 1) == XEXP (op1, 1))
11806 {
11807 machine_mode mode = GET_MODE (op0);
11808 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
11809 int shift_count = INTVAL (XEXP (op0, 1));
11810
11811 if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
11812 mask &= (mask >> shift_count) << shift_count;
11813 else if (GET_CODE (op0) == ASHIFT)
11814 mask = (mask & (mask << shift_count)) >> shift_count;
11815
11816 if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
11817 && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
11818 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
11819 else
11820 break;
11821 }
11822
11823 /* If both operands are AND's of a paradoxical SUBREG by constant, the
11824 SUBREGs are of the same mode, and, in both cases, the AND would
11825 be redundant if the comparison was done in the narrower mode,
11826 do the comparison in the narrower mode (e.g., we are AND'ing with 1
11827 and the operand's possibly nonzero bits are 0xffffff01; in that case
11828 if we only care about QImode, we don't need the AND). This case
11829 occurs if the output mode of an scc insn is not SImode and
11830 STORE_FLAG_VALUE == 1 (e.g., the 386).
11831
11832 Similarly, check for a case where the AND's are ZERO_EXTEND
11833 operations from some narrower mode even though a SUBREG is not
11834 present. */
11835
11836 else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
11837 && CONST_INT_P (XEXP (op0, 1))
11838 && CONST_INT_P (XEXP (op1, 1)))
11839 {
11840 rtx inner_op0 = XEXP (op0, 0);
11841 rtx inner_op1 = XEXP (op1, 0);
11842 HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
11843 HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
11844 int changed = 0;
11845
11846 if (paradoxical_subreg_p (inner_op0)
11847 && GET_CODE (inner_op1) == SUBREG
11848 && (GET_MODE (SUBREG_REG (inner_op0))
11849 == GET_MODE (SUBREG_REG (inner_op1)))
11850 && (GET_MODE_PRECISION (GET_MODE (SUBREG_REG (inner_op0)))
11851 <= HOST_BITS_PER_WIDE_INT)
11852 && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
11853 GET_MODE (SUBREG_REG (inner_op0)))))
11854 && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
11855 GET_MODE (SUBREG_REG (inner_op1))))))
11856 {
11857 op0 = SUBREG_REG (inner_op0);
11858 op1 = SUBREG_REG (inner_op1);
11859
11860 /* The resulting comparison is always unsigned since we masked
11861 off the original sign bit. */
11862 code = unsigned_condition (code);
11863
11864 changed = 1;
11865 }
11866
11867 else if (c0 == c1)
11868 FOR_EACH_MODE_UNTIL (tmode, GET_MODE (op0))
11869 if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
11870 {
11871 op0 = gen_lowpart_or_truncate (tmode, inner_op0);
11872 op1 = gen_lowpart_or_truncate (tmode, inner_op1);
11873 code = unsigned_condition (code);
11874 changed = 1;
11875 break;
11876 }
11877
11878 if (! changed)
11879 break;
11880 }
11881
11882 /* If both operands are NOT, we can strip off the outer operation
11883 and adjust the comparison code for swapped operands; similarly for
11884 NEG, except that this must be an equality comparison. */
11885 else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
11886 || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
11887 && (code == EQ || code == NE)))
11888 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
11889
11890 else
11891 break;
11892 }
11893
11894 /* If the first operand is a constant, swap the operands and adjust the
11895 comparison code appropriately, but don't do this if the second operand
11896 is already a constant integer. */
11897 if (swap_commutative_operands_p (op0, op1))
11898 {
11899 std::swap (op0, op1);
11900 code = swap_condition (code);
11901 }
11902
11903 /* We now enter a loop during which we will try to simplify the comparison.
11904 For the most part, we only are concerned with comparisons with zero,
11905 but some things may really be comparisons with zero but not start
11906 out looking that way. */
11907
11908 while (CONST_INT_P (op1))
11909 {
11910 machine_mode mode = GET_MODE (op0);
11911 unsigned int mode_width = GET_MODE_PRECISION (mode);
11912 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
11913 int equality_comparison_p;
11914 int sign_bit_comparison_p;
11915 int unsigned_comparison_p;
11916 HOST_WIDE_INT const_op;
11917
11918 /* We only want to handle integral modes. This catches VOIDmode,
11919 CCmode, and the floating-point modes. An exception is that we
11920 can handle VOIDmode if OP0 is a COMPARE or a comparison
11921 operation. */
11922
11923 if (GET_MODE_CLASS (mode) != MODE_INT
11924 && ! (mode == VOIDmode
11925 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
11926 break;
11927
11928 /* Try to simplify the compare to constant, possibly changing the
11929 comparison op, and/or changing op1 to zero. */
11930 code = simplify_compare_const (code, mode, op0, &op1);
11931 const_op = INTVAL (op1);
11932
11933 /* Compute some predicates to simplify code below. */
11934
11935 equality_comparison_p = (code == EQ || code == NE);
11936 sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
11937 unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
11938 || code == GEU);
11939
11940 /* If this is a sign bit comparison and we can do arithmetic in
11941 MODE, say that we will only be needing the sign bit of OP0. */
11942 if (sign_bit_comparison_p && HWI_COMPUTABLE_MODE_P (mode))
11943 op0 = force_to_mode (op0, mode,
11944 HOST_WIDE_INT_1U
11945 << (GET_MODE_PRECISION (mode) - 1),
11946 0);
11947
11948 /* Now try cases based on the opcode of OP0. If none of the cases
11949 does a "continue", we exit this loop immediately after the
11950 switch. */
11951
11952 switch (GET_CODE (op0))
11953 {
11954 case ZERO_EXTRACT:
11955 /* If we are extracting a single bit from a variable position in
11956 a constant that has only a single bit set and are comparing it
11957 with zero, we can convert this into an equality comparison
11958 between the position and the location of the single bit. */
11959 /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
11960 have already reduced the shift count modulo the word size. */
11961 if (!SHIFT_COUNT_TRUNCATED
11962 && CONST_INT_P (XEXP (op0, 0))
11963 && XEXP (op0, 1) == const1_rtx
11964 && equality_comparison_p && const_op == 0
11965 && (i = exact_log2 (UINTVAL (XEXP (op0, 0)))) >= 0)
11966 {
11967 if (BITS_BIG_ENDIAN)
11968 i = BITS_PER_WORD - 1 - i;
11969
11970 op0 = XEXP (op0, 2);
11971 op1 = GEN_INT (i);
11972 const_op = i;
11973
11974 /* Result is nonzero iff shift count is equal to I. */
11975 code = reverse_condition (code);
11976 continue;
11977 }
11978
11979 /* fall through */
11980
11981 case SIGN_EXTRACT:
11982 tem = expand_compound_operation (op0);
11983 if (tem != op0)
11984 {
11985 op0 = tem;
11986 continue;
11987 }
11988 break;
11989
11990 case NOT:
11991 /* If testing for equality, we can take the NOT of the constant. */
11992 if (equality_comparison_p
11993 && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
11994 {
11995 op0 = XEXP (op0, 0);
11996 op1 = tem;
11997 continue;
11998 }
11999
12000 /* If just looking at the sign bit, reverse the sense of the
12001 comparison. */
12002 if (sign_bit_comparison_p)
12003 {
12004 op0 = XEXP (op0, 0);
12005 code = (code == GE ? LT : GE);
12006 continue;
12007 }
12008 break;
12009
12010 case NEG:
12011 /* If testing for equality, we can take the NEG of the constant. */
12012 if (equality_comparison_p
12013 && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
12014 {
12015 op0 = XEXP (op0, 0);
12016 op1 = tem;
12017 continue;
12018 }
12019
12020 /* The remaining cases only apply to comparisons with zero. */
12021 if (const_op != 0)
12022 break;
12023
12024 /* When X is ABS or is known positive,
12025 (neg X) is < 0 if and only if X != 0. */
12026
12027 if (sign_bit_comparison_p
12028 && (GET_CODE (XEXP (op0, 0)) == ABS
12029 || (mode_width <= HOST_BITS_PER_WIDE_INT
12030 && (nonzero_bits (XEXP (op0, 0), mode)
12031 & (HOST_WIDE_INT_1U << (mode_width - 1)))
12032 == 0)))
12033 {
12034 op0 = XEXP (op0, 0);
12035 code = (code == LT ? NE : EQ);
12036 continue;
12037 }
12038
12039 /* If we have NEG of something whose two high-order bits are the
12040 same, we know that "(-a) < 0" is equivalent to "a > 0". */
12041 if (num_sign_bit_copies (op0, mode) >= 2)
12042 {
12043 op0 = XEXP (op0, 0);
12044 code = swap_condition (code);
12045 continue;
12046 }
12047 break;
12048
12049 case ROTATE:
12050 /* If we are testing equality and our count is a constant, we
12051 can perform the inverse operation on our RHS. */
12052 if (equality_comparison_p && CONST_INT_P (XEXP (op0, 1))
12053 && (tem = simplify_binary_operation (ROTATERT, mode,
12054 op1, XEXP (op0, 1))) != 0)
12055 {
12056 op0 = XEXP (op0, 0);
12057 op1 = tem;
12058 continue;
12059 }
12060
12061 /* If we are doing a < 0 or >= 0 comparison, it means we are testing
12062 a particular bit. Convert it to an AND of a constant of that
12063 bit. This will be converted into a ZERO_EXTRACT. */
12064 if (const_op == 0 && sign_bit_comparison_p
12065 && CONST_INT_P (XEXP (op0, 1))
12066 && mode_width <= HOST_BITS_PER_WIDE_INT)
12067 {
12068 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
12069 (HOST_WIDE_INT_1U
12070 << (mode_width - 1
12071 - INTVAL (XEXP (op0, 1)))));
12072 code = (code == LT ? NE : EQ);
12073 continue;
12074 }
12075
12076 /* Fall through. */
12077
12078 case ABS:
12079 /* ABS is ignorable inside an equality comparison with zero. */
12080 if (const_op == 0 && equality_comparison_p)
12081 {
12082 op0 = XEXP (op0, 0);
12083 continue;
12084 }
12085 break;
12086
12087 case SIGN_EXTEND:
12088 /* Can simplify (compare (zero/sign_extend FOO) CONST) to
12089 (compare FOO CONST) if CONST fits in FOO's mode and we
12090 are either testing inequality or have an unsigned
12091 comparison with ZERO_EXTEND or a signed comparison with
12092 SIGN_EXTEND. But don't do it if we don't have a compare
12093 insn of the given mode, since we'd have to revert it
12094 later on, and then we wouldn't know whether to sign- or
12095 zero-extend. */
12096 mode = GET_MODE (XEXP (op0, 0));
12097 if (GET_MODE_CLASS (mode) == MODE_INT
12098 && ! unsigned_comparison_p
12099 && HWI_COMPUTABLE_MODE_P (mode)
12100 && trunc_int_for_mode (const_op, mode) == const_op
12101 && have_insn_for (COMPARE, mode))
12102 {
12103 op0 = XEXP (op0, 0);
12104 continue;
12105 }
12106 break;
12107
12108 case SUBREG:
12109 /* Check for the case where we are comparing A - C1 with C2, that is
12110
12111 (subreg:MODE (plus (A) (-C1))) op (C2)
12112
12113 with C1 a constant, and try to lift the SUBREG, i.e. to do the
12114 comparison in the wider mode. One of the following two conditions
12115 must be true in order for this to be valid:
12116
12117 1. The mode extension results in the same bit pattern being added
12118 on both sides and the comparison is equality or unsigned. As
12119 C2 has been truncated to fit in MODE, the pattern can only be
12120 all 0s or all 1s.
12121
12122 2. The mode extension results in the sign bit being copied on
12123 each side.
12124
12125 The difficulty here is that we have predicates for A but not for
12126 (A - C1) so we need to check that C1 is within proper bounds so
12127 as to perturbate A as little as possible. */
12128
12129 if (mode_width <= HOST_BITS_PER_WIDE_INT
12130 && subreg_lowpart_p (op0)
12131 && GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op0))) > mode_width
12132 && GET_CODE (SUBREG_REG (op0)) == PLUS
12133 && CONST_INT_P (XEXP (SUBREG_REG (op0), 1)))
12134 {
12135 machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
12136 rtx a = XEXP (SUBREG_REG (op0), 0);
12137 HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
12138
12139 if ((c1 > 0
12140 && (unsigned HOST_WIDE_INT) c1
12141 < HOST_WIDE_INT_1U << (mode_width - 1)
12142 && (equality_comparison_p || unsigned_comparison_p)
12143 /* (A - C1) zero-extends if it is positive and sign-extends
12144 if it is negative, C2 both zero- and sign-extends. */
12145 && ((0 == (nonzero_bits (a, inner_mode)
12146 & ~GET_MODE_MASK (mode))
12147 && const_op >= 0)
12148 /* (A - C1) sign-extends if it is positive and 1-extends
12149 if it is negative, C2 both sign- and 1-extends. */
12150 || (num_sign_bit_copies (a, inner_mode)
12151 > (unsigned int) (GET_MODE_PRECISION (inner_mode)
12152 - mode_width)
12153 && const_op < 0)))
12154 || ((unsigned HOST_WIDE_INT) c1
12155 < HOST_WIDE_INT_1U << (mode_width - 2)
12156 /* (A - C1) always sign-extends, like C2. */
12157 && num_sign_bit_copies (a, inner_mode)
12158 > (unsigned int) (GET_MODE_PRECISION (inner_mode)
12159 - (mode_width - 1))))
12160 {
12161 op0 = SUBREG_REG (op0);
12162 continue;
12163 }
12164 }
12165
12166 /* If the inner mode is narrower and we are extracting the low part,
12167 we can treat the SUBREG as if it were a ZERO_EXTEND. */
12168 if (paradoxical_subreg_p (op0))
12169 ;
12170 else if (subreg_lowpart_p (op0)
12171 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
12172 && is_int_mode (GET_MODE (SUBREG_REG (op0)), &inner_mode)
12173 && (code == NE || code == EQ)
12174 && GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT
12175 && !paradoxical_subreg_p (op0)
12176 && (nonzero_bits (SUBREG_REG (op0), inner_mode)
12177 & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
12178 {
12179 /* Remove outer subregs that don't do anything. */
12180 tem = gen_lowpart (inner_mode, op1);
12181
12182 if ((nonzero_bits (tem, inner_mode)
12183 & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
12184 {
12185 op0 = SUBREG_REG (op0);
12186 op1 = tem;
12187 continue;
12188 }
12189 break;
12190 }
12191 else
12192 break;
12193
12194 /* FALLTHROUGH */
12195
12196 case ZERO_EXTEND:
12197 mode = GET_MODE (XEXP (op0, 0));
12198 if (GET_MODE_CLASS (mode) == MODE_INT
12199 && (unsigned_comparison_p || equality_comparison_p)
12200 && HWI_COMPUTABLE_MODE_P (mode)
12201 && (unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (mode)
12202 && const_op >= 0
12203 && have_insn_for (COMPARE, mode))
12204 {
12205 op0 = XEXP (op0, 0);
12206 continue;
12207 }
12208 break;
12209
12210 case PLUS:
12211 /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do
12212 this for equality comparisons due to pathological cases involving
12213 overflows. */
12214 if (equality_comparison_p
12215 && 0 != (tem = simplify_binary_operation (MINUS, mode,
12216 op1, XEXP (op0, 1))))
12217 {
12218 op0 = XEXP (op0, 0);
12219 op1 = tem;
12220 continue;
12221 }
12222
12223 /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0. */
12224 if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
12225 && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
12226 {
12227 op0 = XEXP (XEXP (op0, 0), 0);
12228 code = (code == LT ? EQ : NE);
12229 continue;
12230 }
12231 break;
12232
12233 case MINUS:
12234 /* We used to optimize signed comparisons against zero, but that
12235 was incorrect. Unsigned comparisons against zero (GTU, LEU)
12236 arrive here as equality comparisons, or (GEU, LTU) are
12237 optimized away. No need to special-case them. */
12238
12239 /* (eq (minus A B) C) -> (eq A (plus B C)) or
12240 (eq B (minus A C)), whichever simplifies. We can only do
12241 this for equality comparisons due to pathological cases involving
12242 overflows. */
12243 if (equality_comparison_p
12244 && 0 != (tem = simplify_binary_operation (PLUS, mode,
12245 XEXP (op0, 1), op1)))
12246 {
12247 op0 = XEXP (op0, 0);
12248 op1 = tem;
12249 continue;
12250 }
12251
12252 if (equality_comparison_p
12253 && 0 != (tem = simplify_binary_operation (MINUS, mode,
12254 XEXP (op0, 0), op1)))
12255 {
12256 op0 = XEXP (op0, 1);
12257 op1 = tem;
12258 continue;
12259 }
12260
12261 /* The sign bit of (minus (ashiftrt X C) X), where C is the number
12262 of bits in X minus 1, is one iff X > 0. */
12263 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
12264 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
12265 && UINTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
12266 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
12267 {
12268 op0 = XEXP (op0, 1);
12269 code = (code == GE ? LE : GT);
12270 continue;
12271 }
12272 break;
12273
12274 case XOR:
12275 /* (eq (xor A B) C) -> (eq A (xor B C)). This is a simplification
12276 if C is zero or B is a constant. */
12277 if (equality_comparison_p
12278 && 0 != (tem = simplify_binary_operation (XOR, mode,
12279 XEXP (op0, 1), op1)))
12280 {
12281 op0 = XEXP (op0, 0);
12282 op1 = tem;
12283 continue;
12284 }
12285 break;
12286
12287 case EQ: case NE:
12288 case UNEQ: case LTGT:
12289 case LT: case LTU: case UNLT: case LE: case LEU: case UNLE:
12290 case GT: case GTU: case UNGT: case GE: case GEU: case UNGE:
12291 case UNORDERED: case ORDERED:
12292 /* We can't do anything if OP0 is a condition code value, rather
12293 than an actual data value. */
12294 if (const_op != 0
12295 || CC0_P (XEXP (op0, 0))
12296 || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
12297 break;
12298
12299 /* Get the two operands being compared. */
12300 if (GET_CODE (XEXP (op0, 0)) == COMPARE)
12301 tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
12302 else
12303 tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
12304
12305 /* Check for the cases where we simply want the result of the
12306 earlier test or the opposite of that result. */
12307 if (code == NE || code == EQ
12308 || (val_signbit_known_set_p (GET_MODE (op0), STORE_FLAG_VALUE)
12309 && (code == LT || code == GE)))
12310 {
12311 enum rtx_code new_code;
12312 if (code == LT || code == NE)
12313 new_code = GET_CODE (op0);
12314 else
12315 new_code = reversed_comparison_code (op0, NULL);
12316
12317 if (new_code != UNKNOWN)
12318 {
12319 code = new_code;
12320 op0 = tem;
12321 op1 = tem1;
12322 continue;
12323 }
12324 }
12325 break;
12326
12327 case IOR:
12328 /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
12329 iff X <= 0. */
12330 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
12331 && XEXP (XEXP (op0, 0), 1) == constm1_rtx
12332 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
12333 {
12334 op0 = XEXP (op0, 1);
12335 code = (code == GE ? GT : LE);
12336 continue;
12337 }
12338 break;
12339
12340 case AND:
12341 /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1). This
12342 will be converted to a ZERO_EXTRACT later. */
12343 if (const_op == 0 && equality_comparison_p
12344 && GET_CODE (XEXP (op0, 0)) == ASHIFT
12345 && XEXP (XEXP (op0, 0), 0) == const1_rtx)
12346 {
12347 op0 = gen_rtx_LSHIFTRT (mode, XEXP (op0, 1),
12348 XEXP (XEXP (op0, 0), 1));
12349 op0 = simplify_and_const_int (NULL_RTX, mode, op0, 1);
12350 continue;
12351 }
12352
12353 /* If we are comparing (and (lshiftrt X C1) C2) for equality with
12354 zero and X is a comparison and C1 and C2 describe only bits set
12355 in STORE_FLAG_VALUE, we can compare with X. */
12356 if (const_op == 0 && equality_comparison_p
12357 && mode_width <= HOST_BITS_PER_WIDE_INT
12358 && CONST_INT_P (XEXP (op0, 1))
12359 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
12360 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
12361 && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
12362 && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
12363 {
12364 mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
12365 << INTVAL (XEXP (XEXP (op0, 0), 1)));
12366 if ((~STORE_FLAG_VALUE & mask) == 0
12367 && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
12368 || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
12369 && COMPARISON_P (tem))))
12370 {
12371 op0 = XEXP (XEXP (op0, 0), 0);
12372 continue;
12373 }
12374 }
12375
12376 /* If we are doing an equality comparison of an AND of a bit equal
12377 to the sign bit, replace this with a LT or GE comparison of
12378 the underlying value. */
12379 if (equality_comparison_p
12380 && const_op == 0
12381 && CONST_INT_P (XEXP (op0, 1))
12382 && mode_width <= HOST_BITS_PER_WIDE_INT
12383 && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
12384 == HOST_WIDE_INT_1U << (mode_width - 1)))
12385 {
12386 op0 = XEXP (op0, 0);
12387 code = (code == EQ ? GE : LT);
12388 continue;
12389 }
12390
12391 /* If this AND operation is really a ZERO_EXTEND from a narrower
12392 mode, the constant fits within that mode, and this is either an
12393 equality or unsigned comparison, try to do this comparison in
12394 the narrower mode.
12395
12396 Note that in:
12397
12398 (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
12399 -> (ne:DI (reg:SI 4) (const_int 0))
12400
12401 unless TRULY_NOOP_TRUNCATION allows it or the register is
12402 known to hold a value of the required mode the
12403 transformation is invalid. */
12404 if ((equality_comparison_p || unsigned_comparison_p)
12405 && CONST_INT_P (XEXP (op0, 1))
12406 && (i = exact_log2 ((UINTVAL (XEXP (op0, 1))
12407 & GET_MODE_MASK (mode))
12408 + 1)) >= 0
12409 && const_op >> i == 0
12410 && int_mode_for_size (i, 1).exists (&tmode))
12411 {
12412 op0 = gen_lowpart_or_truncate (tmode, XEXP (op0, 0));
12413 continue;
12414 }
12415
12416 /* If this is (and:M1 (subreg:M1 X:M2 0) (const_int C1)) where C1
12417 fits in both M1 and M2 and the SUBREG is either paradoxical
12418 or represents the low part, permute the SUBREG and the AND
12419 and try again. */
12420 if (GET_CODE (XEXP (op0, 0)) == SUBREG
12421 && CONST_INT_P (XEXP (op0, 1)))
12422 {
12423 unsigned HOST_WIDE_INT c1 = INTVAL (XEXP (op0, 1));
12424 /* Require an integral mode, to avoid creating something like
12425 (AND:SF ...). */
12426 if ((is_a <scalar_int_mode>
12427 (GET_MODE (SUBREG_REG (XEXP (op0, 0))), &tmode))
12428 /* It is unsafe to commute the AND into the SUBREG if the
12429 SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
12430 not defined. As originally written the upper bits
12431 have a defined value due to the AND operation.
12432 However, if we commute the AND inside the SUBREG then
12433 they no longer have defined values and the meaning of
12434 the code has been changed.
12435 Also C1 should not change value in the smaller mode,
12436 see PR67028 (a positive C1 can become negative in the
12437 smaller mode, so that the AND does no longer mask the
12438 upper bits). */
12439 && ((WORD_REGISTER_OPERATIONS
12440 && mode_width > GET_MODE_PRECISION (tmode)
12441 && mode_width <= BITS_PER_WORD
12442 && trunc_int_for_mode (c1, tmode) == (HOST_WIDE_INT) c1)
12443 || (mode_width <= GET_MODE_PRECISION (tmode)
12444 && subreg_lowpart_p (XEXP (op0, 0))))
12445 && mode_width <= HOST_BITS_PER_WIDE_INT
12446 && HWI_COMPUTABLE_MODE_P (tmode)
12447 && (c1 & ~mask) == 0
12448 && (c1 & ~GET_MODE_MASK (tmode)) == 0
12449 && c1 != mask
12450 && c1 != GET_MODE_MASK (tmode))
12451 {
12452 op0 = simplify_gen_binary (AND, tmode,
12453 SUBREG_REG (XEXP (op0, 0)),
12454 gen_int_mode (c1, tmode));
12455 op0 = gen_lowpart (mode, op0);
12456 continue;
12457 }
12458 }
12459
12460 /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0). */
12461 if (const_op == 0 && equality_comparison_p
12462 && XEXP (op0, 1) == const1_rtx
12463 && GET_CODE (XEXP (op0, 0)) == NOT)
12464 {
12465 op0 = simplify_and_const_int (NULL_RTX, mode,
12466 XEXP (XEXP (op0, 0), 0), 1);
12467 code = (code == NE ? EQ : NE);
12468 continue;
12469 }
12470
12471 /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
12472 (eq (and (lshiftrt X) 1) 0).
12473 Also handle the case where (not X) is expressed using xor. */
12474 if (const_op == 0 && equality_comparison_p
12475 && XEXP (op0, 1) == const1_rtx
12476 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
12477 {
12478 rtx shift_op = XEXP (XEXP (op0, 0), 0);
12479 rtx shift_count = XEXP (XEXP (op0, 0), 1);
12480
12481 if (GET_CODE (shift_op) == NOT
12482 || (GET_CODE (shift_op) == XOR
12483 && CONST_INT_P (XEXP (shift_op, 1))
12484 && CONST_INT_P (shift_count)
12485 && HWI_COMPUTABLE_MODE_P (mode)
12486 && (UINTVAL (XEXP (shift_op, 1))
12487 == HOST_WIDE_INT_1U
12488 << INTVAL (shift_count))))
12489 {
12490 op0
12491 = gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count);
12492 op0 = simplify_and_const_int (NULL_RTX, mode, op0, 1);
12493 code = (code == NE ? EQ : NE);
12494 continue;
12495 }
12496 }
12497 break;
12498
12499 case ASHIFT:
12500 /* If we have (compare (ashift FOO N) (const_int C)) and
12501 the high order N bits of FOO (N+1 if an inequality comparison)
12502 are known to be zero, we can do this by comparing FOO with C
12503 shifted right N bits so long as the low-order N bits of C are
12504 zero. */
12505 if (CONST_INT_P (XEXP (op0, 1))
12506 && INTVAL (XEXP (op0, 1)) >= 0
12507 && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
12508 < HOST_BITS_PER_WIDE_INT)
12509 && (((unsigned HOST_WIDE_INT) const_op
12510 & ((HOST_WIDE_INT_1U << INTVAL (XEXP (op0, 1)))
12511 - 1)) == 0)
12512 && mode_width <= HOST_BITS_PER_WIDE_INT
12513 && (nonzero_bits (XEXP (op0, 0), mode)
12514 & ~(mask >> (INTVAL (XEXP (op0, 1))
12515 + ! equality_comparison_p))) == 0)
12516 {
12517 /* We must perform a logical shift, not an arithmetic one,
12518 as we want the top N bits of C to be zero. */
12519 unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
12520
12521 temp >>= INTVAL (XEXP (op0, 1));
12522 op1 = gen_int_mode (temp, mode);
12523 op0 = XEXP (op0, 0);
12524 continue;
12525 }
12526
12527 /* If we are doing a sign bit comparison, it means we are testing
12528 a particular bit. Convert it to the appropriate AND. */
12529 if (sign_bit_comparison_p && CONST_INT_P (XEXP (op0, 1))
12530 && mode_width <= HOST_BITS_PER_WIDE_INT)
12531 {
12532 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
12533 (HOST_WIDE_INT_1U
12534 << (mode_width - 1
12535 - INTVAL (XEXP (op0, 1)))));
12536 code = (code == LT ? NE : EQ);
12537 continue;
12538 }
12539
12540 /* If this an equality comparison with zero and we are shifting
12541 the low bit to the sign bit, we can convert this to an AND of the
12542 low-order bit. */
12543 if (const_op == 0 && equality_comparison_p
12544 && CONST_INT_P (XEXP (op0, 1))
12545 && UINTVAL (XEXP (op0, 1)) == mode_width - 1)
12546 {
12547 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), 1);
12548 continue;
12549 }
12550 break;
12551
12552 case ASHIFTRT:
12553 /* If this is an equality comparison with zero, we can do this
12554 as a logical shift, which might be much simpler. */
12555 if (equality_comparison_p && const_op == 0
12556 && CONST_INT_P (XEXP (op0, 1)))
12557 {
12558 op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
12559 XEXP (op0, 0),
12560 INTVAL (XEXP (op0, 1)));
12561 continue;
12562 }
12563
12564 /* If OP0 is a sign extension and CODE is not an unsigned comparison,
12565 do the comparison in a narrower mode. */
12566 if (! unsigned_comparison_p
12567 && CONST_INT_P (XEXP (op0, 1))
12568 && GET_CODE (XEXP (op0, 0)) == ASHIFT
12569 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
12570 && (int_mode_for_size (mode_width - INTVAL (XEXP (op0, 1)), 1)
12571 .exists (&tmode))
12572 && (((unsigned HOST_WIDE_INT) const_op
12573 + (GET_MODE_MASK (tmode) >> 1) + 1)
12574 <= GET_MODE_MASK (tmode)))
12575 {
12576 op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
12577 continue;
12578 }
12579
12580 /* Likewise if OP0 is a PLUS of a sign extension with a
12581 constant, which is usually represented with the PLUS
12582 between the shifts. */
12583 if (! unsigned_comparison_p
12584 && CONST_INT_P (XEXP (op0, 1))
12585 && GET_CODE (XEXP (op0, 0)) == PLUS
12586 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
12587 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
12588 && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
12589 && (int_mode_for_size (mode_width - INTVAL (XEXP (op0, 1)), 1)
12590 .exists (&tmode))
12591 && (((unsigned HOST_WIDE_INT) const_op
12592 + (GET_MODE_MASK (tmode) >> 1) + 1)
12593 <= GET_MODE_MASK (tmode)))
12594 {
12595 rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
12596 rtx add_const = XEXP (XEXP (op0, 0), 1);
12597 rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
12598 add_const, XEXP (op0, 1));
12599
12600 op0 = simplify_gen_binary (PLUS, tmode,
12601 gen_lowpart (tmode, inner),
12602 new_const);
12603 continue;
12604 }
12605
12606 /* FALLTHROUGH */
12607 case LSHIFTRT:
12608 /* If we have (compare (xshiftrt FOO N) (const_int C)) and
12609 the low order N bits of FOO are known to be zero, we can do this
12610 by comparing FOO with C shifted left N bits so long as no
12611 overflow occurs. Even if the low order N bits of FOO aren't known
12612 to be zero, if the comparison is >= or < we can use the same
12613 optimization and for > or <= by setting all the low
12614 order N bits in the comparison constant. */
12615 if (CONST_INT_P (XEXP (op0, 1))
12616 && INTVAL (XEXP (op0, 1)) > 0
12617 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
12618 && mode_width <= HOST_BITS_PER_WIDE_INT
12619 && (((unsigned HOST_WIDE_INT) const_op
12620 + (GET_CODE (op0) != LSHIFTRT
12621 ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
12622 + 1)
12623 : 0))
12624 <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
12625 {
12626 unsigned HOST_WIDE_INT low_bits
12627 = (nonzero_bits (XEXP (op0, 0), mode)
12628 & ((HOST_WIDE_INT_1U
12629 << INTVAL (XEXP (op0, 1))) - 1));
12630 if (low_bits == 0 || !equality_comparison_p)
12631 {
12632 /* If the shift was logical, then we must make the condition
12633 unsigned. */
12634 if (GET_CODE (op0) == LSHIFTRT)
12635 code = unsigned_condition (code);
12636
12637 const_op = (unsigned HOST_WIDE_INT) const_op
12638 << INTVAL (XEXP (op0, 1));
12639 if (low_bits != 0
12640 && (code == GT || code == GTU
12641 || code == LE || code == LEU))
12642 const_op
12643 |= ((HOST_WIDE_INT_1 << INTVAL (XEXP (op0, 1))) - 1);
12644 op1 = GEN_INT (const_op);
12645 op0 = XEXP (op0, 0);
12646 continue;
12647 }
12648 }
12649
12650 /* If we are using this shift to extract just the sign bit, we
12651 can replace this with an LT or GE comparison. */
12652 if (const_op == 0
12653 && (equality_comparison_p || sign_bit_comparison_p)
12654 && CONST_INT_P (XEXP (op0, 1))
12655 && UINTVAL (XEXP (op0, 1)) == mode_width - 1)
12656 {
12657 op0 = XEXP (op0, 0);
12658 code = (code == NE || code == GT ? LT : GE);
12659 continue;
12660 }
12661 break;
12662
12663 default:
12664 break;
12665 }
12666
12667 break;
12668 }
12669
12670 /* Now make any compound operations involved in this comparison. Then,
12671 check for an outmost SUBREG on OP0 that is not doing anything or is
12672 paradoxical. The latter transformation must only be performed when
12673 it is known that the "extra" bits will be the same in op0 and op1 or
12674 that they don't matter. There are three cases to consider:
12675
12676 1. SUBREG_REG (op0) is a register. In this case the bits are don't
12677 care bits and we can assume they have any convenient value. So
12678 making the transformation is safe.
12679
12680 2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is UNKNOWN.
12681 In this case the upper bits of op0 are undefined. We should not make
12682 the simplification in that case as we do not know the contents of
12683 those bits.
12684
12685 3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not UNKNOWN.
12686 In that case we know those bits are zeros or ones. We must also be
12687 sure that they are the same as the upper bits of op1.
12688
12689 We can never remove a SUBREG for a non-equality comparison because
12690 the sign bit is in a different place in the underlying object. */
12691
12692 rtx_code op0_mco_code = SET;
12693 if (op1 == const0_rtx)
12694 op0_mco_code = code == NE || code == EQ ? EQ : COMPARE;
12695
12696 op0 = make_compound_operation (op0, op0_mco_code);
12697 op1 = make_compound_operation (op1, SET);
12698
12699 if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
12700 && is_int_mode (GET_MODE (op0), &mode)
12701 && is_int_mode (GET_MODE (SUBREG_REG (op0)), &inner_mode)
12702 && (code == NE || code == EQ))
12703 {
12704 if (paradoxical_subreg_p (op0))
12705 {
12706 /* For paradoxical subregs, allow case 1 as above. Case 3 isn't
12707 implemented. */
12708 if (REG_P (SUBREG_REG (op0)))
12709 {
12710 op0 = SUBREG_REG (op0);
12711 op1 = gen_lowpart (inner_mode, op1);
12712 }
12713 }
12714 else if (GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT
12715 && (nonzero_bits (SUBREG_REG (op0), inner_mode)
12716 & ~GET_MODE_MASK (mode)) == 0)
12717 {
12718 tem = gen_lowpart (inner_mode, op1);
12719
12720 if ((nonzero_bits (tem, inner_mode) & ~GET_MODE_MASK (mode)) == 0)
12721 op0 = SUBREG_REG (op0), op1 = tem;
12722 }
12723 }
12724
12725 /* We now do the opposite procedure: Some machines don't have compare
12726 insns in all modes. If OP0's mode is an integer mode smaller than a
12727 word and we can't do a compare in that mode, see if there is a larger
12728 mode for which we can do the compare. There are a number of cases in
12729 which we can use the wider mode. */
12730
12731 if (is_int_mode (GET_MODE (op0), &mode)
12732 && GET_MODE_SIZE (mode) < UNITS_PER_WORD
12733 && ! have_insn_for (COMPARE, mode))
12734 FOR_EACH_WIDER_MODE (tmode, mode)
12735 {
12736 if (!HWI_COMPUTABLE_MODE_P (tmode))
12737 break;
12738 if (have_insn_for (COMPARE, tmode))
12739 {
12740 int zero_extended;
12741
12742 /* If this is a test for negative, we can make an explicit
12743 test of the sign bit. Test this first so we can use
12744 a paradoxical subreg to extend OP0. */
12745
12746 if (op1 == const0_rtx && (code == LT || code == GE)
12747 && HWI_COMPUTABLE_MODE_P (mode))
12748 {
12749 unsigned HOST_WIDE_INT sign
12750 = HOST_WIDE_INT_1U << (GET_MODE_BITSIZE (mode) - 1);
12751 op0 = simplify_gen_binary (AND, tmode,
12752 gen_lowpart (tmode, op0),
12753 gen_int_mode (sign, tmode));
12754 code = (code == LT) ? NE : EQ;
12755 break;
12756 }
12757
12758 /* If the only nonzero bits in OP0 and OP1 are those in the
12759 narrower mode and this is an equality or unsigned comparison,
12760 we can use the wider mode. Similarly for sign-extended
12761 values, in which case it is true for all comparisons. */
12762 zero_extended = ((code == EQ || code == NE
12763 || code == GEU || code == GTU
12764 || code == LEU || code == LTU)
12765 && (nonzero_bits (op0, tmode)
12766 & ~GET_MODE_MASK (mode)) == 0
12767 && ((CONST_INT_P (op1)
12768 || (nonzero_bits (op1, tmode)
12769 & ~GET_MODE_MASK (mode)) == 0)));
12770
12771 if (zero_extended
12772 || ((num_sign_bit_copies (op0, tmode)
12773 > (unsigned int) (GET_MODE_PRECISION (tmode)
12774 - GET_MODE_PRECISION (mode)))
12775 && (num_sign_bit_copies (op1, tmode)
12776 > (unsigned int) (GET_MODE_PRECISION (tmode)
12777 - GET_MODE_PRECISION (mode)))))
12778 {
12779 /* If OP0 is an AND and we don't have an AND in MODE either,
12780 make a new AND in the proper mode. */
12781 if (GET_CODE (op0) == AND
12782 && !have_insn_for (AND, mode))
12783 op0 = simplify_gen_binary (AND, tmode,
12784 gen_lowpart (tmode,
12785 XEXP (op0, 0)),
12786 gen_lowpart (tmode,
12787 XEXP (op0, 1)));
12788 else
12789 {
12790 if (zero_extended)
12791 {
12792 op0 = simplify_gen_unary (ZERO_EXTEND, tmode,
12793 op0, mode);
12794 op1 = simplify_gen_unary (ZERO_EXTEND, tmode,
12795 op1, mode);
12796 }
12797 else
12798 {
12799 op0 = simplify_gen_unary (SIGN_EXTEND, tmode,
12800 op0, mode);
12801 op1 = simplify_gen_unary (SIGN_EXTEND, tmode,
12802 op1, mode);
12803 }
12804 break;
12805 }
12806 }
12807 }
12808 }
12809
12810 /* We may have changed the comparison operands. Re-canonicalize. */
12811 if (swap_commutative_operands_p (op0, op1))
12812 {
12813 std::swap (op0, op1);
12814 code = swap_condition (code);
12815 }
12816
12817 /* If this machine only supports a subset of valid comparisons, see if we
12818 can convert an unsupported one into a supported one. */
12819 target_canonicalize_comparison (&code, &op0, &op1, 0);
12820
12821 *pop0 = op0;
12822 *pop1 = op1;
12823
12824 return code;
12825 }
12826 \f
12827 /* Utility function for record_value_for_reg. Count number of
12828 rtxs in X. */
12829 static int
12830 count_rtxs (rtx x)
12831 {
12832 enum rtx_code code = GET_CODE (x);
12833 const char *fmt;
12834 int i, j, ret = 1;
12835
12836 if (GET_RTX_CLASS (code) == RTX_BIN_ARITH
12837 || GET_RTX_CLASS (code) == RTX_COMM_ARITH)
12838 {
12839 rtx x0 = XEXP (x, 0);
12840 rtx x1 = XEXP (x, 1);
12841
12842 if (x0 == x1)
12843 return 1 + 2 * count_rtxs (x0);
12844
12845 if ((GET_RTX_CLASS (GET_CODE (x1)) == RTX_BIN_ARITH
12846 || GET_RTX_CLASS (GET_CODE (x1)) == RTX_COMM_ARITH)
12847 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12848 return 2 + 2 * count_rtxs (x0)
12849 + count_rtxs (x == XEXP (x1, 0)
12850 ? XEXP (x1, 1) : XEXP (x1, 0));
12851
12852 if ((GET_RTX_CLASS (GET_CODE (x0)) == RTX_BIN_ARITH
12853 || GET_RTX_CLASS (GET_CODE (x0)) == RTX_COMM_ARITH)
12854 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12855 return 2 + 2 * count_rtxs (x1)
12856 + count_rtxs (x == XEXP (x0, 0)
12857 ? XEXP (x0, 1) : XEXP (x0, 0));
12858 }
12859
12860 fmt = GET_RTX_FORMAT (code);
12861 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12862 if (fmt[i] == 'e')
12863 ret += count_rtxs (XEXP (x, i));
12864 else if (fmt[i] == 'E')
12865 for (j = 0; j < XVECLEN (x, i); j++)
12866 ret += count_rtxs (XVECEXP (x, i, j));
12867
12868 return ret;
12869 }
12870 \f
12871 /* Utility function for following routine. Called when X is part of a value
12872 being stored into last_set_value. Sets last_set_table_tick
12873 for each register mentioned. Similar to mention_regs in cse.c */
12874
12875 static void
12876 update_table_tick (rtx x)
12877 {
12878 enum rtx_code code = GET_CODE (x);
12879 const char *fmt = GET_RTX_FORMAT (code);
12880 int i, j;
12881
12882 if (code == REG)
12883 {
12884 unsigned int regno = REGNO (x);
12885 unsigned int endregno = END_REGNO (x);
12886 unsigned int r;
12887
12888 for (r = regno; r < endregno; r++)
12889 {
12890 reg_stat_type *rsp = &reg_stat[r];
12891 rsp->last_set_table_tick = label_tick;
12892 }
12893
12894 return;
12895 }
12896
12897 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12898 if (fmt[i] == 'e')
12899 {
12900 /* Check for identical subexpressions. If x contains
12901 identical subexpression we only have to traverse one of
12902 them. */
12903 if (i == 0 && ARITHMETIC_P (x))
12904 {
12905 /* Note that at this point x1 has already been
12906 processed. */
12907 rtx x0 = XEXP (x, 0);
12908 rtx x1 = XEXP (x, 1);
12909
12910 /* If x0 and x1 are identical then there is no need to
12911 process x0. */
12912 if (x0 == x1)
12913 break;
12914
12915 /* If x0 is identical to a subexpression of x1 then while
12916 processing x1, x0 has already been processed. Thus we
12917 are done with x. */
12918 if (ARITHMETIC_P (x1)
12919 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12920 break;
12921
12922 /* If x1 is identical to a subexpression of x0 then we
12923 still have to process the rest of x0. */
12924 if (ARITHMETIC_P (x0)
12925 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12926 {
12927 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
12928 break;
12929 }
12930 }
12931
12932 update_table_tick (XEXP (x, i));
12933 }
12934 else if (fmt[i] == 'E')
12935 for (j = 0; j < XVECLEN (x, i); j++)
12936 update_table_tick (XVECEXP (x, i, j));
12937 }
12938
12939 /* Record that REG is set to VALUE in insn INSN. If VALUE is zero, we
12940 are saying that the register is clobbered and we no longer know its
12941 value. If INSN is zero, don't update reg_stat[].last_set; this is
12942 only permitted with VALUE also zero and is used to invalidate the
12943 register. */
12944
12945 static void
12946 record_value_for_reg (rtx reg, rtx_insn *insn, rtx value)
12947 {
12948 unsigned int regno = REGNO (reg);
12949 unsigned int endregno = END_REGNO (reg);
12950 unsigned int i;
12951 reg_stat_type *rsp;
12952
12953 /* If VALUE contains REG and we have a previous value for REG, substitute
12954 the previous value. */
12955 if (value && insn && reg_overlap_mentioned_p (reg, value))
12956 {
12957 rtx tem;
12958
12959 /* Set things up so get_last_value is allowed to see anything set up to
12960 our insn. */
12961 subst_low_luid = DF_INSN_LUID (insn);
12962 tem = get_last_value (reg);
12963
12964 /* If TEM is simply a binary operation with two CLOBBERs as operands,
12965 it isn't going to be useful and will take a lot of time to process,
12966 so just use the CLOBBER. */
12967
12968 if (tem)
12969 {
12970 if (ARITHMETIC_P (tem)
12971 && GET_CODE (XEXP (tem, 0)) == CLOBBER
12972 && GET_CODE (XEXP (tem, 1)) == CLOBBER)
12973 tem = XEXP (tem, 0);
12974 else if (count_occurrences (value, reg, 1) >= 2)
12975 {
12976 /* If there are two or more occurrences of REG in VALUE,
12977 prevent the value from growing too much. */
12978 if (count_rtxs (tem) > MAX_LAST_VALUE_RTL)
12979 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
12980 }
12981
12982 value = replace_rtx (copy_rtx (value), reg, tem);
12983 }
12984 }
12985
12986 /* For each register modified, show we don't know its value, that
12987 we don't know about its bitwise content, that its value has been
12988 updated, and that we don't know the location of the death of the
12989 register. */
12990 for (i = regno; i < endregno; i++)
12991 {
12992 rsp = &reg_stat[i];
12993
12994 if (insn)
12995 rsp->last_set = insn;
12996
12997 rsp->last_set_value = 0;
12998 rsp->last_set_mode = VOIDmode;
12999 rsp->last_set_nonzero_bits = 0;
13000 rsp->last_set_sign_bit_copies = 0;
13001 rsp->last_death = 0;
13002 rsp->truncated_to_mode = VOIDmode;
13003 }
13004
13005 /* Mark registers that are being referenced in this value. */
13006 if (value)
13007 update_table_tick (value);
13008
13009 /* Now update the status of each register being set.
13010 If someone is using this register in this block, set this register
13011 to invalid since we will get confused between the two lives in this
13012 basic block. This makes using this register always invalid. In cse, we
13013 scan the table to invalidate all entries using this register, but this
13014 is too much work for us. */
13015
13016 for (i = regno; i < endregno; i++)
13017 {
13018 rsp = &reg_stat[i];
13019 rsp->last_set_label = label_tick;
13020 if (!insn
13021 || (value && rsp->last_set_table_tick >= label_tick_ebb_start))
13022 rsp->last_set_invalid = 1;
13023 else
13024 rsp->last_set_invalid = 0;
13025 }
13026
13027 /* The value being assigned might refer to X (like in "x++;"). In that
13028 case, we must replace it with (clobber (const_int 0)) to prevent
13029 infinite loops. */
13030 rsp = &reg_stat[regno];
13031 if (value && !get_last_value_validate (&value, insn, label_tick, 0))
13032 {
13033 value = copy_rtx (value);
13034 if (!get_last_value_validate (&value, insn, label_tick, 1))
13035 value = 0;
13036 }
13037
13038 /* For the main register being modified, update the value, the mode, the
13039 nonzero bits, and the number of sign bit copies. */
13040
13041 rsp->last_set_value = value;
13042
13043 if (value)
13044 {
13045 machine_mode mode = GET_MODE (reg);
13046 subst_low_luid = DF_INSN_LUID (insn);
13047 rsp->last_set_mode = mode;
13048 if (GET_MODE_CLASS (mode) == MODE_INT
13049 && HWI_COMPUTABLE_MODE_P (mode))
13050 mode = nonzero_bits_mode;
13051 rsp->last_set_nonzero_bits = nonzero_bits (value, mode);
13052 rsp->last_set_sign_bit_copies
13053 = num_sign_bit_copies (value, GET_MODE (reg));
13054 }
13055 }
13056
13057 /* Called via note_stores from record_dead_and_set_regs to handle one
13058 SET or CLOBBER in an insn. DATA is the instruction in which the
13059 set is occurring. */
13060
13061 static void
13062 record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data)
13063 {
13064 rtx_insn *record_dead_insn = (rtx_insn *) data;
13065
13066 if (GET_CODE (dest) == SUBREG)
13067 dest = SUBREG_REG (dest);
13068
13069 if (!record_dead_insn)
13070 {
13071 if (REG_P (dest))
13072 record_value_for_reg (dest, NULL, NULL_RTX);
13073 return;
13074 }
13075
13076 if (REG_P (dest))
13077 {
13078 /* If we are setting the whole register, we know its value. Otherwise
13079 show that we don't know the value. We can handle SUBREG in
13080 some cases. */
13081 if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
13082 record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
13083 else if (GET_CODE (setter) == SET
13084 && GET_CODE (SET_DEST (setter)) == SUBREG
13085 && SUBREG_REG (SET_DEST (setter)) == dest
13086 && GET_MODE_PRECISION (GET_MODE (dest)) <= BITS_PER_WORD
13087 && subreg_lowpart_p (SET_DEST (setter)))
13088 record_value_for_reg (dest, record_dead_insn,
13089 gen_lowpart (GET_MODE (dest),
13090 SET_SRC (setter)));
13091 else
13092 record_value_for_reg (dest, record_dead_insn, NULL_RTX);
13093 }
13094 else if (MEM_P (dest)
13095 /* Ignore pushes, they clobber nothing. */
13096 && ! push_operand (dest, GET_MODE (dest)))
13097 mem_last_set = DF_INSN_LUID (record_dead_insn);
13098 }
13099
13100 /* Update the records of when each REG was most recently set or killed
13101 for the things done by INSN. This is the last thing done in processing
13102 INSN in the combiner loop.
13103
13104 We update reg_stat[], in particular fields last_set, last_set_value,
13105 last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
13106 last_death, and also the similar information mem_last_set (which insn
13107 most recently modified memory) and last_call_luid (which insn was the
13108 most recent subroutine call). */
13109
13110 static void
13111 record_dead_and_set_regs (rtx_insn *insn)
13112 {
13113 rtx link;
13114 unsigned int i;
13115
13116 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
13117 {
13118 if (REG_NOTE_KIND (link) == REG_DEAD
13119 && REG_P (XEXP (link, 0)))
13120 {
13121 unsigned int regno = REGNO (XEXP (link, 0));
13122 unsigned int endregno = END_REGNO (XEXP (link, 0));
13123
13124 for (i = regno; i < endregno; i++)
13125 {
13126 reg_stat_type *rsp;
13127
13128 rsp = &reg_stat[i];
13129 rsp->last_death = insn;
13130 }
13131 }
13132 else if (REG_NOTE_KIND (link) == REG_INC)
13133 record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
13134 }
13135
13136 if (CALL_P (insn))
13137 {
13138 hard_reg_set_iterator hrsi;
13139 EXECUTE_IF_SET_IN_HARD_REG_SET (regs_invalidated_by_call, 0, i, hrsi)
13140 {
13141 reg_stat_type *rsp;
13142
13143 rsp = &reg_stat[i];
13144 rsp->last_set_invalid = 1;
13145 rsp->last_set = insn;
13146 rsp->last_set_value = 0;
13147 rsp->last_set_mode = VOIDmode;
13148 rsp->last_set_nonzero_bits = 0;
13149 rsp->last_set_sign_bit_copies = 0;
13150 rsp->last_death = 0;
13151 rsp->truncated_to_mode = VOIDmode;
13152 }
13153
13154 last_call_luid = mem_last_set = DF_INSN_LUID (insn);
13155
13156 /* We can't combine into a call pattern. Remember, though, that
13157 the return value register is set at this LUID. We could
13158 still replace a register with the return value from the
13159 wrong subroutine call! */
13160 note_stores (PATTERN (insn), record_dead_and_set_regs_1, NULL_RTX);
13161 }
13162 else
13163 note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
13164 }
13165
13166 /* If a SUBREG has the promoted bit set, it is in fact a property of the
13167 register present in the SUBREG, so for each such SUBREG go back and
13168 adjust nonzero and sign bit information of the registers that are
13169 known to have some zero/sign bits set.
13170
13171 This is needed because when combine blows the SUBREGs away, the
13172 information on zero/sign bits is lost and further combines can be
13173 missed because of that. */
13174
13175 static void
13176 record_promoted_value (rtx_insn *insn, rtx subreg)
13177 {
13178 struct insn_link *links;
13179 rtx set;
13180 unsigned int regno = REGNO (SUBREG_REG (subreg));
13181 machine_mode mode = GET_MODE (subreg);
13182
13183 if (GET_MODE_PRECISION (mode) > HOST_BITS_PER_WIDE_INT)
13184 return;
13185
13186 for (links = LOG_LINKS (insn); links;)
13187 {
13188 reg_stat_type *rsp;
13189
13190 insn = links->insn;
13191 set = single_set (insn);
13192
13193 if (! set || !REG_P (SET_DEST (set))
13194 || REGNO (SET_DEST (set)) != regno
13195 || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
13196 {
13197 links = links->next;
13198 continue;
13199 }
13200
13201 rsp = &reg_stat[regno];
13202 if (rsp->last_set == insn)
13203 {
13204 if (SUBREG_PROMOTED_UNSIGNED_P (subreg))
13205 rsp->last_set_nonzero_bits &= GET_MODE_MASK (mode);
13206 }
13207
13208 if (REG_P (SET_SRC (set)))
13209 {
13210 regno = REGNO (SET_SRC (set));
13211 links = LOG_LINKS (insn);
13212 }
13213 else
13214 break;
13215 }
13216 }
13217
13218 /* Check if X, a register, is known to contain a value already
13219 truncated to MODE. In this case we can use a subreg to refer to
13220 the truncated value even though in the generic case we would need
13221 an explicit truncation. */
13222
13223 static bool
13224 reg_truncated_to_mode (machine_mode mode, const_rtx x)
13225 {
13226 reg_stat_type *rsp = &reg_stat[REGNO (x)];
13227 machine_mode truncated = rsp->truncated_to_mode;
13228
13229 if (truncated == 0
13230 || rsp->truncation_label < label_tick_ebb_start)
13231 return false;
13232 if (GET_MODE_SIZE (truncated) <= GET_MODE_SIZE (mode))
13233 return true;
13234 if (TRULY_NOOP_TRUNCATION_MODES_P (mode, truncated))
13235 return true;
13236 return false;
13237 }
13238
13239 /* If X is a hard reg or a subreg record the mode that the register is
13240 accessed in. For non-TRULY_NOOP_TRUNCATION targets we might be able
13241 to turn a truncate into a subreg using this information. Return true
13242 if traversing X is complete. */
13243
13244 static bool
13245 record_truncated_value (rtx x)
13246 {
13247 machine_mode truncated_mode;
13248 reg_stat_type *rsp;
13249
13250 if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x)))
13251 {
13252 machine_mode original_mode = GET_MODE (SUBREG_REG (x));
13253 truncated_mode = GET_MODE (x);
13254
13255 if (GET_MODE_SIZE (original_mode) <= GET_MODE_SIZE (truncated_mode))
13256 return true;
13257
13258 if (TRULY_NOOP_TRUNCATION_MODES_P (truncated_mode, original_mode))
13259 return true;
13260
13261 x = SUBREG_REG (x);
13262 }
13263 /* ??? For hard-regs we now record everything. We might be able to
13264 optimize this using last_set_mode. */
13265 else if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
13266 truncated_mode = GET_MODE (x);
13267 else
13268 return false;
13269
13270 rsp = &reg_stat[REGNO (x)];
13271 if (rsp->truncated_to_mode == 0
13272 || rsp->truncation_label < label_tick_ebb_start
13273 || (GET_MODE_SIZE (truncated_mode)
13274 < GET_MODE_SIZE (rsp->truncated_to_mode)))
13275 {
13276 rsp->truncated_to_mode = truncated_mode;
13277 rsp->truncation_label = label_tick;
13278 }
13279
13280 return true;
13281 }
13282
13283 /* Callback for note_uses. Find hardregs and subregs of pseudos and
13284 the modes they are used in. This can help truning TRUNCATEs into
13285 SUBREGs. */
13286
13287 static void
13288 record_truncated_values (rtx *loc, void *data ATTRIBUTE_UNUSED)
13289 {
13290 subrtx_var_iterator::array_type array;
13291 FOR_EACH_SUBRTX_VAR (iter, array, *loc, NONCONST)
13292 if (record_truncated_value (*iter))
13293 iter.skip_subrtxes ();
13294 }
13295
13296 /* Scan X for promoted SUBREGs. For each one found,
13297 note what it implies to the registers used in it. */
13298
13299 static void
13300 check_promoted_subreg (rtx_insn *insn, rtx x)
13301 {
13302 if (GET_CODE (x) == SUBREG
13303 && SUBREG_PROMOTED_VAR_P (x)
13304 && REG_P (SUBREG_REG (x)))
13305 record_promoted_value (insn, x);
13306 else
13307 {
13308 const char *format = GET_RTX_FORMAT (GET_CODE (x));
13309 int i, j;
13310
13311 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
13312 switch (format[i])
13313 {
13314 case 'e':
13315 check_promoted_subreg (insn, XEXP (x, i));
13316 break;
13317 case 'V':
13318 case 'E':
13319 if (XVEC (x, i) != 0)
13320 for (j = 0; j < XVECLEN (x, i); j++)
13321 check_promoted_subreg (insn, XVECEXP (x, i, j));
13322 break;
13323 }
13324 }
13325 }
13326 \f
13327 /* Verify that all the registers and memory references mentioned in *LOC are
13328 still valid. *LOC was part of a value set in INSN when label_tick was
13329 equal to TICK. Return 0 if some are not. If REPLACE is nonzero, replace
13330 the invalid references with (clobber (const_int 0)) and return 1. This
13331 replacement is useful because we often can get useful information about
13332 the form of a value (e.g., if it was produced by a shift that always
13333 produces -1 or 0) even though we don't know exactly what registers it
13334 was produced from. */
13335
13336 static int
13337 get_last_value_validate (rtx *loc, rtx_insn *insn, int tick, int replace)
13338 {
13339 rtx x = *loc;
13340 const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
13341 int len = GET_RTX_LENGTH (GET_CODE (x));
13342 int i, j;
13343
13344 if (REG_P (x))
13345 {
13346 unsigned int regno = REGNO (x);
13347 unsigned int endregno = END_REGNO (x);
13348 unsigned int j;
13349
13350 for (j = regno; j < endregno; j++)
13351 {
13352 reg_stat_type *rsp = &reg_stat[j];
13353 if (rsp->last_set_invalid
13354 /* If this is a pseudo-register that was only set once and not
13355 live at the beginning of the function, it is always valid. */
13356 || (! (regno >= FIRST_PSEUDO_REGISTER
13357 && regno < reg_n_sets_max
13358 && REG_N_SETS (regno) == 1
13359 && (!REGNO_REG_SET_P
13360 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
13361 regno)))
13362 && rsp->last_set_label > tick))
13363 {
13364 if (replace)
13365 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
13366 return replace;
13367 }
13368 }
13369
13370 return 1;
13371 }
13372 /* If this is a memory reference, make sure that there were no stores after
13373 it that might have clobbered the value. We don't have alias info, so we
13374 assume any store invalidates it. Moreover, we only have local UIDs, so
13375 we also assume that there were stores in the intervening basic blocks. */
13376 else if (MEM_P (x) && !MEM_READONLY_P (x)
13377 && (tick != label_tick || DF_INSN_LUID (insn) <= mem_last_set))
13378 {
13379 if (replace)
13380 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
13381 return replace;
13382 }
13383
13384 for (i = 0; i < len; i++)
13385 {
13386 if (fmt[i] == 'e')
13387 {
13388 /* Check for identical subexpressions. If x contains
13389 identical subexpression we only have to traverse one of
13390 them. */
13391 if (i == 1 && ARITHMETIC_P (x))
13392 {
13393 /* Note that at this point x0 has already been checked
13394 and found valid. */
13395 rtx x0 = XEXP (x, 0);
13396 rtx x1 = XEXP (x, 1);
13397
13398 /* If x0 and x1 are identical then x is also valid. */
13399 if (x0 == x1)
13400 return 1;
13401
13402 /* If x1 is identical to a subexpression of x0 then
13403 while checking x0, x1 has already been checked. Thus
13404 it is valid and so as x. */
13405 if (ARITHMETIC_P (x0)
13406 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
13407 return 1;
13408
13409 /* If x0 is identical to a subexpression of x1 then x is
13410 valid iff the rest of x1 is valid. */
13411 if (ARITHMETIC_P (x1)
13412 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
13413 return
13414 get_last_value_validate (&XEXP (x1,
13415 x0 == XEXP (x1, 0) ? 1 : 0),
13416 insn, tick, replace);
13417 }
13418
13419 if (get_last_value_validate (&XEXP (x, i), insn, tick,
13420 replace) == 0)
13421 return 0;
13422 }
13423 else if (fmt[i] == 'E')
13424 for (j = 0; j < XVECLEN (x, i); j++)
13425 if (get_last_value_validate (&XVECEXP (x, i, j),
13426 insn, tick, replace) == 0)
13427 return 0;
13428 }
13429
13430 /* If we haven't found a reason for it to be invalid, it is valid. */
13431 return 1;
13432 }
13433
13434 /* Get the last value assigned to X, if known. Some registers
13435 in the value may be replaced with (clobber (const_int 0)) if their value
13436 is known longer known reliably. */
13437
13438 static rtx
13439 get_last_value (const_rtx x)
13440 {
13441 unsigned int regno;
13442 rtx value;
13443 reg_stat_type *rsp;
13444
13445 /* If this is a non-paradoxical SUBREG, get the value of its operand and
13446 then convert it to the desired mode. If this is a paradoxical SUBREG,
13447 we cannot predict what values the "extra" bits might have. */
13448 if (GET_CODE (x) == SUBREG
13449 && subreg_lowpart_p (x)
13450 && !paradoxical_subreg_p (x)
13451 && (value = get_last_value (SUBREG_REG (x))) != 0)
13452 return gen_lowpart (GET_MODE (x), value);
13453
13454 if (!REG_P (x))
13455 return 0;
13456
13457 regno = REGNO (x);
13458 rsp = &reg_stat[regno];
13459 value = rsp->last_set_value;
13460
13461 /* If we don't have a value, or if it isn't for this basic block and
13462 it's either a hard register, set more than once, or it's a live
13463 at the beginning of the function, return 0.
13464
13465 Because if it's not live at the beginning of the function then the reg
13466 is always set before being used (is never used without being set).
13467 And, if it's set only once, and it's always set before use, then all
13468 uses must have the same last value, even if it's not from this basic
13469 block. */
13470
13471 if (value == 0
13472 || (rsp->last_set_label < label_tick_ebb_start
13473 && (regno < FIRST_PSEUDO_REGISTER
13474 || regno >= reg_n_sets_max
13475 || REG_N_SETS (regno) != 1
13476 || REGNO_REG_SET_P
13477 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb), regno))))
13478 return 0;
13479
13480 /* If the value was set in a later insn than the ones we are processing,
13481 we can't use it even if the register was only set once. */
13482 if (rsp->last_set_label == label_tick
13483 && DF_INSN_LUID (rsp->last_set) >= subst_low_luid)
13484 return 0;
13485
13486 /* If fewer bits were set than what we are asked for now, we cannot use
13487 the value. */
13488 if (GET_MODE_PRECISION (rsp->last_set_mode)
13489 < GET_MODE_PRECISION (GET_MODE (x)))
13490 return 0;
13491
13492 /* If the value has all its registers valid, return it. */
13493 if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 0))
13494 return value;
13495
13496 /* Otherwise, make a copy and replace any invalid register with
13497 (clobber (const_int 0)). If that fails for some reason, return 0. */
13498
13499 value = copy_rtx (value);
13500 if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 1))
13501 return value;
13502
13503 return 0;
13504 }
13505 \f
13506 /* Return nonzero if expression X refers to a REG or to memory
13507 that is set in an instruction more recent than FROM_LUID. */
13508
13509 static int
13510 use_crosses_set_p (const_rtx x, int from_luid)
13511 {
13512 const char *fmt;
13513 int i;
13514 enum rtx_code code = GET_CODE (x);
13515
13516 if (code == REG)
13517 {
13518 unsigned int regno = REGNO (x);
13519 unsigned endreg = END_REGNO (x);
13520
13521 #ifdef PUSH_ROUNDING
13522 /* Don't allow uses of the stack pointer to be moved,
13523 because we don't know whether the move crosses a push insn. */
13524 if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
13525 return 1;
13526 #endif
13527 for (; regno < endreg; regno++)
13528 {
13529 reg_stat_type *rsp = &reg_stat[regno];
13530 if (rsp->last_set
13531 && rsp->last_set_label == label_tick
13532 && DF_INSN_LUID (rsp->last_set) > from_luid)
13533 return 1;
13534 }
13535 return 0;
13536 }
13537
13538 if (code == MEM && mem_last_set > from_luid)
13539 return 1;
13540
13541 fmt = GET_RTX_FORMAT (code);
13542
13543 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
13544 {
13545 if (fmt[i] == 'E')
13546 {
13547 int j;
13548 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
13549 if (use_crosses_set_p (XVECEXP (x, i, j), from_luid))
13550 return 1;
13551 }
13552 else if (fmt[i] == 'e'
13553 && use_crosses_set_p (XEXP (x, i), from_luid))
13554 return 1;
13555 }
13556 return 0;
13557 }
13558 \f
13559 /* Define three variables used for communication between the following
13560 routines. */
13561
13562 static unsigned int reg_dead_regno, reg_dead_endregno;
13563 static int reg_dead_flag;
13564
13565 /* Function called via note_stores from reg_dead_at_p.
13566
13567 If DEST is within [reg_dead_regno, reg_dead_endregno), set
13568 reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET. */
13569
13570 static void
13571 reg_dead_at_p_1 (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
13572 {
13573 unsigned int regno, endregno;
13574
13575 if (!REG_P (dest))
13576 return;
13577
13578 regno = REGNO (dest);
13579 endregno = END_REGNO (dest);
13580 if (reg_dead_endregno > regno && reg_dead_regno < endregno)
13581 reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
13582 }
13583
13584 /* Return nonzero if REG is known to be dead at INSN.
13585
13586 We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER
13587 referencing REG, it is dead. If we hit a SET referencing REG, it is
13588 live. Otherwise, see if it is live or dead at the start of the basic
13589 block we are in. Hard regs marked as being live in NEWPAT_USED_REGS
13590 must be assumed to be always live. */
13591
13592 static int
13593 reg_dead_at_p (rtx reg, rtx_insn *insn)
13594 {
13595 basic_block block;
13596 unsigned int i;
13597
13598 /* Set variables for reg_dead_at_p_1. */
13599 reg_dead_regno = REGNO (reg);
13600 reg_dead_endregno = END_REGNO (reg);
13601
13602 reg_dead_flag = 0;
13603
13604 /* Check that reg isn't mentioned in NEWPAT_USED_REGS. For fixed registers
13605 we allow the machine description to decide whether use-and-clobber
13606 patterns are OK. */
13607 if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
13608 {
13609 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
13610 if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
13611 return 0;
13612 }
13613
13614 /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, or
13615 beginning of basic block. */
13616 block = BLOCK_FOR_INSN (insn);
13617 for (;;)
13618 {
13619 if (INSN_P (insn))
13620 {
13621 if (find_regno_note (insn, REG_UNUSED, reg_dead_regno))
13622 return 1;
13623
13624 note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
13625 if (reg_dead_flag)
13626 return reg_dead_flag == 1 ? 1 : 0;
13627
13628 if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
13629 return 1;
13630 }
13631
13632 if (insn == BB_HEAD (block))
13633 break;
13634
13635 insn = PREV_INSN (insn);
13636 }
13637
13638 /* Look at live-in sets for the basic block that we were in. */
13639 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
13640 if (REGNO_REG_SET_P (df_get_live_in (block), i))
13641 return 0;
13642
13643 return 1;
13644 }
13645 \f
13646 /* Note hard registers in X that are used. */
13647
13648 static void
13649 mark_used_regs_combine (rtx x)
13650 {
13651 RTX_CODE code = GET_CODE (x);
13652 unsigned int regno;
13653 int i;
13654
13655 switch (code)
13656 {
13657 case LABEL_REF:
13658 case SYMBOL_REF:
13659 case CONST:
13660 CASE_CONST_ANY:
13661 case PC:
13662 case ADDR_VEC:
13663 case ADDR_DIFF_VEC:
13664 case ASM_INPUT:
13665 /* CC0 must die in the insn after it is set, so we don't need to take
13666 special note of it here. */
13667 case CC0:
13668 return;
13669
13670 case CLOBBER:
13671 /* If we are clobbering a MEM, mark any hard registers inside the
13672 address as used. */
13673 if (MEM_P (XEXP (x, 0)))
13674 mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
13675 return;
13676
13677 case REG:
13678 regno = REGNO (x);
13679 /* A hard reg in a wide mode may really be multiple registers.
13680 If so, mark all of them just like the first. */
13681 if (regno < FIRST_PSEUDO_REGISTER)
13682 {
13683 /* None of this applies to the stack, frame or arg pointers. */
13684 if (regno == STACK_POINTER_REGNUM
13685 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER
13686 && regno == HARD_FRAME_POINTER_REGNUM)
13687 || (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
13688 && regno == ARG_POINTER_REGNUM && fixed_regs[regno])
13689 || regno == FRAME_POINTER_REGNUM)
13690 return;
13691
13692 add_to_hard_reg_set (&newpat_used_regs, GET_MODE (x), regno);
13693 }
13694 return;
13695
13696 case SET:
13697 {
13698 /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
13699 the address. */
13700 rtx testreg = SET_DEST (x);
13701
13702 while (GET_CODE (testreg) == SUBREG
13703 || GET_CODE (testreg) == ZERO_EXTRACT
13704 || GET_CODE (testreg) == STRICT_LOW_PART)
13705 testreg = XEXP (testreg, 0);
13706
13707 if (MEM_P (testreg))
13708 mark_used_regs_combine (XEXP (testreg, 0));
13709
13710 mark_used_regs_combine (SET_SRC (x));
13711 }
13712 return;
13713
13714 default:
13715 break;
13716 }
13717
13718 /* Recursively scan the operands of this expression. */
13719
13720 {
13721 const char *fmt = GET_RTX_FORMAT (code);
13722
13723 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
13724 {
13725 if (fmt[i] == 'e')
13726 mark_used_regs_combine (XEXP (x, i));
13727 else if (fmt[i] == 'E')
13728 {
13729 int j;
13730
13731 for (j = 0; j < XVECLEN (x, i); j++)
13732 mark_used_regs_combine (XVECEXP (x, i, j));
13733 }
13734 }
13735 }
13736 }
13737 \f
13738 /* Remove register number REGNO from the dead registers list of INSN.
13739
13740 Return the note used to record the death, if there was one. */
13741
13742 rtx
13743 remove_death (unsigned int regno, rtx_insn *insn)
13744 {
13745 rtx note = find_regno_note (insn, REG_DEAD, regno);
13746
13747 if (note)
13748 remove_note (insn, note);
13749
13750 return note;
13751 }
13752
13753 /* For each register (hardware or pseudo) used within expression X, if its
13754 death is in an instruction with luid between FROM_LUID (inclusive) and
13755 TO_INSN (exclusive), put a REG_DEAD note for that register in the
13756 list headed by PNOTES.
13757
13758 That said, don't move registers killed by maybe_kill_insn.
13759
13760 This is done when X is being merged by combination into TO_INSN. These
13761 notes will then be distributed as needed. */
13762
13763 static void
13764 move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx_insn *to_insn,
13765 rtx *pnotes)
13766 {
13767 const char *fmt;
13768 int len, i;
13769 enum rtx_code code = GET_CODE (x);
13770
13771 if (code == REG)
13772 {
13773 unsigned int regno = REGNO (x);
13774 rtx_insn *where_dead = reg_stat[regno].last_death;
13775
13776 /* Don't move the register if it gets killed in between from and to. */
13777 if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
13778 && ! reg_referenced_p (x, maybe_kill_insn))
13779 return;
13780
13781 if (where_dead
13782 && BLOCK_FOR_INSN (where_dead) == BLOCK_FOR_INSN (to_insn)
13783 && DF_INSN_LUID (where_dead) >= from_luid
13784 && DF_INSN_LUID (where_dead) < DF_INSN_LUID (to_insn))
13785 {
13786 rtx note = remove_death (regno, where_dead);
13787
13788 /* It is possible for the call above to return 0. This can occur
13789 when last_death points to I2 or I1 that we combined with.
13790 In that case make a new note.
13791
13792 We must also check for the case where X is a hard register
13793 and NOTE is a death note for a range of hard registers
13794 including X. In that case, we must put REG_DEAD notes for
13795 the remaining registers in place of NOTE. */
13796
13797 if (note != 0 && regno < FIRST_PSEUDO_REGISTER
13798 && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
13799 > GET_MODE_SIZE (GET_MODE (x))))
13800 {
13801 unsigned int deadregno = REGNO (XEXP (note, 0));
13802 unsigned int deadend = END_REGNO (XEXP (note, 0));
13803 unsigned int ourend = END_REGNO (x);
13804 unsigned int i;
13805
13806 for (i = deadregno; i < deadend; i++)
13807 if (i < regno || i >= ourend)
13808 add_reg_note (where_dead, REG_DEAD, regno_reg_rtx[i]);
13809 }
13810
13811 /* If we didn't find any note, or if we found a REG_DEAD note that
13812 covers only part of the given reg, and we have a multi-reg hard
13813 register, then to be safe we must check for REG_DEAD notes
13814 for each register other than the first. They could have
13815 their own REG_DEAD notes lying around. */
13816 else if ((note == 0
13817 || (note != 0
13818 && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
13819 < GET_MODE_SIZE (GET_MODE (x)))))
13820 && regno < FIRST_PSEUDO_REGISTER
13821 && REG_NREGS (x) > 1)
13822 {
13823 unsigned int ourend = END_REGNO (x);
13824 unsigned int i, offset;
13825 rtx oldnotes = 0;
13826
13827 if (note)
13828 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
13829 else
13830 offset = 1;
13831
13832 for (i = regno + offset; i < ourend; i++)
13833 move_deaths (regno_reg_rtx[i],
13834 maybe_kill_insn, from_luid, to_insn, &oldnotes);
13835 }
13836
13837 if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
13838 {
13839 XEXP (note, 1) = *pnotes;
13840 *pnotes = note;
13841 }
13842 else
13843 *pnotes = alloc_reg_note (REG_DEAD, x, *pnotes);
13844 }
13845
13846 return;
13847 }
13848
13849 else if (GET_CODE (x) == SET)
13850 {
13851 rtx dest = SET_DEST (x);
13852
13853 move_deaths (SET_SRC (x), maybe_kill_insn, from_luid, to_insn, pnotes);
13854
13855 /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
13856 that accesses one word of a multi-word item, some
13857 piece of everything register in the expression is used by
13858 this insn, so remove any old death. */
13859 /* ??? So why do we test for equality of the sizes? */
13860
13861 if (GET_CODE (dest) == ZERO_EXTRACT
13862 || GET_CODE (dest) == STRICT_LOW_PART
13863 || (GET_CODE (dest) == SUBREG
13864 && (((GET_MODE_SIZE (GET_MODE (dest))
13865 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
13866 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
13867 + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
13868 {
13869 move_deaths (dest, maybe_kill_insn, from_luid, to_insn, pnotes);
13870 return;
13871 }
13872
13873 /* If this is some other SUBREG, we know it replaces the entire
13874 value, so use that as the destination. */
13875 if (GET_CODE (dest) == SUBREG)
13876 dest = SUBREG_REG (dest);
13877
13878 /* If this is a MEM, adjust deaths of anything used in the address.
13879 For a REG (the only other possibility), the entire value is
13880 being replaced so the old value is not used in this insn. */
13881
13882 if (MEM_P (dest))
13883 move_deaths (XEXP (dest, 0), maybe_kill_insn, from_luid,
13884 to_insn, pnotes);
13885 return;
13886 }
13887
13888 else if (GET_CODE (x) == CLOBBER)
13889 return;
13890
13891 len = GET_RTX_LENGTH (code);
13892 fmt = GET_RTX_FORMAT (code);
13893
13894 for (i = 0; i < len; i++)
13895 {
13896 if (fmt[i] == 'E')
13897 {
13898 int j;
13899 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
13900 move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_luid,
13901 to_insn, pnotes);
13902 }
13903 else if (fmt[i] == 'e')
13904 move_deaths (XEXP (x, i), maybe_kill_insn, from_luid, to_insn, pnotes);
13905 }
13906 }
13907 \f
13908 /* Return 1 if X is the target of a bit-field assignment in BODY, the
13909 pattern of an insn. X must be a REG. */
13910
13911 static int
13912 reg_bitfield_target_p (rtx x, rtx body)
13913 {
13914 int i;
13915
13916 if (GET_CODE (body) == SET)
13917 {
13918 rtx dest = SET_DEST (body);
13919 rtx target;
13920 unsigned int regno, tregno, endregno, endtregno;
13921
13922 if (GET_CODE (dest) == ZERO_EXTRACT)
13923 target = XEXP (dest, 0);
13924 else if (GET_CODE (dest) == STRICT_LOW_PART)
13925 target = SUBREG_REG (XEXP (dest, 0));
13926 else
13927 return 0;
13928
13929 if (GET_CODE (target) == SUBREG)
13930 target = SUBREG_REG (target);
13931
13932 if (!REG_P (target))
13933 return 0;
13934
13935 tregno = REGNO (target), regno = REGNO (x);
13936 if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
13937 return target == x;
13938
13939 endtregno = end_hard_regno (GET_MODE (target), tregno);
13940 endregno = end_hard_regno (GET_MODE (x), regno);
13941
13942 return endregno > tregno && regno < endtregno;
13943 }
13944
13945 else if (GET_CODE (body) == PARALLEL)
13946 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
13947 if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
13948 return 1;
13949
13950 return 0;
13951 }
13952 \f
13953 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
13954 as appropriate. I3 and I2 are the insns resulting from the combination
13955 insns including FROM (I2 may be zero).
13956
13957 ELIM_I2 and ELIM_I1 are either zero or registers that we know will
13958 not need REG_DEAD notes because they are being substituted for. This
13959 saves searching in the most common cases.
13960
13961 Each note in the list is either ignored or placed on some insns, depending
13962 on the type of note. */
13963
13964 static void
13965 distribute_notes (rtx notes, rtx_insn *from_insn, rtx_insn *i3, rtx_insn *i2,
13966 rtx elim_i2, rtx elim_i1, rtx elim_i0)
13967 {
13968 rtx note, next_note;
13969 rtx tem_note;
13970 rtx_insn *tem_insn;
13971
13972 for (note = notes; note; note = next_note)
13973 {
13974 rtx_insn *place = 0, *place2 = 0;
13975
13976 next_note = XEXP (note, 1);
13977 switch (REG_NOTE_KIND (note))
13978 {
13979 case REG_BR_PROB:
13980 case REG_BR_PRED:
13981 /* Doesn't matter much where we put this, as long as it's somewhere.
13982 It is preferable to keep these notes on branches, which is most
13983 likely to be i3. */
13984 place = i3;
13985 break;
13986
13987 case REG_NON_LOCAL_GOTO:
13988 if (JUMP_P (i3))
13989 place = i3;
13990 else
13991 {
13992 gcc_assert (i2 && JUMP_P (i2));
13993 place = i2;
13994 }
13995 break;
13996
13997 case REG_EH_REGION:
13998 /* These notes must remain with the call or trapping instruction. */
13999 if (CALL_P (i3))
14000 place = i3;
14001 else if (i2 && CALL_P (i2))
14002 place = i2;
14003 else
14004 {
14005 gcc_assert (cfun->can_throw_non_call_exceptions);
14006 if (may_trap_p (i3))
14007 place = i3;
14008 else if (i2 && may_trap_p (i2))
14009 place = i2;
14010 /* ??? Otherwise assume we've combined things such that we
14011 can now prove that the instructions can't trap. Drop the
14012 note in this case. */
14013 }
14014 break;
14015
14016 case REG_ARGS_SIZE:
14017 /* ??? How to distribute between i3-i1. Assume i3 contains the
14018 entire adjustment. Assert i3 contains at least some adjust. */
14019 if (!noop_move_p (i3))
14020 {
14021 int old_size, args_size = INTVAL (XEXP (note, 0));
14022 /* fixup_args_size_notes looks at REG_NORETURN note,
14023 so ensure the note is placed there first. */
14024 if (CALL_P (i3))
14025 {
14026 rtx *np;
14027 for (np = &next_note; *np; np = &XEXP (*np, 1))
14028 if (REG_NOTE_KIND (*np) == REG_NORETURN)
14029 {
14030 rtx n = *np;
14031 *np = XEXP (n, 1);
14032 XEXP (n, 1) = REG_NOTES (i3);
14033 REG_NOTES (i3) = n;
14034 break;
14035 }
14036 }
14037 old_size = fixup_args_size_notes (PREV_INSN (i3), i3, args_size);
14038 /* emit_call_1 adds for !ACCUMULATE_OUTGOING_ARGS
14039 REG_ARGS_SIZE note to all noreturn calls, allow that here. */
14040 gcc_assert (old_size != args_size
14041 || (CALL_P (i3)
14042 && !ACCUMULATE_OUTGOING_ARGS
14043 && find_reg_note (i3, REG_NORETURN, NULL_RTX)));
14044 }
14045 break;
14046
14047 case REG_NORETURN:
14048 case REG_SETJMP:
14049 case REG_TM:
14050 case REG_CALL_DECL:
14051 /* These notes must remain with the call. It should not be
14052 possible for both I2 and I3 to be a call. */
14053 if (CALL_P (i3))
14054 place = i3;
14055 else
14056 {
14057 gcc_assert (i2 && CALL_P (i2));
14058 place = i2;
14059 }
14060 break;
14061
14062 case REG_UNUSED:
14063 /* Any clobbers for i3 may still exist, and so we must process
14064 REG_UNUSED notes from that insn.
14065
14066 Any clobbers from i2 or i1 can only exist if they were added by
14067 recog_for_combine. In that case, recog_for_combine created the
14068 necessary REG_UNUSED notes. Trying to keep any original
14069 REG_UNUSED notes from these insns can cause incorrect output
14070 if it is for the same register as the original i3 dest.
14071 In that case, we will notice that the register is set in i3,
14072 and then add a REG_UNUSED note for the destination of i3, which
14073 is wrong. However, it is possible to have REG_UNUSED notes from
14074 i2 or i1 for register which were both used and clobbered, so
14075 we keep notes from i2 or i1 if they will turn into REG_DEAD
14076 notes. */
14077
14078 /* If this register is set or clobbered in I3, put the note there
14079 unless there is one already. */
14080 if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
14081 {
14082 if (from_insn != i3)
14083 break;
14084
14085 if (! (REG_P (XEXP (note, 0))
14086 ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
14087 : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
14088 place = i3;
14089 }
14090 /* Otherwise, if this register is used by I3, then this register
14091 now dies here, so we must put a REG_DEAD note here unless there
14092 is one already. */
14093 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
14094 && ! (REG_P (XEXP (note, 0))
14095 ? find_regno_note (i3, REG_DEAD,
14096 REGNO (XEXP (note, 0)))
14097 : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
14098 {
14099 PUT_REG_NOTE_KIND (note, REG_DEAD);
14100 place = i3;
14101 }
14102 break;
14103
14104 case REG_EQUAL:
14105 case REG_EQUIV:
14106 case REG_NOALIAS:
14107 /* These notes say something about results of an insn. We can
14108 only support them if they used to be on I3 in which case they
14109 remain on I3. Otherwise they are ignored.
14110
14111 If the note refers to an expression that is not a constant, we
14112 must also ignore the note since we cannot tell whether the
14113 equivalence is still true. It might be possible to do
14114 slightly better than this (we only have a problem if I2DEST
14115 or I1DEST is present in the expression), but it doesn't
14116 seem worth the trouble. */
14117
14118 if (from_insn == i3
14119 && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
14120 place = i3;
14121 break;
14122
14123 case REG_INC:
14124 /* These notes say something about how a register is used. They must
14125 be present on any use of the register in I2 or I3. */
14126 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
14127 place = i3;
14128
14129 if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
14130 {
14131 if (place)
14132 place2 = i2;
14133 else
14134 place = i2;
14135 }
14136 break;
14137
14138 case REG_LABEL_TARGET:
14139 case REG_LABEL_OPERAND:
14140 /* This can show up in several ways -- either directly in the
14141 pattern, or hidden off in the constant pool with (or without?)
14142 a REG_EQUAL note. */
14143 /* ??? Ignore the without-reg_equal-note problem for now. */
14144 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
14145 || ((tem_note = find_reg_note (i3, REG_EQUAL, NULL_RTX))
14146 && GET_CODE (XEXP (tem_note, 0)) == LABEL_REF
14147 && label_ref_label (XEXP (tem_note, 0)) == XEXP (note, 0)))
14148 place = i3;
14149
14150 if (i2
14151 && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
14152 || ((tem_note = find_reg_note (i2, REG_EQUAL, NULL_RTX))
14153 && GET_CODE (XEXP (tem_note, 0)) == LABEL_REF
14154 && label_ref_label (XEXP (tem_note, 0)) == XEXP (note, 0))))
14155 {
14156 if (place)
14157 place2 = i2;
14158 else
14159 place = i2;
14160 }
14161
14162 /* For REG_LABEL_TARGET on a JUMP_P, we prefer to put the note
14163 as a JUMP_LABEL or decrement LABEL_NUSES if it's already
14164 there. */
14165 if (place && JUMP_P (place)
14166 && REG_NOTE_KIND (note) == REG_LABEL_TARGET
14167 && (JUMP_LABEL (place) == NULL
14168 || JUMP_LABEL (place) == XEXP (note, 0)))
14169 {
14170 rtx label = JUMP_LABEL (place);
14171
14172 if (!label)
14173 JUMP_LABEL (place) = XEXP (note, 0);
14174 else if (LABEL_P (label))
14175 LABEL_NUSES (label)--;
14176 }
14177
14178 if (place2 && JUMP_P (place2)
14179 && REG_NOTE_KIND (note) == REG_LABEL_TARGET
14180 && (JUMP_LABEL (place2) == NULL
14181 || JUMP_LABEL (place2) == XEXP (note, 0)))
14182 {
14183 rtx label = JUMP_LABEL (place2);
14184
14185 if (!label)
14186 JUMP_LABEL (place2) = XEXP (note, 0);
14187 else if (LABEL_P (label))
14188 LABEL_NUSES (label)--;
14189 place2 = 0;
14190 }
14191 break;
14192
14193 case REG_NONNEG:
14194 /* This note says something about the value of a register prior
14195 to the execution of an insn. It is too much trouble to see
14196 if the note is still correct in all situations. It is better
14197 to simply delete it. */
14198 break;
14199
14200 case REG_DEAD:
14201 /* If we replaced the right hand side of FROM_INSN with a
14202 REG_EQUAL note, the original use of the dying register
14203 will not have been combined into I3 and I2. In such cases,
14204 FROM_INSN is guaranteed to be the first of the combined
14205 instructions, so we simply need to search back before
14206 FROM_INSN for the previous use or set of this register,
14207 then alter the notes there appropriately.
14208
14209 If the register is used as an input in I3, it dies there.
14210 Similarly for I2, if it is nonzero and adjacent to I3.
14211
14212 If the register is not used as an input in either I3 or I2
14213 and it is not one of the registers we were supposed to eliminate,
14214 there are two possibilities. We might have a non-adjacent I2
14215 or we might have somehow eliminated an additional register
14216 from a computation. For example, we might have had A & B where
14217 we discover that B will always be zero. In this case we will
14218 eliminate the reference to A.
14219
14220 In both cases, we must search to see if we can find a previous
14221 use of A and put the death note there. */
14222
14223 if (from_insn
14224 && from_insn == i2mod
14225 && !reg_overlap_mentioned_p (XEXP (note, 0), i2mod_new_rhs))
14226 tem_insn = from_insn;
14227 else
14228 {
14229 if (from_insn
14230 && CALL_P (from_insn)
14231 && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
14232 place = from_insn;
14233 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
14234 place = i3;
14235 else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
14236 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
14237 place = i2;
14238 else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
14239 && !(i2mod
14240 && reg_overlap_mentioned_p (XEXP (note, 0),
14241 i2mod_old_rhs)))
14242 || rtx_equal_p (XEXP (note, 0), elim_i1)
14243 || rtx_equal_p (XEXP (note, 0), elim_i0))
14244 break;
14245 tem_insn = i3;
14246 /* If the new I2 sets the same register that is marked dead
14247 in the note, we do not know where to put the note.
14248 Give up. */
14249 if (i2 != 0 && reg_set_p (XEXP (note, 0), PATTERN (i2)))
14250 break;
14251 }
14252
14253 if (place == 0)
14254 {
14255 basic_block bb = this_basic_block;
14256
14257 for (tem_insn = PREV_INSN (tem_insn); place == 0; tem_insn = PREV_INSN (tem_insn))
14258 {
14259 if (!NONDEBUG_INSN_P (tem_insn))
14260 {
14261 if (tem_insn == BB_HEAD (bb))
14262 break;
14263 continue;
14264 }
14265
14266 /* If the register is being set at TEM_INSN, see if that is all
14267 TEM_INSN is doing. If so, delete TEM_INSN. Otherwise, make this
14268 into a REG_UNUSED note instead. Don't delete sets to
14269 global register vars. */
14270 if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
14271 || !global_regs[REGNO (XEXP (note, 0))])
14272 && reg_set_p (XEXP (note, 0), PATTERN (tem_insn)))
14273 {
14274 rtx set = single_set (tem_insn);
14275 rtx inner_dest = 0;
14276 rtx_insn *cc0_setter = NULL;
14277
14278 if (set != 0)
14279 for (inner_dest = SET_DEST (set);
14280 (GET_CODE (inner_dest) == STRICT_LOW_PART
14281 || GET_CODE (inner_dest) == SUBREG
14282 || GET_CODE (inner_dest) == ZERO_EXTRACT);
14283 inner_dest = XEXP (inner_dest, 0))
14284 ;
14285
14286 /* Verify that it was the set, and not a clobber that
14287 modified the register.
14288
14289 CC0 targets must be careful to maintain setter/user
14290 pairs. If we cannot delete the setter due to side
14291 effects, mark the user with an UNUSED note instead
14292 of deleting it. */
14293
14294 if (set != 0 && ! side_effects_p (SET_SRC (set))
14295 && rtx_equal_p (XEXP (note, 0), inner_dest)
14296 && (!HAVE_cc0
14297 || (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
14298 || ((cc0_setter = prev_cc0_setter (tem_insn)) != NULL
14299 && sets_cc0_p (PATTERN (cc0_setter)) > 0))))
14300 {
14301 /* Move the notes and links of TEM_INSN elsewhere.
14302 This might delete other dead insns recursively.
14303 First set the pattern to something that won't use
14304 any register. */
14305 rtx old_notes = REG_NOTES (tem_insn);
14306
14307 PATTERN (tem_insn) = pc_rtx;
14308 REG_NOTES (tem_insn) = NULL;
14309
14310 distribute_notes (old_notes, tem_insn, tem_insn, NULL,
14311 NULL_RTX, NULL_RTX, NULL_RTX);
14312 distribute_links (LOG_LINKS (tem_insn));
14313
14314 unsigned int regno = REGNO (XEXP (note, 0));
14315 reg_stat_type *rsp = &reg_stat[regno];
14316 if (rsp->last_set == tem_insn)
14317 record_value_for_reg (XEXP (note, 0), NULL, NULL_RTX);
14318
14319 SET_INSN_DELETED (tem_insn);
14320 if (tem_insn == i2)
14321 i2 = NULL;
14322
14323 /* Delete the setter too. */
14324 if (cc0_setter)
14325 {
14326 PATTERN (cc0_setter) = pc_rtx;
14327 old_notes = REG_NOTES (cc0_setter);
14328 REG_NOTES (cc0_setter) = NULL;
14329
14330 distribute_notes (old_notes, cc0_setter,
14331 cc0_setter, NULL,
14332 NULL_RTX, NULL_RTX, NULL_RTX);
14333 distribute_links (LOG_LINKS (cc0_setter));
14334
14335 SET_INSN_DELETED (cc0_setter);
14336 if (cc0_setter == i2)
14337 i2 = NULL;
14338 }
14339 }
14340 else
14341 {
14342 PUT_REG_NOTE_KIND (note, REG_UNUSED);
14343
14344 /* If there isn't already a REG_UNUSED note, put one
14345 here. Do not place a REG_DEAD note, even if
14346 the register is also used here; that would not
14347 match the algorithm used in lifetime analysis
14348 and can cause the consistency check in the
14349 scheduler to fail. */
14350 if (! find_regno_note (tem_insn, REG_UNUSED,
14351 REGNO (XEXP (note, 0))))
14352 place = tem_insn;
14353 break;
14354 }
14355 }
14356 else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem_insn))
14357 || (CALL_P (tem_insn)
14358 && find_reg_fusage (tem_insn, USE, XEXP (note, 0))))
14359 {
14360 place = tem_insn;
14361
14362 /* If we are doing a 3->2 combination, and we have a
14363 register which formerly died in i3 and was not used
14364 by i2, which now no longer dies in i3 and is used in
14365 i2 but does not die in i2, and place is between i2
14366 and i3, then we may need to move a link from place to
14367 i2. */
14368 if (i2 && DF_INSN_LUID (place) > DF_INSN_LUID (i2)
14369 && from_insn
14370 && DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2)
14371 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
14372 {
14373 struct insn_link *links = LOG_LINKS (place);
14374 LOG_LINKS (place) = NULL;
14375 distribute_links (links);
14376 }
14377 break;
14378 }
14379
14380 if (tem_insn == BB_HEAD (bb))
14381 break;
14382 }
14383
14384 }
14385
14386 /* If the register is set or already dead at PLACE, we needn't do
14387 anything with this note if it is still a REG_DEAD note.
14388 We check here if it is set at all, not if is it totally replaced,
14389 which is what `dead_or_set_p' checks, so also check for it being
14390 set partially. */
14391
14392 if (place && REG_NOTE_KIND (note) == REG_DEAD)
14393 {
14394 unsigned int regno = REGNO (XEXP (note, 0));
14395 reg_stat_type *rsp = &reg_stat[regno];
14396
14397 if (dead_or_set_p (place, XEXP (note, 0))
14398 || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
14399 {
14400 /* Unless the register previously died in PLACE, clear
14401 last_death. [I no longer understand why this is
14402 being done.] */
14403 if (rsp->last_death != place)
14404 rsp->last_death = 0;
14405 place = 0;
14406 }
14407 else
14408 rsp->last_death = place;
14409
14410 /* If this is a death note for a hard reg that is occupying
14411 multiple registers, ensure that we are still using all
14412 parts of the object. If we find a piece of the object
14413 that is unused, we must arrange for an appropriate REG_DEAD
14414 note to be added for it. However, we can't just emit a USE
14415 and tag the note to it, since the register might actually
14416 be dead; so we recourse, and the recursive call then finds
14417 the previous insn that used this register. */
14418
14419 if (place && REG_NREGS (XEXP (note, 0)) > 1)
14420 {
14421 unsigned int endregno = END_REGNO (XEXP (note, 0));
14422 bool all_used = true;
14423 unsigned int i;
14424
14425 for (i = regno; i < endregno; i++)
14426 if ((! refers_to_regno_p (i, PATTERN (place))
14427 && ! find_regno_fusage (place, USE, i))
14428 || dead_or_set_regno_p (place, i))
14429 {
14430 all_used = false;
14431 break;
14432 }
14433
14434 if (! all_used)
14435 {
14436 /* Put only REG_DEAD notes for pieces that are
14437 not already dead or set. */
14438
14439 for (i = regno; i < endregno;
14440 i += hard_regno_nregs[i][reg_raw_mode[i]])
14441 {
14442 rtx piece = regno_reg_rtx[i];
14443 basic_block bb = this_basic_block;
14444
14445 if (! dead_or_set_p (place, piece)
14446 && ! reg_bitfield_target_p (piece,
14447 PATTERN (place)))
14448 {
14449 rtx new_note = alloc_reg_note (REG_DEAD, piece,
14450 NULL_RTX);
14451
14452 distribute_notes (new_note, place, place,
14453 NULL, NULL_RTX, NULL_RTX,
14454 NULL_RTX);
14455 }
14456 else if (! refers_to_regno_p (i, PATTERN (place))
14457 && ! find_regno_fusage (place, USE, i))
14458 for (tem_insn = PREV_INSN (place); ;
14459 tem_insn = PREV_INSN (tem_insn))
14460 {
14461 if (!NONDEBUG_INSN_P (tem_insn))
14462 {
14463 if (tem_insn == BB_HEAD (bb))
14464 break;
14465 continue;
14466 }
14467 if (dead_or_set_p (tem_insn, piece)
14468 || reg_bitfield_target_p (piece,
14469 PATTERN (tem_insn)))
14470 {
14471 add_reg_note (tem_insn, REG_UNUSED, piece);
14472 break;
14473 }
14474 }
14475 }
14476
14477 place = 0;
14478 }
14479 }
14480 }
14481 break;
14482
14483 default:
14484 /* Any other notes should not be present at this point in the
14485 compilation. */
14486 gcc_unreachable ();
14487 }
14488
14489 if (place)
14490 {
14491 XEXP (note, 1) = REG_NOTES (place);
14492 REG_NOTES (place) = note;
14493 }
14494
14495 if (place2)
14496 add_shallow_copy_of_reg_note (place2, note);
14497 }
14498 }
14499 \f
14500 /* Similarly to above, distribute the LOG_LINKS that used to be present on
14501 I3, I2, and I1 to new locations. This is also called to add a link
14502 pointing at I3 when I3's destination is changed. */
14503
14504 static void
14505 distribute_links (struct insn_link *links)
14506 {
14507 struct insn_link *link, *next_link;
14508
14509 for (link = links; link; link = next_link)
14510 {
14511 rtx_insn *place = 0;
14512 rtx_insn *insn;
14513 rtx set, reg;
14514
14515 next_link = link->next;
14516
14517 /* If the insn that this link points to is a NOTE, ignore it. */
14518 if (NOTE_P (link->insn))
14519 continue;
14520
14521 set = 0;
14522 rtx pat = PATTERN (link->insn);
14523 if (GET_CODE (pat) == SET)
14524 set = pat;
14525 else if (GET_CODE (pat) == PARALLEL)
14526 {
14527 int i;
14528 for (i = 0; i < XVECLEN (pat, 0); i++)
14529 {
14530 set = XVECEXP (pat, 0, i);
14531 if (GET_CODE (set) != SET)
14532 continue;
14533
14534 reg = SET_DEST (set);
14535 while (GET_CODE (reg) == ZERO_EXTRACT
14536 || GET_CODE (reg) == STRICT_LOW_PART
14537 || GET_CODE (reg) == SUBREG)
14538 reg = XEXP (reg, 0);
14539
14540 if (!REG_P (reg))
14541 continue;
14542
14543 if (REGNO (reg) == link->regno)
14544 break;
14545 }
14546 if (i == XVECLEN (pat, 0))
14547 continue;
14548 }
14549 else
14550 continue;
14551
14552 reg = SET_DEST (set);
14553
14554 while (GET_CODE (reg) == ZERO_EXTRACT
14555 || GET_CODE (reg) == STRICT_LOW_PART
14556 || GET_CODE (reg) == SUBREG)
14557 reg = XEXP (reg, 0);
14558
14559 /* A LOG_LINK is defined as being placed on the first insn that uses
14560 a register and points to the insn that sets the register. Start
14561 searching at the next insn after the target of the link and stop
14562 when we reach a set of the register or the end of the basic block.
14563
14564 Note that this correctly handles the link that used to point from
14565 I3 to I2. Also note that not much searching is typically done here
14566 since most links don't point very far away. */
14567
14568 for (insn = NEXT_INSN (link->insn);
14569 (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
14570 || BB_HEAD (this_basic_block->next_bb) != insn));
14571 insn = NEXT_INSN (insn))
14572 if (DEBUG_INSN_P (insn))
14573 continue;
14574 else if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
14575 {
14576 if (reg_referenced_p (reg, PATTERN (insn)))
14577 place = insn;
14578 break;
14579 }
14580 else if (CALL_P (insn)
14581 && find_reg_fusage (insn, USE, reg))
14582 {
14583 place = insn;
14584 break;
14585 }
14586 else if (INSN_P (insn) && reg_set_p (reg, insn))
14587 break;
14588
14589 /* If we found a place to put the link, place it there unless there
14590 is already a link to the same insn as LINK at that point. */
14591
14592 if (place)
14593 {
14594 struct insn_link *link2;
14595
14596 FOR_EACH_LOG_LINK (link2, place)
14597 if (link2->insn == link->insn && link2->regno == link->regno)
14598 break;
14599
14600 if (link2 == NULL)
14601 {
14602 link->next = LOG_LINKS (place);
14603 LOG_LINKS (place) = link;
14604
14605 /* Set added_links_insn to the earliest insn we added a
14606 link to. */
14607 if (added_links_insn == 0
14608 || DF_INSN_LUID (added_links_insn) > DF_INSN_LUID (place))
14609 added_links_insn = place;
14610 }
14611 }
14612 }
14613 }
14614 \f
14615 /* Check for any register or memory mentioned in EQUIV that is not
14616 mentioned in EXPR. This is used to restrict EQUIV to "specializations"
14617 of EXPR where some registers may have been replaced by constants. */
14618
14619 static bool
14620 unmentioned_reg_p (rtx equiv, rtx expr)
14621 {
14622 subrtx_iterator::array_type array;
14623 FOR_EACH_SUBRTX (iter, array, equiv, NONCONST)
14624 {
14625 const_rtx x = *iter;
14626 if ((REG_P (x) || MEM_P (x))
14627 && !reg_mentioned_p (x, expr))
14628 return true;
14629 }
14630 return false;
14631 }
14632 \f
14633 DEBUG_FUNCTION void
14634 dump_combine_stats (FILE *file)
14635 {
14636 fprintf
14637 (file,
14638 ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
14639 combine_attempts, combine_merges, combine_extras, combine_successes);
14640 }
14641
14642 void
14643 dump_combine_total_stats (FILE *file)
14644 {
14645 fprintf
14646 (file,
14647 "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
14648 total_attempts, total_merges, total_extras, total_successes);
14649 }
14650 \f
14651 /* Try combining insns through substitution. */
14652 static unsigned int
14653 rest_of_handle_combine (void)
14654 {
14655 int rebuild_jump_labels_after_combine;
14656
14657 df_set_flags (DF_LR_RUN_DCE + DF_DEFER_INSN_RESCAN);
14658 df_note_add_problem ();
14659 df_analyze ();
14660
14661 regstat_init_n_sets_and_refs ();
14662 reg_n_sets_max = max_reg_num ();
14663
14664 rebuild_jump_labels_after_combine
14665 = combine_instructions (get_insns (), max_reg_num ());
14666
14667 /* Combining insns may have turned an indirect jump into a
14668 direct jump. Rebuild the JUMP_LABEL fields of jumping
14669 instructions. */
14670 if (rebuild_jump_labels_after_combine)
14671 {
14672 if (dom_info_available_p (CDI_DOMINATORS))
14673 free_dominance_info (CDI_DOMINATORS);
14674 timevar_push (TV_JUMP);
14675 rebuild_jump_labels (get_insns ());
14676 cleanup_cfg (0);
14677 timevar_pop (TV_JUMP);
14678 }
14679
14680 regstat_free_n_sets_and_refs ();
14681 return 0;
14682 }
14683
14684 namespace {
14685
14686 const pass_data pass_data_combine =
14687 {
14688 RTL_PASS, /* type */
14689 "combine", /* name */
14690 OPTGROUP_NONE, /* optinfo_flags */
14691 TV_COMBINE, /* tv_id */
14692 PROP_cfglayout, /* properties_required */
14693 0, /* properties_provided */
14694 0, /* properties_destroyed */
14695 0, /* todo_flags_start */
14696 TODO_df_finish, /* todo_flags_finish */
14697 };
14698
14699 class pass_combine : public rtl_opt_pass
14700 {
14701 public:
14702 pass_combine (gcc::context *ctxt)
14703 : rtl_opt_pass (pass_data_combine, ctxt)
14704 {}
14705
14706 /* opt_pass methods: */
14707 virtual bool gate (function *) { return (optimize > 0); }
14708 virtual unsigned int execute (function *)
14709 {
14710 return rest_of_handle_combine ();
14711 }
14712
14713 }; // class pass_combine
14714
14715 } // anon namespace
14716
14717 rtl_opt_pass *
14718 make_pass_combine (gcc::context *ctxt)
14719 {
14720 return new pass_combine (ctxt);
14721 }