]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/combine.c
Allow combiner to create autoinc in jump insns.
[thirdparty/gcc.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2 Copyright (C) 1987-2019 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 modified_between_p) to avoid combining in such a way
43 as to move a computation to a place where its value would be different.
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 "expr.h"
103 #include "tree-pass.h"
104 #include "valtrack.h"
105 #include "rtl-iter.h"
106 #include "print-rtl.h"
107 #include "function-abi.h"
108
109 /* Number of attempts to combine instructions in this function. */
110
111 static int combine_attempts;
112
113 /* Number of attempts that got as far as substitution in this function. */
114
115 static int combine_merges;
116
117 /* Number of instructions combined with added SETs in this function. */
118
119 static int combine_extras;
120
121 /* Number of instructions combined in this function. */
122
123 static int combine_successes;
124
125 /* Totals over entire compilation. */
126
127 static int total_attempts, total_merges, total_extras, total_successes;
128
129 /* combine_instructions may try to replace the right hand side of the
130 second instruction with the value of an associated REG_EQUAL note
131 before throwing it at try_combine. That is problematic when there
132 is a REG_DEAD note for a register used in the old right hand side
133 and can cause distribute_notes to do wrong things. This is the
134 second instruction if it has been so modified, null otherwise. */
135
136 static rtx_insn *i2mod;
137
138 /* When I2MOD is nonnull, this is a copy of the old right hand side. */
139
140 static rtx i2mod_old_rhs;
141
142 /* When I2MOD is nonnull, this is a copy of the new right hand side. */
143
144 static rtx i2mod_new_rhs;
145 \f
146 struct reg_stat_type {
147 /* Record last point of death of (hard or pseudo) register n. */
148 rtx_insn *last_death;
149
150 /* Record last point of modification of (hard or pseudo) register n. */
151 rtx_insn *last_set;
152
153 /* The next group of fields allows the recording of the last value assigned
154 to (hard or pseudo) register n. We use this information to see if an
155 operation being processed is redundant given a prior operation performed
156 on the register. For example, an `and' with a constant is redundant if
157 all the zero bits are already known to be turned off.
158
159 We use an approach similar to that used by cse, but change it in the
160 following ways:
161
162 (1) We do not want to reinitialize at each label.
163 (2) It is useful, but not critical, to know the actual value assigned
164 to a register. Often just its form is helpful.
165
166 Therefore, we maintain the following fields:
167
168 last_set_value the last value assigned
169 last_set_label records the value of label_tick when the
170 register was assigned
171 last_set_table_tick records the value of label_tick when a
172 value using the register is assigned
173 last_set_invalid set to nonzero when it is not valid
174 to use the value of this register in some
175 register's value
176
177 To understand the usage of these tables, it is important to understand
178 the distinction between the value in last_set_value being valid and
179 the register being validly contained in some other expression in the
180 table.
181
182 (The next two parameters are out of date).
183
184 reg_stat[i].last_set_value is valid if it is nonzero, and either
185 reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
186
187 Register I may validly appear in any expression returned for the value
188 of another register if reg_n_sets[i] is 1. It may also appear in the
189 value for register J if reg_stat[j].last_set_invalid is zero, or
190 reg_stat[i].last_set_label < reg_stat[j].last_set_label.
191
192 If an expression is found in the table containing a register which may
193 not validly appear in an expression, the register is replaced by
194 something that won't match, (clobber (const_int 0)). */
195
196 /* Record last value assigned to (hard or pseudo) register n. */
197
198 rtx last_set_value;
199
200 /* Record the value of label_tick when an expression involving register n
201 is placed in last_set_value. */
202
203 int last_set_table_tick;
204
205 /* Record the value of label_tick when the value for register n is placed in
206 last_set_value. */
207
208 int last_set_label;
209
210 /* These fields are maintained in parallel with last_set_value and are
211 used to store the mode in which the register was last set, the bits
212 that were known to be zero when it was last set, and the number of
213 sign bits copies it was known to have when it was last set. */
214
215 unsigned HOST_WIDE_INT last_set_nonzero_bits;
216 char last_set_sign_bit_copies;
217 ENUM_BITFIELD(machine_mode) last_set_mode : 8;
218
219 /* Set nonzero if references to register n in expressions should not be
220 used. last_set_invalid is set nonzero when this register is being
221 assigned to and last_set_table_tick == label_tick. */
222
223 char last_set_invalid;
224
225 /* Some registers that are set more than once and used in more than one
226 basic block are nevertheless always set in similar ways. For example,
227 a QImode register may be loaded from memory in two places on a machine
228 where byte loads zero extend.
229
230 We record in the following fields if a register has some leading bits
231 that are always equal to the sign bit, and what we know about the
232 nonzero bits of a register, specifically which bits are known to be
233 zero.
234
235 If an entry is zero, it means that we don't know anything special. */
236
237 unsigned char sign_bit_copies;
238
239 unsigned HOST_WIDE_INT nonzero_bits;
240
241 /* Record the value of the label_tick when the last truncation
242 happened. The field truncated_to_mode is only valid if
243 truncation_label == label_tick. */
244
245 int truncation_label;
246
247 /* Record the last truncation seen for this register. If truncation
248 is not a nop to this mode we might be able to save an explicit
249 truncation if we know that value already contains a truncated
250 value. */
251
252 ENUM_BITFIELD(machine_mode) truncated_to_mode : 8;
253 };
254
255
256 static vec<reg_stat_type> reg_stat;
257
258 /* One plus the highest pseudo for which we track REG_N_SETS.
259 regstat_init_n_sets_and_refs allocates the array for REG_N_SETS just once,
260 but during combine_split_insns new pseudos can be created. As we don't have
261 updated DF information in that case, it is hard to initialize the array
262 after growing. The combiner only cares about REG_N_SETS (regno) == 1,
263 so instead of growing the arrays, just assume all newly created pseudos
264 during combine might be set multiple times. */
265
266 static unsigned int reg_n_sets_max;
267
268 /* Record the luid of the last insn that invalidated memory
269 (anything that writes memory, and subroutine calls, but not pushes). */
270
271 static int mem_last_set;
272
273 /* Record the luid of the last CALL_INSN
274 so we can tell whether a potential combination crosses any calls. */
275
276 static int last_call_luid;
277
278 /* When `subst' is called, this is the insn that is being modified
279 (by combining in a previous insn). The PATTERN of this insn
280 is still the old pattern partially modified and it should not be
281 looked at, but this may be used to examine the successors of the insn
282 to judge whether a simplification is valid. */
283
284 static rtx_insn *subst_insn;
285
286 /* This is the lowest LUID that `subst' is currently dealing with.
287 get_last_value will not return a value if the register was set at or
288 after this LUID. If not for this mechanism, we could get confused if
289 I2 or I1 in try_combine were an insn that used the old value of a register
290 to obtain a new value. In that case, we might erroneously get the
291 new value of the register when we wanted the old one. */
292
293 static int subst_low_luid;
294
295 /* This contains any hard registers that are used in newpat; reg_dead_at_p
296 must consider all these registers to be always live. */
297
298 static HARD_REG_SET newpat_used_regs;
299
300 /* This is an insn to which a LOG_LINKS entry has been added. If this
301 insn is the earlier than I2 or I3, combine should rescan starting at
302 that location. */
303
304 static rtx_insn *added_links_insn;
305
306 /* And similarly, for notes. */
307
308 static rtx_insn *added_notes_insn;
309
310 /* Basic block in which we are performing combines. */
311 static basic_block this_basic_block;
312 static bool optimize_this_for_speed_p;
313
314 \f
315 /* Length of the currently allocated uid_insn_cost array. */
316
317 static int max_uid_known;
318
319 /* The following array records the insn_cost for every insn
320 in the instruction stream. */
321
322 static int *uid_insn_cost;
323
324 /* The following array records the LOG_LINKS for every insn in the
325 instruction stream as struct insn_link pointers. */
326
327 struct insn_link {
328 rtx_insn *insn;
329 unsigned int regno;
330 struct insn_link *next;
331 };
332
333 static struct insn_link **uid_log_links;
334
335 static inline int
336 insn_uid_check (const_rtx insn)
337 {
338 int uid = INSN_UID (insn);
339 gcc_checking_assert (uid <= max_uid_known);
340 return uid;
341 }
342
343 #define INSN_COST(INSN) (uid_insn_cost[insn_uid_check (INSN)])
344 #define LOG_LINKS(INSN) (uid_log_links[insn_uid_check (INSN)])
345
346 #define FOR_EACH_LOG_LINK(L, INSN) \
347 for ((L) = LOG_LINKS (INSN); (L); (L) = (L)->next)
348
349 /* Links for LOG_LINKS are allocated from this obstack. */
350
351 static struct obstack insn_link_obstack;
352
353 /* Allocate a link. */
354
355 static inline struct insn_link *
356 alloc_insn_link (rtx_insn *insn, unsigned int regno, struct insn_link *next)
357 {
358 struct insn_link *l
359 = (struct insn_link *) obstack_alloc (&insn_link_obstack,
360 sizeof (struct insn_link));
361 l->insn = insn;
362 l->regno = regno;
363 l->next = next;
364 return l;
365 }
366
367 /* Incremented for each basic block. */
368
369 static int label_tick;
370
371 /* Reset to label_tick for each extended basic block in scanning order. */
372
373 static int label_tick_ebb_start;
374
375 /* Mode used to compute significance in reg_stat[].nonzero_bits. It is the
376 largest integer mode that can fit in HOST_BITS_PER_WIDE_INT. */
377
378 static scalar_int_mode nonzero_bits_mode;
379
380 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
381 be safely used. It is zero while computing them and after combine has
382 completed. This former test prevents propagating values based on
383 previously set values, which can be incorrect if a variable is modified
384 in a loop. */
385
386 static int nonzero_sign_valid;
387
388 \f
389 /* Record one modification to rtl structure
390 to be undone by storing old_contents into *where. */
391
392 enum undo_kind { UNDO_RTX, UNDO_INT, UNDO_MODE, UNDO_LINKS };
393
394 struct undo
395 {
396 struct undo *next;
397 enum undo_kind kind;
398 union { rtx r; int i; machine_mode m; struct insn_link *l; } old_contents;
399 union { rtx *r; int *i; struct insn_link **l; } where;
400 };
401
402 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
403 num_undo says how many are currently recorded.
404
405 other_insn is nonzero if we have modified some other insn in the process
406 of working on subst_insn. It must be verified too. */
407
408 struct undobuf
409 {
410 struct undo *undos;
411 struct undo *frees;
412 rtx_insn *other_insn;
413 };
414
415 static struct undobuf undobuf;
416
417 /* Number of times the pseudo being substituted for
418 was found and replaced. */
419
420 static int n_occurrences;
421
422 static rtx reg_nonzero_bits_for_combine (const_rtx, scalar_int_mode,
423 scalar_int_mode,
424 unsigned HOST_WIDE_INT *);
425 static rtx reg_num_sign_bit_copies_for_combine (const_rtx, scalar_int_mode,
426 scalar_int_mode,
427 unsigned int *);
428 static void do_SUBST (rtx *, rtx);
429 static void do_SUBST_INT (int *, int);
430 static void init_reg_last (void);
431 static void setup_incoming_promotions (rtx_insn *);
432 static void set_nonzero_bits_and_sign_copies (rtx, const_rtx, void *);
433 static int cant_combine_insn_p (rtx_insn *);
434 static int can_combine_p (rtx_insn *, rtx_insn *, rtx_insn *, rtx_insn *,
435 rtx_insn *, rtx_insn *, rtx *, rtx *);
436 static int combinable_i3pat (rtx_insn *, rtx *, rtx, rtx, rtx, int, int, rtx *);
437 static int contains_muldiv (rtx);
438 static rtx_insn *try_combine (rtx_insn *, rtx_insn *, rtx_insn *, rtx_insn *,
439 int *, rtx_insn *);
440 static void undo_all (void);
441 static void undo_commit (void);
442 static rtx *find_split_point (rtx *, rtx_insn *, bool);
443 static rtx subst (rtx, rtx, rtx, int, int, int);
444 static rtx combine_simplify_rtx (rtx, machine_mode, int, int);
445 static rtx simplify_if_then_else (rtx);
446 static rtx simplify_set (rtx);
447 static rtx simplify_logical (rtx);
448 static rtx expand_compound_operation (rtx);
449 static const_rtx expand_field_assignment (const_rtx);
450 static rtx make_extraction (machine_mode, rtx, HOST_WIDE_INT,
451 rtx, unsigned HOST_WIDE_INT, int, int, int);
452 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
453 unsigned HOST_WIDE_INT *);
454 static rtx canon_reg_for_combine (rtx, rtx);
455 static rtx force_int_to_mode (rtx, scalar_int_mode, scalar_int_mode,
456 scalar_int_mode, unsigned HOST_WIDE_INT, int);
457 static rtx force_to_mode (rtx, machine_mode,
458 unsigned HOST_WIDE_INT, int);
459 static rtx if_then_else_cond (rtx, rtx *, rtx *);
460 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
461 static int rtx_equal_for_field_assignment_p (rtx, rtx, bool = false);
462 static rtx make_field_assignment (rtx);
463 static rtx apply_distributive_law (rtx);
464 static rtx distribute_and_simplify_rtx (rtx, int);
465 static rtx simplify_and_const_int_1 (scalar_int_mode, rtx,
466 unsigned HOST_WIDE_INT);
467 static rtx simplify_and_const_int (rtx, scalar_int_mode, rtx,
468 unsigned HOST_WIDE_INT);
469 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
470 HOST_WIDE_INT, machine_mode, int *);
471 static rtx simplify_shift_const_1 (enum rtx_code, machine_mode, rtx, int);
472 static rtx simplify_shift_const (rtx, enum rtx_code, machine_mode, rtx,
473 int);
474 static int recog_for_combine (rtx *, rtx_insn *, rtx *);
475 static rtx gen_lowpart_for_combine (machine_mode, rtx);
476 static enum rtx_code simplify_compare_const (enum rtx_code, machine_mode,
477 rtx, rtx *);
478 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
479 static void update_table_tick (rtx);
480 static void record_value_for_reg (rtx, rtx_insn *, rtx);
481 static void check_promoted_subreg (rtx_insn *, rtx);
482 static void record_dead_and_set_regs_1 (rtx, const_rtx, void *);
483 static void record_dead_and_set_regs (rtx_insn *);
484 static int get_last_value_validate (rtx *, rtx_insn *, int, int);
485 static rtx get_last_value (const_rtx);
486 static void reg_dead_at_p_1 (rtx, const_rtx, void *);
487 static int reg_dead_at_p (rtx, rtx_insn *);
488 static void move_deaths (rtx, rtx, int, rtx_insn *, rtx *);
489 static int reg_bitfield_target_p (rtx, rtx);
490 static void distribute_notes (rtx, rtx_insn *, rtx_insn *, rtx_insn *, rtx, rtx, rtx);
491 static void distribute_links (struct insn_link *);
492 static void mark_used_regs_combine (rtx);
493 static void record_promoted_value (rtx_insn *, rtx);
494 static bool unmentioned_reg_p (rtx, rtx);
495 static void record_truncated_values (rtx *, void *);
496 static bool reg_truncated_to_mode (machine_mode, const_rtx);
497 static rtx gen_lowpart_or_truncate (machine_mode, rtx);
498 \f
499
500 /* It is not safe to use ordinary gen_lowpart in combine.
501 See comments in gen_lowpart_for_combine. */
502 #undef RTL_HOOKS_GEN_LOWPART
503 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_for_combine
504
505 /* Our implementation of gen_lowpart never emits a new pseudo. */
506 #undef RTL_HOOKS_GEN_LOWPART_NO_EMIT
507 #define RTL_HOOKS_GEN_LOWPART_NO_EMIT gen_lowpart_for_combine
508
509 #undef RTL_HOOKS_REG_NONZERO_REG_BITS
510 #define RTL_HOOKS_REG_NONZERO_REG_BITS reg_nonzero_bits_for_combine
511
512 #undef RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES
513 #define RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES reg_num_sign_bit_copies_for_combine
514
515 #undef RTL_HOOKS_REG_TRUNCATED_TO_MODE
516 #define RTL_HOOKS_REG_TRUNCATED_TO_MODE reg_truncated_to_mode
517
518 static const struct rtl_hooks combine_rtl_hooks = RTL_HOOKS_INITIALIZER;
519
520 \f
521 /* Convenience wrapper for the canonicalize_comparison target hook.
522 Target hooks cannot use enum rtx_code. */
523 static inline void
524 target_canonicalize_comparison (enum rtx_code *code, rtx *op0, rtx *op1,
525 bool op0_preserve_value)
526 {
527 int code_int = (int)*code;
528 targetm.canonicalize_comparison (&code_int, op0, op1, op0_preserve_value);
529 *code = (enum rtx_code)code_int;
530 }
531
532 /* Try to split PATTERN found in INSN. This returns NULL_RTX if
533 PATTERN cannot be split. Otherwise, it returns an insn sequence.
534 This is a wrapper around split_insns which ensures that the
535 reg_stat vector is made larger if the splitter creates a new
536 register. */
537
538 static rtx_insn *
539 combine_split_insns (rtx pattern, rtx_insn *insn)
540 {
541 rtx_insn *ret;
542 unsigned int nregs;
543
544 ret = split_insns (pattern, insn);
545 nregs = max_reg_num ();
546 if (nregs > reg_stat.length ())
547 reg_stat.safe_grow_cleared (nregs);
548 return ret;
549 }
550
551 /* This is used by find_single_use to locate an rtx in LOC that
552 contains exactly one use of DEST, which is typically either a REG
553 or CC0. It returns a pointer to the innermost rtx expression
554 containing DEST. Appearances of DEST that are being used to
555 totally replace it are not counted. */
556
557 static rtx *
558 find_single_use_1 (rtx dest, rtx *loc)
559 {
560 rtx x = *loc;
561 enum rtx_code code = GET_CODE (x);
562 rtx *result = NULL;
563 rtx *this_result;
564 int i;
565 const char *fmt;
566
567 switch (code)
568 {
569 case CONST:
570 case LABEL_REF:
571 case SYMBOL_REF:
572 CASE_CONST_ANY:
573 case CLOBBER:
574 return 0;
575
576 case SET:
577 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
578 of a REG that occupies all of the REG, the insn uses DEST if
579 it is mentioned in the destination or the source. Otherwise, we
580 need just check the source. */
581 if (GET_CODE (SET_DEST (x)) != CC0
582 && GET_CODE (SET_DEST (x)) != PC
583 && !REG_P (SET_DEST (x))
584 && ! (GET_CODE (SET_DEST (x)) == SUBREG
585 && REG_P (SUBREG_REG (SET_DEST (x)))
586 && !read_modify_subreg_p (SET_DEST (x))))
587 break;
588
589 return find_single_use_1 (dest, &SET_SRC (x));
590
591 case MEM:
592 case SUBREG:
593 return find_single_use_1 (dest, &XEXP (x, 0));
594
595 default:
596 break;
597 }
598
599 /* If it wasn't one of the common cases above, check each expression and
600 vector of this code. Look for a unique usage of DEST. */
601
602 fmt = GET_RTX_FORMAT (code);
603 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
604 {
605 if (fmt[i] == 'e')
606 {
607 if (dest == XEXP (x, i)
608 || (REG_P (dest) && REG_P (XEXP (x, i))
609 && REGNO (dest) == REGNO (XEXP (x, i))))
610 this_result = loc;
611 else
612 this_result = find_single_use_1 (dest, &XEXP (x, i));
613
614 if (result == NULL)
615 result = this_result;
616 else if (this_result)
617 /* Duplicate usage. */
618 return NULL;
619 }
620 else if (fmt[i] == 'E')
621 {
622 int j;
623
624 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
625 {
626 if (XVECEXP (x, i, j) == dest
627 || (REG_P (dest)
628 && REG_P (XVECEXP (x, i, j))
629 && REGNO (XVECEXP (x, i, j)) == REGNO (dest)))
630 this_result = loc;
631 else
632 this_result = find_single_use_1 (dest, &XVECEXP (x, i, j));
633
634 if (result == NULL)
635 result = this_result;
636 else if (this_result)
637 return NULL;
638 }
639 }
640 }
641
642 return result;
643 }
644
645
646 /* See if DEST, produced in INSN, is used only a single time in the
647 sequel. If so, return a pointer to the innermost rtx expression in which
648 it is used.
649
650 If PLOC is nonzero, *PLOC is set to the insn containing the single use.
651
652 If DEST is cc0_rtx, we look only at the next insn. In that case, we don't
653 care about REG_DEAD notes or LOG_LINKS.
654
655 Otherwise, we find the single use by finding an insn that has a
656 LOG_LINKS pointing at INSN and has a REG_DEAD note for DEST. If DEST is
657 only referenced once in that insn, we know that it must be the first
658 and last insn referencing DEST. */
659
660 static rtx *
661 find_single_use (rtx dest, rtx_insn *insn, rtx_insn **ploc)
662 {
663 basic_block bb;
664 rtx_insn *next;
665 rtx *result;
666 struct insn_link *link;
667
668 if (dest == cc0_rtx)
669 {
670 next = NEXT_INSN (insn);
671 if (next == 0
672 || (!NONJUMP_INSN_P (next) && !JUMP_P (next)))
673 return 0;
674
675 result = find_single_use_1 (dest, &PATTERN (next));
676 if (result && ploc)
677 *ploc = next;
678 return result;
679 }
680
681 if (!REG_P (dest))
682 return 0;
683
684 bb = BLOCK_FOR_INSN (insn);
685 for (next = NEXT_INSN (insn);
686 next && BLOCK_FOR_INSN (next) == bb;
687 next = NEXT_INSN (next))
688 if (NONDEBUG_INSN_P (next) && dead_or_set_p (next, dest))
689 {
690 FOR_EACH_LOG_LINK (link, next)
691 if (link->insn == insn && link->regno == REGNO (dest))
692 break;
693
694 if (link)
695 {
696 result = find_single_use_1 (dest, &PATTERN (next));
697 if (ploc)
698 *ploc = next;
699 return result;
700 }
701 }
702
703 return 0;
704 }
705 \f
706 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
707 insn. The substitution can be undone by undo_all. If INTO is already
708 set to NEWVAL, do not record this change. Because computing NEWVAL might
709 also call SUBST, we have to compute it before we put anything into
710 the undo table. */
711
712 static void
713 do_SUBST (rtx *into, rtx newval)
714 {
715 struct undo *buf;
716 rtx oldval = *into;
717
718 if (oldval == newval)
719 return;
720
721 /* We'd like to catch as many invalid transformations here as
722 possible. Unfortunately, there are way too many mode changes
723 that are perfectly valid, so we'd waste too much effort for
724 little gain doing the checks here. Focus on catching invalid
725 transformations involving integer constants. */
726 if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
727 && CONST_INT_P (newval))
728 {
729 /* Sanity check that we're replacing oldval with a CONST_INT
730 that is a valid sign-extension for the original mode. */
731 gcc_assert (INTVAL (newval)
732 == trunc_int_for_mode (INTVAL (newval), GET_MODE (oldval)));
733
734 /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
735 CONST_INT is not valid, because after the replacement, the
736 original mode would be gone. Unfortunately, we can't tell
737 when do_SUBST is called to replace the operand thereof, so we
738 perform this test on oldval instead, checking whether an
739 invalid replacement took place before we got here. */
740 gcc_assert (!(GET_CODE (oldval) == SUBREG
741 && CONST_INT_P (SUBREG_REG (oldval))));
742 gcc_assert (!(GET_CODE (oldval) == ZERO_EXTEND
743 && CONST_INT_P (XEXP (oldval, 0))));
744 }
745
746 if (undobuf.frees)
747 buf = undobuf.frees, undobuf.frees = buf->next;
748 else
749 buf = XNEW (struct undo);
750
751 buf->kind = UNDO_RTX;
752 buf->where.r = into;
753 buf->old_contents.r = oldval;
754 *into = newval;
755
756 buf->next = undobuf.undos, undobuf.undos = buf;
757 }
758
759 #define SUBST(INTO, NEWVAL) do_SUBST (&(INTO), (NEWVAL))
760
761 /* Similar to SUBST, but NEWVAL is an int expression. Note that substitution
762 for the value of a HOST_WIDE_INT value (including CONST_INT) is
763 not safe. */
764
765 static void
766 do_SUBST_INT (int *into, int newval)
767 {
768 struct undo *buf;
769 int oldval = *into;
770
771 if (oldval == newval)
772 return;
773
774 if (undobuf.frees)
775 buf = undobuf.frees, undobuf.frees = buf->next;
776 else
777 buf = XNEW (struct undo);
778
779 buf->kind = UNDO_INT;
780 buf->where.i = into;
781 buf->old_contents.i = oldval;
782 *into = newval;
783
784 buf->next = undobuf.undos, undobuf.undos = buf;
785 }
786
787 #define SUBST_INT(INTO, NEWVAL) do_SUBST_INT (&(INTO), (NEWVAL))
788
789 /* Similar to SUBST, but just substitute the mode. This is used when
790 changing the mode of a pseudo-register, so that any other
791 references to the entry in the regno_reg_rtx array will change as
792 well. */
793
794 static void
795 do_SUBST_MODE (rtx *into, machine_mode newval)
796 {
797 struct undo *buf;
798 machine_mode oldval = GET_MODE (*into);
799
800 if (oldval == newval)
801 return;
802
803 if (undobuf.frees)
804 buf = undobuf.frees, undobuf.frees = buf->next;
805 else
806 buf = XNEW (struct undo);
807
808 buf->kind = UNDO_MODE;
809 buf->where.r = into;
810 buf->old_contents.m = oldval;
811 adjust_reg_mode (*into, newval);
812
813 buf->next = undobuf.undos, undobuf.undos = buf;
814 }
815
816 #define SUBST_MODE(INTO, NEWVAL) do_SUBST_MODE (&(INTO), (NEWVAL))
817
818 /* Similar to SUBST, but NEWVAL is a LOG_LINKS expression. */
819
820 static void
821 do_SUBST_LINK (struct insn_link **into, struct insn_link *newval)
822 {
823 struct undo *buf;
824 struct insn_link * oldval = *into;
825
826 if (oldval == newval)
827 return;
828
829 if (undobuf.frees)
830 buf = undobuf.frees, undobuf.frees = buf->next;
831 else
832 buf = XNEW (struct undo);
833
834 buf->kind = UNDO_LINKS;
835 buf->where.l = into;
836 buf->old_contents.l = oldval;
837 *into = newval;
838
839 buf->next = undobuf.undos, undobuf.undos = buf;
840 }
841
842 #define SUBST_LINK(oldval, newval) do_SUBST_LINK (&oldval, newval)
843 \f
844 /* Subroutine of try_combine. Determine whether the replacement patterns
845 NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to insn_cost
846 than the original sequence I0, I1, I2, I3 and undobuf.other_insn. Note
847 that I0, I1 and/or NEWI2PAT may be NULL_RTX. Similarly, NEWOTHERPAT and
848 undobuf.other_insn may also both be NULL_RTX. Return false if the cost
849 of all the instructions can be estimated and the replacements are more
850 expensive than the original sequence. */
851
852 static bool
853 combine_validate_cost (rtx_insn *i0, rtx_insn *i1, rtx_insn *i2, rtx_insn *i3,
854 rtx newpat, rtx newi2pat, rtx newotherpat)
855 {
856 int i0_cost, i1_cost, i2_cost, i3_cost;
857 int new_i2_cost, new_i3_cost;
858 int old_cost, new_cost;
859
860 /* Lookup the original insn_costs. */
861 i2_cost = INSN_COST (i2);
862 i3_cost = INSN_COST (i3);
863
864 if (i1)
865 {
866 i1_cost = INSN_COST (i1);
867 if (i0)
868 {
869 i0_cost = INSN_COST (i0);
870 old_cost = (i0_cost > 0 && i1_cost > 0 && i2_cost > 0 && i3_cost > 0
871 ? i0_cost + i1_cost + i2_cost + i3_cost : 0);
872 }
873 else
874 {
875 old_cost = (i1_cost > 0 && i2_cost > 0 && i3_cost > 0
876 ? i1_cost + i2_cost + i3_cost : 0);
877 i0_cost = 0;
878 }
879 }
880 else
881 {
882 old_cost = (i2_cost > 0 && i3_cost > 0) ? i2_cost + i3_cost : 0;
883 i1_cost = i0_cost = 0;
884 }
885
886 /* If we have split a PARALLEL I2 to I1,I2, we have counted its cost twice;
887 correct that. */
888 if (old_cost && i1 && INSN_UID (i1) == INSN_UID (i2))
889 old_cost -= i1_cost;
890
891
892 /* Calculate the replacement insn_costs. */
893 rtx tmp = PATTERN (i3);
894 PATTERN (i3) = newpat;
895 int tmpi = INSN_CODE (i3);
896 INSN_CODE (i3) = -1;
897 new_i3_cost = insn_cost (i3, optimize_this_for_speed_p);
898 PATTERN (i3) = tmp;
899 INSN_CODE (i3) = tmpi;
900 if (newi2pat)
901 {
902 tmp = PATTERN (i2);
903 PATTERN (i2) = newi2pat;
904 tmpi = INSN_CODE (i2);
905 INSN_CODE (i2) = -1;
906 new_i2_cost = insn_cost (i2, optimize_this_for_speed_p);
907 PATTERN (i2) = tmp;
908 INSN_CODE (i2) = tmpi;
909 new_cost = (new_i2_cost > 0 && new_i3_cost > 0)
910 ? new_i2_cost + new_i3_cost : 0;
911 }
912 else
913 {
914 new_cost = new_i3_cost;
915 new_i2_cost = 0;
916 }
917
918 if (undobuf.other_insn)
919 {
920 int old_other_cost, new_other_cost;
921
922 old_other_cost = INSN_COST (undobuf.other_insn);
923 tmp = PATTERN (undobuf.other_insn);
924 PATTERN (undobuf.other_insn) = newotherpat;
925 tmpi = INSN_CODE (undobuf.other_insn);
926 INSN_CODE (undobuf.other_insn) = -1;
927 new_other_cost = insn_cost (undobuf.other_insn,
928 optimize_this_for_speed_p);
929 PATTERN (undobuf.other_insn) = tmp;
930 INSN_CODE (undobuf.other_insn) = tmpi;
931 if (old_other_cost > 0 && new_other_cost > 0)
932 {
933 old_cost += old_other_cost;
934 new_cost += new_other_cost;
935 }
936 else
937 old_cost = 0;
938 }
939
940 /* Disallow this combination if both new_cost and old_cost are greater than
941 zero, and new_cost is greater than old cost. */
942 int reject = old_cost > 0 && new_cost > old_cost;
943
944 if (dump_file)
945 {
946 fprintf (dump_file, "%s combination of insns ",
947 reject ? "rejecting" : "allowing");
948 if (i0)
949 fprintf (dump_file, "%d, ", INSN_UID (i0));
950 if (i1 && INSN_UID (i1) != INSN_UID (i2))
951 fprintf (dump_file, "%d, ", INSN_UID (i1));
952 fprintf (dump_file, "%d and %d\n", INSN_UID (i2), INSN_UID (i3));
953
954 fprintf (dump_file, "original costs ");
955 if (i0)
956 fprintf (dump_file, "%d + ", i0_cost);
957 if (i1 && INSN_UID (i1) != INSN_UID (i2))
958 fprintf (dump_file, "%d + ", i1_cost);
959 fprintf (dump_file, "%d + %d = %d\n", i2_cost, i3_cost, old_cost);
960
961 if (newi2pat)
962 fprintf (dump_file, "replacement costs %d + %d = %d\n",
963 new_i2_cost, new_i3_cost, new_cost);
964 else
965 fprintf (dump_file, "replacement cost %d\n", new_cost);
966 }
967
968 if (reject)
969 return false;
970
971 /* Update the uid_insn_cost array with the replacement costs. */
972 INSN_COST (i2) = new_i2_cost;
973 INSN_COST (i3) = new_i3_cost;
974 if (i1)
975 {
976 INSN_COST (i1) = 0;
977 if (i0)
978 INSN_COST (i0) = 0;
979 }
980
981 return true;
982 }
983
984
985 /* Delete any insns that copy a register to itself.
986 Return true if the CFG was changed. */
987
988 static bool
989 delete_noop_moves (void)
990 {
991 rtx_insn *insn, *next;
992 basic_block bb;
993
994 bool edges_deleted = false;
995
996 FOR_EACH_BB_FN (bb, cfun)
997 {
998 for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next)
999 {
1000 next = NEXT_INSN (insn);
1001 if (INSN_P (insn) && noop_move_p (insn))
1002 {
1003 if (dump_file)
1004 fprintf (dump_file, "deleting noop move %d\n", INSN_UID (insn));
1005
1006 edges_deleted |= delete_insn_and_edges (insn);
1007 }
1008 }
1009 }
1010
1011 return edges_deleted;
1012 }
1013
1014 \f
1015 /* Return false if we do not want to (or cannot) combine DEF. */
1016 static bool
1017 can_combine_def_p (df_ref def)
1018 {
1019 /* Do not consider if it is pre/post modification in MEM. */
1020 if (DF_REF_FLAGS (def) & DF_REF_PRE_POST_MODIFY)
1021 return false;
1022
1023 unsigned int regno = DF_REF_REGNO (def);
1024
1025 /* Do not combine frame pointer adjustments. */
1026 if ((regno == FRAME_POINTER_REGNUM
1027 && (!reload_completed || frame_pointer_needed))
1028 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER
1029 && regno == HARD_FRAME_POINTER_REGNUM
1030 && (!reload_completed || frame_pointer_needed))
1031 || (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1032 && regno == ARG_POINTER_REGNUM && fixed_regs[regno]))
1033 return false;
1034
1035 return true;
1036 }
1037
1038 /* Return false if we do not want to (or cannot) combine USE. */
1039 static bool
1040 can_combine_use_p (df_ref use)
1041 {
1042 /* Do not consider the usage of the stack pointer by function call. */
1043 if (DF_REF_FLAGS (use) & DF_REF_CALL_STACK_USAGE)
1044 return false;
1045
1046 return true;
1047 }
1048
1049 /* Fill in log links field for all insns. */
1050
1051 static void
1052 create_log_links (void)
1053 {
1054 basic_block bb;
1055 rtx_insn **next_use;
1056 rtx_insn *insn;
1057 df_ref def, use;
1058
1059 next_use = XCNEWVEC (rtx_insn *, max_reg_num ());
1060
1061 /* Pass through each block from the end, recording the uses of each
1062 register and establishing log links when def is encountered.
1063 Note that we do not clear next_use array in order to save time,
1064 so we have to test whether the use is in the same basic block as def.
1065
1066 There are a few cases below when we do not consider the definition or
1067 usage -- these are taken from original flow.c did. Don't ask me why it is
1068 done this way; I don't know and if it works, I don't want to know. */
1069
1070 FOR_EACH_BB_FN (bb, cfun)
1071 {
1072 FOR_BB_INSNS_REVERSE (bb, insn)
1073 {
1074 if (!NONDEBUG_INSN_P (insn))
1075 continue;
1076
1077 /* Log links are created only once. */
1078 gcc_assert (!LOG_LINKS (insn));
1079
1080 FOR_EACH_INSN_DEF (def, insn)
1081 {
1082 unsigned int regno = DF_REF_REGNO (def);
1083 rtx_insn *use_insn;
1084
1085 if (!next_use[regno])
1086 continue;
1087
1088 if (!can_combine_def_p (def))
1089 continue;
1090
1091 use_insn = next_use[regno];
1092 next_use[regno] = NULL;
1093
1094 if (BLOCK_FOR_INSN (use_insn) != bb)
1095 continue;
1096
1097 /* flow.c claimed:
1098
1099 We don't build a LOG_LINK for hard registers contained
1100 in ASM_OPERANDs. If these registers get replaced,
1101 we might wind up changing the semantics of the insn,
1102 even if reload can make what appear to be valid
1103 assignments later. */
1104 if (regno < FIRST_PSEUDO_REGISTER
1105 && asm_noperands (PATTERN (use_insn)) >= 0)
1106 continue;
1107
1108 /* Don't add duplicate links between instructions. */
1109 struct insn_link *links;
1110 FOR_EACH_LOG_LINK (links, use_insn)
1111 if (insn == links->insn && regno == links->regno)
1112 break;
1113
1114 if (!links)
1115 LOG_LINKS (use_insn)
1116 = alloc_insn_link (insn, regno, LOG_LINKS (use_insn));
1117 }
1118
1119 FOR_EACH_INSN_USE (use, insn)
1120 if (can_combine_use_p (use))
1121 next_use[DF_REF_REGNO (use)] = insn;
1122 }
1123 }
1124
1125 free (next_use);
1126 }
1127
1128 /* Walk the LOG_LINKS of insn B to see if we find a reference to A. Return
1129 true if we found a LOG_LINK that proves that A feeds B. This only works
1130 if there are no instructions between A and B which could have a link
1131 depending on A, since in that case we would not record a link for B.
1132 We also check the implicit dependency created by a cc0 setter/user
1133 pair. */
1134
1135 static bool
1136 insn_a_feeds_b (rtx_insn *a, rtx_insn *b)
1137 {
1138 struct insn_link *links;
1139 FOR_EACH_LOG_LINK (links, b)
1140 if (links->insn == a)
1141 return true;
1142 if (HAVE_cc0 && sets_cc0_p (a))
1143 return true;
1144 return false;
1145 }
1146 \f
1147 /* Main entry point for combiner. F is the first insn of the function.
1148 NREGS is the first unused pseudo-reg number.
1149
1150 Return nonzero if the CFG was changed (e.g. if the combiner has
1151 turned an indirect jump instruction into a direct jump). */
1152 static int
1153 combine_instructions (rtx_insn *f, unsigned int nregs)
1154 {
1155 rtx_insn *insn, *next;
1156 rtx_insn *prev;
1157 struct insn_link *links, *nextlinks;
1158 rtx_insn *first;
1159 basic_block last_bb;
1160
1161 int new_direct_jump_p = 0;
1162
1163 for (first = f; first && !NONDEBUG_INSN_P (first); )
1164 first = NEXT_INSN (first);
1165 if (!first)
1166 return 0;
1167
1168 combine_attempts = 0;
1169 combine_merges = 0;
1170 combine_extras = 0;
1171 combine_successes = 0;
1172
1173 rtl_hooks = combine_rtl_hooks;
1174
1175 reg_stat.safe_grow_cleared (nregs);
1176
1177 init_recog_no_volatile ();
1178
1179 /* Allocate array for insn info. */
1180 max_uid_known = get_max_uid ();
1181 uid_log_links = XCNEWVEC (struct insn_link *, max_uid_known + 1);
1182 uid_insn_cost = XCNEWVEC (int, max_uid_known + 1);
1183 gcc_obstack_init (&insn_link_obstack);
1184
1185 nonzero_bits_mode = int_mode_for_size (HOST_BITS_PER_WIDE_INT, 0).require ();
1186
1187 /* Don't use reg_stat[].nonzero_bits when computing it. This can cause
1188 problems when, for example, we have j <<= 1 in a loop. */
1189
1190 nonzero_sign_valid = 0;
1191 label_tick = label_tick_ebb_start = 1;
1192
1193 /* Scan all SETs and see if we can deduce anything about what
1194 bits are known to be zero for some registers and how many copies
1195 of the sign bit are known to exist for those registers.
1196
1197 Also set any known values so that we can use it while searching
1198 for what bits are known to be set. */
1199
1200 setup_incoming_promotions (first);
1201 /* Allow the entry block and the first block to fall into the same EBB.
1202 Conceptually the incoming promotions are assigned to the entry block. */
1203 last_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1204
1205 create_log_links ();
1206 FOR_EACH_BB_FN (this_basic_block, cfun)
1207 {
1208 optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1209 last_call_luid = 0;
1210 mem_last_set = -1;
1211
1212 label_tick++;
1213 if (!single_pred_p (this_basic_block)
1214 || single_pred (this_basic_block) != last_bb)
1215 label_tick_ebb_start = label_tick;
1216 last_bb = this_basic_block;
1217
1218 FOR_BB_INSNS (this_basic_block, insn)
1219 if (INSN_P (insn) && BLOCK_FOR_INSN (insn))
1220 {
1221 rtx links;
1222
1223 subst_low_luid = DF_INSN_LUID (insn);
1224 subst_insn = insn;
1225
1226 note_stores (insn, set_nonzero_bits_and_sign_copies, insn);
1227 record_dead_and_set_regs (insn);
1228
1229 if (AUTO_INC_DEC)
1230 for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
1231 if (REG_NOTE_KIND (links) == REG_INC)
1232 set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
1233 insn);
1234
1235 /* Record the current insn_cost of this instruction. */
1236 INSN_COST (insn) = insn_cost (insn, optimize_this_for_speed_p);
1237 if (dump_file)
1238 {
1239 fprintf (dump_file, "insn_cost %d for ", INSN_COST (insn));
1240 dump_insn_slim (dump_file, insn);
1241 }
1242 }
1243 }
1244
1245 nonzero_sign_valid = 1;
1246
1247 /* Now scan all the insns in forward order. */
1248 label_tick = label_tick_ebb_start = 1;
1249 init_reg_last ();
1250 setup_incoming_promotions (first);
1251 last_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1252 int max_combine = param_max_combine_insns;
1253
1254 FOR_EACH_BB_FN (this_basic_block, cfun)
1255 {
1256 rtx_insn *last_combined_insn = NULL;
1257
1258 /* Ignore instruction combination in basic blocks that are going to
1259 be removed as unreachable anyway. See PR82386. */
1260 if (EDGE_COUNT (this_basic_block->preds) == 0)
1261 continue;
1262
1263 optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1264 last_call_luid = 0;
1265 mem_last_set = -1;
1266
1267 label_tick++;
1268 if (!single_pred_p (this_basic_block)
1269 || single_pred (this_basic_block) != last_bb)
1270 label_tick_ebb_start = label_tick;
1271 last_bb = this_basic_block;
1272
1273 rtl_profile_for_bb (this_basic_block);
1274 for (insn = BB_HEAD (this_basic_block);
1275 insn != NEXT_INSN (BB_END (this_basic_block));
1276 insn = next ? next : NEXT_INSN (insn))
1277 {
1278 next = 0;
1279 if (!NONDEBUG_INSN_P (insn))
1280 continue;
1281
1282 while (last_combined_insn
1283 && (!NONDEBUG_INSN_P (last_combined_insn)
1284 || last_combined_insn->deleted ()))
1285 last_combined_insn = PREV_INSN (last_combined_insn);
1286 if (last_combined_insn == NULL_RTX
1287 || BLOCK_FOR_INSN (last_combined_insn) != this_basic_block
1288 || DF_INSN_LUID (last_combined_insn) <= DF_INSN_LUID (insn))
1289 last_combined_insn = insn;
1290
1291 /* See if we know about function return values before this
1292 insn based upon SUBREG flags. */
1293 check_promoted_subreg (insn, PATTERN (insn));
1294
1295 /* See if we can find hardregs and subreg of pseudos in
1296 narrower modes. This could help turning TRUNCATEs
1297 into SUBREGs. */
1298 note_uses (&PATTERN (insn), record_truncated_values, NULL);
1299
1300 /* Try this insn with each insn it links back to. */
1301
1302 FOR_EACH_LOG_LINK (links, insn)
1303 if ((next = try_combine (insn, links->insn, NULL,
1304 NULL, &new_direct_jump_p,
1305 last_combined_insn)) != 0)
1306 {
1307 statistics_counter_event (cfun, "two-insn combine", 1);
1308 goto retry;
1309 }
1310
1311 /* Try each sequence of three linked insns ending with this one. */
1312
1313 if (max_combine >= 3)
1314 FOR_EACH_LOG_LINK (links, insn)
1315 {
1316 rtx_insn *link = links->insn;
1317
1318 /* If the linked insn has been replaced by a note, then there
1319 is no point in pursuing this chain any further. */
1320 if (NOTE_P (link))
1321 continue;
1322
1323 FOR_EACH_LOG_LINK (nextlinks, link)
1324 if ((next = try_combine (insn, link, nextlinks->insn,
1325 NULL, &new_direct_jump_p,
1326 last_combined_insn)) != 0)
1327 {
1328 statistics_counter_event (cfun, "three-insn combine", 1);
1329 goto retry;
1330 }
1331 }
1332
1333 /* Try to combine a jump insn that uses CC0
1334 with a preceding insn that sets CC0, and maybe with its
1335 logical predecessor as well.
1336 This is how we make decrement-and-branch insns.
1337 We need this special code because data flow connections
1338 via CC0 do not get entered in LOG_LINKS. */
1339
1340 if (HAVE_cc0
1341 && JUMP_P (insn)
1342 && (prev = prev_nonnote_insn (insn)) != 0
1343 && NONJUMP_INSN_P (prev)
1344 && sets_cc0_p (PATTERN (prev)))
1345 {
1346 if ((next = try_combine (insn, prev, NULL, NULL,
1347 &new_direct_jump_p,
1348 last_combined_insn)) != 0)
1349 goto retry;
1350
1351 FOR_EACH_LOG_LINK (nextlinks, prev)
1352 if ((next = try_combine (insn, prev, nextlinks->insn,
1353 NULL, &new_direct_jump_p,
1354 last_combined_insn)) != 0)
1355 goto retry;
1356 }
1357
1358 /* Do the same for an insn that explicitly references CC0. */
1359 if (HAVE_cc0 && NONJUMP_INSN_P (insn)
1360 && (prev = prev_nonnote_insn (insn)) != 0
1361 && NONJUMP_INSN_P (prev)
1362 && sets_cc0_p (PATTERN (prev))
1363 && GET_CODE (PATTERN (insn)) == SET
1364 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
1365 {
1366 if ((next = try_combine (insn, prev, NULL, NULL,
1367 &new_direct_jump_p,
1368 last_combined_insn)) != 0)
1369 goto retry;
1370
1371 FOR_EACH_LOG_LINK (nextlinks, prev)
1372 if ((next = try_combine (insn, prev, nextlinks->insn,
1373 NULL, &new_direct_jump_p,
1374 last_combined_insn)) != 0)
1375 goto retry;
1376 }
1377
1378 /* Finally, see if any of the insns that this insn links to
1379 explicitly references CC0. If so, try this insn, that insn,
1380 and its predecessor if it sets CC0. */
1381 if (HAVE_cc0)
1382 {
1383 FOR_EACH_LOG_LINK (links, insn)
1384 if (NONJUMP_INSN_P (links->insn)
1385 && GET_CODE (PATTERN (links->insn)) == SET
1386 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (links->insn)))
1387 && (prev = prev_nonnote_insn (links->insn)) != 0
1388 && NONJUMP_INSN_P (prev)
1389 && sets_cc0_p (PATTERN (prev))
1390 && (next = try_combine (insn, links->insn,
1391 prev, NULL, &new_direct_jump_p,
1392 last_combined_insn)) != 0)
1393 goto retry;
1394 }
1395
1396 /* Try combining an insn with two different insns whose results it
1397 uses. */
1398 if (max_combine >= 3)
1399 FOR_EACH_LOG_LINK (links, insn)
1400 for (nextlinks = links->next; nextlinks;
1401 nextlinks = nextlinks->next)
1402 if ((next = try_combine (insn, links->insn,
1403 nextlinks->insn, NULL,
1404 &new_direct_jump_p,
1405 last_combined_insn)) != 0)
1406
1407 {
1408 statistics_counter_event (cfun, "three-insn combine", 1);
1409 goto retry;
1410 }
1411
1412 /* Try four-instruction combinations. */
1413 if (max_combine >= 4)
1414 FOR_EACH_LOG_LINK (links, insn)
1415 {
1416 struct insn_link *next1;
1417 rtx_insn *link = links->insn;
1418
1419 /* If the linked insn has been replaced by a note, then there
1420 is no point in pursuing this chain any further. */
1421 if (NOTE_P (link))
1422 continue;
1423
1424 FOR_EACH_LOG_LINK (next1, link)
1425 {
1426 rtx_insn *link1 = next1->insn;
1427 if (NOTE_P (link1))
1428 continue;
1429 /* I0 -> I1 -> I2 -> I3. */
1430 FOR_EACH_LOG_LINK (nextlinks, link1)
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 -> I2, I2 -> I3. */
1440 for (nextlinks = next1->next; nextlinks;
1441 nextlinks = nextlinks->next)
1442 if ((next = try_combine (insn, link, link1,
1443 nextlinks->insn,
1444 &new_direct_jump_p,
1445 last_combined_insn)) != 0)
1446 {
1447 statistics_counter_event (cfun, "four-insn combine", 1);
1448 goto retry;
1449 }
1450 }
1451
1452 for (next1 = links->next; next1; next1 = next1->next)
1453 {
1454 rtx_insn *link1 = next1->insn;
1455 if (NOTE_P (link1))
1456 continue;
1457 /* I0 -> I2; I1, I2 -> I3. */
1458 FOR_EACH_LOG_LINK (nextlinks, link)
1459 if ((next = try_combine (insn, link, link1,
1460 nextlinks->insn,
1461 &new_direct_jump_p,
1462 last_combined_insn)) != 0)
1463 {
1464 statistics_counter_event (cfun, "four-insn combine", 1);
1465 goto retry;
1466 }
1467 /* I0 -> I1; I1, I2 -> I3. */
1468 FOR_EACH_LOG_LINK (nextlinks, link1)
1469 if ((next = try_combine (insn, link, link1,
1470 nextlinks->insn,
1471 &new_direct_jump_p,
1472 last_combined_insn)) != 0)
1473 {
1474 statistics_counter_event (cfun, "four-insn combine", 1);
1475 goto retry;
1476 }
1477 }
1478 }
1479
1480 /* Try this insn with each REG_EQUAL note it links back to. */
1481 FOR_EACH_LOG_LINK (links, insn)
1482 {
1483 rtx set, note;
1484 rtx_insn *temp = links->insn;
1485 if ((set = single_set (temp)) != 0
1486 && (note = find_reg_equal_equiv_note (temp)) != 0
1487 && (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST
1488 /* Avoid using a register that may already been marked
1489 dead by an earlier instruction. */
1490 && ! unmentioned_reg_p (note, SET_SRC (set))
1491 && (GET_MODE (note) == VOIDmode
1492 ? SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set)))
1493 : (GET_MODE (SET_DEST (set)) == GET_MODE (note)
1494 && (GET_CODE (SET_DEST (set)) != ZERO_EXTRACT
1495 || (GET_MODE (XEXP (SET_DEST (set), 0))
1496 == GET_MODE (note))))))
1497 {
1498 /* Temporarily replace the set's source with the
1499 contents of the REG_EQUAL note. The insn will
1500 be deleted or recognized by try_combine. */
1501 rtx orig_src = SET_SRC (set);
1502 rtx orig_dest = SET_DEST (set);
1503 if (GET_CODE (SET_DEST (set)) == ZERO_EXTRACT)
1504 SET_DEST (set) = XEXP (SET_DEST (set), 0);
1505 SET_SRC (set) = note;
1506 i2mod = temp;
1507 i2mod_old_rhs = copy_rtx (orig_src);
1508 i2mod_new_rhs = copy_rtx (note);
1509 next = try_combine (insn, i2mod, NULL, NULL,
1510 &new_direct_jump_p,
1511 last_combined_insn);
1512 i2mod = NULL;
1513 if (next)
1514 {
1515 statistics_counter_event (cfun, "insn-with-note combine", 1);
1516 goto retry;
1517 }
1518 SET_SRC (set) = orig_src;
1519 SET_DEST (set) = orig_dest;
1520 }
1521 }
1522
1523 if (!NOTE_P (insn))
1524 record_dead_and_set_regs (insn);
1525
1526 retry:
1527 ;
1528 }
1529 }
1530
1531 default_rtl_profile ();
1532 clear_bb_flags ();
1533 new_direct_jump_p |= purge_all_dead_edges ();
1534 new_direct_jump_p |= delete_noop_moves ();
1535
1536 /* Clean up. */
1537 obstack_free (&insn_link_obstack, NULL);
1538 free (uid_log_links);
1539 free (uid_insn_cost);
1540 reg_stat.release ();
1541
1542 {
1543 struct undo *undo, *next;
1544 for (undo = undobuf.frees; undo; undo = next)
1545 {
1546 next = undo->next;
1547 free (undo);
1548 }
1549 undobuf.frees = 0;
1550 }
1551
1552 total_attempts += combine_attempts;
1553 total_merges += combine_merges;
1554 total_extras += combine_extras;
1555 total_successes += combine_successes;
1556
1557 nonzero_sign_valid = 0;
1558 rtl_hooks = general_rtl_hooks;
1559
1560 /* Make recognizer allow volatile MEMs again. */
1561 init_recog ();
1562
1563 return new_direct_jump_p;
1564 }
1565
1566 /* Wipe the last_xxx fields of reg_stat in preparation for another pass. */
1567
1568 static void
1569 init_reg_last (void)
1570 {
1571 unsigned int i;
1572 reg_stat_type *p;
1573
1574 FOR_EACH_VEC_ELT (reg_stat, i, p)
1575 memset (p, 0, offsetof (reg_stat_type, sign_bit_copies));
1576 }
1577 \f
1578 /* Set up any promoted values for incoming argument registers. */
1579
1580 static void
1581 setup_incoming_promotions (rtx_insn *first)
1582 {
1583 tree arg;
1584 bool strictly_local = false;
1585
1586 for (arg = DECL_ARGUMENTS (current_function_decl); arg;
1587 arg = DECL_CHAIN (arg))
1588 {
1589 rtx x, reg = DECL_INCOMING_RTL (arg);
1590 int uns1, uns3;
1591 machine_mode mode1, mode2, mode3, mode4;
1592
1593 /* Only continue if the incoming argument is in a register. */
1594 if (!REG_P (reg))
1595 continue;
1596
1597 /* Determine, if possible, whether all call sites of the current
1598 function lie within the current compilation unit. (This does
1599 take into account the exporting of a function via taking its
1600 address, and so forth.) */
1601 strictly_local
1602 = cgraph_node::local_info_node (current_function_decl)->local;
1603
1604 /* The mode and signedness of the argument before any promotions happen
1605 (equal to the mode of the pseudo holding it at that stage). */
1606 mode1 = TYPE_MODE (TREE_TYPE (arg));
1607 uns1 = TYPE_UNSIGNED (TREE_TYPE (arg));
1608
1609 /* The mode and signedness of the argument after any source language and
1610 TARGET_PROMOTE_PROTOTYPES-driven promotions. */
1611 mode2 = TYPE_MODE (DECL_ARG_TYPE (arg));
1612 uns3 = TYPE_UNSIGNED (DECL_ARG_TYPE (arg));
1613
1614 /* The mode and signedness of the argument as it is actually passed,
1615 see assign_parm_setup_reg in function.c. */
1616 mode3 = promote_function_mode (TREE_TYPE (arg), mode1, &uns3,
1617 TREE_TYPE (cfun->decl), 0);
1618
1619 /* The mode of the register in which the argument is being passed. */
1620 mode4 = GET_MODE (reg);
1621
1622 /* Eliminate sign extensions in the callee when:
1623 (a) A mode promotion has occurred; */
1624 if (mode1 == mode3)
1625 continue;
1626 /* (b) The mode of the register is the same as the mode of
1627 the argument as it is passed; */
1628 if (mode3 != mode4)
1629 continue;
1630 /* (c) There's no language level extension; */
1631 if (mode1 == mode2)
1632 ;
1633 /* (c.1) All callers are from the current compilation unit. If that's
1634 the case we don't have to rely on an ABI, we only have to know
1635 what we're generating right now, and we know that we will do the
1636 mode1 to mode2 promotion with the given sign. */
1637 else if (!strictly_local)
1638 continue;
1639 /* (c.2) The combination of the two promotions is useful. This is
1640 true when the signs match, or if the first promotion is unsigned.
1641 In the later case, (sign_extend (zero_extend x)) is the same as
1642 (zero_extend (zero_extend x)), so make sure to force UNS3 true. */
1643 else if (uns1)
1644 uns3 = true;
1645 else if (uns3)
1646 continue;
1647
1648 /* Record that the value was promoted from mode1 to mode3,
1649 so that any sign extension at the head of the current
1650 function may be eliminated. */
1651 x = gen_rtx_CLOBBER (mode1, const0_rtx);
1652 x = gen_rtx_fmt_e ((uns3 ? ZERO_EXTEND : SIGN_EXTEND), mode3, x);
1653 record_value_for_reg (reg, first, x);
1654 }
1655 }
1656
1657 /* If MODE has a precision lower than PREC and SRC is a non-negative constant
1658 that would appear negative in MODE, sign-extend SRC for use in nonzero_bits
1659 because some machines (maybe most) will actually do the sign-extension and
1660 this is the conservative approach.
1661
1662 ??? For 2.5, try to tighten up the MD files in this regard instead of this
1663 kludge. */
1664
1665 static rtx
1666 sign_extend_short_imm (rtx src, machine_mode mode, unsigned int prec)
1667 {
1668 scalar_int_mode int_mode;
1669 if (CONST_INT_P (src)
1670 && is_a <scalar_int_mode> (mode, &int_mode)
1671 && GET_MODE_PRECISION (int_mode) < prec
1672 && INTVAL (src) > 0
1673 && val_signbit_known_set_p (int_mode, INTVAL (src)))
1674 src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (int_mode));
1675
1676 return src;
1677 }
1678
1679 /* Update RSP for pseudo-register X from INSN's REG_EQUAL note (if one exists)
1680 and SET. */
1681
1682 static void
1683 update_rsp_from_reg_equal (reg_stat_type *rsp, rtx_insn *insn, const_rtx set,
1684 rtx x)
1685 {
1686 rtx reg_equal_note = insn ? find_reg_equal_equiv_note (insn) : NULL_RTX;
1687 unsigned HOST_WIDE_INT bits = 0;
1688 rtx reg_equal = NULL, src = SET_SRC (set);
1689 unsigned int num = 0;
1690
1691 if (reg_equal_note)
1692 reg_equal = XEXP (reg_equal_note, 0);
1693
1694 if (SHORT_IMMEDIATES_SIGN_EXTEND)
1695 {
1696 src = sign_extend_short_imm (src, GET_MODE (x), BITS_PER_WORD);
1697 if (reg_equal)
1698 reg_equal = sign_extend_short_imm (reg_equal, GET_MODE (x), BITS_PER_WORD);
1699 }
1700
1701 /* Don't call nonzero_bits if it cannot change anything. */
1702 if (rsp->nonzero_bits != HOST_WIDE_INT_M1U)
1703 {
1704 machine_mode mode = GET_MODE (x);
1705 if (GET_MODE_CLASS (mode) == MODE_INT
1706 && HWI_COMPUTABLE_MODE_P (mode))
1707 mode = nonzero_bits_mode;
1708 bits = nonzero_bits (src, mode);
1709 if (reg_equal && bits)
1710 bits &= nonzero_bits (reg_equal, mode);
1711 rsp->nonzero_bits |= bits;
1712 }
1713
1714 /* Don't call num_sign_bit_copies if it cannot change anything. */
1715 if (rsp->sign_bit_copies != 1)
1716 {
1717 num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1718 if (reg_equal && maybe_ne (num, GET_MODE_PRECISION (GET_MODE (x))))
1719 {
1720 unsigned int numeq = num_sign_bit_copies (reg_equal, GET_MODE (x));
1721 if (num == 0 || numeq > num)
1722 num = numeq;
1723 }
1724 if (rsp->sign_bit_copies == 0 || num < rsp->sign_bit_copies)
1725 rsp->sign_bit_copies = num;
1726 }
1727 }
1728
1729 /* Called via note_stores. If X is a pseudo that is narrower than
1730 HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
1731
1732 If we are setting only a portion of X and we can't figure out what
1733 portion, assume all bits will be used since we don't know what will
1734 be happening.
1735
1736 Similarly, set how many bits of X are known to be copies of the sign bit
1737 at all locations in the function. This is the smallest number implied
1738 by any set of X. */
1739
1740 static void
1741 set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
1742 {
1743 rtx_insn *insn = (rtx_insn *) data;
1744 scalar_int_mode mode;
1745
1746 if (REG_P (x)
1747 && REGNO (x) >= FIRST_PSEUDO_REGISTER
1748 /* If this register is undefined at the start of the file, we can't
1749 say what its contents were. */
1750 && ! REGNO_REG_SET_P
1751 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb), REGNO (x))
1752 && is_a <scalar_int_mode> (GET_MODE (x), &mode)
1753 && HWI_COMPUTABLE_MODE_P (mode))
1754 {
1755 reg_stat_type *rsp = &reg_stat[REGNO (x)];
1756
1757 if (set == 0 || GET_CODE (set) == CLOBBER)
1758 {
1759 rsp->nonzero_bits = GET_MODE_MASK (mode);
1760 rsp->sign_bit_copies = 1;
1761 return;
1762 }
1763
1764 /* If this register is being initialized using itself, and the
1765 register is uninitialized in this basic block, and there are
1766 no LOG_LINKS which set the register, then part of the
1767 register is uninitialized. In that case we can't assume
1768 anything about the number of nonzero bits.
1769
1770 ??? We could do better if we checked this in
1771 reg_{nonzero_bits,num_sign_bit_copies}_for_combine. Then we
1772 could avoid making assumptions about the insn which initially
1773 sets the register, while still using the information in other
1774 insns. We would have to be careful to check every insn
1775 involved in the combination. */
1776
1777 if (insn
1778 && reg_referenced_p (x, PATTERN (insn))
1779 && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)),
1780 REGNO (x)))
1781 {
1782 struct insn_link *link;
1783
1784 FOR_EACH_LOG_LINK (link, insn)
1785 if (dead_or_set_p (link->insn, x))
1786 break;
1787 if (!link)
1788 {
1789 rsp->nonzero_bits = GET_MODE_MASK (mode);
1790 rsp->sign_bit_copies = 1;
1791 return;
1792 }
1793 }
1794
1795 /* If this is a complex assignment, see if we can convert it into a
1796 simple assignment. */
1797 set = expand_field_assignment (set);
1798
1799 /* If this is a simple assignment, or we have a paradoxical SUBREG,
1800 set what we know about X. */
1801
1802 if (SET_DEST (set) == x
1803 || (paradoxical_subreg_p (SET_DEST (set))
1804 && SUBREG_REG (SET_DEST (set)) == x))
1805 update_rsp_from_reg_equal (rsp, insn, set, x);
1806 else
1807 {
1808 rsp->nonzero_bits = GET_MODE_MASK (mode);
1809 rsp->sign_bit_copies = 1;
1810 }
1811 }
1812 }
1813 \f
1814 /* See if INSN can be combined into I3. PRED, PRED2, SUCC and SUCC2 are
1815 optionally insns that were previously combined into I3 or that will be
1816 combined into the merger of INSN and I3. The order is PRED, PRED2,
1817 INSN, SUCC, SUCC2, I3.
1818
1819 Return 0 if the combination is not allowed for any reason.
1820
1821 If the combination is allowed, *PDEST will be set to the single
1822 destination of INSN and *PSRC to the single source, and this function
1823 will return 1. */
1824
1825 static int
1826 can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED,
1827 rtx_insn *pred2 ATTRIBUTE_UNUSED, rtx_insn *succ, rtx_insn *succ2,
1828 rtx *pdest, rtx *psrc)
1829 {
1830 int i;
1831 const_rtx set = 0;
1832 rtx src, dest;
1833 rtx_insn *p;
1834 rtx link;
1835 bool all_adjacent = true;
1836 int (*is_volatile_p) (const_rtx);
1837
1838 if (succ)
1839 {
1840 if (succ2)
1841 {
1842 if (next_active_insn (succ2) != i3)
1843 all_adjacent = false;
1844 if (next_active_insn (succ) != succ2)
1845 all_adjacent = false;
1846 }
1847 else if (next_active_insn (succ) != i3)
1848 all_adjacent = false;
1849 if (next_active_insn (insn) != succ)
1850 all_adjacent = false;
1851 }
1852 else if (next_active_insn (insn) != i3)
1853 all_adjacent = false;
1854
1855 /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1856 or a PARALLEL consisting of such a SET and CLOBBERs.
1857
1858 If INSN has CLOBBER parallel parts, ignore them for our processing.
1859 By definition, these happen during the execution of the insn. When it
1860 is merged with another insn, all bets are off. If they are, in fact,
1861 needed and aren't also supplied in I3, they may be added by
1862 recog_for_combine. Otherwise, it won't match.
1863
1864 We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1865 note.
1866
1867 Get the source and destination of INSN. If more than one, can't
1868 combine. */
1869
1870 if (GET_CODE (PATTERN (insn)) == SET)
1871 set = PATTERN (insn);
1872 else if (GET_CODE (PATTERN (insn)) == PARALLEL
1873 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1874 {
1875 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1876 {
1877 rtx elt = XVECEXP (PATTERN (insn), 0, i);
1878
1879 switch (GET_CODE (elt))
1880 {
1881 /* This is important to combine floating point insns
1882 for the SH4 port. */
1883 case USE:
1884 /* Combining an isolated USE doesn't make sense.
1885 We depend here on combinable_i3pat to reject them. */
1886 /* The code below this loop only verifies that the inputs of
1887 the SET in INSN do not change. We call reg_set_between_p
1888 to verify that the REG in the USE does not change between
1889 I3 and INSN.
1890 If the USE in INSN was for a pseudo register, the matching
1891 insn pattern will likely match any register; combining this
1892 with any other USE would only be safe if we knew that the
1893 used registers have identical values, or if there was
1894 something to tell them apart, e.g. different modes. For
1895 now, we forgo such complicated tests and simply disallow
1896 combining of USES of pseudo registers with any other USE. */
1897 if (REG_P (XEXP (elt, 0))
1898 && GET_CODE (PATTERN (i3)) == PARALLEL)
1899 {
1900 rtx i3pat = PATTERN (i3);
1901 int i = XVECLEN (i3pat, 0) - 1;
1902 unsigned int regno = REGNO (XEXP (elt, 0));
1903
1904 do
1905 {
1906 rtx i3elt = XVECEXP (i3pat, 0, i);
1907
1908 if (GET_CODE (i3elt) == USE
1909 && REG_P (XEXP (i3elt, 0))
1910 && (REGNO (XEXP (i3elt, 0)) == regno
1911 ? reg_set_between_p (XEXP (elt, 0),
1912 PREV_INSN (insn), i3)
1913 : regno >= FIRST_PSEUDO_REGISTER))
1914 return 0;
1915 }
1916 while (--i >= 0);
1917 }
1918 break;
1919
1920 /* We can ignore CLOBBERs. */
1921 case CLOBBER:
1922 break;
1923
1924 case SET:
1925 /* Ignore SETs whose result isn't used but not those that
1926 have side-effects. */
1927 if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1928 && insn_nothrow_p (insn)
1929 && !side_effects_p (elt))
1930 break;
1931
1932 /* If we have already found a SET, this is a second one and
1933 so we cannot combine with this insn. */
1934 if (set)
1935 return 0;
1936
1937 set = elt;
1938 break;
1939
1940 default:
1941 /* Anything else means we can't combine. */
1942 return 0;
1943 }
1944 }
1945
1946 if (set == 0
1947 /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1948 so don't do anything with it. */
1949 || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1950 return 0;
1951 }
1952 else
1953 return 0;
1954
1955 if (set == 0)
1956 return 0;
1957
1958 /* The simplification in expand_field_assignment may call back to
1959 get_last_value, so set safe guard here. */
1960 subst_low_luid = DF_INSN_LUID (insn);
1961
1962 set = expand_field_assignment (set);
1963 src = SET_SRC (set), dest = SET_DEST (set);
1964
1965 /* Do not eliminate user-specified register if it is in an
1966 asm input because we may break the register asm usage defined
1967 in GCC manual if allow to do so.
1968 Be aware that this may cover more cases than we expect but this
1969 should be harmless. */
1970 if (REG_P (dest) && REG_USERVAR_P (dest) && HARD_REGISTER_P (dest)
1971 && extract_asm_operands (PATTERN (i3)))
1972 return 0;
1973
1974 /* Don't eliminate a store in the stack pointer. */
1975 if (dest == stack_pointer_rtx
1976 /* Don't combine with an insn that sets a register to itself if it has
1977 a REG_EQUAL note. This may be part of a LIBCALL sequence. */
1978 || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1979 /* Can't merge an ASM_OPERANDS. */
1980 || GET_CODE (src) == ASM_OPERANDS
1981 /* Can't merge a function call. */
1982 || GET_CODE (src) == CALL
1983 /* Don't eliminate a function call argument. */
1984 || (CALL_P (i3)
1985 && (find_reg_fusage (i3, USE, dest)
1986 || (REG_P (dest)
1987 && REGNO (dest) < FIRST_PSEUDO_REGISTER
1988 && global_regs[REGNO (dest)])))
1989 /* Don't substitute into an incremented register. */
1990 || FIND_REG_INC_NOTE (i3, dest)
1991 || (succ && FIND_REG_INC_NOTE (succ, dest))
1992 || (succ2 && FIND_REG_INC_NOTE (succ2, dest))
1993 /* Don't substitute into a non-local goto, this confuses CFG. */
1994 || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1995 /* Make sure that DEST is not used after INSN but before SUCC, or
1996 after SUCC and before SUCC2, or after SUCC2 but before I3. */
1997 || (!all_adjacent
1998 && ((succ2
1999 && (reg_used_between_p (dest, succ2, i3)
2000 || reg_used_between_p (dest, succ, succ2)))
2001 || (!succ2 && succ && reg_used_between_p (dest, succ, i3))
2002 || (!succ2 && !succ && reg_used_between_p (dest, insn, i3))
2003 || (succ
2004 /* SUCC and SUCC2 can be split halves from a PARALLEL; in
2005 that case SUCC is not in the insn stream, so use SUCC2
2006 instead for this test. */
2007 && reg_used_between_p (dest, insn,
2008 succ2
2009 && INSN_UID (succ) == INSN_UID (succ2)
2010 ? succ2 : succ))))
2011 /* Make sure that the value that is to be substituted for the register
2012 does not use any registers whose values alter in between. However,
2013 If the insns are adjacent, a use can't cross a set even though we
2014 think it might (this can happen for a sequence of insns each setting
2015 the same destination; last_set of that register might point to
2016 a NOTE). If INSN has a REG_EQUIV note, the register is always
2017 equivalent to the memory so the substitution is valid even if there
2018 are intervening stores. Also, don't move a volatile asm or
2019 UNSPEC_VOLATILE across any other insns. */
2020 || (! all_adjacent
2021 && (((!MEM_P (src)
2022 || ! find_reg_note (insn, REG_EQUIV, src))
2023 && modified_between_p (src, insn, i3))
2024 || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
2025 || GET_CODE (src) == UNSPEC_VOLATILE))
2026 /* Don't combine across a CALL_INSN, because that would possibly
2027 change whether the life span of some REGs crosses calls or not,
2028 and it is a pain to update that information.
2029 Exception: if source is a constant, moving it later can't hurt.
2030 Accept that as a special case. */
2031 || (DF_INSN_LUID (insn) < last_call_luid && ! CONSTANT_P (src)))
2032 return 0;
2033
2034 /* DEST must either be a REG or CC0. */
2035 if (REG_P (dest))
2036 {
2037 /* If register alignment is being enforced for multi-word items in all
2038 cases except for parameters, it is possible to have a register copy
2039 insn referencing a hard register that is not allowed to contain the
2040 mode being copied and which would not be valid as an operand of most
2041 insns. Eliminate this problem by not combining with such an insn.
2042
2043 Also, on some machines we don't want to extend the life of a hard
2044 register. */
2045
2046 if (REG_P (src)
2047 && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
2048 && !targetm.hard_regno_mode_ok (REGNO (dest), GET_MODE (dest)))
2049 /* Don't extend the life of a hard register unless it is
2050 user variable (if we have few registers) or it can't
2051 fit into the desired register (meaning something special
2052 is going on).
2053 Also avoid substituting a return register into I3, because
2054 reload can't handle a conflict with constraints of other
2055 inputs. */
2056 || (REGNO (src) < FIRST_PSEUDO_REGISTER
2057 && !targetm.hard_regno_mode_ok (REGNO (src),
2058 GET_MODE (src)))))
2059 return 0;
2060 }
2061 else if (GET_CODE (dest) != CC0)
2062 return 0;
2063
2064
2065 if (GET_CODE (PATTERN (i3)) == PARALLEL)
2066 for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
2067 if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
2068 {
2069 rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
2070
2071 /* If the clobber represents an earlyclobber operand, we must not
2072 substitute an expression containing the clobbered register.
2073 As we do not analyze the constraint strings here, we have to
2074 make the conservative assumption. However, if the register is
2075 a fixed hard reg, the clobber cannot represent any operand;
2076 we leave it up to the machine description to either accept or
2077 reject use-and-clobber patterns. */
2078 if (!REG_P (reg)
2079 || REGNO (reg) >= FIRST_PSEUDO_REGISTER
2080 || !fixed_regs[REGNO (reg)])
2081 if (reg_overlap_mentioned_p (reg, src))
2082 return 0;
2083 }
2084
2085 /* If INSN contains anything volatile, or is an `asm' (whether volatile
2086 or not), reject, unless nothing volatile comes between it and I3 */
2087
2088 if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
2089 {
2090 /* Make sure neither succ nor succ2 contains a volatile reference. */
2091 if (succ2 != 0 && volatile_refs_p (PATTERN (succ2)))
2092 return 0;
2093 if (succ != 0 && volatile_refs_p (PATTERN (succ)))
2094 return 0;
2095 /* We'll check insns between INSN and I3 below. */
2096 }
2097
2098 /* If INSN is an asm, and DEST is a hard register, reject, since it has
2099 to be an explicit register variable, and was chosen for a reason. */
2100
2101 if (GET_CODE (src) == ASM_OPERANDS
2102 && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
2103 return 0;
2104
2105 /* If INSN contains volatile references (specifically volatile MEMs),
2106 we cannot combine across any other volatile references.
2107 Even if INSN doesn't contain volatile references, any intervening
2108 volatile insn might affect machine state. */
2109
2110 is_volatile_p = volatile_refs_p (PATTERN (insn))
2111 ? volatile_refs_p
2112 : volatile_insn_p;
2113
2114 for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
2115 if (INSN_P (p) && p != succ && p != succ2 && is_volatile_p (PATTERN (p)))
2116 return 0;
2117
2118 /* If INSN contains an autoincrement or autodecrement, make sure that
2119 register is not used between there and I3, and not already used in
2120 I3 either. Neither must it be used in PRED or SUCC, if they exist. */
2121
2122 if (AUTO_INC_DEC)
2123 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
2124 if (REG_NOTE_KIND (link) == REG_INC
2125 && (reg_used_between_p (XEXP (link, 0), insn, i3)
2126 || (pred != NULL_RTX
2127 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
2128 || (pred2 != NULL_RTX
2129 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred2)))
2130 || (succ != NULL_RTX
2131 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
2132 || (succ2 != NULL_RTX
2133 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ2)))
2134 || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
2135 return 0;
2136
2137 /* Don't combine an insn that follows a CC0-setting insn.
2138 An insn that uses CC0 must not be separated from the one that sets it.
2139 We do, however, allow I2 to follow a CC0-setting insn if that insn
2140 is passed as I1; in that case it will be deleted also.
2141 We also allow combining in this case if all the insns are adjacent
2142 because that would leave the two CC0 insns adjacent as well.
2143 It would be more logical to test whether CC0 occurs inside I1 or I2,
2144 but that would be much slower, and this ought to be equivalent. */
2145
2146 if (HAVE_cc0)
2147 {
2148 p = prev_nonnote_insn (insn);
2149 if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
2150 && ! all_adjacent)
2151 return 0;
2152 }
2153
2154 /* If we get here, we have passed all the tests and the combination is
2155 to be allowed. */
2156
2157 *pdest = dest;
2158 *psrc = src;
2159
2160 return 1;
2161 }
2162 \f
2163 /* LOC is the location within I3 that contains its pattern or the component
2164 of a PARALLEL of the pattern. We validate that it is valid for combining.
2165
2166 One problem is if I3 modifies its output, as opposed to replacing it
2167 entirely, we can't allow the output to contain I2DEST, I1DEST or I0DEST as
2168 doing so would produce an insn that is not equivalent to the original insns.
2169
2170 Consider:
2171
2172 (set (reg:DI 101) (reg:DI 100))
2173 (set (subreg:SI (reg:DI 101) 0) <foo>)
2174
2175 This is NOT equivalent to:
2176
2177 (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
2178 (set (reg:DI 101) (reg:DI 100))])
2179
2180 Not only does this modify 100 (in which case it might still be valid
2181 if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
2182
2183 We can also run into a problem if I2 sets a register that I1
2184 uses and I1 gets directly substituted into I3 (not via I2). In that
2185 case, we would be getting the wrong value of I2DEST into I3, so we
2186 must reject the combination. This case occurs when I2 and I1 both
2187 feed into I3, rather than when I1 feeds into I2, which feeds into I3.
2188 If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
2189 of a SET must prevent combination from occurring. The same situation
2190 can occur for I0, in which case I0_NOT_IN_SRC is set.
2191
2192 Before doing the above check, we first try to expand a field assignment
2193 into a set of logical operations.
2194
2195 If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
2196 we place a register that is both set and used within I3. If more than one
2197 such register is detected, we fail.
2198
2199 Return 1 if the combination is valid, zero otherwise. */
2200
2201 static int
2202 combinable_i3pat (rtx_insn *i3, rtx *loc, rtx i2dest, rtx i1dest, rtx i0dest,
2203 int i1_not_in_src, int i0_not_in_src, rtx *pi3dest_killed)
2204 {
2205 rtx x = *loc;
2206
2207 if (GET_CODE (x) == SET)
2208 {
2209 rtx set = x ;
2210 rtx dest = SET_DEST (set);
2211 rtx src = SET_SRC (set);
2212 rtx inner_dest = dest;
2213 rtx subdest;
2214
2215 while (GET_CODE (inner_dest) == STRICT_LOW_PART
2216 || GET_CODE (inner_dest) == SUBREG
2217 || GET_CODE (inner_dest) == ZERO_EXTRACT)
2218 inner_dest = XEXP (inner_dest, 0);
2219
2220 /* Check for the case where I3 modifies its output, as discussed
2221 above. We don't want to prevent pseudos from being combined
2222 into the address of a MEM, so only prevent the combination if
2223 i1 or i2 set the same MEM. */
2224 if ((inner_dest != dest &&
2225 (!MEM_P (inner_dest)
2226 || rtx_equal_p (i2dest, inner_dest)
2227 || (i1dest && rtx_equal_p (i1dest, inner_dest))
2228 || (i0dest && rtx_equal_p (i0dest, inner_dest)))
2229 && (reg_overlap_mentioned_p (i2dest, inner_dest)
2230 || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))
2231 || (i0dest && reg_overlap_mentioned_p (i0dest, inner_dest))))
2232
2233 /* This is the same test done in can_combine_p except we can't test
2234 all_adjacent; we don't have to, since this instruction will stay
2235 in place, thus we are not considering increasing the lifetime of
2236 INNER_DEST.
2237
2238 Also, if this insn sets a function argument, combining it with
2239 something that might need a spill could clobber a previous
2240 function argument; the all_adjacent test in can_combine_p also
2241 checks this; here, we do a more specific test for this case. */
2242
2243 || (REG_P (inner_dest)
2244 && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
2245 && !targetm.hard_regno_mode_ok (REGNO (inner_dest),
2246 GET_MODE (inner_dest)))
2247 || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src))
2248 || (i0_not_in_src && reg_overlap_mentioned_p (i0dest, src)))
2249 return 0;
2250
2251 /* If DEST is used in I3, it is being killed in this insn, so
2252 record that for later. We have to consider paradoxical
2253 subregs here, since they kill the whole register, but we
2254 ignore partial subregs, STRICT_LOW_PART, etc.
2255 Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
2256 STACK_POINTER_REGNUM, since these are always considered to be
2257 live. Similarly for ARG_POINTER_REGNUM if it is fixed. */
2258 subdest = dest;
2259 if (GET_CODE (subdest) == SUBREG && !partial_subreg_p (subdest))
2260 subdest = SUBREG_REG (subdest);
2261 if (pi3dest_killed
2262 && REG_P (subdest)
2263 && reg_referenced_p (subdest, PATTERN (i3))
2264 && REGNO (subdest) != FRAME_POINTER_REGNUM
2265 && (HARD_FRAME_POINTER_IS_FRAME_POINTER
2266 || REGNO (subdest) != HARD_FRAME_POINTER_REGNUM)
2267 && (FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
2268 || (REGNO (subdest) != ARG_POINTER_REGNUM
2269 || ! fixed_regs [REGNO (subdest)]))
2270 && REGNO (subdest) != STACK_POINTER_REGNUM)
2271 {
2272 if (*pi3dest_killed)
2273 return 0;
2274
2275 *pi3dest_killed = subdest;
2276 }
2277 }
2278
2279 else if (GET_CODE (x) == PARALLEL)
2280 {
2281 int i;
2282
2283 for (i = 0; i < XVECLEN (x, 0); i++)
2284 if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest, i0dest,
2285 i1_not_in_src, i0_not_in_src, pi3dest_killed))
2286 return 0;
2287 }
2288
2289 return 1;
2290 }
2291 \f
2292 /* Return 1 if X is an arithmetic expression that contains a multiplication
2293 and division. We don't count multiplications by powers of two here. */
2294
2295 static int
2296 contains_muldiv (rtx x)
2297 {
2298 switch (GET_CODE (x))
2299 {
2300 case MOD: case DIV: case UMOD: case UDIV:
2301 return 1;
2302
2303 case MULT:
2304 return ! (CONST_INT_P (XEXP (x, 1))
2305 && pow2p_hwi (UINTVAL (XEXP (x, 1))));
2306 default:
2307 if (BINARY_P (x))
2308 return contains_muldiv (XEXP (x, 0))
2309 || contains_muldiv (XEXP (x, 1));
2310
2311 if (UNARY_P (x))
2312 return contains_muldiv (XEXP (x, 0));
2313
2314 return 0;
2315 }
2316 }
2317 \f
2318 /* Determine whether INSN can be used in a combination. Return nonzero if
2319 not. This is used in try_combine to detect early some cases where we
2320 can't perform combinations. */
2321
2322 static int
2323 cant_combine_insn_p (rtx_insn *insn)
2324 {
2325 rtx set;
2326 rtx src, dest;
2327
2328 /* If this isn't really an insn, we can't do anything.
2329 This can occur when flow deletes an insn that it has merged into an
2330 auto-increment address. */
2331 if (!NONDEBUG_INSN_P (insn))
2332 return 1;
2333
2334 /* Never combine loads and stores involving hard regs that are likely
2335 to be spilled. The register allocator can usually handle such
2336 reg-reg moves by tying. If we allow the combiner to make
2337 substitutions of likely-spilled regs, reload might die.
2338 As an exception, we allow combinations involving fixed regs; these are
2339 not available to the register allocator so there's no risk involved. */
2340
2341 set = single_set (insn);
2342 if (! set)
2343 return 0;
2344 src = SET_SRC (set);
2345 dest = SET_DEST (set);
2346 if (GET_CODE (src) == SUBREG)
2347 src = SUBREG_REG (src);
2348 if (GET_CODE (dest) == SUBREG)
2349 dest = SUBREG_REG (dest);
2350 if (REG_P (src) && REG_P (dest)
2351 && ((HARD_REGISTER_P (src)
2352 && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (src))
2353 #ifdef LEAF_REGISTERS
2354 && ! LEAF_REGISTERS [REGNO (src)])
2355 #else
2356 )
2357 #endif
2358 || (HARD_REGISTER_P (dest)
2359 && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (dest))
2360 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (dest))))))
2361 return 1;
2362
2363 return 0;
2364 }
2365
2366 struct likely_spilled_retval_info
2367 {
2368 unsigned regno, nregs;
2369 unsigned mask;
2370 };
2371
2372 /* Called via note_stores by likely_spilled_retval_p. Remove from info->mask
2373 hard registers that are known to be written to / clobbered in full. */
2374 static void
2375 likely_spilled_retval_1 (rtx x, const_rtx set, void *data)
2376 {
2377 struct likely_spilled_retval_info *const info =
2378 (struct likely_spilled_retval_info *) data;
2379 unsigned regno, nregs;
2380 unsigned new_mask;
2381
2382 if (!REG_P (XEXP (set, 0)))
2383 return;
2384 regno = REGNO (x);
2385 if (regno >= info->regno + info->nregs)
2386 return;
2387 nregs = REG_NREGS (x);
2388 if (regno + nregs <= info->regno)
2389 return;
2390 new_mask = (2U << (nregs - 1)) - 1;
2391 if (regno < info->regno)
2392 new_mask >>= info->regno - regno;
2393 else
2394 new_mask <<= regno - info->regno;
2395 info->mask &= ~new_mask;
2396 }
2397
2398 /* Return nonzero iff part of the return value is live during INSN, and
2399 it is likely spilled. This can happen when more than one insn is needed
2400 to copy the return value, e.g. when we consider to combine into the
2401 second copy insn for a complex value. */
2402
2403 static int
2404 likely_spilled_retval_p (rtx_insn *insn)
2405 {
2406 rtx_insn *use = BB_END (this_basic_block);
2407 rtx reg;
2408 rtx_insn *p;
2409 unsigned regno, nregs;
2410 /* We assume here that no machine mode needs more than
2411 32 hard registers when the value overlaps with a register
2412 for which TARGET_FUNCTION_VALUE_REGNO_P is true. */
2413 unsigned mask;
2414 struct likely_spilled_retval_info info;
2415
2416 if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
2417 return 0;
2418 reg = XEXP (PATTERN (use), 0);
2419 if (!REG_P (reg) || !targetm.calls.function_value_regno_p (REGNO (reg)))
2420 return 0;
2421 regno = REGNO (reg);
2422 nregs = REG_NREGS (reg);
2423 if (nregs == 1)
2424 return 0;
2425 mask = (2U << (nregs - 1)) - 1;
2426
2427 /* Disregard parts of the return value that are set later. */
2428 info.regno = regno;
2429 info.nregs = nregs;
2430 info.mask = mask;
2431 for (p = PREV_INSN (use); info.mask && p != insn; p = PREV_INSN (p))
2432 if (INSN_P (p))
2433 note_stores (p, likely_spilled_retval_1, &info);
2434 mask = info.mask;
2435
2436 /* Check if any of the (probably) live return value registers is
2437 likely spilled. */
2438 nregs --;
2439 do
2440 {
2441 if ((mask & 1 << nregs)
2442 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno + nregs)))
2443 return 1;
2444 } while (nregs--);
2445 return 0;
2446 }
2447
2448 /* Adjust INSN after we made a change to its destination.
2449
2450 Changing the destination can invalidate notes that say something about
2451 the results of the insn and a LOG_LINK pointing to the insn. */
2452
2453 static void
2454 adjust_for_new_dest (rtx_insn *insn)
2455 {
2456 /* For notes, be conservative and simply remove them. */
2457 remove_reg_equal_equiv_notes (insn);
2458
2459 /* The new insn will have a destination that was previously the destination
2460 of an insn just above it. Call distribute_links to make a LOG_LINK from
2461 the next use of that destination. */
2462
2463 rtx set = single_set (insn);
2464 gcc_assert (set);
2465
2466 rtx reg = SET_DEST (set);
2467
2468 while (GET_CODE (reg) == ZERO_EXTRACT
2469 || GET_CODE (reg) == STRICT_LOW_PART
2470 || GET_CODE (reg) == SUBREG)
2471 reg = XEXP (reg, 0);
2472 gcc_assert (REG_P (reg));
2473
2474 distribute_links (alloc_insn_link (insn, REGNO (reg), NULL));
2475
2476 df_insn_rescan (insn);
2477 }
2478
2479 /* Return TRUE if combine can reuse reg X in mode MODE.
2480 ADDED_SETS is nonzero if the original set is still required. */
2481 static bool
2482 can_change_dest_mode (rtx x, int added_sets, machine_mode mode)
2483 {
2484 unsigned int regno;
2485
2486 if (!REG_P (x))
2487 return false;
2488
2489 /* Don't change between modes with different underlying register sizes,
2490 since this could lead to invalid subregs. */
2491 if (maybe_ne (REGMODE_NATURAL_SIZE (mode),
2492 REGMODE_NATURAL_SIZE (GET_MODE (x))))
2493 return false;
2494
2495 regno = REGNO (x);
2496 /* Allow hard registers if the new mode is legal, and occupies no more
2497 registers than the old mode. */
2498 if (regno < FIRST_PSEUDO_REGISTER)
2499 return (targetm.hard_regno_mode_ok (regno, mode)
2500 && REG_NREGS (x) >= hard_regno_nregs (regno, mode));
2501
2502 /* Or a pseudo that is only used once. */
2503 return (regno < reg_n_sets_max
2504 && REG_N_SETS (regno) == 1
2505 && !added_sets
2506 && !REG_USERVAR_P (x));
2507 }
2508
2509
2510 /* Check whether X, the destination of a set, refers to part of
2511 the register specified by REG. */
2512
2513 static bool
2514 reg_subword_p (rtx x, rtx reg)
2515 {
2516 /* Check that reg is an integer mode register. */
2517 if (!REG_P (reg) || GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
2518 return false;
2519
2520 if (GET_CODE (x) == STRICT_LOW_PART
2521 || GET_CODE (x) == ZERO_EXTRACT)
2522 x = XEXP (x, 0);
2523
2524 return GET_CODE (x) == SUBREG
2525 && SUBREG_REG (x) == reg
2526 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT;
2527 }
2528
2529 /* Delete the unconditional jump INSN and adjust the CFG correspondingly.
2530 Note that the INSN should be deleted *after* removing dead edges, so
2531 that the kept edge is the fallthrough edge for a (set (pc) (pc))
2532 but not for a (set (pc) (label_ref FOO)). */
2533
2534 static void
2535 update_cfg_for_uncondjump (rtx_insn *insn)
2536 {
2537 basic_block bb = BLOCK_FOR_INSN (insn);
2538 gcc_assert (BB_END (bb) == insn);
2539
2540 purge_dead_edges (bb);
2541
2542 delete_insn (insn);
2543 if (EDGE_COUNT (bb->succs) == 1)
2544 {
2545 rtx_insn *insn;
2546
2547 single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2548
2549 /* Remove barriers from the footer if there are any. */
2550 for (insn = BB_FOOTER (bb); insn; insn = NEXT_INSN (insn))
2551 if (BARRIER_P (insn))
2552 {
2553 if (PREV_INSN (insn))
2554 SET_NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2555 else
2556 BB_FOOTER (bb) = NEXT_INSN (insn);
2557 if (NEXT_INSN (insn))
2558 SET_PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2559 }
2560 else if (LABEL_P (insn))
2561 break;
2562 }
2563 }
2564
2565 /* Return whether PAT is a PARALLEL of exactly N register SETs followed
2566 by an arbitrary number of CLOBBERs. */
2567 static bool
2568 is_parallel_of_n_reg_sets (rtx pat, int n)
2569 {
2570 if (GET_CODE (pat) != PARALLEL)
2571 return false;
2572
2573 int len = XVECLEN (pat, 0);
2574 if (len < n)
2575 return false;
2576
2577 int i;
2578 for (i = 0; i < n; i++)
2579 if (GET_CODE (XVECEXP (pat, 0, i)) != SET
2580 || !REG_P (SET_DEST (XVECEXP (pat, 0, i))))
2581 return false;
2582 for ( ; i < len; i++)
2583 switch (GET_CODE (XVECEXP (pat, 0, i)))
2584 {
2585 case CLOBBER:
2586 if (XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
2587 return false;
2588 break;
2589 default:
2590 return false;
2591 }
2592 return true;
2593 }
2594
2595 /* Return whether INSN, a PARALLEL of N register SETs (and maybe some
2596 CLOBBERs), can be split into individual SETs in that order, without
2597 changing semantics. */
2598 static bool
2599 can_split_parallel_of_n_reg_sets (rtx_insn *insn, int n)
2600 {
2601 if (!insn_nothrow_p (insn))
2602 return false;
2603
2604 rtx pat = PATTERN (insn);
2605
2606 int i, j;
2607 for (i = 0; i < n; i++)
2608 {
2609 if (side_effects_p (SET_SRC (XVECEXP (pat, 0, i))))
2610 return false;
2611
2612 rtx reg = SET_DEST (XVECEXP (pat, 0, i));
2613
2614 for (j = i + 1; j < n; j++)
2615 if (reg_referenced_p (reg, XVECEXP (pat, 0, j)))
2616 return false;
2617 }
2618
2619 return true;
2620 }
2621
2622 /* Return whether X is just a single set, with the source
2623 a general_operand. */
2624 static bool
2625 is_just_move (rtx x)
2626 {
2627 if (INSN_P (x))
2628 x = PATTERN (x);
2629
2630 return (GET_CODE (x) == SET && general_operand (SET_SRC (x), VOIDmode));
2631 }
2632
2633 /* Callback function to count autoincs. */
2634
2635 static int
2636 count_auto_inc (rtx, rtx, rtx, rtx, rtx, void *arg)
2637 {
2638 (*((int *) arg))++;
2639
2640 return 0;
2641 }
2642
2643 /* Try to combine the insns I0, I1 and I2 into I3.
2644 Here I0, I1 and I2 appear earlier than I3.
2645 I0 and I1 can be zero; then we combine just I2 into I3, or I1 and I2 into
2646 I3.
2647
2648 If we are combining more than two insns and the resulting insn is not
2649 recognized, try splitting it into two insns. If that happens, I2 and I3
2650 are retained and I1/I0 are pseudo-deleted by turning them into a NOTE.
2651 Otherwise, I0, I1 and I2 are pseudo-deleted.
2652
2653 Return 0 if the combination does not work. Then nothing is changed.
2654 If we did the combination, return the insn at which combine should
2655 resume scanning.
2656
2657 Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
2658 new direct jump instruction.
2659
2660 LAST_COMBINED_INSN is either I3, or some insn after I3 that has
2661 been I3 passed to an earlier try_combine within the same basic
2662 block. */
2663
2664 static rtx_insn *
2665 try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
2666 int *new_direct_jump_p, rtx_insn *last_combined_insn)
2667 {
2668 /* New patterns for I3 and I2, respectively. */
2669 rtx newpat, newi2pat = 0;
2670 rtvec newpat_vec_with_clobbers = 0;
2671 int substed_i2 = 0, substed_i1 = 0, substed_i0 = 0;
2672 /* Indicates need to preserve SET in I0, I1 or I2 in I3 if it is not
2673 dead. */
2674 int added_sets_0, added_sets_1, added_sets_2;
2675 /* Total number of SETs to put into I3. */
2676 int total_sets;
2677 /* Nonzero if I2's or I1's body now appears in I3. */
2678 int i2_is_used = 0, i1_is_used = 0;
2679 /* INSN_CODEs for new I3, new I2, and user of condition code. */
2680 int insn_code_number, i2_code_number = 0, other_code_number = 0;
2681 /* Contains I3 if the destination of I3 is used in its source, which means
2682 that the old life of I3 is being killed. If that usage is placed into
2683 I2 and not in I3, a REG_DEAD note must be made. */
2684 rtx i3dest_killed = 0;
2685 /* SET_DEST and SET_SRC of I2, I1 and I0. */
2686 rtx i2dest = 0, i2src = 0, i1dest = 0, i1src = 0, i0dest = 0, i0src = 0;
2687 /* Copy of SET_SRC of I1 and I0, if needed. */
2688 rtx i1src_copy = 0, i0src_copy = 0, i0src_copy2 = 0;
2689 /* Set if I2DEST was reused as a scratch register. */
2690 bool i2scratch = false;
2691 /* The PATTERNs of I0, I1, and I2, or a copy of them in certain cases. */
2692 rtx i0pat = 0, i1pat = 0, i2pat = 0;
2693 /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC. */
2694 int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
2695 int i0dest_in_i0src = 0, i1dest_in_i0src = 0, i2dest_in_i0src = 0;
2696 int i2dest_killed = 0, i1dest_killed = 0, i0dest_killed = 0;
2697 int i1_feeds_i2_n = 0, i0_feeds_i2_n = 0, i0_feeds_i1_n = 0;
2698 /* Notes that must be added to REG_NOTES in I3 and I2. */
2699 rtx new_i3_notes, new_i2_notes;
2700 /* Notes that we substituted I3 into I2 instead of the normal case. */
2701 int i3_subst_into_i2 = 0;
2702 /* Notes that I1, I2 or I3 is a MULT operation. */
2703 int have_mult = 0;
2704 int swap_i2i3 = 0;
2705 int split_i2i3 = 0;
2706 int changed_i3_dest = 0;
2707 bool i2_was_move = false, i3_was_move = false;
2708 int n_auto_inc = 0;
2709
2710 int maxreg;
2711 rtx_insn *temp_insn;
2712 rtx temp_expr;
2713 struct insn_link *link;
2714 rtx other_pat = 0;
2715 rtx new_other_notes;
2716 int i;
2717 scalar_int_mode dest_mode, temp_mode;
2718
2719 /* Immediately return if any of I0,I1,I2 are the same insn (I3 can
2720 never be). */
2721 if (i1 == i2 || i0 == i2 || (i0 && i0 == i1))
2722 return 0;
2723
2724 /* Only try four-insn combinations when there's high likelihood of
2725 success. Look for simple insns, such as loads of constants or
2726 binary operations involving a constant. */
2727 if (i0)
2728 {
2729 int i;
2730 int ngood = 0;
2731 int nshift = 0;
2732 rtx set0, set3;
2733
2734 if (!flag_expensive_optimizations)
2735 return 0;
2736
2737 for (i = 0; i < 4; i++)
2738 {
2739 rtx_insn *insn = i == 0 ? i0 : i == 1 ? i1 : i == 2 ? i2 : i3;
2740 rtx set = single_set (insn);
2741 rtx src;
2742 if (!set)
2743 continue;
2744 src = SET_SRC (set);
2745 if (CONSTANT_P (src))
2746 {
2747 ngood += 2;
2748 break;
2749 }
2750 else if (BINARY_P (src) && CONSTANT_P (XEXP (src, 1)))
2751 ngood++;
2752 else if (GET_CODE (src) == ASHIFT || GET_CODE (src) == ASHIFTRT
2753 || GET_CODE (src) == LSHIFTRT)
2754 nshift++;
2755 }
2756
2757 /* If I0 loads a memory and I3 sets the same memory, then I1 and I2
2758 are likely manipulating its value. Ideally we'll be able to combine
2759 all four insns into a bitfield insertion of some kind.
2760
2761 Note the source in I0 might be inside a sign/zero extension and the
2762 memory modes in I0 and I3 might be different. So extract the address
2763 from the destination of I3 and search for it in the source of I0.
2764
2765 In the event that there's a match but the source/dest do not actually
2766 refer to the same memory, the worst that happens is we try some
2767 combinations that we wouldn't have otherwise. */
2768 if ((set0 = single_set (i0))
2769 /* Ensure the source of SET0 is a MEM, possibly buried inside
2770 an extension. */
2771 && (GET_CODE (SET_SRC (set0)) == MEM
2772 || ((GET_CODE (SET_SRC (set0)) == ZERO_EXTEND
2773 || GET_CODE (SET_SRC (set0)) == SIGN_EXTEND)
2774 && GET_CODE (XEXP (SET_SRC (set0), 0)) == MEM))
2775 && (set3 = single_set (i3))
2776 /* Ensure the destination of SET3 is a MEM. */
2777 && GET_CODE (SET_DEST (set3)) == MEM
2778 /* Would it be better to extract the base address for the MEM
2779 in SET3 and look for that? I don't have cases where it matters
2780 but I could envision such cases. */
2781 && rtx_referenced_p (XEXP (SET_DEST (set3), 0), SET_SRC (set0)))
2782 ngood += 2;
2783
2784 if (ngood < 2 && nshift < 2)
2785 return 0;
2786 }
2787
2788 /* Exit early if one of the insns involved can't be used for
2789 combinations. */
2790 if (CALL_P (i2)
2791 || (i1 && CALL_P (i1))
2792 || (i0 && CALL_P (i0))
2793 || cant_combine_insn_p (i3)
2794 || cant_combine_insn_p (i2)
2795 || (i1 && cant_combine_insn_p (i1))
2796 || (i0 && cant_combine_insn_p (i0))
2797 || likely_spilled_retval_p (i3))
2798 return 0;
2799
2800 combine_attempts++;
2801 undobuf.other_insn = 0;
2802
2803 /* Reset the hard register usage information. */
2804 CLEAR_HARD_REG_SET (newpat_used_regs);
2805
2806 if (dump_file && (dump_flags & TDF_DETAILS))
2807 {
2808 if (i0)
2809 fprintf (dump_file, "\nTrying %d, %d, %d -> %d:\n",
2810 INSN_UID (i0), INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2811 else if (i1)
2812 fprintf (dump_file, "\nTrying %d, %d -> %d:\n",
2813 INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2814 else
2815 fprintf (dump_file, "\nTrying %d -> %d:\n",
2816 INSN_UID (i2), INSN_UID (i3));
2817
2818 if (i0)
2819 dump_insn_slim (dump_file, i0);
2820 if (i1)
2821 dump_insn_slim (dump_file, i1);
2822 dump_insn_slim (dump_file, i2);
2823 dump_insn_slim (dump_file, i3);
2824 }
2825
2826 /* If multiple insns feed into one of I2 or I3, they can be in any
2827 order. To simplify the code below, reorder them in sequence. */
2828 if (i0 && DF_INSN_LUID (i0) > DF_INSN_LUID (i2))
2829 std::swap (i0, i2);
2830 if (i0 && DF_INSN_LUID (i0) > DF_INSN_LUID (i1))
2831 std::swap (i0, i1);
2832 if (i1 && DF_INSN_LUID (i1) > DF_INSN_LUID (i2))
2833 std::swap (i1, i2);
2834
2835 added_links_insn = 0;
2836 added_notes_insn = 0;
2837
2838 /* First check for one important special case that the code below will
2839 not handle. Namely, the case where I1 is zero, I2 is a PARALLEL
2840 and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case,
2841 we may be able to replace that destination with the destination of I3.
2842 This occurs in the common code where we compute both a quotient and
2843 remainder into a structure, in which case we want to do the computation
2844 directly into the structure to avoid register-register copies.
2845
2846 Note that this case handles both multiple sets in I2 and also cases
2847 where I2 has a number of CLOBBERs inside the PARALLEL.
2848
2849 We make very conservative checks below and only try to handle the
2850 most common cases of this. For example, we only handle the case
2851 where I2 and I3 are adjacent to avoid making difficult register
2852 usage tests. */
2853
2854 if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
2855 && REG_P (SET_SRC (PATTERN (i3)))
2856 && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
2857 && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
2858 && GET_CODE (PATTERN (i2)) == PARALLEL
2859 && ! side_effects_p (SET_DEST (PATTERN (i3)))
2860 /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
2861 below would need to check what is inside (and reg_overlap_mentioned_p
2862 doesn't support those codes anyway). Don't allow those destinations;
2863 the resulting insn isn't likely to be recognized anyway. */
2864 && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
2865 && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
2866 && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
2867 SET_DEST (PATTERN (i3)))
2868 && next_active_insn (i2) == i3)
2869 {
2870 rtx p2 = PATTERN (i2);
2871
2872 /* Make sure that the destination of I3,
2873 which we are going to substitute into one output of I2,
2874 is not used within another output of I2. We must avoid making this:
2875 (parallel [(set (mem (reg 69)) ...)
2876 (set (reg 69) ...)])
2877 which is not well-defined as to order of actions.
2878 (Besides, reload can't handle output reloads for this.)
2879
2880 The problem can also happen if the dest of I3 is a memory ref,
2881 if another dest in I2 is an indirect memory ref.
2882
2883 Neither can this PARALLEL be an asm. We do not allow combining
2884 that usually (see can_combine_p), so do not here either. */
2885 bool ok = true;
2886 for (i = 0; ok && i < XVECLEN (p2, 0); i++)
2887 {
2888 if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2889 || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2890 && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
2891 SET_DEST (XVECEXP (p2, 0, i))))
2892 ok = false;
2893 else if (GET_CODE (XVECEXP (p2, 0, i)) == SET
2894 && GET_CODE (SET_SRC (XVECEXP (p2, 0, i))) == ASM_OPERANDS)
2895 ok = false;
2896 }
2897
2898 if (ok)
2899 for (i = 0; i < XVECLEN (p2, 0); i++)
2900 if (GET_CODE (XVECEXP (p2, 0, i)) == SET
2901 && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
2902 {
2903 combine_merges++;
2904
2905 subst_insn = i3;
2906 subst_low_luid = DF_INSN_LUID (i2);
2907
2908 added_sets_2 = added_sets_1 = added_sets_0 = 0;
2909 i2src = SET_SRC (XVECEXP (p2, 0, i));
2910 i2dest = SET_DEST (XVECEXP (p2, 0, i));
2911 i2dest_killed = dead_or_set_p (i2, i2dest);
2912
2913 /* Replace the dest in I2 with our dest and make the resulting
2914 insn the new pattern for I3. Then skip to where we validate
2915 the pattern. Everything was set up above. */
2916 SUBST (SET_DEST (XVECEXP (p2, 0, i)), SET_DEST (PATTERN (i3)));
2917 newpat = p2;
2918 i3_subst_into_i2 = 1;
2919 goto validate_replacement;
2920 }
2921 }
2922
2923 /* If I2 is setting a pseudo to a constant and I3 is setting some
2924 sub-part of it to another constant, merge them by making a new
2925 constant. */
2926 if (i1 == 0
2927 && (temp_expr = single_set (i2)) != 0
2928 && is_a <scalar_int_mode> (GET_MODE (SET_DEST (temp_expr)), &temp_mode)
2929 && CONST_SCALAR_INT_P (SET_SRC (temp_expr))
2930 && GET_CODE (PATTERN (i3)) == SET
2931 && CONST_SCALAR_INT_P (SET_SRC (PATTERN (i3)))
2932 && reg_subword_p (SET_DEST (PATTERN (i3)), SET_DEST (temp_expr)))
2933 {
2934 rtx dest = SET_DEST (PATTERN (i3));
2935 rtx temp_dest = SET_DEST (temp_expr);
2936 int offset = -1;
2937 int width = 0;
2938
2939 if (GET_CODE (dest) == ZERO_EXTRACT)
2940 {
2941 if (CONST_INT_P (XEXP (dest, 1))
2942 && CONST_INT_P (XEXP (dest, 2))
2943 && is_a <scalar_int_mode> (GET_MODE (XEXP (dest, 0)),
2944 &dest_mode))
2945 {
2946 width = INTVAL (XEXP (dest, 1));
2947 offset = INTVAL (XEXP (dest, 2));
2948 dest = XEXP (dest, 0);
2949 if (BITS_BIG_ENDIAN)
2950 offset = GET_MODE_PRECISION (dest_mode) - width - offset;
2951 }
2952 }
2953 else
2954 {
2955 if (GET_CODE (dest) == STRICT_LOW_PART)
2956 dest = XEXP (dest, 0);
2957 if (is_a <scalar_int_mode> (GET_MODE (dest), &dest_mode))
2958 {
2959 width = GET_MODE_PRECISION (dest_mode);
2960 offset = 0;
2961 }
2962 }
2963
2964 if (offset >= 0)
2965 {
2966 /* If this is the low part, we're done. */
2967 if (subreg_lowpart_p (dest))
2968 ;
2969 /* Handle the case where inner is twice the size of outer. */
2970 else if (GET_MODE_PRECISION (temp_mode)
2971 == 2 * GET_MODE_PRECISION (dest_mode))
2972 offset += GET_MODE_PRECISION (dest_mode);
2973 /* Otherwise give up for now. */
2974 else
2975 offset = -1;
2976 }
2977
2978 if (offset >= 0)
2979 {
2980 rtx inner = SET_SRC (PATTERN (i3));
2981 rtx outer = SET_SRC (temp_expr);
2982
2983 wide_int o = wi::insert (rtx_mode_t (outer, temp_mode),
2984 rtx_mode_t (inner, dest_mode),
2985 offset, width);
2986
2987 combine_merges++;
2988 subst_insn = i3;
2989 subst_low_luid = DF_INSN_LUID (i2);
2990 added_sets_2 = added_sets_1 = added_sets_0 = 0;
2991 i2dest = temp_dest;
2992 i2dest_killed = dead_or_set_p (i2, i2dest);
2993
2994 /* Replace the source in I2 with the new constant and make the
2995 resulting insn the new pattern for I3. Then skip to where we
2996 validate the pattern. Everything was set up above. */
2997 SUBST (SET_SRC (temp_expr),
2998 immed_wide_int_const (o, temp_mode));
2999
3000 newpat = PATTERN (i2);
3001
3002 /* The dest of I3 has been replaced with the dest of I2. */
3003 changed_i3_dest = 1;
3004 goto validate_replacement;
3005 }
3006 }
3007
3008 /* If we have no I1 and I2 looks like:
3009 (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
3010 (set Y OP)])
3011 make up a dummy I1 that is
3012 (set Y OP)
3013 and change I2 to be
3014 (set (reg:CC X) (compare:CC Y (const_int 0)))
3015
3016 (We can ignore any trailing CLOBBERs.)
3017
3018 This undoes a previous combination and allows us to match a branch-and-
3019 decrement insn. */
3020
3021 if (!HAVE_cc0 && i1 == 0
3022 && is_parallel_of_n_reg_sets (PATTERN (i2), 2)
3023 && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
3024 == MODE_CC)
3025 && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
3026 && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
3027 && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
3028 SET_SRC (XVECEXP (PATTERN (i2), 0, 1)))
3029 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)), i2, i3)
3030 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)), i2, i3))
3031 {
3032 /* We make I1 with the same INSN_UID as I2. This gives it
3033 the same DF_INSN_LUID for value tracking. Our fake I1 will
3034 never appear in the insn stream so giving it the same INSN_UID
3035 as I2 will not cause a problem. */
3036
3037 i1 = gen_rtx_INSN (VOIDmode, NULL, i2, BLOCK_FOR_INSN (i2),
3038 XVECEXP (PATTERN (i2), 0, 1), INSN_LOCATION (i2),
3039 -1, NULL_RTX);
3040 INSN_UID (i1) = INSN_UID (i2);
3041
3042 SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
3043 SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
3044 SET_DEST (PATTERN (i1)));
3045 unsigned int regno = REGNO (SET_DEST (PATTERN (i1)));
3046 SUBST_LINK (LOG_LINKS (i2),
3047 alloc_insn_link (i1, regno, LOG_LINKS (i2)));
3048 }
3049
3050 /* If I2 is a PARALLEL of two SETs of REGs (and perhaps some CLOBBERs),
3051 make those two SETs separate I1 and I2 insns, and make an I0 that is
3052 the original I1. */
3053 if (!HAVE_cc0 && i0 == 0
3054 && is_parallel_of_n_reg_sets (PATTERN (i2), 2)
3055 && can_split_parallel_of_n_reg_sets (i2, 2)
3056 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)), i2, i3)
3057 && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)), i2, i3)
3058 && !reg_set_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)), i2, i3)
3059 && !reg_set_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)), i2, i3))
3060 {
3061 /* If there is no I1, there is no I0 either. */
3062 i0 = i1;
3063
3064 /* We make I1 with the same INSN_UID as I2. This gives it
3065 the same DF_INSN_LUID for value tracking. Our fake I1 will
3066 never appear in the insn stream so giving it the same INSN_UID
3067 as I2 will not cause a problem. */
3068
3069 i1 = gen_rtx_INSN (VOIDmode, NULL, i2, BLOCK_FOR_INSN (i2),
3070 XVECEXP (PATTERN (i2), 0, 0), INSN_LOCATION (i2),
3071 -1, NULL_RTX);
3072 INSN_UID (i1) = INSN_UID (i2);
3073
3074 SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 1));
3075 }
3076
3077 /* Verify that I2 and maybe I1 and I0 can be combined into I3. */
3078 if (!can_combine_p (i2, i3, i0, i1, NULL, NULL, &i2dest, &i2src))
3079 {
3080 if (dump_file && (dump_flags & TDF_DETAILS))
3081 fprintf (dump_file, "Can't combine i2 into i3\n");
3082 undo_all ();
3083 return 0;
3084 }
3085 if (i1 && !can_combine_p (i1, i3, i0, NULL, i2, NULL, &i1dest, &i1src))
3086 {
3087 if (dump_file && (dump_flags & TDF_DETAILS))
3088 fprintf (dump_file, "Can't combine i1 into i3\n");
3089 undo_all ();
3090 return 0;
3091 }
3092 if (i0 && !can_combine_p (i0, i3, NULL, NULL, i1, i2, &i0dest, &i0src))
3093 {
3094 if (dump_file && (dump_flags & TDF_DETAILS))
3095 fprintf (dump_file, "Can't combine i0 into i3\n");
3096 undo_all ();
3097 return 0;
3098 }
3099
3100 /* Record whether i2 and i3 are trivial moves. */
3101 i2_was_move = is_just_move (i2);
3102 i3_was_move = is_just_move (i3);
3103
3104 /* Record whether I2DEST is used in I2SRC and similarly for the other
3105 cases. Knowing this will help in register status updating below. */
3106 i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
3107 i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
3108 i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
3109 i0dest_in_i0src = i0 && reg_overlap_mentioned_p (i0dest, i0src);
3110 i1dest_in_i0src = i0 && reg_overlap_mentioned_p (i1dest, i0src);
3111 i2dest_in_i0src = i0 && reg_overlap_mentioned_p (i2dest, i0src);
3112 i2dest_killed = dead_or_set_p (i2, i2dest);
3113 i1dest_killed = i1 && dead_or_set_p (i1, i1dest);
3114 i0dest_killed = i0 && dead_or_set_p (i0, i0dest);
3115
3116 /* For the earlier insns, determine which of the subsequent ones they
3117 feed. */
3118 i1_feeds_i2_n = i1 && insn_a_feeds_b (i1, i2);
3119 i0_feeds_i1_n = i0 && insn_a_feeds_b (i0, i1);
3120 i0_feeds_i2_n = (i0 && (!i0_feeds_i1_n ? insn_a_feeds_b (i0, i2)
3121 : (!reg_overlap_mentioned_p (i1dest, i0dest)
3122 && reg_overlap_mentioned_p (i0dest, i2src))));
3123
3124 /* Ensure that I3's pattern can be the destination of combines. */
3125 if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest, i0dest,
3126 i1 && i2dest_in_i1src && !i1_feeds_i2_n,
3127 i0 && ((i2dest_in_i0src && !i0_feeds_i2_n)
3128 || (i1dest_in_i0src && !i0_feeds_i1_n)),
3129 &i3dest_killed))
3130 {
3131 undo_all ();
3132 return 0;
3133 }
3134
3135 /* See if any of the insns is a MULT operation. Unless one is, we will
3136 reject a combination that is, since it must be slower. Be conservative
3137 here. */
3138 if (GET_CODE (i2src) == MULT
3139 || (i1 != 0 && GET_CODE (i1src) == MULT)
3140 || (i0 != 0 && GET_CODE (i0src) == MULT)
3141 || (GET_CODE (PATTERN (i3)) == SET
3142 && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
3143 have_mult = 1;
3144
3145 /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
3146 We used to do this EXCEPT in one case: I3 has a post-inc in an
3147 output operand. However, that exception can give rise to insns like
3148 mov r3,(r3)+
3149 which is a famous insn on the PDP-11 where the value of r3 used as the
3150 source was model-dependent. Avoid this sort of thing. */
3151
3152 #if 0
3153 if (!(GET_CODE (PATTERN (i3)) == SET
3154 && REG_P (SET_SRC (PATTERN (i3)))
3155 && MEM_P (SET_DEST (PATTERN (i3)))
3156 && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
3157 || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
3158 /* It's not the exception. */
3159 #endif
3160 if (AUTO_INC_DEC)
3161 {
3162 rtx link;
3163 for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
3164 if (REG_NOTE_KIND (link) == REG_INC
3165 && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
3166 || (i1 != 0
3167 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
3168 {
3169 undo_all ();
3170 return 0;
3171 }
3172 }
3173
3174 /* See if the SETs in I1 or I2 need to be kept around in the merged
3175 instruction: whenever the value set there is still needed past I3.
3176 For the SET in I2, this is easy: we see if I2DEST dies or is set in I3.
3177
3178 For the SET in I1, we have two cases: if I1 and I2 independently feed
3179 into I3, the set in I1 needs to be kept around unless I1DEST dies
3180 or is set in I3. Otherwise (if I1 feeds I2 which feeds I3), the set
3181 in I1 needs to be kept around unless I1DEST dies or is set in either
3182 I2 or I3. The same considerations apply to I0. */
3183
3184 added_sets_2 = !dead_or_set_p (i3, i2dest);
3185
3186 if (i1)
3187 added_sets_1 = !(dead_or_set_p (i3, i1dest)
3188 || (i1_feeds_i2_n && dead_or_set_p (i2, i1dest)));
3189 else
3190 added_sets_1 = 0;
3191
3192 if (i0)
3193 added_sets_0 = !(dead_or_set_p (i3, i0dest)
3194 || (i0_feeds_i1_n && dead_or_set_p (i1, i0dest))
3195 || ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n))
3196 && dead_or_set_p (i2, i0dest)));
3197 else
3198 added_sets_0 = 0;
3199
3200 /* We are about to copy insns for the case where they need to be kept
3201 around. Check that they can be copied in the merged instruction. */
3202
3203 if (targetm.cannot_copy_insn_p
3204 && ((added_sets_2 && targetm.cannot_copy_insn_p (i2))
3205 || (i1 && added_sets_1 && targetm.cannot_copy_insn_p (i1))
3206 || (i0 && added_sets_0 && targetm.cannot_copy_insn_p (i0))))
3207 {
3208 undo_all ();
3209 return 0;
3210 }
3211
3212 /* Count how many auto_inc expressions there were in the original insns;
3213 we need to have the same number in the resulting patterns. */
3214
3215 if (i0)
3216 for_each_inc_dec (PATTERN (i0), count_auto_inc, &n_auto_inc);
3217 if (i1)
3218 for_each_inc_dec (PATTERN (i1), count_auto_inc, &n_auto_inc);
3219 for_each_inc_dec (PATTERN (i2), count_auto_inc, &n_auto_inc);
3220 for_each_inc_dec (PATTERN (i3), count_auto_inc, &n_auto_inc);
3221
3222 /* If the set in I2 needs to be kept around, we must make a copy of
3223 PATTERN (I2), so that when we substitute I1SRC for I1DEST in
3224 PATTERN (I2), we are only substituting for the original I1DEST, not into
3225 an already-substituted copy. This also prevents making self-referential
3226 rtx. If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
3227 I2DEST. */
3228
3229 if (added_sets_2)
3230 {
3231 if (GET_CODE (PATTERN (i2)) == PARALLEL)
3232 i2pat = gen_rtx_SET (i2dest, copy_rtx (i2src));
3233 else
3234 i2pat = copy_rtx (PATTERN (i2));
3235 }
3236
3237 if (added_sets_1)
3238 {
3239 if (GET_CODE (PATTERN (i1)) == PARALLEL)
3240 i1pat = gen_rtx_SET (i1dest, copy_rtx (i1src));
3241 else
3242 i1pat = copy_rtx (PATTERN (i1));
3243 }
3244
3245 if (added_sets_0)
3246 {
3247 if (GET_CODE (PATTERN (i0)) == PARALLEL)
3248 i0pat = gen_rtx_SET (i0dest, copy_rtx (i0src));
3249 else
3250 i0pat = copy_rtx (PATTERN (i0));
3251 }
3252
3253 combine_merges++;
3254
3255 /* Substitute in the latest insn for the regs set by the earlier ones. */
3256
3257 maxreg = max_reg_num ();
3258
3259 subst_insn = i3;
3260
3261 /* Many machines that don't use CC0 have insns that can both perform an
3262 arithmetic operation and set the condition code. These operations will
3263 be represented as a PARALLEL with the first element of the vector
3264 being a COMPARE of an arithmetic operation with the constant zero.
3265 The second element of the vector will set some pseudo to the result
3266 of the same arithmetic operation. If we simplify the COMPARE, we won't
3267 match such a pattern and so will generate an extra insn. Here we test
3268 for this case, where both the comparison and the operation result are
3269 needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
3270 I2SRC. Later we will make the PARALLEL that contains I2. */
3271
3272 if (!HAVE_cc0 && i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
3273 && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
3274 && CONST_INT_P (XEXP (SET_SRC (PATTERN (i3)), 1))
3275 && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
3276 {
3277 rtx newpat_dest;
3278 rtx *cc_use_loc = NULL;
3279 rtx_insn *cc_use_insn = NULL;
3280 rtx op0 = i2src, op1 = XEXP (SET_SRC (PATTERN (i3)), 1);
3281 machine_mode compare_mode, orig_compare_mode;
3282 enum rtx_code compare_code = UNKNOWN, orig_compare_code = UNKNOWN;
3283 scalar_int_mode mode;
3284
3285 newpat = PATTERN (i3);
3286 newpat_dest = SET_DEST (newpat);
3287 compare_mode = orig_compare_mode = GET_MODE (newpat_dest);
3288
3289 if (undobuf.other_insn == 0
3290 && (cc_use_loc = find_single_use (SET_DEST (newpat), i3,
3291 &cc_use_insn)))
3292 {
3293 compare_code = orig_compare_code = GET_CODE (*cc_use_loc);
3294 if (is_a <scalar_int_mode> (GET_MODE (i2dest), &mode))
3295 compare_code = simplify_compare_const (compare_code, mode,
3296 op0, &op1);
3297 target_canonicalize_comparison (&compare_code, &op0, &op1, 1);
3298 }
3299
3300 /* Do the rest only if op1 is const0_rtx, which may be the
3301 result of simplification. */
3302 if (op1 == const0_rtx)
3303 {
3304 /* If a single use of the CC is found, prepare to modify it
3305 when SELECT_CC_MODE returns a new CC-class mode, or when
3306 the above simplify_compare_const() returned a new comparison
3307 operator. undobuf.other_insn is assigned the CC use insn
3308 when modifying it. */
3309 if (cc_use_loc)
3310 {
3311 #ifdef SELECT_CC_MODE
3312 machine_mode new_mode
3313 = SELECT_CC_MODE (compare_code, op0, op1);
3314 if (new_mode != orig_compare_mode
3315 && can_change_dest_mode (SET_DEST (newpat),
3316 added_sets_2, new_mode))
3317 {
3318 unsigned int regno = REGNO (newpat_dest);
3319 compare_mode = new_mode;
3320 if (regno < FIRST_PSEUDO_REGISTER)
3321 newpat_dest = gen_rtx_REG (compare_mode, regno);
3322 else
3323 {
3324 SUBST_MODE (regno_reg_rtx[regno], compare_mode);
3325 newpat_dest = regno_reg_rtx[regno];
3326 }
3327 }
3328 #endif
3329 /* Cases for modifying the CC-using comparison. */
3330 if (compare_code != orig_compare_code
3331 /* ??? Do we need to verify the zero rtx? */
3332 && XEXP (*cc_use_loc, 1) == const0_rtx)
3333 {
3334 /* Replace cc_use_loc with entire new RTX. */
3335 SUBST (*cc_use_loc,
3336 gen_rtx_fmt_ee (compare_code, GET_MODE (*cc_use_loc),
3337 newpat_dest, const0_rtx));
3338 undobuf.other_insn = cc_use_insn;
3339 }
3340 else if (compare_mode != orig_compare_mode)
3341 {
3342 /* Just replace the CC reg with a new mode. */
3343 SUBST (XEXP (*cc_use_loc, 0), newpat_dest);
3344 undobuf.other_insn = cc_use_insn;
3345 }
3346 }
3347
3348 /* Now we modify the current newpat:
3349 First, SET_DEST(newpat) is updated if the CC mode has been
3350 altered. For targets without SELECT_CC_MODE, this should be
3351 optimized away. */
3352 if (compare_mode != orig_compare_mode)
3353 SUBST (SET_DEST (newpat), newpat_dest);
3354 /* This is always done to propagate i2src into newpat. */
3355 SUBST (SET_SRC (newpat),
3356 gen_rtx_COMPARE (compare_mode, op0, op1));
3357 /* Create new version of i2pat if needed; the below PARALLEL
3358 creation needs this to work correctly. */
3359 if (! rtx_equal_p (i2src, op0))
3360 i2pat = gen_rtx_SET (i2dest, op0);
3361 i2_is_used = 1;
3362 }
3363 }
3364
3365 if (i2_is_used == 0)
3366 {
3367 /* It is possible that the source of I2 or I1 may be performing
3368 an unneeded operation, such as a ZERO_EXTEND of something
3369 that is known to have the high part zero. Handle that case
3370 by letting subst look at the inner insns.
3371
3372 Another way to do this would be to have a function that tries
3373 to simplify a single insn instead of merging two or more
3374 insns. We don't do this because of the potential of infinite
3375 loops and because of the potential extra memory required.
3376 However, doing it the way we are is a bit of a kludge and
3377 doesn't catch all cases.
3378
3379 But only do this if -fexpensive-optimizations since it slows
3380 things down and doesn't usually win.
3381
3382 This is not done in the COMPARE case above because the
3383 unmodified I2PAT is used in the PARALLEL and so a pattern
3384 with a modified I2SRC would not match. */
3385
3386 if (flag_expensive_optimizations)
3387 {
3388 /* Pass pc_rtx so no substitutions are done, just
3389 simplifications. */
3390 if (i1)
3391 {
3392 subst_low_luid = DF_INSN_LUID (i1);
3393 i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0, 0);
3394 }
3395
3396 subst_low_luid = DF_INSN_LUID (i2);
3397 i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0, 0);
3398 }
3399
3400 n_occurrences = 0; /* `subst' counts here */
3401 subst_low_luid = DF_INSN_LUID (i2);
3402
3403 /* If I1 feeds into I2 and I1DEST is in I1SRC, we need to make a unique
3404 copy of I2SRC each time we substitute it, in order to avoid creating
3405 self-referential RTL when we will be substituting I1SRC for I1DEST
3406 later. Likewise if I0 feeds into I2, either directly or indirectly
3407 through I1, and I0DEST is in I0SRC. */
3408 newpat = subst (PATTERN (i3), i2dest, i2src, 0, 0,
3409 (i1_feeds_i2_n && i1dest_in_i1src)
3410 || ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n))
3411 && i0dest_in_i0src));
3412 substed_i2 = 1;
3413
3414 /* Record whether I2's body now appears within I3's body. */
3415 i2_is_used = n_occurrences;
3416 }
3417
3418 /* If we already got a failure, don't try to do more. Otherwise, try to
3419 substitute I1 if we have it. */
3420
3421 if (i1 && GET_CODE (newpat) != CLOBBER)
3422 {
3423 /* Before we can do this substitution, we must redo the test done
3424 above (see detailed comments there) that ensures I1DEST isn't
3425 mentioned in any SETs in NEWPAT that are field assignments. */
3426 if (!combinable_i3pat (NULL, &newpat, i1dest, NULL_RTX, NULL_RTX,
3427 0, 0, 0))
3428 {
3429 undo_all ();
3430 return 0;
3431 }
3432
3433 n_occurrences = 0;
3434 subst_low_luid = DF_INSN_LUID (i1);
3435
3436 /* If the following substitution will modify I1SRC, make a copy of it
3437 for the case where it is substituted for I1DEST in I2PAT later. */
3438 if (added_sets_2 && i1_feeds_i2_n)
3439 i1src_copy = copy_rtx (i1src);
3440
3441 /* If I0 feeds into I1 and I0DEST is in I0SRC, we need to make a unique
3442 copy of I1SRC each time we substitute it, in order to avoid creating
3443 self-referential RTL when we will be substituting I0SRC for I0DEST
3444 later. */
3445 newpat = subst (newpat, i1dest, i1src, 0, 0,
3446 i0_feeds_i1_n && i0dest_in_i0src);
3447 substed_i1 = 1;
3448
3449 /* Record whether I1's body now appears within I3's body. */
3450 i1_is_used = n_occurrences;
3451 }
3452
3453 /* Likewise for I0 if we have it. */
3454
3455 if (i0 && GET_CODE (newpat) != CLOBBER)
3456 {
3457 if (!combinable_i3pat (NULL, &newpat, i0dest, NULL_RTX, NULL_RTX,
3458 0, 0, 0))
3459 {
3460 undo_all ();
3461 return 0;
3462 }
3463
3464 /* If the following substitution will modify I0SRC, make a copy of it
3465 for the case where it is substituted for I0DEST in I1PAT later. */
3466 if (added_sets_1 && i0_feeds_i1_n)
3467 i0src_copy = copy_rtx (i0src);
3468 /* And a copy for I0DEST in I2PAT substitution. */
3469 if (added_sets_2 && ((i0_feeds_i1_n && i1_feeds_i2_n)
3470 || (i0_feeds_i2_n)))
3471 i0src_copy2 = copy_rtx (i0src);
3472
3473 n_occurrences = 0;
3474 subst_low_luid = DF_INSN_LUID (i0);
3475 newpat = subst (newpat, i0dest, i0src, 0, 0, 0);
3476 substed_i0 = 1;
3477 }
3478
3479 if (n_auto_inc)
3480 {
3481 int new_n_auto_inc = 0;
3482 for_each_inc_dec (newpat, count_auto_inc, &new_n_auto_inc);
3483
3484 if (n_auto_inc != new_n_auto_inc)
3485 {
3486 if (dump_file && (dump_flags & TDF_DETAILS))
3487 fprintf (dump_file, "Number of auto_inc expressions changed\n");
3488 undo_all ();
3489 return 0;
3490 }
3491 }
3492
3493 /* Fail if an autoincrement side-effect has been duplicated. Be careful
3494 to count all the ways that I2SRC and I1SRC can be used. */
3495 if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
3496 && i2_is_used + added_sets_2 > 1)
3497 || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
3498 && (i1_is_used + added_sets_1 + (added_sets_2 && i1_feeds_i2_n)
3499 > 1))
3500 || (i0 != 0 && FIND_REG_INC_NOTE (i0, NULL_RTX) != 0
3501 && (n_occurrences + added_sets_0
3502 + (added_sets_1 && i0_feeds_i1_n)
3503 + (added_sets_2 && i0_feeds_i2_n)
3504 > 1))
3505 /* Fail if we tried to make a new register. */
3506 || max_reg_num () != maxreg
3507 /* Fail if we couldn't do something and have a CLOBBER. */
3508 || GET_CODE (newpat) == CLOBBER
3509 /* Fail if this new pattern is a MULT and we didn't have one before
3510 at the outer level. */
3511 || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
3512 && ! have_mult))
3513 {
3514 undo_all ();
3515 return 0;
3516 }
3517
3518 /* If the actions of the earlier insns must be kept
3519 in addition to substituting them into the latest one,
3520 we must make a new PARALLEL for the latest insn
3521 to hold additional the SETs. */
3522
3523 if (added_sets_0 || added_sets_1 || added_sets_2)
3524 {
3525 int extra_sets = added_sets_0 + added_sets_1 + added_sets_2;
3526 combine_extras++;
3527
3528 if (GET_CODE (newpat) == PARALLEL)
3529 {
3530 rtvec old = XVEC (newpat, 0);
3531 total_sets = XVECLEN (newpat, 0) + extra_sets;
3532 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3533 memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
3534 sizeof (old->elem[0]) * old->num_elem);
3535 }
3536 else
3537 {
3538 rtx old = newpat;
3539 total_sets = 1 + extra_sets;
3540 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3541 XVECEXP (newpat, 0, 0) = old;
3542 }
3543
3544 if (added_sets_0)
3545 XVECEXP (newpat, 0, --total_sets) = i0pat;
3546
3547 if (added_sets_1)
3548 {
3549 rtx t = i1pat;
3550 if (i0_feeds_i1_n)
3551 t = subst (t, i0dest, i0src_copy ? i0src_copy : i0src, 0, 0, 0);
3552
3553 XVECEXP (newpat, 0, --total_sets) = t;
3554 }
3555 if (added_sets_2)
3556 {
3557 rtx t = i2pat;
3558 if (i1_feeds_i2_n)
3559 t = subst (t, i1dest, i1src_copy ? i1src_copy : i1src, 0, 0,
3560 i0_feeds_i1_n && i0dest_in_i0src);
3561 if ((i0_feeds_i1_n && i1_feeds_i2_n) || i0_feeds_i2_n)
3562 t = subst (t, i0dest, i0src_copy2 ? i0src_copy2 : i0src, 0, 0, 0);
3563
3564 XVECEXP (newpat, 0, --total_sets) = t;
3565 }
3566 }
3567
3568 validate_replacement:
3569
3570 /* Note which hard regs this insn has as inputs. */
3571 mark_used_regs_combine (newpat);
3572
3573 /* If recog_for_combine fails, it strips existing clobbers. If we'll
3574 consider splitting this pattern, we might need these clobbers. */
3575 if (i1 && GET_CODE (newpat) == PARALLEL
3576 && GET_CODE (XVECEXP (newpat, 0, XVECLEN (newpat, 0) - 1)) == CLOBBER)
3577 {
3578 int len = XVECLEN (newpat, 0);
3579
3580 newpat_vec_with_clobbers = rtvec_alloc (len);
3581 for (i = 0; i < len; i++)
3582 RTVEC_ELT (newpat_vec_with_clobbers, i) = XVECEXP (newpat, 0, i);
3583 }
3584
3585 /* We have recognized nothing yet. */
3586 insn_code_number = -1;
3587
3588 /* See if this is a PARALLEL of two SETs where one SET's destination is
3589 a register that is unused and this isn't marked as an instruction that
3590 might trap in an EH region. In that case, we just need the other SET.
3591 We prefer this over the PARALLEL.
3592
3593 This can occur when simplifying a divmod insn. We *must* test for this
3594 case here because the code below that splits two independent SETs doesn't
3595 handle this case correctly when it updates the register status.
3596
3597 It's pointless doing this if we originally had two sets, one from
3598 i3, and one from i2. Combining then splitting the parallel results
3599 in the original i2 again plus an invalid insn (which we delete).
3600 The net effect is only to move instructions around, which makes
3601 debug info less accurate.
3602
3603 If the remaining SET came from I2 its destination should not be used
3604 between I2 and I3. See PR82024. */
3605
3606 if (!(added_sets_2 && i1 == 0)
3607 && is_parallel_of_n_reg_sets (newpat, 2)
3608 && asm_noperands (newpat) < 0)
3609 {
3610 rtx set0 = XVECEXP (newpat, 0, 0);
3611 rtx set1 = XVECEXP (newpat, 0, 1);
3612 rtx oldpat = newpat;
3613
3614 if (((REG_P (SET_DEST (set1))
3615 && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
3616 || (GET_CODE (SET_DEST (set1)) == SUBREG
3617 && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
3618 && insn_nothrow_p (i3)
3619 && !side_effects_p (SET_SRC (set1)))
3620 {
3621 newpat = set0;
3622 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3623 }
3624
3625 else if (((REG_P (SET_DEST (set0))
3626 && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
3627 || (GET_CODE (SET_DEST (set0)) == SUBREG
3628 && find_reg_note (i3, REG_UNUSED,
3629 SUBREG_REG (SET_DEST (set0)))))
3630 && insn_nothrow_p (i3)
3631 && !side_effects_p (SET_SRC (set0)))
3632 {
3633 rtx dest = SET_DEST (set1);
3634 if (GET_CODE (dest) == SUBREG)
3635 dest = SUBREG_REG (dest);
3636 if (!reg_used_between_p (dest, i2, i3))
3637 {
3638 newpat = set1;
3639 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3640
3641 if (insn_code_number >= 0)
3642 changed_i3_dest = 1;
3643 }
3644 }
3645
3646 if (insn_code_number < 0)
3647 newpat = oldpat;
3648 }
3649
3650 /* Is the result of combination a valid instruction? */
3651 if (insn_code_number < 0)
3652 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3653
3654 /* If we were combining three insns and the result is a simple SET
3655 with no ASM_OPERANDS that wasn't recognized, try to split it into two
3656 insns. There are two ways to do this. It can be split using a
3657 machine-specific method (like when you have an addition of a large
3658 constant) or by combine in the function find_split_point. */
3659
3660 if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
3661 && asm_noperands (newpat) < 0)
3662 {
3663 rtx parallel, *split;
3664 rtx_insn *m_split_insn;
3665
3666 /* See if the MD file can split NEWPAT. If it can't, see if letting it
3667 use I2DEST as a scratch register will help. In the latter case,
3668 convert I2DEST to the mode of the source of NEWPAT if we can. */
3669
3670 m_split_insn = combine_split_insns (newpat, i3);
3671
3672 /* We can only use I2DEST as a scratch reg if it doesn't overlap any
3673 inputs of NEWPAT. */
3674
3675 /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
3676 possible to try that as a scratch reg. This would require adding
3677 more code to make it work though. */
3678
3679 if (m_split_insn == 0 && ! reg_overlap_mentioned_p (i2dest, newpat))
3680 {
3681 machine_mode new_mode = GET_MODE (SET_DEST (newpat));
3682
3683 /* ??? Reusing i2dest without resetting the reg_stat entry for it
3684 (temporarily, until we are committed to this instruction
3685 combination) does not work: for example, any call to nonzero_bits
3686 on the register (from a splitter in the MD file, for example)
3687 will get the old information, which is invalid.
3688
3689 Since nowadays we can create registers during combine just fine,
3690 we should just create a new one here, not reuse i2dest. */
3691
3692 /* First try to split using the original register as a
3693 scratch register. */
3694 parallel = gen_rtx_PARALLEL (VOIDmode,
3695 gen_rtvec (2, newpat,
3696 gen_rtx_CLOBBER (VOIDmode,
3697 i2dest)));
3698 m_split_insn = combine_split_insns (parallel, i3);
3699
3700 /* If that didn't work, try changing the mode of I2DEST if
3701 we can. */
3702 if (m_split_insn == 0
3703 && new_mode != GET_MODE (i2dest)
3704 && new_mode != VOIDmode
3705 && can_change_dest_mode (i2dest, added_sets_2, new_mode))
3706 {
3707 machine_mode old_mode = GET_MODE (i2dest);
3708 rtx ni2dest;
3709
3710 if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3711 ni2dest = gen_rtx_REG (new_mode, REGNO (i2dest));
3712 else
3713 {
3714 SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], new_mode);
3715 ni2dest = regno_reg_rtx[REGNO (i2dest)];
3716 }
3717
3718 parallel = (gen_rtx_PARALLEL
3719 (VOIDmode,
3720 gen_rtvec (2, newpat,
3721 gen_rtx_CLOBBER (VOIDmode,
3722 ni2dest))));
3723 m_split_insn = combine_split_insns (parallel, i3);
3724
3725 if (m_split_insn == 0
3726 && REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
3727 {
3728 struct undo *buf;
3729
3730 adjust_reg_mode (regno_reg_rtx[REGNO (i2dest)], old_mode);
3731 buf = undobuf.undos;
3732 undobuf.undos = buf->next;
3733 buf->next = undobuf.frees;
3734 undobuf.frees = buf;
3735 }
3736 }
3737
3738 i2scratch = m_split_insn != 0;
3739 }
3740
3741 /* If recog_for_combine has discarded clobbers, try to use them
3742 again for the split. */
3743 if (m_split_insn == 0 && newpat_vec_with_clobbers)
3744 {
3745 parallel = gen_rtx_PARALLEL (VOIDmode, newpat_vec_with_clobbers);
3746 m_split_insn = combine_split_insns (parallel, i3);
3747 }
3748
3749 if (m_split_insn && NEXT_INSN (m_split_insn) == NULL_RTX)
3750 {
3751 rtx m_split_pat = PATTERN (m_split_insn);
3752 insn_code_number = recog_for_combine (&m_split_pat, i3, &new_i3_notes);
3753 if (insn_code_number >= 0)
3754 newpat = m_split_pat;
3755 }
3756 else if (m_split_insn && NEXT_INSN (NEXT_INSN (m_split_insn)) == NULL_RTX
3757 && (next_nonnote_nondebug_insn (i2) == i3
3758 || !modified_between_p (PATTERN (m_split_insn), i2, i3)))
3759 {
3760 rtx i2set, i3set;
3761 rtx newi3pat = PATTERN (NEXT_INSN (m_split_insn));
3762 newi2pat = PATTERN (m_split_insn);
3763
3764 i3set = single_set (NEXT_INSN (m_split_insn));
3765 i2set = single_set (m_split_insn);
3766
3767 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3768
3769 /* If I2 or I3 has multiple SETs, we won't know how to track
3770 register status, so don't use these insns. If I2's destination
3771 is used between I2 and I3, we also can't use these insns. */
3772
3773 if (i2_code_number >= 0 && i2set && i3set
3774 && (next_nonnote_nondebug_insn (i2) == i3
3775 || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
3776 insn_code_number = recog_for_combine (&newi3pat, i3,
3777 &new_i3_notes);
3778 if (insn_code_number >= 0)
3779 newpat = newi3pat;
3780
3781 /* It is possible that both insns now set the destination of I3.
3782 If so, we must show an extra use of it. */
3783
3784 if (insn_code_number >= 0)
3785 {
3786 rtx new_i3_dest = SET_DEST (i3set);
3787 rtx new_i2_dest = SET_DEST (i2set);
3788
3789 while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
3790 || GET_CODE (new_i3_dest) == STRICT_LOW_PART
3791 || GET_CODE (new_i3_dest) == SUBREG)
3792 new_i3_dest = XEXP (new_i3_dest, 0);
3793
3794 while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
3795 || GET_CODE (new_i2_dest) == STRICT_LOW_PART
3796 || GET_CODE (new_i2_dest) == SUBREG)
3797 new_i2_dest = XEXP (new_i2_dest, 0);
3798
3799 if (REG_P (new_i3_dest)
3800 && REG_P (new_i2_dest)
3801 && REGNO (new_i3_dest) == REGNO (new_i2_dest)
3802 && REGNO (new_i2_dest) < reg_n_sets_max)
3803 INC_REG_N_SETS (REGNO (new_i2_dest), 1);
3804 }
3805 }
3806
3807 /* If we can split it and use I2DEST, go ahead and see if that
3808 helps things be recognized. Verify that none of the registers
3809 are set between I2 and I3. */
3810 if (insn_code_number < 0
3811 && (split = find_split_point (&newpat, i3, false)) != 0
3812 && (!HAVE_cc0 || REG_P (i2dest))
3813 /* We need I2DEST in the proper mode. If it is a hard register
3814 or the only use of a pseudo, we can change its mode.
3815 Make sure we don't change a hard register to have a mode that
3816 isn't valid for it, or change the number of registers. */
3817 && (GET_MODE (*split) == GET_MODE (i2dest)
3818 || GET_MODE (*split) == VOIDmode
3819 || can_change_dest_mode (i2dest, added_sets_2,
3820 GET_MODE (*split)))
3821 && (next_nonnote_nondebug_insn (i2) == i3
3822 || !modified_between_p (*split, i2, i3))
3823 /* We can't overwrite I2DEST if its value is still used by
3824 NEWPAT. */
3825 && ! reg_referenced_p (i2dest, newpat))
3826 {
3827 rtx newdest = i2dest;
3828 enum rtx_code split_code = GET_CODE (*split);
3829 machine_mode split_mode = GET_MODE (*split);
3830 bool subst_done = false;
3831 newi2pat = NULL_RTX;
3832
3833 i2scratch = true;
3834
3835 /* *SPLIT may be part of I2SRC, so make sure we have the
3836 original expression around for later debug processing.
3837 We should not need I2SRC any more in other cases. */
3838 if (MAY_HAVE_DEBUG_BIND_INSNS)
3839 i2src = copy_rtx (i2src);
3840 else
3841 i2src = NULL;
3842
3843 /* Get NEWDEST as a register in the proper mode. We have already
3844 validated that we can do this. */
3845 if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
3846 {
3847 if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3848 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
3849 else
3850 {
3851 SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], split_mode);
3852 newdest = regno_reg_rtx[REGNO (i2dest)];
3853 }
3854 }
3855
3856 /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
3857 an ASHIFT. This can occur if it was inside a PLUS and hence
3858 appeared to be a memory address. This is a kludge. */
3859 if (split_code == MULT
3860 && CONST_INT_P (XEXP (*split, 1))
3861 && INTVAL (XEXP (*split, 1)) > 0
3862 && (i = exact_log2 (UINTVAL (XEXP (*split, 1)))) >= 0)
3863 {
3864 rtx i_rtx = gen_int_shift_amount (split_mode, i);
3865 SUBST (*split, gen_rtx_ASHIFT (split_mode,
3866 XEXP (*split, 0), i_rtx));
3867 /* Update split_code because we may not have a multiply
3868 anymore. */
3869 split_code = GET_CODE (*split);
3870 }
3871
3872 /* Similarly for (plus (mult FOO (const_int pow2))). */
3873 if (split_code == PLUS
3874 && GET_CODE (XEXP (*split, 0)) == MULT
3875 && CONST_INT_P (XEXP (XEXP (*split, 0), 1))
3876 && INTVAL (XEXP (XEXP (*split, 0), 1)) > 0
3877 && (i = exact_log2 (UINTVAL (XEXP (XEXP (*split, 0), 1)))) >= 0)
3878 {
3879 rtx nsplit = XEXP (*split, 0);
3880 rtx i_rtx = gen_int_shift_amount (GET_MODE (nsplit), i);
3881 SUBST (XEXP (*split, 0), gen_rtx_ASHIFT (GET_MODE (nsplit),
3882 XEXP (nsplit, 0),
3883 i_rtx));
3884 /* Update split_code because we may not have a multiply
3885 anymore. */
3886 split_code = GET_CODE (*split);
3887 }
3888
3889 #ifdef INSN_SCHEDULING
3890 /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
3891 be written as a ZERO_EXTEND. */
3892 if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
3893 {
3894 /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
3895 what it really is. */
3896 if (load_extend_op (GET_MODE (SUBREG_REG (*split)))
3897 == SIGN_EXTEND)
3898 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
3899 SUBREG_REG (*split)));
3900 else
3901 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
3902 SUBREG_REG (*split)));
3903 }
3904 #endif
3905
3906 /* Attempt to split binary operators using arithmetic identities. */
3907 if (BINARY_P (SET_SRC (newpat))
3908 && split_mode == GET_MODE (SET_SRC (newpat))
3909 && ! side_effects_p (SET_SRC (newpat)))
3910 {
3911 rtx setsrc = SET_SRC (newpat);
3912 machine_mode mode = GET_MODE (setsrc);
3913 enum rtx_code code = GET_CODE (setsrc);
3914 rtx src_op0 = XEXP (setsrc, 0);
3915 rtx src_op1 = XEXP (setsrc, 1);
3916
3917 /* Split "X = Y op Y" as "Z = Y; X = Z op Z". */
3918 if (rtx_equal_p (src_op0, src_op1))
3919 {
3920 newi2pat = gen_rtx_SET (newdest, src_op0);
3921 SUBST (XEXP (setsrc, 0), newdest);
3922 SUBST (XEXP (setsrc, 1), newdest);
3923 subst_done = true;
3924 }
3925 /* Split "((P op Q) op R) op S" where op is PLUS or MULT. */
3926 else if ((code == PLUS || code == MULT)
3927 && GET_CODE (src_op0) == code
3928 && GET_CODE (XEXP (src_op0, 0)) == code
3929 && (INTEGRAL_MODE_P (mode)
3930 || (FLOAT_MODE_P (mode)
3931 && flag_unsafe_math_optimizations)))
3932 {
3933 rtx p = XEXP (XEXP (src_op0, 0), 0);
3934 rtx q = XEXP (XEXP (src_op0, 0), 1);
3935 rtx r = XEXP (src_op0, 1);
3936 rtx s = src_op1;
3937
3938 /* Split both "((X op Y) op X) op Y" and
3939 "((X op Y) op Y) op X" as "T op T" where T is
3940 "X op Y". */
3941 if ((rtx_equal_p (p,r) && rtx_equal_p (q,s))
3942 || (rtx_equal_p (p,s) && rtx_equal_p (q,r)))
3943 {
3944 newi2pat = gen_rtx_SET (newdest, XEXP (src_op0, 0));
3945 SUBST (XEXP (setsrc, 0), newdest);
3946 SUBST (XEXP (setsrc, 1), newdest);
3947 subst_done = true;
3948 }
3949 /* Split "((X op X) op Y) op Y)" as "T op T" where
3950 T is "X op Y". */
3951 else if (rtx_equal_p (p,q) && rtx_equal_p (r,s))
3952 {
3953 rtx tmp = simplify_gen_binary (code, mode, p, r);
3954 newi2pat = gen_rtx_SET (newdest, tmp);
3955 SUBST (XEXP (setsrc, 0), newdest);
3956 SUBST (XEXP (setsrc, 1), newdest);
3957 subst_done = true;
3958 }
3959 }
3960 }
3961
3962 if (!subst_done)
3963 {
3964 newi2pat = gen_rtx_SET (newdest, *split);
3965 SUBST (*split, newdest);
3966 }
3967
3968 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3969
3970 /* recog_for_combine might have added CLOBBERs to newi2pat.
3971 Make sure NEWPAT does not depend on the clobbered regs. */
3972 if (GET_CODE (newi2pat) == PARALLEL)
3973 for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3974 if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3975 {
3976 rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3977 if (reg_overlap_mentioned_p (reg, newpat))
3978 {
3979 undo_all ();
3980 return 0;
3981 }
3982 }
3983
3984 /* If the split point was a MULT and we didn't have one before,
3985 don't use one now. */
3986 if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
3987 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3988 }
3989 }
3990
3991 /* Check for a case where we loaded from memory in a narrow mode and
3992 then sign extended it, but we need both registers. In that case,
3993 we have a PARALLEL with both loads from the same memory location.
3994 We can split this into a load from memory followed by a register-register
3995 copy. This saves at least one insn, more if register allocation can
3996 eliminate the copy.
3997
3998 We cannot do this if the destination of the first assignment is a
3999 condition code register or cc0. We eliminate this case by making sure
4000 the SET_DEST and SET_SRC have the same mode.
4001
4002 We cannot do this if the destination of the second assignment is
4003 a register that we have already assumed is zero-extended. Similarly
4004 for a SUBREG of such a register. */
4005
4006 else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
4007 && GET_CODE (newpat) == PARALLEL
4008 && XVECLEN (newpat, 0) == 2
4009 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
4010 && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
4011 && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
4012 == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
4013 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
4014 && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
4015 XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
4016 && !modified_between_p (SET_SRC (XVECEXP (newpat, 0, 1)), i2, i3)
4017 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
4018 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
4019 && ! (temp_expr = SET_DEST (XVECEXP (newpat, 0, 1)),
4020 (REG_P (temp_expr)
4021 && reg_stat[REGNO (temp_expr)].nonzero_bits != 0
4022 && known_lt (GET_MODE_PRECISION (GET_MODE (temp_expr)),
4023 BITS_PER_WORD)
4024 && known_lt (GET_MODE_PRECISION (GET_MODE (temp_expr)),
4025 HOST_BITS_PER_INT)
4026 && (reg_stat[REGNO (temp_expr)].nonzero_bits
4027 != GET_MODE_MASK (word_mode))))
4028 && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
4029 && (temp_expr = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
4030 (REG_P (temp_expr)
4031 && reg_stat[REGNO (temp_expr)].nonzero_bits != 0
4032 && known_lt (GET_MODE_PRECISION (GET_MODE (temp_expr)),
4033 BITS_PER_WORD)
4034 && known_lt (GET_MODE_PRECISION (GET_MODE (temp_expr)),
4035 HOST_BITS_PER_INT)
4036 && (reg_stat[REGNO (temp_expr)].nonzero_bits
4037 != GET_MODE_MASK (word_mode)))))
4038 && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
4039 SET_SRC (XVECEXP (newpat, 0, 1)))
4040 && ! find_reg_note (i3, REG_UNUSED,
4041 SET_DEST (XVECEXP (newpat, 0, 0))))
4042 {
4043 rtx ni2dest;
4044
4045 newi2pat = XVECEXP (newpat, 0, 0);
4046 ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
4047 newpat = XVECEXP (newpat, 0, 1);
4048 SUBST (SET_SRC (newpat),
4049 gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
4050 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
4051
4052 if (i2_code_number >= 0)
4053 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
4054
4055 if (insn_code_number >= 0)
4056 swap_i2i3 = 1;
4057 }
4058
4059 /* Similarly, check for a case where we have a PARALLEL of two independent
4060 SETs but we started with three insns. In this case, we can do the sets
4061 as two separate insns. This case occurs when some SET allows two
4062 other insns to combine, but the destination of that SET is still live.
4063
4064 Also do this if we started with two insns and (at least) one of the
4065 resulting sets is a noop; this noop will be deleted later.
4066
4067 Also do this if we started with two insns neither of which was a simple
4068 move. */
4069
4070 else if (insn_code_number < 0 && asm_noperands (newpat) < 0
4071 && GET_CODE (newpat) == PARALLEL
4072 && XVECLEN (newpat, 0) == 2
4073 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
4074 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
4075 && (i1
4076 || set_noop_p (XVECEXP (newpat, 0, 0))
4077 || set_noop_p (XVECEXP (newpat, 0, 1))
4078 || (!i2_was_move && !i3_was_move))
4079 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
4080 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
4081 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
4082 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
4083 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
4084 XVECEXP (newpat, 0, 0))
4085 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
4086 XVECEXP (newpat, 0, 1))
4087 && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
4088 && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
4089 {
4090 rtx set0 = XVECEXP (newpat, 0, 0);
4091 rtx set1 = XVECEXP (newpat, 0, 1);
4092
4093 /* Normally, it doesn't matter which of the two is done first,
4094 but the one that references cc0 can't be the second, and
4095 one which uses any regs/memory set in between i2 and i3 can't
4096 be first. The PARALLEL might also have been pre-existing in i3,
4097 so we need to make sure that we won't wrongly hoist a SET to i2
4098 that would conflict with a death note present in there, or would
4099 have its dest modified between i2 and i3. */
4100 if (!modified_between_p (SET_SRC (set1), i2, i3)
4101 && !(REG_P (SET_DEST (set1))
4102 && find_reg_note (i2, REG_DEAD, SET_DEST (set1)))
4103 && !(GET_CODE (SET_DEST (set1)) == SUBREG
4104 && find_reg_note (i2, REG_DEAD,
4105 SUBREG_REG (SET_DEST (set1))))
4106 && !modified_between_p (SET_DEST (set1), i2, i3)
4107 && (!HAVE_cc0 || !reg_referenced_p (cc0_rtx, set0))
4108 /* If I3 is a jump, ensure that set0 is a jump so that
4109 we do not create invalid RTL. */
4110 && (!JUMP_P (i3) || SET_DEST (set0) == pc_rtx)
4111 )
4112 {
4113 newi2pat = set1;
4114 newpat = set0;
4115 }
4116 else if (!modified_between_p (SET_SRC (set0), i2, i3)
4117 && !(REG_P (SET_DEST (set0))
4118 && find_reg_note (i2, REG_DEAD, SET_DEST (set0)))
4119 && !(GET_CODE (SET_DEST (set0)) == SUBREG
4120 && find_reg_note (i2, REG_DEAD,
4121 SUBREG_REG (SET_DEST (set0))))
4122 && !modified_between_p (SET_DEST (set0), i2, i3)
4123 && (!HAVE_cc0 || !reg_referenced_p (cc0_rtx, set1))
4124 /* If I3 is a jump, ensure that set1 is a jump so that
4125 we do not create invalid RTL. */
4126 && (!JUMP_P (i3) || SET_DEST (set1) == pc_rtx)
4127 )
4128 {
4129 newi2pat = set0;
4130 newpat = set1;
4131 }
4132 else
4133 {
4134 undo_all ();
4135 return 0;
4136 }
4137
4138 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
4139
4140 if (i2_code_number >= 0)
4141 {
4142 /* recog_for_combine might have added CLOBBERs to newi2pat.
4143 Make sure NEWPAT does not depend on the clobbered regs. */
4144 if (GET_CODE (newi2pat) == PARALLEL)
4145 {
4146 for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
4147 if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
4148 {
4149 rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
4150 if (reg_overlap_mentioned_p (reg, newpat))
4151 {
4152 undo_all ();
4153 return 0;
4154 }
4155 }
4156 }
4157
4158 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
4159
4160 if (insn_code_number >= 0)
4161 split_i2i3 = 1;
4162 }
4163 }
4164
4165 /* If it still isn't recognized, fail and change things back the way they
4166 were. */
4167 if ((insn_code_number < 0
4168 /* Is the result a reasonable ASM_OPERANDS? */
4169 && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
4170 {
4171 undo_all ();
4172 return 0;
4173 }
4174
4175 /* If we had to change another insn, make sure it is valid also. */
4176 if (undobuf.other_insn)
4177 {
4178 CLEAR_HARD_REG_SET (newpat_used_regs);
4179
4180 other_pat = PATTERN (undobuf.other_insn);
4181 other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
4182 &new_other_notes);
4183
4184 if (other_code_number < 0 && ! check_asm_operands (other_pat))
4185 {
4186 undo_all ();
4187 return 0;
4188 }
4189 }
4190
4191 /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
4192 they are adjacent to each other or not. */
4193 if (HAVE_cc0)
4194 {
4195 rtx_insn *p = prev_nonnote_insn (i3);
4196 if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
4197 && sets_cc0_p (newi2pat))
4198 {
4199 undo_all ();
4200 return 0;
4201 }
4202 }
4203
4204 /* Only allow this combination if insn_cost reports that the
4205 replacement instructions are cheaper than the originals. */
4206 if (!combine_validate_cost (i0, i1, i2, i3, newpat, newi2pat, other_pat))
4207 {
4208 undo_all ();
4209 return 0;
4210 }
4211
4212 if (MAY_HAVE_DEBUG_BIND_INSNS)
4213 {
4214 struct undo *undo;
4215
4216 for (undo = undobuf.undos; undo; undo = undo->next)
4217 if (undo->kind == UNDO_MODE)
4218 {
4219 rtx reg = *undo->where.r;
4220 machine_mode new_mode = GET_MODE (reg);
4221 machine_mode old_mode = undo->old_contents.m;
4222
4223 /* Temporarily revert mode back. */
4224 adjust_reg_mode (reg, old_mode);
4225
4226 if (reg == i2dest && i2scratch)
4227 {
4228 /* If we used i2dest as a scratch register with a
4229 different mode, substitute it for the original
4230 i2src while its original mode is temporarily
4231 restored, and then clear i2scratch so that we don't
4232 do it again later. */
4233 propagate_for_debug (i2, last_combined_insn, reg, i2src,
4234 this_basic_block);
4235 i2scratch = false;
4236 /* Put back the new mode. */
4237 adjust_reg_mode (reg, new_mode);
4238 }
4239 else
4240 {
4241 rtx tempreg = gen_raw_REG (old_mode, REGNO (reg));
4242 rtx_insn *first, *last;
4243
4244 if (reg == i2dest)
4245 {
4246 first = i2;
4247 last = last_combined_insn;
4248 }
4249 else
4250 {
4251 first = i3;
4252 last = undobuf.other_insn;
4253 gcc_assert (last);
4254 if (DF_INSN_LUID (last)
4255 < DF_INSN_LUID (last_combined_insn))
4256 last = last_combined_insn;
4257 }
4258
4259 /* We're dealing with a reg that changed mode but not
4260 meaning, so we want to turn it into a subreg for
4261 the new mode. However, because of REG sharing and
4262 because its mode had already changed, we have to do
4263 it in two steps. First, replace any debug uses of
4264 reg, with its original mode temporarily restored,
4265 with this copy we have created; then, replace the
4266 copy with the SUBREG of the original shared reg,
4267 once again changed to the new mode. */
4268 propagate_for_debug (first, last, reg, tempreg,
4269 this_basic_block);
4270 adjust_reg_mode (reg, new_mode);
4271 propagate_for_debug (first, last, tempreg,
4272 lowpart_subreg (old_mode, reg, new_mode),
4273 this_basic_block);
4274 }
4275 }
4276 }
4277
4278 /* If we will be able to accept this, we have made a
4279 change to the destination of I3. This requires us to
4280 do a few adjustments. */
4281
4282 if (changed_i3_dest)
4283 {
4284 PATTERN (i3) = newpat;
4285 adjust_for_new_dest (i3);
4286 }
4287
4288 /* We now know that we can do this combination. Merge the insns and
4289 update the status of registers and LOG_LINKS. */
4290
4291 if (undobuf.other_insn)
4292 {
4293 rtx note, next;
4294
4295 PATTERN (undobuf.other_insn) = other_pat;
4296
4297 /* If any of the notes in OTHER_INSN were REG_DEAD or REG_UNUSED,
4298 ensure that they are still valid. Then add any non-duplicate
4299 notes added by recog_for_combine. */
4300 for (note = REG_NOTES (undobuf.other_insn); note; note = next)
4301 {
4302 next = XEXP (note, 1);
4303
4304 if ((REG_NOTE_KIND (note) == REG_DEAD
4305 && !reg_referenced_p (XEXP (note, 0),
4306 PATTERN (undobuf.other_insn)))
4307 ||(REG_NOTE_KIND (note) == REG_UNUSED
4308 && !reg_set_p (XEXP (note, 0),
4309 PATTERN (undobuf.other_insn)))
4310 /* Simply drop equal note since it may be no longer valid
4311 for other_insn. It may be possible to record that CC
4312 register is changed and only discard those notes, but
4313 in practice it's unnecessary complication and doesn't
4314 give any meaningful improvement.
4315
4316 See PR78559. */
4317 || REG_NOTE_KIND (note) == REG_EQUAL
4318 || REG_NOTE_KIND (note) == REG_EQUIV)
4319 remove_note (undobuf.other_insn, note);
4320 }
4321
4322 distribute_notes (new_other_notes, undobuf.other_insn,
4323 undobuf.other_insn, NULL, NULL_RTX, NULL_RTX,
4324 NULL_RTX);
4325 }
4326
4327 if (swap_i2i3)
4328 {
4329 /* I3 now uses what used to be its destination and which is now
4330 I2's destination. This requires us to do a few adjustments. */
4331 PATTERN (i3) = newpat;
4332 adjust_for_new_dest (i3);
4333 }
4334
4335 if (swap_i2i3 || split_i2i3)
4336 {
4337 /* We might need a LOG_LINK from I3 to I2. But then we used to
4338 have one, so we still will.
4339
4340 However, some later insn might be using I2's dest and have
4341 a LOG_LINK pointing at I3. We should change it to point at
4342 I2 instead. */
4343
4344 /* newi2pat is usually a SET here; however, recog_for_combine might
4345 have added some clobbers. */
4346 rtx x = newi2pat;
4347 if (GET_CODE (x) == PARALLEL)
4348 x = XVECEXP (newi2pat, 0, 0);
4349
4350 /* It can only be a SET of a REG or of a SUBREG of a REG. */
4351 unsigned int regno = reg_or_subregno (SET_DEST (x));
4352
4353 bool done = false;
4354 for (rtx_insn *insn = NEXT_INSN (i3);
4355 !done
4356 && insn
4357 && NONDEBUG_INSN_P (insn)
4358 && BLOCK_FOR_INSN (insn) == this_basic_block;
4359 insn = NEXT_INSN (insn))
4360 {
4361 struct insn_link *link;
4362 FOR_EACH_LOG_LINK (link, insn)
4363 if (link->insn == i3 && link->regno == regno)
4364 {
4365 link->insn = i2;
4366 done = true;
4367 break;
4368 }
4369 }
4370 }
4371
4372 {
4373 rtx i3notes, i2notes, i1notes = 0, i0notes = 0;
4374 struct insn_link *i3links, *i2links, *i1links = 0, *i0links = 0;
4375 rtx midnotes = 0;
4376 int from_luid;
4377 /* Compute which registers we expect to eliminate. newi2pat may be setting
4378 either i3dest or i2dest, so we must check it. */
4379 rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
4380 || i2dest_in_i2src || i2dest_in_i1src || i2dest_in_i0src
4381 || !i2dest_killed
4382 ? 0 : i2dest);
4383 /* For i1, we need to compute both local elimination and global
4384 elimination information with respect to newi2pat because i1dest
4385 may be the same as i3dest, in which case newi2pat may be setting
4386 i1dest. Global information is used when distributing REG_DEAD
4387 note for i2 and i3, in which case it does matter if newi2pat sets
4388 i1dest or not.
4389
4390 Local information is used when distributing REG_DEAD note for i1,
4391 in which case it doesn't matter if newi2pat sets i1dest or not.
4392 See PR62151, if we have four insns combination:
4393 i0: r0 <- i0src
4394 i1: r1 <- i1src (using r0)
4395 REG_DEAD (r0)
4396 i2: r0 <- i2src (using r1)
4397 i3: r3 <- i3src (using r0)
4398 ix: using r0
4399 From i1's point of view, r0 is eliminated, no matter if it is set
4400 by newi2pat or not. In other words, REG_DEAD info for r0 in i1
4401 should be discarded.
4402
4403 Note local information only affects cases in forms like "I1->I2->I3",
4404 "I0->I1->I2->I3" or "I0&I1->I2, I2->I3". For other cases like
4405 "I0->I1, I1&I2->I3" or "I1&I2->I3", newi2pat won't set i1dest or
4406 i0dest anyway. */
4407 rtx local_elim_i1 = (i1 == 0 || i1dest_in_i1src || i1dest_in_i0src
4408 || !i1dest_killed
4409 ? 0 : i1dest);
4410 rtx elim_i1 = (local_elim_i1 == 0
4411 || (newi2pat && reg_set_p (i1dest, newi2pat))
4412 ? 0 : i1dest);
4413 /* Same case as i1. */
4414 rtx local_elim_i0 = (i0 == 0 || i0dest_in_i0src || !i0dest_killed
4415 ? 0 : i0dest);
4416 rtx elim_i0 = (local_elim_i0 == 0
4417 || (newi2pat && reg_set_p (i0dest, newi2pat))
4418 ? 0 : i0dest);
4419
4420 /* Get the old REG_NOTES and LOG_LINKS from all our insns and
4421 clear them. */
4422 i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
4423 i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
4424 if (i1)
4425 i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
4426 if (i0)
4427 i0notes = REG_NOTES (i0), i0links = LOG_LINKS (i0);
4428
4429 /* Ensure that we do not have something that should not be shared but
4430 occurs multiple times in the new insns. Check this by first
4431 resetting all the `used' flags and then copying anything is shared. */
4432
4433 reset_used_flags (i3notes);
4434 reset_used_flags (i2notes);
4435 reset_used_flags (i1notes);
4436 reset_used_flags (i0notes);
4437 reset_used_flags (newpat);
4438 reset_used_flags (newi2pat);
4439 if (undobuf.other_insn)
4440 reset_used_flags (PATTERN (undobuf.other_insn));
4441
4442 i3notes = copy_rtx_if_shared (i3notes);
4443 i2notes = copy_rtx_if_shared (i2notes);
4444 i1notes = copy_rtx_if_shared (i1notes);
4445 i0notes = copy_rtx_if_shared (i0notes);
4446 newpat = copy_rtx_if_shared (newpat);
4447 newi2pat = copy_rtx_if_shared (newi2pat);
4448 if (undobuf.other_insn)
4449 reset_used_flags (PATTERN (undobuf.other_insn));
4450
4451 INSN_CODE (i3) = insn_code_number;
4452 PATTERN (i3) = newpat;
4453
4454 if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
4455 {
4456 for (rtx link = CALL_INSN_FUNCTION_USAGE (i3); link;
4457 link = XEXP (link, 1))
4458 {
4459 if (substed_i2)
4460 {
4461 /* I2SRC must still be meaningful at this point. Some
4462 splitting operations can invalidate I2SRC, but those
4463 operations do not apply to calls. */
4464 gcc_assert (i2src);
4465 XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
4466 i2dest, i2src);
4467 }
4468 if (substed_i1)
4469 XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
4470 i1dest, i1src);
4471 if (substed_i0)
4472 XEXP (link, 0) = simplify_replace_rtx (XEXP (link, 0),
4473 i0dest, i0src);
4474 }
4475 }
4476
4477 if (undobuf.other_insn)
4478 INSN_CODE (undobuf.other_insn) = other_code_number;
4479
4480 /* We had one special case above where I2 had more than one set and
4481 we replaced a destination of one of those sets with the destination
4482 of I3. In that case, we have to update LOG_LINKS of insns later
4483 in this basic block. Note that this (expensive) case is rare.
4484
4485 Also, in this case, we must pretend that all REG_NOTEs for I2
4486 actually came from I3, so that REG_UNUSED notes from I2 will be
4487 properly handled. */
4488
4489 if (i3_subst_into_i2)
4490 {
4491 for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
4492 if ((GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == SET
4493 || GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == CLOBBER)
4494 && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
4495 && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
4496 && ! find_reg_note (i2, REG_UNUSED,
4497 SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
4498 for (temp_insn = NEXT_INSN (i2);
4499 temp_insn
4500 && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
4501 || BB_HEAD (this_basic_block) != temp_insn);
4502 temp_insn = NEXT_INSN (temp_insn))
4503 if (temp_insn != i3 && NONDEBUG_INSN_P (temp_insn))
4504 FOR_EACH_LOG_LINK (link, temp_insn)
4505 if (link->insn == i2)
4506 link->insn = i3;
4507
4508 if (i3notes)
4509 {
4510 rtx link = i3notes;
4511 while (XEXP (link, 1))
4512 link = XEXP (link, 1);
4513 XEXP (link, 1) = i2notes;
4514 }
4515 else
4516 i3notes = i2notes;
4517 i2notes = 0;
4518 }
4519
4520 LOG_LINKS (i3) = NULL;
4521 REG_NOTES (i3) = 0;
4522 LOG_LINKS (i2) = NULL;
4523 REG_NOTES (i2) = 0;
4524
4525 if (newi2pat)
4526 {
4527 if (MAY_HAVE_DEBUG_BIND_INSNS && i2scratch)
4528 propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
4529 this_basic_block);
4530 INSN_CODE (i2) = i2_code_number;
4531 PATTERN (i2) = newi2pat;
4532 }
4533 else
4534 {
4535 if (MAY_HAVE_DEBUG_BIND_INSNS && i2src)
4536 propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
4537 this_basic_block);
4538 SET_INSN_DELETED (i2);
4539 }
4540
4541 if (i1)
4542 {
4543 LOG_LINKS (i1) = NULL;
4544 REG_NOTES (i1) = 0;
4545 if (MAY_HAVE_DEBUG_BIND_INSNS)
4546 propagate_for_debug (i1, last_combined_insn, i1dest, i1src,
4547 this_basic_block);
4548 SET_INSN_DELETED (i1);
4549 }
4550
4551 if (i0)
4552 {
4553 LOG_LINKS (i0) = NULL;
4554 REG_NOTES (i0) = 0;
4555 if (MAY_HAVE_DEBUG_BIND_INSNS)
4556 propagate_for_debug (i0, last_combined_insn, i0dest, i0src,
4557 this_basic_block);
4558 SET_INSN_DELETED (i0);
4559 }
4560
4561 /* Get death notes for everything that is now used in either I3 or
4562 I2 and used to die in a previous insn. If we built two new
4563 patterns, move from I1 to I2 then I2 to I3 so that we get the
4564 proper movement on registers that I2 modifies. */
4565
4566 if (i0)
4567 from_luid = DF_INSN_LUID (i0);
4568 else if (i1)
4569 from_luid = DF_INSN_LUID (i1);
4570 else
4571 from_luid = DF_INSN_LUID (i2);
4572 if (newi2pat)
4573 move_deaths (newi2pat, NULL_RTX, from_luid, i2, &midnotes);
4574 move_deaths (newpat, newi2pat, from_luid, i3, &midnotes);
4575
4576 /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */
4577 if (i3notes)
4578 distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL,
4579 elim_i2, elim_i1, elim_i0);
4580 if (i2notes)
4581 distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL,
4582 elim_i2, elim_i1, elim_i0);
4583 if (i1notes)
4584 distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL,
4585 elim_i2, local_elim_i1, local_elim_i0);
4586 if (i0notes)
4587 distribute_notes (i0notes, i0, i3, newi2pat ? i2 : NULL,
4588 elim_i2, elim_i1, local_elim_i0);
4589 if (midnotes)
4590 distribute_notes (midnotes, NULL, i3, newi2pat ? i2 : NULL,
4591 elim_i2, elim_i1, elim_i0);
4592
4593 /* Distribute any notes added to I2 or I3 by recog_for_combine. We
4594 know these are REG_UNUSED and want them to go to the desired insn,
4595 so we always pass it as i3. */
4596
4597 if (newi2pat && new_i2_notes)
4598 distribute_notes (new_i2_notes, i2, i2, NULL, NULL_RTX, NULL_RTX,
4599 NULL_RTX);
4600
4601 if (new_i3_notes)
4602 distribute_notes (new_i3_notes, i3, i3, NULL, NULL_RTX, NULL_RTX,
4603 NULL_RTX);
4604
4605 /* If I3DEST was used in I3SRC, it really died in I3. We may need to
4606 put a REG_DEAD note for it somewhere. If NEWI2PAT exists and sets
4607 I3DEST, the death must be somewhere before I2, not I3. If we passed I3
4608 in that case, it might delete I2. Similarly for I2 and I1.
4609 Show an additional death due to the REG_DEAD note we make here. If
4610 we discard it in distribute_notes, we will decrement it again. */
4611
4612 if (i3dest_killed)
4613 {
4614 rtx new_note = alloc_reg_note (REG_DEAD, i3dest_killed, NULL_RTX);
4615 if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
4616 distribute_notes (new_note, NULL, i2, NULL, elim_i2,
4617 elim_i1, elim_i0);
4618 else
4619 distribute_notes (new_note, NULL, i3, newi2pat ? i2 : NULL,
4620 elim_i2, elim_i1, elim_i0);
4621 }
4622
4623 if (i2dest_in_i2src)
4624 {
4625 rtx new_note = alloc_reg_note (REG_DEAD, i2dest, NULL_RTX);
4626 if (newi2pat && reg_set_p (i2dest, newi2pat))
4627 distribute_notes (new_note, NULL, i2, NULL, NULL_RTX,
4628 NULL_RTX, NULL_RTX);
4629 else
4630 distribute_notes (new_note, NULL, i3, newi2pat ? i2 : NULL,
4631 NULL_RTX, NULL_RTX, NULL_RTX);
4632 }
4633
4634 if (i1dest_in_i1src)
4635 {
4636 rtx new_note = alloc_reg_note (REG_DEAD, i1dest, NULL_RTX);
4637 if (newi2pat && reg_set_p (i1dest, newi2pat))
4638 distribute_notes (new_note, NULL, i2, NULL, NULL_RTX,
4639 NULL_RTX, NULL_RTX);
4640 else
4641 distribute_notes (new_note, NULL, i3, newi2pat ? i2 : NULL,
4642 NULL_RTX, NULL_RTX, NULL_RTX);
4643 }
4644
4645 if (i0dest_in_i0src)
4646 {
4647 rtx new_note = alloc_reg_note (REG_DEAD, i0dest, NULL_RTX);
4648 if (newi2pat && reg_set_p (i0dest, newi2pat))
4649 distribute_notes (new_note, NULL, i2, NULL, NULL_RTX,
4650 NULL_RTX, NULL_RTX);
4651 else
4652 distribute_notes (new_note, NULL, i3, newi2pat ? i2 : NULL,
4653 NULL_RTX, NULL_RTX, NULL_RTX);
4654 }
4655
4656 distribute_links (i3links);
4657 distribute_links (i2links);
4658 distribute_links (i1links);
4659 distribute_links (i0links);
4660
4661 if (REG_P (i2dest))
4662 {
4663 struct insn_link *link;
4664 rtx_insn *i2_insn = 0;
4665 rtx i2_val = 0, set;
4666
4667 /* The insn that used to set this register doesn't exist, and
4668 this life of the register may not exist either. See if one of
4669 I3's links points to an insn that sets I2DEST. If it does,
4670 that is now the last known value for I2DEST. If we don't update
4671 this and I2 set the register to a value that depended on its old
4672 contents, we will get confused. If this insn is used, thing
4673 will be set correctly in combine_instructions. */
4674 FOR_EACH_LOG_LINK (link, i3)
4675 if ((set = single_set (link->insn)) != 0
4676 && rtx_equal_p (i2dest, SET_DEST (set)))
4677 i2_insn = link->insn, i2_val = SET_SRC (set);
4678
4679 record_value_for_reg (i2dest, i2_insn, i2_val);
4680
4681 /* If the reg formerly set in I2 died only once and that was in I3,
4682 zero its use count so it won't make `reload' do any work. */
4683 if (! added_sets_2
4684 && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
4685 && ! i2dest_in_i2src
4686 && REGNO (i2dest) < reg_n_sets_max)
4687 INC_REG_N_SETS (REGNO (i2dest), -1);
4688 }
4689
4690 if (i1 && REG_P (i1dest))
4691 {
4692 struct insn_link *link;
4693 rtx_insn *i1_insn = 0;
4694 rtx i1_val = 0, set;
4695
4696 FOR_EACH_LOG_LINK (link, i3)
4697 if ((set = single_set (link->insn)) != 0
4698 && rtx_equal_p (i1dest, SET_DEST (set)))
4699 i1_insn = link->insn, i1_val = SET_SRC (set);
4700
4701 record_value_for_reg (i1dest, i1_insn, i1_val);
4702
4703 if (! added_sets_1
4704 && ! i1dest_in_i1src
4705 && REGNO (i1dest) < reg_n_sets_max)
4706 INC_REG_N_SETS (REGNO (i1dest), -1);
4707 }
4708
4709 if (i0 && REG_P (i0dest))
4710 {
4711 struct insn_link *link;
4712 rtx_insn *i0_insn = 0;
4713 rtx i0_val = 0, set;
4714
4715 FOR_EACH_LOG_LINK (link, i3)
4716 if ((set = single_set (link->insn)) != 0
4717 && rtx_equal_p (i0dest, SET_DEST (set)))
4718 i0_insn = link->insn, i0_val = SET_SRC (set);
4719
4720 record_value_for_reg (i0dest, i0_insn, i0_val);
4721
4722 if (! added_sets_0
4723 && ! i0dest_in_i0src
4724 && REGNO (i0dest) < reg_n_sets_max)
4725 INC_REG_N_SETS (REGNO (i0dest), -1);
4726 }
4727
4728 /* Update reg_stat[].nonzero_bits et al for any changes that may have
4729 been made to this insn. The order is important, because newi2pat
4730 can affect nonzero_bits of newpat. */
4731 if (newi2pat)
4732 note_pattern_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
4733 note_pattern_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
4734 }
4735
4736 if (undobuf.other_insn != NULL_RTX)
4737 {
4738 if (dump_file)
4739 {
4740 fprintf (dump_file, "modifying other_insn ");
4741 dump_insn_slim (dump_file, undobuf.other_insn);
4742 }
4743 df_insn_rescan (undobuf.other_insn);
4744 }
4745
4746 if (i0 && !(NOTE_P (i0) && (NOTE_KIND (i0) == NOTE_INSN_DELETED)))
4747 {
4748 if (dump_file)
4749 {
4750 fprintf (dump_file, "modifying insn i0 ");
4751 dump_insn_slim (dump_file, i0);
4752 }
4753 df_insn_rescan (i0);
4754 }
4755
4756 if (i1 && !(NOTE_P (i1) && (NOTE_KIND (i1) == NOTE_INSN_DELETED)))
4757 {
4758 if (dump_file)
4759 {
4760 fprintf (dump_file, "modifying insn i1 ");
4761 dump_insn_slim (dump_file, i1);
4762 }
4763 df_insn_rescan (i1);
4764 }
4765
4766 if (i2 && !(NOTE_P (i2) && (NOTE_KIND (i2) == NOTE_INSN_DELETED)))
4767 {
4768 if (dump_file)
4769 {
4770 fprintf (dump_file, "modifying insn i2 ");
4771 dump_insn_slim (dump_file, i2);
4772 }
4773 df_insn_rescan (i2);
4774 }
4775
4776 if (i3 && !(NOTE_P (i3) && (NOTE_KIND (i3) == NOTE_INSN_DELETED)))
4777 {
4778 if (dump_file)
4779 {
4780 fprintf (dump_file, "modifying insn i3 ");
4781 dump_insn_slim (dump_file, i3);
4782 }
4783 df_insn_rescan (i3);
4784 }
4785
4786 /* Set new_direct_jump_p if a new return or simple jump instruction
4787 has been created. Adjust the CFG accordingly. */
4788 if (returnjump_p (i3) || any_uncondjump_p (i3))
4789 {
4790 *new_direct_jump_p = 1;
4791 mark_jump_label (PATTERN (i3), i3, 0);
4792 update_cfg_for_uncondjump (i3);
4793 }
4794
4795 if (undobuf.other_insn != NULL_RTX
4796 && (returnjump_p (undobuf.other_insn)
4797 || any_uncondjump_p (undobuf.other_insn)))
4798 {
4799 *new_direct_jump_p = 1;
4800 update_cfg_for_uncondjump (undobuf.other_insn);
4801 }
4802
4803 if (GET_CODE (PATTERN (i3)) == TRAP_IF
4804 && XEXP (PATTERN (i3), 0) == const1_rtx)
4805 {
4806 basic_block bb = BLOCK_FOR_INSN (i3);
4807 gcc_assert (bb);
4808 remove_edge (split_block (bb, i3));
4809 emit_barrier_after_bb (bb);
4810 *new_direct_jump_p = 1;
4811 }
4812
4813 if (undobuf.other_insn
4814 && GET_CODE (PATTERN (undobuf.other_insn)) == TRAP_IF
4815 && XEXP (PATTERN (undobuf.other_insn), 0) == const1_rtx)
4816 {
4817 basic_block bb = BLOCK_FOR_INSN (undobuf.other_insn);
4818 gcc_assert (bb);
4819 remove_edge (split_block (bb, undobuf.other_insn));
4820 emit_barrier_after_bb (bb);
4821 *new_direct_jump_p = 1;
4822 }
4823
4824 /* A noop might also need cleaning up of CFG, if it comes from the
4825 simplification of a jump. */
4826 if (JUMP_P (i3)
4827 && GET_CODE (newpat) == SET
4828 && SET_SRC (newpat) == pc_rtx
4829 && SET_DEST (newpat) == pc_rtx)
4830 {
4831 *new_direct_jump_p = 1;
4832 update_cfg_for_uncondjump (i3);
4833 }
4834
4835 if (undobuf.other_insn != NULL_RTX
4836 && JUMP_P (undobuf.other_insn)
4837 && GET_CODE (PATTERN (undobuf.other_insn)) == SET
4838 && SET_SRC (PATTERN (undobuf.other_insn)) == pc_rtx
4839 && SET_DEST (PATTERN (undobuf.other_insn)) == pc_rtx)
4840 {
4841 *new_direct_jump_p = 1;
4842 update_cfg_for_uncondjump (undobuf.other_insn);
4843 }
4844
4845 combine_successes++;
4846 undo_commit ();
4847
4848 rtx_insn *ret = newi2pat ? i2 : i3;
4849 if (added_links_insn && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (ret))
4850 ret = added_links_insn;
4851 if (added_notes_insn && DF_INSN_LUID (added_notes_insn) < DF_INSN_LUID (ret))
4852 ret = added_notes_insn;
4853
4854 return ret;
4855 }
4856 \f
4857 /* Get a marker for undoing to the current state. */
4858
4859 static void *
4860 get_undo_marker (void)
4861 {
4862 return undobuf.undos;
4863 }
4864
4865 /* Undo the modifications up to the marker. */
4866
4867 static void
4868 undo_to_marker (void *marker)
4869 {
4870 struct undo *undo, *next;
4871
4872 for (undo = undobuf.undos; undo != marker; undo = next)
4873 {
4874 gcc_assert (undo);
4875
4876 next = undo->next;
4877 switch (undo->kind)
4878 {
4879 case UNDO_RTX:
4880 *undo->where.r = undo->old_contents.r;
4881 break;
4882 case UNDO_INT:
4883 *undo->where.i = undo->old_contents.i;
4884 break;
4885 case UNDO_MODE:
4886 adjust_reg_mode (*undo->where.r, undo->old_contents.m);
4887 break;
4888 case UNDO_LINKS:
4889 *undo->where.l = undo->old_contents.l;
4890 break;
4891 default:
4892 gcc_unreachable ();
4893 }
4894
4895 undo->next = undobuf.frees;
4896 undobuf.frees = undo;
4897 }
4898
4899 undobuf.undos = (struct undo *) marker;
4900 }
4901
4902 /* Undo all the modifications recorded in undobuf. */
4903
4904 static void
4905 undo_all (void)
4906 {
4907 undo_to_marker (0);
4908 }
4909
4910 /* We've committed to accepting the changes we made. Move all
4911 of the undos to the free list. */
4912
4913 static void
4914 undo_commit (void)
4915 {
4916 struct undo *undo, *next;
4917
4918 for (undo = undobuf.undos; undo; undo = next)
4919 {
4920 next = undo->next;
4921 undo->next = undobuf.frees;
4922 undobuf.frees = undo;
4923 }
4924 undobuf.undos = 0;
4925 }
4926 \f
4927 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
4928 where we have an arithmetic expression and return that point. LOC will
4929 be inside INSN.
4930
4931 try_combine will call this function to see if an insn can be split into
4932 two insns. */
4933
4934 static rtx *
4935 find_split_point (rtx *loc, rtx_insn *insn, bool set_src)
4936 {
4937 rtx x = *loc;
4938 enum rtx_code code = GET_CODE (x);
4939 rtx *split;
4940 unsigned HOST_WIDE_INT len = 0;
4941 HOST_WIDE_INT pos = 0;
4942 int unsignedp = 0;
4943 rtx inner = NULL_RTX;
4944 scalar_int_mode mode, inner_mode;
4945
4946 /* First special-case some codes. */
4947 switch (code)
4948 {
4949 case SUBREG:
4950 #ifdef INSN_SCHEDULING
4951 /* If we are making a paradoxical SUBREG invalid, it becomes a split
4952 point. */
4953 if (MEM_P (SUBREG_REG (x)))
4954 return loc;
4955 #endif
4956 return find_split_point (&SUBREG_REG (x), insn, false);
4957
4958 case MEM:
4959 /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
4960 using LO_SUM and HIGH. */
4961 if (HAVE_lo_sum && (GET_CODE (XEXP (x, 0)) == CONST
4962 || GET_CODE (XEXP (x, 0)) == SYMBOL_REF))
4963 {
4964 machine_mode address_mode = get_address_mode (x);
4965
4966 SUBST (XEXP (x, 0),
4967 gen_rtx_LO_SUM (address_mode,
4968 gen_rtx_HIGH (address_mode, XEXP (x, 0)),
4969 XEXP (x, 0)));
4970 return &XEXP (XEXP (x, 0), 0);
4971 }
4972
4973 /* If we have a PLUS whose second operand is a constant and the
4974 address is not valid, perhaps we can split it up using
4975 the machine-specific way to split large constants. We use
4976 the first pseudo-reg (one of the virtual regs) as a placeholder;
4977 it will not remain in the result. */
4978 if (GET_CODE (XEXP (x, 0)) == PLUS
4979 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
4980 && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4981 MEM_ADDR_SPACE (x)))
4982 {
4983 rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
4984 rtx_insn *seq = combine_split_insns (gen_rtx_SET (reg, XEXP (x, 0)),
4985 subst_insn);
4986
4987 /* This should have produced two insns, each of which sets our
4988 placeholder. If the source of the second is a valid address,
4989 we can put both sources together and make a split point
4990 in the middle. */
4991
4992 if (seq
4993 && NEXT_INSN (seq) != NULL_RTX
4994 && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
4995 && NONJUMP_INSN_P (seq)
4996 && GET_CODE (PATTERN (seq)) == SET
4997 && SET_DEST (PATTERN (seq)) == reg
4998 && ! reg_mentioned_p (reg,
4999 SET_SRC (PATTERN (seq)))
5000 && NONJUMP_INSN_P (NEXT_INSN (seq))
5001 && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
5002 && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
5003 && memory_address_addr_space_p
5004 (GET_MODE (x), SET_SRC (PATTERN (NEXT_INSN (seq))),
5005 MEM_ADDR_SPACE (x)))
5006 {
5007 rtx src1 = SET_SRC (PATTERN (seq));
5008 rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
5009
5010 /* Replace the placeholder in SRC2 with SRC1. If we can
5011 find where in SRC2 it was placed, that can become our
5012 split point and we can replace this address with SRC2.
5013 Just try two obvious places. */
5014
5015 src2 = replace_rtx (src2, reg, src1);
5016 split = 0;
5017 if (XEXP (src2, 0) == src1)
5018 split = &XEXP (src2, 0);
5019 else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
5020 && XEXP (XEXP (src2, 0), 0) == src1)
5021 split = &XEXP (XEXP (src2, 0), 0);
5022
5023 if (split)
5024 {
5025 SUBST (XEXP (x, 0), src2);
5026 return split;
5027 }
5028 }
5029
5030 /* If that didn't work and we have a nested plus, like:
5031 ((REG1 * CONST1) + REG2) + CONST2 and (REG1 + REG2) + CONST2
5032 is valid address, try to split (REG1 * CONST1). */
5033 if (GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
5034 && !OBJECT_P (XEXP (XEXP (XEXP (x, 0), 0), 0))
5035 && OBJECT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
5036 && ! (GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == SUBREG
5037 && OBJECT_P (SUBREG_REG (XEXP (XEXP (XEXP (x, 0),
5038 0), 0)))))
5039 {
5040 rtx tem = XEXP (XEXP (XEXP (x, 0), 0), 0);
5041 XEXP (XEXP (XEXP (x, 0), 0), 0) = reg;
5042 if (memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
5043 MEM_ADDR_SPACE (x)))
5044 {
5045 XEXP (XEXP (XEXP (x, 0), 0), 0) = tem;
5046 return &XEXP (XEXP (XEXP (x, 0), 0), 0);
5047 }
5048 XEXP (XEXP (XEXP (x, 0), 0), 0) = tem;
5049 }
5050 else if (GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
5051 && OBJECT_P (XEXP (XEXP (XEXP (x, 0), 0), 0))
5052 && !OBJECT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
5053 && ! (GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == SUBREG
5054 && OBJECT_P (SUBREG_REG (XEXP (XEXP (XEXP (x, 0),
5055 0), 1)))))
5056 {
5057 rtx tem = XEXP (XEXP (XEXP (x, 0), 0), 1);
5058 XEXP (XEXP (XEXP (x, 0), 0), 1) = reg;
5059 if (memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
5060 MEM_ADDR_SPACE (x)))
5061 {
5062 XEXP (XEXP (XEXP (x, 0), 0), 1) = tem;
5063 return &XEXP (XEXP (XEXP (x, 0), 0), 1);
5064 }
5065 XEXP (XEXP (XEXP (x, 0), 0), 1) = tem;
5066 }
5067
5068 /* If that didn't work, perhaps the first operand is complex and
5069 needs to be computed separately, so make a split point there.
5070 This will occur on machines that just support REG + CONST
5071 and have a constant moved through some previous computation. */
5072 if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
5073 && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
5074 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
5075 return &XEXP (XEXP (x, 0), 0);
5076 }
5077
5078 /* If we have a PLUS whose first operand is complex, try computing it
5079 separately by making a split there. */
5080 if (GET_CODE (XEXP (x, 0)) == PLUS
5081 && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
5082 MEM_ADDR_SPACE (x))
5083 && ! OBJECT_P (XEXP (XEXP (x, 0), 0))
5084 && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
5085 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
5086 return &XEXP (XEXP (x, 0), 0);
5087 break;
5088
5089 case SET:
5090 /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
5091 ZERO_EXTRACT, the most likely reason why this doesn't match is that
5092 we need to put the operand into a register. So split at that
5093 point. */
5094
5095 if (SET_DEST (x) == cc0_rtx
5096 && GET_CODE (SET_SRC (x)) != COMPARE
5097 && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
5098 && !OBJECT_P (SET_SRC (x))
5099 && ! (GET_CODE (SET_SRC (x)) == SUBREG
5100 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
5101 return &SET_SRC (x);
5102
5103 /* See if we can split SET_SRC as it stands. */
5104 split = find_split_point (&SET_SRC (x), insn, true);
5105 if (split && split != &SET_SRC (x))
5106 return split;
5107
5108 /* See if we can split SET_DEST as it stands. */
5109 split = find_split_point (&SET_DEST (x), insn, false);
5110 if (split && split != &SET_DEST (x))
5111 return split;
5112
5113 /* See if this is a bitfield assignment with everything constant. If
5114 so, this is an IOR of an AND, so split it into that. */
5115 if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
5116 && is_a <scalar_int_mode> (GET_MODE (XEXP (SET_DEST (x), 0)),
5117 &inner_mode)
5118 && HWI_COMPUTABLE_MODE_P (inner_mode)
5119 && CONST_INT_P (XEXP (SET_DEST (x), 1))
5120 && CONST_INT_P (XEXP (SET_DEST (x), 2))
5121 && CONST_INT_P (SET_SRC (x))
5122 && ((INTVAL (XEXP (SET_DEST (x), 1))
5123 + INTVAL (XEXP (SET_DEST (x), 2)))
5124 <= GET_MODE_PRECISION (inner_mode))
5125 && ! side_effects_p (XEXP (SET_DEST (x), 0)))
5126 {
5127 HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
5128 unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
5129 unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
5130 rtx dest = XEXP (SET_DEST (x), 0);
5131 unsigned HOST_WIDE_INT mask
5132 = (HOST_WIDE_INT_1U << len) - 1;
5133 rtx or_mask;
5134
5135 if (BITS_BIG_ENDIAN)
5136 pos = GET_MODE_PRECISION (inner_mode) - len - pos;
5137
5138 or_mask = gen_int_mode (src << pos, inner_mode);
5139 if (src == mask)
5140 SUBST (SET_SRC (x),
5141 simplify_gen_binary (IOR, inner_mode, dest, or_mask));
5142 else
5143 {
5144 rtx negmask = gen_int_mode (~(mask << pos), inner_mode);
5145 SUBST (SET_SRC (x),
5146 simplify_gen_binary (IOR, inner_mode,
5147 simplify_gen_binary (AND, inner_mode,
5148 dest, negmask),
5149 or_mask));
5150 }
5151
5152 SUBST (SET_DEST (x), dest);
5153
5154 split = find_split_point (&SET_SRC (x), insn, true);
5155 if (split && split != &SET_SRC (x))
5156 return split;
5157 }
5158
5159 /* Otherwise, see if this is an operation that we can split into two.
5160 If so, try to split that. */
5161 code = GET_CODE (SET_SRC (x));
5162
5163 switch (code)
5164 {
5165 case AND:
5166 /* If we are AND'ing with a large constant that is only a single
5167 bit and the result is only being used in a context where we
5168 need to know if it is zero or nonzero, replace it with a bit
5169 extraction. This will avoid the large constant, which might
5170 have taken more than one insn to make. If the constant were
5171 not a valid argument to the AND but took only one insn to make,
5172 this is no worse, but if it took more than one insn, it will
5173 be better. */
5174
5175 if (CONST_INT_P (XEXP (SET_SRC (x), 1))
5176 && REG_P (XEXP (SET_SRC (x), 0))
5177 && (pos = exact_log2 (UINTVAL (XEXP (SET_SRC (x), 1)))) >= 7
5178 && REG_P (SET_DEST (x))
5179 && (split = find_single_use (SET_DEST (x), insn, NULL)) != 0
5180 && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
5181 && XEXP (*split, 0) == SET_DEST (x)
5182 && XEXP (*split, 1) == const0_rtx)
5183 {
5184 rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
5185 XEXP (SET_SRC (x), 0),
5186 pos, NULL_RTX, 1, 1, 0, 0);
5187 if (extraction != 0)
5188 {
5189 SUBST (SET_SRC (x), extraction);
5190 return find_split_point (loc, insn, false);
5191 }
5192 }
5193 break;
5194
5195 case NE:
5196 /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
5197 is known to be on, this can be converted into a NEG of a shift. */
5198 if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
5199 && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
5200 && ((pos = exact_log2 (nonzero_bits (XEXP (SET_SRC (x), 0),
5201 GET_MODE (XEXP (SET_SRC (x),
5202 0))))) >= 1))
5203 {
5204 machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
5205 rtx pos_rtx = gen_int_shift_amount (mode, pos);
5206 SUBST (SET_SRC (x),
5207 gen_rtx_NEG (mode,
5208 gen_rtx_LSHIFTRT (mode,
5209 XEXP (SET_SRC (x), 0),
5210 pos_rtx)));
5211
5212 split = find_split_point (&SET_SRC (x), insn, true);
5213 if (split && split != &SET_SRC (x))
5214 return split;
5215 }
5216 break;
5217
5218 case SIGN_EXTEND:
5219 inner = XEXP (SET_SRC (x), 0);
5220
5221 /* We can't optimize if either mode is a partial integer
5222 mode as we don't know how many bits are significant
5223 in those modes. */
5224 if (!is_int_mode (GET_MODE (inner), &inner_mode)
5225 || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
5226 break;
5227
5228 pos = 0;
5229 len = GET_MODE_PRECISION (inner_mode);
5230 unsignedp = 0;
5231 break;
5232
5233 case SIGN_EXTRACT:
5234 case ZERO_EXTRACT:
5235 if (is_a <scalar_int_mode> (GET_MODE (XEXP (SET_SRC (x), 0)),
5236 &inner_mode)
5237 && CONST_INT_P (XEXP (SET_SRC (x), 1))
5238 && CONST_INT_P (XEXP (SET_SRC (x), 2)))
5239 {
5240 inner = XEXP (SET_SRC (x), 0);
5241 len = INTVAL (XEXP (SET_SRC (x), 1));
5242 pos = INTVAL (XEXP (SET_SRC (x), 2));
5243
5244 if (BITS_BIG_ENDIAN)
5245 pos = GET_MODE_PRECISION (inner_mode) - len - pos;
5246 unsignedp = (code == ZERO_EXTRACT);
5247 }
5248 break;
5249
5250 default:
5251 break;
5252 }
5253
5254 if (len
5255 && known_subrange_p (pos, len,
5256 0, GET_MODE_PRECISION (GET_MODE (inner)))
5257 && is_a <scalar_int_mode> (GET_MODE (SET_SRC (x)), &mode))
5258 {
5259 /* For unsigned, we have a choice of a shift followed by an
5260 AND or two shifts. Use two shifts for field sizes where the
5261 constant might be too large. We assume here that we can
5262 always at least get 8-bit constants in an AND insn, which is
5263 true for every current RISC. */
5264
5265 if (unsignedp && len <= 8)
5266 {
5267 unsigned HOST_WIDE_INT mask
5268 = (HOST_WIDE_INT_1U << len) - 1;
5269 rtx pos_rtx = gen_int_shift_amount (mode, pos);
5270 SUBST (SET_SRC (x),
5271 gen_rtx_AND (mode,
5272 gen_rtx_LSHIFTRT
5273 (mode, gen_lowpart (mode, inner), pos_rtx),
5274 gen_int_mode (mask, mode)));
5275
5276 split = find_split_point (&SET_SRC (x), insn, true);
5277 if (split && split != &SET_SRC (x))
5278 return split;
5279 }
5280 else
5281 {
5282 int left_bits = GET_MODE_PRECISION (mode) - len - pos;
5283 int right_bits = GET_MODE_PRECISION (mode) - len;
5284 SUBST (SET_SRC (x),
5285 gen_rtx_fmt_ee
5286 (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
5287 gen_rtx_ASHIFT (mode,
5288 gen_lowpart (mode, inner),
5289 gen_int_shift_amount (mode, left_bits)),
5290 gen_int_shift_amount (mode, right_bits)));
5291
5292 split = find_split_point (&SET_SRC (x), insn, true);
5293 if (split && split != &SET_SRC (x))
5294 return split;
5295 }
5296 }
5297
5298 /* See if this is a simple operation with a constant as the second
5299 operand. It might be that this constant is out of range and hence
5300 could be used as a split point. */
5301 if (BINARY_P (SET_SRC (x))
5302 && CONSTANT_P (XEXP (SET_SRC (x), 1))
5303 && (OBJECT_P (XEXP (SET_SRC (x), 0))
5304 || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
5305 && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
5306 return &XEXP (SET_SRC (x), 1);
5307
5308 /* Finally, see if this is a simple operation with its first operand
5309 not in a register. The operation might require this operand in a
5310 register, so return it as a split point. We can always do this
5311 because if the first operand were another operation, we would have
5312 already found it as a split point. */
5313 if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
5314 && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
5315 return &XEXP (SET_SRC (x), 0);
5316
5317 return 0;
5318
5319 case AND:
5320 case IOR:
5321 /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
5322 it is better to write this as (not (ior A B)) so we can split it.
5323 Similarly for IOR. */
5324 if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
5325 {
5326 SUBST (*loc,
5327 gen_rtx_NOT (GET_MODE (x),
5328 gen_rtx_fmt_ee (code == IOR ? AND : IOR,
5329 GET_MODE (x),
5330 XEXP (XEXP (x, 0), 0),
5331 XEXP (XEXP (x, 1), 0))));
5332 return find_split_point (loc, insn, set_src);
5333 }
5334
5335 /* Many RISC machines have a large set of logical insns. If the
5336 second operand is a NOT, put it first so we will try to split the
5337 other operand first. */
5338 if (GET_CODE (XEXP (x, 1)) == NOT)
5339 {
5340 rtx tem = XEXP (x, 0);
5341 SUBST (XEXP (x, 0), XEXP (x, 1));
5342 SUBST (XEXP (x, 1), tem);
5343 }
5344 break;
5345
5346 case PLUS:
5347 case MINUS:
5348 /* Canonicalization can produce (minus A (mult B C)), where C is a
5349 constant. It may be better to try splitting (plus (mult B -C) A)
5350 instead if this isn't a multiply by a power of two. */
5351 if (set_src && code == MINUS && GET_CODE (XEXP (x, 1)) == MULT
5352 && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
5353 && !pow2p_hwi (INTVAL (XEXP (XEXP (x, 1), 1))))
5354 {
5355 machine_mode mode = GET_MODE (x);
5356 unsigned HOST_WIDE_INT this_int = INTVAL (XEXP (XEXP (x, 1), 1));
5357 HOST_WIDE_INT other_int = trunc_int_for_mode (-this_int, mode);
5358 SUBST (*loc, gen_rtx_PLUS (mode,
5359 gen_rtx_MULT (mode,
5360 XEXP (XEXP (x, 1), 0),
5361 gen_int_mode (other_int,
5362 mode)),
5363 XEXP (x, 0)));
5364 return find_split_point (loc, insn, set_src);
5365 }
5366
5367 /* Split at a multiply-accumulate instruction. However if this is
5368 the SET_SRC, we likely do not have such an instruction and it's
5369 worthless to try this split. */
5370 if (!set_src
5371 && (GET_CODE (XEXP (x, 0)) == MULT
5372 || (GET_CODE (XEXP (x, 0)) == ASHIFT
5373 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)))
5374 return loc;
5375
5376 default:
5377 break;
5378 }
5379
5380 /* Otherwise, select our actions depending on our rtx class. */
5381 switch (GET_RTX_CLASS (code))
5382 {
5383 case RTX_BITFIELD_OPS: /* This is ZERO_EXTRACT and SIGN_EXTRACT. */
5384 case RTX_TERNARY:
5385 split = find_split_point (&XEXP (x, 2), insn, false);
5386 if (split)
5387 return split;
5388 /* fall through */
5389 case RTX_BIN_ARITH:
5390 case RTX_COMM_ARITH:
5391 case RTX_COMPARE:
5392 case RTX_COMM_COMPARE:
5393 split = find_split_point (&XEXP (x, 1), insn, false);
5394 if (split)
5395 return split;
5396 /* fall through */
5397 case RTX_UNARY:
5398 /* Some machines have (and (shift ...) ...) insns. If X is not
5399 an AND, but XEXP (X, 0) is, use it as our split point. */
5400 if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
5401 return &XEXP (x, 0);
5402
5403 split = find_split_point (&XEXP (x, 0), insn, false);
5404 if (split)
5405 return split;
5406 return loc;
5407
5408 default:
5409 /* Otherwise, we don't have a split point. */
5410 return 0;
5411 }
5412 }
5413 \f
5414 /* Throughout X, replace FROM with TO, and return the result.
5415 The result is TO if X is FROM;
5416 otherwise the result is X, but its contents may have been modified.
5417 If they were modified, a record was made in undobuf so that
5418 undo_all will (among other things) return X to its original state.
5419
5420 If the number of changes necessary is too much to record to undo,
5421 the excess changes are not made, so the result is invalid.
5422 The changes already made can still be undone.
5423 undobuf.num_undo is incremented for such changes, so by testing that
5424 the caller can tell whether the result is valid.
5425
5426 `n_occurrences' is incremented each time FROM is replaced.
5427
5428 IN_DEST is nonzero if we are processing the SET_DEST of a SET.
5429
5430 IN_COND is nonzero if we are at the top level of a condition.
5431
5432 UNIQUE_COPY is nonzero if each substitution must be unique. We do this
5433 by copying if `n_occurrences' is nonzero. */
5434
5435 static rtx
5436 subst (rtx x, rtx from, rtx to, int in_dest, int in_cond, int unique_copy)
5437 {
5438 enum rtx_code code = GET_CODE (x);
5439 machine_mode op0_mode = VOIDmode;
5440 const char *fmt;
5441 int len, i;
5442 rtx new_rtx;
5443
5444 /* Two expressions are equal if they are identical copies of a shared
5445 RTX or if they are both registers with the same register number
5446 and mode. */
5447
5448 #define COMBINE_RTX_EQUAL_P(X,Y) \
5449 ((X) == (Y) \
5450 || (REG_P (X) && REG_P (Y) \
5451 && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
5452
5453 /* Do not substitute into clobbers of regs -- this will never result in
5454 valid RTL. */
5455 if (GET_CODE (x) == CLOBBER && REG_P (XEXP (x, 0)))
5456 return x;
5457
5458 if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
5459 {
5460 n_occurrences++;
5461 return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
5462 }
5463
5464 /* If X and FROM are the same register but different modes, they
5465 will not have been seen as equal above. However, the log links code
5466 will make a LOG_LINKS entry for that case. If we do nothing, we
5467 will try to rerecognize our original insn and, when it succeeds,
5468 we will delete the feeding insn, which is incorrect.
5469
5470 So force this insn not to match in this (rare) case. */
5471 if (! in_dest && code == REG && REG_P (from)
5472 && reg_overlap_mentioned_p (x, from))
5473 return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
5474
5475 /* If this is an object, we are done unless it is a MEM or LO_SUM, both
5476 of which may contain things that can be combined. */
5477 if (code != MEM && code != LO_SUM && OBJECT_P (x))
5478 return x;
5479
5480 /* It is possible to have a subexpression appear twice in the insn.
5481 Suppose that FROM is a register that appears within TO.
5482 Then, after that subexpression has been scanned once by `subst',
5483 the second time it is scanned, TO may be found. If we were
5484 to scan TO here, we would find FROM within it and create a
5485 self-referent rtl structure which is completely wrong. */
5486 if (COMBINE_RTX_EQUAL_P (x, to))
5487 return to;
5488
5489 /* Parallel asm_operands need special attention because all of the
5490 inputs are shared across the arms. Furthermore, unsharing the
5491 rtl results in recognition failures. Failure to handle this case
5492 specially can result in circular rtl.
5493
5494 Solve this by doing a normal pass across the first entry of the
5495 parallel, and only processing the SET_DESTs of the subsequent
5496 entries. Ug. */
5497
5498 if (code == PARALLEL
5499 && GET_CODE (XVECEXP (x, 0, 0)) == SET
5500 && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
5501 {
5502 new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, 0, unique_copy);
5503
5504 /* If this substitution failed, this whole thing fails. */
5505 if (GET_CODE (new_rtx) == CLOBBER
5506 && XEXP (new_rtx, 0) == const0_rtx)
5507 return new_rtx;
5508
5509 SUBST (XVECEXP (x, 0, 0), new_rtx);
5510
5511 for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
5512 {
5513 rtx dest = SET_DEST (XVECEXP (x, 0, i));
5514
5515 if (!REG_P (dest)
5516 && GET_CODE (dest) != CC0
5517 && GET_CODE (dest) != PC)
5518 {
5519 new_rtx = subst (dest, from, to, 0, 0, unique_copy);
5520
5521 /* If this substitution failed, this whole thing fails. */
5522 if (GET_CODE (new_rtx) == CLOBBER
5523 && XEXP (new_rtx, 0) == const0_rtx)
5524 return new_rtx;
5525
5526 SUBST (SET_DEST (XVECEXP (x, 0, i)), new_rtx);
5527 }
5528 }
5529 }
5530 else
5531 {
5532 len = GET_RTX_LENGTH (code);
5533 fmt = GET_RTX_FORMAT (code);
5534
5535 /* We don't need to process a SET_DEST that is a register, CC0,
5536 or PC, so set up to skip this common case. All other cases
5537 where we want to suppress replacing something inside a
5538 SET_SRC are handled via the IN_DEST operand. */
5539 if (code == SET
5540 && (REG_P (SET_DEST (x))
5541 || GET_CODE (SET_DEST (x)) == CC0
5542 || GET_CODE (SET_DEST (x)) == PC))
5543 fmt = "ie";
5544
5545 /* Trying to simplify the operands of a widening MULT is not likely
5546 to create RTL matching a machine insn. */
5547 if (code == MULT
5548 && (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
5549 || GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
5550 && (GET_CODE (XEXP (x, 1)) == ZERO_EXTEND
5551 || GET_CODE (XEXP (x, 1)) == SIGN_EXTEND)
5552 && REG_P (XEXP (XEXP (x, 0), 0))
5553 && REG_P (XEXP (XEXP (x, 1), 0))
5554 && from == to)
5555 return x;
5556
5557
5558 /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
5559 constant. */
5560 if (fmt[0] == 'e')
5561 op0_mode = GET_MODE (XEXP (x, 0));
5562
5563 for (i = 0; i < len; i++)
5564 {
5565 if (fmt[i] == 'E')
5566 {
5567 int j;
5568 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
5569 {
5570 if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
5571 {
5572 new_rtx = (unique_copy && n_occurrences
5573 ? copy_rtx (to) : to);
5574 n_occurrences++;
5575 }
5576 else
5577 {
5578 new_rtx = subst (XVECEXP (x, i, j), from, to, 0, 0,
5579 unique_copy);
5580
5581 /* If this substitution failed, this whole thing
5582 fails. */
5583 if (GET_CODE (new_rtx) == CLOBBER
5584 && XEXP (new_rtx, 0) == const0_rtx)
5585 return new_rtx;
5586 }
5587
5588 SUBST (XVECEXP (x, i, j), new_rtx);
5589 }
5590 }
5591 else if (fmt[i] == 'e')
5592 {
5593 /* If this is a register being set, ignore it. */
5594 new_rtx = XEXP (x, i);
5595 if (in_dest
5596 && i == 0
5597 && (((code == SUBREG || code == ZERO_EXTRACT)
5598 && REG_P (new_rtx))
5599 || code == STRICT_LOW_PART))
5600 ;
5601
5602 else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
5603 {
5604 /* In general, don't install a subreg involving two
5605 modes not tieable. It can worsen register
5606 allocation, and can even make invalid reload
5607 insns, since the reg inside may need to be copied
5608 from in the outside mode, and that may be invalid
5609 if it is an fp reg copied in integer mode.
5610
5611 We allow two exceptions to this: It is valid if
5612 it is inside another SUBREG and the mode of that
5613 SUBREG and the mode of the inside of TO is
5614 tieable and it is valid if X is a SET that copies
5615 FROM to CC0. */
5616
5617 if (GET_CODE (to) == SUBREG
5618 && !targetm.modes_tieable_p (GET_MODE (to),
5619 GET_MODE (SUBREG_REG (to)))
5620 && ! (code == SUBREG
5621 && (targetm.modes_tieable_p
5622 (GET_MODE (x), GET_MODE (SUBREG_REG (to)))))
5623 && (!HAVE_cc0
5624 || (! (code == SET
5625 && i == 1
5626 && XEXP (x, 0) == cc0_rtx))))
5627 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5628
5629 if (code == SUBREG
5630 && REG_P (to)
5631 && REGNO (to) < FIRST_PSEUDO_REGISTER
5632 && simplify_subreg_regno (REGNO (to), GET_MODE (to),
5633 SUBREG_BYTE (x),
5634 GET_MODE (x)) < 0)
5635 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5636
5637 new_rtx = (unique_copy && n_occurrences ? copy_rtx (to) : to);
5638 n_occurrences++;
5639 }
5640 else
5641 /* If we are in a SET_DEST, suppress most cases unless we
5642 have gone inside a MEM, in which case we want to
5643 simplify the address. We assume here that things that
5644 are actually part of the destination have their inner
5645 parts in the first expression. This is true for SUBREG,
5646 STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
5647 things aside from REG and MEM that should appear in a
5648 SET_DEST. */
5649 new_rtx = subst (XEXP (x, i), from, to,
5650 (((in_dest
5651 && (code == SUBREG || code == STRICT_LOW_PART
5652 || code == ZERO_EXTRACT))
5653 || code == SET)
5654 && i == 0),
5655 code == IF_THEN_ELSE && i == 0,
5656 unique_copy);
5657
5658 /* If we found that we will have to reject this combination,
5659 indicate that by returning the CLOBBER ourselves, rather than
5660 an expression containing it. This will speed things up as
5661 well as prevent accidents where two CLOBBERs are considered
5662 to be equal, thus producing an incorrect simplification. */
5663
5664 if (GET_CODE (new_rtx) == CLOBBER && XEXP (new_rtx, 0) == const0_rtx)
5665 return new_rtx;
5666
5667 if (GET_CODE (x) == SUBREG && CONST_SCALAR_INT_P (new_rtx))
5668 {
5669 machine_mode mode = GET_MODE (x);
5670
5671 x = simplify_subreg (GET_MODE (x), new_rtx,
5672 GET_MODE (SUBREG_REG (x)),
5673 SUBREG_BYTE (x));
5674 if (! x)
5675 x = gen_rtx_CLOBBER (mode, const0_rtx);
5676 }
5677 else if (CONST_SCALAR_INT_P (new_rtx)
5678 && (GET_CODE (x) == ZERO_EXTEND
5679 || GET_CODE (x) == SIGN_EXTEND
5680 || GET_CODE (x) == FLOAT
5681 || GET_CODE (x) == UNSIGNED_FLOAT))
5682 {
5683 x = simplify_unary_operation (GET_CODE (x), GET_MODE (x),
5684 new_rtx,
5685 GET_MODE (XEXP (x, 0)));
5686 if (!x)
5687 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5688 }
5689 else
5690 SUBST (XEXP (x, i), new_rtx);
5691 }
5692 }
5693 }
5694
5695 /* Check if we are loading something from the constant pool via float
5696 extension; in this case we would undo compress_float_constant
5697 optimization and degenerate constant load to an immediate value. */
5698 if (GET_CODE (x) == FLOAT_EXTEND
5699 && MEM_P (XEXP (x, 0))
5700 && MEM_READONLY_P (XEXP (x, 0)))
5701 {
5702 rtx tmp = avoid_constant_pool_reference (x);
5703 if (x != tmp)
5704 return x;
5705 }
5706
5707 /* Try to simplify X. If the simplification changed the code, it is likely
5708 that further simplification will help, so loop, but limit the number
5709 of repetitions that will be performed. */
5710
5711 for (i = 0; i < 4; i++)
5712 {
5713 /* If X is sufficiently simple, don't bother trying to do anything
5714 with it. */
5715 if (code != CONST_INT && code != REG && code != CLOBBER)
5716 x = combine_simplify_rtx (x, op0_mode, in_dest, in_cond);
5717
5718 if (GET_CODE (x) == code)
5719 break;
5720
5721 code = GET_CODE (x);
5722
5723 /* We no longer know the original mode of operand 0 since we
5724 have changed the form of X) */
5725 op0_mode = VOIDmode;
5726 }
5727
5728 return x;
5729 }
5730 \f
5731 /* If X is a commutative operation whose operands are not in the canonical
5732 order, use substitutions to swap them. */
5733
5734 static void
5735 maybe_swap_commutative_operands (rtx x)
5736 {
5737 if (COMMUTATIVE_ARITH_P (x)
5738 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
5739 {
5740 rtx temp = XEXP (x, 0);
5741 SUBST (XEXP (x, 0), XEXP (x, 1));
5742 SUBST (XEXP (x, 1), temp);
5743 }
5744 }
5745
5746 /* Simplify X, a piece of RTL. We just operate on the expression at the
5747 outer level; call `subst' to simplify recursively. Return the new
5748 expression.
5749
5750 OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero
5751 if we are inside a SET_DEST. IN_COND is nonzero if we are at the top level
5752 of a condition. */
5753
5754 static rtx
5755 combine_simplify_rtx (rtx x, machine_mode op0_mode, int in_dest,
5756 int in_cond)
5757 {
5758 enum rtx_code code = GET_CODE (x);
5759 machine_mode mode = GET_MODE (x);
5760 scalar_int_mode int_mode;
5761 rtx temp;
5762 int i;
5763
5764 /* If this is a commutative operation, put a constant last and a complex
5765 expression first. We don't need to do this for comparisons here. */
5766 maybe_swap_commutative_operands (x);
5767
5768 /* Try to fold this expression in case we have constants that weren't
5769 present before. */
5770 temp = 0;
5771 switch (GET_RTX_CLASS (code))
5772 {
5773 case RTX_UNARY:
5774 if (op0_mode == VOIDmode)
5775 op0_mode = GET_MODE (XEXP (x, 0));
5776 temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
5777 break;
5778 case RTX_COMPARE:
5779 case RTX_COMM_COMPARE:
5780 {
5781 machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
5782 if (cmp_mode == VOIDmode)
5783 {
5784 cmp_mode = GET_MODE (XEXP (x, 1));
5785 if (cmp_mode == VOIDmode)
5786 cmp_mode = op0_mode;
5787 }
5788 temp = simplify_relational_operation (code, mode, cmp_mode,
5789 XEXP (x, 0), XEXP (x, 1));
5790 }
5791 break;
5792 case RTX_COMM_ARITH:
5793 case RTX_BIN_ARITH:
5794 temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
5795 break;
5796 case RTX_BITFIELD_OPS:
5797 case RTX_TERNARY:
5798 temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
5799 XEXP (x, 1), XEXP (x, 2));
5800 break;
5801 default:
5802 break;
5803 }
5804
5805 if (temp)
5806 {
5807 x = temp;
5808 code = GET_CODE (temp);
5809 op0_mode = VOIDmode;
5810 mode = GET_MODE (temp);
5811 }
5812
5813 /* If this is a simple operation applied to an IF_THEN_ELSE, try
5814 applying it to the arms of the IF_THEN_ELSE. This often simplifies
5815 things. Check for cases where both arms are testing the same
5816 condition.
5817
5818 Don't do anything if all operands are very simple. */
5819
5820 if ((BINARY_P (x)
5821 && ((!OBJECT_P (XEXP (x, 0))
5822 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5823 && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
5824 || (!OBJECT_P (XEXP (x, 1))
5825 && ! (GET_CODE (XEXP (x, 1)) == SUBREG
5826 && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
5827 || (UNARY_P (x)
5828 && (!OBJECT_P (XEXP (x, 0))
5829 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5830 && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
5831 {
5832 rtx cond, true_rtx, false_rtx;
5833
5834 cond = if_then_else_cond (x, &true_rtx, &false_rtx);
5835 if (cond != 0
5836 /* If everything is a comparison, what we have is highly unlikely
5837 to be simpler, so don't use it. */
5838 && ! (COMPARISON_P (x)
5839 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx)))
5840 /* Similarly, if we end up with one of the expressions the same
5841 as the original, it is certainly not simpler. */
5842 && ! rtx_equal_p (x, true_rtx)
5843 && ! rtx_equal_p (x, false_rtx))
5844 {
5845 rtx cop1 = const0_rtx;
5846 enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
5847
5848 if (cond_code == NE && COMPARISON_P (cond))
5849 return x;
5850
5851 /* Simplify the alternative arms; this may collapse the true and
5852 false arms to store-flag values. Be careful to use copy_rtx
5853 here since true_rtx or false_rtx might share RTL with x as a
5854 result of the if_then_else_cond call above. */
5855 true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0, 0);
5856 false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0, 0);
5857
5858 /* If true_rtx and false_rtx are not general_operands, an if_then_else
5859 is unlikely to be simpler. */
5860 if (general_operand (true_rtx, VOIDmode)
5861 && general_operand (false_rtx, VOIDmode))
5862 {
5863 enum rtx_code reversed;
5864
5865 /* Restarting if we generate a store-flag expression will cause
5866 us to loop. Just drop through in this case. */
5867
5868 /* If the result values are STORE_FLAG_VALUE and zero, we can
5869 just make the comparison operation. */
5870 if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
5871 x = simplify_gen_relational (cond_code, mode, VOIDmode,
5872 cond, cop1);
5873 else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
5874 && ((reversed = reversed_comparison_code_parts
5875 (cond_code, cond, cop1, NULL))
5876 != UNKNOWN))
5877 x = simplify_gen_relational (reversed, mode, VOIDmode,
5878 cond, cop1);
5879
5880 /* Likewise, we can make the negate of a comparison operation
5881 if the result values are - STORE_FLAG_VALUE and zero. */
5882 else if (CONST_INT_P (true_rtx)
5883 && INTVAL (true_rtx) == - STORE_FLAG_VALUE
5884 && false_rtx == const0_rtx)
5885 x = simplify_gen_unary (NEG, mode,
5886 simplify_gen_relational (cond_code,
5887 mode, VOIDmode,
5888 cond, cop1),
5889 mode);
5890 else if (CONST_INT_P (false_rtx)
5891 && INTVAL (false_rtx) == - STORE_FLAG_VALUE
5892 && true_rtx == const0_rtx
5893 && ((reversed = reversed_comparison_code_parts
5894 (cond_code, cond, cop1, NULL))
5895 != UNKNOWN))
5896 x = simplify_gen_unary (NEG, mode,
5897 simplify_gen_relational (reversed,
5898 mode, VOIDmode,
5899 cond, cop1),
5900 mode);
5901
5902 code = GET_CODE (x);
5903 op0_mode = VOIDmode;
5904 }
5905 }
5906 }
5907
5908 /* First see if we can apply the inverse distributive law. */
5909 if (code == PLUS || code == MINUS
5910 || code == AND || code == IOR || code == XOR)
5911 {
5912 x = apply_distributive_law (x);
5913 code = GET_CODE (x);
5914 op0_mode = VOIDmode;
5915 }
5916
5917 /* If CODE is an associative operation not otherwise handled, see if we
5918 can associate some operands. This can win if they are constants or
5919 if they are logically related (i.e. (a & b) & a). */
5920 if ((code == PLUS || code == MINUS || code == MULT || code == DIV
5921 || code == AND || code == IOR || code == XOR
5922 || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
5923 && ((INTEGRAL_MODE_P (mode) && code != DIV)
5924 || (flag_associative_math && FLOAT_MODE_P (mode))))
5925 {
5926 if (GET_CODE (XEXP (x, 0)) == code)
5927 {
5928 rtx other = XEXP (XEXP (x, 0), 0);
5929 rtx inner_op0 = XEXP (XEXP (x, 0), 1);
5930 rtx inner_op1 = XEXP (x, 1);
5931 rtx inner;
5932
5933 /* Make sure we pass the constant operand if any as the second
5934 one if this is a commutative operation. */
5935 if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
5936 std::swap (inner_op0, inner_op1);
5937 inner = simplify_binary_operation (code == MINUS ? PLUS
5938 : code == DIV ? MULT
5939 : code,
5940 mode, inner_op0, inner_op1);
5941
5942 /* For commutative operations, try the other pair if that one
5943 didn't simplify. */
5944 if (inner == 0 && COMMUTATIVE_ARITH_P (x))
5945 {
5946 other = XEXP (XEXP (x, 0), 1);
5947 inner = simplify_binary_operation (code, mode,
5948 XEXP (XEXP (x, 0), 0),
5949 XEXP (x, 1));
5950 }
5951
5952 if (inner)
5953 return simplify_gen_binary (code, mode, other, inner);
5954 }
5955 }
5956
5957 /* A little bit of algebraic simplification here. */
5958 switch (code)
5959 {
5960 case MEM:
5961 /* Ensure that our address has any ASHIFTs converted to MULT in case
5962 address-recognizing predicates are called later. */
5963 temp = make_compound_operation (XEXP (x, 0), MEM);
5964 SUBST (XEXP (x, 0), temp);
5965 break;
5966
5967 case SUBREG:
5968 if (op0_mode == VOIDmode)
5969 op0_mode = GET_MODE (SUBREG_REG (x));
5970
5971 /* See if this can be moved to simplify_subreg. */
5972 if (CONSTANT_P (SUBREG_REG (x))
5973 && known_eq (subreg_lowpart_offset (mode, op0_mode), SUBREG_BYTE (x))
5974 /* Don't call gen_lowpart if the inner mode
5975 is VOIDmode and we cannot simplify it, as SUBREG without
5976 inner mode is invalid. */
5977 && (GET_MODE (SUBREG_REG (x)) != VOIDmode
5978 || gen_lowpart_common (mode, SUBREG_REG (x))))
5979 return gen_lowpart (mode, SUBREG_REG (x));
5980
5981 if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
5982 break;
5983 {
5984 rtx temp;
5985 temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
5986 SUBREG_BYTE (x));
5987 if (temp)
5988 return temp;
5989
5990 /* If op is known to have all lower bits zero, the result is zero. */
5991 scalar_int_mode int_mode, int_op0_mode;
5992 if (!in_dest
5993 && is_a <scalar_int_mode> (mode, &int_mode)
5994 && is_a <scalar_int_mode> (op0_mode, &int_op0_mode)
5995 && (GET_MODE_PRECISION (int_mode)
5996 < GET_MODE_PRECISION (int_op0_mode))
5997 && known_eq (subreg_lowpart_offset (int_mode, int_op0_mode),
5998 SUBREG_BYTE (x))
5999 && HWI_COMPUTABLE_MODE_P (int_op0_mode)
6000 && ((nonzero_bits (SUBREG_REG (x), int_op0_mode)
6001 & GET_MODE_MASK (int_mode)) == 0)
6002 && !side_effects_p (SUBREG_REG (x)))
6003 return CONST0_RTX (int_mode);
6004 }
6005
6006 /* Don't change the mode of the MEM if that would change the meaning
6007 of the address. */
6008 if (MEM_P (SUBREG_REG (x))
6009 && (MEM_VOLATILE_P (SUBREG_REG (x))
6010 || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0),
6011 MEM_ADDR_SPACE (SUBREG_REG (x)))))
6012 return gen_rtx_CLOBBER (mode, const0_rtx);
6013
6014 /* Note that we cannot do any narrowing for non-constants since
6015 we might have been counting on using the fact that some bits were
6016 zero. We now do this in the SET. */
6017
6018 break;
6019
6020 case NEG:
6021 temp = expand_compound_operation (XEXP (x, 0));
6022
6023 /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
6024 replaced by (lshiftrt X C). This will convert
6025 (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */
6026
6027 if (GET_CODE (temp) == ASHIFTRT
6028 && CONST_INT_P (XEXP (temp, 1))
6029 && INTVAL (XEXP (temp, 1)) == GET_MODE_UNIT_PRECISION (mode) - 1)
6030 return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (temp, 0),
6031 INTVAL (XEXP (temp, 1)));
6032
6033 /* If X has only a single bit that might be nonzero, say, bit I, convert
6034 (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
6035 MODE minus 1. This will convert (neg (zero_extract X 1 Y)) to
6036 (sign_extract X 1 Y). But only do this if TEMP isn't a register
6037 or a SUBREG of one since we'd be making the expression more
6038 complex if it was just a register. */
6039
6040 if (!REG_P (temp)
6041 && ! (GET_CODE (temp) == SUBREG
6042 && REG_P (SUBREG_REG (temp)))
6043 && is_a <scalar_int_mode> (mode, &int_mode)
6044 && (i = exact_log2 (nonzero_bits (temp, int_mode))) >= 0)
6045 {
6046 rtx temp1 = simplify_shift_const
6047 (NULL_RTX, ASHIFTRT, int_mode,
6048 simplify_shift_const (NULL_RTX, ASHIFT, int_mode, temp,
6049 GET_MODE_PRECISION (int_mode) - 1 - i),
6050 GET_MODE_PRECISION (int_mode) - 1 - i);
6051
6052 /* If all we did was surround TEMP with the two shifts, we
6053 haven't improved anything, so don't use it. Otherwise,
6054 we are better off with TEMP1. */
6055 if (GET_CODE (temp1) != ASHIFTRT
6056 || GET_CODE (XEXP (temp1, 0)) != ASHIFT
6057 || XEXP (XEXP (temp1, 0), 0) != temp)
6058 return temp1;
6059 }
6060 break;
6061
6062 case TRUNCATE:
6063 /* We can't handle truncation to a partial integer mode here
6064 because we don't know the real bitsize of the partial
6065 integer mode. */
6066 if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
6067 break;
6068
6069 if (HWI_COMPUTABLE_MODE_P (mode))
6070 SUBST (XEXP (x, 0),
6071 force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
6072 GET_MODE_MASK (mode), 0));
6073
6074 /* We can truncate a constant value and return it. */
6075 {
6076 poly_int64 c;
6077 if (poly_int_rtx_p (XEXP (x, 0), &c))
6078 return gen_int_mode (c, mode);
6079 }
6080
6081 /* Similarly to what we do in simplify-rtx.c, a truncate of a register
6082 whose value is a comparison can be replaced with a subreg if
6083 STORE_FLAG_VALUE permits. */
6084 if (HWI_COMPUTABLE_MODE_P (mode)
6085 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
6086 && (temp = get_last_value (XEXP (x, 0)))
6087 && COMPARISON_P (temp))
6088 return gen_lowpart (mode, XEXP (x, 0));
6089 break;
6090
6091 case CONST:
6092 /* (const (const X)) can become (const X). Do it this way rather than
6093 returning the inner CONST since CONST can be shared with a
6094 REG_EQUAL note. */
6095 if (GET_CODE (XEXP (x, 0)) == CONST)
6096 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
6097 break;
6098
6099 case LO_SUM:
6100 /* Convert (lo_sum (high FOO) FOO) to FOO. This is necessary so we
6101 can add in an offset. find_split_point will split this address up
6102 again if it doesn't match. */
6103 if (HAVE_lo_sum && GET_CODE (XEXP (x, 0)) == HIGH
6104 && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
6105 return XEXP (x, 1);
6106 break;
6107
6108 case PLUS:
6109 /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
6110 when c is (const_int (pow2 + 1) / 2) is a sign extension of a
6111 bit-field and can be replaced by either a sign_extend or a
6112 sign_extract. The `and' may be a zero_extend and the two
6113 <c>, -<c> constants may be reversed. */
6114 if (GET_CODE (XEXP (x, 0)) == XOR
6115 && is_a <scalar_int_mode> (mode, &int_mode)
6116 && CONST_INT_P (XEXP (x, 1))
6117 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
6118 && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
6119 && ((i = exact_log2 (UINTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
6120 || (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0)
6121 && HWI_COMPUTABLE_MODE_P (int_mode)
6122 && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
6123 && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
6124 && (UINTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
6125 == (HOST_WIDE_INT_1U << (i + 1)) - 1))
6126 || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
6127 && known_eq ((GET_MODE_PRECISION
6128 (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))),
6129 (unsigned int) i + 1))))
6130 return simplify_shift_const
6131 (NULL_RTX, ASHIFTRT, int_mode,
6132 simplify_shift_const (NULL_RTX, ASHIFT, int_mode,
6133 XEXP (XEXP (XEXP (x, 0), 0), 0),
6134 GET_MODE_PRECISION (int_mode) - (i + 1)),
6135 GET_MODE_PRECISION (int_mode) - (i + 1));
6136
6137 /* If only the low-order bit of X is possibly nonzero, (plus x -1)
6138 can become (ashiftrt (ashift (xor x 1) C) C) where C is
6139 the bitsize of the mode - 1. This allows simplification of
6140 "a = (b & 8) == 0;" */
6141 if (XEXP (x, 1) == constm1_rtx
6142 && !REG_P (XEXP (x, 0))
6143 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
6144 && REG_P (SUBREG_REG (XEXP (x, 0))))
6145 && is_a <scalar_int_mode> (mode, &int_mode)
6146 && nonzero_bits (XEXP (x, 0), int_mode) == 1)
6147 return simplify_shift_const
6148 (NULL_RTX, ASHIFTRT, int_mode,
6149 simplify_shift_const (NULL_RTX, ASHIFT, int_mode,
6150 gen_rtx_XOR (int_mode, XEXP (x, 0),
6151 const1_rtx),
6152 GET_MODE_PRECISION (int_mode) - 1),
6153 GET_MODE_PRECISION (int_mode) - 1);
6154
6155 /* If we are adding two things that have no bits in common, convert
6156 the addition into an IOR. This will often be further simplified,
6157 for example in cases like ((a & 1) + (a & 2)), which can
6158 become a & 3. */
6159
6160 if (HWI_COMPUTABLE_MODE_P (mode)
6161 && (nonzero_bits (XEXP (x, 0), mode)
6162 & nonzero_bits (XEXP (x, 1), mode)) == 0)
6163 {
6164 /* Try to simplify the expression further. */
6165 rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
6166 temp = combine_simplify_rtx (tor, VOIDmode, in_dest, 0);
6167
6168 /* If we could, great. If not, do not go ahead with the IOR
6169 replacement, since PLUS appears in many special purpose
6170 address arithmetic instructions. */
6171 if (GET_CODE (temp) != CLOBBER
6172 && (GET_CODE (temp) != IOR
6173 || ((XEXP (temp, 0) != XEXP (x, 0)
6174 || XEXP (temp, 1) != XEXP (x, 1))
6175 && (XEXP (temp, 0) != XEXP (x, 1)
6176 || XEXP (temp, 1) != XEXP (x, 0)))))
6177 return temp;
6178 }
6179
6180 /* Canonicalize x + x into x << 1. */
6181 if (GET_MODE_CLASS (mode) == MODE_INT
6182 && rtx_equal_p (XEXP (x, 0), XEXP (x, 1))
6183 && !side_effects_p (XEXP (x, 0)))
6184 return simplify_gen_binary (ASHIFT, mode, XEXP (x, 0), const1_rtx);
6185
6186 break;
6187
6188 case MINUS:
6189 /* (minus <foo> (and <foo> (const_int -pow2))) becomes
6190 (and <foo> (const_int pow2-1)) */
6191 if (is_a <scalar_int_mode> (mode, &int_mode)
6192 && GET_CODE (XEXP (x, 1)) == AND
6193 && CONST_INT_P (XEXP (XEXP (x, 1), 1))
6194 && pow2p_hwi (-UINTVAL (XEXP (XEXP (x, 1), 1)))
6195 && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
6196 return simplify_and_const_int (NULL_RTX, int_mode, XEXP (x, 0),
6197 -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
6198 break;
6199
6200 case MULT:
6201 /* If we have (mult (plus A B) C), apply the distributive law and then
6202 the inverse distributive law to see if things simplify. This
6203 occurs mostly in addresses, often when unrolling loops. */
6204
6205 if (GET_CODE (XEXP (x, 0)) == PLUS)
6206 {
6207 rtx result = distribute_and_simplify_rtx (x, 0);
6208 if (result)
6209 return result;
6210 }
6211
6212 /* Try simplify a*(b/c) as (a*b)/c. */
6213 if (FLOAT_MODE_P (mode) && flag_associative_math
6214 && GET_CODE (XEXP (x, 0)) == DIV)
6215 {
6216 rtx tem = simplify_binary_operation (MULT, mode,
6217 XEXP (XEXP (x, 0), 0),
6218 XEXP (x, 1));
6219 if (tem)
6220 return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
6221 }
6222 break;
6223
6224 case UDIV:
6225 /* If this is a divide by a power of two, treat it as a shift if
6226 its first operand is a shift. */
6227 if (is_a <scalar_int_mode> (mode, &int_mode)
6228 && CONST_INT_P (XEXP (x, 1))
6229 && (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0
6230 && (GET_CODE (XEXP (x, 0)) == ASHIFT
6231 || GET_CODE (XEXP (x, 0)) == LSHIFTRT
6232 || GET_CODE (XEXP (x, 0)) == ASHIFTRT
6233 || GET_CODE (XEXP (x, 0)) == ROTATE
6234 || GET_CODE (XEXP (x, 0)) == ROTATERT))
6235 return simplify_shift_const (NULL_RTX, LSHIFTRT, int_mode,
6236 XEXP (x, 0), i);
6237 break;
6238
6239 case EQ: case NE:
6240 case GT: case GTU: case GE: case GEU:
6241 case LT: case LTU: case LE: case LEU:
6242 case UNEQ: case LTGT:
6243 case UNGT: case UNGE:
6244 case UNLT: case UNLE:
6245 case UNORDERED: case ORDERED:
6246 /* If the first operand is a condition code, we can't do anything
6247 with it. */
6248 if (GET_CODE (XEXP (x, 0)) == COMPARE
6249 || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
6250 && ! CC0_P (XEXP (x, 0))))
6251 {
6252 rtx op0 = XEXP (x, 0);
6253 rtx op1 = XEXP (x, 1);
6254 enum rtx_code new_code;
6255
6256 if (GET_CODE (op0) == COMPARE)
6257 op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
6258
6259 /* Simplify our comparison, if possible. */
6260 new_code = simplify_comparison (code, &op0, &op1);
6261
6262 /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
6263 if only the low-order bit is possibly nonzero in X (such as when
6264 X is a ZERO_EXTRACT of one bit). Similarly, we can convert EQ to
6265 (xor X 1) or (minus 1 X); we use the former. Finally, if X is
6266 known to be either 0 or -1, NE becomes a NEG and EQ becomes
6267 (plus X 1).
6268
6269 Remove any ZERO_EXTRACT we made when thinking this was a
6270 comparison. It may now be simpler to use, e.g., an AND. If a
6271 ZERO_EXTRACT is indeed appropriate, it will be placed back by
6272 the call to make_compound_operation in the SET case.
6273
6274 Don't apply these optimizations if the caller would
6275 prefer a comparison rather than a value.
6276 E.g., for the condition in an IF_THEN_ELSE most targets need
6277 an explicit comparison. */
6278
6279 if (in_cond)
6280 ;
6281
6282 else if (STORE_FLAG_VALUE == 1
6283 && new_code == NE
6284 && is_int_mode (mode, &int_mode)
6285 && op1 == const0_rtx
6286 && int_mode == GET_MODE (op0)
6287 && nonzero_bits (op0, int_mode) == 1)
6288 return gen_lowpart (int_mode,
6289 expand_compound_operation (op0));
6290
6291 else if (STORE_FLAG_VALUE == 1
6292 && new_code == NE
6293 && is_int_mode (mode, &int_mode)
6294 && op1 == const0_rtx
6295 && int_mode == GET_MODE (op0)
6296 && (num_sign_bit_copies (op0, int_mode)
6297 == GET_MODE_PRECISION (int_mode)))
6298 {
6299 op0 = expand_compound_operation (op0);
6300 return simplify_gen_unary (NEG, int_mode,
6301 gen_lowpart (int_mode, op0),
6302 int_mode);
6303 }
6304
6305 else if (STORE_FLAG_VALUE == 1
6306 && new_code == EQ
6307 && is_int_mode (mode, &int_mode)
6308 && op1 == const0_rtx
6309 && int_mode == GET_MODE (op0)
6310 && nonzero_bits (op0, int_mode) == 1)
6311 {
6312 op0 = expand_compound_operation (op0);
6313 return simplify_gen_binary (XOR, int_mode,
6314 gen_lowpart (int_mode, op0),
6315 const1_rtx);
6316 }
6317
6318 else if (STORE_FLAG_VALUE == 1
6319 && new_code == EQ
6320 && is_int_mode (mode, &int_mode)
6321 && op1 == const0_rtx
6322 && int_mode == GET_MODE (op0)
6323 && (num_sign_bit_copies (op0, int_mode)
6324 == GET_MODE_PRECISION (int_mode)))
6325 {
6326 op0 = expand_compound_operation (op0);
6327 return plus_constant (int_mode, gen_lowpart (int_mode, op0), 1);
6328 }
6329
6330 /* If STORE_FLAG_VALUE is -1, we have cases similar to
6331 those above. */
6332 if (in_cond)
6333 ;
6334
6335 else if (STORE_FLAG_VALUE == -1
6336 && new_code == NE
6337 && is_int_mode (mode, &int_mode)
6338 && op1 == const0_rtx
6339 && int_mode == GET_MODE (op0)
6340 && (num_sign_bit_copies (op0, int_mode)
6341 == GET_MODE_PRECISION (int_mode)))
6342 return gen_lowpart (int_mode, expand_compound_operation (op0));
6343
6344 else if (STORE_FLAG_VALUE == -1
6345 && new_code == NE
6346 && is_int_mode (mode, &int_mode)
6347 && op1 == const0_rtx
6348 && int_mode == GET_MODE (op0)
6349 && nonzero_bits (op0, int_mode) == 1)
6350 {
6351 op0 = expand_compound_operation (op0);
6352 return simplify_gen_unary (NEG, int_mode,
6353 gen_lowpart (int_mode, op0),
6354 int_mode);
6355 }
6356
6357 else if (STORE_FLAG_VALUE == -1
6358 && new_code == EQ
6359 && is_int_mode (mode, &int_mode)
6360 && op1 == const0_rtx
6361 && int_mode == GET_MODE (op0)
6362 && (num_sign_bit_copies (op0, int_mode)
6363 == GET_MODE_PRECISION (int_mode)))
6364 {
6365 op0 = expand_compound_operation (op0);
6366 return simplify_gen_unary (NOT, int_mode,
6367 gen_lowpart (int_mode, op0),
6368 int_mode);
6369 }
6370
6371 /* If X is 0/1, (eq X 0) is X-1. */
6372 else if (STORE_FLAG_VALUE == -1
6373 && new_code == EQ
6374 && is_int_mode (mode, &int_mode)
6375 && op1 == const0_rtx
6376 && int_mode == GET_MODE (op0)
6377 && nonzero_bits (op0, int_mode) == 1)
6378 {
6379 op0 = expand_compound_operation (op0);
6380 return plus_constant (int_mode, gen_lowpart (int_mode, op0), -1);
6381 }
6382
6383 /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
6384 one bit that might be nonzero, we can convert (ne x 0) to
6385 (ashift x c) where C puts the bit in the sign bit. Remove any
6386 AND with STORE_FLAG_VALUE when we are done, since we are only
6387 going to test the sign bit. */
6388 if (new_code == NE
6389 && is_int_mode (mode, &int_mode)
6390 && HWI_COMPUTABLE_MODE_P (int_mode)
6391 && val_signbit_p (int_mode, STORE_FLAG_VALUE)
6392 && op1 == const0_rtx
6393 && int_mode == GET_MODE (op0)
6394 && (i = exact_log2 (nonzero_bits (op0, int_mode))) >= 0)
6395 {
6396 x = simplify_shift_const (NULL_RTX, ASHIFT, int_mode,
6397 expand_compound_operation (op0),
6398 GET_MODE_PRECISION (int_mode) - 1 - i);
6399 if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
6400 return XEXP (x, 0);
6401 else
6402 return x;
6403 }
6404
6405 /* If the code changed, return a whole new comparison.
6406 We also need to avoid using SUBST in cases where
6407 simplify_comparison has widened a comparison with a CONST_INT,
6408 since in that case the wider CONST_INT may fail the sanity
6409 checks in do_SUBST. */
6410 if (new_code != code
6411 || (CONST_INT_P (op1)
6412 && GET_MODE (op0) != GET_MODE (XEXP (x, 0))
6413 && GET_MODE (op0) != GET_MODE (XEXP (x, 1))))
6414 return gen_rtx_fmt_ee (new_code, mode, op0, op1);
6415
6416 /* Otherwise, keep this operation, but maybe change its operands.
6417 This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR). */
6418 SUBST (XEXP (x, 0), op0);
6419 SUBST (XEXP (x, 1), op1);
6420 }
6421 break;
6422
6423 case IF_THEN_ELSE:
6424 return simplify_if_then_else (x);
6425
6426 case ZERO_EXTRACT:
6427 case SIGN_EXTRACT:
6428 case ZERO_EXTEND:
6429 case SIGN_EXTEND:
6430 /* If we are processing SET_DEST, we are done. */
6431 if (in_dest)
6432 return x;
6433
6434 return expand_compound_operation (x);
6435
6436 case SET:
6437 return simplify_set (x);
6438
6439 case AND:
6440 case IOR:
6441 return simplify_logical (x);
6442
6443 case ASHIFT:
6444 case LSHIFTRT:
6445 case ASHIFTRT:
6446 case ROTATE:
6447 case ROTATERT:
6448 /* If this is a shift by a constant amount, simplify it. */
6449 if (CONST_INT_P (XEXP (x, 1)))
6450 return simplify_shift_const (x, code, mode, XEXP (x, 0),
6451 INTVAL (XEXP (x, 1)));
6452
6453 else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
6454 SUBST (XEXP (x, 1),
6455 force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
6456 (HOST_WIDE_INT_1U
6457 << exact_log2 (GET_MODE_UNIT_BITSIZE
6458 (GET_MODE (x))))
6459 - 1,
6460 0));
6461 break;
6462
6463 default:
6464 break;
6465 }
6466
6467 return x;
6468 }
6469 \f
6470 /* Simplify X, an IF_THEN_ELSE expression. Return the new expression. */
6471
6472 static rtx
6473 simplify_if_then_else (rtx x)
6474 {
6475 machine_mode mode = GET_MODE (x);
6476 rtx cond = XEXP (x, 0);
6477 rtx true_rtx = XEXP (x, 1);
6478 rtx false_rtx = XEXP (x, 2);
6479 enum rtx_code true_code = GET_CODE (cond);
6480 int comparison_p = COMPARISON_P (cond);
6481 rtx temp;
6482 int i;
6483 enum rtx_code false_code;
6484 rtx reversed;
6485 scalar_int_mode int_mode, inner_mode;
6486
6487 /* Simplify storing of the truth value. */
6488 if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
6489 return simplify_gen_relational (true_code, mode, VOIDmode,
6490 XEXP (cond, 0), XEXP (cond, 1));
6491
6492 /* Also when the truth value has to be reversed. */
6493 if (comparison_p
6494 && true_rtx == const0_rtx && false_rtx == const_true_rtx
6495 && (reversed = reversed_comparison (cond, mode)))
6496 return reversed;
6497
6498 /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
6499 in it is being compared against certain values. Get the true and false
6500 comparisons and see if that says anything about the value of each arm. */
6501
6502 if (comparison_p
6503 && ((false_code = reversed_comparison_code (cond, NULL))
6504 != UNKNOWN)
6505 && REG_P (XEXP (cond, 0)))
6506 {
6507 HOST_WIDE_INT nzb;
6508 rtx from = XEXP (cond, 0);
6509 rtx true_val = XEXP (cond, 1);
6510 rtx false_val = true_val;
6511 int swapped = 0;
6512
6513 /* If FALSE_CODE is EQ, swap the codes and arms. */
6514
6515 if (false_code == EQ)
6516 {
6517 swapped = 1, true_code = EQ, false_code = NE;
6518 std::swap (true_rtx, false_rtx);
6519 }
6520
6521 scalar_int_mode from_mode;
6522 if (is_a <scalar_int_mode> (GET_MODE (from), &from_mode))
6523 {
6524 /* If we are comparing against zero and the expression being
6525 tested has only a single bit that might be nonzero, that is
6526 its value when it is not equal to zero. Similarly if it is
6527 known to be -1 or 0. */
6528 if (true_code == EQ
6529 && true_val == const0_rtx
6530 && pow2p_hwi (nzb = nonzero_bits (from, from_mode)))
6531 {
6532 false_code = EQ;
6533 false_val = gen_int_mode (nzb, from_mode);
6534 }
6535 else if (true_code == EQ
6536 && true_val == const0_rtx
6537 && (num_sign_bit_copies (from, from_mode)
6538 == GET_MODE_PRECISION (from_mode)))
6539 {
6540 false_code = EQ;
6541 false_val = constm1_rtx;
6542 }
6543 }
6544
6545 /* Now simplify an arm if we know the value of the register in the
6546 branch and it is used in the arm. Be careful due to the potential
6547 of locally-shared RTL. */
6548
6549 if (reg_mentioned_p (from, true_rtx))
6550 true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
6551 from, true_val),
6552 pc_rtx, pc_rtx, 0, 0, 0);
6553 if (reg_mentioned_p (from, false_rtx))
6554 false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
6555 from, false_val),
6556 pc_rtx, pc_rtx, 0, 0, 0);
6557
6558 SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
6559 SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
6560
6561 true_rtx = XEXP (x, 1);
6562 false_rtx = XEXP (x, 2);
6563 true_code = GET_CODE (cond);
6564 }
6565
6566 /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
6567 reversed, do so to avoid needing two sets of patterns for
6568 subtract-and-branch insns. Similarly if we have a constant in the true
6569 arm, the false arm is the same as the first operand of the comparison, or
6570 the false arm is more complicated than the true arm. */
6571
6572 if (comparison_p
6573 && reversed_comparison_code (cond, NULL) != UNKNOWN
6574 && (true_rtx == pc_rtx
6575 || (CONSTANT_P (true_rtx)
6576 && !CONST_INT_P (false_rtx) && false_rtx != pc_rtx)
6577 || true_rtx == const0_rtx
6578 || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
6579 || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
6580 && !OBJECT_P (false_rtx))
6581 || reg_mentioned_p (true_rtx, false_rtx)
6582 || rtx_equal_p (false_rtx, XEXP (cond, 0))))
6583 {
6584 SUBST (XEXP (x, 0), reversed_comparison (cond, GET_MODE (cond)));
6585 SUBST (XEXP (x, 1), false_rtx);
6586 SUBST (XEXP (x, 2), true_rtx);
6587
6588 std::swap (true_rtx, false_rtx);
6589 cond = XEXP (x, 0);
6590
6591 /* It is possible that the conditional has been simplified out. */
6592 true_code = GET_CODE (cond);
6593 comparison_p = COMPARISON_P (cond);
6594 }
6595
6596 /* If the two arms are identical, we don't need the comparison. */
6597
6598 if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
6599 return true_rtx;
6600
6601 /* Convert a == b ? b : a to "a". */
6602 if (true_code == EQ && ! side_effects_p (cond)
6603 && !HONOR_NANS (mode)
6604 && rtx_equal_p (XEXP (cond, 0), false_rtx)
6605 && rtx_equal_p (XEXP (cond, 1), true_rtx))
6606 return false_rtx;
6607 else if (true_code == NE && ! side_effects_p (cond)
6608 && !HONOR_NANS (mode)
6609 && rtx_equal_p (XEXP (cond, 0), true_rtx)
6610 && rtx_equal_p (XEXP (cond, 1), false_rtx))
6611 return true_rtx;
6612
6613 /* Look for cases where we have (abs x) or (neg (abs X)). */
6614
6615 if (GET_MODE_CLASS (mode) == MODE_INT
6616 && comparison_p
6617 && XEXP (cond, 1) == const0_rtx
6618 && GET_CODE (false_rtx) == NEG
6619 && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
6620 && rtx_equal_p (true_rtx, XEXP (cond, 0))
6621 && ! side_effects_p (true_rtx))
6622 switch (true_code)
6623 {
6624 case GT:
6625 case GE:
6626 return simplify_gen_unary (ABS, mode, true_rtx, mode);
6627 case LT:
6628 case LE:
6629 return
6630 simplify_gen_unary (NEG, mode,
6631 simplify_gen_unary (ABS, mode, true_rtx, mode),
6632 mode);
6633 default:
6634 break;
6635 }
6636
6637 /* Look for MIN or MAX. */
6638
6639 if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
6640 && comparison_p
6641 && rtx_equal_p (XEXP (cond, 0), true_rtx)
6642 && rtx_equal_p (XEXP (cond, 1), false_rtx)
6643 && ! side_effects_p (cond))
6644 switch (true_code)
6645 {
6646 case GE:
6647 case GT:
6648 return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
6649 case LE:
6650 case LT:
6651 return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
6652 case GEU:
6653 case GTU:
6654 return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
6655 case LEU:
6656 case LTU:
6657 return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
6658 default:
6659 break;
6660 }
6661
6662 /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
6663 second operand is zero, this can be done as (OP Z (mult COND C2)) where
6664 C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
6665 SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
6666 We can do this kind of thing in some cases when STORE_FLAG_VALUE is
6667 neither 1 or -1, but it isn't worth checking for. */
6668
6669 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
6670 && comparison_p
6671 && is_int_mode (mode, &int_mode)
6672 && ! side_effects_p (x))
6673 {
6674 rtx t = make_compound_operation (true_rtx, SET);
6675 rtx f = make_compound_operation (false_rtx, SET);
6676 rtx cond_op0 = XEXP (cond, 0);
6677 rtx cond_op1 = XEXP (cond, 1);
6678 enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
6679 scalar_int_mode m = int_mode;
6680 rtx z = 0, c1 = NULL_RTX;
6681
6682 if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
6683 || GET_CODE (t) == IOR || GET_CODE (t) == XOR
6684 || GET_CODE (t) == ASHIFT
6685 || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
6686 && rtx_equal_p (XEXP (t, 0), f))
6687 c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
6688
6689 /* If an identity-zero op is commutative, check whether there
6690 would be a match if we swapped the operands. */
6691 else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
6692 || GET_CODE (t) == XOR)
6693 && rtx_equal_p (XEXP (t, 1), f))
6694 c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
6695 else if (GET_CODE (t) == SIGN_EXTEND
6696 && is_a <scalar_int_mode> (GET_MODE (XEXP (t, 0)), &inner_mode)
6697 && (GET_CODE (XEXP (t, 0)) == PLUS
6698 || GET_CODE (XEXP (t, 0)) == MINUS
6699 || GET_CODE (XEXP (t, 0)) == IOR
6700 || GET_CODE (XEXP (t, 0)) == XOR
6701 || GET_CODE (XEXP (t, 0)) == ASHIFT
6702 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
6703 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
6704 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
6705 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
6706 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
6707 && (num_sign_bit_copies (f, GET_MODE (f))
6708 > (unsigned int)
6709 (GET_MODE_PRECISION (int_mode)
6710 - GET_MODE_PRECISION (inner_mode))))
6711 {
6712 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
6713 extend_op = SIGN_EXTEND;
6714 m = inner_mode;
6715 }
6716 else if (GET_CODE (t) == SIGN_EXTEND
6717 && is_a <scalar_int_mode> (GET_MODE (XEXP (t, 0)), &inner_mode)
6718 && (GET_CODE (XEXP (t, 0)) == PLUS
6719 || GET_CODE (XEXP (t, 0)) == IOR
6720 || GET_CODE (XEXP (t, 0)) == XOR)
6721 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
6722 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
6723 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
6724 && (num_sign_bit_copies (f, GET_MODE (f))
6725 > (unsigned int)
6726 (GET_MODE_PRECISION (int_mode)
6727 - GET_MODE_PRECISION (inner_mode))))
6728 {
6729 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
6730 extend_op = SIGN_EXTEND;
6731 m = inner_mode;
6732 }
6733 else if (GET_CODE (t) == ZERO_EXTEND
6734 && is_a <scalar_int_mode> (GET_MODE (XEXP (t, 0)), &inner_mode)
6735 && (GET_CODE (XEXP (t, 0)) == PLUS
6736 || GET_CODE (XEXP (t, 0)) == MINUS
6737 || GET_CODE (XEXP (t, 0)) == IOR
6738 || GET_CODE (XEXP (t, 0)) == XOR
6739 || GET_CODE (XEXP (t, 0)) == ASHIFT
6740 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
6741 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
6742 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
6743 && HWI_COMPUTABLE_MODE_P (int_mode)
6744 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
6745 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
6746 && ((nonzero_bits (f, GET_MODE (f))
6747 & ~GET_MODE_MASK (inner_mode))
6748 == 0))
6749 {
6750 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
6751 extend_op = ZERO_EXTEND;
6752 m = inner_mode;
6753 }
6754 else if (GET_CODE (t) == ZERO_EXTEND
6755 && is_a <scalar_int_mode> (GET_MODE (XEXP (t, 0)), &inner_mode)
6756 && (GET_CODE (XEXP (t, 0)) == PLUS
6757 || GET_CODE (XEXP (t, 0)) == IOR
6758 || GET_CODE (XEXP (t, 0)) == XOR)
6759 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
6760 && HWI_COMPUTABLE_MODE_P (int_mode)
6761 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
6762 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
6763 && ((nonzero_bits (f, GET_MODE (f))
6764 & ~GET_MODE_MASK (inner_mode))
6765 == 0))
6766 {
6767 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
6768 extend_op = ZERO_EXTEND;
6769 m = inner_mode;
6770 }
6771
6772 if (z)
6773 {
6774 machine_mode cm = m;
6775 if ((op == ASHIFT || op == LSHIFTRT || op == ASHIFTRT)
6776 && GET_MODE (c1) != VOIDmode)
6777 cm = GET_MODE (c1);
6778 temp = subst (simplify_gen_relational (true_code, cm, VOIDmode,
6779 cond_op0, cond_op1),
6780 pc_rtx, pc_rtx, 0, 0, 0);
6781 temp = simplify_gen_binary (MULT, cm, temp,
6782 simplify_gen_binary (MULT, cm, c1,
6783 const_true_rtx));
6784 temp = subst (temp, pc_rtx, pc_rtx, 0, 0, 0);
6785 temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
6786
6787 if (extend_op != UNKNOWN)
6788 temp = simplify_gen_unary (extend_op, int_mode, temp, m);
6789
6790 return temp;
6791 }
6792 }
6793
6794 /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
6795 1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
6796 negation of a single bit, we can convert this operation to a shift. We
6797 can actually do this more generally, but it doesn't seem worth it. */
6798
6799 if (true_code == NE
6800 && is_a <scalar_int_mode> (mode, &int_mode)
6801 && XEXP (cond, 1) == const0_rtx
6802 && false_rtx == const0_rtx
6803 && CONST_INT_P (true_rtx)
6804 && ((nonzero_bits (XEXP (cond, 0), int_mode) == 1
6805 && (i = exact_log2 (UINTVAL (true_rtx))) >= 0)
6806 || ((num_sign_bit_copies (XEXP (cond, 0), int_mode)
6807 == GET_MODE_PRECISION (int_mode))
6808 && (i = exact_log2 (-UINTVAL (true_rtx))) >= 0)))
6809 return
6810 simplify_shift_const (NULL_RTX, ASHIFT, int_mode,
6811 gen_lowpart (int_mode, XEXP (cond, 0)), i);
6812
6813 /* (IF_THEN_ELSE (NE A 0) C1 0) is A or a zero-extend of A if the only
6814 non-zero bit in A is C1. */
6815 if (true_code == NE && XEXP (cond, 1) == const0_rtx
6816 && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
6817 && is_a <scalar_int_mode> (mode, &int_mode)
6818 && is_a <scalar_int_mode> (GET_MODE (XEXP (cond, 0)), &inner_mode)
6819 && (UINTVAL (true_rtx) & GET_MODE_MASK (int_mode))
6820 == nonzero_bits (XEXP (cond, 0), inner_mode)
6821 && (i = exact_log2 (UINTVAL (true_rtx) & GET_MODE_MASK (int_mode))) >= 0)
6822 {
6823 rtx val = XEXP (cond, 0);
6824 if (inner_mode == int_mode)
6825 return val;
6826 else if (GET_MODE_PRECISION (inner_mode) < GET_MODE_PRECISION (int_mode))
6827 return simplify_gen_unary (ZERO_EXTEND, int_mode, val, inner_mode);
6828 }
6829
6830 return x;
6831 }
6832 \f
6833 /* Simplify X, a SET expression. Return the new expression. */
6834
6835 static rtx
6836 simplify_set (rtx x)
6837 {
6838 rtx src = SET_SRC (x);
6839 rtx dest = SET_DEST (x);
6840 machine_mode mode
6841 = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
6842 rtx_insn *other_insn;
6843 rtx *cc_use;
6844 scalar_int_mode int_mode;
6845
6846 /* (set (pc) (return)) gets written as (return). */
6847 if (GET_CODE (dest) == PC && ANY_RETURN_P (src))
6848 return src;
6849
6850 /* Now that we know for sure which bits of SRC we are using, see if we can
6851 simplify the expression for the object knowing that we only need the
6852 low-order bits. */
6853
6854 if (GET_MODE_CLASS (mode) == MODE_INT && HWI_COMPUTABLE_MODE_P (mode))
6855 {
6856 src = force_to_mode (src, mode, HOST_WIDE_INT_M1U, 0);
6857 SUBST (SET_SRC (x), src);
6858 }
6859
6860 /* If we are setting CC0 or if the source is a COMPARE, look for the use of
6861 the comparison result and try to simplify it unless we already have used
6862 undobuf.other_insn. */
6863 if ((GET_MODE_CLASS (mode) == MODE_CC
6864 || GET_CODE (src) == COMPARE
6865 || CC0_P (dest))
6866 && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
6867 && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
6868 && COMPARISON_P (*cc_use)
6869 && rtx_equal_p (XEXP (*cc_use, 0), dest))
6870 {
6871 enum rtx_code old_code = GET_CODE (*cc_use);
6872 enum rtx_code new_code;
6873 rtx op0, op1, tmp;
6874 int other_changed = 0;
6875 rtx inner_compare = NULL_RTX;
6876 machine_mode compare_mode = GET_MODE (dest);
6877
6878 if (GET_CODE (src) == COMPARE)
6879 {
6880 op0 = XEXP (src, 0), op1 = XEXP (src, 1);
6881 if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
6882 {
6883 inner_compare = op0;
6884 op0 = XEXP (inner_compare, 0), op1 = XEXP (inner_compare, 1);
6885 }
6886 }
6887 else
6888 op0 = src, op1 = CONST0_RTX (GET_MODE (src));
6889
6890 tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
6891 op0, op1);
6892 if (!tmp)
6893 new_code = old_code;
6894 else if (!CONSTANT_P (tmp))
6895 {
6896 new_code = GET_CODE (tmp);
6897 op0 = XEXP (tmp, 0);
6898 op1 = XEXP (tmp, 1);
6899 }
6900 else
6901 {
6902 rtx pat = PATTERN (other_insn);
6903 undobuf.other_insn = other_insn;
6904 SUBST (*cc_use, tmp);
6905
6906 /* Attempt to simplify CC user. */
6907 if (GET_CODE (pat) == SET)
6908 {
6909 rtx new_rtx = simplify_rtx (SET_SRC (pat));
6910 if (new_rtx != NULL_RTX)
6911 SUBST (SET_SRC (pat), new_rtx);
6912 }
6913
6914 /* Convert X into a no-op move. */
6915 SUBST (SET_DEST (x), pc_rtx);
6916 SUBST (SET_SRC (x), pc_rtx);
6917 return x;
6918 }
6919
6920 /* Simplify our comparison, if possible. */
6921 new_code = simplify_comparison (new_code, &op0, &op1);
6922
6923 #ifdef SELECT_CC_MODE
6924 /* If this machine has CC modes other than CCmode, check to see if we
6925 need to use a different CC mode here. */
6926 if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
6927 compare_mode = GET_MODE (op0);
6928 else if (inner_compare
6929 && GET_MODE_CLASS (GET_MODE (inner_compare)) == MODE_CC
6930 && new_code == old_code
6931 && op0 == XEXP (inner_compare, 0)
6932 && op1 == XEXP (inner_compare, 1))
6933 compare_mode = GET_MODE (inner_compare);
6934 else
6935 compare_mode = SELECT_CC_MODE (new_code, op0, op1);
6936
6937 /* If the mode changed, we have to change SET_DEST, the mode in the
6938 compare, and the mode in the place SET_DEST is used. If SET_DEST is
6939 a hard register, just build new versions with the proper mode. If it
6940 is a pseudo, we lose unless it is only time we set the pseudo, in
6941 which case we can safely change its mode. */
6942 if (!HAVE_cc0 && compare_mode != GET_MODE (dest))
6943 {
6944 if (can_change_dest_mode (dest, 0, compare_mode))
6945 {
6946 unsigned int regno = REGNO (dest);
6947 rtx new_dest;
6948
6949 if (regno < FIRST_PSEUDO_REGISTER)
6950 new_dest = gen_rtx_REG (compare_mode, regno);
6951 else
6952 {
6953 SUBST_MODE (regno_reg_rtx[regno], compare_mode);
6954 new_dest = regno_reg_rtx[regno];
6955 }
6956
6957 SUBST (SET_DEST (x), new_dest);
6958 SUBST (XEXP (*cc_use, 0), new_dest);
6959 other_changed = 1;
6960
6961 dest = new_dest;
6962 }
6963 }
6964 #endif /* SELECT_CC_MODE */
6965
6966 /* If the code changed, we have to build a new comparison in
6967 undobuf.other_insn. */
6968 if (new_code != old_code)
6969 {
6970 int other_changed_previously = other_changed;
6971 unsigned HOST_WIDE_INT mask;
6972 rtx old_cc_use = *cc_use;
6973
6974 SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
6975 dest, const0_rtx));
6976 other_changed = 1;
6977
6978 /* If the only change we made was to change an EQ into an NE or
6979 vice versa, OP0 has only one bit that might be nonzero, and OP1
6980 is zero, check if changing the user of the condition code will
6981 produce a valid insn. If it won't, we can keep the original code
6982 in that insn by surrounding our operation with an XOR. */
6983
6984 if (((old_code == NE && new_code == EQ)
6985 || (old_code == EQ && new_code == NE))
6986 && ! other_changed_previously && op1 == const0_rtx
6987 && HWI_COMPUTABLE_MODE_P (GET_MODE (op0))
6988 && pow2p_hwi (mask = nonzero_bits (op0, GET_MODE (op0))))
6989 {
6990 rtx pat = PATTERN (other_insn), note = 0;
6991
6992 if ((recog_for_combine (&pat, other_insn, &note) < 0
6993 && ! check_asm_operands (pat)))
6994 {
6995 *cc_use = old_cc_use;
6996 other_changed = 0;
6997
6998 op0 = simplify_gen_binary (XOR, GET_MODE (op0), op0,
6999 gen_int_mode (mask,
7000 GET_MODE (op0)));
7001 }
7002 }
7003 }
7004
7005 if (other_changed)
7006 undobuf.other_insn = other_insn;
7007
7008 /* Don't generate a compare of a CC with 0, just use that CC. */
7009 if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
7010 {
7011 SUBST (SET_SRC (x), op0);
7012 src = SET_SRC (x);
7013 }
7014 /* Otherwise, if we didn't previously have the same COMPARE we
7015 want, create it from scratch. */
7016 else if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode
7017 || XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
7018 {
7019 SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
7020 src = SET_SRC (x);
7021 }
7022 }
7023 else
7024 {
7025 /* Get SET_SRC in a form where we have placed back any
7026 compound expressions. Then do the checks below. */
7027 src = make_compound_operation (src, SET);
7028 SUBST (SET_SRC (x), src);
7029 }
7030
7031 /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
7032 and X being a REG or (subreg (reg)), we may be able to convert this to
7033 (set (subreg:m2 x) (op)).
7034
7035 We can always do this if M1 is narrower than M2 because that means that
7036 we only care about the low bits of the result.
7037
7038 However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
7039 perform a narrower operation than requested since the high-order bits will
7040 be undefined. On machine where it is defined, this transformation is safe
7041 as long as M1 and M2 have the same number of words. */
7042
7043 if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
7044 && !OBJECT_P (SUBREG_REG (src))
7045 && (known_equal_after_align_up
7046 (GET_MODE_SIZE (GET_MODE (src)),
7047 GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))),
7048 UNITS_PER_WORD))
7049 && (WORD_REGISTER_OPERATIONS || !paradoxical_subreg_p (src))
7050 && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
7051 && !REG_CAN_CHANGE_MODE_P (REGNO (dest),
7052 GET_MODE (SUBREG_REG (src)),
7053 GET_MODE (src)))
7054 && (REG_P (dest)
7055 || (GET_CODE (dest) == SUBREG
7056 && REG_P (SUBREG_REG (dest)))))
7057 {
7058 SUBST (SET_DEST (x),
7059 gen_lowpart (GET_MODE (SUBREG_REG (src)),
7060 dest));
7061 SUBST (SET_SRC (x), SUBREG_REG (src));
7062
7063 src = SET_SRC (x), dest = SET_DEST (x);
7064 }
7065
7066 /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
7067 in SRC. */
7068 if (dest == cc0_rtx
7069 && partial_subreg_p (src)
7070 && subreg_lowpart_p (src))
7071 {
7072 rtx inner = SUBREG_REG (src);
7073 machine_mode inner_mode = GET_MODE (inner);
7074
7075 /* Here we make sure that we don't have a sign bit on. */
7076 if (val_signbit_known_clear_p (GET_MODE (src),
7077 nonzero_bits (inner, inner_mode)))
7078 {
7079 SUBST (SET_SRC (x), inner);
7080 src = SET_SRC (x);
7081 }
7082 }
7083
7084 /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
7085 would require a paradoxical subreg. Replace the subreg with a
7086 zero_extend to avoid the reload that would otherwise be required.
7087 Don't do this unless we have a scalar integer mode, otherwise the
7088 transformation is incorrect. */
7089
7090 enum rtx_code extend_op;
7091 if (paradoxical_subreg_p (src)
7092 && MEM_P (SUBREG_REG (src))
7093 && SCALAR_INT_MODE_P (GET_MODE (src))
7094 && (extend_op = load_extend_op (GET_MODE (SUBREG_REG (src)))) != UNKNOWN)
7095 {
7096 SUBST (SET_SRC (x),
7097 gen_rtx_fmt_e (extend_op, GET_MODE (src), SUBREG_REG (src)));
7098
7099 src = SET_SRC (x);
7100 }
7101
7102 /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
7103 are comparing an item known to be 0 or -1 against 0, use a logical
7104 operation instead. Check for one of the arms being an IOR of the other
7105 arm with some value. We compute three terms to be IOR'ed together. In
7106 practice, at most two will be nonzero. Then we do the IOR's. */
7107
7108 if (GET_CODE (dest) != PC
7109 && GET_CODE (src) == IF_THEN_ELSE
7110 && is_int_mode (GET_MODE (src), &int_mode)
7111 && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
7112 && XEXP (XEXP (src, 0), 1) == const0_rtx
7113 && int_mode == GET_MODE (XEXP (XEXP (src, 0), 0))
7114 && (!HAVE_conditional_move
7115 || ! can_conditionally_move_p (int_mode))
7116 && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0), int_mode)
7117 == GET_MODE_PRECISION (int_mode))
7118 && ! side_effects_p (src))
7119 {
7120 rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
7121 ? XEXP (src, 1) : XEXP (src, 2));
7122 rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
7123 ? XEXP (src, 2) : XEXP (src, 1));
7124 rtx term1 = const0_rtx, term2, term3;
7125
7126 if (GET_CODE (true_rtx) == IOR
7127 && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
7128 term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
7129 else if (GET_CODE (true_rtx) == IOR
7130 && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
7131 term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
7132 else if (GET_CODE (false_rtx) == IOR
7133 && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
7134 term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
7135 else if (GET_CODE (false_rtx) == IOR
7136 && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
7137 term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
7138
7139 term2 = simplify_gen_binary (AND, int_mode,
7140 XEXP (XEXP (src, 0), 0), true_rtx);
7141 term3 = simplify_gen_binary (AND, int_mode,
7142 simplify_gen_unary (NOT, int_mode,
7143 XEXP (XEXP (src, 0), 0),
7144 int_mode),
7145 false_rtx);
7146
7147 SUBST (SET_SRC (x),
7148 simplify_gen_binary (IOR, int_mode,
7149 simplify_gen_binary (IOR, int_mode,
7150 term1, term2),
7151 term3));
7152
7153 src = SET_SRC (x);
7154 }
7155
7156 /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
7157 whole thing fail. */
7158 if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
7159 return src;
7160 else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
7161 return dest;
7162 else
7163 /* Convert this into a field assignment operation, if possible. */
7164 return make_field_assignment (x);
7165 }
7166 \f
7167 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
7168 result. */
7169
7170 static rtx
7171 simplify_logical (rtx x)
7172 {
7173 rtx op0 = XEXP (x, 0);
7174 rtx op1 = XEXP (x, 1);
7175 scalar_int_mode mode;
7176
7177 switch (GET_CODE (x))
7178 {
7179 case AND:
7180 /* We can call simplify_and_const_int only if we don't lose
7181 any (sign) bits when converting INTVAL (op1) to
7182 "unsigned HOST_WIDE_INT". */
7183 if (is_a <scalar_int_mode> (GET_MODE (x), &mode)
7184 && CONST_INT_P (op1)
7185 && (HWI_COMPUTABLE_MODE_P (mode)
7186 || INTVAL (op1) > 0))
7187 {
7188 x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
7189 if (GET_CODE (x) != AND)
7190 return x;
7191
7192 op0 = XEXP (x, 0);
7193 op1 = XEXP (x, 1);
7194 }
7195
7196 /* If we have any of (and (ior A B) C) or (and (xor A B) C),
7197 apply the distributive law and then the inverse distributive
7198 law to see if things simplify. */
7199 if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
7200 {
7201 rtx result = distribute_and_simplify_rtx (x, 0);
7202 if (result)
7203 return result;
7204 }
7205 if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
7206 {
7207 rtx result = distribute_and_simplify_rtx (x, 1);
7208 if (result)
7209 return result;
7210 }
7211 break;
7212
7213 case IOR:
7214 /* If we have (ior (and A B) C), apply the distributive law and then
7215 the inverse distributive law to see if things simplify. */
7216
7217 if (GET_CODE (op0) == AND)
7218 {
7219 rtx result = distribute_and_simplify_rtx (x, 0);
7220 if (result)
7221 return result;
7222 }
7223
7224 if (GET_CODE (op1) == AND)
7225 {
7226 rtx result = distribute_and_simplify_rtx (x, 1);
7227 if (result)
7228 return result;
7229 }
7230 break;
7231
7232 default:
7233 gcc_unreachable ();
7234 }
7235
7236 return x;
7237 }
7238 \f
7239 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
7240 operations" because they can be replaced with two more basic operations.
7241 ZERO_EXTEND is also considered "compound" because it can be replaced with
7242 an AND operation, which is simpler, though only one operation.
7243
7244 The function expand_compound_operation is called with an rtx expression
7245 and will convert it to the appropriate shifts and AND operations,
7246 simplifying at each stage.
7247
7248 The function make_compound_operation is called to convert an expression
7249 consisting of shifts and ANDs into the equivalent compound expression.
7250 It is the inverse of this function, loosely speaking. */
7251
7252 static rtx
7253 expand_compound_operation (rtx x)
7254 {
7255 unsigned HOST_WIDE_INT pos = 0, len;
7256 int unsignedp = 0;
7257 unsigned int modewidth;
7258 rtx tem;
7259 scalar_int_mode inner_mode;
7260
7261 switch (GET_CODE (x))
7262 {
7263 case ZERO_EXTEND:
7264 unsignedp = 1;
7265 /* FALLTHRU */
7266 case SIGN_EXTEND:
7267 /* We can't necessarily use a const_int for a multiword mode;
7268 it depends on implicitly extending the value.
7269 Since we don't know the right way to extend it,
7270 we can't tell whether the implicit way is right.
7271
7272 Even for a mode that is no wider than a const_int,
7273 we can't win, because we need to sign extend one of its bits through
7274 the rest of it, and we don't know which bit. */
7275 if (CONST_INT_P (XEXP (x, 0)))
7276 return x;
7277
7278 /* Reject modes that aren't scalar integers because turning vector
7279 or complex modes into shifts causes problems. */
7280 if (!is_a <scalar_int_mode> (GET_MODE (XEXP (x, 0)), &inner_mode))
7281 return x;
7282
7283 /* Return if (subreg:MODE FROM 0) is not a safe replacement for
7284 (zero_extend:MODE FROM) or (sign_extend:MODE FROM). It is for any MEM
7285 because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
7286 reloaded. If not for that, MEM's would very rarely be safe.
7287
7288 Reject modes bigger than a word, because we might not be able
7289 to reference a two-register group starting with an arbitrary register
7290 (and currently gen_lowpart might crash for a SUBREG). */
7291
7292 if (GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
7293 return x;
7294
7295 len = GET_MODE_PRECISION (inner_mode);
7296 /* If the inner object has VOIDmode (the only way this can happen
7297 is if it is an ASM_OPERANDS), we can't do anything since we don't
7298 know how much masking to do. */
7299 if (len == 0)
7300 return x;
7301
7302 break;
7303
7304 case ZERO_EXTRACT:
7305 unsignedp = 1;
7306
7307 /* fall through */
7308
7309 case SIGN_EXTRACT:
7310 /* If the operand is a CLOBBER, just return it. */
7311 if (GET_CODE (XEXP (x, 0)) == CLOBBER)
7312 return XEXP (x, 0);
7313
7314 if (!CONST_INT_P (XEXP (x, 1))
7315 || !CONST_INT_P (XEXP (x, 2)))
7316 return x;
7317
7318 /* Reject modes that aren't scalar integers because turning vector
7319 or complex modes into shifts causes problems. */
7320 if (!is_a <scalar_int_mode> (GET_MODE (XEXP (x, 0)), &inner_mode))
7321 return x;
7322
7323 len = INTVAL (XEXP (x, 1));
7324 pos = INTVAL (XEXP (x, 2));
7325
7326 /* This should stay within the object being extracted, fail otherwise. */
7327 if (len + pos > GET_MODE_PRECISION (inner_mode))
7328 return x;
7329
7330 if (BITS_BIG_ENDIAN)
7331 pos = GET_MODE_PRECISION (inner_mode) - len - pos;
7332
7333 break;
7334
7335 default:
7336 return x;
7337 }
7338
7339 /* We've rejected non-scalar operations by now. */
7340 scalar_int_mode mode = as_a <scalar_int_mode> (GET_MODE (x));
7341
7342 /* Convert sign extension to zero extension, if we know that the high
7343 bit is not set, as this is easier to optimize. It will be converted
7344 back to cheaper alternative in make_extraction. */
7345 if (GET_CODE (x) == SIGN_EXTEND
7346 && HWI_COMPUTABLE_MODE_P (mode)
7347 && ((nonzero_bits (XEXP (x, 0), inner_mode)
7348 & ~(((unsigned HOST_WIDE_INT) GET_MODE_MASK (inner_mode)) >> 1))
7349 == 0))
7350 {
7351 rtx temp = gen_rtx_ZERO_EXTEND (mode, XEXP (x, 0));
7352 rtx temp2 = expand_compound_operation (temp);
7353
7354 /* Make sure this is a profitable operation. */
7355 if (set_src_cost (x, mode, optimize_this_for_speed_p)
7356 > set_src_cost (temp2, mode, optimize_this_for_speed_p))
7357 return temp2;
7358 else if (set_src_cost (x, mode, optimize_this_for_speed_p)
7359 > set_src_cost (temp, mode, optimize_this_for_speed_p))
7360 return temp;
7361 else
7362 return x;
7363 }
7364
7365 /* We can optimize some special cases of ZERO_EXTEND. */
7366 if (GET_CODE (x) == ZERO_EXTEND)
7367 {
7368 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
7369 know that the last value didn't have any inappropriate bits
7370 set. */
7371 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
7372 && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode
7373 && HWI_COMPUTABLE_MODE_P (mode)
7374 && (nonzero_bits (XEXP (XEXP (x, 0), 0), mode)
7375 & ~GET_MODE_MASK (inner_mode)) == 0)
7376 return XEXP (XEXP (x, 0), 0);
7377
7378 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
7379 if (GET_CODE (XEXP (x, 0)) == SUBREG
7380 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == mode
7381 && subreg_lowpart_p (XEXP (x, 0))
7382 && HWI_COMPUTABLE_MODE_P (mode)
7383 && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), mode)
7384 & ~GET_MODE_MASK (inner_mode)) == 0)
7385 return SUBREG_REG (XEXP (x, 0));
7386
7387 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
7388 is a comparison and STORE_FLAG_VALUE permits. This is like
7389 the first case, but it works even when MODE is larger
7390 than HOST_WIDE_INT. */
7391 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
7392 && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode
7393 && COMPARISON_P (XEXP (XEXP (x, 0), 0))
7394 && GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT
7395 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (inner_mode)) == 0)
7396 return XEXP (XEXP (x, 0), 0);
7397
7398 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
7399 if (GET_CODE (XEXP (x, 0)) == SUBREG
7400 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == mode
7401 && subreg_lowpart_p (XEXP (x, 0))
7402 && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
7403 && GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT
7404 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (inner_mode)) == 0)
7405 return SUBREG_REG (XEXP (x, 0));
7406
7407 }
7408
7409 /* If we reach here, we want to return a pair of shifts. The inner
7410 shift is a left shift of BITSIZE - POS - LEN bits. The outer
7411 shift is a right shift of BITSIZE - LEN bits. It is arithmetic or
7412 logical depending on the value of UNSIGNEDP.
7413
7414 If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
7415 converted into an AND of a shift.
7416
7417 We must check for the case where the left shift would have a negative
7418 count. This can happen in a case like (x >> 31) & 255 on machines
7419 that can't shift by a constant. On those machines, we would first
7420 combine the shift with the AND to produce a variable-position
7421 extraction. Then the constant of 31 would be substituted in
7422 to produce such a position. */
7423
7424 modewidth = GET_MODE_PRECISION (mode);
7425 if (modewidth >= pos + len)
7426 {
7427 tem = gen_lowpart (mode, XEXP (x, 0));
7428 if (!tem || GET_CODE (tem) == CLOBBER)
7429 return x;
7430 tem = simplify_shift_const (NULL_RTX, ASHIFT, mode,
7431 tem, modewidth - pos - len);
7432 tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
7433 mode, tem, modewidth - len);
7434 }
7435 else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
7436 tem = simplify_and_const_int (NULL_RTX, mode,
7437 simplify_shift_const (NULL_RTX, LSHIFTRT,
7438 mode, XEXP (x, 0),
7439 pos),
7440 (HOST_WIDE_INT_1U << len) - 1);
7441 else
7442 /* Any other cases we can't handle. */
7443 return x;
7444
7445 /* If we couldn't do this for some reason, return the original
7446 expression. */
7447 if (GET_CODE (tem) == CLOBBER)
7448 return x;
7449
7450 return tem;
7451 }
7452 \f
7453 /* X is a SET which contains an assignment of one object into
7454 a part of another (such as a bit-field assignment, STRICT_LOW_PART,
7455 or certain SUBREGS). If possible, convert it into a series of
7456 logical operations.
7457
7458 We half-heartedly support variable positions, but do not at all
7459 support variable lengths. */
7460
7461 static const_rtx
7462 expand_field_assignment (const_rtx x)
7463 {
7464 rtx inner;
7465 rtx pos; /* Always counts from low bit. */
7466 int len, inner_len;
7467 rtx mask, cleared, masked;
7468 scalar_int_mode compute_mode;
7469
7470 /* Loop until we find something we can't simplify. */
7471 while (1)
7472 {
7473 if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
7474 && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
7475 {
7476 rtx x0 = XEXP (SET_DEST (x), 0);
7477 if (!GET_MODE_PRECISION (GET_MODE (x0)).is_constant (&len))
7478 break;
7479 inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
7480 pos = gen_int_mode (subreg_lsb (XEXP (SET_DEST (x), 0)),
7481 MAX_MODE_INT);
7482 }
7483 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
7484 && CONST_INT_P (XEXP (SET_DEST (x), 1)))
7485 {
7486 inner = XEXP (SET_DEST (x), 0);
7487 if (!GET_MODE_PRECISION (GET_MODE (inner)).is_constant (&inner_len))
7488 break;
7489
7490 len = INTVAL (XEXP (SET_DEST (x), 1));
7491 pos = XEXP (SET_DEST (x), 2);
7492
7493 /* A constant position should stay within the width of INNER. */
7494 if (CONST_INT_P (pos) && INTVAL (pos) + len > inner_len)
7495 break;
7496
7497 if (BITS_BIG_ENDIAN)
7498 {
7499 if (CONST_INT_P (pos))
7500 pos = GEN_INT (inner_len - len - INTVAL (pos));
7501 else if (GET_CODE (pos) == MINUS
7502 && CONST_INT_P (XEXP (pos, 1))
7503 && INTVAL (XEXP (pos, 1)) == inner_len - len)
7504 /* If position is ADJUST - X, new position is X. */
7505 pos = XEXP (pos, 0);
7506 else
7507 pos = simplify_gen_binary (MINUS, GET_MODE (pos),
7508 gen_int_mode (inner_len - len,
7509 GET_MODE (pos)),
7510 pos);
7511 }
7512 }
7513
7514 /* If the destination is a subreg that overwrites the whole of the inner
7515 register, we can move the subreg to the source. */
7516 else if (GET_CODE (SET_DEST (x)) == SUBREG
7517 /* We need SUBREGs to compute nonzero_bits properly. */
7518 && nonzero_sign_valid
7519 && !read_modify_subreg_p (SET_DEST (x)))
7520 {
7521 x = gen_rtx_SET (SUBREG_REG (SET_DEST (x)),
7522 gen_lowpart
7523 (GET_MODE (SUBREG_REG (SET_DEST (x))),
7524 SET_SRC (x)));
7525 continue;
7526 }
7527 else
7528 break;
7529
7530 while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
7531 inner = SUBREG_REG (inner);
7532
7533 /* Don't attempt bitwise arithmetic on non scalar integer modes. */
7534 if (!is_a <scalar_int_mode> (GET_MODE (inner), &compute_mode))
7535 {
7536 /* Don't do anything for vector or complex integral types. */
7537 if (! FLOAT_MODE_P (GET_MODE (inner)))
7538 break;
7539
7540 /* Try to find an integral mode to pun with. */
7541 if (!int_mode_for_size (GET_MODE_BITSIZE (GET_MODE (inner)), 0)
7542 .exists (&compute_mode))
7543 break;
7544
7545 inner = gen_lowpart (compute_mode, inner);
7546 }
7547
7548 /* Compute a mask of LEN bits, if we can do this on the host machine. */
7549 if (len >= HOST_BITS_PER_WIDE_INT)
7550 break;
7551
7552 /* Don't try to compute in too wide unsupported modes. */
7553 if (!targetm.scalar_mode_supported_p (compute_mode))
7554 break;
7555
7556 /* Now compute the equivalent expression. Make a copy of INNER
7557 for the SET_DEST in case it is a MEM into which we will substitute;
7558 we don't want shared RTL in that case. */
7559 mask = gen_int_mode ((HOST_WIDE_INT_1U << len) - 1,
7560 compute_mode);
7561 cleared = simplify_gen_binary (AND, compute_mode,
7562 simplify_gen_unary (NOT, compute_mode,
7563 simplify_gen_binary (ASHIFT,
7564 compute_mode,
7565 mask, pos),
7566 compute_mode),
7567 inner);
7568 masked = simplify_gen_binary (ASHIFT, compute_mode,
7569 simplify_gen_binary (
7570 AND, compute_mode,
7571 gen_lowpart (compute_mode, SET_SRC (x)),
7572 mask),
7573 pos);
7574
7575 x = gen_rtx_SET (copy_rtx (inner),
7576 simplify_gen_binary (IOR, compute_mode,
7577 cleared, masked));
7578 }
7579
7580 return x;
7581 }
7582 \f
7583 /* Return an RTX for a reference to LEN bits of INNER. If POS_RTX is nonzero,
7584 it is an RTX that represents the (variable) starting position; otherwise,
7585 POS is the (constant) starting bit position. Both are counted from the LSB.
7586
7587 UNSIGNEDP is nonzero for an unsigned reference and zero for a signed one.
7588
7589 IN_DEST is nonzero if this is a reference in the destination of a SET.
7590 This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If nonzero,
7591 a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
7592 be used.
7593
7594 IN_COMPARE is nonzero if we are in a COMPARE. This means that a
7595 ZERO_EXTRACT should be built even for bits starting at bit 0.
7596
7597 MODE is the desired mode of the result (if IN_DEST == 0).
7598
7599 The result is an RTX for the extraction or NULL_RTX if the target
7600 can't handle it. */
7601
7602 static rtx
7603 make_extraction (machine_mode mode, rtx inner, HOST_WIDE_INT pos,
7604 rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
7605 int in_dest, int in_compare)
7606 {
7607 /* This mode describes the size of the storage area
7608 to fetch the overall value from. Within that, we
7609 ignore the POS lowest bits, etc. */
7610 machine_mode is_mode = GET_MODE (inner);
7611 machine_mode inner_mode;
7612 scalar_int_mode wanted_inner_mode;
7613 scalar_int_mode wanted_inner_reg_mode = word_mode;
7614 scalar_int_mode pos_mode = word_mode;
7615 machine_mode extraction_mode = word_mode;
7616 rtx new_rtx = 0;
7617 rtx orig_pos_rtx = pos_rtx;
7618 HOST_WIDE_INT orig_pos;
7619
7620 if (pos_rtx && CONST_INT_P (pos_rtx))
7621 pos = INTVAL (pos_rtx), pos_rtx = 0;
7622
7623 if (GET_CODE (inner) == SUBREG
7624 && subreg_lowpart_p (inner)
7625 && (paradoxical_subreg_p (inner)
7626 /* If trying or potentionally trying to extract
7627 bits outside of is_mode, don't look through
7628 non-paradoxical SUBREGs. See PR82192. */
7629 || (pos_rtx == NULL_RTX
7630 && known_le (pos + len, GET_MODE_PRECISION (is_mode)))))
7631 {
7632 /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
7633 consider just the QI as the memory to extract from.
7634 The subreg adds or removes high bits; its mode is
7635 irrelevant to the meaning of this extraction,
7636 since POS and LEN count from the lsb. */
7637 if (MEM_P (SUBREG_REG (inner)))
7638 is_mode = GET_MODE (SUBREG_REG (inner));
7639 inner = SUBREG_REG (inner);
7640 }
7641 else if (GET_CODE (inner) == ASHIFT
7642 && CONST_INT_P (XEXP (inner, 1))
7643 && pos_rtx == 0 && pos == 0
7644 && len > UINTVAL (XEXP (inner, 1)))
7645 {
7646 /* We're extracting the least significant bits of an rtx
7647 (ashift X (const_int C)), where LEN > C. Extract the
7648 least significant (LEN - C) bits of X, giving an rtx
7649 whose mode is MODE, then shift it left C times. */
7650 new_rtx = make_extraction (mode, XEXP (inner, 0),
7651 0, 0, len - INTVAL (XEXP (inner, 1)),
7652 unsignedp, in_dest, in_compare);
7653 if (new_rtx != 0)
7654 return gen_rtx_ASHIFT (mode, new_rtx, XEXP (inner, 1));
7655 }
7656 else if (GET_CODE (inner) == TRUNCATE
7657 /* If trying or potentionally trying to extract
7658 bits outside of is_mode, don't look through
7659 TRUNCATE. See PR82192. */
7660 && pos_rtx == NULL_RTX
7661 && known_le (pos + len, GET_MODE_PRECISION (is_mode)))
7662 inner = XEXP (inner, 0);
7663
7664 inner_mode = GET_MODE (inner);
7665
7666 /* See if this can be done without an extraction. We never can if the
7667 width of the field is not the same as that of some integer mode. For
7668 registers, we can only avoid the extraction if the position is at the
7669 low-order bit and this is either not in the destination or we have the
7670 appropriate STRICT_LOW_PART operation available.
7671
7672 For MEM, we can avoid an extract if the field starts on an appropriate
7673 boundary and we can change the mode of the memory reference. */
7674
7675 scalar_int_mode tmode;
7676 if (int_mode_for_size (len, 1).exists (&tmode)
7677 && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
7678 && !MEM_P (inner)
7679 && (pos == 0 || REG_P (inner))
7680 && (inner_mode == tmode
7681 || !REG_P (inner)
7682 || TRULY_NOOP_TRUNCATION_MODES_P (tmode, inner_mode)
7683 || reg_truncated_to_mode (tmode, inner))
7684 && (! in_dest
7685 || (REG_P (inner)
7686 && have_insn_for (STRICT_LOW_PART, tmode))))
7687 || (MEM_P (inner) && pos_rtx == 0
7688 && (pos
7689 % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
7690 : BITS_PER_UNIT)) == 0
7691 /* We can't do this if we are widening INNER_MODE (it
7692 may not be aligned, for one thing). */
7693 && !paradoxical_subreg_p (tmode, inner_mode)
7694 && known_le (pos + len, GET_MODE_PRECISION (is_mode))
7695 && (inner_mode == tmode
7696 || (! mode_dependent_address_p (XEXP (inner, 0),
7697 MEM_ADDR_SPACE (inner))
7698 && ! MEM_VOLATILE_P (inner))))))
7699 {
7700 /* If INNER is a MEM, make a new MEM that encompasses just the desired
7701 field. If the original and current mode are the same, we need not
7702 adjust the offset. Otherwise, we do if bytes big endian.
7703
7704 If INNER is not a MEM, get a piece consisting of just the field
7705 of interest (in this case POS % BITS_PER_WORD must be 0). */
7706
7707 if (MEM_P (inner))
7708 {
7709 poly_int64 offset;
7710
7711 /* POS counts from lsb, but make OFFSET count in memory order. */
7712 if (BYTES_BIG_ENDIAN)
7713 offset = bits_to_bytes_round_down (GET_MODE_PRECISION (is_mode)
7714 - len - pos);
7715 else
7716 offset = pos / BITS_PER_UNIT;
7717
7718 new_rtx = adjust_address_nv (inner, tmode, offset);
7719 }
7720 else if (REG_P (inner))
7721 {
7722 if (tmode != inner_mode)
7723 {
7724 /* We can't call gen_lowpart in a DEST since we
7725 always want a SUBREG (see below) and it would sometimes
7726 return a new hard register. */
7727 if (pos || in_dest)
7728 {
7729 poly_uint64 offset
7730 = subreg_offset_from_lsb (tmode, inner_mode, pos);
7731
7732 /* Avoid creating invalid subregs, for example when
7733 simplifying (x>>32)&255. */
7734 if (!validate_subreg (tmode, inner_mode, inner, offset))
7735 return NULL_RTX;
7736
7737 new_rtx = gen_rtx_SUBREG (tmode, inner, offset);
7738 }
7739 else
7740 new_rtx = gen_lowpart (tmode, inner);
7741 }
7742 else
7743 new_rtx = inner;
7744 }
7745 else
7746 new_rtx = force_to_mode (inner, tmode,
7747 len >= HOST_BITS_PER_WIDE_INT
7748 ? HOST_WIDE_INT_M1U
7749 : (HOST_WIDE_INT_1U << len) - 1, 0);
7750
7751 /* If this extraction is going into the destination of a SET,
7752 make a STRICT_LOW_PART unless we made a MEM. */
7753
7754 if (in_dest)
7755 return (MEM_P (new_rtx) ? new_rtx
7756 : (GET_CODE (new_rtx) != SUBREG
7757 ? gen_rtx_CLOBBER (tmode, const0_rtx)
7758 : gen_rtx_STRICT_LOW_PART (VOIDmode, new_rtx)));
7759
7760 if (mode == tmode)
7761 return new_rtx;
7762
7763 if (CONST_SCALAR_INT_P (new_rtx))
7764 return simplify_unary_operation (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
7765 mode, new_rtx, tmode);
7766
7767 /* If we know that no extraneous bits are set, and that the high
7768 bit is not set, convert the extraction to the cheaper of
7769 sign and zero extension, that are equivalent in these cases. */
7770 if (flag_expensive_optimizations
7771 && (HWI_COMPUTABLE_MODE_P (tmode)
7772 && ((nonzero_bits (new_rtx, tmode)
7773 & ~(((unsigned HOST_WIDE_INT)GET_MODE_MASK (tmode)) >> 1))
7774 == 0)))
7775 {
7776 rtx temp = gen_rtx_ZERO_EXTEND (mode, new_rtx);
7777 rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new_rtx);
7778
7779 /* Prefer ZERO_EXTENSION, since it gives more information to
7780 backends. */
7781 if (set_src_cost (temp, mode, optimize_this_for_speed_p)
7782 <= set_src_cost (temp1, mode, optimize_this_for_speed_p))
7783 return temp;
7784 return temp1;
7785 }
7786
7787 /* Otherwise, sign- or zero-extend unless we already are in the
7788 proper mode. */
7789
7790 return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
7791 mode, new_rtx));
7792 }
7793
7794 /* Unless this is a COMPARE or we have a funny memory reference,
7795 don't do anything with zero-extending field extracts starting at
7796 the low-order bit since they are simple AND operations. */
7797 if (pos_rtx == 0 && pos == 0 && ! in_dest
7798 && ! in_compare && unsignedp)
7799 return 0;
7800
7801 /* Unless INNER is not MEM, reject this if we would be spanning bytes or
7802 if the position is not a constant and the length is not 1. In all
7803 other cases, we would only be going outside our object in cases when
7804 an original shift would have been undefined. */
7805 if (MEM_P (inner)
7806 && ((pos_rtx == 0 && maybe_gt (pos + len, GET_MODE_PRECISION (is_mode)))
7807 || (pos_rtx != 0 && len != 1)))
7808 return 0;
7809
7810 enum extraction_pattern pattern = (in_dest ? EP_insv
7811 : unsignedp ? EP_extzv : EP_extv);
7812
7813 /* If INNER is not from memory, we want it to have the mode of a register
7814 extraction pattern's structure operand, or word_mode if there is no
7815 such pattern. The same applies to extraction_mode and pos_mode
7816 and their respective operands.
7817
7818 For memory, assume that the desired extraction_mode and pos_mode
7819 are the same as for a register operation, since at present we don't
7820 have named patterns for aligned memory structures. */
7821 class extraction_insn insn;
7822 unsigned int inner_size;
7823 if (GET_MODE_BITSIZE (inner_mode).is_constant (&inner_size)
7824 && get_best_reg_extraction_insn (&insn, pattern, inner_size, mode))
7825 {
7826 wanted_inner_reg_mode = insn.struct_mode.require ();
7827 pos_mode = insn.pos_mode;
7828 extraction_mode = insn.field_mode;
7829 }
7830
7831 /* Never narrow an object, since that might not be safe. */
7832
7833 if (mode != VOIDmode
7834 && partial_subreg_p (extraction_mode, mode))
7835 extraction_mode = mode;
7836
7837 /* Punt if len is too large for extraction_mode. */
7838 if (maybe_gt (len, GET_MODE_PRECISION (extraction_mode)))
7839 return NULL_RTX;
7840
7841 if (!MEM_P (inner))
7842 wanted_inner_mode = wanted_inner_reg_mode;
7843 else
7844 {
7845 /* Be careful not to go beyond the extracted object and maintain the
7846 natural alignment of the memory. */
7847 wanted_inner_mode = smallest_int_mode_for_size (len);
7848 while (pos % GET_MODE_BITSIZE (wanted_inner_mode) + len
7849 > GET_MODE_BITSIZE (wanted_inner_mode))
7850 wanted_inner_mode = GET_MODE_WIDER_MODE (wanted_inner_mode).require ();
7851 }
7852
7853 orig_pos = pos;
7854
7855 if (BITS_BIG_ENDIAN)
7856 {
7857 /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
7858 BITS_BIG_ENDIAN style. If position is constant, compute new
7859 position. Otherwise, build subtraction.
7860 Note that POS is relative to the mode of the original argument.
7861 If it's a MEM we need to recompute POS relative to that.
7862 However, if we're extracting from (or inserting into) a register,
7863 we want to recompute POS relative to wanted_inner_mode. */
7864 int width;
7865 if (!MEM_P (inner))
7866 width = GET_MODE_BITSIZE (wanted_inner_mode);
7867 else if (!GET_MODE_BITSIZE (is_mode).is_constant (&width))
7868 return NULL_RTX;
7869
7870 if (pos_rtx == 0)
7871 pos = width - len - pos;
7872 else
7873 pos_rtx
7874 = gen_rtx_MINUS (GET_MODE (pos_rtx),
7875 gen_int_mode (width - len, GET_MODE (pos_rtx)),
7876 pos_rtx);
7877 /* POS may be less than 0 now, but we check for that below.
7878 Note that it can only be less than 0 if !MEM_P (inner). */
7879 }
7880
7881 /* If INNER has a wider mode, and this is a constant extraction, try to
7882 make it smaller and adjust the byte to point to the byte containing
7883 the value. */
7884 if (wanted_inner_mode != VOIDmode
7885 && inner_mode != wanted_inner_mode
7886 && ! pos_rtx
7887 && partial_subreg_p (wanted_inner_mode, is_mode)
7888 && MEM_P (inner)
7889 && ! mode_dependent_address_p (XEXP (inner, 0), MEM_ADDR_SPACE (inner))
7890 && ! MEM_VOLATILE_P (inner))
7891 {
7892 poly_int64 offset = 0;
7893
7894 /* The computations below will be correct if the machine is big
7895 endian in both bits and bytes or little endian in bits and bytes.
7896 If it is mixed, we must adjust. */
7897
7898 /* If bytes are big endian and we had a paradoxical SUBREG, we must
7899 adjust OFFSET to compensate. */
7900 if (BYTES_BIG_ENDIAN
7901 && paradoxical_subreg_p (is_mode, inner_mode))
7902 offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
7903
7904 /* We can now move to the desired byte. */
7905 offset += (pos / GET_MODE_BITSIZE (wanted_inner_mode))
7906 * GET_MODE_SIZE (wanted_inner_mode);
7907 pos %= GET_MODE_BITSIZE (wanted_inner_mode);
7908
7909 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
7910 && is_mode != wanted_inner_mode)
7911 offset = (GET_MODE_SIZE (is_mode)
7912 - GET_MODE_SIZE (wanted_inner_mode) - offset);
7913
7914 inner = adjust_address_nv (inner, wanted_inner_mode, offset);
7915 }
7916
7917 /* If INNER is not memory, get it into the proper mode. If we are changing
7918 its mode, POS must be a constant and smaller than the size of the new
7919 mode. */
7920 else if (!MEM_P (inner))
7921 {
7922 /* On the LHS, don't create paradoxical subregs implicitely truncating
7923 the register unless TARGET_TRULY_NOOP_TRUNCATION. */
7924 if (in_dest
7925 && !TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (inner),
7926 wanted_inner_mode))
7927 return NULL_RTX;
7928
7929 if (GET_MODE (inner) != wanted_inner_mode
7930 && (pos_rtx != 0
7931 || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
7932 return NULL_RTX;
7933
7934 if (orig_pos < 0)
7935 return NULL_RTX;
7936
7937 inner = force_to_mode (inner, wanted_inner_mode,
7938 pos_rtx
7939 || len + orig_pos >= HOST_BITS_PER_WIDE_INT
7940 ? HOST_WIDE_INT_M1U
7941 : (((HOST_WIDE_INT_1U << len) - 1)
7942 << orig_pos),
7943 0);
7944 }
7945
7946 /* Adjust mode of POS_RTX, if needed. If we want a wider mode, we
7947 have to zero extend. Otherwise, we can just use a SUBREG.
7948
7949 We dealt with constant rtxes earlier, so pos_rtx cannot
7950 have VOIDmode at this point. */
7951 if (pos_rtx != 0
7952 && (GET_MODE_SIZE (pos_mode)
7953 > GET_MODE_SIZE (as_a <scalar_int_mode> (GET_MODE (pos_rtx)))))
7954 {
7955 rtx temp = simplify_gen_unary (ZERO_EXTEND, pos_mode, pos_rtx,
7956 GET_MODE (pos_rtx));
7957
7958 /* If we know that no extraneous bits are set, and that the high
7959 bit is not set, convert extraction to cheaper one - either
7960 SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
7961 cases. */
7962 if (flag_expensive_optimizations
7963 && (HWI_COMPUTABLE_MODE_P (GET_MODE (pos_rtx))
7964 && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
7965 & ~(((unsigned HOST_WIDE_INT)
7966 GET_MODE_MASK (GET_MODE (pos_rtx)))
7967 >> 1))
7968 == 0)))
7969 {
7970 rtx temp1 = simplify_gen_unary (SIGN_EXTEND, pos_mode, pos_rtx,
7971 GET_MODE (pos_rtx));
7972
7973 /* Prefer ZERO_EXTENSION, since it gives more information to
7974 backends. */
7975 if (set_src_cost (temp1, pos_mode, optimize_this_for_speed_p)
7976 < set_src_cost (temp, pos_mode, optimize_this_for_speed_p))
7977 temp = temp1;
7978 }
7979 pos_rtx = temp;
7980 }
7981
7982 /* Make POS_RTX unless we already have it and it is correct. If we don't
7983 have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
7984 be a CONST_INT. */
7985 if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
7986 pos_rtx = orig_pos_rtx;
7987
7988 else if (pos_rtx == 0)
7989 pos_rtx = GEN_INT (pos);
7990
7991 /* Make the required operation. See if we can use existing rtx. */
7992 new_rtx = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
7993 extraction_mode, inner, GEN_INT (len), pos_rtx);
7994 if (! in_dest)
7995 new_rtx = gen_lowpart (mode, new_rtx);
7996
7997 return new_rtx;
7998 }
7999 \f
8000 /* See if X (of mode MODE) contains an ASHIFT of COUNT or more bits that
8001 can be commuted with any other operations in X. Return X without
8002 that shift if so. */
8003
8004 static rtx
8005 extract_left_shift (scalar_int_mode mode, rtx x, int count)
8006 {
8007 enum rtx_code code = GET_CODE (x);
8008 rtx tem;
8009
8010 switch (code)
8011 {
8012 case ASHIFT:
8013 /* This is the shift itself. If it is wide enough, we will return
8014 either the value being shifted if the shift count is equal to
8015 COUNT or a shift for the difference. */
8016 if (CONST_INT_P (XEXP (x, 1))
8017 && INTVAL (XEXP (x, 1)) >= count)
8018 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
8019 INTVAL (XEXP (x, 1)) - count);
8020 break;
8021
8022 case NEG: case NOT:
8023 if ((tem = extract_left_shift (mode, XEXP (x, 0), count)) != 0)
8024 return simplify_gen_unary (code, mode, tem, mode);
8025
8026 break;
8027
8028 case PLUS: case IOR: case XOR: case AND:
8029 /* If we can safely shift this constant and we find the inner shift,
8030 make a new operation. */
8031 if (CONST_INT_P (XEXP (x, 1))
8032 && (UINTVAL (XEXP (x, 1))
8033 & (((HOST_WIDE_INT_1U << count)) - 1)) == 0
8034 && (tem = extract_left_shift (mode, XEXP (x, 0), count)) != 0)
8035 {
8036 HOST_WIDE_INT val = INTVAL (XEXP (x, 1)) >> count;
8037 return simplify_gen_binary (code, mode, tem,
8038 gen_int_mode (val, mode));
8039 }
8040 break;
8041
8042 default:
8043 break;
8044 }
8045
8046 return 0;
8047 }
8048 \f
8049 /* Subroutine of make_compound_operation. *X_PTR is the rtx at the current
8050 level of the expression and MODE is its mode. IN_CODE is as for
8051 make_compound_operation. *NEXT_CODE_PTR is the value of IN_CODE
8052 that should be used when recursing on operands of *X_PTR.
8053
8054 There are two possible actions:
8055
8056 - Return null. This tells the caller to recurse on *X_PTR with IN_CODE
8057 equal to *NEXT_CODE_PTR, after which *X_PTR holds the final value.
8058
8059 - Return a new rtx, which the caller returns directly. */
8060
8061 static rtx
8062 make_compound_operation_int (scalar_int_mode mode, rtx *x_ptr,
8063 enum rtx_code in_code,
8064 enum rtx_code *next_code_ptr)
8065 {
8066 rtx x = *x_ptr;
8067 enum rtx_code next_code = *next_code_ptr;
8068 enum rtx_code code = GET_CODE (x);
8069 int mode_width = GET_MODE_PRECISION (mode);
8070 rtx rhs, lhs;
8071 rtx new_rtx = 0;
8072 int i;
8073 rtx tem;
8074 scalar_int_mode inner_mode;
8075 bool equality_comparison = false;
8076
8077 if (in_code == EQ)
8078 {
8079 equality_comparison = true;
8080 in_code = COMPARE;
8081 }
8082
8083 /* Process depending on the code of this operation. If NEW is set
8084 nonzero, it will be returned. */
8085
8086 switch (code)
8087 {
8088 case ASHIFT:
8089 /* Convert shifts by constants into multiplications if inside
8090 an address. */
8091 if (in_code == MEM && CONST_INT_P (XEXP (x, 1))
8092 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
8093 && INTVAL (XEXP (x, 1)) >= 0)
8094 {
8095 HOST_WIDE_INT count = INTVAL (XEXP (x, 1));
8096 HOST_WIDE_INT multval = HOST_WIDE_INT_1 << count;
8097
8098 new_rtx = make_compound_operation (XEXP (x, 0), next_code);
8099 if (GET_CODE (new_rtx) == NEG)
8100 {
8101 new_rtx = XEXP (new_rtx, 0);
8102 multval = -multval;
8103 }
8104 multval = trunc_int_for_mode (multval, mode);
8105 new_rtx = gen_rtx_MULT (mode, new_rtx, gen_int_mode (multval, mode));
8106 }
8107 break;
8108
8109 case PLUS:
8110 lhs = XEXP (x, 0);
8111 rhs = XEXP (x, 1);
8112 lhs = make_compound_operation (lhs, next_code);
8113 rhs = make_compound_operation (rhs, next_code);
8114 if (GET_CODE (lhs) == MULT && GET_CODE (XEXP (lhs, 0)) == NEG)
8115 {
8116 tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (lhs, 0), 0),
8117 XEXP (lhs, 1));
8118 new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
8119 }
8120 else if (GET_CODE (lhs) == MULT
8121 && (CONST_INT_P (XEXP (lhs, 1)) && INTVAL (XEXP (lhs, 1)) < 0))
8122 {
8123 tem = simplify_gen_binary (MULT, mode, XEXP (lhs, 0),
8124 simplify_gen_unary (NEG, mode,
8125 XEXP (lhs, 1),
8126 mode));
8127 new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
8128 }
8129 else
8130 {
8131 SUBST (XEXP (x, 0), lhs);
8132 SUBST (XEXP (x, 1), rhs);
8133 }
8134 maybe_swap_commutative_operands (x);
8135 return x;
8136
8137 case MINUS:
8138 lhs = XEXP (x, 0);
8139 rhs = XEXP (x, 1);
8140 lhs = make_compound_operation (lhs, next_code);
8141 rhs = make_compound_operation (rhs, next_code);
8142 if (GET_CODE (rhs) == MULT && GET_CODE (XEXP (rhs, 0)) == NEG)
8143 {
8144 tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (rhs, 0), 0),
8145 XEXP (rhs, 1));
8146 return simplify_gen_binary (PLUS, mode, tem, lhs);
8147 }
8148 else if (GET_CODE (rhs) == MULT
8149 && (CONST_INT_P (XEXP (rhs, 1)) && INTVAL (XEXP (rhs, 1)) < 0))
8150 {
8151 tem = simplify_gen_binary (MULT, mode, XEXP (rhs, 0),
8152 simplify_gen_unary (NEG, mode,
8153 XEXP (rhs, 1),
8154 mode));
8155 return simplify_gen_binary (PLUS, mode, tem, lhs);
8156 }
8157 else
8158 {
8159 SUBST (XEXP (x, 0), lhs);
8160 SUBST (XEXP (x, 1), rhs);
8161 return x;
8162 }
8163
8164 case AND:
8165 /* If the second operand is not a constant, we can't do anything
8166 with it. */
8167 if (!CONST_INT_P (XEXP (x, 1)))
8168 break;
8169
8170 /* If the constant is a power of two minus one and the first operand
8171 is a logical right shift, make an extraction. */
8172 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8173 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
8174 {
8175 new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
8176 new_rtx = make_extraction (mode, new_rtx, 0, XEXP (XEXP (x, 0), 1),
8177 i, 1, 0, in_code == COMPARE);
8178 }
8179
8180 /* Same as previous, but for (subreg (lshiftrt ...)) in first op. */
8181 else if (GET_CODE (XEXP (x, 0)) == SUBREG
8182 && subreg_lowpart_p (XEXP (x, 0))
8183 && is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (XEXP (x, 0))),
8184 &inner_mode)
8185 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
8186 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
8187 {
8188 rtx inner_x0 = SUBREG_REG (XEXP (x, 0));
8189 new_rtx = make_compound_operation (XEXP (inner_x0, 0), next_code);
8190 new_rtx = make_extraction (inner_mode, new_rtx, 0,
8191 XEXP (inner_x0, 1),
8192 i, 1, 0, in_code == COMPARE);
8193
8194 /* If we narrowed the mode when dropping the subreg, then we lose. */
8195 if (GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (mode))
8196 new_rtx = NULL;
8197
8198 /* If that didn't give anything, see if the AND simplifies on
8199 its own. */
8200 if (!new_rtx && i >= 0)
8201 {
8202 new_rtx = make_compound_operation (XEXP (x, 0), next_code);
8203 new_rtx = make_extraction (mode, new_rtx, 0, NULL_RTX, i, 1,
8204 0, in_code == COMPARE);
8205 }
8206 }
8207 /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)). */
8208 else if ((GET_CODE (XEXP (x, 0)) == XOR
8209 || GET_CODE (XEXP (x, 0)) == IOR)
8210 && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
8211 && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
8212 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
8213 {
8214 /* Apply the distributive law, and then try to make extractions. */
8215 new_rtx = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
8216 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
8217 XEXP (x, 1)),
8218 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
8219 XEXP (x, 1)));
8220 new_rtx = make_compound_operation (new_rtx, in_code);
8221 }
8222
8223 /* If we are have (and (rotate X C) M) and C is larger than the number
8224 of bits in M, this is an extraction. */
8225
8226 else if (GET_CODE (XEXP (x, 0)) == ROTATE
8227 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8228 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0
8229 && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
8230 {
8231 new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
8232 new_rtx = make_extraction (mode, new_rtx,
8233 (GET_MODE_PRECISION (mode)
8234 - INTVAL (XEXP (XEXP (x, 0), 1))),
8235 NULL_RTX, i, 1, 0, in_code == COMPARE);
8236 }
8237
8238 /* On machines without logical shifts, if the operand of the AND is
8239 a logical shift and our mask turns off all the propagated sign
8240 bits, we can replace the logical shift with an arithmetic shift. */
8241 else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8242 && !have_insn_for (LSHIFTRT, mode)
8243 && have_insn_for (ASHIFTRT, mode)
8244 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8245 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8246 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
8247 && mode_width <= HOST_BITS_PER_WIDE_INT)
8248 {
8249 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
8250
8251 mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
8252 if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
8253 SUBST (XEXP (x, 0),
8254 gen_rtx_ASHIFTRT (mode,
8255 make_compound_operation (XEXP (XEXP (x,
8256 0),
8257 0),
8258 next_code),
8259 XEXP (XEXP (x, 0), 1)));
8260 }
8261
8262 /* If the constant is one less than a power of two, this might be
8263 representable by an extraction even if no shift is present.
8264 If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
8265 we are in a COMPARE. */
8266 else if ((i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
8267 new_rtx = make_extraction (mode,
8268 make_compound_operation (XEXP (x, 0),
8269 next_code),
8270 0, NULL_RTX, i, 1, 0, in_code == COMPARE);
8271
8272 /* If we are in a comparison and this is an AND with a power of two,
8273 convert this into the appropriate bit extract. */
8274 else if (in_code == COMPARE
8275 && (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0
8276 && (equality_comparison || i < GET_MODE_PRECISION (mode) - 1))
8277 new_rtx = make_extraction (mode,
8278 make_compound_operation (XEXP (x, 0),
8279 next_code),
8280 i, NULL_RTX, 1, 1, 0, 1);
8281
8282 /* If the one operand is a paradoxical subreg of a register or memory and
8283 the constant (limited to the smaller mode) has only zero bits where
8284 the sub expression has known zero bits, this can be expressed as
8285 a zero_extend. */
8286 else if (GET_CODE (XEXP (x, 0)) == SUBREG)
8287 {
8288 rtx sub;
8289
8290 sub = XEXP (XEXP (x, 0), 0);
8291 machine_mode sub_mode = GET_MODE (sub);
8292 int sub_width;
8293 if ((REG_P (sub) || MEM_P (sub))
8294 && GET_MODE_PRECISION (sub_mode).is_constant (&sub_width)
8295 && sub_width < mode_width)
8296 {
8297 unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (sub_mode);
8298 unsigned HOST_WIDE_INT mask;
8299
8300 /* original AND constant with all the known zero bits set */
8301 mask = UINTVAL (XEXP (x, 1)) | (~nonzero_bits (sub, sub_mode));
8302 if ((mask & mode_mask) == mode_mask)
8303 {
8304 new_rtx = make_compound_operation (sub, next_code);
8305 new_rtx = make_extraction (mode, new_rtx, 0, 0, sub_width,
8306 1, 0, in_code == COMPARE);
8307 }
8308 }
8309 }
8310
8311 break;
8312
8313 case LSHIFTRT:
8314 /* If the sign bit is known to be zero, replace this with an
8315 arithmetic shift. */
8316 if (have_insn_for (ASHIFTRT, mode)
8317 && ! have_insn_for (LSHIFTRT, mode)
8318 && mode_width <= HOST_BITS_PER_WIDE_INT
8319 && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
8320 {
8321 new_rtx = gen_rtx_ASHIFTRT (mode,
8322 make_compound_operation (XEXP (x, 0),
8323 next_code),
8324 XEXP (x, 1));
8325 break;
8326 }
8327
8328 /* fall through */
8329
8330 case ASHIFTRT:
8331 lhs = XEXP (x, 0);
8332 rhs = XEXP (x, 1);
8333
8334 /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
8335 this is a SIGN_EXTRACT. */
8336 if (CONST_INT_P (rhs)
8337 && GET_CODE (lhs) == ASHIFT
8338 && CONST_INT_P (XEXP (lhs, 1))
8339 && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))
8340 && INTVAL (XEXP (lhs, 1)) >= 0
8341 && INTVAL (rhs) < mode_width)
8342 {
8343 new_rtx = make_compound_operation (XEXP (lhs, 0), next_code);
8344 new_rtx = make_extraction (mode, new_rtx,
8345 INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
8346 NULL_RTX, mode_width - INTVAL (rhs),
8347 code == LSHIFTRT, 0, in_code == COMPARE);
8348 break;
8349 }
8350
8351 /* See if we have operations between an ASHIFTRT and an ASHIFT.
8352 If so, try to merge the shifts into a SIGN_EXTEND. We could
8353 also do this for some cases of SIGN_EXTRACT, but it doesn't
8354 seem worth the effort; the case checked for occurs on Alpha. */
8355
8356 if (!OBJECT_P (lhs)
8357 && ! (GET_CODE (lhs) == SUBREG
8358 && (OBJECT_P (SUBREG_REG (lhs))))
8359 && CONST_INT_P (rhs)
8360 && INTVAL (rhs) >= 0
8361 && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
8362 && INTVAL (rhs) < mode_width
8363 && (new_rtx = extract_left_shift (mode, lhs, INTVAL (rhs))) != 0)
8364 new_rtx = make_extraction (mode, make_compound_operation (new_rtx,
8365 next_code),
8366 0, NULL_RTX, mode_width - INTVAL (rhs),
8367 code == LSHIFTRT, 0, in_code == COMPARE);
8368
8369 break;
8370
8371 case SUBREG:
8372 /* Call ourselves recursively on the inner expression. If we are
8373 narrowing the object and it has a different RTL code from
8374 what it originally did, do this SUBREG as a force_to_mode. */
8375 {
8376 rtx inner = SUBREG_REG (x), simplified;
8377 enum rtx_code subreg_code = in_code;
8378
8379 /* If the SUBREG is masking of a logical right shift,
8380 make an extraction. */
8381 if (GET_CODE (inner) == LSHIFTRT
8382 && is_a <scalar_int_mode> (GET_MODE (inner), &inner_mode)
8383 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (inner_mode)
8384 && CONST_INT_P (XEXP (inner, 1))
8385 && UINTVAL (XEXP (inner, 1)) < GET_MODE_PRECISION (inner_mode)
8386 && subreg_lowpart_p (x))
8387 {
8388 new_rtx = make_compound_operation (XEXP (inner, 0), next_code);
8389 int width = GET_MODE_PRECISION (inner_mode)
8390 - INTVAL (XEXP (inner, 1));
8391 if (width > mode_width)
8392 width = mode_width;
8393 new_rtx = make_extraction (mode, new_rtx, 0, XEXP (inner, 1),
8394 width, 1, 0, in_code == COMPARE);
8395 break;
8396 }
8397
8398 /* If in_code is COMPARE, it isn't always safe to pass it through
8399 to the recursive make_compound_operation call. */
8400 if (subreg_code == COMPARE
8401 && (!subreg_lowpart_p (x)
8402 || GET_CODE (inner) == SUBREG
8403 /* (subreg:SI (and:DI (reg:DI) (const_int 0x800000000)) 0)
8404 is (const_int 0), rather than
8405 (subreg:SI (lshiftrt:DI (reg:DI) (const_int 35)) 0).
8406 Similarly (subreg:QI (and:SI (reg:SI) (const_int 0x80)) 0)
8407 for non-equality comparisons against 0 is not equivalent
8408 to (subreg:QI (lshiftrt:SI (reg:SI) (const_int 7)) 0). */
8409 || (GET_CODE (inner) == AND
8410 && CONST_INT_P (XEXP (inner, 1))
8411 && partial_subreg_p (x)
8412 && exact_log2 (UINTVAL (XEXP (inner, 1)))
8413 >= GET_MODE_BITSIZE (mode) - 1)))
8414 subreg_code = SET;
8415
8416 tem = make_compound_operation (inner, subreg_code);
8417
8418 simplified
8419 = simplify_subreg (mode, tem, GET_MODE (inner), SUBREG_BYTE (x));
8420 if (simplified)
8421 tem = simplified;
8422
8423 if (GET_CODE (tem) != GET_CODE (inner)
8424 && partial_subreg_p (x)
8425 && subreg_lowpart_p (x))
8426 {
8427 rtx newer
8428 = force_to_mode (tem, mode, HOST_WIDE_INT_M1U, 0);
8429
8430 /* If we have something other than a SUBREG, we might have
8431 done an expansion, so rerun ourselves. */
8432 if (GET_CODE (newer) != SUBREG)
8433 newer = make_compound_operation (newer, in_code);
8434
8435 /* force_to_mode can expand compounds. If it just re-expanded
8436 the compound, use gen_lowpart to convert to the desired
8437 mode. */
8438 if (rtx_equal_p (newer, x)
8439 /* Likewise if it re-expanded the compound only partially.
8440 This happens for SUBREG of ZERO_EXTRACT if they extract
8441 the same number of bits. */
8442 || (GET_CODE (newer) == SUBREG
8443 && (GET_CODE (SUBREG_REG (newer)) == LSHIFTRT
8444 || GET_CODE (SUBREG_REG (newer)) == ASHIFTRT)
8445 && GET_CODE (inner) == AND
8446 && rtx_equal_p (SUBREG_REG (newer), XEXP (inner, 0))))
8447 return gen_lowpart (GET_MODE (x), tem);
8448
8449 return newer;
8450 }
8451
8452 if (simplified)
8453 return tem;
8454 }
8455 break;
8456
8457 default:
8458 break;
8459 }
8460
8461 if (new_rtx)
8462 *x_ptr = gen_lowpart (mode, new_rtx);
8463 *next_code_ptr = next_code;
8464 return NULL_RTX;
8465 }
8466
8467 /* Look at the expression rooted at X. Look for expressions
8468 equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
8469 Form these expressions.
8470
8471 Return the new rtx, usually just X.
8472
8473 Also, for machines like the VAX that don't have logical shift insns,
8474 try to convert logical to arithmetic shift operations in cases where
8475 they are equivalent. This undoes the canonicalizations to logical
8476 shifts done elsewhere.
8477
8478 We try, as much as possible, to re-use rtl expressions to save memory.
8479
8480 IN_CODE says what kind of expression we are processing. Normally, it is
8481 SET. In a memory address it is MEM. When processing the arguments of
8482 a comparison or a COMPARE against zero, it is COMPARE, or EQ if more
8483 precisely it is an equality comparison against zero. */
8484
8485 rtx
8486 make_compound_operation (rtx x, enum rtx_code in_code)
8487 {
8488 enum rtx_code code = GET_CODE (x);
8489 const char *fmt;
8490 int i, j;
8491 enum rtx_code next_code;
8492 rtx new_rtx, tem;
8493
8494 /* Select the code to be used in recursive calls. Once we are inside an
8495 address, we stay there. If we have a comparison, set to COMPARE,
8496 but once inside, go back to our default of SET. */
8497
8498 next_code = (code == MEM ? MEM
8499 : ((code == COMPARE || COMPARISON_P (x))
8500 && XEXP (x, 1) == const0_rtx) ? COMPARE
8501 : in_code == COMPARE || in_code == EQ ? SET : in_code);
8502
8503 scalar_int_mode mode;
8504 if (is_a <scalar_int_mode> (GET_MODE (x), &mode))
8505 {
8506 rtx new_rtx = make_compound_operation_int (mode, &x, in_code,
8507 &next_code);
8508 if (new_rtx)
8509 return new_rtx;
8510 code = GET_CODE (x);
8511 }
8512
8513 /* Now recursively process each operand of this operation. We need to
8514 handle ZERO_EXTEND specially so that we don't lose track of the
8515 inner mode. */
8516 if (code == ZERO_EXTEND)
8517 {
8518 new_rtx = make_compound_operation (XEXP (x, 0), next_code);
8519 tem = simplify_const_unary_operation (ZERO_EXTEND, GET_MODE (x),
8520 new_rtx, GET_MODE (XEXP (x, 0)));
8521 if (tem)
8522 return tem;
8523 SUBST (XEXP (x, 0), new_rtx);
8524 return x;
8525 }
8526
8527 fmt = GET_RTX_FORMAT (code);
8528 for (i = 0; i < GET_RTX_LENGTH (code); i++)
8529 if (fmt[i] == 'e')
8530 {
8531 new_rtx = make_compound_operation (XEXP (x, i), next_code);
8532 SUBST (XEXP (x, i), new_rtx);
8533 }
8534 else if (fmt[i] == 'E')
8535 for (j = 0; j < XVECLEN (x, i); j++)
8536 {
8537 new_rtx = make_compound_operation (XVECEXP (x, i, j), next_code);
8538 SUBST (XVECEXP (x, i, j), new_rtx);
8539 }
8540
8541 maybe_swap_commutative_operands (x);
8542 return x;
8543 }
8544 \f
8545 /* Given M see if it is a value that would select a field of bits
8546 within an item, but not the entire word. Return -1 if not.
8547 Otherwise, return the starting position of the field, where 0 is the
8548 low-order bit.
8549
8550 *PLEN is set to the length of the field. */
8551
8552 static int
8553 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
8554 {
8555 /* Get the bit number of the first 1 bit from the right, -1 if none. */
8556 int pos = m ? ctz_hwi (m) : -1;
8557 int len = 0;
8558
8559 if (pos >= 0)
8560 /* Now shift off the low-order zero bits and see if we have a
8561 power of two minus 1. */
8562 len = exact_log2 ((m >> pos) + 1);
8563
8564 if (len <= 0)
8565 pos = -1;
8566
8567 *plen = len;
8568 return pos;
8569 }
8570 \f
8571 /* If X refers to a register that equals REG in value, replace these
8572 references with REG. */
8573 static rtx
8574 canon_reg_for_combine (rtx x, rtx reg)
8575 {
8576 rtx op0, op1, op2;
8577 const char *fmt;
8578 int i;
8579 bool copied;
8580
8581 enum rtx_code code = GET_CODE (x);
8582 switch (GET_RTX_CLASS (code))
8583 {
8584 case RTX_UNARY:
8585 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
8586 if (op0 != XEXP (x, 0))
8587 return simplify_gen_unary (GET_CODE (x), GET_MODE (x), op0,
8588 GET_MODE (reg));
8589 break;
8590
8591 case RTX_BIN_ARITH:
8592 case RTX_COMM_ARITH:
8593 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
8594 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
8595 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
8596 return simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
8597 break;
8598
8599 case RTX_COMPARE:
8600 case RTX_COMM_COMPARE:
8601 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
8602 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
8603 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
8604 return simplify_gen_relational (GET_CODE (x), GET_MODE (x),
8605 GET_MODE (op0), op0, op1);
8606 break;
8607
8608 case RTX_TERNARY:
8609 case RTX_BITFIELD_OPS:
8610 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
8611 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
8612 op2 = canon_reg_for_combine (XEXP (x, 2), reg);
8613 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1) || op2 != XEXP (x, 2))
8614 return simplify_gen_ternary (GET_CODE (x), GET_MODE (x),
8615 GET_MODE (op0), op0, op1, op2);
8616 /* FALLTHRU */
8617
8618 case RTX_OBJ:
8619 if (REG_P (x))
8620 {
8621 if (rtx_equal_p (get_last_value (reg), x)
8622 || rtx_equal_p (reg, get_last_value (x)))
8623 return reg;
8624 else
8625 break;
8626 }
8627
8628 /* fall through */
8629
8630 default:
8631 fmt = GET_RTX_FORMAT (code);
8632 copied = false;
8633 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8634 if (fmt[i] == 'e')
8635 {
8636 rtx op = canon_reg_for_combine (XEXP (x, i), reg);
8637 if (op != XEXP (x, i))
8638 {
8639 if (!copied)
8640 {
8641 copied = true;
8642 x = copy_rtx (x);
8643 }
8644 XEXP (x, i) = op;
8645 }
8646 }
8647 else if (fmt[i] == 'E')
8648 {
8649 int j;
8650 for (j = 0; j < XVECLEN (x, i); j++)
8651 {
8652 rtx op = canon_reg_for_combine (XVECEXP (x, i, j), reg);
8653 if (op != XVECEXP (x, i, j))
8654 {
8655 if (!copied)
8656 {
8657 copied = true;
8658 x = copy_rtx (x);
8659 }
8660 XVECEXP (x, i, j) = op;
8661 }
8662 }
8663 }
8664
8665 break;
8666 }
8667
8668 return x;
8669 }
8670
8671 /* Return X converted to MODE. If the value is already truncated to
8672 MODE we can just return a subreg even though in the general case we
8673 would need an explicit truncation. */
8674
8675 static rtx
8676 gen_lowpart_or_truncate (machine_mode mode, rtx x)
8677 {
8678 if (!CONST_INT_P (x)
8679 && partial_subreg_p (mode, GET_MODE (x))
8680 && !TRULY_NOOP_TRUNCATION_MODES_P (mode, GET_MODE (x))
8681 && !(REG_P (x) && reg_truncated_to_mode (mode, x)))
8682 {
8683 /* Bit-cast X into an integer mode. */
8684 if (!SCALAR_INT_MODE_P (GET_MODE (x)))
8685 x = gen_lowpart (int_mode_for_mode (GET_MODE (x)).require (), x);
8686 x = simplify_gen_unary (TRUNCATE, int_mode_for_mode (mode).require (),
8687 x, GET_MODE (x));
8688 }
8689
8690 return gen_lowpart (mode, x);
8691 }
8692
8693 /* See if X can be simplified knowing that we will only refer to it in
8694 MODE and will only refer to those bits that are nonzero in MASK.
8695 If other bits are being computed or if masking operations are done
8696 that select a superset of the bits in MASK, they can sometimes be
8697 ignored.
8698
8699 Return a possibly simplified expression, but always convert X to
8700 MODE. If X is a CONST_INT, AND the CONST_INT with MASK.
8701
8702 If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
8703 are all off in X. This is used when X will be complemented, by either
8704 NOT, NEG, or XOR. */
8705
8706 static rtx
8707 force_to_mode (rtx x, machine_mode mode, unsigned HOST_WIDE_INT mask,
8708 int just_select)
8709 {
8710 enum rtx_code code = GET_CODE (x);
8711 int next_select = just_select || code == XOR || code == NOT || code == NEG;
8712 machine_mode op_mode;
8713 unsigned HOST_WIDE_INT nonzero;
8714
8715 /* If this is a CALL or ASM_OPERANDS, don't do anything. Some of the
8716 code below will do the wrong thing since the mode of such an
8717 expression is VOIDmode.
8718
8719 Also do nothing if X is a CLOBBER; this can happen if X was
8720 the return value from a call to gen_lowpart. */
8721 if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
8722 return x;
8723
8724 /* We want to perform the operation in its present mode unless we know
8725 that the operation is valid in MODE, in which case we do the operation
8726 in MODE. */
8727 op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
8728 && have_insn_for (code, mode))
8729 ? mode : GET_MODE (x));
8730
8731 /* It is not valid to do a right-shift in a narrower mode
8732 than the one it came in with. */
8733 if ((code == LSHIFTRT || code == ASHIFTRT)
8734 && partial_subreg_p (mode, GET_MODE (x)))
8735 op_mode = GET_MODE (x);
8736
8737 /* Truncate MASK to fit OP_MODE. */
8738 if (op_mode)
8739 mask &= GET_MODE_MASK (op_mode);
8740
8741 /* Determine what bits of X are guaranteed to be (non)zero. */
8742 nonzero = nonzero_bits (x, mode);
8743
8744 /* If none of the bits in X are needed, return a zero. */
8745 if (!just_select && (nonzero & mask) == 0 && !side_effects_p (x))
8746 x = const0_rtx;
8747
8748 /* If X is a CONST_INT, return a new one. Do this here since the
8749 test below will fail. */
8750 if (CONST_INT_P (x))
8751 {
8752 if (SCALAR_INT_MODE_P (mode))
8753 return gen_int_mode (INTVAL (x) & mask, mode);
8754 else
8755 {
8756 x = GEN_INT (INTVAL (x) & mask);
8757 return gen_lowpart_common (mode, x);
8758 }
8759 }
8760
8761 /* If X is narrower than MODE and we want all the bits in X's mode, just
8762 get X in the proper mode. */
8763 if (paradoxical_subreg_p (mode, GET_MODE (x))
8764 && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
8765 return gen_lowpart (mode, x);
8766
8767 /* We can ignore the effect of a SUBREG if it narrows the mode or
8768 if the constant masks to zero all the bits the mode doesn't have. */
8769 if (GET_CODE (x) == SUBREG
8770 && subreg_lowpart_p (x)
8771 && (partial_subreg_p (x)
8772 || (mask
8773 & GET_MODE_MASK (GET_MODE (x))
8774 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))) == 0))
8775 return force_to_mode (SUBREG_REG (x), mode, mask, next_select);
8776
8777 scalar_int_mode int_mode, xmode;
8778 if (is_a <scalar_int_mode> (mode, &int_mode)
8779 && is_a <scalar_int_mode> (GET_MODE (x), &xmode))
8780 /* OP_MODE is either MODE or XMODE, so it must be a scalar
8781 integer too. */
8782 return force_int_to_mode (x, int_mode, xmode,
8783 as_a <scalar_int_mode> (op_mode),
8784 mask, just_select);
8785
8786 return gen_lowpart_or_truncate (mode, x);
8787 }
8788
8789 /* Subroutine of force_to_mode that handles cases in which both X and
8790 the result are scalar integers. MODE is the mode of the result,
8791 XMODE is the mode of X, and OP_MODE says which of MODE or XMODE
8792 is preferred for simplified versions of X. The other arguments
8793 are as for force_to_mode. */
8794
8795 static rtx
8796 force_int_to_mode (rtx x, scalar_int_mode mode, scalar_int_mode xmode,
8797 scalar_int_mode op_mode, unsigned HOST_WIDE_INT mask,
8798 int just_select)
8799 {
8800 enum rtx_code code = GET_CODE (x);
8801 int next_select = just_select || code == XOR || code == NOT || code == NEG;
8802 unsigned HOST_WIDE_INT fuller_mask;
8803 rtx op0, op1, temp;
8804 poly_int64 const_op0;
8805
8806 /* When we have an arithmetic operation, or a shift whose count we
8807 do not know, we need to assume that all bits up to the highest-order
8808 bit in MASK will be needed. This is how we form such a mask. */
8809 if (mask & (HOST_WIDE_INT_1U << (HOST_BITS_PER_WIDE_INT - 1)))
8810 fuller_mask = HOST_WIDE_INT_M1U;
8811 else
8812 fuller_mask = ((HOST_WIDE_INT_1U << (floor_log2 (mask) + 1))
8813 - 1);
8814
8815 switch (code)
8816 {
8817 case CLOBBER:
8818 /* If X is a (clobber (const_int)), return it since we know we are
8819 generating something that won't match. */
8820 return x;
8821
8822 case SIGN_EXTEND:
8823 case ZERO_EXTEND:
8824 case ZERO_EXTRACT:
8825 case SIGN_EXTRACT:
8826 x = expand_compound_operation (x);
8827 if (GET_CODE (x) != code)
8828 return force_to_mode (x, mode, mask, next_select);
8829 break;
8830
8831 case TRUNCATE:
8832 /* Similarly for a truncate. */
8833 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8834
8835 case AND:
8836 /* If this is an AND with a constant, convert it into an AND
8837 whose constant is the AND of that constant with MASK. If it
8838 remains an AND of MASK, delete it since it is redundant. */
8839
8840 if (CONST_INT_P (XEXP (x, 1)))
8841 {
8842 x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
8843 mask & INTVAL (XEXP (x, 1)));
8844 xmode = op_mode;
8845
8846 /* If X is still an AND, see if it is an AND with a mask that
8847 is just some low-order bits. If so, and it is MASK, we don't
8848 need it. */
8849
8850 if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
8851 && (INTVAL (XEXP (x, 1)) & GET_MODE_MASK (xmode)) == mask)
8852 x = XEXP (x, 0);
8853
8854 /* If it remains an AND, try making another AND with the bits
8855 in the mode mask that aren't in MASK turned on. If the
8856 constant in the AND is wide enough, this might make a
8857 cheaper constant. */
8858
8859 if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
8860 && GET_MODE_MASK (xmode) != mask
8861 && HWI_COMPUTABLE_MODE_P (xmode))
8862 {
8863 unsigned HOST_WIDE_INT cval
8864 = UINTVAL (XEXP (x, 1)) | (GET_MODE_MASK (xmode) & ~mask);
8865 rtx y;
8866
8867 y = simplify_gen_binary (AND, xmode, XEXP (x, 0),
8868 gen_int_mode (cval, xmode));
8869 if (set_src_cost (y, xmode, optimize_this_for_speed_p)
8870 < set_src_cost (x, xmode, optimize_this_for_speed_p))
8871 x = y;
8872 }
8873
8874 break;
8875 }
8876
8877 goto binop;
8878
8879 case PLUS:
8880 /* In (and (plus FOO C1) M), if M is a mask that just turns off
8881 low-order bits (as in an alignment operation) and FOO is already
8882 aligned to that boundary, mask C1 to that boundary as well.
8883 This may eliminate that PLUS and, later, the AND. */
8884
8885 {
8886 unsigned int width = GET_MODE_PRECISION (mode);
8887 unsigned HOST_WIDE_INT smask = mask;
8888
8889 /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
8890 number, sign extend it. */
8891
8892 if (width < HOST_BITS_PER_WIDE_INT
8893 && (smask & (HOST_WIDE_INT_1U << (width - 1))) != 0)
8894 smask |= HOST_WIDE_INT_M1U << width;
8895
8896 if (CONST_INT_P (XEXP (x, 1))
8897 && pow2p_hwi (- smask)
8898 && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
8899 && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
8900 return force_to_mode (plus_constant (xmode, XEXP (x, 0),
8901 (INTVAL (XEXP (x, 1)) & smask)),
8902 mode, smask, next_select);
8903 }
8904
8905 /* fall through */
8906
8907 case MULT:
8908 /* Substituting into the operands of a widening MULT is not likely to
8909 create RTL matching a machine insn. */
8910 if (code == MULT
8911 && (GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
8912 || GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
8913 && (GET_CODE (XEXP (x, 1)) == ZERO_EXTEND
8914 || GET_CODE (XEXP (x, 1)) == SIGN_EXTEND)
8915 && REG_P (XEXP (XEXP (x, 0), 0))
8916 && REG_P (XEXP (XEXP (x, 1), 0)))
8917 return gen_lowpart_or_truncate (mode, x);
8918
8919 /* For PLUS, MINUS and MULT, we need any bits less significant than the
8920 most significant bit in MASK since carries from those bits will
8921 affect the bits we are interested in. */
8922 mask = fuller_mask;
8923 goto binop;
8924
8925 case MINUS:
8926 /* If X is (minus C Y) where C's least set bit is larger than any bit
8927 in the mask, then we may replace with (neg Y). */
8928 if (poly_int_rtx_p (XEXP (x, 0), &const_op0)
8929 && known_alignment (poly_uint64 (const_op0)) > mask)
8930 {
8931 x = simplify_gen_unary (NEG, xmode, XEXP (x, 1), xmode);
8932 return force_to_mode (x, mode, mask, next_select);
8933 }
8934
8935 /* Similarly, if C contains every bit in the fuller_mask, then we may
8936 replace with (not Y). */
8937 if (CONST_INT_P (XEXP (x, 0))
8938 && ((UINTVAL (XEXP (x, 0)) | fuller_mask) == UINTVAL (XEXP (x, 0))))
8939 {
8940 x = simplify_gen_unary (NOT, xmode, XEXP (x, 1), xmode);
8941 return force_to_mode (x, mode, mask, next_select);
8942 }
8943
8944 mask = fuller_mask;
8945 goto binop;
8946
8947 case IOR:
8948 case XOR:
8949 /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
8950 LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
8951 operation which may be a bitfield extraction. Ensure that the
8952 constant we form is not wider than the mode of X. */
8953
8954 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8955 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8956 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8957 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
8958 && CONST_INT_P (XEXP (x, 1))
8959 && ((INTVAL (XEXP (XEXP (x, 0), 1))
8960 + floor_log2 (INTVAL (XEXP (x, 1))))
8961 < GET_MODE_PRECISION (xmode))
8962 && (UINTVAL (XEXP (x, 1))
8963 & ~nonzero_bits (XEXP (x, 0), xmode)) == 0)
8964 {
8965 temp = gen_int_mode ((INTVAL (XEXP (x, 1)) & mask)
8966 << INTVAL (XEXP (XEXP (x, 0), 1)),
8967 xmode);
8968 temp = simplify_gen_binary (GET_CODE (x), xmode,
8969 XEXP (XEXP (x, 0), 0), temp);
8970 x = simplify_gen_binary (LSHIFTRT, xmode, temp,
8971 XEXP (XEXP (x, 0), 1));
8972 return force_to_mode (x, mode, mask, next_select);
8973 }
8974
8975 binop:
8976 /* For most binary operations, just propagate into the operation and
8977 change the mode if we have an operation of that mode. */
8978
8979 op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
8980 op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
8981
8982 /* If we ended up truncating both operands, truncate the result of the
8983 operation instead. */
8984 if (GET_CODE (op0) == TRUNCATE
8985 && GET_CODE (op1) == TRUNCATE)
8986 {
8987 op0 = XEXP (op0, 0);
8988 op1 = XEXP (op1, 0);
8989 }
8990
8991 op0 = gen_lowpart_or_truncate (op_mode, op0);
8992 op1 = gen_lowpart_or_truncate (op_mode, op1);
8993
8994 if (op_mode != xmode || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
8995 {
8996 x = simplify_gen_binary (code, op_mode, op0, op1);
8997 xmode = op_mode;
8998 }
8999 break;
9000
9001 case ASHIFT:
9002 /* For left shifts, do the same, but just for the first operand.
9003 However, we cannot do anything with shifts where we cannot
9004 guarantee that the counts are smaller than the size of the mode
9005 because such a count will have a different meaning in a
9006 wider mode. */
9007
9008 if (! (CONST_INT_P (XEXP (x, 1))
9009 && INTVAL (XEXP (x, 1)) >= 0
9010 && INTVAL (XEXP (x, 1)) < GET_MODE_PRECISION (mode))
9011 && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
9012 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
9013 < (unsigned HOST_WIDE_INT) GET_MODE_PRECISION (mode))))
9014 break;
9015
9016 /* If the shift count is a constant and we can do arithmetic in
9017 the mode of the shift, refine which bits we need. Otherwise, use the
9018 conservative form of the mask. */
9019 if (CONST_INT_P (XEXP (x, 1))
9020 && INTVAL (XEXP (x, 1)) >= 0
9021 && INTVAL (XEXP (x, 1)) < GET_MODE_PRECISION (op_mode)
9022 && HWI_COMPUTABLE_MODE_P (op_mode))
9023 mask >>= INTVAL (XEXP (x, 1));
9024 else
9025 mask = fuller_mask;
9026
9027 op0 = gen_lowpart_or_truncate (op_mode,
9028 force_to_mode (XEXP (x, 0), mode,
9029 mask, next_select));
9030
9031 if (op_mode != xmode || op0 != XEXP (x, 0))
9032 {
9033 x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
9034 xmode = op_mode;
9035 }
9036 break;
9037
9038 case LSHIFTRT:
9039 /* Here we can only do something if the shift count is a constant,
9040 this shift constant is valid for the host, and we can do arithmetic
9041 in OP_MODE. */
9042
9043 if (CONST_INT_P (XEXP (x, 1))
9044 && INTVAL (XEXP (x, 1)) >= 0
9045 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
9046 && HWI_COMPUTABLE_MODE_P (op_mode))
9047 {
9048 rtx inner = XEXP (x, 0);
9049 unsigned HOST_WIDE_INT inner_mask;
9050
9051 /* Select the mask of the bits we need for the shift operand. */
9052 inner_mask = mask << INTVAL (XEXP (x, 1));
9053
9054 /* We can only change the mode of the shift if we can do arithmetic
9055 in the mode of the shift and INNER_MASK is no wider than the
9056 width of X's mode. */
9057 if ((inner_mask & ~GET_MODE_MASK (xmode)) != 0)
9058 op_mode = xmode;
9059
9060 inner = force_to_mode (inner, op_mode, inner_mask, next_select);
9061
9062 if (xmode != op_mode || inner != XEXP (x, 0))
9063 {
9064 x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
9065 xmode = op_mode;
9066 }
9067 }
9068
9069 /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
9070 shift and AND produces only copies of the sign bit (C2 is one less
9071 than a power of two), we can do this with just a shift. */
9072
9073 if (GET_CODE (x) == LSHIFTRT
9074 && CONST_INT_P (XEXP (x, 1))
9075 /* The shift puts one of the sign bit copies in the least significant
9076 bit. */
9077 && ((INTVAL (XEXP (x, 1))
9078 + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
9079 >= GET_MODE_PRECISION (xmode))
9080 && pow2p_hwi (mask + 1)
9081 /* Number of bits left after the shift must be more than the mask
9082 needs. */
9083 && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
9084 <= GET_MODE_PRECISION (xmode))
9085 /* Must be more sign bit copies than the mask needs. */
9086 && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
9087 >= exact_log2 (mask + 1)))
9088 {
9089 int nbits = GET_MODE_PRECISION (xmode) - exact_log2 (mask + 1);
9090 x = simplify_gen_binary (LSHIFTRT, xmode, XEXP (x, 0),
9091 gen_int_shift_amount (xmode, nbits));
9092 }
9093 goto shiftrt;
9094
9095 case ASHIFTRT:
9096 /* If we are just looking for the sign bit, we don't need this shift at
9097 all, even if it has a variable count. */
9098 if (val_signbit_p (xmode, mask))
9099 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
9100
9101 /* If this is a shift by a constant, get a mask that contains those bits
9102 that are not copies of the sign bit. We then have two cases: If
9103 MASK only includes those bits, this can be a logical shift, which may
9104 allow simplifications. If MASK is a single-bit field not within
9105 those bits, we are requesting a copy of the sign bit and hence can
9106 shift the sign bit to the appropriate location. */
9107
9108 if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0
9109 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
9110 {
9111 unsigned HOST_WIDE_INT nonzero;
9112 int i;
9113
9114 /* If the considered data is wider than HOST_WIDE_INT, we can't
9115 represent a mask for all its bits in a single scalar.
9116 But we only care about the lower bits, so calculate these. */
9117
9118 if (GET_MODE_PRECISION (xmode) > HOST_BITS_PER_WIDE_INT)
9119 {
9120 nonzero = HOST_WIDE_INT_M1U;
9121
9122 /* GET_MODE_PRECISION (GET_MODE (x)) - INTVAL (XEXP (x, 1))
9123 is the number of bits a full-width mask would have set.
9124 We need only shift if these are fewer than nonzero can
9125 hold. If not, we must keep all bits set in nonzero. */
9126
9127 if (GET_MODE_PRECISION (xmode) - INTVAL (XEXP (x, 1))
9128 < HOST_BITS_PER_WIDE_INT)
9129 nonzero >>= INTVAL (XEXP (x, 1))
9130 + HOST_BITS_PER_WIDE_INT
9131 - GET_MODE_PRECISION (xmode);
9132 }
9133 else
9134 {
9135 nonzero = GET_MODE_MASK (xmode);
9136 nonzero >>= INTVAL (XEXP (x, 1));
9137 }
9138
9139 if ((mask & ~nonzero) == 0)
9140 {
9141 x = simplify_shift_const (NULL_RTX, LSHIFTRT, xmode,
9142 XEXP (x, 0), INTVAL (XEXP (x, 1)));
9143 if (GET_CODE (x) != ASHIFTRT)
9144 return force_to_mode (x, mode, mask, next_select);
9145 }
9146
9147 else if ((i = exact_log2 (mask)) >= 0)
9148 {
9149 x = simplify_shift_const
9150 (NULL_RTX, LSHIFTRT, xmode, XEXP (x, 0),
9151 GET_MODE_PRECISION (xmode) - 1 - i);
9152
9153 if (GET_CODE (x) != ASHIFTRT)
9154 return force_to_mode (x, mode, mask, next_select);
9155 }
9156 }
9157
9158 /* If MASK is 1, convert this to an LSHIFTRT. This can be done
9159 even if the shift count isn't a constant. */
9160 if (mask == 1)
9161 x = simplify_gen_binary (LSHIFTRT, xmode, XEXP (x, 0), XEXP (x, 1));
9162
9163 shiftrt:
9164
9165 /* If this is a zero- or sign-extension operation that just affects bits
9166 we don't care about, remove it. Be sure the call above returned
9167 something that is still a shift. */
9168
9169 if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
9170 && CONST_INT_P (XEXP (x, 1))
9171 && INTVAL (XEXP (x, 1)) >= 0
9172 && (INTVAL (XEXP (x, 1))
9173 <= GET_MODE_PRECISION (xmode) - (floor_log2 (mask) + 1))
9174 && GET_CODE (XEXP (x, 0)) == ASHIFT
9175 && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
9176 return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
9177 next_select);
9178
9179 break;
9180
9181 case ROTATE:
9182 case ROTATERT:
9183 /* If the shift count is constant and we can do computations
9184 in the mode of X, compute where the bits we care about are.
9185 Otherwise, we can't do anything. Don't change the mode of
9186 the shift or propagate MODE into the shift, though. */
9187 if (CONST_INT_P (XEXP (x, 1))
9188 && INTVAL (XEXP (x, 1)) >= 0)
9189 {
9190 temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
9191 xmode, gen_int_mode (mask, xmode),
9192 XEXP (x, 1));
9193 if (temp && CONST_INT_P (temp))
9194 x = simplify_gen_binary (code, xmode,
9195 force_to_mode (XEXP (x, 0), xmode,
9196 INTVAL (temp), next_select),
9197 XEXP (x, 1));
9198 }
9199 break;
9200
9201 case NEG:
9202 /* If we just want the low-order bit, the NEG isn't needed since it
9203 won't change the low-order bit. */
9204 if (mask == 1)
9205 return force_to_mode (XEXP (x, 0), mode, mask, just_select);
9206
9207 /* We need any bits less significant than the most significant bit in
9208 MASK since carries from those bits will affect the bits we are
9209 interested in. */
9210 mask = fuller_mask;
9211 goto unop;
9212
9213 case NOT:
9214 /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
9215 same as the XOR case above. Ensure that the constant we form is not
9216 wider than the mode of X. */
9217
9218 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
9219 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
9220 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
9221 && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
9222 < GET_MODE_PRECISION (xmode))
9223 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
9224 {
9225 temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)), xmode);
9226 temp = simplify_gen_binary (XOR, xmode, XEXP (XEXP (x, 0), 0), temp);
9227 x = simplify_gen_binary (LSHIFTRT, xmode,
9228 temp, XEXP (XEXP (x, 0), 1));
9229
9230 return force_to_mode (x, mode, mask, next_select);
9231 }
9232
9233 /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
9234 use the full mask inside the NOT. */
9235 mask = fuller_mask;
9236
9237 unop:
9238 op0 = gen_lowpart_or_truncate (op_mode,
9239 force_to_mode (XEXP (x, 0), mode, mask,
9240 next_select));
9241 if (op_mode != xmode || op0 != XEXP (x, 0))
9242 {
9243 x = simplify_gen_unary (code, op_mode, op0, op_mode);
9244 xmode = op_mode;
9245 }
9246 break;
9247
9248 case NE:
9249 /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
9250 in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
9251 which is equal to STORE_FLAG_VALUE. */
9252 if ((mask & ~STORE_FLAG_VALUE) == 0
9253 && XEXP (x, 1) == const0_rtx
9254 && GET_MODE (XEXP (x, 0)) == mode
9255 && pow2p_hwi (nonzero_bits (XEXP (x, 0), mode))
9256 && (nonzero_bits (XEXP (x, 0), mode)
9257 == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
9258 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
9259
9260 break;
9261
9262 case IF_THEN_ELSE:
9263 /* We have no way of knowing if the IF_THEN_ELSE can itself be
9264 written in a narrower mode. We play it safe and do not do so. */
9265
9266 op0 = gen_lowpart_or_truncate (xmode,
9267 force_to_mode (XEXP (x, 1), mode,
9268 mask, next_select));
9269 op1 = gen_lowpart_or_truncate (xmode,
9270 force_to_mode (XEXP (x, 2), mode,
9271 mask, next_select));
9272 if (op0 != XEXP (x, 1) || op1 != XEXP (x, 2))
9273 x = simplify_gen_ternary (IF_THEN_ELSE, xmode,
9274 GET_MODE (XEXP (x, 0)), XEXP (x, 0),
9275 op0, op1);
9276 break;
9277
9278 default:
9279 break;
9280 }
9281
9282 /* Ensure we return a value of the proper mode. */
9283 return gen_lowpart_or_truncate (mode, x);
9284 }
9285 \f
9286 /* Return nonzero if X is an expression that has one of two values depending on
9287 whether some other value is zero or nonzero. In that case, we return the
9288 value that is being tested, *PTRUE is set to the value if the rtx being
9289 returned has a nonzero value, and *PFALSE is set to the other alternative.
9290
9291 If we return zero, we set *PTRUE and *PFALSE to X. */
9292
9293 static rtx
9294 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
9295 {
9296 machine_mode mode = GET_MODE (x);
9297 enum rtx_code code = GET_CODE (x);
9298 rtx cond0, cond1, true0, true1, false0, false1;
9299 unsigned HOST_WIDE_INT nz;
9300 scalar_int_mode int_mode;
9301
9302 /* If we are comparing a value against zero, we are done. */
9303 if ((code == NE || code == EQ)
9304 && XEXP (x, 1) == const0_rtx)
9305 {
9306 *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
9307 *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
9308 return XEXP (x, 0);
9309 }
9310
9311 /* If this is a unary operation whose operand has one of two values, apply
9312 our opcode to compute those values. */
9313 else if (UNARY_P (x)
9314 && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
9315 {
9316 *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
9317 *pfalse = simplify_gen_unary (code, mode, false0,
9318 GET_MODE (XEXP (x, 0)));
9319 return cond0;
9320 }
9321
9322 /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
9323 make can't possibly match and would suppress other optimizations. */
9324 else if (code == COMPARE)
9325 ;
9326
9327 /* If this is a binary operation, see if either side has only one of two
9328 values. If either one does or if both do and they are conditional on
9329 the same value, compute the new true and false values. */
9330 else if (BINARY_P (x))
9331 {
9332 rtx op0 = XEXP (x, 0);
9333 rtx op1 = XEXP (x, 1);
9334 cond0 = if_then_else_cond (op0, &true0, &false0);
9335 cond1 = if_then_else_cond (op1, &true1, &false1);
9336
9337 if ((cond0 != 0 && cond1 != 0 && !rtx_equal_p (cond0, cond1))
9338 && (REG_P (op0) || REG_P (op1)))
9339 {
9340 /* Try to enable a simplification by undoing work done by
9341 if_then_else_cond if it converted a REG into something more
9342 complex. */
9343 if (REG_P (op0))
9344 {
9345 cond0 = 0;
9346 true0 = false0 = op0;
9347 }
9348 else
9349 {
9350 cond1 = 0;
9351 true1 = false1 = op1;
9352 }
9353 }
9354
9355 if ((cond0 != 0 || cond1 != 0)
9356 && ! (cond0 != 0 && cond1 != 0 && !rtx_equal_p (cond0, cond1)))
9357 {
9358 /* If if_then_else_cond returned zero, then true/false are the
9359 same rtl. We must copy one of them to prevent invalid rtl
9360 sharing. */
9361 if (cond0 == 0)
9362 true0 = copy_rtx (true0);
9363 else if (cond1 == 0)
9364 true1 = copy_rtx (true1);
9365
9366 if (COMPARISON_P (x))
9367 {
9368 *ptrue = simplify_gen_relational (code, mode, VOIDmode,
9369 true0, true1);
9370 *pfalse = simplify_gen_relational (code, mode, VOIDmode,
9371 false0, false1);
9372 }
9373 else
9374 {
9375 *ptrue = simplify_gen_binary (code, mode, true0, true1);
9376 *pfalse = simplify_gen_binary (code, mode, false0, false1);
9377 }
9378
9379 return cond0 ? cond0 : cond1;
9380 }
9381
9382 /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
9383 operands is zero when the other is nonzero, and vice-versa,
9384 and STORE_FLAG_VALUE is 1 or -1. */
9385
9386 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9387 && (code == PLUS || code == IOR || code == XOR || code == MINUS
9388 || code == UMAX)
9389 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
9390 {
9391 rtx op0 = XEXP (XEXP (x, 0), 1);
9392 rtx op1 = XEXP (XEXP (x, 1), 1);
9393
9394 cond0 = XEXP (XEXP (x, 0), 0);
9395 cond1 = XEXP (XEXP (x, 1), 0);
9396
9397 if (COMPARISON_P (cond0)
9398 && COMPARISON_P (cond1)
9399 && SCALAR_INT_MODE_P (mode)
9400 && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
9401 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
9402 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
9403 || ((swap_condition (GET_CODE (cond0))
9404 == reversed_comparison_code (cond1, NULL))
9405 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
9406 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
9407 && ! side_effects_p (x))
9408 {
9409 *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
9410 *pfalse = simplify_gen_binary (MULT, mode,
9411 (code == MINUS
9412 ? simplify_gen_unary (NEG, mode,
9413 op1, mode)
9414 : op1),
9415 const_true_rtx);
9416 return cond0;
9417 }
9418 }
9419
9420 /* Similarly for MULT, AND and UMIN, except that for these the result
9421 is always zero. */
9422 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9423 && (code == MULT || code == AND || code == UMIN)
9424 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
9425 {
9426 cond0 = XEXP (XEXP (x, 0), 0);
9427 cond1 = XEXP (XEXP (x, 1), 0);
9428
9429 if (COMPARISON_P (cond0)
9430 && COMPARISON_P (cond1)
9431 && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
9432 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
9433 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
9434 || ((swap_condition (GET_CODE (cond0))
9435 == reversed_comparison_code (cond1, NULL))
9436 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
9437 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
9438 && ! side_effects_p (x))
9439 {
9440 *ptrue = *pfalse = const0_rtx;
9441 return cond0;
9442 }
9443 }
9444 }
9445
9446 else if (code == IF_THEN_ELSE)
9447 {
9448 /* If we have IF_THEN_ELSE already, extract the condition and
9449 canonicalize it if it is NE or EQ. */
9450 cond0 = XEXP (x, 0);
9451 *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
9452 if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
9453 return XEXP (cond0, 0);
9454 else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
9455 {
9456 *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
9457 return XEXP (cond0, 0);
9458 }
9459 else
9460 return cond0;
9461 }
9462
9463 /* If X is a SUBREG, we can narrow both the true and false values
9464 if the inner expression, if there is a condition. */
9465 else if (code == SUBREG
9466 && (cond0 = if_then_else_cond (SUBREG_REG (x), &true0,
9467 &false0)) != 0)
9468 {
9469 true0 = simplify_gen_subreg (mode, true0,
9470 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
9471 false0 = simplify_gen_subreg (mode, false0,
9472 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
9473 if (true0 && false0)
9474 {
9475 *ptrue = true0;
9476 *pfalse = false0;
9477 return cond0;
9478 }
9479 }
9480
9481 /* If X is a constant, this isn't special and will cause confusions
9482 if we treat it as such. Likewise if it is equivalent to a constant. */
9483 else if (CONSTANT_P (x)
9484 || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
9485 ;
9486
9487 /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
9488 will be least confusing to the rest of the compiler. */
9489 else if (mode == BImode)
9490 {
9491 *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
9492 return x;
9493 }
9494
9495 /* If X is known to be either 0 or -1, those are the true and
9496 false values when testing X. */
9497 else if (x == constm1_rtx || x == const0_rtx
9498 || (is_a <scalar_int_mode> (mode, &int_mode)
9499 && (num_sign_bit_copies (x, int_mode)
9500 == GET_MODE_PRECISION (int_mode))))
9501 {
9502 *ptrue = constm1_rtx, *pfalse = const0_rtx;
9503 return x;
9504 }
9505
9506 /* Likewise for 0 or a single bit. */
9507 else if (HWI_COMPUTABLE_MODE_P (mode)
9508 && pow2p_hwi (nz = nonzero_bits (x, mode)))
9509 {
9510 *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
9511 return x;
9512 }
9513
9514 /* Otherwise fail; show no condition with true and false values the same. */
9515 *ptrue = *pfalse = x;
9516 return 0;
9517 }
9518 \f
9519 /* Return the value of expression X given the fact that condition COND
9520 is known to be true when applied to REG as its first operand and VAL
9521 as its second. X is known to not be shared and so can be modified in
9522 place.
9523
9524 We only handle the simplest cases, and specifically those cases that
9525 arise with IF_THEN_ELSE expressions. */
9526
9527 static rtx
9528 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
9529 {
9530 enum rtx_code code = GET_CODE (x);
9531 const char *fmt;
9532 int i, j;
9533
9534 if (side_effects_p (x))
9535 return x;
9536
9537 /* If either operand of the condition is a floating point value,
9538 then we have to avoid collapsing an EQ comparison. */
9539 if (cond == EQ
9540 && rtx_equal_p (x, reg)
9541 && ! FLOAT_MODE_P (GET_MODE (x))
9542 && ! FLOAT_MODE_P (GET_MODE (val)))
9543 return val;
9544
9545 if (cond == UNEQ && rtx_equal_p (x, reg))
9546 return val;
9547
9548 /* If X is (abs REG) and we know something about REG's relationship
9549 with zero, we may be able to simplify this. */
9550
9551 if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
9552 switch (cond)
9553 {
9554 case GE: case GT: case EQ:
9555 return XEXP (x, 0);
9556 case LT: case LE:
9557 return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
9558 XEXP (x, 0),
9559 GET_MODE (XEXP (x, 0)));
9560 default:
9561 break;
9562 }
9563
9564 /* The only other cases we handle are MIN, MAX, and comparisons if the
9565 operands are the same as REG and VAL. */
9566
9567 else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
9568 {
9569 if (rtx_equal_p (XEXP (x, 0), val))
9570 {
9571 std::swap (val, reg);
9572 cond = swap_condition (cond);
9573 }
9574
9575 if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
9576 {
9577 if (COMPARISON_P (x))
9578 {
9579 if (comparison_dominates_p (cond, code))
9580 return VECTOR_MODE_P (GET_MODE (x)) ? x : const_true_rtx;
9581
9582 code = reversed_comparison_code (x, NULL);
9583 if (code != UNKNOWN
9584 && comparison_dominates_p (cond, code))
9585 return CONST0_RTX (GET_MODE (x));
9586 else
9587 return x;
9588 }
9589 else if (code == SMAX || code == SMIN
9590 || code == UMIN || code == UMAX)
9591 {
9592 int unsignedp = (code == UMIN || code == UMAX);
9593
9594 /* Do not reverse the condition when it is NE or EQ.
9595 This is because we cannot conclude anything about
9596 the value of 'SMAX (x, y)' when x is not equal to y,
9597 but we can when x equals y. */
9598 if ((code == SMAX || code == UMAX)
9599 && ! (cond == EQ || cond == NE))
9600 cond = reverse_condition (cond);
9601
9602 switch (cond)
9603 {
9604 case GE: case GT:
9605 return unsignedp ? x : XEXP (x, 1);
9606 case LE: case LT:
9607 return unsignedp ? x : XEXP (x, 0);
9608 case GEU: case GTU:
9609 return unsignedp ? XEXP (x, 1) : x;
9610 case LEU: case LTU:
9611 return unsignedp ? XEXP (x, 0) : x;
9612 default:
9613 break;
9614 }
9615 }
9616 }
9617 }
9618 else if (code == SUBREG)
9619 {
9620 machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
9621 rtx new_rtx, r = known_cond (SUBREG_REG (x), cond, reg, val);
9622
9623 if (SUBREG_REG (x) != r)
9624 {
9625 /* We must simplify subreg here, before we lose track of the
9626 original inner_mode. */
9627 new_rtx = simplify_subreg (GET_MODE (x), r,
9628 inner_mode, SUBREG_BYTE (x));
9629 if (new_rtx)
9630 return new_rtx;
9631 else
9632 SUBST (SUBREG_REG (x), r);
9633 }
9634
9635 return x;
9636 }
9637 /* We don't have to handle SIGN_EXTEND here, because even in the
9638 case of replacing something with a modeless CONST_INT, a
9639 CONST_INT is already (supposed to be) a valid sign extension for
9640 its narrower mode, which implies it's already properly
9641 sign-extended for the wider mode. Now, for ZERO_EXTEND, the
9642 story is different. */
9643 else if (code == ZERO_EXTEND)
9644 {
9645 machine_mode inner_mode = GET_MODE (XEXP (x, 0));
9646 rtx new_rtx, r = known_cond (XEXP (x, 0), cond, reg, val);
9647
9648 if (XEXP (x, 0) != r)
9649 {
9650 /* We must simplify the zero_extend here, before we lose
9651 track of the original inner_mode. */
9652 new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
9653 r, inner_mode);
9654 if (new_rtx)
9655 return new_rtx;
9656 else
9657 SUBST (XEXP (x, 0), r);
9658 }
9659
9660 return x;
9661 }
9662
9663 fmt = GET_RTX_FORMAT (code);
9664 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
9665 {
9666 if (fmt[i] == 'e')
9667 SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
9668 else if (fmt[i] == 'E')
9669 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
9670 SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
9671 cond, reg, val));
9672 }
9673
9674 return x;
9675 }
9676 \f
9677 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
9678 assignment as a field assignment. */
9679
9680 static int
9681 rtx_equal_for_field_assignment_p (rtx x, rtx y, bool widen_x)
9682 {
9683 if (widen_x && GET_MODE (x) != GET_MODE (y))
9684 {
9685 if (paradoxical_subreg_p (GET_MODE (x), GET_MODE (y)))
9686 return 0;
9687 if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
9688 return 0;
9689 x = adjust_address_nv (x, GET_MODE (y),
9690 byte_lowpart_offset (GET_MODE (y),
9691 GET_MODE (x)));
9692 }
9693
9694 if (x == y || rtx_equal_p (x, y))
9695 return 1;
9696
9697 if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
9698 return 0;
9699
9700 /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
9701 Note that all SUBREGs of MEM are paradoxical; otherwise they
9702 would have been rewritten. */
9703 if (MEM_P (x) && GET_CODE (y) == SUBREG
9704 && MEM_P (SUBREG_REG (y))
9705 && rtx_equal_p (SUBREG_REG (y),
9706 gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
9707 return 1;
9708
9709 if (MEM_P (y) && GET_CODE (x) == SUBREG
9710 && MEM_P (SUBREG_REG (x))
9711 && rtx_equal_p (SUBREG_REG (x),
9712 gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
9713 return 1;
9714
9715 /* We used to see if get_last_value of X and Y were the same but that's
9716 not correct. In one direction, we'll cause the assignment to have
9717 the wrong destination and in the case, we'll import a register into this
9718 insn that might have already have been dead. So fail if none of the
9719 above cases are true. */
9720 return 0;
9721 }
9722 \f
9723 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
9724 Return that assignment if so.
9725
9726 We only handle the most common cases. */
9727
9728 static rtx
9729 make_field_assignment (rtx x)
9730 {
9731 rtx dest = SET_DEST (x);
9732 rtx src = SET_SRC (x);
9733 rtx assign;
9734 rtx rhs, lhs;
9735 HOST_WIDE_INT c1;
9736 HOST_WIDE_INT pos;
9737 unsigned HOST_WIDE_INT len;
9738 rtx other;
9739
9740 /* All the rules in this function are specific to scalar integers. */
9741 scalar_int_mode mode;
9742 if (!is_a <scalar_int_mode> (GET_MODE (dest), &mode))
9743 return x;
9744
9745 /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
9746 a clear of a one-bit field. We will have changed it to
9747 (and (rotate (const_int -2) POS) DEST), so check for that. Also check
9748 for a SUBREG. */
9749
9750 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
9751 && CONST_INT_P (XEXP (XEXP (src, 0), 0))
9752 && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
9753 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
9754 {
9755 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
9756 1, 1, 1, 0);
9757 if (assign != 0)
9758 return gen_rtx_SET (assign, const0_rtx);
9759 return x;
9760 }
9761
9762 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
9763 && subreg_lowpart_p (XEXP (src, 0))
9764 && partial_subreg_p (XEXP (src, 0))
9765 && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
9766 && CONST_INT_P (XEXP (SUBREG_REG (XEXP (src, 0)), 0))
9767 && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
9768 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
9769 {
9770 assign = make_extraction (VOIDmode, dest, 0,
9771 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
9772 1, 1, 1, 0);
9773 if (assign != 0)
9774 return gen_rtx_SET (assign, const0_rtx);
9775 return x;
9776 }
9777
9778 /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
9779 one-bit field. */
9780 if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
9781 && XEXP (XEXP (src, 0), 0) == const1_rtx
9782 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
9783 {
9784 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
9785 1, 1, 1, 0);
9786 if (assign != 0)
9787 return gen_rtx_SET (assign, const1_rtx);
9788 return x;
9789 }
9790
9791 /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
9792 SRC is an AND with all bits of that field set, then we can discard
9793 the AND. */
9794 if (GET_CODE (dest) == ZERO_EXTRACT
9795 && CONST_INT_P (XEXP (dest, 1))
9796 && GET_CODE (src) == AND
9797 && CONST_INT_P (XEXP (src, 1)))
9798 {
9799 HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
9800 unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
9801 unsigned HOST_WIDE_INT ze_mask;
9802
9803 if (width >= HOST_BITS_PER_WIDE_INT)
9804 ze_mask = -1;
9805 else
9806 ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
9807
9808 /* Complete overlap. We can remove the source AND. */
9809 if ((and_mask & ze_mask) == ze_mask)
9810 return gen_rtx_SET (dest, XEXP (src, 0));
9811
9812 /* Partial overlap. We can reduce the source AND. */
9813 if ((and_mask & ze_mask) != and_mask)
9814 {
9815 src = gen_rtx_AND (mode, XEXP (src, 0),
9816 gen_int_mode (and_mask & ze_mask, mode));
9817 return gen_rtx_SET (dest, src);
9818 }
9819 }
9820
9821 /* The other case we handle is assignments into a constant-position
9822 field. They look like (ior/xor (and DEST C1) OTHER). If C1 represents
9823 a mask that has all one bits except for a group of zero bits and
9824 OTHER is known to have zeros where C1 has ones, this is such an
9825 assignment. Compute the position and length from C1. Shift OTHER
9826 to the appropriate position, force it to the required mode, and
9827 make the extraction. Check for the AND in both operands. */
9828
9829 /* One or more SUBREGs might obscure the constant-position field
9830 assignment. The first one we are likely to encounter is an outer
9831 narrowing SUBREG, which we can just strip for the purposes of
9832 identifying the constant-field assignment. */
9833 scalar_int_mode src_mode = mode;
9834 if (GET_CODE (src) == SUBREG
9835 && subreg_lowpart_p (src)
9836 && is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (src)), &src_mode))
9837 src = SUBREG_REG (src);
9838
9839 if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
9840 return x;
9841
9842 rhs = expand_compound_operation (XEXP (src, 0));
9843 lhs = expand_compound_operation (XEXP (src, 1));
9844
9845 if (GET_CODE (rhs) == AND
9846 && CONST_INT_P (XEXP (rhs, 1))
9847 && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
9848 c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
9849 /* The second SUBREG that might get in the way is a paradoxical
9850 SUBREG around the first operand of the AND. We want to
9851 pretend the operand is as wide as the destination here. We
9852 do this by adjusting the MEM to wider mode for the sole
9853 purpose of the call to rtx_equal_for_field_assignment_p. Also
9854 note this trick only works for MEMs. */
9855 else if (GET_CODE (rhs) == AND
9856 && paradoxical_subreg_p (XEXP (rhs, 0))
9857 && MEM_P (SUBREG_REG (XEXP (rhs, 0)))
9858 && CONST_INT_P (XEXP (rhs, 1))
9859 && rtx_equal_for_field_assignment_p (SUBREG_REG (XEXP (rhs, 0)),
9860 dest, true))
9861 c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
9862 else if (GET_CODE (lhs) == AND
9863 && CONST_INT_P (XEXP (lhs, 1))
9864 && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
9865 c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
9866 /* The second SUBREG that might get in the way is a paradoxical
9867 SUBREG around the first operand of the AND. We want to
9868 pretend the operand is as wide as the destination here. We
9869 do this by adjusting the MEM to wider mode for the sole
9870 purpose of the call to rtx_equal_for_field_assignment_p. Also
9871 note this trick only works for MEMs. */
9872 else if (GET_CODE (lhs) == AND
9873 && paradoxical_subreg_p (XEXP (lhs, 0))
9874 && MEM_P (SUBREG_REG (XEXP (lhs, 0)))
9875 && CONST_INT_P (XEXP (lhs, 1))
9876 && rtx_equal_for_field_assignment_p (SUBREG_REG (XEXP (lhs, 0)),
9877 dest, true))
9878 c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
9879 else
9880 return x;
9881
9882 pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (mode), &len);
9883 if (pos < 0
9884 || pos + len > GET_MODE_PRECISION (mode)
9885 || GET_MODE_PRECISION (mode) > HOST_BITS_PER_WIDE_INT
9886 || (c1 & nonzero_bits (other, mode)) != 0)
9887 return x;
9888
9889 assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
9890 if (assign == 0)
9891 return x;
9892
9893 /* The mode to use for the source is the mode of the assignment, or of
9894 what is inside a possible STRICT_LOW_PART. */
9895 machine_mode new_mode = (GET_CODE (assign) == STRICT_LOW_PART
9896 ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
9897
9898 /* Shift OTHER right POS places and make it the source, restricting it
9899 to the proper length and mode. */
9900
9901 src = canon_reg_for_combine (simplify_shift_const (NULL_RTX, LSHIFTRT,
9902 src_mode, other, pos),
9903 dest);
9904 src = force_to_mode (src, new_mode,
9905 len >= HOST_BITS_PER_WIDE_INT
9906 ? HOST_WIDE_INT_M1U
9907 : (HOST_WIDE_INT_1U << len) - 1,
9908 0);
9909
9910 /* If SRC is masked by an AND that does not make a difference in
9911 the value being stored, strip it. */
9912 if (GET_CODE (assign) == ZERO_EXTRACT
9913 && CONST_INT_P (XEXP (assign, 1))
9914 && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
9915 && GET_CODE (src) == AND
9916 && CONST_INT_P (XEXP (src, 1))
9917 && UINTVAL (XEXP (src, 1))
9918 == (HOST_WIDE_INT_1U << INTVAL (XEXP (assign, 1))) - 1)
9919 src = XEXP (src, 0);
9920
9921 return gen_rtx_SET (assign, src);
9922 }
9923 \f
9924 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
9925 if so. */
9926
9927 static rtx
9928 apply_distributive_law (rtx x)
9929 {
9930 enum rtx_code code = GET_CODE (x);
9931 enum rtx_code inner_code;
9932 rtx lhs, rhs, other;
9933 rtx tem;
9934
9935 /* Distributivity is not true for floating point as it can change the
9936 value. So we don't do it unless -funsafe-math-optimizations. */
9937 if (FLOAT_MODE_P (GET_MODE (x))
9938 && ! flag_unsafe_math_optimizations)
9939 return x;
9940
9941 /* The outer operation can only be one of the following: */
9942 if (code != IOR && code != AND && code != XOR
9943 && code != PLUS && code != MINUS)
9944 return x;
9945
9946 lhs = XEXP (x, 0);
9947 rhs = XEXP (x, 1);
9948
9949 /* If either operand is a primitive we can't do anything, so get out
9950 fast. */
9951 if (OBJECT_P (lhs) || OBJECT_P (rhs))
9952 return x;
9953
9954 lhs = expand_compound_operation (lhs);
9955 rhs = expand_compound_operation (rhs);
9956 inner_code = GET_CODE (lhs);
9957 if (inner_code != GET_CODE (rhs))
9958 return x;
9959
9960 /* See if the inner and outer operations distribute. */
9961 switch (inner_code)
9962 {
9963 case LSHIFTRT:
9964 case ASHIFTRT:
9965 case AND:
9966 case IOR:
9967 /* These all distribute except over PLUS. */
9968 if (code == PLUS || code == MINUS)
9969 return x;
9970 break;
9971
9972 case MULT:
9973 if (code != PLUS && code != MINUS)
9974 return x;
9975 break;
9976
9977 case ASHIFT:
9978 /* This is also a multiply, so it distributes over everything. */
9979 break;
9980
9981 /* This used to handle SUBREG, but this turned out to be counter-
9982 productive, since (subreg (op ...)) usually is not handled by
9983 insn patterns, and this "optimization" therefore transformed
9984 recognizable patterns into unrecognizable ones. Therefore the
9985 SUBREG case was removed from here.
9986
9987 It is possible that distributing SUBREG over arithmetic operations
9988 leads to an intermediate result than can then be optimized further,
9989 e.g. by moving the outer SUBREG to the other side of a SET as done
9990 in simplify_set. This seems to have been the original intent of
9991 handling SUBREGs here.
9992
9993 However, with current GCC this does not appear to actually happen,
9994 at least on major platforms. If some case is found where removing
9995 the SUBREG case here prevents follow-on optimizations, distributing
9996 SUBREGs ought to be re-added at that place, e.g. in simplify_set. */
9997
9998 default:
9999 return x;
10000 }
10001
10002 /* Set LHS and RHS to the inner operands (A and B in the example
10003 above) and set OTHER to the common operand (C in the example).
10004 There is only one way to do this unless the inner operation is
10005 commutative. */
10006 if (COMMUTATIVE_ARITH_P (lhs)
10007 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
10008 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
10009 else if (COMMUTATIVE_ARITH_P (lhs)
10010 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
10011 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
10012 else if (COMMUTATIVE_ARITH_P (lhs)
10013 && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
10014 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
10015 else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
10016 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
10017 else
10018 return x;
10019
10020 /* Form the new inner operation, seeing if it simplifies first. */
10021 tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
10022
10023 /* There is one exception to the general way of distributing:
10024 (a | c) ^ (b | c) -> (a ^ b) & ~c */
10025 if (code == XOR && inner_code == IOR)
10026 {
10027 inner_code = AND;
10028 other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
10029 }
10030
10031 /* We may be able to continuing distributing the result, so call
10032 ourselves recursively on the inner operation before forming the
10033 outer operation, which we return. */
10034 return simplify_gen_binary (inner_code, GET_MODE (x),
10035 apply_distributive_law (tem), other);
10036 }
10037
10038 /* See if X is of the form (* (+ A B) C), and if so convert to
10039 (+ (* A C) (* B C)) and try to simplify.
10040
10041 Most of the time, this results in no change. However, if some of
10042 the operands are the same or inverses of each other, simplifications
10043 will result.
10044
10045 For example, (and (ior A B) (not B)) can occur as the result of
10046 expanding a bit field assignment. When we apply the distributive
10047 law to this, we get (ior (and (A (not B))) (and (B (not B)))),
10048 which then simplifies to (and (A (not B))).
10049
10050 Note that no checks happen on the validity of applying the inverse
10051 distributive law. This is pointless since we can do it in the
10052 few places where this routine is called.
10053
10054 N is the index of the term that is decomposed (the arithmetic operation,
10055 i.e. (+ A B) in the first example above). !N is the index of the term that
10056 is distributed, i.e. of C in the first example above. */
10057 static rtx
10058 distribute_and_simplify_rtx (rtx x, int n)
10059 {
10060 machine_mode mode;
10061 enum rtx_code outer_code, inner_code;
10062 rtx decomposed, distributed, inner_op0, inner_op1, new_op0, new_op1, tmp;
10063
10064 /* Distributivity is not true for floating point as it can change the
10065 value. So we don't do it unless -funsafe-math-optimizations. */
10066 if (FLOAT_MODE_P (GET_MODE (x))
10067 && ! flag_unsafe_math_optimizations)
10068 return NULL_RTX;
10069
10070 decomposed = XEXP (x, n);
10071 if (!ARITHMETIC_P (decomposed))
10072 return NULL_RTX;
10073
10074 mode = GET_MODE (x);
10075 outer_code = GET_CODE (x);
10076 distributed = XEXP (x, !n);
10077
10078 inner_code = GET_CODE (decomposed);
10079 inner_op0 = XEXP (decomposed, 0);
10080 inner_op1 = XEXP (decomposed, 1);
10081
10082 /* Special case (and (xor B C) (not A)), which is equivalent to
10083 (xor (ior A B) (ior A C)) */
10084 if (outer_code == AND && inner_code == XOR && GET_CODE (distributed) == NOT)
10085 {
10086 distributed = XEXP (distributed, 0);
10087 outer_code = IOR;
10088 }
10089
10090 if (n == 0)
10091 {
10092 /* Distribute the second term. */
10093 new_op0 = simplify_gen_binary (outer_code, mode, inner_op0, distributed);
10094 new_op1 = simplify_gen_binary (outer_code, mode, inner_op1, distributed);
10095 }
10096 else
10097 {
10098 /* Distribute the first term. */
10099 new_op0 = simplify_gen_binary (outer_code, mode, distributed, inner_op0);
10100 new_op1 = simplify_gen_binary (outer_code, mode, distributed, inner_op1);
10101 }
10102
10103 tmp = apply_distributive_law (simplify_gen_binary (inner_code, mode,
10104 new_op0, new_op1));
10105 if (GET_CODE (tmp) != outer_code
10106 && (set_src_cost (tmp, mode, optimize_this_for_speed_p)
10107 < set_src_cost (x, mode, optimize_this_for_speed_p)))
10108 return tmp;
10109
10110 return NULL_RTX;
10111 }
10112 \f
10113 /* Simplify a logical `and' of VAROP with the constant CONSTOP, to be done
10114 in MODE. Return an equivalent form, if different from (and VAROP
10115 (const_int CONSTOP)). Otherwise, return NULL_RTX. */
10116
10117 static rtx
10118 simplify_and_const_int_1 (scalar_int_mode mode, rtx varop,
10119 unsigned HOST_WIDE_INT constop)
10120 {
10121 unsigned HOST_WIDE_INT nonzero;
10122 unsigned HOST_WIDE_INT orig_constop;
10123 rtx orig_varop;
10124 int i;
10125
10126 orig_varop = varop;
10127 orig_constop = constop;
10128 if (GET_CODE (varop) == CLOBBER)
10129 return NULL_RTX;
10130
10131 /* Simplify VAROP knowing that we will be only looking at some of the
10132 bits in it.
10133
10134 Note by passing in CONSTOP, we guarantee that the bits not set in
10135 CONSTOP are not significant and will never be examined. We must
10136 ensure that is the case by explicitly masking out those bits
10137 before returning. */
10138 varop = force_to_mode (varop, mode, constop, 0);
10139
10140 /* If VAROP is a CLOBBER, we will fail so return it. */
10141 if (GET_CODE (varop) == CLOBBER)
10142 return varop;
10143
10144 /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
10145 to VAROP and return the new constant. */
10146 if (CONST_INT_P (varop))
10147 return gen_int_mode (INTVAL (varop) & constop, mode);
10148
10149 /* See what bits may be nonzero in VAROP. Unlike the general case of
10150 a call to nonzero_bits, here we don't care about bits outside
10151 MODE. */
10152
10153 nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
10154
10155 /* Turn off all bits in the constant that are known to already be zero.
10156 Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
10157 which is tested below. */
10158
10159 constop &= nonzero;
10160
10161 /* If we don't have any bits left, return zero. */
10162 if (constop == 0)
10163 return const0_rtx;
10164
10165 /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
10166 a power of two, we can replace this with an ASHIFT. */
10167 if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
10168 && (i = exact_log2 (constop)) >= 0)
10169 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
10170
10171 /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
10172 or XOR, then try to apply the distributive law. This may eliminate
10173 operations if either branch can be simplified because of the AND.
10174 It may also make some cases more complex, but those cases probably
10175 won't match a pattern either with or without this. */
10176
10177 if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
10178 {
10179 scalar_int_mode varop_mode = as_a <scalar_int_mode> (GET_MODE (varop));
10180 return
10181 gen_lowpart
10182 (mode,
10183 apply_distributive_law
10184 (simplify_gen_binary (GET_CODE (varop), varop_mode,
10185 simplify_and_const_int (NULL_RTX, varop_mode,
10186 XEXP (varop, 0),
10187 constop),
10188 simplify_and_const_int (NULL_RTX, varop_mode,
10189 XEXP (varop, 1),
10190 constop))));
10191 }
10192
10193 /* If VAROP is PLUS, and the constant is a mask of low bits, distribute
10194 the AND and see if one of the operands simplifies to zero. If so, we
10195 may eliminate it. */
10196
10197 if (GET_CODE (varop) == PLUS
10198 && pow2p_hwi (constop + 1))
10199 {
10200 rtx o0, o1;
10201
10202 o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
10203 o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
10204 if (o0 == const0_rtx)
10205 return o1;
10206 if (o1 == const0_rtx)
10207 return o0;
10208 }
10209
10210 /* Make a SUBREG if necessary. If we can't make it, fail. */
10211 varop = gen_lowpart (mode, varop);
10212 if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
10213 return NULL_RTX;
10214
10215 /* If we are only masking insignificant bits, return VAROP. */
10216 if (constop == nonzero)
10217 return varop;
10218
10219 if (varop == orig_varop && constop == orig_constop)
10220 return NULL_RTX;
10221
10222 /* Otherwise, return an AND. */
10223 return simplify_gen_binary (AND, mode, varop, gen_int_mode (constop, mode));
10224 }
10225
10226
10227 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
10228 in MODE.
10229
10230 Return an equivalent form, if different from X. Otherwise, return X. If
10231 X is zero, we are to always construct the equivalent form. */
10232
10233 static rtx
10234 simplify_and_const_int (rtx x, scalar_int_mode mode, rtx varop,
10235 unsigned HOST_WIDE_INT constop)
10236 {
10237 rtx tem = simplify_and_const_int_1 (mode, varop, constop);
10238 if (tem)
10239 return tem;
10240
10241 if (!x)
10242 x = simplify_gen_binary (AND, GET_MODE (varop), varop,
10243 gen_int_mode (constop, mode));
10244 if (GET_MODE (x) != mode)
10245 x = gen_lowpart (mode, x);
10246 return x;
10247 }
10248 \f
10249 /* Given a REG X of mode XMODE, compute which bits in X can be nonzero.
10250 We don't care about bits outside of those defined in MODE.
10251 We DO care about all the bits in MODE, even if XMODE is smaller than MODE.
10252
10253 For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
10254 a shift, AND, or zero_extract, we can do better. */
10255
10256 static rtx
10257 reg_nonzero_bits_for_combine (const_rtx x, scalar_int_mode xmode,
10258 scalar_int_mode mode,
10259 unsigned HOST_WIDE_INT *nonzero)
10260 {
10261 rtx tem;
10262 reg_stat_type *rsp;
10263
10264 /* If X is a register whose nonzero bits value is current, use it.
10265 Otherwise, if X is a register whose value we can find, use that
10266 value. Otherwise, use the previously-computed global nonzero bits
10267 for this register. */
10268
10269 rsp = &reg_stat[REGNO (x)];
10270 if (rsp->last_set_value != 0
10271 && (rsp->last_set_mode == mode
10272 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
10273 && GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
10274 && GET_MODE_CLASS (mode) == MODE_INT))
10275 && ((rsp->last_set_label >= label_tick_ebb_start
10276 && rsp->last_set_label < label_tick)
10277 || (rsp->last_set_label == label_tick
10278 && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
10279 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
10280 && REGNO (x) < reg_n_sets_max
10281 && REG_N_SETS (REGNO (x)) == 1
10282 && !REGNO_REG_SET_P
10283 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
10284 REGNO (x)))))
10285 {
10286 /* Note that, even if the precision of last_set_mode is lower than that
10287 of mode, record_value_for_reg invoked nonzero_bits on the register
10288 with nonzero_bits_mode (because last_set_mode is necessarily integral
10289 and HWI_COMPUTABLE_MODE_P in this case) so bits in nonzero_bits_mode
10290 are all valid, hence in mode too since nonzero_bits_mode is defined
10291 to the largest HWI_COMPUTABLE_MODE_P mode. */
10292 *nonzero &= rsp->last_set_nonzero_bits;
10293 return NULL;
10294 }
10295
10296 tem = get_last_value (x);
10297 if (tem)
10298 {
10299 if (SHORT_IMMEDIATES_SIGN_EXTEND)
10300 tem = sign_extend_short_imm (tem, xmode, GET_MODE_PRECISION (mode));
10301
10302 return tem;
10303 }
10304
10305 if (nonzero_sign_valid && rsp->nonzero_bits)
10306 {
10307 unsigned HOST_WIDE_INT mask = rsp->nonzero_bits;
10308
10309 if (GET_MODE_PRECISION (xmode) < GET_MODE_PRECISION (mode))
10310 /* We don't know anything about the upper bits. */
10311 mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (xmode);
10312
10313 *nonzero &= mask;
10314 }
10315
10316 return NULL;
10317 }
10318
10319 /* Given a reg X of mode XMODE, return the number of bits at the high-order
10320 end of X that are known to be equal to the sign bit. X will be used
10321 in mode MODE; the returned value will always be between 1 and the
10322 number of bits in MODE. */
10323
10324 static rtx
10325 reg_num_sign_bit_copies_for_combine (const_rtx x, scalar_int_mode xmode,
10326 scalar_int_mode mode,
10327 unsigned int *result)
10328 {
10329 rtx tem;
10330 reg_stat_type *rsp;
10331
10332 rsp = &reg_stat[REGNO (x)];
10333 if (rsp->last_set_value != 0
10334 && rsp->last_set_mode == mode
10335 && ((rsp->last_set_label >= label_tick_ebb_start
10336 && rsp->last_set_label < label_tick)
10337 || (rsp->last_set_label == label_tick
10338 && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
10339 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
10340 && REGNO (x) < reg_n_sets_max
10341 && REG_N_SETS (REGNO (x)) == 1
10342 && !REGNO_REG_SET_P
10343 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
10344 REGNO (x)))))
10345 {
10346 *result = rsp->last_set_sign_bit_copies;
10347 return NULL;
10348 }
10349
10350 tem = get_last_value (x);
10351 if (tem != 0)
10352 return tem;
10353
10354 if (nonzero_sign_valid && rsp->sign_bit_copies != 0
10355 && GET_MODE_PRECISION (xmode) == GET_MODE_PRECISION (mode))
10356 *result = rsp->sign_bit_copies;
10357
10358 return NULL;
10359 }
10360 \f
10361 /* Return the number of "extended" bits there are in X, when interpreted
10362 as a quantity in MODE whose signedness is indicated by UNSIGNEDP. For
10363 unsigned quantities, this is the number of high-order zero bits.
10364 For signed quantities, this is the number of copies of the sign bit
10365 minus 1. In both case, this function returns the number of "spare"
10366 bits. For example, if two quantities for which this function returns
10367 at least 1 are added, the addition is known not to overflow.
10368
10369 This function will always return 0 unless called during combine, which
10370 implies that it must be called from a define_split. */
10371
10372 unsigned int
10373 extended_count (const_rtx x, machine_mode mode, int unsignedp)
10374 {
10375 if (nonzero_sign_valid == 0)
10376 return 0;
10377
10378 scalar_int_mode int_mode;
10379 return (unsignedp
10380 ? (is_a <scalar_int_mode> (mode, &int_mode)
10381 && HWI_COMPUTABLE_MODE_P (int_mode)
10382 ? (unsigned int) (GET_MODE_PRECISION (int_mode) - 1
10383 - floor_log2 (nonzero_bits (x, int_mode)))
10384 : 0)
10385 : num_sign_bit_copies (x, mode) - 1);
10386 }
10387
10388 /* This function is called from `simplify_shift_const' to merge two
10389 outer operations. Specifically, we have already found that we need
10390 to perform operation *POP0 with constant *PCONST0 at the outermost
10391 position. We would now like to also perform OP1 with constant CONST1
10392 (with *POP0 being done last).
10393
10394 Return 1 if we can do the operation and update *POP0 and *PCONST0 with
10395 the resulting operation. *PCOMP_P is set to 1 if we would need to
10396 complement the innermost operand, otherwise it is unchanged.
10397
10398 MODE is the mode in which the operation will be done. No bits outside
10399 the width of this mode matter. It is assumed that the width of this mode
10400 is smaller than or equal to HOST_BITS_PER_WIDE_INT.
10401
10402 If *POP0 or OP1 are UNKNOWN, it means no operation is required. Only NEG, PLUS,
10403 IOR, XOR, and AND are supported. We may set *POP0 to SET if the proper
10404 result is simply *PCONST0.
10405
10406 If the resulting operation cannot be expressed as one operation, we
10407 return 0 and do not change *POP0, *PCONST0, and *PCOMP_P. */
10408
10409 static int
10410 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)
10411 {
10412 enum rtx_code op0 = *pop0;
10413 HOST_WIDE_INT const0 = *pconst0;
10414
10415 const0 &= GET_MODE_MASK (mode);
10416 const1 &= GET_MODE_MASK (mode);
10417
10418 /* If OP0 is an AND, clear unimportant bits in CONST1. */
10419 if (op0 == AND)
10420 const1 &= const0;
10421
10422 /* If OP0 or OP1 is UNKNOWN, this is easy. Similarly if they are the same or
10423 if OP0 is SET. */
10424
10425 if (op1 == UNKNOWN || op0 == SET)
10426 return 1;
10427
10428 else if (op0 == UNKNOWN)
10429 op0 = op1, const0 = const1;
10430
10431 else if (op0 == op1)
10432 {
10433 switch (op0)
10434 {
10435 case AND:
10436 const0 &= const1;
10437 break;
10438 case IOR:
10439 const0 |= const1;
10440 break;
10441 case XOR:
10442 const0 ^= const1;
10443 break;
10444 case PLUS:
10445 const0 += const1;
10446 break;
10447 case NEG:
10448 op0 = UNKNOWN;
10449 break;
10450 default:
10451 break;
10452 }
10453 }
10454
10455 /* Otherwise, if either is a PLUS or NEG, we can't do anything. */
10456 else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
10457 return 0;
10458
10459 /* If the two constants aren't the same, we can't do anything. The
10460 remaining six cases can all be done. */
10461 else if (const0 != const1)
10462 return 0;
10463
10464 else
10465 switch (op0)
10466 {
10467 case IOR:
10468 if (op1 == AND)
10469 /* (a & b) | b == b */
10470 op0 = SET;
10471 else /* op1 == XOR */
10472 /* (a ^ b) | b == a | b */
10473 {;}
10474 break;
10475
10476 case XOR:
10477 if (op1 == AND)
10478 /* (a & b) ^ b == (~a) & b */
10479 op0 = AND, *pcomp_p = 1;
10480 else /* op1 == IOR */
10481 /* (a | b) ^ b == a & ~b */
10482 op0 = AND, const0 = ~const0;
10483 break;
10484
10485 case AND:
10486 if (op1 == IOR)
10487 /* (a | b) & b == b */
10488 op0 = SET;
10489 else /* op1 == XOR */
10490 /* (a ^ b) & b) == (~a) & b */
10491 *pcomp_p = 1;
10492 break;
10493 default:
10494 break;
10495 }
10496
10497 /* Check for NO-OP cases. */
10498 const0 &= GET_MODE_MASK (mode);
10499 if (const0 == 0
10500 && (op0 == IOR || op0 == XOR || op0 == PLUS))
10501 op0 = UNKNOWN;
10502 else if (const0 == 0 && op0 == AND)
10503 op0 = SET;
10504 else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
10505 && op0 == AND)
10506 op0 = UNKNOWN;
10507
10508 *pop0 = op0;
10509
10510 /* ??? Slightly redundant with the above mask, but not entirely.
10511 Moving this above means we'd have to sign-extend the mode mask
10512 for the final test. */
10513 if (op0 != UNKNOWN && op0 != NEG)
10514 *pconst0 = trunc_int_for_mode (const0, mode);
10515
10516 return 1;
10517 }
10518 \f
10519 /* A helper to simplify_shift_const_1 to determine the mode we can perform
10520 the shift in. The original shift operation CODE is performed on OP in
10521 ORIG_MODE. Return the wider mode MODE if we can perform the operation
10522 in that mode. Return ORIG_MODE otherwise. We can also assume that the
10523 result of the shift is subject to operation OUTER_CODE with operand
10524 OUTER_CONST. */
10525
10526 static scalar_int_mode
10527 try_widen_shift_mode (enum rtx_code code, rtx op, int count,
10528 scalar_int_mode orig_mode, scalar_int_mode mode,
10529 enum rtx_code outer_code, HOST_WIDE_INT outer_const)
10530 {
10531 gcc_assert (GET_MODE_PRECISION (mode) > GET_MODE_PRECISION (orig_mode));
10532
10533 /* In general we can't perform in wider mode for right shift and rotate. */
10534 switch (code)
10535 {
10536 case ASHIFTRT:
10537 /* We can still widen if the bits brought in from the left are identical
10538 to the sign bit of ORIG_MODE. */
10539 if (num_sign_bit_copies (op, mode)
10540 > (unsigned) (GET_MODE_PRECISION (mode)
10541 - GET_MODE_PRECISION (orig_mode)))
10542 return mode;
10543 return orig_mode;
10544
10545 case LSHIFTRT:
10546 /* Similarly here but with zero bits. */
10547 if (HWI_COMPUTABLE_MODE_P (mode)
10548 && (nonzero_bits (op, mode) & ~GET_MODE_MASK (orig_mode)) == 0)
10549 return mode;
10550
10551 /* We can also widen if the bits brought in will be masked off. This
10552 operation is performed in ORIG_MODE. */
10553 if (outer_code == AND)
10554 {
10555 int care_bits = low_bitmask_len (orig_mode, outer_const);
10556
10557 if (care_bits >= 0
10558 && GET_MODE_PRECISION (orig_mode) - care_bits >= count)
10559 return mode;
10560 }
10561 /* fall through */
10562
10563 case ROTATE:
10564 return orig_mode;
10565
10566 case ROTATERT:
10567 gcc_unreachable ();
10568
10569 default:
10570 return mode;
10571 }
10572 }
10573
10574 /* Simplify a shift of VAROP by ORIG_COUNT bits. CODE says what kind
10575 of shift. The result of the shift is RESULT_MODE. Return NULL_RTX
10576 if we cannot simplify it. Otherwise, return a simplified value.
10577
10578 The shift is normally computed in the widest mode we find in VAROP, as
10579 long as it isn't a different number of words than RESULT_MODE. Exceptions
10580 are ASHIFTRT and ROTATE, which are always done in their original mode. */
10581
10582 static rtx
10583 simplify_shift_const_1 (enum rtx_code code, machine_mode result_mode,
10584 rtx varop, int orig_count)
10585 {
10586 enum rtx_code orig_code = code;
10587 rtx orig_varop = varop;
10588 int count, log2;
10589 machine_mode mode = result_mode;
10590 machine_mode shift_mode;
10591 scalar_int_mode tmode, inner_mode, int_mode, int_varop_mode, int_result_mode;
10592 /* We form (outer_op (code varop count) (outer_const)). */
10593 enum rtx_code outer_op = UNKNOWN;
10594 HOST_WIDE_INT outer_const = 0;
10595 int complement_p = 0;
10596 rtx new_rtx, x;
10597
10598 /* Make sure and truncate the "natural" shift on the way in. We don't
10599 want to do this inside the loop as it makes it more difficult to
10600 combine shifts. */
10601 if (SHIFT_COUNT_TRUNCATED)
10602 orig_count &= GET_MODE_UNIT_BITSIZE (mode) - 1;
10603
10604 /* If we were given an invalid count, don't do anything except exactly
10605 what was requested. */
10606
10607 if (orig_count < 0 || orig_count >= (int) GET_MODE_UNIT_PRECISION (mode))
10608 return NULL_RTX;
10609
10610 count = orig_count;
10611
10612 /* Unless one of the branches of the `if' in this loop does a `continue',
10613 we will `break' the loop after the `if'. */
10614
10615 while (count != 0)
10616 {
10617 /* If we have an operand of (clobber (const_int 0)), fail. */
10618 if (GET_CODE (varop) == CLOBBER)
10619 return NULL_RTX;
10620
10621 /* Convert ROTATERT to ROTATE. */
10622 if (code == ROTATERT)
10623 {
10624 unsigned int bitsize = GET_MODE_UNIT_PRECISION (result_mode);
10625 code = ROTATE;
10626 count = bitsize - count;
10627 }
10628
10629 shift_mode = result_mode;
10630 if (shift_mode != mode)
10631 {
10632 /* We only change the modes of scalar shifts. */
10633 int_mode = as_a <scalar_int_mode> (mode);
10634 int_result_mode = as_a <scalar_int_mode> (result_mode);
10635 shift_mode = try_widen_shift_mode (code, varop, count,
10636 int_result_mode, int_mode,
10637 outer_op, outer_const);
10638 }
10639
10640 scalar_int_mode shift_unit_mode
10641 = as_a <scalar_int_mode> (GET_MODE_INNER (shift_mode));
10642
10643 /* Handle cases where the count is greater than the size of the mode
10644 minus 1. For ASHIFT, use the size minus one as the count (this can
10645 occur when simplifying (lshiftrt (ashiftrt ..))). For rotates,
10646 take the count modulo the size. For other shifts, the result is
10647 zero.
10648
10649 Since these shifts are being produced by the compiler by combining
10650 multiple operations, each of which are defined, we know what the
10651 result is supposed to be. */
10652
10653 if (count > (GET_MODE_PRECISION (shift_unit_mode) - 1))
10654 {
10655 if (code == ASHIFTRT)
10656 count = GET_MODE_PRECISION (shift_unit_mode) - 1;
10657 else if (code == ROTATE || code == ROTATERT)
10658 count %= GET_MODE_PRECISION (shift_unit_mode);
10659 else
10660 {
10661 /* We can't simply return zero because there may be an
10662 outer op. */
10663 varop = const0_rtx;
10664 count = 0;
10665 break;
10666 }
10667 }
10668
10669 /* If we discovered we had to complement VAROP, leave. Making a NOT
10670 here would cause an infinite loop. */
10671 if (complement_p)
10672 break;
10673
10674 if (shift_mode == shift_unit_mode)
10675 {
10676 /* An arithmetic right shift of a quantity known to be -1 or 0
10677 is a no-op. */
10678 if (code == ASHIFTRT
10679 && (num_sign_bit_copies (varop, shift_unit_mode)
10680 == GET_MODE_PRECISION (shift_unit_mode)))
10681 {
10682 count = 0;
10683 break;
10684 }
10685
10686 /* If we are doing an arithmetic right shift and discarding all but
10687 the sign bit copies, this is equivalent to doing a shift by the
10688 bitsize minus one. Convert it into that shift because it will
10689 often allow other simplifications. */
10690
10691 if (code == ASHIFTRT
10692 && (count + num_sign_bit_copies (varop, shift_unit_mode)
10693 >= GET_MODE_PRECISION (shift_unit_mode)))
10694 count = GET_MODE_PRECISION (shift_unit_mode) - 1;
10695
10696 /* We simplify the tests below and elsewhere by converting
10697 ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
10698 `make_compound_operation' will convert it to an ASHIFTRT for
10699 those machines (such as VAX) that don't have an LSHIFTRT. */
10700 if (code == ASHIFTRT
10701 && HWI_COMPUTABLE_MODE_P (shift_unit_mode)
10702 && val_signbit_known_clear_p (shift_unit_mode,
10703 nonzero_bits (varop,
10704 shift_unit_mode)))
10705 code = LSHIFTRT;
10706
10707 if (((code == LSHIFTRT
10708 && HWI_COMPUTABLE_MODE_P (shift_unit_mode)
10709 && !(nonzero_bits (varop, shift_unit_mode) >> count))
10710 || (code == ASHIFT
10711 && HWI_COMPUTABLE_MODE_P (shift_unit_mode)
10712 && !((nonzero_bits (varop, shift_unit_mode) << count)
10713 & GET_MODE_MASK (shift_unit_mode))))
10714 && !side_effects_p (varop))
10715 varop = const0_rtx;
10716 }
10717
10718 switch (GET_CODE (varop))
10719 {
10720 case SIGN_EXTEND:
10721 case ZERO_EXTEND:
10722 case SIGN_EXTRACT:
10723 case ZERO_EXTRACT:
10724 new_rtx = expand_compound_operation (varop);
10725 if (new_rtx != varop)
10726 {
10727 varop = new_rtx;
10728 continue;
10729 }
10730 break;
10731
10732 case MEM:
10733 /* The following rules apply only to scalars. */
10734 if (shift_mode != shift_unit_mode)
10735 break;
10736 int_mode = as_a <scalar_int_mode> (mode);
10737
10738 /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
10739 minus the width of a smaller mode, we can do this with a
10740 SIGN_EXTEND or ZERO_EXTEND from the narrower memory location. */
10741 if ((code == ASHIFTRT || code == LSHIFTRT)
10742 && ! mode_dependent_address_p (XEXP (varop, 0),
10743 MEM_ADDR_SPACE (varop))
10744 && ! MEM_VOLATILE_P (varop)
10745 && (int_mode_for_size (GET_MODE_BITSIZE (int_mode) - count, 1)
10746 .exists (&tmode)))
10747 {
10748 new_rtx = adjust_address_nv (varop, tmode,
10749 BYTES_BIG_ENDIAN ? 0
10750 : count / BITS_PER_UNIT);
10751
10752 varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
10753 : ZERO_EXTEND, int_mode, new_rtx);
10754 count = 0;
10755 continue;
10756 }
10757 break;
10758
10759 case SUBREG:
10760 /* The following rules apply only to scalars. */
10761 if (shift_mode != shift_unit_mode)
10762 break;
10763 int_mode = as_a <scalar_int_mode> (mode);
10764 int_varop_mode = as_a <scalar_int_mode> (GET_MODE (varop));
10765
10766 /* If VAROP is a SUBREG, strip it as long as the inner operand has
10767 the same number of words as what we've seen so far. Then store
10768 the widest mode in MODE. */
10769 if (subreg_lowpart_p (varop)
10770 && is_int_mode (GET_MODE (SUBREG_REG (varop)), &inner_mode)
10771 && GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (int_varop_mode)
10772 && (CEIL (GET_MODE_SIZE (inner_mode), UNITS_PER_WORD)
10773 == CEIL (GET_MODE_SIZE (int_mode), UNITS_PER_WORD))
10774 && GET_MODE_CLASS (int_varop_mode) == MODE_INT)
10775 {
10776 varop = SUBREG_REG (varop);
10777 if (GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (int_mode))
10778 mode = inner_mode;
10779 continue;
10780 }
10781 break;
10782
10783 case MULT:
10784 /* Some machines use MULT instead of ASHIFT because MULT
10785 is cheaper. But it is still better on those machines to
10786 merge two shifts into one. */
10787 if (CONST_INT_P (XEXP (varop, 1))
10788 && (log2 = exact_log2 (UINTVAL (XEXP (varop, 1)))) >= 0)
10789 {
10790 rtx log2_rtx = gen_int_shift_amount (GET_MODE (varop), log2);
10791 varop = simplify_gen_binary (ASHIFT, GET_MODE (varop),
10792 XEXP (varop, 0), log2_rtx);
10793 continue;
10794 }
10795 break;
10796
10797 case UDIV:
10798 /* Similar, for when divides are cheaper. */
10799 if (CONST_INT_P (XEXP (varop, 1))
10800 && (log2 = exact_log2 (UINTVAL (XEXP (varop, 1)))) >= 0)
10801 {
10802 rtx log2_rtx = gen_int_shift_amount (GET_MODE (varop), log2);
10803 varop = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
10804 XEXP (varop, 0), log2_rtx);
10805 continue;
10806 }
10807 break;
10808
10809 case ASHIFTRT:
10810 /* If we are extracting just the sign bit of an arithmetic
10811 right shift, that shift is not needed. However, the sign
10812 bit of a wider mode may be different from what would be
10813 interpreted as the sign bit in a narrower mode, so, if
10814 the result is narrower, don't discard the shift. */
10815 if (code == LSHIFTRT
10816 && count == (GET_MODE_UNIT_BITSIZE (result_mode) - 1)
10817 && (GET_MODE_UNIT_BITSIZE (result_mode)
10818 >= GET_MODE_UNIT_BITSIZE (GET_MODE (varop))))
10819 {
10820 varop = XEXP (varop, 0);
10821 continue;
10822 }
10823
10824 /* fall through */
10825
10826 case LSHIFTRT:
10827 case ASHIFT:
10828 case ROTATE:
10829 /* The following rules apply only to scalars. */
10830 if (shift_mode != shift_unit_mode)
10831 break;
10832 int_mode = as_a <scalar_int_mode> (mode);
10833 int_varop_mode = as_a <scalar_int_mode> (GET_MODE (varop));
10834 int_result_mode = as_a <scalar_int_mode> (result_mode);
10835
10836 /* Here we have two nested shifts. The result is usually the
10837 AND of a new shift with a mask. We compute the result below. */
10838 if (CONST_INT_P (XEXP (varop, 1))
10839 && INTVAL (XEXP (varop, 1)) >= 0
10840 && INTVAL (XEXP (varop, 1)) < GET_MODE_PRECISION (int_varop_mode)
10841 && HWI_COMPUTABLE_MODE_P (int_result_mode)
10842 && HWI_COMPUTABLE_MODE_P (int_mode))
10843 {
10844 enum rtx_code first_code = GET_CODE (varop);
10845 unsigned int first_count = INTVAL (XEXP (varop, 1));
10846 unsigned HOST_WIDE_INT mask;
10847 rtx mask_rtx;
10848
10849 /* We have one common special case. We can't do any merging if
10850 the inner code is an ASHIFTRT of a smaller mode. However, if
10851 we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
10852 with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
10853 we can convert it to
10854 (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0) C3) C2) C1).
10855 This simplifies certain SIGN_EXTEND operations. */
10856 if (code == ASHIFT && first_code == ASHIFTRT
10857 && count == (GET_MODE_PRECISION (int_result_mode)
10858 - GET_MODE_PRECISION (int_varop_mode)))
10859 {
10860 /* C3 has the low-order C1 bits zero. */
10861
10862 mask = GET_MODE_MASK (int_mode)
10863 & ~((HOST_WIDE_INT_1U << first_count) - 1);
10864
10865 varop = simplify_and_const_int (NULL_RTX, int_result_mode,
10866 XEXP (varop, 0), mask);
10867 varop = simplify_shift_const (NULL_RTX, ASHIFT,
10868 int_result_mode, varop, count);
10869 count = first_count;
10870 code = ASHIFTRT;
10871 continue;
10872 }
10873
10874 /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
10875 than C1 high-order bits equal to the sign bit, we can convert
10876 this to either an ASHIFT or an ASHIFTRT depending on the
10877 two counts.
10878
10879 We cannot do this if VAROP's mode is not SHIFT_UNIT_MODE. */
10880
10881 if (code == ASHIFTRT && first_code == ASHIFT
10882 && int_varop_mode == shift_unit_mode
10883 && (num_sign_bit_copies (XEXP (varop, 0), shift_unit_mode)
10884 > first_count))
10885 {
10886 varop = XEXP (varop, 0);
10887 count -= first_count;
10888 if (count < 0)
10889 {
10890 count = -count;
10891 code = ASHIFT;
10892 }
10893
10894 continue;
10895 }
10896
10897 /* There are some cases we can't do. If CODE is ASHIFTRT,
10898 we can only do this if FIRST_CODE is also ASHIFTRT.
10899
10900 We can't do the case when CODE is ROTATE and FIRST_CODE is
10901 ASHIFTRT.
10902
10903 If the mode of this shift is not the mode of the outer shift,
10904 we can't do this if either shift is a right shift or ROTATE.
10905
10906 Finally, we can't do any of these if the mode is too wide
10907 unless the codes are the same.
10908
10909 Handle the case where the shift codes are the same
10910 first. */
10911
10912 if (code == first_code)
10913 {
10914 if (int_varop_mode != int_result_mode
10915 && (code == ASHIFTRT || code == LSHIFTRT
10916 || code == ROTATE))
10917 break;
10918
10919 count += first_count;
10920 varop = XEXP (varop, 0);
10921 continue;
10922 }
10923
10924 if (code == ASHIFTRT
10925 || (code == ROTATE && first_code == ASHIFTRT)
10926 || GET_MODE_PRECISION (int_mode) > HOST_BITS_PER_WIDE_INT
10927 || (int_varop_mode != int_result_mode
10928 && (first_code == ASHIFTRT || first_code == LSHIFTRT
10929 || first_code == ROTATE
10930 || code == ROTATE)))
10931 break;
10932
10933 /* To compute the mask to apply after the shift, shift the
10934 nonzero bits of the inner shift the same way the
10935 outer shift will. */
10936
10937 mask_rtx = gen_int_mode (nonzero_bits (varop, int_varop_mode),
10938 int_result_mode);
10939 rtx count_rtx = gen_int_shift_amount (int_result_mode, count);
10940 mask_rtx
10941 = simplify_const_binary_operation (code, int_result_mode,
10942 mask_rtx, count_rtx);
10943
10944 /* Give up if we can't compute an outer operation to use. */
10945 if (mask_rtx == 0
10946 || !CONST_INT_P (mask_rtx)
10947 || ! merge_outer_ops (&outer_op, &outer_const, AND,
10948 INTVAL (mask_rtx),
10949 int_result_mode, &complement_p))
10950 break;
10951
10952 /* If the shifts are in the same direction, we add the
10953 counts. Otherwise, we subtract them. */
10954 if ((code == ASHIFTRT || code == LSHIFTRT)
10955 == (first_code == ASHIFTRT || first_code == LSHIFTRT))
10956 count += first_count;
10957 else
10958 count -= first_count;
10959
10960 /* If COUNT is positive, the new shift is usually CODE,
10961 except for the two exceptions below, in which case it is
10962 FIRST_CODE. If the count is negative, FIRST_CODE should
10963 always be used */
10964 if (count > 0
10965 && ((first_code == ROTATE && code == ASHIFT)
10966 || (first_code == ASHIFTRT && code == LSHIFTRT)))
10967 code = first_code;
10968 else if (count < 0)
10969 code = first_code, count = -count;
10970
10971 varop = XEXP (varop, 0);
10972 continue;
10973 }
10974
10975 /* If we have (A << B << C) for any shift, we can convert this to
10976 (A << C << B). This wins if A is a constant. Only try this if
10977 B is not a constant. */
10978
10979 else if (GET_CODE (varop) == code
10980 && CONST_INT_P (XEXP (varop, 0))
10981 && !CONST_INT_P (XEXP (varop, 1)))
10982 {
10983 /* For ((unsigned) (cstULL >> count)) >> cst2 we have to make
10984 sure the result will be masked. See PR70222. */
10985 if (code == LSHIFTRT
10986 && int_mode != int_result_mode
10987 && !merge_outer_ops (&outer_op, &outer_const, AND,
10988 GET_MODE_MASK (int_result_mode)
10989 >> orig_count, int_result_mode,
10990 &complement_p))
10991 break;
10992 /* For ((int) (cstLL >> count)) >> cst2 just give up. Queuing
10993 up outer sign extension (often left and right shift) is
10994 hardly more efficient than the original. See PR70429. */
10995 if (code == ASHIFTRT && int_mode != int_result_mode)
10996 break;
10997
10998 rtx count_rtx = gen_int_shift_amount (int_result_mode, count);
10999 rtx new_rtx = simplify_const_binary_operation (code, int_mode,
11000 XEXP (varop, 0),
11001 count_rtx);
11002 varop = gen_rtx_fmt_ee (code, int_mode, new_rtx, XEXP (varop, 1));
11003 count = 0;
11004 continue;
11005 }
11006 break;
11007
11008 case NOT:
11009 /* The following rules apply only to scalars. */
11010 if (shift_mode != shift_unit_mode)
11011 break;
11012
11013 /* Make this fit the case below. */
11014 varop = gen_rtx_XOR (mode, XEXP (varop, 0), constm1_rtx);
11015 continue;
11016
11017 case IOR:
11018 case AND:
11019 case XOR:
11020 /* The following rules apply only to scalars. */
11021 if (shift_mode != shift_unit_mode)
11022 break;
11023 int_varop_mode = as_a <scalar_int_mode> (GET_MODE (varop));
11024 int_result_mode = as_a <scalar_int_mode> (result_mode);
11025
11026 /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
11027 with C the size of VAROP - 1 and the shift is logical if
11028 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
11029 we have an (le X 0) operation. If we have an arithmetic shift
11030 and STORE_FLAG_VALUE is 1 or we have a logical shift with
11031 STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation. */
11032
11033 if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
11034 && XEXP (XEXP (varop, 0), 1) == constm1_rtx
11035 && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
11036 && (code == LSHIFTRT || code == ASHIFTRT)
11037 && count == (GET_MODE_PRECISION (int_varop_mode) - 1)
11038 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
11039 {
11040 count = 0;
11041 varop = gen_rtx_LE (int_varop_mode, XEXP (varop, 1),
11042 const0_rtx);
11043
11044 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
11045 varop = gen_rtx_NEG (int_varop_mode, varop);
11046
11047 continue;
11048 }
11049
11050 /* If we have (shift (logical)), move the logical to the outside
11051 to allow it to possibly combine with another logical and the
11052 shift to combine with another shift. This also canonicalizes to
11053 what a ZERO_EXTRACT looks like. Also, some machines have
11054 (and (shift)) insns. */
11055
11056 if (CONST_INT_P (XEXP (varop, 1))
11057 /* We can't do this if we have (ashiftrt (xor)) and the
11058 constant has its sign bit set in shift_unit_mode with
11059 shift_unit_mode wider than result_mode. */
11060 && !(code == ASHIFTRT && GET_CODE (varop) == XOR
11061 && int_result_mode != shift_unit_mode
11062 && trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
11063 shift_unit_mode) < 0)
11064 && (new_rtx = simplify_const_binary_operation
11065 (code, int_result_mode,
11066 gen_int_mode (INTVAL (XEXP (varop, 1)), int_result_mode),
11067 gen_int_shift_amount (int_result_mode, count))) != 0
11068 && CONST_INT_P (new_rtx)
11069 && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
11070 INTVAL (new_rtx), int_result_mode,
11071 &complement_p))
11072 {
11073 varop = XEXP (varop, 0);
11074 continue;
11075 }
11076
11077 /* If we can't do that, try to simplify the shift in each arm of the
11078 logical expression, make a new logical expression, and apply
11079 the inverse distributive law. This also can't be done for
11080 (ashiftrt (xor)) where we've widened the shift and the constant
11081 changes the sign bit. */
11082 if (CONST_INT_P (XEXP (varop, 1))
11083 && !(code == ASHIFTRT && GET_CODE (varop) == XOR
11084 && int_result_mode != shift_unit_mode
11085 && trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
11086 shift_unit_mode) < 0))
11087 {
11088 rtx lhs = simplify_shift_const (NULL_RTX, code, shift_unit_mode,
11089 XEXP (varop, 0), count);
11090 rtx rhs = simplify_shift_const (NULL_RTX, code, shift_unit_mode,
11091 XEXP (varop, 1), count);
11092
11093 varop = simplify_gen_binary (GET_CODE (varop), shift_unit_mode,
11094 lhs, rhs);
11095 varop = apply_distributive_law (varop);
11096
11097 count = 0;
11098 continue;
11099 }
11100 break;
11101
11102 case EQ:
11103 /* The following rules apply only to scalars. */
11104 if (shift_mode != shift_unit_mode)
11105 break;
11106 int_result_mode = as_a <scalar_int_mode> (result_mode);
11107
11108 /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
11109 says that the sign bit can be tested, FOO has mode MODE, C is
11110 GET_MODE_PRECISION (MODE) - 1, and FOO has only its low-order bit
11111 that may be nonzero. */
11112 if (code == LSHIFTRT
11113 && XEXP (varop, 1) == const0_rtx
11114 && GET_MODE (XEXP (varop, 0)) == int_result_mode
11115 && count == (GET_MODE_PRECISION (int_result_mode) - 1)
11116 && HWI_COMPUTABLE_MODE_P (int_result_mode)
11117 && STORE_FLAG_VALUE == -1
11118 && nonzero_bits (XEXP (varop, 0), int_result_mode) == 1
11119 && merge_outer_ops (&outer_op, &outer_const, XOR, 1,
11120 int_result_mode, &complement_p))
11121 {
11122 varop = XEXP (varop, 0);
11123 count = 0;
11124 continue;
11125 }
11126 break;
11127
11128 case NEG:
11129 /* The following rules apply only to scalars. */
11130 if (shift_mode != shift_unit_mode)
11131 break;
11132 int_result_mode = as_a <scalar_int_mode> (result_mode);
11133
11134 /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
11135 than the number of bits in the mode is equivalent to A. */
11136 if (code == LSHIFTRT
11137 && count == (GET_MODE_PRECISION (int_result_mode) - 1)
11138 && nonzero_bits (XEXP (varop, 0), int_result_mode) == 1)
11139 {
11140 varop = XEXP (varop, 0);
11141 count = 0;
11142 continue;
11143 }
11144
11145 /* NEG commutes with ASHIFT since it is multiplication. Move the
11146 NEG outside to allow shifts to combine. */
11147 if (code == ASHIFT
11148 && merge_outer_ops (&outer_op, &outer_const, NEG, 0,
11149 int_result_mode, &complement_p))
11150 {
11151 varop = XEXP (varop, 0);
11152 continue;
11153 }
11154 break;
11155
11156 case PLUS:
11157 /* The following rules apply only to scalars. */
11158 if (shift_mode != shift_unit_mode)
11159 break;
11160 int_result_mode = as_a <scalar_int_mode> (result_mode);
11161
11162 /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
11163 is one less than the number of bits in the mode is
11164 equivalent to (xor A 1). */
11165 if (code == LSHIFTRT
11166 && count == (GET_MODE_PRECISION (int_result_mode) - 1)
11167 && XEXP (varop, 1) == constm1_rtx
11168 && nonzero_bits (XEXP (varop, 0), int_result_mode) == 1
11169 && merge_outer_ops (&outer_op, &outer_const, XOR, 1,
11170 int_result_mode, &complement_p))
11171 {
11172 count = 0;
11173 varop = XEXP (varop, 0);
11174 continue;
11175 }
11176
11177 /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
11178 that might be nonzero in BAR are those being shifted out and those
11179 bits are known zero in FOO, we can replace the PLUS with FOO.
11180 Similarly in the other operand order. This code occurs when
11181 we are computing the size of a variable-size array. */
11182
11183 if ((code == ASHIFTRT || code == LSHIFTRT)
11184 && count < HOST_BITS_PER_WIDE_INT
11185 && nonzero_bits (XEXP (varop, 1), int_result_mode) >> count == 0
11186 && (nonzero_bits (XEXP (varop, 1), int_result_mode)
11187 & nonzero_bits (XEXP (varop, 0), int_result_mode)) == 0)
11188 {
11189 varop = XEXP (varop, 0);
11190 continue;
11191 }
11192 else if ((code == ASHIFTRT || code == LSHIFTRT)
11193 && count < HOST_BITS_PER_WIDE_INT
11194 && HWI_COMPUTABLE_MODE_P (int_result_mode)
11195 && (nonzero_bits (XEXP (varop, 0), int_result_mode)
11196 >> count) == 0
11197 && (nonzero_bits (XEXP (varop, 0), int_result_mode)
11198 & nonzero_bits (XEXP (varop, 1), int_result_mode)) == 0)
11199 {
11200 varop = XEXP (varop, 1);
11201 continue;
11202 }
11203
11204 /* (ashift (plus foo C) N) is (plus (ashift foo N) C'). */
11205 if (code == ASHIFT
11206 && CONST_INT_P (XEXP (varop, 1))
11207 && (new_rtx = simplify_const_binary_operation
11208 (ASHIFT, int_result_mode,
11209 gen_int_mode (INTVAL (XEXP (varop, 1)), int_result_mode),
11210 gen_int_shift_amount (int_result_mode, count))) != 0
11211 && CONST_INT_P (new_rtx)
11212 && merge_outer_ops (&outer_op, &outer_const, PLUS,
11213 INTVAL (new_rtx), int_result_mode,
11214 &complement_p))
11215 {
11216 varop = XEXP (varop, 0);
11217 continue;
11218 }
11219
11220 /* Check for 'PLUS signbit', which is the canonical form of 'XOR
11221 signbit', and attempt to change the PLUS to an XOR and move it to
11222 the outer operation as is done above in the AND/IOR/XOR case
11223 leg for shift(logical). See details in logical handling above
11224 for reasoning in doing so. */
11225 if (code == LSHIFTRT
11226 && CONST_INT_P (XEXP (varop, 1))
11227 && mode_signbit_p (int_result_mode, XEXP (varop, 1))
11228 && (new_rtx = simplify_const_binary_operation
11229 (code, int_result_mode,
11230 gen_int_mode (INTVAL (XEXP (varop, 1)), int_result_mode),
11231 gen_int_shift_amount (int_result_mode, count))) != 0
11232 && CONST_INT_P (new_rtx)
11233 && merge_outer_ops (&outer_op, &outer_const, XOR,
11234 INTVAL (new_rtx), int_result_mode,
11235 &complement_p))
11236 {
11237 varop = XEXP (varop, 0);
11238 continue;
11239 }
11240
11241 break;
11242
11243 case MINUS:
11244 /* The following rules apply only to scalars. */
11245 if (shift_mode != shift_unit_mode)
11246 break;
11247 int_varop_mode = as_a <scalar_int_mode> (GET_MODE (varop));
11248
11249 /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
11250 with C the size of VAROP - 1 and the shift is logical if
11251 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
11252 we have a (gt X 0) operation. If the shift is arithmetic with
11253 STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
11254 we have a (neg (gt X 0)) operation. */
11255
11256 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
11257 && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
11258 && count == (GET_MODE_PRECISION (int_varop_mode) - 1)
11259 && (code == LSHIFTRT || code == ASHIFTRT)
11260 && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
11261 && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
11262 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
11263 {
11264 count = 0;
11265 varop = gen_rtx_GT (int_varop_mode, XEXP (varop, 1),
11266 const0_rtx);
11267
11268 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
11269 varop = gen_rtx_NEG (int_varop_mode, varop);
11270
11271 continue;
11272 }
11273 break;
11274
11275 case TRUNCATE:
11276 /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
11277 if the truncate does not affect the value. */
11278 if (code == LSHIFTRT
11279 && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
11280 && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
11281 && (INTVAL (XEXP (XEXP (varop, 0), 1))
11282 >= (GET_MODE_UNIT_PRECISION (GET_MODE (XEXP (varop, 0)))
11283 - GET_MODE_UNIT_PRECISION (GET_MODE (varop)))))
11284 {
11285 rtx varop_inner = XEXP (varop, 0);
11286 int new_count = count + INTVAL (XEXP (varop_inner, 1));
11287 rtx new_count_rtx = gen_int_shift_amount (GET_MODE (varop_inner),
11288 new_count);
11289 varop_inner = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
11290 XEXP (varop_inner, 0),
11291 new_count_rtx);
11292 varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
11293 count = 0;
11294 continue;
11295 }
11296 break;
11297
11298 default:
11299 break;
11300 }
11301
11302 break;
11303 }
11304
11305 shift_mode = result_mode;
11306 if (shift_mode != mode)
11307 {
11308 /* We only change the modes of scalar shifts. */
11309 int_mode = as_a <scalar_int_mode> (mode);
11310 int_result_mode = as_a <scalar_int_mode> (result_mode);
11311 shift_mode = try_widen_shift_mode (code, varop, count, int_result_mode,
11312 int_mode, outer_op, outer_const);
11313 }
11314
11315 /* We have now finished analyzing the shift. The result should be
11316 a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places. If
11317 OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
11318 to the result of the shift. OUTER_CONST is the relevant constant,
11319 but we must turn off all bits turned off in the shift. */
11320
11321 if (outer_op == UNKNOWN
11322 && orig_code == code && orig_count == count
11323 && varop == orig_varop
11324 && shift_mode == GET_MODE (varop))
11325 return NULL_RTX;
11326
11327 /* Make a SUBREG if necessary. If we can't make it, fail. */
11328 varop = gen_lowpart (shift_mode, varop);
11329 if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
11330 return NULL_RTX;
11331
11332 /* If we have an outer operation and we just made a shift, it is
11333 possible that we could have simplified the shift were it not
11334 for the outer operation. So try to do the simplification
11335 recursively. */
11336
11337 if (outer_op != UNKNOWN)
11338 x = simplify_shift_const_1 (code, shift_mode, varop, count);
11339 else
11340 x = NULL_RTX;
11341
11342 if (x == NULL_RTX)
11343 x = simplify_gen_binary (code, shift_mode, varop,
11344 gen_int_shift_amount (shift_mode, count));
11345
11346 /* If we were doing an LSHIFTRT in a wider mode than it was originally,
11347 turn off all the bits that the shift would have turned off. */
11348 if (orig_code == LSHIFTRT && result_mode != shift_mode)
11349 /* We only change the modes of scalar shifts. */
11350 x = simplify_and_const_int (NULL_RTX, as_a <scalar_int_mode> (shift_mode),
11351 x, GET_MODE_MASK (result_mode) >> orig_count);
11352
11353 /* Do the remainder of the processing in RESULT_MODE. */
11354 x = gen_lowpart_or_truncate (result_mode, x);
11355
11356 /* If COMPLEMENT_P is set, we have to complement X before doing the outer
11357 operation. */
11358 if (complement_p)
11359 x = simplify_gen_unary (NOT, result_mode, x, result_mode);
11360
11361 if (outer_op != UNKNOWN)
11362 {
11363 int_result_mode = as_a <scalar_int_mode> (result_mode);
11364
11365 if (GET_RTX_CLASS (outer_op) != RTX_UNARY
11366 && GET_MODE_PRECISION (int_result_mode) < HOST_BITS_PER_WIDE_INT)
11367 outer_const = trunc_int_for_mode (outer_const, int_result_mode);
11368
11369 if (outer_op == AND)
11370 x = simplify_and_const_int (NULL_RTX, int_result_mode, x, outer_const);
11371 else if (outer_op == SET)
11372 {
11373 /* This means that we have determined that the result is
11374 equivalent to a constant. This should be rare. */
11375 if (!side_effects_p (x))
11376 x = GEN_INT (outer_const);
11377 }
11378 else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
11379 x = simplify_gen_unary (outer_op, int_result_mode, x, int_result_mode);
11380 else
11381 x = simplify_gen_binary (outer_op, int_result_mode, x,
11382 GEN_INT (outer_const));
11383 }
11384
11385 return x;
11386 }
11387
11388 /* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift.
11389 The result of the shift is RESULT_MODE. If we cannot simplify it,
11390 return X or, if it is NULL, synthesize the expression with
11391 simplify_gen_binary. Otherwise, return a simplified value.
11392
11393 The shift is normally computed in the widest mode we find in VAROP, as
11394 long as it isn't a different number of words than RESULT_MODE. Exceptions
11395 are ASHIFTRT and ROTATE, which are always done in their original mode. */
11396
11397 static rtx
11398 simplify_shift_const (rtx x, enum rtx_code code, machine_mode result_mode,
11399 rtx varop, int count)
11400 {
11401 rtx tem = simplify_shift_const_1 (code, result_mode, varop, count);
11402 if (tem)
11403 return tem;
11404
11405 if (!x)
11406 x = simplify_gen_binary (code, GET_MODE (varop), varop,
11407 gen_int_shift_amount (GET_MODE (varop), count));
11408 if (GET_MODE (x) != result_mode)
11409 x = gen_lowpart (result_mode, x);
11410 return x;
11411 }
11412
11413 \f
11414 /* A subroutine of recog_for_combine. See there for arguments and
11415 return value. */
11416
11417 static int
11418 recog_for_combine_1 (rtx *pnewpat, rtx_insn *insn, rtx *pnotes)
11419 {
11420 rtx pat = *pnewpat;
11421 rtx pat_without_clobbers;
11422 int insn_code_number;
11423 int num_clobbers_to_add = 0;
11424 int i;
11425 rtx notes = NULL_RTX;
11426 rtx old_notes, old_pat;
11427 int old_icode;
11428
11429 /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
11430 we use to indicate that something didn't match. If we find such a
11431 thing, force rejection. */
11432 if (GET_CODE (pat) == PARALLEL)
11433 for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
11434 if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
11435 && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
11436 return -1;
11437
11438 old_pat = PATTERN (insn);
11439 old_notes = REG_NOTES (insn);
11440 PATTERN (insn) = pat;
11441 REG_NOTES (insn) = NULL_RTX;
11442
11443 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
11444 if (dump_file && (dump_flags & TDF_DETAILS))
11445 {
11446 if (insn_code_number < 0)
11447 fputs ("Failed to match this instruction:\n", dump_file);
11448 else
11449 fputs ("Successfully matched this instruction:\n", dump_file);
11450 print_rtl_single (dump_file, pat);
11451 }
11452
11453 /* If it isn't, there is the possibility that we previously had an insn
11454 that clobbered some register as a side effect, but the combined
11455 insn doesn't need to do that. So try once more without the clobbers
11456 unless this represents an ASM insn. */
11457
11458 if (insn_code_number < 0 && ! check_asm_operands (pat)
11459 && GET_CODE (pat) == PARALLEL)
11460 {
11461 int pos;
11462
11463 for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
11464 if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
11465 {
11466 if (i != pos)
11467 SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
11468 pos++;
11469 }
11470
11471 SUBST_INT (XVECLEN (pat, 0), pos);
11472
11473 if (pos == 1)
11474 pat = XVECEXP (pat, 0, 0);
11475
11476 PATTERN (insn) = pat;
11477 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
11478 if (dump_file && (dump_flags & TDF_DETAILS))
11479 {
11480 if (insn_code_number < 0)
11481 fputs ("Failed to match this instruction:\n", dump_file);
11482 else
11483 fputs ("Successfully matched this instruction:\n", dump_file);
11484 print_rtl_single (dump_file, pat);
11485 }
11486 }
11487
11488 pat_without_clobbers = pat;
11489
11490 PATTERN (insn) = old_pat;
11491 REG_NOTES (insn) = old_notes;
11492
11493 /* Recognize all noop sets, these will be killed by followup pass. */
11494 if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
11495 insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
11496
11497 /* If we had any clobbers to add, make a new pattern than contains
11498 them. Then check to make sure that all of them are dead. */
11499 if (num_clobbers_to_add)
11500 {
11501 rtx newpat = gen_rtx_PARALLEL (VOIDmode,
11502 rtvec_alloc (GET_CODE (pat) == PARALLEL
11503 ? (XVECLEN (pat, 0)
11504 + num_clobbers_to_add)
11505 : num_clobbers_to_add + 1));
11506
11507 if (GET_CODE (pat) == PARALLEL)
11508 for (i = 0; i < XVECLEN (pat, 0); i++)
11509 XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
11510 else
11511 XVECEXP (newpat, 0, 0) = pat;
11512
11513 add_clobbers (newpat, insn_code_number);
11514
11515 for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
11516 i < XVECLEN (newpat, 0); i++)
11517 {
11518 if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
11519 && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
11520 return -1;
11521 if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) != SCRATCH)
11522 {
11523 gcc_assert (REG_P (XEXP (XVECEXP (newpat, 0, i), 0)));
11524 notes = alloc_reg_note (REG_UNUSED,
11525 XEXP (XVECEXP (newpat, 0, i), 0), notes);
11526 }
11527 }
11528 pat = newpat;
11529 }
11530
11531 if (insn_code_number >= 0
11532 && insn_code_number != NOOP_MOVE_INSN_CODE)
11533 {
11534 old_pat = PATTERN (insn);
11535 old_notes = REG_NOTES (insn);
11536 old_icode = INSN_CODE (insn);
11537 PATTERN (insn) = pat;
11538 REG_NOTES (insn) = notes;
11539 INSN_CODE (insn) = insn_code_number;
11540
11541 /* Allow targets to reject combined insn. */
11542 if (!targetm.legitimate_combined_insn (insn))
11543 {
11544 if (dump_file && (dump_flags & TDF_DETAILS))
11545 fputs ("Instruction not appropriate for target.",
11546 dump_file);
11547
11548 /* Callers expect recog_for_combine to strip
11549 clobbers from the pattern on failure. */
11550 pat = pat_without_clobbers;
11551 notes = NULL_RTX;
11552
11553 insn_code_number = -1;
11554 }
11555
11556 PATTERN (insn) = old_pat;
11557 REG_NOTES (insn) = old_notes;
11558 INSN_CODE (insn) = old_icode;
11559 }
11560
11561 *pnewpat = pat;
11562 *pnotes = notes;
11563
11564 return insn_code_number;
11565 }
11566
11567 /* Change every ZERO_EXTRACT and ZERO_EXTEND of a SUBREG that can be
11568 expressed as an AND and maybe an LSHIFTRT, to that formulation.
11569 Return whether anything was so changed. */
11570
11571 static bool
11572 change_zero_ext (rtx pat)
11573 {
11574 bool changed = false;
11575 rtx *src = &SET_SRC (pat);
11576
11577 subrtx_ptr_iterator::array_type array;
11578 FOR_EACH_SUBRTX_PTR (iter, array, src, NONCONST)
11579 {
11580 rtx x = **iter;
11581 scalar_int_mode mode, inner_mode;
11582 if (!is_a <scalar_int_mode> (GET_MODE (x), &mode))
11583 continue;
11584 int size;
11585
11586 if (GET_CODE (x) == ZERO_EXTRACT
11587 && CONST_INT_P (XEXP (x, 1))
11588 && CONST_INT_P (XEXP (x, 2))
11589 && is_a <scalar_int_mode> (GET_MODE (XEXP (x, 0)), &inner_mode)
11590 && GET_MODE_PRECISION (inner_mode) <= GET_MODE_PRECISION (mode))
11591 {
11592 size = INTVAL (XEXP (x, 1));
11593
11594 int start = INTVAL (XEXP (x, 2));
11595 if (BITS_BIG_ENDIAN)
11596 start = GET_MODE_PRECISION (inner_mode) - size - start;
11597
11598 if (start != 0)
11599 x = gen_rtx_LSHIFTRT (inner_mode, XEXP (x, 0),
11600 gen_int_shift_amount (inner_mode, start));
11601 else
11602 x = XEXP (x, 0);
11603
11604 if (mode != inner_mode)
11605 {
11606 if (REG_P (x) && HARD_REGISTER_P (x)
11607 && !can_change_dest_mode (x, 0, mode))
11608 continue;
11609
11610 x = gen_lowpart_SUBREG (mode, x);
11611 }
11612 }
11613 else if (GET_CODE (x) == ZERO_EXTEND
11614 && GET_CODE (XEXP (x, 0)) == SUBREG
11615 && SCALAR_INT_MODE_P (GET_MODE (SUBREG_REG (XEXP (x, 0))))
11616 && !paradoxical_subreg_p (XEXP (x, 0))
11617 && subreg_lowpart_p (XEXP (x, 0)))
11618 {
11619 inner_mode = as_a <scalar_int_mode> (GET_MODE (XEXP (x, 0)));
11620 size = GET_MODE_PRECISION (inner_mode);
11621 x = SUBREG_REG (XEXP (x, 0));
11622 if (GET_MODE (x) != mode)
11623 {
11624 if (REG_P (x) && HARD_REGISTER_P (x)
11625 && !can_change_dest_mode (x, 0, mode))
11626 continue;
11627
11628 x = gen_lowpart_SUBREG (mode, x);
11629 }
11630 }
11631 else if (GET_CODE (x) == ZERO_EXTEND
11632 && REG_P (XEXP (x, 0))
11633 && HARD_REGISTER_P (XEXP (x, 0))
11634 && can_change_dest_mode (XEXP (x, 0), 0, mode))
11635 {
11636 inner_mode = as_a <scalar_int_mode> (GET_MODE (XEXP (x, 0)));
11637 size = GET_MODE_PRECISION (inner_mode);
11638 x = gen_rtx_REG (mode, REGNO (XEXP (x, 0)));
11639 }
11640 else
11641 continue;
11642
11643 if (!(GET_CODE (x) == LSHIFTRT
11644 && CONST_INT_P (XEXP (x, 1))
11645 && size + INTVAL (XEXP (x, 1)) == GET_MODE_PRECISION (mode)))
11646 {
11647 wide_int mask = wi::mask (size, false, GET_MODE_PRECISION (mode));
11648 x = gen_rtx_AND (mode, x, immed_wide_int_const (mask, mode));
11649 }
11650
11651 SUBST (**iter, x);
11652 changed = true;
11653 }
11654
11655 if (changed)
11656 FOR_EACH_SUBRTX_PTR (iter, array, src, NONCONST)
11657 maybe_swap_commutative_operands (**iter);
11658
11659 rtx *dst = &SET_DEST (pat);
11660 scalar_int_mode mode;
11661 if (GET_CODE (*dst) == ZERO_EXTRACT
11662 && REG_P (XEXP (*dst, 0))
11663 && is_a <scalar_int_mode> (GET_MODE (XEXP (*dst, 0)), &mode)
11664 && CONST_INT_P (XEXP (*dst, 1))
11665 && CONST_INT_P (XEXP (*dst, 2)))
11666 {
11667 rtx reg = XEXP (*dst, 0);
11668 int width = INTVAL (XEXP (*dst, 1));
11669 int offset = INTVAL (XEXP (*dst, 2));
11670 int reg_width = GET_MODE_PRECISION (mode);
11671 if (BITS_BIG_ENDIAN)
11672 offset = reg_width - width - offset;
11673
11674 rtx x, y, z, w;
11675 wide_int mask = wi::shifted_mask (offset, width, true, reg_width);
11676 wide_int mask2 = wi::shifted_mask (offset, width, false, reg_width);
11677 x = gen_rtx_AND (mode, reg, immed_wide_int_const (mask, mode));
11678 if (offset)
11679 y = gen_rtx_ASHIFT (mode, SET_SRC (pat), GEN_INT (offset));
11680 else
11681 y = SET_SRC (pat);
11682 z = gen_rtx_AND (mode, y, immed_wide_int_const (mask2, mode));
11683 w = gen_rtx_IOR (mode, x, z);
11684 SUBST (SET_DEST (pat), reg);
11685 SUBST (SET_SRC (pat), w);
11686
11687 changed = true;
11688 }
11689
11690 return changed;
11691 }
11692
11693 /* Like recog, but we receive the address of a pointer to a new pattern.
11694 We try to match the rtx that the pointer points to.
11695 If that fails, we may try to modify or replace the pattern,
11696 storing the replacement into the same pointer object.
11697
11698 Modifications include deletion or addition of CLOBBERs. If the
11699 instruction will still not match, we change ZERO_EXTEND and ZERO_EXTRACT
11700 to the equivalent AND and perhaps LSHIFTRT patterns, and try with that
11701 (and undo if that fails).
11702
11703 PNOTES is a pointer to a location where any REG_UNUSED notes added for
11704 the CLOBBERs are placed.
11705
11706 The value is the final insn code from the pattern ultimately matched,
11707 or -1. */
11708
11709 static int
11710 recog_for_combine (rtx *pnewpat, rtx_insn *insn, rtx *pnotes)
11711 {
11712 rtx pat = *pnewpat;
11713 int insn_code_number = recog_for_combine_1 (pnewpat, insn, pnotes);
11714 if (insn_code_number >= 0 || check_asm_operands (pat))
11715 return insn_code_number;
11716
11717 void *marker = get_undo_marker ();
11718 bool changed = false;
11719
11720 if (GET_CODE (pat) == SET)
11721 changed = change_zero_ext (pat);
11722 else if (GET_CODE (pat) == PARALLEL)
11723 {
11724 int i;
11725 for (i = 0; i < XVECLEN (pat, 0); i++)
11726 {
11727 rtx set = XVECEXP (pat, 0, i);
11728 if (GET_CODE (set) == SET)
11729 changed |= change_zero_ext (set);
11730 }
11731 }
11732
11733 if (changed)
11734 {
11735 insn_code_number = recog_for_combine_1 (pnewpat, insn, pnotes);
11736
11737 if (insn_code_number < 0)
11738 undo_to_marker (marker);
11739 }
11740
11741 return insn_code_number;
11742 }
11743 \f
11744 /* Like gen_lowpart_general but for use by combine. In combine it
11745 is not possible to create any new pseudoregs. However, it is
11746 safe to create invalid memory addresses, because combine will
11747 try to recognize them and all they will do is make the combine
11748 attempt fail.
11749
11750 If for some reason this cannot do its job, an rtx
11751 (clobber (const_int 0)) is returned.
11752 An insn containing that will not be recognized. */
11753
11754 static rtx
11755 gen_lowpart_for_combine (machine_mode omode, rtx x)
11756 {
11757 machine_mode imode = GET_MODE (x);
11758 rtx result;
11759
11760 if (omode == imode)
11761 return x;
11762
11763 /* We can only support MODE being wider than a word if X is a
11764 constant integer or has a mode the same size. */
11765 if (maybe_gt (GET_MODE_SIZE (omode), UNITS_PER_WORD)
11766 && ! (CONST_SCALAR_INT_P (x)
11767 || known_eq (GET_MODE_SIZE (imode), GET_MODE_SIZE (omode))))
11768 goto fail;
11769
11770 /* X might be a paradoxical (subreg (mem)). In that case, gen_lowpart
11771 won't know what to do. So we will strip off the SUBREG here and
11772 process normally. */
11773 if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
11774 {
11775 x = SUBREG_REG (x);
11776
11777 /* For use in case we fall down into the address adjustments
11778 further below, we need to adjust the known mode and size of
11779 x; imode and isize, since we just adjusted x. */
11780 imode = GET_MODE (x);
11781
11782 if (imode == omode)
11783 return x;
11784 }
11785
11786 result = gen_lowpart_common (omode, x);
11787
11788 if (result)
11789 return result;
11790
11791 if (MEM_P (x))
11792 {
11793 /* Refuse to work on a volatile memory ref or one with a mode-dependent
11794 address. */
11795 if (MEM_VOLATILE_P (x)
11796 || mode_dependent_address_p (XEXP (x, 0), MEM_ADDR_SPACE (x)))
11797 goto fail;
11798
11799 /* If we want to refer to something bigger than the original memref,
11800 generate a paradoxical subreg instead. That will force a reload
11801 of the original memref X. */
11802 if (paradoxical_subreg_p (omode, imode))
11803 return gen_rtx_SUBREG (omode, x, 0);
11804
11805 poly_int64 offset = byte_lowpart_offset (omode, imode);
11806 return adjust_address_nv (x, omode, offset);
11807 }
11808
11809 /* If X is a comparison operator, rewrite it in a new mode. This
11810 probably won't match, but may allow further simplifications. */
11811 else if (COMPARISON_P (x))
11812 return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
11813
11814 /* If we couldn't simplify X any other way, just enclose it in a
11815 SUBREG. Normally, this SUBREG won't match, but some patterns may
11816 include an explicit SUBREG or we may simplify it further in combine. */
11817 else
11818 {
11819 rtx res;
11820
11821 if (imode == VOIDmode)
11822 {
11823 imode = int_mode_for_mode (omode).require ();
11824 x = gen_lowpart_common (imode, x);
11825 if (x == NULL)
11826 goto fail;
11827 }
11828 res = lowpart_subreg (omode, x, imode);
11829 if (res)
11830 return res;
11831 }
11832
11833 fail:
11834 return gen_rtx_CLOBBER (omode, const0_rtx);
11835 }
11836 \f
11837 /* Try to simplify a comparison between OP0 and a constant OP1,
11838 where CODE is the comparison code that will be tested, into a
11839 (CODE OP0 const0_rtx) form.
11840
11841 The result is a possibly different comparison code to use.
11842 *POP1 may be updated. */
11843
11844 static enum rtx_code
11845 simplify_compare_const (enum rtx_code code, machine_mode mode,
11846 rtx op0, rtx *pop1)
11847 {
11848 scalar_int_mode int_mode;
11849 HOST_WIDE_INT const_op = INTVAL (*pop1);
11850
11851 /* Get the constant we are comparing against and turn off all bits
11852 not on in our mode. */
11853 if (mode != VOIDmode)
11854 const_op = trunc_int_for_mode (const_op, mode);
11855
11856 /* If we are comparing against a constant power of two and the value
11857 being compared can only have that single bit nonzero (e.g., it was
11858 `and'ed with that bit), we can replace this with a comparison
11859 with zero. */
11860 if (const_op
11861 && (code == EQ || code == NE || code == GE || code == GEU
11862 || code == LT || code == LTU)
11863 && is_a <scalar_int_mode> (mode, &int_mode)
11864 && GET_MODE_PRECISION (int_mode) - 1 < HOST_BITS_PER_WIDE_INT
11865 && pow2p_hwi (const_op & GET_MODE_MASK (int_mode))
11866 && (nonzero_bits (op0, int_mode)
11867 == (unsigned HOST_WIDE_INT) (const_op & GET_MODE_MASK (int_mode))))
11868 {
11869 code = (code == EQ || code == GE || code == GEU ? NE : EQ);
11870 const_op = 0;
11871 }
11872
11873 /* Similarly, if we are comparing a value known to be either -1 or
11874 0 with -1, change it to the opposite comparison against zero. */
11875 if (const_op == -1
11876 && (code == EQ || code == NE || code == GT || code == LE
11877 || code == GEU || code == LTU)
11878 && is_a <scalar_int_mode> (mode, &int_mode)
11879 && num_sign_bit_copies (op0, int_mode) == GET_MODE_PRECISION (int_mode))
11880 {
11881 code = (code == EQ || code == LE || code == GEU ? NE : EQ);
11882 const_op = 0;
11883 }
11884
11885 /* Do some canonicalizations based on the comparison code. We prefer
11886 comparisons against zero and then prefer equality comparisons.
11887 If we can reduce the size of a constant, we will do that too. */
11888 switch (code)
11889 {
11890 case LT:
11891 /* < C is equivalent to <= (C - 1) */
11892 if (const_op > 0)
11893 {
11894 const_op -= 1;
11895 code = LE;
11896 /* ... fall through to LE case below. */
11897 gcc_fallthrough ();
11898 }
11899 else
11900 break;
11901
11902 case LE:
11903 /* <= C is equivalent to < (C + 1); we do this for C < 0 */
11904 if (const_op < 0)
11905 {
11906 const_op += 1;
11907 code = LT;
11908 }
11909
11910 /* If we are doing a <= 0 comparison on a value known to have
11911 a zero sign bit, we can replace this with == 0. */
11912 else if (const_op == 0
11913 && is_a <scalar_int_mode> (mode, &int_mode)
11914 && GET_MODE_PRECISION (int_mode) - 1 < HOST_BITS_PER_WIDE_INT
11915 && (nonzero_bits (op0, int_mode)
11916 & (HOST_WIDE_INT_1U << (GET_MODE_PRECISION (int_mode) - 1)))
11917 == 0)
11918 code = EQ;
11919 break;
11920
11921 case GE:
11922 /* >= C is equivalent to > (C - 1). */
11923 if (const_op > 0)
11924 {
11925 const_op -= 1;
11926 code = GT;
11927 /* ... fall through to GT below. */
11928 gcc_fallthrough ();
11929 }
11930 else
11931 break;
11932
11933 case GT:
11934 /* > C is equivalent to >= (C + 1); we do this for C < 0. */
11935 if (const_op < 0)
11936 {
11937 const_op += 1;
11938 code = GE;
11939 }
11940
11941 /* If we are doing a > 0 comparison on a value known to have
11942 a zero sign bit, we can replace this with != 0. */
11943 else if (const_op == 0
11944 && is_a <scalar_int_mode> (mode, &int_mode)
11945 && GET_MODE_PRECISION (int_mode) - 1 < HOST_BITS_PER_WIDE_INT
11946 && (nonzero_bits (op0, int_mode)
11947 & (HOST_WIDE_INT_1U << (GET_MODE_PRECISION (int_mode) - 1)))
11948 == 0)
11949 code = NE;
11950 break;
11951
11952 case LTU:
11953 /* < C is equivalent to <= (C - 1). */
11954 if (const_op > 0)
11955 {
11956 const_op -= 1;
11957 code = LEU;
11958 /* ... fall through ... */
11959 gcc_fallthrough ();
11960 }
11961 /* (unsigned) < 0x80000000 is equivalent to >= 0. */
11962 else if (is_a <scalar_int_mode> (mode, &int_mode)
11963 && GET_MODE_PRECISION (int_mode) - 1 < HOST_BITS_PER_WIDE_INT
11964 && ((unsigned HOST_WIDE_INT) const_op
11965 == HOST_WIDE_INT_1U << (GET_MODE_PRECISION (int_mode) - 1)))
11966 {
11967 const_op = 0;
11968 code = GE;
11969 break;
11970 }
11971 else
11972 break;
11973
11974 case LEU:
11975 /* unsigned <= 0 is equivalent to == 0 */
11976 if (const_op == 0)
11977 code = EQ;
11978 /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */
11979 else if (is_a <scalar_int_mode> (mode, &int_mode)
11980 && GET_MODE_PRECISION (int_mode) - 1 < HOST_BITS_PER_WIDE_INT
11981 && ((unsigned HOST_WIDE_INT) const_op
11982 == ((HOST_WIDE_INT_1U
11983 << (GET_MODE_PRECISION (int_mode) - 1)) - 1)))
11984 {
11985 const_op = 0;
11986 code = GE;
11987 }
11988 break;
11989
11990 case GEU:
11991 /* >= C is equivalent to > (C - 1). */
11992 if (const_op > 1)
11993 {
11994 const_op -= 1;
11995 code = GTU;
11996 /* ... fall through ... */
11997 gcc_fallthrough ();
11998 }
11999
12000 /* (unsigned) >= 0x80000000 is equivalent to < 0. */
12001 else if (is_a <scalar_int_mode> (mode, &int_mode)
12002 && GET_MODE_PRECISION (int_mode) - 1 < HOST_BITS_PER_WIDE_INT
12003 && ((unsigned HOST_WIDE_INT) const_op
12004 == HOST_WIDE_INT_1U << (GET_MODE_PRECISION (int_mode) - 1)))
12005 {
12006 const_op = 0;
12007 code = LT;
12008 break;
12009 }
12010 else
12011 break;
12012
12013 case GTU:
12014 /* unsigned > 0 is equivalent to != 0 */
12015 if (const_op == 0)
12016 code = NE;
12017 /* (unsigned) > 0x7fffffff is equivalent to < 0. */
12018 else if (is_a <scalar_int_mode> (mode, &int_mode)
12019 && GET_MODE_PRECISION (int_mode) - 1 < HOST_BITS_PER_WIDE_INT
12020 && ((unsigned HOST_WIDE_INT) const_op
12021 == (HOST_WIDE_INT_1U
12022 << (GET_MODE_PRECISION (int_mode) - 1)) - 1))
12023 {
12024 const_op = 0;
12025 code = LT;
12026 }
12027 break;
12028
12029 default:
12030 break;
12031 }
12032
12033 *pop1 = GEN_INT (const_op);
12034 return code;
12035 }
12036 \f
12037 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
12038 comparison code that will be tested.
12039
12040 The result is a possibly different comparison code to use. *POP0 and
12041 *POP1 may be updated.
12042
12043 It is possible that we might detect that a comparison is either always
12044 true or always false. However, we do not perform general constant
12045 folding in combine, so this knowledge isn't useful. Such tautologies
12046 should have been detected earlier. Hence we ignore all such cases. */
12047
12048 static enum rtx_code
12049 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
12050 {
12051 rtx op0 = *pop0;
12052 rtx op1 = *pop1;
12053 rtx tem, tem1;
12054 int i;
12055 scalar_int_mode mode, inner_mode, tmode;
12056 opt_scalar_int_mode tmode_iter;
12057
12058 /* Try a few ways of applying the same transformation to both operands. */
12059 while (1)
12060 {
12061 /* The test below this one won't handle SIGN_EXTENDs on these machines,
12062 so check specially. */
12063 if (!WORD_REGISTER_OPERATIONS
12064 && code != GTU && code != GEU && code != LTU && code != LEU
12065 && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
12066 && GET_CODE (XEXP (op0, 0)) == ASHIFT
12067 && GET_CODE (XEXP (op1, 0)) == ASHIFT
12068 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
12069 && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
12070 && is_a <scalar_int_mode> (GET_MODE (op0), &mode)
12071 && (is_a <scalar_int_mode>
12072 (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))), &inner_mode))
12073 && inner_mode == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0)))
12074 && CONST_INT_P (XEXP (op0, 1))
12075 && XEXP (op0, 1) == XEXP (op1, 1)
12076 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
12077 && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
12078 && (INTVAL (XEXP (op0, 1))
12079 == (GET_MODE_PRECISION (mode)
12080 - GET_MODE_PRECISION (inner_mode))))
12081 {
12082 op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
12083 op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
12084 }
12085
12086 /* If both operands are the same constant shift, see if we can ignore the
12087 shift. We can if the shift is a rotate or if the bits shifted out of
12088 this shift are known to be zero for both inputs and if the type of
12089 comparison is compatible with the shift. */
12090 if (GET_CODE (op0) == GET_CODE (op1)
12091 && HWI_COMPUTABLE_MODE_P (GET_MODE (op0))
12092 && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
12093 || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
12094 && (code != GT && code != LT && code != GE && code != LE))
12095 || (GET_CODE (op0) == ASHIFTRT
12096 && (code != GTU && code != LTU
12097 && code != GEU && code != LEU)))
12098 && CONST_INT_P (XEXP (op0, 1))
12099 && INTVAL (XEXP (op0, 1)) >= 0
12100 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
12101 && XEXP (op0, 1) == XEXP (op1, 1))
12102 {
12103 machine_mode mode = GET_MODE (op0);
12104 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
12105 int shift_count = INTVAL (XEXP (op0, 1));
12106
12107 if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
12108 mask &= (mask >> shift_count) << shift_count;
12109 else if (GET_CODE (op0) == ASHIFT)
12110 mask = (mask & (mask << shift_count)) >> shift_count;
12111
12112 if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
12113 && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
12114 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
12115 else
12116 break;
12117 }
12118
12119 /* If both operands are AND's of a paradoxical SUBREG by constant, the
12120 SUBREGs are of the same mode, and, in both cases, the AND would
12121 be redundant if the comparison was done in the narrower mode,
12122 do the comparison in the narrower mode (e.g., we are AND'ing with 1
12123 and the operand's possibly nonzero bits are 0xffffff01; in that case
12124 if we only care about QImode, we don't need the AND). This case
12125 occurs if the output mode of an scc insn is not SImode and
12126 STORE_FLAG_VALUE == 1 (e.g., the 386).
12127
12128 Similarly, check for a case where the AND's are ZERO_EXTEND
12129 operations from some narrower mode even though a SUBREG is not
12130 present. */
12131
12132 else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
12133 && CONST_INT_P (XEXP (op0, 1))
12134 && CONST_INT_P (XEXP (op1, 1)))
12135 {
12136 rtx inner_op0 = XEXP (op0, 0);
12137 rtx inner_op1 = XEXP (op1, 0);
12138 HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
12139 HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
12140 int changed = 0;
12141
12142 if (paradoxical_subreg_p (inner_op0)
12143 && GET_CODE (inner_op1) == SUBREG
12144 && HWI_COMPUTABLE_MODE_P (GET_MODE (SUBREG_REG (inner_op0)))
12145 && (GET_MODE (SUBREG_REG (inner_op0))
12146 == GET_MODE (SUBREG_REG (inner_op1)))
12147 && ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
12148 GET_MODE (SUBREG_REG (inner_op0)))) == 0
12149 && ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
12150 GET_MODE (SUBREG_REG (inner_op1)))) == 0)
12151 {
12152 op0 = SUBREG_REG (inner_op0);
12153 op1 = SUBREG_REG (inner_op1);
12154
12155 /* The resulting comparison is always unsigned since we masked
12156 off the original sign bit. */
12157 code = unsigned_condition (code);
12158
12159 changed = 1;
12160 }
12161
12162 else if (c0 == c1)
12163 FOR_EACH_MODE_UNTIL (tmode,
12164 as_a <scalar_int_mode> (GET_MODE (op0)))
12165 if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
12166 {
12167 op0 = gen_lowpart_or_truncate (tmode, inner_op0);
12168 op1 = gen_lowpart_or_truncate (tmode, inner_op1);
12169 code = unsigned_condition (code);
12170 changed = 1;
12171 break;
12172 }
12173
12174 if (! changed)
12175 break;
12176 }
12177
12178 /* If both operands are NOT, we can strip off the outer operation
12179 and adjust the comparison code for swapped operands; similarly for
12180 NEG, except that this must be an equality comparison. */
12181 else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
12182 || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
12183 && (code == EQ || code == NE)))
12184 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
12185
12186 else
12187 break;
12188 }
12189
12190 /* If the first operand is a constant, swap the operands and adjust the
12191 comparison code appropriately, but don't do this if the second operand
12192 is already a constant integer. */
12193 if (swap_commutative_operands_p (op0, op1))
12194 {
12195 std::swap (op0, op1);
12196 code = swap_condition (code);
12197 }
12198
12199 /* We now enter a loop during which we will try to simplify the comparison.
12200 For the most part, we only are concerned with comparisons with zero,
12201 but some things may really be comparisons with zero but not start
12202 out looking that way. */
12203
12204 while (CONST_INT_P (op1))
12205 {
12206 machine_mode raw_mode = GET_MODE (op0);
12207 scalar_int_mode int_mode;
12208 int equality_comparison_p;
12209 int sign_bit_comparison_p;
12210 int unsigned_comparison_p;
12211 HOST_WIDE_INT const_op;
12212
12213 /* We only want to handle integral modes. This catches VOIDmode,
12214 CCmode, and the floating-point modes. An exception is that we
12215 can handle VOIDmode if OP0 is a COMPARE or a comparison
12216 operation. */
12217
12218 if (GET_MODE_CLASS (raw_mode) != MODE_INT
12219 && ! (raw_mode == VOIDmode
12220 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
12221 break;
12222
12223 /* Try to simplify the compare to constant, possibly changing the
12224 comparison op, and/or changing op1 to zero. */
12225 code = simplify_compare_const (code, raw_mode, op0, &op1);
12226 const_op = INTVAL (op1);
12227
12228 /* Compute some predicates to simplify code below. */
12229
12230 equality_comparison_p = (code == EQ || code == NE);
12231 sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
12232 unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
12233 || code == GEU);
12234
12235 /* If this is a sign bit comparison and we can do arithmetic in
12236 MODE, say that we will only be needing the sign bit of OP0. */
12237 if (sign_bit_comparison_p
12238 && is_a <scalar_int_mode> (raw_mode, &int_mode)
12239 && HWI_COMPUTABLE_MODE_P (int_mode))
12240 op0 = force_to_mode (op0, int_mode,
12241 HOST_WIDE_INT_1U
12242 << (GET_MODE_PRECISION (int_mode) - 1),
12243 0);
12244
12245 if (COMPARISON_P (op0))
12246 {
12247 /* We can't do anything if OP0 is a condition code value, rather
12248 than an actual data value. */
12249 if (const_op != 0
12250 || CC0_P (XEXP (op0, 0))
12251 || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
12252 break;
12253
12254 /* Get the two operands being compared. */
12255 if (GET_CODE (XEXP (op0, 0)) == COMPARE)
12256 tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
12257 else
12258 tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
12259
12260 /* Check for the cases where we simply want the result of the
12261 earlier test or the opposite of that result. */
12262 if (code == NE || code == EQ
12263 || (val_signbit_known_set_p (raw_mode, STORE_FLAG_VALUE)
12264 && (code == LT || code == GE)))
12265 {
12266 enum rtx_code new_code;
12267 if (code == LT || code == NE)
12268 new_code = GET_CODE (op0);
12269 else
12270 new_code = reversed_comparison_code (op0, NULL);
12271
12272 if (new_code != UNKNOWN)
12273 {
12274 code = new_code;
12275 op0 = tem;
12276 op1 = tem1;
12277 continue;
12278 }
12279 }
12280 break;
12281 }
12282
12283 if (raw_mode == VOIDmode)
12284 break;
12285 scalar_int_mode mode = as_a <scalar_int_mode> (raw_mode);
12286
12287 /* Now try cases based on the opcode of OP0. If none of the cases
12288 does a "continue", we exit this loop immediately after the
12289 switch. */
12290
12291 unsigned int mode_width = GET_MODE_PRECISION (mode);
12292 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
12293 switch (GET_CODE (op0))
12294 {
12295 case ZERO_EXTRACT:
12296 /* If we are extracting a single bit from a variable position in
12297 a constant that has only a single bit set and are comparing it
12298 with zero, we can convert this into an equality comparison
12299 between the position and the location of the single bit. */
12300 /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
12301 have already reduced the shift count modulo the word size. */
12302 if (!SHIFT_COUNT_TRUNCATED
12303 && CONST_INT_P (XEXP (op0, 0))
12304 && XEXP (op0, 1) == const1_rtx
12305 && equality_comparison_p && const_op == 0
12306 && (i = exact_log2 (UINTVAL (XEXP (op0, 0)))) >= 0)
12307 {
12308 if (BITS_BIG_ENDIAN)
12309 i = BITS_PER_WORD - 1 - i;
12310
12311 op0 = XEXP (op0, 2);
12312 op1 = GEN_INT (i);
12313 const_op = i;
12314
12315 /* Result is nonzero iff shift count is equal to I. */
12316 code = reverse_condition (code);
12317 continue;
12318 }
12319
12320 /* fall through */
12321
12322 case SIGN_EXTRACT:
12323 tem = expand_compound_operation (op0);
12324 if (tem != op0)
12325 {
12326 op0 = tem;
12327 continue;
12328 }
12329 break;
12330
12331 case NOT:
12332 /* If testing for equality, we can take the NOT of the constant. */
12333 if (equality_comparison_p
12334 && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
12335 {
12336 op0 = XEXP (op0, 0);
12337 op1 = tem;
12338 continue;
12339 }
12340
12341 /* If just looking at the sign bit, reverse the sense of the
12342 comparison. */
12343 if (sign_bit_comparison_p)
12344 {
12345 op0 = XEXP (op0, 0);
12346 code = (code == GE ? LT : GE);
12347 continue;
12348 }
12349 break;
12350
12351 case NEG:
12352 /* If testing for equality, we can take the NEG of the constant. */
12353 if (equality_comparison_p
12354 && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
12355 {
12356 op0 = XEXP (op0, 0);
12357 op1 = tem;
12358 continue;
12359 }
12360
12361 /* The remaining cases only apply to comparisons with zero. */
12362 if (const_op != 0)
12363 break;
12364
12365 /* When X is ABS or is known positive,
12366 (neg X) is < 0 if and only if X != 0. */
12367
12368 if (sign_bit_comparison_p
12369 && (GET_CODE (XEXP (op0, 0)) == ABS
12370 || (mode_width <= HOST_BITS_PER_WIDE_INT
12371 && (nonzero_bits (XEXP (op0, 0), mode)
12372 & (HOST_WIDE_INT_1U << (mode_width - 1)))
12373 == 0)))
12374 {
12375 op0 = XEXP (op0, 0);
12376 code = (code == LT ? NE : EQ);
12377 continue;
12378 }
12379
12380 /* If we have NEG of something whose two high-order bits are the
12381 same, we know that "(-a) < 0" is equivalent to "a > 0". */
12382 if (num_sign_bit_copies (op0, mode) >= 2)
12383 {
12384 op0 = XEXP (op0, 0);
12385 code = swap_condition (code);
12386 continue;
12387 }
12388 break;
12389
12390 case ROTATE:
12391 /* If we are testing equality and our count is a constant, we
12392 can perform the inverse operation on our RHS. */
12393 if (equality_comparison_p && CONST_INT_P (XEXP (op0, 1))
12394 && (tem = simplify_binary_operation (ROTATERT, mode,
12395 op1, XEXP (op0, 1))) != 0)
12396 {
12397 op0 = XEXP (op0, 0);
12398 op1 = tem;
12399 continue;
12400 }
12401
12402 /* If we are doing a < 0 or >= 0 comparison, it means we are testing
12403 a particular bit. Convert it to an AND of a constant of that
12404 bit. This will be converted into a ZERO_EXTRACT. */
12405 if (const_op == 0 && sign_bit_comparison_p
12406 && CONST_INT_P (XEXP (op0, 1))
12407 && mode_width <= HOST_BITS_PER_WIDE_INT)
12408 {
12409 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
12410 (HOST_WIDE_INT_1U
12411 << (mode_width - 1
12412 - INTVAL (XEXP (op0, 1)))));
12413 code = (code == LT ? NE : EQ);
12414 continue;
12415 }
12416
12417 /* Fall through. */
12418
12419 case ABS:
12420 /* ABS is ignorable inside an equality comparison with zero. */
12421 if (const_op == 0 && equality_comparison_p)
12422 {
12423 op0 = XEXP (op0, 0);
12424 continue;
12425 }
12426 break;
12427
12428 case SIGN_EXTEND:
12429 /* Can simplify (compare (zero/sign_extend FOO) CONST) to
12430 (compare FOO CONST) if CONST fits in FOO's mode and we
12431 are either testing inequality or have an unsigned
12432 comparison with ZERO_EXTEND or a signed comparison with
12433 SIGN_EXTEND. But don't do it if we don't have a compare
12434 insn of the given mode, since we'd have to revert it
12435 later on, and then we wouldn't know whether to sign- or
12436 zero-extend. */
12437 if (is_int_mode (GET_MODE (XEXP (op0, 0)), &mode)
12438 && ! unsigned_comparison_p
12439 && HWI_COMPUTABLE_MODE_P (mode)
12440 && trunc_int_for_mode (const_op, mode) == const_op
12441 && have_insn_for (COMPARE, mode))
12442 {
12443 op0 = XEXP (op0, 0);
12444 continue;
12445 }
12446 break;
12447
12448 case SUBREG:
12449 /* Check for the case where we are comparing A - C1 with C2, that is
12450
12451 (subreg:MODE (plus (A) (-C1))) op (C2)
12452
12453 with C1 a constant, and try to lift the SUBREG, i.e. to do the
12454 comparison in the wider mode. One of the following two conditions
12455 must be true in order for this to be valid:
12456
12457 1. The mode extension results in the same bit pattern being added
12458 on both sides and the comparison is equality or unsigned. As
12459 C2 has been truncated to fit in MODE, the pattern can only be
12460 all 0s or all 1s.
12461
12462 2. The mode extension results in the sign bit being copied on
12463 each side.
12464
12465 The difficulty here is that we have predicates for A but not for
12466 (A - C1) so we need to check that C1 is within proper bounds so
12467 as to perturbate A as little as possible. */
12468
12469 if (mode_width <= HOST_BITS_PER_WIDE_INT
12470 && subreg_lowpart_p (op0)
12471 && is_a <scalar_int_mode> (GET_MODE (SUBREG_REG (op0)),
12472 &inner_mode)
12473 && GET_MODE_PRECISION (inner_mode) > mode_width
12474 && GET_CODE (SUBREG_REG (op0)) == PLUS
12475 && CONST_INT_P (XEXP (SUBREG_REG (op0), 1)))
12476 {
12477 rtx a = XEXP (SUBREG_REG (op0), 0);
12478 HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
12479
12480 if ((c1 > 0
12481 && (unsigned HOST_WIDE_INT) c1
12482 < HOST_WIDE_INT_1U << (mode_width - 1)
12483 && (equality_comparison_p || unsigned_comparison_p)
12484 /* (A - C1) zero-extends if it is positive and sign-extends
12485 if it is negative, C2 both zero- and sign-extends. */
12486 && (((nonzero_bits (a, inner_mode)
12487 & ~GET_MODE_MASK (mode)) == 0
12488 && const_op >= 0)
12489 /* (A - C1) sign-extends if it is positive and 1-extends
12490 if it is negative, C2 both sign- and 1-extends. */
12491 || (num_sign_bit_copies (a, inner_mode)
12492 > (unsigned int) (GET_MODE_PRECISION (inner_mode)
12493 - mode_width)
12494 && const_op < 0)))
12495 || ((unsigned HOST_WIDE_INT) c1
12496 < HOST_WIDE_INT_1U << (mode_width - 2)
12497 /* (A - C1) always sign-extends, like C2. */
12498 && num_sign_bit_copies (a, inner_mode)
12499 > (unsigned int) (GET_MODE_PRECISION (inner_mode)
12500 - (mode_width - 1))))
12501 {
12502 op0 = SUBREG_REG (op0);
12503 continue;
12504 }
12505 }
12506
12507 /* If the inner mode is narrower and we are extracting the low part,
12508 we can treat the SUBREG as if it were a ZERO_EXTEND. */
12509 if (paradoxical_subreg_p (op0))
12510 ;
12511 else if (subreg_lowpart_p (op0)
12512 && GET_MODE_CLASS (mode) == MODE_INT
12513 && is_int_mode (GET_MODE (SUBREG_REG (op0)), &inner_mode)
12514 && (code == NE || code == EQ)
12515 && GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT
12516 && !paradoxical_subreg_p (op0)
12517 && (nonzero_bits (SUBREG_REG (op0), inner_mode)
12518 & ~GET_MODE_MASK (mode)) == 0)
12519 {
12520 /* Remove outer subregs that don't do anything. */
12521 tem = gen_lowpart (inner_mode, op1);
12522
12523 if ((nonzero_bits (tem, inner_mode)
12524 & ~GET_MODE_MASK (mode)) == 0)
12525 {
12526 op0 = SUBREG_REG (op0);
12527 op1 = tem;
12528 continue;
12529 }
12530 break;
12531 }
12532 else
12533 break;
12534
12535 /* FALLTHROUGH */
12536
12537 case ZERO_EXTEND:
12538 if (is_int_mode (GET_MODE (XEXP (op0, 0)), &mode)
12539 && (unsigned_comparison_p || equality_comparison_p)
12540 && HWI_COMPUTABLE_MODE_P (mode)
12541 && (unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (mode)
12542 && const_op >= 0
12543 && have_insn_for (COMPARE, mode))
12544 {
12545 op0 = XEXP (op0, 0);
12546 continue;
12547 }
12548 break;
12549
12550 case PLUS:
12551 /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do
12552 this for equality comparisons due to pathological cases involving
12553 overflows. */
12554 if (equality_comparison_p
12555 && (tem = simplify_binary_operation (MINUS, mode,
12556 op1, XEXP (op0, 1))) != 0)
12557 {
12558 op0 = XEXP (op0, 0);
12559 op1 = tem;
12560 continue;
12561 }
12562
12563 /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0. */
12564 if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
12565 && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
12566 {
12567 op0 = XEXP (XEXP (op0, 0), 0);
12568 code = (code == LT ? EQ : NE);
12569 continue;
12570 }
12571 break;
12572
12573 case MINUS:
12574 /* We used to optimize signed comparisons against zero, but that
12575 was incorrect. Unsigned comparisons against zero (GTU, LEU)
12576 arrive here as equality comparisons, or (GEU, LTU) are
12577 optimized away. No need to special-case them. */
12578
12579 /* (eq (minus A B) C) -> (eq A (plus B C)) or
12580 (eq B (minus A C)), whichever simplifies. We can only do
12581 this for equality comparisons due to pathological cases involving
12582 overflows. */
12583 if (equality_comparison_p
12584 && (tem = simplify_binary_operation (PLUS, mode,
12585 XEXP (op0, 1), op1)) != 0)
12586 {
12587 op0 = XEXP (op0, 0);
12588 op1 = tem;
12589 continue;
12590 }
12591
12592 if (equality_comparison_p
12593 && (tem = simplify_binary_operation (MINUS, mode,
12594 XEXP (op0, 0), op1)) != 0)
12595 {
12596 op0 = XEXP (op0, 1);
12597 op1 = tem;
12598 continue;
12599 }
12600
12601 /* The sign bit of (minus (ashiftrt X C) X), where C is the number
12602 of bits in X minus 1, is one iff X > 0. */
12603 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
12604 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
12605 && UINTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
12606 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
12607 {
12608 op0 = XEXP (op0, 1);
12609 code = (code == GE ? LE : GT);
12610 continue;
12611 }
12612 break;
12613
12614 case XOR:
12615 /* (eq (xor A B) C) -> (eq A (xor B C)). This is a simplification
12616 if C is zero or B is a constant. */
12617 if (equality_comparison_p
12618 && (tem = simplify_binary_operation (XOR, mode,
12619 XEXP (op0, 1), op1)) != 0)
12620 {
12621 op0 = XEXP (op0, 0);
12622 op1 = tem;
12623 continue;
12624 }
12625 break;
12626
12627
12628 case IOR:
12629 /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
12630 iff X <= 0. */
12631 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
12632 && XEXP (XEXP (op0, 0), 1) == constm1_rtx
12633 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
12634 {
12635 op0 = XEXP (op0, 1);
12636 code = (code == GE ? GT : LE);
12637 continue;
12638 }
12639 break;
12640
12641 case AND:
12642 /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1). This
12643 will be converted to a ZERO_EXTRACT later. */
12644 if (const_op == 0 && equality_comparison_p
12645 && GET_CODE (XEXP (op0, 0)) == ASHIFT
12646 && XEXP (XEXP (op0, 0), 0) == const1_rtx)
12647 {
12648 op0 = gen_rtx_LSHIFTRT (mode, XEXP (op0, 1),
12649 XEXP (XEXP (op0, 0), 1));
12650 op0 = simplify_and_const_int (NULL_RTX, mode, op0, 1);
12651 continue;
12652 }
12653
12654 /* If we are comparing (and (lshiftrt X C1) C2) for equality with
12655 zero and X is a comparison and C1 and C2 describe only bits set
12656 in STORE_FLAG_VALUE, we can compare with X. */
12657 if (const_op == 0 && equality_comparison_p
12658 && mode_width <= HOST_BITS_PER_WIDE_INT
12659 && CONST_INT_P (XEXP (op0, 1))
12660 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
12661 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
12662 && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
12663 && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
12664 {
12665 mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
12666 << INTVAL (XEXP (XEXP (op0, 0), 1)));
12667 if ((~STORE_FLAG_VALUE & mask) == 0
12668 && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
12669 || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
12670 && COMPARISON_P (tem))))
12671 {
12672 op0 = XEXP (XEXP (op0, 0), 0);
12673 continue;
12674 }
12675 }
12676
12677 /* If we are doing an equality comparison of an AND of a bit equal
12678 to the sign bit, replace this with a LT or GE comparison of
12679 the underlying value. */
12680 if (equality_comparison_p
12681 && const_op == 0
12682 && CONST_INT_P (XEXP (op0, 1))
12683 && mode_width <= HOST_BITS_PER_WIDE_INT
12684 && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
12685 == HOST_WIDE_INT_1U << (mode_width - 1)))
12686 {
12687 op0 = XEXP (op0, 0);
12688 code = (code == EQ ? GE : LT);
12689 continue;
12690 }
12691
12692 /* If this AND operation is really a ZERO_EXTEND from a narrower
12693 mode, the constant fits within that mode, and this is either an
12694 equality or unsigned comparison, try to do this comparison in
12695 the narrower mode.
12696
12697 Note that in:
12698
12699 (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
12700 -> (ne:DI (reg:SI 4) (const_int 0))
12701
12702 unless TARGET_TRULY_NOOP_TRUNCATION allows it or the register is
12703 known to hold a value of the required mode the
12704 transformation is invalid. */
12705 if ((equality_comparison_p || unsigned_comparison_p)
12706 && CONST_INT_P (XEXP (op0, 1))
12707 && (i = exact_log2 ((UINTVAL (XEXP (op0, 1))
12708 & GET_MODE_MASK (mode))
12709 + 1)) >= 0
12710 && const_op >> i == 0
12711 && int_mode_for_size (i, 1).exists (&tmode))
12712 {
12713 op0 = gen_lowpart_or_truncate (tmode, XEXP (op0, 0));
12714 continue;
12715 }
12716
12717 /* If this is (and:M1 (subreg:M1 X:M2 0) (const_int C1)) where C1
12718 fits in both M1 and M2 and the SUBREG is either paradoxical
12719 or represents the low part, permute the SUBREG and the AND
12720 and try again. */
12721 if (GET_CODE (XEXP (op0, 0)) == SUBREG
12722 && CONST_INT_P (XEXP (op0, 1)))
12723 {
12724 unsigned HOST_WIDE_INT c1 = INTVAL (XEXP (op0, 1));
12725 /* Require an integral mode, to avoid creating something like
12726 (AND:SF ...). */
12727 if ((is_a <scalar_int_mode>
12728 (GET_MODE (SUBREG_REG (XEXP (op0, 0))), &tmode))
12729 /* It is unsafe to commute the AND into the SUBREG if the
12730 SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
12731 not defined. As originally written the upper bits
12732 have a defined value due to the AND operation.
12733 However, if we commute the AND inside the SUBREG then
12734 they no longer have defined values and the meaning of
12735 the code has been changed.
12736 Also C1 should not change value in the smaller mode,
12737 see PR67028 (a positive C1 can become negative in the
12738 smaller mode, so that the AND does no longer mask the
12739 upper bits). */
12740 && ((WORD_REGISTER_OPERATIONS
12741 && mode_width > GET_MODE_PRECISION (tmode)
12742 && mode_width <= BITS_PER_WORD
12743 && trunc_int_for_mode (c1, tmode) == (HOST_WIDE_INT) c1)
12744 || (mode_width <= GET_MODE_PRECISION (tmode)
12745 && subreg_lowpart_p (XEXP (op0, 0))))
12746 && mode_width <= HOST_BITS_PER_WIDE_INT
12747 && HWI_COMPUTABLE_MODE_P (tmode)
12748 && (c1 & ~mask) == 0
12749 && (c1 & ~GET_MODE_MASK (tmode)) == 0
12750 && c1 != mask
12751 && c1 != GET_MODE_MASK (tmode))
12752 {
12753 op0 = simplify_gen_binary (AND, tmode,
12754 SUBREG_REG (XEXP (op0, 0)),
12755 gen_int_mode (c1, tmode));
12756 op0 = gen_lowpart (mode, op0);
12757 continue;
12758 }
12759 }
12760
12761 /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0). */
12762 if (const_op == 0 && equality_comparison_p
12763 && XEXP (op0, 1) == const1_rtx
12764 && GET_CODE (XEXP (op0, 0)) == NOT)
12765 {
12766 op0 = simplify_and_const_int (NULL_RTX, mode,
12767 XEXP (XEXP (op0, 0), 0), 1);
12768 code = (code == NE ? EQ : NE);
12769 continue;
12770 }
12771
12772 /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
12773 (eq (and (lshiftrt X) 1) 0).
12774 Also handle the case where (not X) is expressed using xor. */
12775 if (const_op == 0 && equality_comparison_p
12776 && XEXP (op0, 1) == const1_rtx
12777 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
12778 {
12779 rtx shift_op = XEXP (XEXP (op0, 0), 0);
12780 rtx shift_count = XEXP (XEXP (op0, 0), 1);
12781
12782 if (GET_CODE (shift_op) == NOT
12783 || (GET_CODE (shift_op) == XOR
12784 && CONST_INT_P (XEXP (shift_op, 1))
12785 && CONST_INT_P (shift_count)
12786 && HWI_COMPUTABLE_MODE_P (mode)
12787 && (UINTVAL (XEXP (shift_op, 1))
12788 == HOST_WIDE_INT_1U
12789 << INTVAL (shift_count))))
12790 {
12791 op0
12792 = gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count);
12793 op0 = simplify_and_const_int (NULL_RTX, mode, op0, 1);
12794 code = (code == NE ? EQ : NE);
12795 continue;
12796 }
12797 }
12798 break;
12799
12800 case ASHIFT:
12801 /* If we have (compare (ashift FOO N) (const_int C)) and
12802 the high order N bits of FOO (N+1 if an inequality comparison)
12803 are known to be zero, we can do this by comparing FOO with C
12804 shifted right N bits so long as the low-order N bits of C are
12805 zero. */
12806 if (CONST_INT_P (XEXP (op0, 1))
12807 && INTVAL (XEXP (op0, 1)) >= 0
12808 && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
12809 < HOST_BITS_PER_WIDE_INT)
12810 && (((unsigned HOST_WIDE_INT) const_op
12811 & ((HOST_WIDE_INT_1U << INTVAL (XEXP (op0, 1)))
12812 - 1)) == 0)
12813 && mode_width <= HOST_BITS_PER_WIDE_INT
12814 && (nonzero_bits (XEXP (op0, 0), mode)
12815 & ~(mask >> (INTVAL (XEXP (op0, 1))
12816 + ! equality_comparison_p))) == 0)
12817 {
12818 /* We must perform a logical shift, not an arithmetic one,
12819 as we want the top N bits of C to be zero. */
12820 unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
12821
12822 temp >>= INTVAL (XEXP (op0, 1));
12823 op1 = gen_int_mode (temp, mode);
12824 op0 = XEXP (op0, 0);
12825 continue;
12826 }
12827
12828 /* If we are doing a sign bit comparison, it means we are testing
12829 a particular bit. Convert it to the appropriate AND. */
12830 if (sign_bit_comparison_p && CONST_INT_P (XEXP (op0, 1))
12831 && mode_width <= HOST_BITS_PER_WIDE_INT)
12832 {
12833 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
12834 (HOST_WIDE_INT_1U
12835 << (mode_width - 1
12836 - INTVAL (XEXP (op0, 1)))));
12837 code = (code == LT ? NE : EQ);
12838 continue;
12839 }
12840
12841 /* If this an equality comparison with zero and we are shifting
12842 the low bit to the sign bit, we can convert this to an AND of the
12843 low-order bit. */
12844 if (const_op == 0 && equality_comparison_p
12845 && CONST_INT_P (XEXP (op0, 1))
12846 && UINTVAL (XEXP (op0, 1)) == mode_width - 1)
12847 {
12848 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), 1);
12849 continue;
12850 }
12851 break;
12852
12853 case ASHIFTRT:
12854 /* If this is an equality comparison with zero, we can do this
12855 as a logical shift, which might be much simpler. */
12856 if (equality_comparison_p && const_op == 0
12857 && CONST_INT_P (XEXP (op0, 1)))
12858 {
12859 op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
12860 XEXP (op0, 0),
12861 INTVAL (XEXP (op0, 1)));
12862 continue;
12863 }
12864
12865 /* If OP0 is a sign extension and CODE is not an unsigned comparison,
12866 do the comparison in a narrower mode. */
12867 if (! unsigned_comparison_p
12868 && CONST_INT_P (XEXP (op0, 1))
12869 && GET_CODE (XEXP (op0, 0)) == ASHIFT
12870 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
12871 && (int_mode_for_size (mode_width - INTVAL (XEXP (op0, 1)), 1)
12872 .exists (&tmode))
12873 && (((unsigned HOST_WIDE_INT) const_op
12874 + (GET_MODE_MASK (tmode) >> 1) + 1)
12875 <= GET_MODE_MASK (tmode)))
12876 {
12877 op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
12878 continue;
12879 }
12880
12881 /* Likewise if OP0 is a PLUS of a sign extension with a
12882 constant, which is usually represented with the PLUS
12883 between the shifts. */
12884 if (! unsigned_comparison_p
12885 && CONST_INT_P (XEXP (op0, 1))
12886 && GET_CODE (XEXP (op0, 0)) == PLUS
12887 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
12888 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
12889 && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
12890 && (int_mode_for_size (mode_width - INTVAL (XEXP (op0, 1)), 1)
12891 .exists (&tmode))
12892 && (((unsigned HOST_WIDE_INT) const_op
12893 + (GET_MODE_MASK (tmode) >> 1) + 1)
12894 <= GET_MODE_MASK (tmode)))
12895 {
12896 rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
12897 rtx add_const = XEXP (XEXP (op0, 0), 1);
12898 rtx new_const = simplify_gen_binary (ASHIFTRT, mode,
12899 add_const, XEXP (op0, 1));
12900
12901 op0 = simplify_gen_binary (PLUS, tmode,
12902 gen_lowpart (tmode, inner),
12903 new_const);
12904 continue;
12905 }
12906
12907 /* FALLTHROUGH */
12908 case LSHIFTRT:
12909 /* If we have (compare (xshiftrt FOO N) (const_int C)) and
12910 the low order N bits of FOO are known to be zero, we can do this
12911 by comparing FOO with C shifted left N bits so long as no
12912 overflow occurs. Even if the low order N bits of FOO aren't known
12913 to be zero, if the comparison is >= or < we can use the same
12914 optimization and for > or <= by setting all the low
12915 order N bits in the comparison constant. */
12916 if (CONST_INT_P (XEXP (op0, 1))
12917 && INTVAL (XEXP (op0, 1)) > 0
12918 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
12919 && mode_width <= HOST_BITS_PER_WIDE_INT
12920 && (((unsigned HOST_WIDE_INT) const_op
12921 + (GET_CODE (op0) != LSHIFTRT
12922 ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
12923 + 1)
12924 : 0))
12925 <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
12926 {
12927 unsigned HOST_WIDE_INT low_bits
12928 = (nonzero_bits (XEXP (op0, 0), mode)
12929 & ((HOST_WIDE_INT_1U
12930 << INTVAL (XEXP (op0, 1))) - 1));
12931 if (low_bits == 0 || !equality_comparison_p)
12932 {
12933 /* If the shift was logical, then we must make the condition
12934 unsigned. */
12935 if (GET_CODE (op0) == LSHIFTRT)
12936 code = unsigned_condition (code);
12937
12938 const_op = (unsigned HOST_WIDE_INT) const_op
12939 << INTVAL (XEXP (op0, 1));
12940 if (low_bits != 0
12941 && (code == GT || code == GTU
12942 || code == LE || code == LEU))
12943 const_op
12944 |= ((HOST_WIDE_INT_1 << INTVAL (XEXP (op0, 1))) - 1);
12945 op1 = GEN_INT (const_op);
12946 op0 = XEXP (op0, 0);
12947 continue;
12948 }
12949 }
12950
12951 /* If we are using this shift to extract just the sign bit, we
12952 can replace this with an LT or GE comparison. */
12953 if (const_op == 0
12954 && (equality_comparison_p || sign_bit_comparison_p)
12955 && CONST_INT_P (XEXP (op0, 1))
12956 && UINTVAL (XEXP (op0, 1)) == mode_width - 1)
12957 {
12958 op0 = XEXP (op0, 0);
12959 code = (code == NE || code == GT ? LT : GE);
12960 continue;
12961 }
12962 break;
12963
12964 default:
12965 break;
12966 }
12967
12968 break;
12969 }
12970
12971 /* Now make any compound operations involved in this comparison. Then,
12972 check for an outmost SUBREG on OP0 that is not doing anything or is
12973 paradoxical. The latter transformation must only be performed when
12974 it is known that the "extra" bits will be the same in op0 and op1 or
12975 that they don't matter. There are three cases to consider:
12976
12977 1. SUBREG_REG (op0) is a register. In this case the bits are don't
12978 care bits and we can assume they have any convenient value. So
12979 making the transformation is safe.
12980
12981 2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is UNKNOWN.
12982 In this case the upper bits of op0 are undefined. We should not make
12983 the simplification in that case as we do not know the contents of
12984 those bits.
12985
12986 3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not UNKNOWN.
12987 In that case we know those bits are zeros or ones. We must also be
12988 sure that they are the same as the upper bits of op1.
12989
12990 We can never remove a SUBREG for a non-equality comparison because
12991 the sign bit is in a different place in the underlying object. */
12992
12993 rtx_code op0_mco_code = SET;
12994 if (op1 == const0_rtx)
12995 op0_mco_code = code == NE || code == EQ ? EQ : COMPARE;
12996
12997 op0 = make_compound_operation (op0, op0_mco_code);
12998 op1 = make_compound_operation (op1, SET);
12999
13000 if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
13001 && is_int_mode (GET_MODE (op0), &mode)
13002 && is_int_mode (GET_MODE (SUBREG_REG (op0)), &inner_mode)
13003 && (code == NE || code == EQ))
13004 {
13005 if (paradoxical_subreg_p (op0))
13006 {
13007 /* For paradoxical subregs, allow case 1 as above. Case 3 isn't
13008 implemented. */
13009 if (REG_P (SUBREG_REG (op0)))
13010 {
13011 op0 = SUBREG_REG (op0);
13012 op1 = gen_lowpart (inner_mode, op1);
13013 }
13014 }
13015 else if (GET_MODE_PRECISION (inner_mode) <= HOST_BITS_PER_WIDE_INT
13016 && (nonzero_bits (SUBREG_REG (op0), inner_mode)
13017 & ~GET_MODE_MASK (mode)) == 0)
13018 {
13019 tem = gen_lowpart (inner_mode, op1);
13020
13021 if ((nonzero_bits (tem, inner_mode) & ~GET_MODE_MASK (mode)) == 0)
13022 op0 = SUBREG_REG (op0), op1 = tem;
13023 }
13024 }
13025
13026 /* We now do the opposite procedure: Some machines don't have compare
13027 insns in all modes. If OP0's mode is an integer mode smaller than a
13028 word and we can't do a compare in that mode, see if there is a larger
13029 mode for which we can do the compare. There are a number of cases in
13030 which we can use the wider mode. */
13031
13032 if (is_int_mode (GET_MODE (op0), &mode)
13033 && GET_MODE_SIZE (mode) < UNITS_PER_WORD
13034 && ! have_insn_for (COMPARE, mode))
13035 FOR_EACH_WIDER_MODE (tmode_iter, mode)
13036 {
13037 tmode = tmode_iter.require ();
13038 if (!HWI_COMPUTABLE_MODE_P (tmode))
13039 break;
13040 if (have_insn_for (COMPARE, tmode))
13041 {
13042 int zero_extended;
13043
13044 /* If this is a test for negative, we can make an explicit
13045 test of the sign bit. Test this first so we can use
13046 a paradoxical subreg to extend OP0. */
13047
13048 if (op1 == const0_rtx && (code == LT || code == GE)
13049 && HWI_COMPUTABLE_MODE_P (mode))
13050 {
13051 unsigned HOST_WIDE_INT sign
13052 = HOST_WIDE_INT_1U << (GET_MODE_BITSIZE (mode) - 1);
13053 op0 = simplify_gen_binary (AND, tmode,
13054 gen_lowpart (tmode, op0),
13055 gen_int_mode (sign, tmode));
13056 code = (code == LT) ? NE : EQ;
13057 break;
13058 }
13059
13060 /* If the only nonzero bits in OP0 and OP1 are those in the
13061 narrower mode and this is an equality or unsigned comparison,
13062 we can use the wider mode. Similarly for sign-extended
13063 values, in which case it is true for all comparisons. */
13064 zero_extended = ((code == EQ || code == NE
13065 || code == GEU || code == GTU
13066 || code == LEU || code == LTU)
13067 && (nonzero_bits (op0, tmode)
13068 & ~GET_MODE_MASK (mode)) == 0
13069 && ((CONST_INT_P (op1)
13070 || (nonzero_bits (op1, tmode)
13071 & ~GET_MODE_MASK (mode)) == 0)));
13072
13073 if (zero_extended
13074 || ((num_sign_bit_copies (op0, tmode)
13075 > (unsigned int) (GET_MODE_PRECISION (tmode)
13076 - GET_MODE_PRECISION (mode)))
13077 && (num_sign_bit_copies (op1, tmode)
13078 > (unsigned int) (GET_MODE_PRECISION (tmode)
13079 - GET_MODE_PRECISION (mode)))))
13080 {
13081 /* If OP0 is an AND and we don't have an AND in MODE either,
13082 make a new AND in the proper mode. */
13083 if (GET_CODE (op0) == AND
13084 && !have_insn_for (AND, mode))
13085 op0 = simplify_gen_binary (AND, tmode,
13086 gen_lowpart (tmode,
13087 XEXP (op0, 0)),
13088 gen_lowpart (tmode,
13089 XEXP (op0, 1)));
13090 else
13091 {
13092 if (zero_extended)
13093 {
13094 op0 = simplify_gen_unary (ZERO_EXTEND, tmode,
13095 op0, mode);
13096 op1 = simplify_gen_unary (ZERO_EXTEND, tmode,
13097 op1, mode);
13098 }
13099 else
13100 {
13101 op0 = simplify_gen_unary (SIGN_EXTEND, tmode,
13102 op0, mode);
13103 op1 = simplify_gen_unary (SIGN_EXTEND, tmode,
13104 op1, mode);
13105 }
13106 break;
13107 }
13108 }
13109 }
13110 }
13111
13112 /* We may have changed the comparison operands. Re-canonicalize. */
13113 if (swap_commutative_operands_p (op0, op1))
13114 {
13115 std::swap (op0, op1);
13116 code = swap_condition (code);
13117 }
13118
13119 /* If this machine only supports a subset of valid comparisons, see if we
13120 can convert an unsupported one into a supported one. */
13121 target_canonicalize_comparison (&code, &op0, &op1, 0);
13122
13123 *pop0 = op0;
13124 *pop1 = op1;
13125
13126 return code;
13127 }
13128 \f
13129 /* Utility function for record_value_for_reg. Count number of
13130 rtxs in X. */
13131 static int
13132 count_rtxs (rtx x)
13133 {
13134 enum rtx_code code = GET_CODE (x);
13135 const char *fmt;
13136 int i, j, ret = 1;
13137
13138 if (GET_RTX_CLASS (code) == RTX_BIN_ARITH
13139 || GET_RTX_CLASS (code) == RTX_COMM_ARITH)
13140 {
13141 rtx x0 = XEXP (x, 0);
13142 rtx x1 = XEXP (x, 1);
13143
13144 if (x0 == x1)
13145 return 1 + 2 * count_rtxs (x0);
13146
13147 if ((GET_RTX_CLASS (GET_CODE (x1)) == RTX_BIN_ARITH
13148 || GET_RTX_CLASS (GET_CODE (x1)) == RTX_COMM_ARITH)
13149 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
13150 return 2 + 2 * count_rtxs (x0)
13151 + count_rtxs (x == XEXP (x1, 0)
13152 ? XEXP (x1, 1) : XEXP (x1, 0));
13153
13154 if ((GET_RTX_CLASS (GET_CODE (x0)) == RTX_BIN_ARITH
13155 || GET_RTX_CLASS (GET_CODE (x0)) == RTX_COMM_ARITH)
13156 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
13157 return 2 + 2 * count_rtxs (x1)
13158 + count_rtxs (x == XEXP (x0, 0)
13159 ? XEXP (x0, 1) : XEXP (x0, 0));
13160 }
13161
13162 fmt = GET_RTX_FORMAT (code);
13163 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
13164 if (fmt[i] == 'e')
13165 ret += count_rtxs (XEXP (x, i));
13166 else if (fmt[i] == 'E')
13167 for (j = 0; j < XVECLEN (x, i); j++)
13168 ret += count_rtxs (XVECEXP (x, i, j));
13169
13170 return ret;
13171 }
13172 \f
13173 /* Utility function for following routine. Called when X is part of a value
13174 being stored into last_set_value. Sets last_set_table_tick
13175 for each register mentioned. Similar to mention_regs in cse.c */
13176
13177 static void
13178 update_table_tick (rtx x)
13179 {
13180 enum rtx_code code = GET_CODE (x);
13181 const char *fmt = GET_RTX_FORMAT (code);
13182 int i, j;
13183
13184 if (code == REG)
13185 {
13186 unsigned int regno = REGNO (x);
13187 unsigned int endregno = END_REGNO (x);
13188 unsigned int r;
13189
13190 for (r = regno; r < endregno; r++)
13191 {
13192 reg_stat_type *rsp = &reg_stat[r];
13193 rsp->last_set_table_tick = label_tick;
13194 }
13195
13196 return;
13197 }
13198
13199 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
13200 if (fmt[i] == 'e')
13201 {
13202 /* Check for identical subexpressions. If x contains
13203 identical subexpression we only have to traverse one of
13204 them. */
13205 if (i == 0 && ARITHMETIC_P (x))
13206 {
13207 /* Note that at this point x1 has already been
13208 processed. */
13209 rtx x0 = XEXP (x, 0);
13210 rtx x1 = XEXP (x, 1);
13211
13212 /* If x0 and x1 are identical then there is no need to
13213 process x0. */
13214 if (x0 == x1)
13215 break;
13216
13217 /* If x0 is identical to a subexpression of x1 then while
13218 processing x1, x0 has already been processed. Thus we
13219 are done with x. */
13220 if (ARITHMETIC_P (x1)
13221 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
13222 break;
13223
13224 /* If x1 is identical to a subexpression of x0 then we
13225 still have to process the rest of x0. */
13226 if (ARITHMETIC_P (x0)
13227 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
13228 {
13229 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
13230 break;
13231 }
13232 }
13233
13234 update_table_tick (XEXP (x, i));
13235 }
13236 else if (fmt[i] == 'E')
13237 for (j = 0; j < XVECLEN (x, i); j++)
13238 update_table_tick (XVECEXP (x, i, j));
13239 }
13240
13241 /* Record that REG is set to VALUE in insn INSN. If VALUE is zero, we
13242 are saying that the register is clobbered and we no longer know its
13243 value. If INSN is zero, don't update reg_stat[].last_set; this is
13244 only permitted with VALUE also zero and is used to invalidate the
13245 register. */
13246
13247 static void
13248 record_value_for_reg (rtx reg, rtx_insn *insn, rtx value)
13249 {
13250 unsigned int regno = REGNO (reg);
13251 unsigned int endregno = END_REGNO (reg);
13252 unsigned int i;
13253 reg_stat_type *rsp;
13254
13255 /* If VALUE contains REG and we have a previous value for REG, substitute
13256 the previous value. */
13257 if (value && insn && reg_overlap_mentioned_p (reg, value))
13258 {
13259 rtx tem;
13260
13261 /* Set things up so get_last_value is allowed to see anything set up to
13262 our insn. */
13263 subst_low_luid = DF_INSN_LUID (insn);
13264 tem = get_last_value (reg);
13265
13266 /* If TEM is simply a binary operation with two CLOBBERs as operands,
13267 it isn't going to be useful and will take a lot of time to process,
13268 so just use the CLOBBER. */
13269
13270 if (tem)
13271 {
13272 if (ARITHMETIC_P (tem)
13273 && GET_CODE (XEXP (tem, 0)) == CLOBBER
13274 && GET_CODE (XEXP (tem, 1)) == CLOBBER)
13275 tem = XEXP (tem, 0);
13276 else if (count_occurrences (value, reg, 1) >= 2)
13277 {
13278 /* If there are two or more occurrences of REG in VALUE,
13279 prevent the value from growing too much. */
13280 if (count_rtxs (tem) > param_max_last_value_rtl)
13281 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
13282 }
13283
13284 value = replace_rtx (copy_rtx (value), reg, tem);
13285 }
13286 }
13287
13288 /* For each register modified, show we don't know its value, that
13289 we don't know about its bitwise content, that its value has been
13290 updated, and that we don't know the location of the death of the
13291 register. */
13292 for (i = regno; i < endregno; i++)
13293 {
13294 rsp = &reg_stat[i];
13295
13296 if (insn)
13297 rsp->last_set = insn;
13298
13299 rsp->last_set_value = 0;
13300 rsp->last_set_mode = VOIDmode;
13301 rsp->last_set_nonzero_bits = 0;
13302 rsp->last_set_sign_bit_copies = 0;
13303 rsp->last_death = 0;
13304 rsp->truncated_to_mode = VOIDmode;
13305 }
13306
13307 /* Mark registers that are being referenced in this value. */
13308 if (value)
13309 update_table_tick (value);
13310
13311 /* Now update the status of each register being set.
13312 If someone is using this register in this block, set this register
13313 to invalid since we will get confused between the two lives in this
13314 basic block. This makes using this register always invalid. In cse, we
13315 scan the table to invalidate all entries using this register, but this
13316 is too much work for us. */
13317
13318 for (i = regno; i < endregno; i++)
13319 {
13320 rsp = &reg_stat[i];
13321 rsp->last_set_label = label_tick;
13322 if (!insn
13323 || (value && rsp->last_set_table_tick >= label_tick_ebb_start))
13324 rsp->last_set_invalid = 1;
13325 else
13326 rsp->last_set_invalid = 0;
13327 }
13328
13329 /* The value being assigned might refer to X (like in "x++;"). In that
13330 case, we must replace it with (clobber (const_int 0)) to prevent
13331 infinite loops. */
13332 rsp = &reg_stat[regno];
13333 if (value && !get_last_value_validate (&value, insn, label_tick, 0))
13334 {
13335 value = copy_rtx (value);
13336 if (!get_last_value_validate (&value, insn, label_tick, 1))
13337 value = 0;
13338 }
13339
13340 /* For the main register being modified, update the value, the mode, the
13341 nonzero bits, and the number of sign bit copies. */
13342
13343 rsp->last_set_value = value;
13344
13345 if (value)
13346 {
13347 machine_mode mode = GET_MODE (reg);
13348 subst_low_luid = DF_INSN_LUID (insn);
13349 rsp->last_set_mode = mode;
13350 if (GET_MODE_CLASS (mode) == MODE_INT
13351 && HWI_COMPUTABLE_MODE_P (mode))
13352 mode = nonzero_bits_mode;
13353 rsp->last_set_nonzero_bits = nonzero_bits (value, mode);
13354 rsp->last_set_sign_bit_copies
13355 = num_sign_bit_copies (value, GET_MODE (reg));
13356 }
13357 }
13358
13359 /* Called via note_stores from record_dead_and_set_regs to handle one
13360 SET or CLOBBER in an insn. DATA is the instruction in which the
13361 set is occurring. */
13362
13363 static void
13364 record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data)
13365 {
13366 rtx_insn *record_dead_insn = (rtx_insn *) data;
13367
13368 if (GET_CODE (dest) == SUBREG)
13369 dest = SUBREG_REG (dest);
13370
13371 if (!record_dead_insn)
13372 {
13373 if (REG_P (dest))
13374 record_value_for_reg (dest, NULL, NULL_RTX);
13375 return;
13376 }
13377
13378 if (REG_P (dest))
13379 {
13380 /* If we are setting the whole register, we know its value. Otherwise
13381 show that we don't know the value. We can handle a SUBREG if it's
13382 the low part, but we must be careful with paradoxical SUBREGs on
13383 RISC architectures because we cannot strip e.g. an extension around
13384 a load and record the naked load since the RTL middle-end considers
13385 that the upper bits are defined according to LOAD_EXTEND_OP. */
13386 if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
13387 record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
13388 else if (GET_CODE (setter) == SET
13389 && GET_CODE (SET_DEST (setter)) == SUBREG
13390 && SUBREG_REG (SET_DEST (setter)) == dest
13391 && known_le (GET_MODE_PRECISION (GET_MODE (dest)),
13392 BITS_PER_WORD)
13393 && subreg_lowpart_p (SET_DEST (setter)))
13394 record_value_for_reg (dest, record_dead_insn,
13395 WORD_REGISTER_OPERATIONS
13396 && word_register_operation_p (SET_SRC (setter))
13397 && paradoxical_subreg_p (SET_DEST (setter))
13398 ? SET_SRC (setter)
13399 : gen_lowpart (GET_MODE (dest),
13400 SET_SRC (setter)));
13401 else
13402 record_value_for_reg (dest, record_dead_insn, NULL_RTX);
13403 }
13404 else if (MEM_P (dest)
13405 /* Ignore pushes, they clobber nothing. */
13406 && ! push_operand (dest, GET_MODE (dest)))
13407 mem_last_set = DF_INSN_LUID (record_dead_insn);
13408 }
13409
13410 /* Update the records of when each REG was most recently set or killed
13411 for the things done by INSN. This is the last thing done in processing
13412 INSN in the combiner loop.
13413
13414 We update reg_stat[], in particular fields last_set, last_set_value,
13415 last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
13416 last_death, and also the similar information mem_last_set (which insn
13417 most recently modified memory) and last_call_luid (which insn was the
13418 most recent subroutine call). */
13419
13420 static void
13421 record_dead_and_set_regs (rtx_insn *insn)
13422 {
13423 rtx link;
13424 unsigned int i;
13425
13426 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
13427 {
13428 if (REG_NOTE_KIND (link) == REG_DEAD
13429 && REG_P (XEXP (link, 0)))
13430 {
13431 unsigned int regno = REGNO (XEXP (link, 0));
13432 unsigned int endregno = END_REGNO (XEXP (link, 0));
13433
13434 for (i = regno; i < endregno; i++)
13435 {
13436 reg_stat_type *rsp;
13437
13438 rsp = &reg_stat[i];
13439 rsp->last_death = insn;
13440 }
13441 }
13442 else if (REG_NOTE_KIND (link) == REG_INC)
13443 record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
13444 }
13445
13446 if (CALL_P (insn))
13447 {
13448 HARD_REG_SET callee_clobbers
13449 = insn_callee_abi (insn).full_and_partial_reg_clobbers ();
13450 hard_reg_set_iterator hrsi;
13451 EXECUTE_IF_SET_IN_HARD_REG_SET (callee_clobbers, 0, i, hrsi)
13452 {
13453 reg_stat_type *rsp;
13454
13455 /* ??? We could try to preserve some information from the last
13456 set of register I if the call doesn't actually clobber
13457 (reg:last_set_mode I), which might be true for ABIs with
13458 partial clobbers. However, it would be difficult to
13459 update last_set_nonzero_bits and last_sign_bit_copies
13460 to account for the part of I that actually was clobbered.
13461 It wouldn't help much anyway, since we rarely see this
13462 situation before RA. */
13463 rsp = &reg_stat[i];
13464 rsp->last_set_invalid = 1;
13465 rsp->last_set = insn;
13466 rsp->last_set_value = 0;
13467 rsp->last_set_mode = VOIDmode;
13468 rsp->last_set_nonzero_bits = 0;
13469 rsp->last_set_sign_bit_copies = 0;
13470 rsp->last_death = 0;
13471 rsp->truncated_to_mode = VOIDmode;
13472 }
13473
13474 last_call_luid = mem_last_set = DF_INSN_LUID (insn);
13475
13476 /* We can't combine into a call pattern. Remember, though, that
13477 the return value register is set at this LUID. We could
13478 still replace a register with the return value from the
13479 wrong subroutine call! */
13480 note_stores (insn, record_dead_and_set_regs_1, NULL_RTX);
13481 }
13482 else
13483 note_stores (insn, record_dead_and_set_regs_1, insn);
13484 }
13485
13486 /* If a SUBREG has the promoted bit set, it is in fact a property of the
13487 register present in the SUBREG, so for each such SUBREG go back and
13488 adjust nonzero and sign bit information of the registers that are
13489 known to have some zero/sign bits set.
13490
13491 This is needed because when combine blows the SUBREGs away, the
13492 information on zero/sign bits is lost and further combines can be
13493 missed because of that. */
13494
13495 static void
13496 record_promoted_value (rtx_insn *insn, rtx subreg)
13497 {
13498 struct insn_link *links;
13499 rtx set;
13500 unsigned int regno = REGNO (SUBREG_REG (subreg));
13501 machine_mode mode = GET_MODE (subreg);
13502
13503 if (!HWI_COMPUTABLE_MODE_P (mode))
13504 return;
13505
13506 for (links = LOG_LINKS (insn); links;)
13507 {
13508 reg_stat_type *rsp;
13509
13510 insn = links->insn;
13511 set = single_set (insn);
13512
13513 if (! set || !REG_P (SET_DEST (set))
13514 || REGNO (SET_DEST (set)) != regno
13515 || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
13516 {
13517 links = links->next;
13518 continue;
13519 }
13520
13521 rsp = &reg_stat[regno];
13522 if (rsp->last_set == insn)
13523 {
13524 if (SUBREG_PROMOTED_UNSIGNED_P (subreg))
13525 rsp->last_set_nonzero_bits &= GET_MODE_MASK (mode);
13526 }
13527
13528 if (REG_P (SET_SRC (set)))
13529 {
13530 regno = REGNO (SET_SRC (set));
13531 links = LOG_LINKS (insn);
13532 }
13533 else
13534 break;
13535 }
13536 }
13537
13538 /* Check if X, a register, is known to contain a value already
13539 truncated to MODE. In this case we can use a subreg to refer to
13540 the truncated value even though in the generic case we would need
13541 an explicit truncation. */
13542
13543 static bool
13544 reg_truncated_to_mode (machine_mode mode, const_rtx x)
13545 {
13546 reg_stat_type *rsp = &reg_stat[REGNO (x)];
13547 machine_mode truncated = rsp->truncated_to_mode;
13548
13549 if (truncated == 0
13550 || rsp->truncation_label < label_tick_ebb_start)
13551 return false;
13552 if (!partial_subreg_p (mode, truncated))
13553 return true;
13554 if (TRULY_NOOP_TRUNCATION_MODES_P (mode, truncated))
13555 return true;
13556 return false;
13557 }
13558
13559 /* If X is a hard reg or a subreg record the mode that the register is
13560 accessed in. For non-TARGET_TRULY_NOOP_TRUNCATION targets we might be
13561 able to turn a truncate into a subreg using this information. Return true
13562 if traversing X is complete. */
13563
13564 static bool
13565 record_truncated_value (rtx x)
13566 {
13567 machine_mode truncated_mode;
13568 reg_stat_type *rsp;
13569
13570 if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x)))
13571 {
13572 machine_mode original_mode = GET_MODE (SUBREG_REG (x));
13573 truncated_mode = GET_MODE (x);
13574
13575 if (!partial_subreg_p (truncated_mode, original_mode))
13576 return true;
13577
13578 truncated_mode = GET_MODE (x);
13579 if (TRULY_NOOP_TRUNCATION_MODES_P (truncated_mode, original_mode))
13580 return true;
13581
13582 x = SUBREG_REG (x);
13583 }
13584 /* ??? For hard-regs we now record everything. We might be able to
13585 optimize this using last_set_mode. */
13586 else if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
13587 truncated_mode = GET_MODE (x);
13588 else
13589 return false;
13590
13591 rsp = &reg_stat[REGNO (x)];
13592 if (rsp->truncated_to_mode == 0
13593 || rsp->truncation_label < label_tick_ebb_start
13594 || partial_subreg_p (truncated_mode, rsp->truncated_to_mode))
13595 {
13596 rsp->truncated_to_mode = truncated_mode;
13597 rsp->truncation_label = label_tick;
13598 }
13599
13600 return true;
13601 }
13602
13603 /* Callback for note_uses. Find hardregs and subregs of pseudos and
13604 the modes they are used in. This can help truning TRUNCATEs into
13605 SUBREGs. */
13606
13607 static void
13608 record_truncated_values (rtx *loc, void *data ATTRIBUTE_UNUSED)
13609 {
13610 subrtx_var_iterator::array_type array;
13611 FOR_EACH_SUBRTX_VAR (iter, array, *loc, NONCONST)
13612 if (record_truncated_value (*iter))
13613 iter.skip_subrtxes ();
13614 }
13615
13616 /* Scan X for promoted SUBREGs. For each one found,
13617 note what it implies to the registers used in it. */
13618
13619 static void
13620 check_promoted_subreg (rtx_insn *insn, rtx x)
13621 {
13622 if (GET_CODE (x) == SUBREG
13623 && SUBREG_PROMOTED_VAR_P (x)
13624 && REG_P (SUBREG_REG (x)))
13625 record_promoted_value (insn, x);
13626 else
13627 {
13628 const char *format = GET_RTX_FORMAT (GET_CODE (x));
13629 int i, j;
13630
13631 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
13632 switch (format[i])
13633 {
13634 case 'e':
13635 check_promoted_subreg (insn, XEXP (x, i));
13636 break;
13637 case 'V':
13638 case 'E':
13639 if (XVEC (x, i) != 0)
13640 for (j = 0; j < XVECLEN (x, i); j++)
13641 check_promoted_subreg (insn, XVECEXP (x, i, j));
13642 break;
13643 }
13644 }
13645 }
13646 \f
13647 /* Verify that all the registers and memory references mentioned in *LOC are
13648 still valid. *LOC was part of a value set in INSN when label_tick was
13649 equal to TICK. Return 0 if some are not. If REPLACE is nonzero, replace
13650 the invalid references with (clobber (const_int 0)) and return 1. This
13651 replacement is useful because we often can get useful information about
13652 the form of a value (e.g., if it was produced by a shift that always
13653 produces -1 or 0) even though we don't know exactly what registers it
13654 was produced from. */
13655
13656 static int
13657 get_last_value_validate (rtx *loc, rtx_insn *insn, int tick, int replace)
13658 {
13659 rtx x = *loc;
13660 const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
13661 int len = GET_RTX_LENGTH (GET_CODE (x));
13662 int i, j;
13663
13664 if (REG_P (x))
13665 {
13666 unsigned int regno = REGNO (x);
13667 unsigned int endregno = END_REGNO (x);
13668 unsigned int j;
13669
13670 for (j = regno; j < endregno; j++)
13671 {
13672 reg_stat_type *rsp = &reg_stat[j];
13673 if (rsp->last_set_invalid
13674 /* If this is a pseudo-register that was only set once and not
13675 live at the beginning of the function, it is always valid. */
13676 || (! (regno >= FIRST_PSEUDO_REGISTER
13677 && regno < reg_n_sets_max
13678 && REG_N_SETS (regno) == 1
13679 && (!REGNO_REG_SET_P
13680 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
13681 regno)))
13682 && rsp->last_set_label > tick))
13683 {
13684 if (replace)
13685 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
13686 return replace;
13687 }
13688 }
13689
13690 return 1;
13691 }
13692 /* If this is a memory reference, make sure that there were no stores after
13693 it that might have clobbered the value. We don't have alias info, so we
13694 assume any store invalidates it. Moreover, we only have local UIDs, so
13695 we also assume that there were stores in the intervening basic blocks. */
13696 else if (MEM_P (x) && !MEM_READONLY_P (x)
13697 && (tick != label_tick || DF_INSN_LUID (insn) <= mem_last_set))
13698 {
13699 if (replace)
13700 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
13701 return replace;
13702 }
13703
13704 for (i = 0; i < len; i++)
13705 {
13706 if (fmt[i] == 'e')
13707 {
13708 /* Check for identical subexpressions. If x contains
13709 identical subexpression we only have to traverse one of
13710 them. */
13711 if (i == 1 && ARITHMETIC_P (x))
13712 {
13713 /* Note that at this point x0 has already been checked
13714 and found valid. */
13715 rtx x0 = XEXP (x, 0);
13716 rtx x1 = XEXP (x, 1);
13717
13718 /* If x0 and x1 are identical then x is also valid. */
13719 if (x0 == x1)
13720 return 1;
13721
13722 /* If x1 is identical to a subexpression of x0 then
13723 while checking x0, x1 has already been checked. Thus
13724 it is valid and so as x. */
13725 if (ARITHMETIC_P (x0)
13726 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
13727 return 1;
13728
13729 /* If x0 is identical to a subexpression of x1 then x is
13730 valid iff the rest of x1 is valid. */
13731 if (ARITHMETIC_P (x1)
13732 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
13733 return
13734 get_last_value_validate (&XEXP (x1,
13735 x0 == XEXP (x1, 0) ? 1 : 0),
13736 insn, tick, replace);
13737 }
13738
13739 if (get_last_value_validate (&XEXP (x, i), insn, tick,
13740 replace) == 0)
13741 return 0;
13742 }
13743 else if (fmt[i] == 'E')
13744 for (j = 0; j < XVECLEN (x, i); j++)
13745 if (get_last_value_validate (&XVECEXP (x, i, j),
13746 insn, tick, replace) == 0)
13747 return 0;
13748 }
13749
13750 /* If we haven't found a reason for it to be invalid, it is valid. */
13751 return 1;
13752 }
13753
13754 /* Get the last value assigned to X, if known. Some registers
13755 in the value may be replaced with (clobber (const_int 0)) if their value
13756 is known longer known reliably. */
13757
13758 static rtx
13759 get_last_value (const_rtx x)
13760 {
13761 unsigned int regno;
13762 rtx value;
13763 reg_stat_type *rsp;
13764
13765 /* If this is a non-paradoxical SUBREG, get the value of its operand and
13766 then convert it to the desired mode. If this is a paradoxical SUBREG,
13767 we cannot predict what values the "extra" bits might have. */
13768 if (GET_CODE (x) == SUBREG
13769 && subreg_lowpart_p (x)
13770 && !paradoxical_subreg_p (x)
13771 && (value = get_last_value (SUBREG_REG (x))) != 0)
13772 return gen_lowpart (GET_MODE (x), value);
13773
13774 if (!REG_P (x))
13775 return 0;
13776
13777 regno = REGNO (x);
13778 rsp = &reg_stat[regno];
13779 value = rsp->last_set_value;
13780
13781 /* If we don't have a value, or if it isn't for this basic block and
13782 it's either a hard register, set more than once, or it's a live
13783 at the beginning of the function, return 0.
13784
13785 Because if it's not live at the beginning of the function then the reg
13786 is always set before being used (is never used without being set).
13787 And, if it's set only once, and it's always set before use, then all
13788 uses must have the same last value, even if it's not from this basic
13789 block. */
13790
13791 if (value == 0
13792 || (rsp->last_set_label < label_tick_ebb_start
13793 && (regno < FIRST_PSEUDO_REGISTER
13794 || regno >= reg_n_sets_max
13795 || REG_N_SETS (regno) != 1
13796 || REGNO_REG_SET_P
13797 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb), regno))))
13798 return 0;
13799
13800 /* If the value was set in a later insn than the ones we are processing,
13801 we can't use it even if the register was only set once. */
13802 if (rsp->last_set_label == label_tick
13803 && DF_INSN_LUID (rsp->last_set) >= subst_low_luid)
13804 return 0;
13805
13806 /* If fewer bits were set than what we are asked for now, we cannot use
13807 the value. */
13808 if (maybe_lt (GET_MODE_PRECISION (rsp->last_set_mode),
13809 GET_MODE_PRECISION (GET_MODE (x))))
13810 return 0;
13811
13812 /* If the value has all its registers valid, return it. */
13813 if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 0))
13814 return value;
13815
13816 /* Otherwise, make a copy and replace any invalid register with
13817 (clobber (const_int 0)). If that fails for some reason, return 0. */
13818
13819 value = copy_rtx (value);
13820 if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 1))
13821 return value;
13822
13823 return 0;
13824 }
13825 \f
13826 /* Define three variables used for communication between the following
13827 routines. */
13828
13829 static unsigned int reg_dead_regno, reg_dead_endregno;
13830 static int reg_dead_flag;
13831 rtx reg_dead_reg;
13832
13833 /* Function called via note_stores from reg_dead_at_p.
13834
13835 If DEST is within [reg_dead_regno, reg_dead_endregno), set
13836 reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET. */
13837
13838 static void
13839 reg_dead_at_p_1 (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
13840 {
13841 unsigned int regno, endregno;
13842
13843 if (!REG_P (dest))
13844 return;
13845
13846 regno = REGNO (dest);
13847 endregno = END_REGNO (dest);
13848 if (reg_dead_endregno > regno && reg_dead_regno < endregno)
13849 reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
13850 }
13851
13852 /* Return nonzero if REG is known to be dead at INSN.
13853
13854 We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER
13855 referencing REG, it is dead. If we hit a SET referencing REG, it is
13856 live. Otherwise, see if it is live or dead at the start of the basic
13857 block we are in. Hard regs marked as being live in NEWPAT_USED_REGS
13858 must be assumed to be always live. */
13859
13860 static int
13861 reg_dead_at_p (rtx reg, rtx_insn *insn)
13862 {
13863 basic_block block;
13864 unsigned int i;
13865
13866 /* Set variables for reg_dead_at_p_1. */
13867 reg_dead_regno = REGNO (reg);
13868 reg_dead_endregno = END_REGNO (reg);
13869 reg_dead_reg = reg;
13870
13871 reg_dead_flag = 0;
13872
13873 /* Check that reg isn't mentioned in NEWPAT_USED_REGS. For fixed registers
13874 we allow the machine description to decide whether use-and-clobber
13875 patterns are OK. */
13876 if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
13877 {
13878 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
13879 if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
13880 return 0;
13881 }
13882
13883 /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, or
13884 beginning of basic block. */
13885 block = BLOCK_FOR_INSN (insn);
13886 for (;;)
13887 {
13888 if (INSN_P (insn))
13889 {
13890 if (find_regno_note (insn, REG_UNUSED, reg_dead_regno))
13891 return 1;
13892
13893 note_stores (insn, reg_dead_at_p_1, NULL);
13894 if (reg_dead_flag)
13895 return reg_dead_flag == 1 ? 1 : 0;
13896
13897 if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
13898 return 1;
13899 }
13900
13901 if (insn == BB_HEAD (block))
13902 break;
13903
13904 insn = PREV_INSN (insn);
13905 }
13906
13907 /* Look at live-in sets for the basic block that we were in. */
13908 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
13909 if (REGNO_REG_SET_P (df_get_live_in (block), i))
13910 return 0;
13911
13912 return 1;
13913 }
13914 \f
13915 /* Note hard registers in X that are used. */
13916
13917 static void
13918 mark_used_regs_combine (rtx x)
13919 {
13920 RTX_CODE code = GET_CODE (x);
13921 unsigned int regno;
13922 int i;
13923
13924 switch (code)
13925 {
13926 case LABEL_REF:
13927 case SYMBOL_REF:
13928 case CONST:
13929 CASE_CONST_ANY:
13930 case PC:
13931 case ADDR_VEC:
13932 case ADDR_DIFF_VEC:
13933 case ASM_INPUT:
13934 /* CC0 must die in the insn after it is set, so we don't need to take
13935 special note of it here. */
13936 case CC0:
13937 return;
13938
13939 case CLOBBER:
13940 /* If we are clobbering a MEM, mark any hard registers inside the
13941 address as used. */
13942 if (MEM_P (XEXP (x, 0)))
13943 mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
13944 return;
13945
13946 case REG:
13947 regno = REGNO (x);
13948 /* A hard reg in a wide mode may really be multiple registers.
13949 If so, mark all of them just like the first. */
13950 if (regno < FIRST_PSEUDO_REGISTER)
13951 {
13952 /* None of this applies to the stack, frame or arg pointers. */
13953 if (regno == STACK_POINTER_REGNUM
13954 || (!HARD_FRAME_POINTER_IS_FRAME_POINTER
13955 && regno == HARD_FRAME_POINTER_REGNUM)
13956 || (FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
13957 && regno == ARG_POINTER_REGNUM && fixed_regs[regno])
13958 || regno == FRAME_POINTER_REGNUM)
13959 return;
13960
13961 add_to_hard_reg_set (&newpat_used_regs, GET_MODE (x), regno);
13962 }
13963 return;
13964
13965 case SET:
13966 {
13967 /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
13968 the address. */
13969 rtx testreg = SET_DEST (x);
13970
13971 while (GET_CODE (testreg) == SUBREG
13972 || GET_CODE (testreg) == ZERO_EXTRACT
13973 || GET_CODE (testreg) == STRICT_LOW_PART)
13974 testreg = XEXP (testreg, 0);
13975
13976 if (MEM_P (testreg))
13977 mark_used_regs_combine (XEXP (testreg, 0));
13978
13979 mark_used_regs_combine (SET_SRC (x));
13980 }
13981 return;
13982
13983 default:
13984 break;
13985 }
13986
13987 /* Recursively scan the operands of this expression. */
13988
13989 {
13990 const char *fmt = GET_RTX_FORMAT (code);
13991
13992 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
13993 {
13994 if (fmt[i] == 'e')
13995 mark_used_regs_combine (XEXP (x, i));
13996 else if (fmt[i] == 'E')
13997 {
13998 int j;
13999
14000 for (j = 0; j < XVECLEN (x, i); j++)
14001 mark_used_regs_combine (XVECEXP (x, i, j));
14002 }
14003 }
14004 }
14005 }
14006 \f
14007 /* Remove register number REGNO from the dead registers list of INSN.
14008
14009 Return the note used to record the death, if there was one. */
14010
14011 rtx
14012 remove_death (unsigned int regno, rtx_insn *insn)
14013 {
14014 rtx note = find_regno_note (insn, REG_DEAD, regno);
14015
14016 if (note)
14017 remove_note (insn, note);
14018
14019 return note;
14020 }
14021
14022 /* For each register (hardware or pseudo) used within expression X, if its
14023 death is in an instruction with luid between FROM_LUID (inclusive) and
14024 TO_INSN (exclusive), put a REG_DEAD note for that register in the
14025 list headed by PNOTES.
14026
14027 That said, don't move registers killed by maybe_kill_insn.
14028
14029 This is done when X is being merged by combination into TO_INSN. These
14030 notes will then be distributed as needed. */
14031
14032 static void
14033 move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx_insn *to_insn,
14034 rtx *pnotes)
14035 {
14036 const char *fmt;
14037 int len, i;
14038 enum rtx_code code = GET_CODE (x);
14039
14040 if (code == REG)
14041 {
14042 unsigned int regno = REGNO (x);
14043 rtx_insn *where_dead = reg_stat[regno].last_death;
14044
14045 /* If we do not know where the register died, it may still die between
14046 FROM_LUID and TO_INSN. If so, find it. This is PR83304. */
14047 if (!where_dead || DF_INSN_LUID (where_dead) >= DF_INSN_LUID (to_insn))
14048 {
14049 rtx_insn *insn = prev_real_nondebug_insn (to_insn);
14050 while (insn
14051 && BLOCK_FOR_INSN (insn) == BLOCK_FOR_INSN (to_insn)
14052 && DF_INSN_LUID (insn) >= from_luid)
14053 {
14054 if (dead_or_set_regno_p (insn, regno))
14055 {
14056 if (find_regno_note (insn, REG_DEAD, regno))
14057 where_dead = insn;
14058 break;
14059 }
14060
14061 insn = prev_real_nondebug_insn (insn);
14062 }
14063 }
14064
14065 /* Don't move the register if it gets killed in between from and to. */
14066 if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
14067 && ! reg_referenced_p (x, maybe_kill_insn))
14068 return;
14069
14070 if (where_dead
14071 && BLOCK_FOR_INSN (where_dead) == BLOCK_FOR_INSN (to_insn)
14072 && DF_INSN_LUID (where_dead) >= from_luid
14073 && DF_INSN_LUID (where_dead) < DF_INSN_LUID (to_insn))
14074 {
14075 rtx note = remove_death (regno, where_dead);
14076
14077 /* It is possible for the call above to return 0. This can occur
14078 when last_death points to I2 or I1 that we combined with.
14079 In that case make a new note.
14080
14081 We must also check for the case where X is a hard register
14082 and NOTE is a death note for a range of hard registers
14083 including X. In that case, we must put REG_DEAD notes for
14084 the remaining registers in place of NOTE. */
14085
14086 if (note != 0 && regno < FIRST_PSEUDO_REGISTER
14087 && partial_subreg_p (GET_MODE (x), GET_MODE (XEXP (note, 0))))
14088 {
14089 unsigned int deadregno = REGNO (XEXP (note, 0));
14090 unsigned int deadend = END_REGNO (XEXP (note, 0));
14091 unsigned int ourend = END_REGNO (x);
14092 unsigned int i;
14093
14094 for (i = deadregno; i < deadend; i++)
14095 if (i < regno || i >= ourend)
14096 add_reg_note (where_dead, REG_DEAD, regno_reg_rtx[i]);
14097 }
14098
14099 /* If we didn't find any note, or if we found a REG_DEAD note that
14100 covers only part of the given reg, and we have a multi-reg hard
14101 register, then to be safe we must check for REG_DEAD notes
14102 for each register other than the first. They could have
14103 their own REG_DEAD notes lying around. */
14104 else if ((note == 0
14105 || (note != 0
14106 && partial_subreg_p (GET_MODE (XEXP (note, 0)),
14107 GET_MODE (x))))
14108 && regno < FIRST_PSEUDO_REGISTER
14109 && REG_NREGS (x) > 1)
14110 {
14111 unsigned int ourend = END_REGNO (x);
14112 unsigned int i, offset;
14113 rtx oldnotes = 0;
14114
14115 if (note)
14116 offset = hard_regno_nregs (regno, GET_MODE (XEXP (note, 0)));
14117 else
14118 offset = 1;
14119
14120 for (i = regno + offset; i < ourend; i++)
14121 move_deaths (regno_reg_rtx[i],
14122 maybe_kill_insn, from_luid, to_insn, &oldnotes);
14123 }
14124
14125 if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
14126 {
14127 XEXP (note, 1) = *pnotes;
14128 *pnotes = note;
14129 }
14130 else
14131 *pnotes = alloc_reg_note (REG_DEAD, x, *pnotes);
14132 }
14133
14134 return;
14135 }
14136
14137 else if (GET_CODE (x) == SET)
14138 {
14139 rtx dest = SET_DEST (x);
14140
14141 move_deaths (SET_SRC (x), maybe_kill_insn, from_luid, to_insn, pnotes);
14142
14143 /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
14144 that accesses one word of a multi-word item, some
14145 piece of everything register in the expression is used by
14146 this insn, so remove any old death. */
14147 /* ??? So why do we test for equality of the sizes? */
14148
14149 if (GET_CODE (dest) == ZERO_EXTRACT
14150 || GET_CODE (dest) == STRICT_LOW_PART
14151 || (GET_CODE (dest) == SUBREG
14152 && !read_modify_subreg_p (dest)))
14153 {
14154 move_deaths (dest, maybe_kill_insn, from_luid, to_insn, pnotes);
14155 return;
14156 }
14157
14158 /* If this is some other SUBREG, we know it replaces the entire
14159 value, so use that as the destination. */
14160 if (GET_CODE (dest) == SUBREG)
14161 dest = SUBREG_REG (dest);
14162
14163 /* If this is a MEM, adjust deaths of anything used in the address.
14164 For a REG (the only other possibility), the entire value is
14165 being replaced so the old value is not used in this insn. */
14166
14167 if (MEM_P (dest))
14168 move_deaths (XEXP (dest, 0), maybe_kill_insn, from_luid,
14169 to_insn, pnotes);
14170 return;
14171 }
14172
14173 else if (GET_CODE (x) == CLOBBER)
14174 return;
14175
14176 len = GET_RTX_LENGTH (code);
14177 fmt = GET_RTX_FORMAT (code);
14178
14179 for (i = 0; i < len; i++)
14180 {
14181 if (fmt[i] == 'E')
14182 {
14183 int j;
14184 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
14185 move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_luid,
14186 to_insn, pnotes);
14187 }
14188 else if (fmt[i] == 'e')
14189 move_deaths (XEXP (x, i), maybe_kill_insn, from_luid, to_insn, pnotes);
14190 }
14191 }
14192 \f
14193 /* Return 1 if X is the target of a bit-field assignment in BODY, the
14194 pattern of an insn. X must be a REG. */
14195
14196 static int
14197 reg_bitfield_target_p (rtx x, rtx body)
14198 {
14199 int i;
14200
14201 if (GET_CODE (body) == SET)
14202 {
14203 rtx dest = SET_DEST (body);
14204 rtx target;
14205 unsigned int regno, tregno, endregno, endtregno;
14206
14207 if (GET_CODE (dest) == ZERO_EXTRACT)
14208 target = XEXP (dest, 0);
14209 else if (GET_CODE (dest) == STRICT_LOW_PART)
14210 target = SUBREG_REG (XEXP (dest, 0));
14211 else
14212 return 0;
14213
14214 if (GET_CODE (target) == SUBREG)
14215 target = SUBREG_REG (target);
14216
14217 if (!REG_P (target))
14218 return 0;
14219
14220 tregno = REGNO (target), regno = REGNO (x);
14221 if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
14222 return target == x;
14223
14224 endtregno = end_hard_regno (GET_MODE (target), tregno);
14225 endregno = end_hard_regno (GET_MODE (x), regno);
14226
14227 return endregno > tregno && regno < endtregno;
14228 }
14229
14230 else if (GET_CODE (body) == PARALLEL)
14231 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
14232 if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
14233 return 1;
14234
14235 return 0;
14236 }
14237 \f
14238 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
14239 as appropriate. I3 and I2 are the insns resulting from the combination
14240 insns including FROM (I2 may be zero).
14241
14242 ELIM_I2 and ELIM_I1 are either zero or registers that we know will
14243 not need REG_DEAD notes because they are being substituted for. This
14244 saves searching in the most common cases.
14245
14246 Each note in the list is either ignored or placed on some insns, depending
14247 on the type of note. */
14248
14249 static void
14250 distribute_notes (rtx notes, rtx_insn *from_insn, rtx_insn *i3, rtx_insn *i2,
14251 rtx elim_i2, rtx elim_i1, rtx elim_i0)
14252 {
14253 rtx note, next_note;
14254 rtx tem_note;
14255 rtx_insn *tem_insn;
14256
14257 for (note = notes; note; note = next_note)
14258 {
14259 rtx_insn *place = 0, *place2 = 0;
14260
14261 next_note = XEXP (note, 1);
14262 switch (REG_NOTE_KIND (note))
14263 {
14264 case REG_BR_PROB:
14265 case REG_BR_PRED:
14266 /* Doesn't matter much where we put this, as long as it's somewhere.
14267 It is preferable to keep these notes on branches, which is most
14268 likely to be i3. */
14269 place = i3;
14270 break;
14271
14272 case REG_NON_LOCAL_GOTO:
14273 if (JUMP_P (i3))
14274 place = i3;
14275 else
14276 {
14277 gcc_assert (i2 && JUMP_P (i2));
14278 place = i2;
14279 }
14280 break;
14281
14282 case REG_EH_REGION:
14283 /* These notes must remain with the call or trapping instruction. */
14284 if (CALL_P (i3))
14285 place = i3;
14286 else if (i2 && CALL_P (i2))
14287 place = i2;
14288 else
14289 {
14290 gcc_assert (cfun->can_throw_non_call_exceptions);
14291 if (may_trap_p (i3))
14292 place = i3;
14293 else if (i2 && may_trap_p (i2))
14294 place = i2;
14295 /* ??? Otherwise assume we've combined things such that we
14296 can now prove that the instructions can't trap. Drop the
14297 note in this case. */
14298 }
14299 break;
14300
14301 case REG_ARGS_SIZE:
14302 /* ??? How to distribute between i3-i1. Assume i3 contains the
14303 entire adjustment. Assert i3 contains at least some adjust. */
14304 if (!noop_move_p (i3))
14305 {
14306 poly_int64 old_size, args_size = get_args_size (note);
14307 /* fixup_args_size_notes looks at REG_NORETURN note,
14308 so ensure the note is placed there first. */
14309 if (CALL_P (i3))
14310 {
14311 rtx *np;
14312 for (np = &next_note; *np; np = &XEXP (*np, 1))
14313 if (REG_NOTE_KIND (*np) == REG_NORETURN)
14314 {
14315 rtx n = *np;
14316 *np = XEXP (n, 1);
14317 XEXP (n, 1) = REG_NOTES (i3);
14318 REG_NOTES (i3) = n;
14319 break;
14320 }
14321 }
14322 old_size = fixup_args_size_notes (PREV_INSN (i3), i3, args_size);
14323 /* emit_call_1 adds for !ACCUMULATE_OUTGOING_ARGS
14324 REG_ARGS_SIZE note to all noreturn calls, allow that here. */
14325 gcc_assert (maybe_ne (old_size, args_size)
14326 || (CALL_P (i3)
14327 && !ACCUMULATE_OUTGOING_ARGS
14328 && find_reg_note (i3, REG_NORETURN, NULL_RTX)));
14329 }
14330 break;
14331
14332 case REG_NORETURN:
14333 case REG_SETJMP:
14334 case REG_TM:
14335 case REG_CALL_DECL:
14336 case REG_CALL_NOCF_CHECK:
14337 /* These notes must remain with the call. It should not be
14338 possible for both I2 and I3 to be a call. */
14339 if (CALL_P (i3))
14340 place = i3;
14341 else
14342 {
14343 gcc_assert (i2 && CALL_P (i2));
14344 place = i2;
14345 }
14346 break;
14347
14348 case REG_UNUSED:
14349 /* Any clobbers for i3 may still exist, and so we must process
14350 REG_UNUSED notes from that insn.
14351
14352 Any clobbers from i2 or i1 can only exist if they were added by
14353 recog_for_combine. In that case, recog_for_combine created the
14354 necessary REG_UNUSED notes. Trying to keep any original
14355 REG_UNUSED notes from these insns can cause incorrect output
14356 if it is for the same register as the original i3 dest.
14357 In that case, we will notice that the register is set in i3,
14358 and then add a REG_UNUSED note for the destination of i3, which
14359 is wrong. However, it is possible to have REG_UNUSED notes from
14360 i2 or i1 for register which were both used and clobbered, so
14361 we keep notes from i2 or i1 if they will turn into REG_DEAD
14362 notes. */
14363
14364 /* If this register is set or clobbered in I3, put the note there
14365 unless there is one already. */
14366 if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
14367 {
14368 if (from_insn != i3)
14369 break;
14370
14371 if (! (REG_P (XEXP (note, 0))
14372 ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
14373 : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
14374 place = i3;
14375 }
14376 /* Otherwise, if this register is used by I3, then this register
14377 now dies here, so we must put a REG_DEAD note here unless there
14378 is one already. */
14379 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
14380 && ! (REG_P (XEXP (note, 0))
14381 ? find_regno_note (i3, REG_DEAD,
14382 REGNO (XEXP (note, 0)))
14383 : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
14384 {
14385 PUT_REG_NOTE_KIND (note, REG_DEAD);
14386 place = i3;
14387 }
14388
14389 /* A SET or CLOBBER of the REG_UNUSED reg has been removed,
14390 but we can't tell which at this point. We must reset any
14391 expectations we had about the value that was previously
14392 stored in the reg. ??? Ideally, we'd adjust REG_N_SETS
14393 and, if appropriate, restore its previous value, but we
14394 don't have enough information for that at this point. */
14395 else
14396 {
14397 record_value_for_reg (XEXP (note, 0), NULL, NULL_RTX);
14398
14399 /* Otherwise, if this register is now referenced in i2
14400 then the register used to be modified in one of the
14401 original insns. If it was i3 (say, in an unused
14402 parallel), it's now completely gone, so the note can
14403 be discarded. But if it was modified in i2, i1 or i0
14404 and we still reference it in i2, then we're
14405 referencing the previous value, and since the
14406 register was modified and REG_UNUSED, we know that
14407 the previous value is now dead. So, if we only
14408 reference the register in i2, we change the note to
14409 REG_DEAD, to reflect the previous value. However, if
14410 we're also setting or clobbering the register as
14411 scratch, we know (because the register was not
14412 referenced in i3) that it's unused, just as it was
14413 unused before, and we place the note in i2. */
14414 if (from_insn != i3 && i2 && INSN_P (i2)
14415 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
14416 {
14417 if (!reg_set_p (XEXP (note, 0), PATTERN (i2)))
14418 PUT_REG_NOTE_KIND (note, REG_DEAD);
14419 if (! (REG_P (XEXP (note, 0))
14420 ? find_regno_note (i2, REG_NOTE_KIND (note),
14421 REGNO (XEXP (note, 0)))
14422 : find_reg_note (i2, REG_NOTE_KIND (note),
14423 XEXP (note, 0))))
14424 place = i2;
14425 }
14426 }
14427
14428 break;
14429
14430 case REG_EQUAL:
14431 case REG_EQUIV:
14432 case REG_NOALIAS:
14433 /* These notes say something about results of an insn. We can
14434 only support them if they used to be on I3 in which case they
14435 remain on I3. Otherwise they are ignored.
14436
14437 If the note refers to an expression that is not a constant, we
14438 must also ignore the note since we cannot tell whether the
14439 equivalence is still true. It might be possible to do
14440 slightly better than this (we only have a problem if I2DEST
14441 or I1DEST is present in the expression), but it doesn't
14442 seem worth the trouble. */
14443
14444 if (from_insn == i3
14445 && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
14446 place = i3;
14447 break;
14448
14449 case REG_INC:
14450 /* These notes say something about how a register is used. They must
14451 be present on any use of the register in I2 or I3. */
14452 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
14453 place = i3;
14454
14455 if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
14456 {
14457 if (place)
14458 place2 = i2;
14459 else
14460 place = i2;
14461 }
14462 break;
14463
14464 case REG_LABEL_TARGET:
14465 case REG_LABEL_OPERAND:
14466 /* This can show up in several ways -- either directly in the
14467 pattern, or hidden off in the constant pool with (or without?)
14468 a REG_EQUAL note. */
14469 /* ??? Ignore the without-reg_equal-note problem for now. */
14470 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
14471 || ((tem_note = find_reg_note (i3, REG_EQUAL, NULL_RTX))
14472 && GET_CODE (XEXP (tem_note, 0)) == LABEL_REF
14473 && label_ref_label (XEXP (tem_note, 0)) == XEXP (note, 0)))
14474 place = i3;
14475
14476 if (i2
14477 && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
14478 || ((tem_note = find_reg_note (i2, REG_EQUAL, NULL_RTX))
14479 && GET_CODE (XEXP (tem_note, 0)) == LABEL_REF
14480 && label_ref_label (XEXP (tem_note, 0)) == XEXP (note, 0))))
14481 {
14482 if (place)
14483 place2 = i2;
14484 else
14485 place = i2;
14486 }
14487
14488 /* For REG_LABEL_TARGET on a JUMP_P, we prefer to put the note
14489 as a JUMP_LABEL or decrement LABEL_NUSES if it's already
14490 there. */
14491 if (place && JUMP_P (place)
14492 && REG_NOTE_KIND (note) == REG_LABEL_TARGET
14493 && (JUMP_LABEL (place) == NULL
14494 || JUMP_LABEL (place) == XEXP (note, 0)))
14495 {
14496 rtx label = JUMP_LABEL (place);
14497
14498 if (!label)
14499 JUMP_LABEL (place) = XEXP (note, 0);
14500 else if (LABEL_P (label))
14501 LABEL_NUSES (label)--;
14502 }
14503
14504 if (place2 && JUMP_P (place2)
14505 && REG_NOTE_KIND (note) == REG_LABEL_TARGET
14506 && (JUMP_LABEL (place2) == NULL
14507 || JUMP_LABEL (place2) == XEXP (note, 0)))
14508 {
14509 rtx label = JUMP_LABEL (place2);
14510
14511 if (!label)
14512 JUMP_LABEL (place2) = XEXP (note, 0);
14513 else if (LABEL_P (label))
14514 LABEL_NUSES (label)--;
14515 place2 = 0;
14516 }
14517 break;
14518
14519 case REG_NONNEG:
14520 /* This note says something about the value of a register prior
14521 to the execution of an insn. It is too much trouble to see
14522 if the note is still correct in all situations. It is better
14523 to simply delete it. */
14524 break;
14525
14526 case REG_DEAD:
14527 /* If we replaced the right hand side of FROM_INSN with a
14528 REG_EQUAL note, the original use of the dying register
14529 will not have been combined into I3 and I2. In such cases,
14530 FROM_INSN is guaranteed to be the first of the combined
14531 instructions, so we simply need to search back before
14532 FROM_INSN for the previous use or set of this register,
14533 then alter the notes there appropriately.
14534
14535 If the register is used as an input in I3, it dies there.
14536 Similarly for I2, if it is nonzero and adjacent to I3.
14537
14538 If the register is not used as an input in either I3 or I2
14539 and it is not one of the registers we were supposed to eliminate,
14540 there are two possibilities. We might have a non-adjacent I2
14541 or we might have somehow eliminated an additional register
14542 from a computation. For example, we might have had A & B where
14543 we discover that B will always be zero. In this case we will
14544 eliminate the reference to A.
14545
14546 In both cases, we must search to see if we can find a previous
14547 use of A and put the death note there. */
14548
14549 if (from_insn
14550 && from_insn == i2mod
14551 && !reg_overlap_mentioned_p (XEXP (note, 0), i2mod_new_rhs))
14552 tem_insn = from_insn;
14553 else
14554 {
14555 if (from_insn
14556 && CALL_P (from_insn)
14557 && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
14558 place = from_insn;
14559 else if (i2 && reg_set_p (XEXP (note, 0), PATTERN (i2)))
14560 {
14561 /* If the new I2 sets the same register that is marked
14562 dead in the note, we do not in general know where to
14563 put the note. One important case we _can_ handle is
14564 when the note comes from I3. */
14565 if (from_insn == i3)
14566 place = i3;
14567 else
14568 break;
14569 }
14570 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
14571 place = i3;
14572 else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
14573 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
14574 place = i2;
14575 else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
14576 && !(i2mod
14577 && reg_overlap_mentioned_p (XEXP (note, 0),
14578 i2mod_old_rhs)))
14579 || rtx_equal_p (XEXP (note, 0), elim_i1)
14580 || rtx_equal_p (XEXP (note, 0), elim_i0))
14581 break;
14582 tem_insn = i3;
14583 }
14584
14585 if (place == 0)
14586 {
14587 basic_block bb = this_basic_block;
14588
14589 for (tem_insn = PREV_INSN (tem_insn); place == 0; tem_insn = PREV_INSN (tem_insn))
14590 {
14591 if (!NONDEBUG_INSN_P (tem_insn))
14592 {
14593 if (tem_insn == BB_HEAD (bb))
14594 break;
14595 continue;
14596 }
14597
14598 /* If the register is being set at TEM_INSN, see if that is all
14599 TEM_INSN is doing. If so, delete TEM_INSN. Otherwise, make this
14600 into a REG_UNUSED note instead. Don't delete sets to
14601 global register vars. */
14602 if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
14603 || !global_regs[REGNO (XEXP (note, 0))])
14604 && reg_set_p (XEXP (note, 0), PATTERN (tem_insn)))
14605 {
14606 rtx set = single_set (tem_insn);
14607 rtx inner_dest = 0;
14608 rtx_insn *cc0_setter = NULL;
14609
14610 if (set != 0)
14611 for (inner_dest = SET_DEST (set);
14612 (GET_CODE (inner_dest) == STRICT_LOW_PART
14613 || GET_CODE (inner_dest) == SUBREG
14614 || GET_CODE (inner_dest) == ZERO_EXTRACT);
14615 inner_dest = XEXP (inner_dest, 0))
14616 ;
14617
14618 /* Verify that it was the set, and not a clobber that
14619 modified the register.
14620
14621 CC0 targets must be careful to maintain setter/user
14622 pairs. If we cannot delete the setter due to side
14623 effects, mark the user with an UNUSED note instead
14624 of deleting it. */
14625
14626 if (set != 0 && ! side_effects_p (SET_SRC (set))
14627 && rtx_equal_p (XEXP (note, 0), inner_dest)
14628 && (!HAVE_cc0
14629 || (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
14630 || ((cc0_setter = prev_cc0_setter (tem_insn)) != NULL
14631 && sets_cc0_p (PATTERN (cc0_setter)) > 0))))
14632 {
14633 /* Move the notes and links of TEM_INSN elsewhere.
14634 This might delete other dead insns recursively.
14635 First set the pattern to something that won't use
14636 any register. */
14637 rtx old_notes = REG_NOTES (tem_insn);
14638
14639 PATTERN (tem_insn) = pc_rtx;
14640 REG_NOTES (tem_insn) = NULL;
14641
14642 distribute_notes (old_notes, tem_insn, tem_insn, NULL,
14643 NULL_RTX, NULL_RTX, NULL_RTX);
14644 distribute_links (LOG_LINKS (tem_insn));
14645
14646 unsigned int regno = REGNO (XEXP (note, 0));
14647 reg_stat_type *rsp = &reg_stat[regno];
14648 if (rsp->last_set == tem_insn)
14649 record_value_for_reg (XEXP (note, 0), NULL, NULL_RTX);
14650
14651 SET_INSN_DELETED (tem_insn);
14652 if (tem_insn == i2)
14653 i2 = NULL;
14654
14655 /* Delete the setter too. */
14656 if (cc0_setter)
14657 {
14658 PATTERN (cc0_setter) = pc_rtx;
14659 old_notes = REG_NOTES (cc0_setter);
14660 REG_NOTES (cc0_setter) = NULL;
14661
14662 distribute_notes (old_notes, cc0_setter,
14663 cc0_setter, NULL,
14664 NULL_RTX, NULL_RTX, NULL_RTX);
14665 distribute_links (LOG_LINKS (cc0_setter));
14666
14667 SET_INSN_DELETED (cc0_setter);
14668 if (cc0_setter == i2)
14669 i2 = NULL;
14670 }
14671 }
14672 else
14673 {
14674 PUT_REG_NOTE_KIND (note, REG_UNUSED);
14675
14676 /* If there isn't already a REG_UNUSED note, put one
14677 here. Do not place a REG_DEAD note, even if
14678 the register is also used here; that would not
14679 match the algorithm used in lifetime analysis
14680 and can cause the consistency check in the
14681 scheduler to fail. */
14682 if (! find_regno_note (tem_insn, REG_UNUSED,
14683 REGNO (XEXP (note, 0))))
14684 place = tem_insn;
14685 break;
14686 }
14687 }
14688 else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem_insn))
14689 || (CALL_P (tem_insn)
14690 && find_reg_fusage (tem_insn, USE, XEXP (note, 0))))
14691 {
14692 place = tem_insn;
14693
14694 /* If we are doing a 3->2 combination, and we have a
14695 register which formerly died in i3 and was not used
14696 by i2, which now no longer dies in i3 and is used in
14697 i2 but does not die in i2, and place is between i2
14698 and i3, then we may need to move a link from place to
14699 i2. */
14700 if (i2 && DF_INSN_LUID (place) > DF_INSN_LUID (i2)
14701 && from_insn
14702 && DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2)
14703 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
14704 {
14705 struct insn_link *links = LOG_LINKS (place);
14706 LOG_LINKS (place) = NULL;
14707 distribute_links (links);
14708 }
14709 break;
14710 }
14711
14712 if (tem_insn == BB_HEAD (bb))
14713 break;
14714 }
14715
14716 }
14717
14718 /* If the register is set or already dead at PLACE, we needn't do
14719 anything with this note if it is still a REG_DEAD note.
14720 We check here if it is set at all, not if is it totally replaced,
14721 which is what `dead_or_set_p' checks, so also check for it being
14722 set partially. */
14723
14724 if (place && REG_NOTE_KIND (note) == REG_DEAD)
14725 {
14726 unsigned int regno = REGNO (XEXP (note, 0));
14727 reg_stat_type *rsp = &reg_stat[regno];
14728
14729 if (dead_or_set_p (place, XEXP (note, 0))
14730 || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
14731 {
14732 /* Unless the register previously died in PLACE, clear
14733 last_death. [I no longer understand why this is
14734 being done.] */
14735 if (rsp->last_death != place)
14736 rsp->last_death = 0;
14737 place = 0;
14738 }
14739 else
14740 rsp->last_death = place;
14741
14742 /* If this is a death note for a hard reg that is occupying
14743 multiple registers, ensure that we are still using all
14744 parts of the object. If we find a piece of the object
14745 that is unused, we must arrange for an appropriate REG_DEAD
14746 note to be added for it. However, we can't just emit a USE
14747 and tag the note to it, since the register might actually
14748 be dead; so we recourse, and the recursive call then finds
14749 the previous insn that used this register. */
14750
14751 if (place && REG_NREGS (XEXP (note, 0)) > 1)
14752 {
14753 unsigned int endregno = END_REGNO (XEXP (note, 0));
14754 bool all_used = true;
14755 unsigned int i;
14756
14757 for (i = regno; i < endregno; i++)
14758 if ((! refers_to_regno_p (i, PATTERN (place))
14759 && ! find_regno_fusage (place, USE, i))
14760 || dead_or_set_regno_p (place, i))
14761 {
14762 all_used = false;
14763 break;
14764 }
14765
14766 if (! all_used)
14767 {
14768 /* Put only REG_DEAD notes for pieces that are
14769 not already dead or set. */
14770
14771 for (i = regno; i < endregno;
14772 i += hard_regno_nregs (i, reg_raw_mode[i]))
14773 {
14774 rtx piece = regno_reg_rtx[i];
14775 basic_block bb = this_basic_block;
14776
14777 if (! dead_or_set_p (place, piece)
14778 && ! reg_bitfield_target_p (piece,
14779 PATTERN (place)))
14780 {
14781 rtx new_note = alloc_reg_note (REG_DEAD, piece,
14782 NULL_RTX);
14783
14784 distribute_notes (new_note, place, place,
14785 NULL, NULL_RTX, NULL_RTX,
14786 NULL_RTX);
14787 }
14788 else if (! refers_to_regno_p (i, PATTERN (place))
14789 && ! find_regno_fusage (place, USE, i))
14790 for (tem_insn = PREV_INSN (place); ;
14791 tem_insn = PREV_INSN (tem_insn))
14792 {
14793 if (!NONDEBUG_INSN_P (tem_insn))
14794 {
14795 if (tem_insn == BB_HEAD (bb))
14796 break;
14797 continue;
14798 }
14799 if (dead_or_set_p (tem_insn, piece)
14800 || reg_bitfield_target_p (piece,
14801 PATTERN (tem_insn)))
14802 {
14803 add_reg_note (tem_insn, REG_UNUSED, piece);
14804 break;
14805 }
14806 }
14807 }
14808
14809 place = 0;
14810 }
14811 }
14812 }
14813 break;
14814
14815 default:
14816 /* Any other notes should not be present at this point in the
14817 compilation. */
14818 gcc_unreachable ();
14819 }
14820
14821 if (place)
14822 {
14823 XEXP (note, 1) = REG_NOTES (place);
14824 REG_NOTES (place) = note;
14825
14826 /* Set added_notes_insn to the earliest insn we added a note to. */
14827 if (added_notes_insn == 0
14828 || DF_INSN_LUID (added_notes_insn) > DF_INSN_LUID (place))
14829 added_notes_insn = place;
14830 }
14831
14832 if (place2)
14833 {
14834 add_shallow_copy_of_reg_note (place2, note);
14835
14836 /* Set added_notes_insn to the earliest insn we added a note to. */
14837 if (added_notes_insn == 0
14838 || DF_INSN_LUID (added_notes_insn) > DF_INSN_LUID (place2))
14839 added_notes_insn = place2;
14840 }
14841 }
14842 }
14843 \f
14844 /* Similarly to above, distribute the LOG_LINKS that used to be present on
14845 I3, I2, and I1 to new locations. This is also called to add a link
14846 pointing at I3 when I3's destination is changed. */
14847
14848 static void
14849 distribute_links (struct insn_link *links)
14850 {
14851 struct insn_link *link, *next_link;
14852
14853 for (link = links; link; link = next_link)
14854 {
14855 rtx_insn *place = 0;
14856 rtx_insn *insn;
14857 rtx set, reg;
14858
14859 next_link = link->next;
14860
14861 /* If the insn that this link points to is a NOTE, ignore it. */
14862 if (NOTE_P (link->insn))
14863 continue;
14864
14865 set = 0;
14866 rtx pat = PATTERN (link->insn);
14867 if (GET_CODE (pat) == SET)
14868 set = pat;
14869 else if (GET_CODE (pat) == PARALLEL)
14870 {
14871 int i;
14872 for (i = 0; i < XVECLEN (pat, 0); i++)
14873 {
14874 set = XVECEXP (pat, 0, i);
14875 if (GET_CODE (set) != SET)
14876 continue;
14877
14878 reg = SET_DEST (set);
14879 while (GET_CODE (reg) == ZERO_EXTRACT
14880 || GET_CODE (reg) == STRICT_LOW_PART
14881 || GET_CODE (reg) == SUBREG)
14882 reg = XEXP (reg, 0);
14883
14884 if (!REG_P (reg))
14885 continue;
14886
14887 if (REGNO (reg) == link->regno)
14888 break;
14889 }
14890 if (i == XVECLEN (pat, 0))
14891 continue;
14892 }
14893 else
14894 continue;
14895
14896 reg = SET_DEST (set);
14897
14898 while (GET_CODE (reg) == ZERO_EXTRACT
14899 || GET_CODE (reg) == STRICT_LOW_PART
14900 || GET_CODE (reg) == SUBREG)
14901 reg = XEXP (reg, 0);
14902
14903 if (reg == pc_rtx)
14904 continue;
14905
14906 /* A LOG_LINK is defined as being placed on the first insn that uses
14907 a register and points to the insn that sets the register. Start
14908 searching at the next insn after the target of the link and stop
14909 when we reach a set of the register or the end of the basic block.
14910
14911 Note that this correctly handles the link that used to point from
14912 I3 to I2. Also note that not much searching is typically done here
14913 since most links don't point very far away. */
14914
14915 for (insn = NEXT_INSN (link->insn);
14916 (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
14917 || BB_HEAD (this_basic_block->next_bb) != insn));
14918 insn = NEXT_INSN (insn))
14919 if (DEBUG_INSN_P (insn))
14920 continue;
14921 else if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
14922 {
14923 if (reg_referenced_p (reg, PATTERN (insn)))
14924 place = insn;
14925 break;
14926 }
14927 else if (CALL_P (insn)
14928 && find_reg_fusage (insn, USE, reg))
14929 {
14930 place = insn;
14931 break;
14932 }
14933 else if (INSN_P (insn) && reg_set_p (reg, insn))
14934 break;
14935
14936 /* If we found a place to put the link, place it there unless there
14937 is already a link to the same insn as LINK at that point. */
14938
14939 if (place)
14940 {
14941 struct insn_link *link2;
14942
14943 FOR_EACH_LOG_LINK (link2, place)
14944 if (link2->insn == link->insn && link2->regno == link->regno)
14945 break;
14946
14947 if (link2 == NULL)
14948 {
14949 link->next = LOG_LINKS (place);
14950 LOG_LINKS (place) = link;
14951
14952 /* Set added_links_insn to the earliest insn we added a
14953 link to. */
14954 if (added_links_insn == 0
14955 || DF_INSN_LUID (added_links_insn) > DF_INSN_LUID (place))
14956 added_links_insn = place;
14957 }
14958 }
14959 }
14960 }
14961 \f
14962 /* Check for any register or memory mentioned in EQUIV that is not
14963 mentioned in EXPR. This is used to restrict EQUIV to "specializations"
14964 of EXPR where some registers may have been replaced by constants. */
14965
14966 static bool
14967 unmentioned_reg_p (rtx equiv, rtx expr)
14968 {
14969 subrtx_iterator::array_type array;
14970 FOR_EACH_SUBRTX (iter, array, equiv, NONCONST)
14971 {
14972 const_rtx x = *iter;
14973 if ((REG_P (x) || MEM_P (x))
14974 && !reg_mentioned_p (x, expr))
14975 return true;
14976 }
14977 return false;
14978 }
14979 \f
14980 DEBUG_FUNCTION void
14981 dump_combine_stats (FILE *file)
14982 {
14983 fprintf
14984 (file,
14985 ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
14986 combine_attempts, combine_merges, combine_extras, combine_successes);
14987 }
14988
14989 void
14990 dump_combine_total_stats (FILE *file)
14991 {
14992 fprintf
14993 (file,
14994 "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
14995 total_attempts, total_merges, total_extras, total_successes);
14996 }
14997 \f
14998 /* Make pseudo-to-pseudo copies after every hard-reg-to-pseudo-copy, because
14999 the reg-to-reg copy can usefully combine with later instructions, but we
15000 do not want to combine the hard reg into later instructions, for that
15001 restricts register allocation. */
15002 static void
15003 make_more_copies (void)
15004 {
15005 basic_block bb;
15006
15007 FOR_EACH_BB_FN (bb, cfun)
15008 {
15009 rtx_insn *insn;
15010
15011 FOR_BB_INSNS (bb, insn)
15012 {
15013 if (!NONDEBUG_INSN_P (insn))
15014 continue;
15015
15016 rtx set = single_set (insn);
15017 if (!set)
15018 continue;
15019
15020 rtx dest = SET_DEST (set);
15021 if (!(REG_P (dest) && !HARD_REGISTER_P (dest)))
15022 continue;
15023
15024 rtx src = SET_SRC (set);
15025 if (!(REG_P (src) && HARD_REGISTER_P (src)))
15026 continue;
15027 if (TEST_HARD_REG_BIT (fixed_reg_set, REGNO (src)))
15028 continue;
15029
15030 rtx new_reg = gen_reg_rtx (GET_MODE (dest));
15031 rtx_insn *new_insn = gen_move_insn (new_reg, src);
15032 SET_SRC (set) = new_reg;
15033 emit_insn_before (new_insn, insn);
15034 df_insn_rescan (insn);
15035 }
15036 }
15037 }
15038
15039 /* Try combining insns through substitution. */
15040 static unsigned int
15041 rest_of_handle_combine (void)
15042 {
15043 make_more_copies ();
15044
15045 df_set_flags (DF_LR_RUN_DCE + DF_DEFER_INSN_RESCAN);
15046 df_note_add_problem ();
15047 df_analyze ();
15048
15049 regstat_init_n_sets_and_refs ();
15050 reg_n_sets_max = max_reg_num ();
15051
15052 int rebuild_jump_labels_after_combine
15053 = combine_instructions (get_insns (), max_reg_num ());
15054
15055 /* Combining insns may have turned an indirect jump into a
15056 direct jump. Rebuild the JUMP_LABEL fields of jumping
15057 instructions. */
15058 if (rebuild_jump_labels_after_combine)
15059 {
15060 if (dom_info_available_p (CDI_DOMINATORS))
15061 free_dominance_info (CDI_DOMINATORS);
15062 timevar_push (TV_JUMP);
15063 rebuild_jump_labels (get_insns ());
15064 cleanup_cfg (0);
15065 timevar_pop (TV_JUMP);
15066 }
15067
15068 regstat_free_n_sets_and_refs ();
15069 return 0;
15070 }
15071
15072 namespace {
15073
15074 const pass_data pass_data_combine =
15075 {
15076 RTL_PASS, /* type */
15077 "combine", /* name */
15078 OPTGROUP_NONE, /* optinfo_flags */
15079 TV_COMBINE, /* tv_id */
15080 PROP_cfglayout, /* properties_required */
15081 0, /* properties_provided */
15082 0, /* properties_destroyed */
15083 0, /* todo_flags_start */
15084 TODO_df_finish, /* todo_flags_finish */
15085 };
15086
15087 class pass_combine : public rtl_opt_pass
15088 {
15089 public:
15090 pass_combine (gcc::context *ctxt)
15091 : rtl_opt_pass (pass_data_combine, ctxt)
15092 {}
15093
15094 /* opt_pass methods: */
15095 virtual bool gate (function *) { return (optimize > 0); }
15096 virtual unsigned int execute (function *)
15097 {
15098 return rest_of_handle_combine ();
15099 }
15100
15101 }; // class pass_combine
15102
15103 } // anon namespace
15104
15105 rtl_opt_pass *
15106 make_pass_combine (gcc::context *ctxt)
15107 {
15108 return new pass_combine (ctxt);
15109 }