re PR c++/60572 (ICE deriving from class with invalid member)
[gcc.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2 Copyright (C) 1987-2014 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 of success.
35
36 LOG_LINKS does not have links for use of the CC0. They don't
37 need to, because the insn that sets the CC0 is always immediately
38 before the insn that tests it. So we always regard a branch
39 insn as having a logical link to the preceding insn. The same is true
40 for an insn explicitly using CC0.
41
42 We check (with use_crosses_set_p) to avoid combining in such a way
43 as to move a computation to a place where its value would be different.
44
45 Combination is done by mathematically substituting the previous
46 insn(s) values for the regs they set into the expressions in
47 the later insns that refer to these regs. If the result is a valid insn
48 for our target machine, according to the machine description,
49 we install it, delete the earlier insns, and update the data flow
50 information (LOG_LINKS and REG_NOTES) for what we did.
51
52 There are a few exceptions where the dataflow information isn't
53 completely updated (however this is only a local issue since it is
54 regenerated before the next pass that uses it):
55
56 - reg_live_length is not updated
57 - reg_n_refs is not adjusted in the rare case when a register is
58 no longer required in a computation
59 - there are extremely rare cases (see distribute_notes) when a
60 REG_DEAD note is lost
61 - a LOG_LINKS entry that refers to an insn with multiple SETs may be
62 removed because there is no way to know which register it was
63 linking
64
65 To simplify substitution, we combine only when the earlier insn(s)
66 consist of only a single assignment. To simplify updating afterward,
67 we never combine when a subroutine call appears in the middle.
68
69 Since we do not represent assignments to CC0 explicitly except when that
70 is all an insn does, there is no LOG_LINKS entry in an insn that uses
71 the condition code for the insn that set the condition code.
72 Fortunately, these two insns must be consecutive.
73 Therefore, every JUMP_INSN is taken to have an implicit logical link
74 to the preceding insn. This is not quite right, since non-jumps can
75 also use the condition code; but in practice such insns would not
76 combine anyway. */
77
78 #include "config.h"
79 #include "system.h"
80 #include "coretypes.h"
81 #include "tm.h"
82 #include "rtl.h"
83 #include "tree.h"
84 #include "stor-layout.h"
85 #include "tm_p.h"
86 #include "flags.h"
87 #include "regs.h"
88 #include "hard-reg-set.h"
89 #include "basic-block.h"
90 #include "insn-config.h"
91 #include "function.h"
92 /* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
93 #include "expr.h"
94 #include "insn-attr.h"
95 #include "recog.h"
96 #include "diagnostic-core.h"
97 #include "target.h"
98 #include "optabs.h"
99 #include "insn-codes.h"
100 #include "rtlhooks-def.h"
101 #include "params.h"
102 #include "tree-pass.h"
103 #include "df.h"
104 #include "valtrack.h"
105 #include "cgraph.h"
106 #include "obstack.h"
107
108 /* Number of attempts to combine instructions in this function. */
109
110 static int combine_attempts;
111
112 /* Number of attempts that got as far as substitution in this function. */
113
114 static int combine_merges;
115
116 /* Number of instructions combined with added SETs in this function. */
117
118 static int combine_extras;
119
120 /* Number of instructions combined in this function. */
121
122 static int combine_successes;
123
124 /* Totals over entire compilation. */
125
126 static int total_attempts, total_merges, total_extras, total_successes;
127
128 /* combine_instructions may try to replace the right hand side of the
129 second instruction with the value of an associated REG_EQUAL note
130 before throwing it at try_combine. That is problematic when there
131 is a REG_DEAD note for a register used in the old right hand side
132 and can cause distribute_notes to do wrong things. This is the
133 second instruction if it has been so modified, null otherwise. */
134
135 static rtx i2mod;
136
137 /* When I2MOD is nonnull, this is a copy of the old right hand side. */
138
139 static rtx i2mod_old_rhs;
140
141 /* When I2MOD is nonnull, this is a copy of the new right hand side. */
142
143 static rtx i2mod_new_rhs;
144 \f
145 typedef struct reg_stat_struct {
146 /* Record last point of death of (hard or pseudo) register n. */
147 rtx last_death;
148
149 /* Record last point of modification of (hard or pseudo) register n. */
150 rtx last_set;
151
152 /* The next group of fields allows the recording of the last value assigned
153 to (hard or pseudo) register n. We use this information to see if an
154 operation being processed is redundant given a prior operation performed
155 on the register. For example, an `and' with a constant is redundant if
156 all the zero bits are already known to be turned off.
157
158 We use an approach similar to that used by cse, but change it in the
159 following ways:
160
161 (1) We do not want to reinitialize at each label.
162 (2) It is useful, but not critical, to know the actual value assigned
163 to a register. Often just its form is helpful.
164
165 Therefore, we maintain the following fields:
166
167 last_set_value the last value assigned
168 last_set_label records the value of label_tick when the
169 register was assigned
170 last_set_table_tick records the value of label_tick when a
171 value using the register is assigned
172 last_set_invalid set to nonzero when it is not valid
173 to use the value of this register in some
174 register's value
175
176 To understand the usage of these tables, it is important to understand
177 the distinction between the value in last_set_value being valid and
178 the register being validly contained in some other expression in the
179 table.
180
181 (The next two parameters are out of date).
182
183 reg_stat[i].last_set_value is valid if it is nonzero, and either
184 reg_n_sets[i] is 1 or reg_stat[i].last_set_label == label_tick.
185
186 Register I may validly appear in any expression returned for the value
187 of another register if reg_n_sets[i] is 1. It may also appear in the
188 value for register J if reg_stat[j].last_set_invalid is zero, or
189 reg_stat[i].last_set_label < reg_stat[j].last_set_label.
190
191 If an expression is found in the table containing a register which may
192 not validly appear in an expression, the register is replaced by
193 something that won't match, (clobber (const_int 0)). */
194
195 /* Record last value assigned to (hard or pseudo) register n. */
196
197 rtx last_set_value;
198
199 /* Record the value of label_tick when an expression involving register n
200 is placed in last_set_value. */
201
202 int last_set_table_tick;
203
204 /* Record the value of label_tick when the value for register n is placed in
205 last_set_value. */
206
207 int last_set_label;
208
209 /* These fields are maintained in parallel with last_set_value and are
210 used to store the mode in which the register was last set, the bits
211 that were known to be zero when it was last set, and the number of
212 sign bits copies it was known to have when it was last set. */
213
214 unsigned HOST_WIDE_INT last_set_nonzero_bits;
215 char last_set_sign_bit_copies;
216 ENUM_BITFIELD(machine_mode) last_set_mode : 8;
217
218 /* Set nonzero if references to register n in expressions should not be
219 used. last_set_invalid is set nonzero when this register is being
220 assigned to and last_set_table_tick == label_tick. */
221
222 char last_set_invalid;
223
224 /* Some registers that are set more than once and used in more than one
225 basic block are nevertheless always set in similar ways. For example,
226 a QImode register may be loaded from memory in two places on a machine
227 where byte loads zero extend.
228
229 We record in the following fields if a register has some leading bits
230 that are always equal to the sign bit, and what we know about the
231 nonzero bits of a register, specifically which bits are known to be
232 zero.
233
234 If an entry is zero, it means that we don't know anything special. */
235
236 unsigned char sign_bit_copies;
237
238 unsigned HOST_WIDE_INT nonzero_bits;
239
240 /* Record the value of the label_tick when the last truncation
241 happened. The field truncated_to_mode is only valid if
242 truncation_label == label_tick. */
243
244 int truncation_label;
245
246 /* Record the last truncation seen for this register. If truncation
247 is not a nop to this mode we might be able to save an explicit
248 truncation if we know that value already contains a truncated
249 value. */
250
251 ENUM_BITFIELD(machine_mode) truncated_to_mode : 8;
252 } reg_stat_type;
253
254
255 static vec<reg_stat_type> reg_stat;
256
257 /* Record the luid of the last insn that invalidated memory
258 (anything that writes memory, and subroutine calls, but not pushes). */
259
260 static int mem_last_set;
261
262 /* Record the luid of the last CALL_INSN
263 so we can tell whether a potential combination crosses any calls. */
264
265 static int last_call_luid;
266
267 /* When `subst' is called, this is the insn that is being modified
268 (by combining in a previous insn). The PATTERN of this insn
269 is still the old pattern partially modified and it should not be
270 looked at, but this may be used to examine the successors of the insn
271 to judge whether a simplification is valid. */
272
273 static rtx subst_insn;
274
275 /* This is the lowest LUID that `subst' is currently dealing with.
276 get_last_value will not return a value if the register was set at or
277 after this LUID. If not for this mechanism, we could get confused if
278 I2 or I1 in try_combine were an insn that used the old value of a register
279 to obtain a new value. In that case, we might erroneously get the
280 new value of the register when we wanted the old one. */
281
282 static int subst_low_luid;
283
284 /* This contains any hard registers that are used in newpat; reg_dead_at_p
285 must consider all these registers to be always live. */
286
287 static HARD_REG_SET newpat_used_regs;
288
289 /* This is an insn to which a LOG_LINKS entry has been added. If this
290 insn is the earlier than I2 or I3, combine should rescan starting at
291 that location. */
292
293 static rtx added_links_insn;
294
295 /* Basic block in which we are performing combines. */
296 static basic_block this_basic_block;
297 static bool optimize_this_for_speed_p;
298
299 \f
300 /* Length of the currently allocated uid_insn_cost array. */
301
302 static int max_uid_known;
303
304 /* The following array records the insn_rtx_cost for every insn
305 in the instruction stream. */
306
307 static int *uid_insn_cost;
308
309 /* The following array records the LOG_LINKS for every insn in the
310 instruction stream as struct insn_link pointers. */
311
312 struct insn_link {
313 rtx insn;
314 struct insn_link *next;
315 };
316
317 static struct insn_link **uid_log_links;
318
319 #define INSN_COST(INSN) (uid_insn_cost[INSN_UID (INSN)])
320 #define LOG_LINKS(INSN) (uid_log_links[INSN_UID (INSN)])
321
322 #define FOR_EACH_LOG_LINK(L, INSN) \
323 for ((L) = LOG_LINKS (INSN); (L); (L) = (L)->next)
324
325 /* Links for LOG_LINKS are allocated from this obstack. */
326
327 static struct obstack insn_link_obstack;
328
329 /* Allocate a link. */
330
331 static inline struct insn_link *
332 alloc_insn_link (rtx insn, struct insn_link *next)
333 {
334 struct insn_link *l
335 = (struct insn_link *) obstack_alloc (&insn_link_obstack,
336 sizeof (struct insn_link));
337 l->insn = insn;
338 l->next = next;
339 return l;
340 }
341
342 /* Incremented for each basic block. */
343
344 static int label_tick;
345
346 /* Reset to label_tick for each extended basic block in scanning order. */
347
348 static int label_tick_ebb_start;
349
350 /* Mode used to compute significance in reg_stat[].nonzero_bits. It is the
351 largest integer mode that can fit in HOST_BITS_PER_WIDE_INT. */
352
353 static enum machine_mode nonzero_bits_mode;
354
355 /* Nonzero when reg_stat[].nonzero_bits and reg_stat[].sign_bit_copies can
356 be safely used. It is zero while computing them and after combine has
357 completed. This former test prevents propagating values based on
358 previously set values, which can be incorrect if a variable is modified
359 in a loop. */
360
361 static int nonzero_sign_valid;
362
363 \f
364 /* Record one modification to rtl structure
365 to be undone by storing old_contents into *where. */
366
367 enum undo_kind { UNDO_RTX, UNDO_INT, UNDO_MODE, UNDO_LINKS };
368
369 struct undo
370 {
371 struct undo *next;
372 enum undo_kind kind;
373 union { rtx r; int i; enum machine_mode m; struct insn_link *l; } old_contents;
374 union { rtx *r; int *i; struct insn_link **l; } where;
375 };
376
377 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
378 num_undo says how many are currently recorded.
379
380 other_insn is nonzero if we have modified some other insn in the process
381 of working on subst_insn. It must be verified too. */
382
383 struct undobuf
384 {
385 struct undo *undos;
386 struct undo *frees;
387 rtx other_insn;
388 };
389
390 static struct undobuf undobuf;
391
392 /* Number of times the pseudo being substituted for
393 was found and replaced. */
394
395 static int n_occurrences;
396
397 static rtx reg_nonzero_bits_for_combine (const_rtx, enum machine_mode, const_rtx,
398 enum machine_mode,
399 unsigned HOST_WIDE_INT,
400 unsigned HOST_WIDE_INT *);
401 static rtx reg_num_sign_bit_copies_for_combine (const_rtx, enum machine_mode, const_rtx,
402 enum machine_mode,
403 unsigned int, unsigned int *);
404 static void do_SUBST (rtx *, rtx);
405 static void do_SUBST_INT (int *, int);
406 static void init_reg_last (void);
407 static void setup_incoming_promotions (rtx);
408 static void set_nonzero_bits_and_sign_copies (rtx, const_rtx, void *);
409 static int cant_combine_insn_p (rtx);
410 static int can_combine_p (rtx, rtx, rtx, rtx, rtx, rtx, rtx *, rtx *);
411 static int combinable_i3pat (rtx, rtx *, rtx, rtx, rtx, int, int, rtx *);
412 static int contains_muldiv (rtx);
413 static rtx try_combine (rtx, rtx, rtx, rtx, int *, rtx);
414 static void undo_all (void);
415 static void undo_commit (void);
416 static rtx *find_split_point (rtx *, rtx, bool);
417 static rtx subst (rtx, rtx, rtx, int, int, int);
418 static rtx combine_simplify_rtx (rtx, enum machine_mode, int, int);
419 static rtx simplify_if_then_else (rtx);
420 static rtx simplify_set (rtx);
421 static rtx simplify_logical (rtx);
422 static rtx expand_compound_operation (rtx);
423 static const_rtx expand_field_assignment (const_rtx);
424 static rtx make_extraction (enum machine_mode, rtx, HOST_WIDE_INT,
425 rtx, unsigned HOST_WIDE_INT, int, int, int);
426 static rtx extract_left_shift (rtx, int);
427 static int get_pos_from_mask (unsigned HOST_WIDE_INT,
428 unsigned HOST_WIDE_INT *);
429 static rtx canon_reg_for_combine (rtx, rtx);
430 static rtx force_to_mode (rtx, enum machine_mode,
431 unsigned HOST_WIDE_INT, int);
432 static rtx if_then_else_cond (rtx, rtx *, rtx *);
433 static rtx known_cond (rtx, enum rtx_code, rtx, rtx);
434 static int rtx_equal_for_field_assignment_p (rtx, rtx);
435 static rtx make_field_assignment (rtx);
436 static rtx apply_distributive_law (rtx);
437 static rtx distribute_and_simplify_rtx (rtx, int);
438 static rtx simplify_and_const_int_1 (enum machine_mode, rtx,
439 unsigned HOST_WIDE_INT);
440 static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
441 unsigned HOST_WIDE_INT);
442 static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
443 HOST_WIDE_INT, enum machine_mode, int *);
444 static rtx simplify_shift_const_1 (enum rtx_code, enum machine_mode, rtx, int);
445 static rtx simplify_shift_const (rtx, enum rtx_code, enum machine_mode, rtx,
446 int);
447 static int recog_for_combine (rtx *, rtx, rtx *);
448 static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
449 static enum rtx_code simplify_compare_const (enum rtx_code, rtx, rtx *);
450 static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
451 static void update_table_tick (rtx);
452 static void record_value_for_reg (rtx, rtx, rtx);
453 static void check_promoted_subreg (rtx, rtx);
454 static void record_dead_and_set_regs_1 (rtx, const_rtx, void *);
455 static void record_dead_and_set_regs (rtx);
456 static int get_last_value_validate (rtx *, rtx, int, int);
457 static rtx get_last_value (const_rtx);
458 static int use_crosses_set_p (const_rtx, int);
459 static void reg_dead_at_p_1 (rtx, const_rtx, void *);
460 static int reg_dead_at_p (rtx, rtx);
461 static void move_deaths (rtx, rtx, int, rtx, rtx *);
462 static int reg_bitfield_target_p (rtx, rtx);
463 static void distribute_notes (rtx, rtx, rtx, rtx, rtx, rtx, rtx);
464 static void distribute_links (struct insn_link *);
465 static void mark_used_regs_combine (rtx);
466 static void record_promoted_value (rtx, rtx);
467 static int unmentioned_reg_p_1 (rtx *, void *);
468 static bool unmentioned_reg_p (rtx, rtx);
469 static int record_truncated_value (rtx *, void *);
470 static void record_truncated_values (rtx *, void *);
471 static bool reg_truncated_to_mode (enum machine_mode, const_rtx);
472 static rtx gen_lowpart_or_truncate (enum machine_mode, rtx);
473 \f
474
475 /* It is not safe to use ordinary gen_lowpart in combine.
476 See comments in gen_lowpart_for_combine. */
477 #undef RTL_HOOKS_GEN_LOWPART
478 #define RTL_HOOKS_GEN_LOWPART gen_lowpart_for_combine
479
480 /* Our implementation of gen_lowpart never emits a new pseudo. */
481 #undef RTL_HOOKS_GEN_LOWPART_NO_EMIT
482 #define RTL_HOOKS_GEN_LOWPART_NO_EMIT gen_lowpart_for_combine
483
484 #undef RTL_HOOKS_REG_NONZERO_REG_BITS
485 #define RTL_HOOKS_REG_NONZERO_REG_BITS reg_nonzero_bits_for_combine
486
487 #undef RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES
488 #define RTL_HOOKS_REG_NUM_SIGN_BIT_COPIES reg_num_sign_bit_copies_for_combine
489
490 #undef RTL_HOOKS_REG_TRUNCATED_TO_MODE
491 #define RTL_HOOKS_REG_TRUNCATED_TO_MODE reg_truncated_to_mode
492
493 static const struct rtl_hooks combine_rtl_hooks = RTL_HOOKS_INITIALIZER;
494
495 \f
496 /* Convenience wrapper for the canonicalize_comparison target hook.
497 Target hooks cannot use enum rtx_code. */
498 static inline void
499 target_canonicalize_comparison (enum rtx_code *code, rtx *op0, rtx *op1,
500 bool op0_preserve_value)
501 {
502 int code_int = (int)*code;
503 targetm.canonicalize_comparison (&code_int, op0, op1, op0_preserve_value);
504 *code = (enum rtx_code)code_int;
505 }
506
507 /* Try to split PATTERN found in INSN. This returns NULL_RTX if
508 PATTERN can not be split. Otherwise, it returns an insn sequence.
509 This is a wrapper around split_insns which ensures that the
510 reg_stat vector is made larger if the splitter creates a new
511 register. */
512
513 static rtx
514 combine_split_insns (rtx pattern, rtx insn)
515 {
516 rtx ret;
517 unsigned int nregs;
518
519 ret = split_insns (pattern, insn);
520 nregs = max_reg_num ();
521 if (nregs > reg_stat.length ())
522 reg_stat.safe_grow_cleared (nregs);
523 return ret;
524 }
525
526 /* This is used by find_single_use to locate an rtx in LOC that
527 contains exactly one use of DEST, which is typically either a REG
528 or CC0. It returns a pointer to the innermost rtx expression
529 containing DEST. Appearances of DEST that are being used to
530 totally replace it are not counted. */
531
532 static rtx *
533 find_single_use_1 (rtx dest, rtx *loc)
534 {
535 rtx x = *loc;
536 enum rtx_code code = GET_CODE (x);
537 rtx *result = NULL;
538 rtx *this_result;
539 int i;
540 const char *fmt;
541
542 switch (code)
543 {
544 case CONST:
545 case LABEL_REF:
546 case SYMBOL_REF:
547 CASE_CONST_ANY:
548 case CLOBBER:
549 return 0;
550
551 case SET:
552 /* If the destination is anything other than CC0, PC, a REG or a SUBREG
553 of a REG that occupies all of the REG, the insn uses DEST if
554 it is mentioned in the destination or the source. Otherwise, we
555 need just check the source. */
556 if (GET_CODE (SET_DEST (x)) != CC0
557 && GET_CODE (SET_DEST (x)) != PC
558 && !REG_P (SET_DEST (x))
559 && ! (GET_CODE (SET_DEST (x)) == SUBREG
560 && REG_P (SUBREG_REG (SET_DEST (x)))
561 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
562 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
563 == ((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
564 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
565 break;
566
567 return find_single_use_1 (dest, &SET_SRC (x));
568
569 case MEM:
570 case SUBREG:
571 return find_single_use_1 (dest, &XEXP (x, 0));
572
573 default:
574 break;
575 }
576
577 /* If it wasn't one of the common cases above, check each expression and
578 vector of this code. Look for a unique usage of DEST. */
579
580 fmt = GET_RTX_FORMAT (code);
581 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
582 {
583 if (fmt[i] == 'e')
584 {
585 if (dest == XEXP (x, i)
586 || (REG_P (dest) && REG_P (XEXP (x, i))
587 && REGNO (dest) == REGNO (XEXP (x, i))))
588 this_result = loc;
589 else
590 this_result = find_single_use_1 (dest, &XEXP (x, i));
591
592 if (result == NULL)
593 result = this_result;
594 else if (this_result)
595 /* Duplicate usage. */
596 return NULL;
597 }
598 else if (fmt[i] == 'E')
599 {
600 int j;
601
602 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
603 {
604 if (XVECEXP (x, i, j) == dest
605 || (REG_P (dest)
606 && REG_P (XVECEXP (x, i, j))
607 && REGNO (XVECEXP (x, i, j)) == REGNO (dest)))
608 this_result = loc;
609 else
610 this_result = find_single_use_1 (dest, &XVECEXP (x, i, j));
611
612 if (result == NULL)
613 result = this_result;
614 else if (this_result)
615 return NULL;
616 }
617 }
618 }
619
620 return result;
621 }
622
623
624 /* See if DEST, produced in INSN, is used only a single time in the
625 sequel. If so, return a pointer to the innermost rtx expression in which
626 it is used.
627
628 If PLOC is nonzero, *PLOC is set to the insn containing the single use.
629
630 If DEST is cc0_rtx, we look only at the next insn. In that case, we don't
631 care about REG_DEAD notes or LOG_LINKS.
632
633 Otherwise, we find the single use by finding an insn that has a
634 LOG_LINKS pointing at INSN and has a REG_DEAD note for DEST. If DEST is
635 only referenced once in that insn, we know that it must be the first
636 and last insn referencing DEST. */
637
638 static rtx *
639 find_single_use (rtx dest, rtx insn, rtx *ploc)
640 {
641 basic_block bb;
642 rtx next;
643 rtx *result;
644 struct insn_link *link;
645
646 #ifdef HAVE_cc0
647 if (dest == cc0_rtx)
648 {
649 next = NEXT_INSN (insn);
650 if (next == 0
651 || (!NONJUMP_INSN_P (next) && !JUMP_P (next)))
652 return 0;
653
654 result = find_single_use_1 (dest, &PATTERN (next));
655 if (result && ploc)
656 *ploc = next;
657 return result;
658 }
659 #endif
660
661 if (!REG_P (dest))
662 return 0;
663
664 bb = BLOCK_FOR_INSN (insn);
665 for (next = NEXT_INSN (insn);
666 next && BLOCK_FOR_INSN (next) == bb;
667 next = NEXT_INSN (next))
668 if (INSN_P (next) && dead_or_set_p (next, dest))
669 {
670 FOR_EACH_LOG_LINK (link, next)
671 if (link->insn == insn)
672 break;
673
674 if (link)
675 {
676 result = find_single_use_1 (dest, &PATTERN (next));
677 if (ploc)
678 *ploc = next;
679 return result;
680 }
681 }
682
683 return 0;
684 }
685 \f
686 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
687 insn. The substitution can be undone by undo_all. If INTO is already
688 set to NEWVAL, do not record this change. Because computing NEWVAL might
689 also call SUBST, we have to compute it before we put anything into
690 the undo table. */
691
692 static void
693 do_SUBST (rtx *into, rtx newval)
694 {
695 struct undo *buf;
696 rtx oldval = *into;
697
698 if (oldval == newval)
699 return;
700
701 /* We'd like to catch as many invalid transformations here as
702 possible. Unfortunately, there are way too many mode changes
703 that are perfectly valid, so we'd waste too much effort for
704 little gain doing the checks here. Focus on catching invalid
705 transformations involving integer constants. */
706 if (GET_MODE_CLASS (GET_MODE (oldval)) == MODE_INT
707 && CONST_INT_P (newval))
708 {
709 /* Sanity check that we're replacing oldval with a CONST_INT
710 that is a valid sign-extension for the original mode. */
711 gcc_assert (INTVAL (newval)
712 == trunc_int_for_mode (INTVAL (newval), GET_MODE (oldval)));
713
714 /* Replacing the operand of a SUBREG or a ZERO_EXTEND with a
715 CONST_INT is not valid, because after the replacement, the
716 original mode would be gone. Unfortunately, we can't tell
717 when do_SUBST is called to replace the operand thereof, so we
718 perform this test on oldval instead, checking whether an
719 invalid replacement took place before we got here. */
720 gcc_assert (!(GET_CODE (oldval) == SUBREG
721 && CONST_INT_P (SUBREG_REG (oldval))));
722 gcc_assert (!(GET_CODE (oldval) == ZERO_EXTEND
723 && CONST_INT_P (XEXP (oldval, 0))));
724 }
725
726 if (undobuf.frees)
727 buf = undobuf.frees, undobuf.frees = buf->next;
728 else
729 buf = XNEW (struct undo);
730
731 buf->kind = UNDO_RTX;
732 buf->where.r = into;
733 buf->old_contents.r = oldval;
734 *into = newval;
735
736 buf->next = undobuf.undos, undobuf.undos = buf;
737 }
738
739 #define SUBST(INTO, NEWVAL) do_SUBST (&(INTO), (NEWVAL))
740
741 /* Similar to SUBST, but NEWVAL is an int expression. Note that substitution
742 for the value of a HOST_WIDE_INT value (including CONST_INT) is
743 not safe. */
744
745 static void
746 do_SUBST_INT (int *into, int newval)
747 {
748 struct undo *buf;
749 int oldval = *into;
750
751 if (oldval == newval)
752 return;
753
754 if (undobuf.frees)
755 buf = undobuf.frees, undobuf.frees = buf->next;
756 else
757 buf = XNEW (struct undo);
758
759 buf->kind = UNDO_INT;
760 buf->where.i = into;
761 buf->old_contents.i = oldval;
762 *into = newval;
763
764 buf->next = undobuf.undos, undobuf.undos = buf;
765 }
766
767 #define SUBST_INT(INTO, NEWVAL) do_SUBST_INT (&(INTO), (NEWVAL))
768
769 /* Similar to SUBST, but just substitute the mode. This is used when
770 changing the mode of a pseudo-register, so that any other
771 references to the entry in the regno_reg_rtx array will change as
772 well. */
773
774 static void
775 do_SUBST_MODE (rtx *into, enum machine_mode newval)
776 {
777 struct undo *buf;
778 enum machine_mode oldval = GET_MODE (*into);
779
780 if (oldval == newval)
781 return;
782
783 if (undobuf.frees)
784 buf = undobuf.frees, undobuf.frees = buf->next;
785 else
786 buf = XNEW (struct undo);
787
788 buf->kind = UNDO_MODE;
789 buf->where.r = into;
790 buf->old_contents.m = oldval;
791 adjust_reg_mode (*into, newval);
792
793 buf->next = undobuf.undos, undobuf.undos = buf;
794 }
795
796 #define SUBST_MODE(INTO, NEWVAL) do_SUBST_MODE (&(INTO), (NEWVAL))
797
798 #ifndef HAVE_cc0
799 /* Similar to SUBST, but NEWVAL is a LOG_LINKS expression. */
800
801 static void
802 do_SUBST_LINK (struct insn_link **into, struct insn_link *newval)
803 {
804 struct undo *buf;
805 struct insn_link * oldval = *into;
806
807 if (oldval == newval)
808 return;
809
810 if (undobuf.frees)
811 buf = undobuf.frees, undobuf.frees = buf->next;
812 else
813 buf = XNEW (struct undo);
814
815 buf->kind = UNDO_LINKS;
816 buf->where.l = into;
817 buf->old_contents.l = oldval;
818 *into = newval;
819
820 buf->next = undobuf.undos, undobuf.undos = buf;
821 }
822
823 #define SUBST_LINK(oldval, newval) do_SUBST_LINK (&oldval, newval)
824 #endif
825 \f
826 /* Subroutine of try_combine. Determine whether the replacement patterns
827 NEWPAT, NEWI2PAT and NEWOTHERPAT are cheaper according to insn_rtx_cost
828 than the original sequence I0, I1, I2, I3 and undobuf.other_insn. Note
829 that I0, I1 and/or NEWI2PAT may be NULL_RTX. Similarly, NEWOTHERPAT and
830 undobuf.other_insn may also both be NULL_RTX. Return false if the cost
831 of all the instructions can be estimated and the replacements are more
832 expensive than the original sequence. */
833
834 static bool
835 combine_validate_cost (rtx i0, rtx i1, rtx i2, rtx i3, rtx newpat,
836 rtx newi2pat, rtx newotherpat)
837 {
838 int i0_cost, i1_cost, i2_cost, i3_cost;
839 int new_i2_cost, new_i3_cost;
840 int old_cost, new_cost;
841
842 /* Lookup the original insn_rtx_costs. */
843 i2_cost = INSN_COST (i2);
844 i3_cost = INSN_COST (i3);
845
846 if (i1)
847 {
848 i1_cost = INSN_COST (i1);
849 if (i0)
850 {
851 i0_cost = INSN_COST (i0);
852 old_cost = (i0_cost > 0 && i1_cost > 0 && i2_cost > 0 && i3_cost > 0
853 ? i0_cost + i1_cost + i2_cost + i3_cost : 0);
854 }
855 else
856 {
857 old_cost = (i1_cost > 0 && i2_cost > 0 && i3_cost > 0
858 ? i1_cost + i2_cost + i3_cost : 0);
859 i0_cost = 0;
860 }
861 }
862 else
863 {
864 old_cost = (i2_cost > 0 && i3_cost > 0) ? i2_cost + i3_cost : 0;
865 i1_cost = i0_cost = 0;
866 }
867
868 /* Calculate the replacement insn_rtx_costs. */
869 new_i3_cost = insn_rtx_cost (newpat, optimize_this_for_speed_p);
870 if (newi2pat)
871 {
872 new_i2_cost = insn_rtx_cost (newi2pat, optimize_this_for_speed_p);
873 new_cost = (new_i2_cost > 0 && new_i3_cost > 0)
874 ? new_i2_cost + new_i3_cost : 0;
875 }
876 else
877 {
878 new_cost = new_i3_cost;
879 new_i2_cost = 0;
880 }
881
882 if (undobuf.other_insn)
883 {
884 int old_other_cost, new_other_cost;
885
886 old_other_cost = INSN_COST (undobuf.other_insn);
887 new_other_cost = insn_rtx_cost (newotherpat, optimize_this_for_speed_p);
888 if (old_other_cost > 0 && new_other_cost > 0)
889 {
890 old_cost += old_other_cost;
891 new_cost += new_other_cost;
892 }
893 else
894 old_cost = 0;
895 }
896
897 /* Disallow this combination if both new_cost and old_cost are greater than
898 zero, and new_cost is greater than old cost. */
899 if (old_cost > 0 && new_cost > old_cost)
900 {
901 if (dump_file)
902 {
903 if (i0)
904 {
905 fprintf (dump_file,
906 "rejecting combination of insns %d, %d, %d and %d\n",
907 INSN_UID (i0), INSN_UID (i1), INSN_UID (i2),
908 INSN_UID (i3));
909 fprintf (dump_file, "original costs %d + %d + %d + %d = %d\n",
910 i0_cost, i1_cost, i2_cost, i3_cost, old_cost);
911 }
912 else if (i1)
913 {
914 fprintf (dump_file,
915 "rejecting combination of insns %d, %d and %d\n",
916 INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
917 fprintf (dump_file, "original costs %d + %d + %d = %d\n",
918 i1_cost, i2_cost, i3_cost, old_cost);
919 }
920 else
921 {
922 fprintf (dump_file,
923 "rejecting combination of insns %d and %d\n",
924 INSN_UID (i2), INSN_UID (i3));
925 fprintf (dump_file, "original costs %d + %d = %d\n",
926 i2_cost, i3_cost, old_cost);
927 }
928
929 if (newi2pat)
930 {
931 fprintf (dump_file, "replacement costs %d + %d = %d\n",
932 new_i2_cost, new_i3_cost, new_cost);
933 }
934 else
935 fprintf (dump_file, "replacement cost %d\n", new_cost);
936 }
937
938 return false;
939 }
940
941 /* Update the uid_insn_cost array with the replacement costs. */
942 INSN_COST (i2) = new_i2_cost;
943 INSN_COST (i3) = new_i3_cost;
944 if (i1)
945 {
946 INSN_COST (i1) = 0;
947 if (i0)
948 INSN_COST (i0) = 0;
949 }
950
951 return true;
952 }
953
954
955 /* Delete any insns that copy a register to itself. */
956
957 static void
958 delete_noop_moves (void)
959 {
960 rtx insn, next;
961 basic_block bb;
962
963 FOR_EACH_BB_FN (bb, cfun)
964 {
965 for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next)
966 {
967 next = NEXT_INSN (insn);
968 if (INSN_P (insn) && noop_move_p (insn))
969 {
970 if (dump_file)
971 fprintf (dump_file, "deleting noop move %d\n", INSN_UID (insn));
972
973 delete_insn_and_edges (insn);
974 }
975 }
976 }
977 }
978
979 \f
980 /* Fill in log links field for all insns. */
981
982 static void
983 create_log_links (void)
984 {
985 basic_block bb;
986 rtx *next_use, insn;
987 df_ref *def_vec, *use_vec;
988
989 next_use = XCNEWVEC (rtx, max_reg_num ());
990
991 /* Pass through each block from the end, recording the uses of each
992 register and establishing log links when def is encountered.
993 Note that we do not clear next_use array in order to save time,
994 so we have to test whether the use is in the same basic block as def.
995
996 There are a few cases below when we do not consider the definition or
997 usage -- these are taken from original flow.c did. Don't ask me why it is
998 done this way; I don't know and if it works, I don't want to know. */
999
1000 FOR_EACH_BB_FN (bb, cfun)
1001 {
1002 FOR_BB_INSNS_REVERSE (bb, insn)
1003 {
1004 if (!NONDEBUG_INSN_P (insn))
1005 continue;
1006
1007 /* Log links are created only once. */
1008 gcc_assert (!LOG_LINKS (insn));
1009
1010 for (def_vec = DF_INSN_DEFS (insn); *def_vec; def_vec++)
1011 {
1012 df_ref def = *def_vec;
1013 int regno = DF_REF_REGNO (def);
1014 rtx use_insn;
1015
1016 if (!next_use[regno])
1017 continue;
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 continue;
1022
1023 /* Do not make the log link for frame pointer. */
1024 if ((regno == FRAME_POINTER_REGNUM
1025 && (! reload_completed || frame_pointer_needed))
1026 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
1027 || (regno == HARD_FRAME_POINTER_REGNUM
1028 && (! reload_completed || frame_pointer_needed))
1029 #endif
1030 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1031 || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
1032 #endif
1033 )
1034 continue;
1035
1036 use_insn = next_use[regno];
1037 if (BLOCK_FOR_INSN (use_insn) == bb)
1038 {
1039 /* flow.c claimed:
1040
1041 We don't build a LOG_LINK for hard registers contained
1042 in ASM_OPERANDs. If these registers get replaced,
1043 we might wind up changing the semantics of the insn,
1044 even if reload can make what appear to be valid
1045 assignments later. */
1046 if (regno >= FIRST_PSEUDO_REGISTER
1047 || asm_noperands (PATTERN (use_insn)) < 0)
1048 {
1049 /* Don't add duplicate links between instructions. */
1050 struct insn_link *links;
1051 FOR_EACH_LOG_LINK (links, use_insn)
1052 if (insn == links->insn)
1053 break;
1054
1055 if (!links)
1056 LOG_LINKS (use_insn)
1057 = alloc_insn_link (insn, LOG_LINKS (use_insn));
1058 }
1059 }
1060 next_use[regno] = NULL_RTX;
1061 }
1062
1063 for (use_vec = DF_INSN_USES (insn); *use_vec; use_vec++)
1064 {
1065 df_ref use = *use_vec;
1066 int regno = DF_REF_REGNO (use);
1067
1068 /* Do not consider the usage of the stack pointer
1069 by function call. */
1070 if (DF_REF_FLAGS (use) & DF_REF_CALL_STACK_USAGE)
1071 continue;
1072
1073 next_use[regno] = insn;
1074 }
1075 }
1076 }
1077
1078 free (next_use);
1079 }
1080
1081 /* Walk the LOG_LINKS of insn B to see if we find a reference to A. Return
1082 true if we found a LOG_LINK that proves that A feeds B. This only works
1083 if there are no instructions between A and B which could have a link
1084 depending on A, since in that case we would not record a link for B.
1085 We also check the implicit dependency created by a cc0 setter/user
1086 pair. */
1087
1088 static bool
1089 insn_a_feeds_b (rtx a, rtx b)
1090 {
1091 struct insn_link *links;
1092 FOR_EACH_LOG_LINK (links, b)
1093 if (links->insn == a)
1094 return true;
1095 #ifdef HAVE_cc0
1096 if (sets_cc0_p (a))
1097 return true;
1098 #endif
1099 return false;
1100 }
1101 \f
1102 /* Main entry point for combiner. F is the first insn of the function.
1103 NREGS is the first unused pseudo-reg number.
1104
1105 Return nonzero if the combiner has turned an indirect jump
1106 instruction into a direct jump. */
1107 static int
1108 combine_instructions (rtx f, unsigned int nregs)
1109 {
1110 rtx insn, next;
1111 #ifdef HAVE_cc0
1112 rtx prev;
1113 #endif
1114 struct insn_link *links, *nextlinks;
1115 rtx first;
1116 basic_block last_bb;
1117
1118 int new_direct_jump_p = 0;
1119
1120 for (first = f; first && !INSN_P (first); )
1121 first = NEXT_INSN (first);
1122 if (!first)
1123 return 0;
1124
1125 combine_attempts = 0;
1126 combine_merges = 0;
1127 combine_extras = 0;
1128 combine_successes = 0;
1129
1130 rtl_hooks = combine_rtl_hooks;
1131
1132 reg_stat.safe_grow_cleared (nregs);
1133
1134 init_recog_no_volatile ();
1135
1136 /* Allocate array for insn info. */
1137 max_uid_known = get_max_uid ();
1138 uid_log_links = XCNEWVEC (struct insn_link *, max_uid_known + 1);
1139 uid_insn_cost = XCNEWVEC (int, max_uid_known + 1);
1140 gcc_obstack_init (&insn_link_obstack);
1141
1142 nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
1143
1144 /* Don't use reg_stat[].nonzero_bits when computing it. This can cause
1145 problems when, for example, we have j <<= 1 in a loop. */
1146
1147 nonzero_sign_valid = 0;
1148 label_tick = label_tick_ebb_start = 1;
1149
1150 /* Scan all SETs and see if we can deduce anything about what
1151 bits are known to be zero for some registers and how many copies
1152 of the sign bit are known to exist for those registers.
1153
1154 Also set any known values so that we can use it while searching
1155 for what bits are known to be set. */
1156
1157 setup_incoming_promotions (first);
1158 /* Allow the entry block and the first block to fall into the same EBB.
1159 Conceptually the incoming promotions are assigned to the entry block. */
1160 last_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1161
1162 create_log_links ();
1163 FOR_EACH_BB_FN (this_basic_block, cfun)
1164 {
1165 optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1166 last_call_luid = 0;
1167 mem_last_set = -1;
1168
1169 label_tick++;
1170 if (!single_pred_p (this_basic_block)
1171 || single_pred (this_basic_block) != last_bb)
1172 label_tick_ebb_start = label_tick;
1173 last_bb = this_basic_block;
1174
1175 FOR_BB_INSNS (this_basic_block, insn)
1176 if (INSN_P (insn) && BLOCK_FOR_INSN (insn))
1177 {
1178 #ifdef AUTO_INC_DEC
1179 rtx links;
1180 #endif
1181
1182 subst_low_luid = DF_INSN_LUID (insn);
1183 subst_insn = insn;
1184
1185 note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies,
1186 insn);
1187 record_dead_and_set_regs (insn);
1188
1189 #ifdef AUTO_INC_DEC
1190 for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
1191 if (REG_NOTE_KIND (links) == REG_INC)
1192 set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
1193 insn);
1194 #endif
1195
1196 /* Record the current insn_rtx_cost of this instruction. */
1197 if (NONJUMP_INSN_P (insn))
1198 INSN_COST (insn) = insn_rtx_cost (PATTERN (insn),
1199 optimize_this_for_speed_p);
1200 if (dump_file)
1201 fprintf (dump_file, "insn_cost %d: %d\n",
1202 INSN_UID (insn), INSN_COST (insn));
1203 }
1204 }
1205
1206 nonzero_sign_valid = 1;
1207
1208 /* Now scan all the insns in forward order. */
1209 label_tick = label_tick_ebb_start = 1;
1210 init_reg_last ();
1211 setup_incoming_promotions (first);
1212 last_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1213
1214 FOR_EACH_BB_FN (this_basic_block, cfun)
1215 {
1216 rtx last_combined_insn = NULL_RTX;
1217 optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block);
1218 last_call_luid = 0;
1219 mem_last_set = -1;
1220
1221 label_tick++;
1222 if (!single_pred_p (this_basic_block)
1223 || single_pred (this_basic_block) != last_bb)
1224 label_tick_ebb_start = label_tick;
1225 last_bb = this_basic_block;
1226
1227 rtl_profile_for_bb (this_basic_block);
1228 for (insn = BB_HEAD (this_basic_block);
1229 insn != NEXT_INSN (BB_END (this_basic_block));
1230 insn = next ? next : NEXT_INSN (insn))
1231 {
1232 next = 0;
1233 if (NONDEBUG_INSN_P (insn))
1234 {
1235 while (last_combined_insn
1236 && INSN_DELETED_P (last_combined_insn))
1237 last_combined_insn = PREV_INSN (last_combined_insn);
1238 if (last_combined_insn == NULL_RTX
1239 || BARRIER_P (last_combined_insn)
1240 || BLOCK_FOR_INSN (last_combined_insn) != this_basic_block
1241 || DF_INSN_LUID (last_combined_insn) <= DF_INSN_LUID (insn))
1242 last_combined_insn = insn;
1243
1244 /* See if we know about function return values before this
1245 insn based upon SUBREG flags. */
1246 check_promoted_subreg (insn, PATTERN (insn));
1247
1248 /* See if we can find hardregs and subreg of pseudos in
1249 narrower modes. This could help turning TRUNCATEs
1250 into SUBREGs. */
1251 note_uses (&PATTERN (insn), record_truncated_values, NULL);
1252
1253 /* Try this insn with each insn it links back to. */
1254
1255 FOR_EACH_LOG_LINK (links, insn)
1256 if ((next = try_combine (insn, links->insn, NULL_RTX,
1257 NULL_RTX, &new_direct_jump_p,
1258 last_combined_insn)) != 0)
1259 goto retry;
1260
1261 /* Try each sequence of three linked insns ending with this one. */
1262
1263 FOR_EACH_LOG_LINK (links, insn)
1264 {
1265 rtx link = links->insn;
1266
1267 /* If the linked insn has been replaced by a note, then there
1268 is no point in pursuing this chain any further. */
1269 if (NOTE_P (link))
1270 continue;
1271
1272 FOR_EACH_LOG_LINK (nextlinks, link)
1273 if ((next = try_combine (insn, link, nextlinks->insn,
1274 NULL_RTX, &new_direct_jump_p,
1275 last_combined_insn)) != 0)
1276 goto retry;
1277 }
1278
1279 #ifdef HAVE_cc0
1280 /* Try to combine a jump insn that uses CC0
1281 with a preceding insn that sets CC0, and maybe with its
1282 logical predecessor as well.
1283 This is how we make decrement-and-branch insns.
1284 We need this special code because data flow connections
1285 via CC0 do not get entered in LOG_LINKS. */
1286
1287 if (JUMP_P (insn)
1288 && (prev = prev_nonnote_insn (insn)) != 0
1289 && NONJUMP_INSN_P (prev)
1290 && sets_cc0_p (PATTERN (prev)))
1291 {
1292 if ((next = try_combine (insn, prev, NULL_RTX, NULL_RTX,
1293 &new_direct_jump_p,
1294 last_combined_insn)) != 0)
1295 goto retry;
1296
1297 FOR_EACH_LOG_LINK (nextlinks, prev)
1298 if ((next = try_combine (insn, prev, nextlinks->insn,
1299 NULL_RTX, &new_direct_jump_p,
1300 last_combined_insn)) != 0)
1301 goto retry;
1302 }
1303
1304 /* Do the same for an insn that explicitly references CC0. */
1305 if (NONJUMP_INSN_P (insn)
1306 && (prev = prev_nonnote_insn (insn)) != 0
1307 && NONJUMP_INSN_P (prev)
1308 && sets_cc0_p (PATTERN (prev))
1309 && GET_CODE (PATTERN (insn)) == SET
1310 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
1311 {
1312 if ((next = try_combine (insn, prev, NULL_RTX, NULL_RTX,
1313 &new_direct_jump_p,
1314 last_combined_insn)) != 0)
1315 goto retry;
1316
1317 FOR_EACH_LOG_LINK (nextlinks, prev)
1318 if ((next = try_combine (insn, prev, nextlinks->insn,
1319 NULL_RTX, &new_direct_jump_p,
1320 last_combined_insn)) != 0)
1321 goto retry;
1322 }
1323
1324 /* Finally, see if any of the insns that this insn links to
1325 explicitly references CC0. If so, try this insn, that insn,
1326 and its predecessor if it sets CC0. */
1327 FOR_EACH_LOG_LINK (links, insn)
1328 if (NONJUMP_INSN_P (links->insn)
1329 && GET_CODE (PATTERN (links->insn)) == SET
1330 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (links->insn)))
1331 && (prev = prev_nonnote_insn (links->insn)) != 0
1332 && NONJUMP_INSN_P (prev)
1333 && sets_cc0_p (PATTERN (prev))
1334 && (next = try_combine (insn, links->insn,
1335 prev, NULL_RTX, &new_direct_jump_p,
1336 last_combined_insn)) != 0)
1337 goto retry;
1338 #endif
1339
1340 /* Try combining an insn with two different insns whose results it
1341 uses. */
1342 FOR_EACH_LOG_LINK (links, insn)
1343 for (nextlinks = links->next; nextlinks;
1344 nextlinks = nextlinks->next)
1345 if ((next = try_combine (insn, links->insn,
1346 nextlinks->insn, NULL_RTX,
1347 &new_direct_jump_p,
1348 last_combined_insn)) != 0)
1349 goto retry;
1350
1351 /* Try four-instruction combinations. */
1352 FOR_EACH_LOG_LINK (links, insn)
1353 {
1354 struct insn_link *next1;
1355 rtx link = links->insn;
1356
1357 /* If the linked insn has been replaced by a note, then there
1358 is no point in pursuing this chain any further. */
1359 if (NOTE_P (link))
1360 continue;
1361
1362 FOR_EACH_LOG_LINK (next1, link)
1363 {
1364 rtx link1 = next1->insn;
1365 if (NOTE_P (link1))
1366 continue;
1367 /* I0 -> I1 -> I2 -> I3. */
1368 FOR_EACH_LOG_LINK (nextlinks, link1)
1369 if ((next = try_combine (insn, link, link1,
1370 nextlinks->insn,
1371 &new_direct_jump_p,
1372 last_combined_insn)) != 0)
1373 goto retry;
1374 /* I0, I1 -> I2, I2 -> I3. */
1375 for (nextlinks = next1->next; nextlinks;
1376 nextlinks = nextlinks->next)
1377 if ((next = try_combine (insn, link, link1,
1378 nextlinks->insn,
1379 &new_direct_jump_p,
1380 last_combined_insn)) != 0)
1381 goto retry;
1382 }
1383
1384 for (next1 = links->next; next1; next1 = next1->next)
1385 {
1386 rtx link1 = next1->insn;
1387 if (NOTE_P (link1))
1388 continue;
1389 /* I0 -> I2; I1, I2 -> I3. */
1390 FOR_EACH_LOG_LINK (nextlinks, link)
1391 if ((next = try_combine (insn, link, link1,
1392 nextlinks->insn,
1393 &new_direct_jump_p,
1394 last_combined_insn)) != 0)
1395 goto retry;
1396 /* I0 -> I1; I1, I2 -> I3. */
1397 FOR_EACH_LOG_LINK (nextlinks, link1)
1398 if ((next = try_combine (insn, link, link1,
1399 nextlinks->insn,
1400 &new_direct_jump_p,
1401 last_combined_insn)) != 0)
1402 goto retry;
1403 }
1404 }
1405
1406 /* Try this insn with each REG_EQUAL note it links back to. */
1407 FOR_EACH_LOG_LINK (links, insn)
1408 {
1409 rtx set, note;
1410 rtx temp = links->insn;
1411 if ((set = single_set (temp)) != 0
1412 && (note = find_reg_equal_equiv_note (temp)) != 0
1413 && (note = XEXP (note, 0), GET_CODE (note)) != EXPR_LIST
1414 /* Avoid using a register that may already been marked
1415 dead by an earlier instruction. */
1416 && ! unmentioned_reg_p (note, SET_SRC (set))
1417 && (GET_MODE (note) == VOIDmode
1418 ? SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set)))
1419 : GET_MODE (SET_DEST (set)) == GET_MODE (note)))
1420 {
1421 /* Temporarily replace the set's source with the
1422 contents of the REG_EQUAL note. The insn will
1423 be deleted or recognized by try_combine. */
1424 rtx orig = SET_SRC (set);
1425 SET_SRC (set) = note;
1426 i2mod = temp;
1427 i2mod_old_rhs = copy_rtx (orig);
1428 i2mod_new_rhs = copy_rtx (note);
1429 next = try_combine (insn, i2mod, NULL_RTX, NULL_RTX,
1430 &new_direct_jump_p,
1431 last_combined_insn);
1432 i2mod = NULL_RTX;
1433 if (next)
1434 goto retry;
1435 SET_SRC (set) = orig;
1436 }
1437 }
1438
1439 if (!NOTE_P (insn))
1440 record_dead_and_set_regs (insn);
1441
1442 retry:
1443 ;
1444 }
1445 }
1446 }
1447
1448 default_rtl_profile ();
1449 clear_bb_flags ();
1450 new_direct_jump_p |= purge_all_dead_edges ();
1451 delete_noop_moves ();
1452
1453 /* Clean up. */
1454 obstack_free (&insn_link_obstack, NULL);
1455 free (uid_log_links);
1456 free (uid_insn_cost);
1457 reg_stat.release ();
1458
1459 {
1460 struct undo *undo, *next;
1461 for (undo = undobuf.frees; undo; undo = next)
1462 {
1463 next = undo->next;
1464 free (undo);
1465 }
1466 undobuf.frees = 0;
1467 }
1468
1469 total_attempts += combine_attempts;
1470 total_merges += combine_merges;
1471 total_extras += combine_extras;
1472 total_successes += combine_successes;
1473
1474 nonzero_sign_valid = 0;
1475 rtl_hooks = general_rtl_hooks;
1476
1477 /* Make recognizer allow volatile MEMs again. */
1478 init_recog ();
1479
1480 return new_direct_jump_p;
1481 }
1482
1483 /* Wipe the last_xxx fields of reg_stat in preparation for another pass. */
1484
1485 static void
1486 init_reg_last (void)
1487 {
1488 unsigned int i;
1489 reg_stat_type *p;
1490
1491 FOR_EACH_VEC_ELT (reg_stat, i, p)
1492 memset (p, 0, offsetof (reg_stat_type, sign_bit_copies));
1493 }
1494 \f
1495 /* Set up any promoted values for incoming argument registers. */
1496
1497 static void
1498 setup_incoming_promotions (rtx first)
1499 {
1500 tree arg;
1501 bool strictly_local = false;
1502
1503 for (arg = DECL_ARGUMENTS (current_function_decl); arg;
1504 arg = DECL_CHAIN (arg))
1505 {
1506 rtx x, reg = DECL_INCOMING_RTL (arg);
1507 int uns1, uns3;
1508 enum machine_mode mode1, mode2, mode3, mode4;
1509
1510 /* Only continue if the incoming argument is in a register. */
1511 if (!REG_P (reg))
1512 continue;
1513
1514 /* Determine, if possible, whether all call sites of the current
1515 function lie within the current compilation unit. (This does
1516 take into account the exporting of a function via taking its
1517 address, and so forth.) */
1518 strictly_local = cgraph_local_info (current_function_decl)->local;
1519
1520 /* The mode and signedness of the argument before any promotions happen
1521 (equal to the mode of the pseudo holding it at that stage). */
1522 mode1 = TYPE_MODE (TREE_TYPE (arg));
1523 uns1 = TYPE_UNSIGNED (TREE_TYPE (arg));
1524
1525 /* The mode and signedness of the argument after any source language and
1526 TARGET_PROMOTE_PROTOTYPES-driven promotions. */
1527 mode2 = TYPE_MODE (DECL_ARG_TYPE (arg));
1528 uns3 = TYPE_UNSIGNED (DECL_ARG_TYPE (arg));
1529
1530 /* The mode and signedness of the argument as it is actually passed,
1531 after any TARGET_PROMOTE_FUNCTION_ARGS-driven ABI promotions. */
1532 mode3 = promote_function_mode (DECL_ARG_TYPE (arg), mode2, &uns3,
1533 TREE_TYPE (cfun->decl), 0);
1534
1535 /* The mode of the register in which the argument is being passed. */
1536 mode4 = GET_MODE (reg);
1537
1538 /* Eliminate sign extensions in the callee when:
1539 (a) A mode promotion has occurred; */
1540 if (mode1 == mode3)
1541 continue;
1542 /* (b) The mode of the register is the same as the mode of
1543 the argument as it is passed; */
1544 if (mode3 != mode4)
1545 continue;
1546 /* (c) There's no language level extension; */
1547 if (mode1 == mode2)
1548 ;
1549 /* (c.1) All callers are from the current compilation unit. If that's
1550 the case we don't have to rely on an ABI, we only have to know
1551 what we're generating right now, and we know that we will do the
1552 mode1 to mode2 promotion with the given sign. */
1553 else if (!strictly_local)
1554 continue;
1555 /* (c.2) The combination of the two promotions is useful. This is
1556 true when the signs match, or if the first promotion is unsigned.
1557 In the later case, (sign_extend (zero_extend x)) is the same as
1558 (zero_extend (zero_extend x)), so make sure to force UNS3 true. */
1559 else if (uns1)
1560 uns3 = true;
1561 else if (uns3)
1562 continue;
1563
1564 /* Record that the value was promoted from mode1 to mode3,
1565 so that any sign extension at the head of the current
1566 function may be eliminated. */
1567 x = gen_rtx_CLOBBER (mode1, const0_rtx);
1568 x = gen_rtx_fmt_e ((uns3 ? ZERO_EXTEND : SIGN_EXTEND), mode3, x);
1569 record_value_for_reg (reg, first, x);
1570 }
1571 }
1572
1573 /* Called via note_stores. If X is a pseudo that is narrower than
1574 HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
1575
1576 If we are setting only a portion of X and we can't figure out what
1577 portion, assume all bits will be used since we don't know what will
1578 be happening.
1579
1580 Similarly, set how many bits of X are known to be copies of the sign bit
1581 at all locations in the function. This is the smallest number implied
1582 by any set of X. */
1583
1584 static void
1585 set_nonzero_bits_and_sign_copies (rtx x, const_rtx set, void *data)
1586 {
1587 rtx insn = (rtx) data;
1588 unsigned int num;
1589
1590 if (REG_P (x)
1591 && REGNO (x) >= FIRST_PSEUDO_REGISTER
1592 /* If this register is undefined at the start of the file, we can't
1593 say what its contents were. */
1594 && ! REGNO_REG_SET_P
1595 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb), REGNO (x))
1596 && HWI_COMPUTABLE_MODE_P (GET_MODE (x)))
1597 {
1598 reg_stat_type *rsp = &reg_stat[REGNO (x)];
1599
1600 if (set == 0 || GET_CODE (set) == CLOBBER)
1601 {
1602 rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1603 rsp->sign_bit_copies = 1;
1604 return;
1605 }
1606
1607 /* If this register is being initialized using itself, and the
1608 register is uninitialized in this basic block, and there are
1609 no LOG_LINKS which set the register, then part of the
1610 register is uninitialized. In that case we can't assume
1611 anything about the number of nonzero bits.
1612
1613 ??? We could do better if we checked this in
1614 reg_{nonzero_bits,num_sign_bit_copies}_for_combine. Then we
1615 could avoid making assumptions about the insn which initially
1616 sets the register, while still using the information in other
1617 insns. We would have to be careful to check every insn
1618 involved in the combination. */
1619
1620 if (insn
1621 && reg_referenced_p (x, PATTERN (insn))
1622 && !REGNO_REG_SET_P (DF_LR_IN (BLOCK_FOR_INSN (insn)),
1623 REGNO (x)))
1624 {
1625 struct insn_link *link;
1626
1627 FOR_EACH_LOG_LINK (link, insn)
1628 if (dead_or_set_p (link->insn, x))
1629 break;
1630 if (!link)
1631 {
1632 rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1633 rsp->sign_bit_copies = 1;
1634 return;
1635 }
1636 }
1637
1638 /* If this is a complex assignment, see if we can convert it into a
1639 simple assignment. */
1640 set = expand_field_assignment (set);
1641
1642 /* If this is a simple assignment, or we have a paradoxical SUBREG,
1643 set what we know about X. */
1644
1645 if (SET_DEST (set) == x
1646 || (paradoxical_subreg_p (SET_DEST (set))
1647 && SUBREG_REG (SET_DEST (set)) == x))
1648 {
1649 rtx src = SET_SRC (set);
1650
1651 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
1652 /* If X is narrower than a word and SRC is a non-negative
1653 constant that would appear negative in the mode of X,
1654 sign-extend it for use in reg_stat[].nonzero_bits because some
1655 machines (maybe most) will actually do the sign-extension
1656 and this is the conservative approach.
1657
1658 ??? For 2.5, try to tighten up the MD files in this regard
1659 instead of this kludge. */
1660
1661 if (GET_MODE_PRECISION (GET_MODE (x)) < BITS_PER_WORD
1662 && CONST_INT_P (src)
1663 && INTVAL (src) > 0
1664 && val_signbit_known_set_p (GET_MODE (x), INTVAL (src)))
1665 src = GEN_INT (INTVAL (src) | ~GET_MODE_MASK (GET_MODE (x)));
1666 #endif
1667
1668 /* Don't call nonzero_bits if it cannot change anything. */
1669 if (rsp->nonzero_bits != ~(unsigned HOST_WIDE_INT) 0)
1670 rsp->nonzero_bits |= nonzero_bits (src, nonzero_bits_mode);
1671 num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
1672 if (rsp->sign_bit_copies == 0
1673 || rsp->sign_bit_copies > num)
1674 rsp->sign_bit_copies = num;
1675 }
1676 else
1677 {
1678 rsp->nonzero_bits = GET_MODE_MASK (GET_MODE (x));
1679 rsp->sign_bit_copies = 1;
1680 }
1681 }
1682 }
1683 \f
1684 /* See if INSN can be combined into I3. PRED, PRED2, SUCC and SUCC2 are
1685 optionally insns that were previously combined into I3 or that will be
1686 combined into the merger of INSN and I3. The order is PRED, PRED2,
1687 INSN, SUCC, SUCC2, I3.
1688
1689 Return 0 if the combination is not allowed for any reason.
1690
1691 If the combination is allowed, *PDEST will be set to the single
1692 destination of INSN and *PSRC to the single source, and this function
1693 will return 1. */
1694
1695 static int
1696 can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED,
1697 rtx pred2 ATTRIBUTE_UNUSED, rtx succ, rtx succ2,
1698 rtx *pdest, rtx *psrc)
1699 {
1700 int i;
1701 const_rtx set = 0;
1702 rtx src, dest;
1703 rtx p;
1704 #ifdef AUTO_INC_DEC
1705 rtx link;
1706 #endif
1707 bool all_adjacent = true;
1708 int (*is_volatile_p) (const_rtx);
1709
1710 if (succ)
1711 {
1712 if (succ2)
1713 {
1714 if (next_active_insn (succ2) != i3)
1715 all_adjacent = false;
1716 if (next_active_insn (succ) != succ2)
1717 all_adjacent = false;
1718 }
1719 else if (next_active_insn (succ) != i3)
1720 all_adjacent = false;
1721 if (next_active_insn (insn) != succ)
1722 all_adjacent = false;
1723 }
1724 else if (next_active_insn (insn) != i3)
1725 all_adjacent = false;
1726
1727 /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
1728 or a PARALLEL consisting of such a SET and CLOBBERs.
1729
1730 If INSN has CLOBBER parallel parts, ignore them for our processing.
1731 By definition, these happen during the execution of the insn. When it
1732 is merged with another insn, all bets are off. If they are, in fact,
1733 needed and aren't also supplied in I3, they may be added by
1734 recog_for_combine. Otherwise, it won't match.
1735
1736 We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
1737 note.
1738
1739 Get the source and destination of INSN. If more than one, can't
1740 combine. */
1741
1742 if (GET_CODE (PATTERN (insn)) == SET)
1743 set = PATTERN (insn);
1744 else if (GET_CODE (PATTERN (insn)) == PARALLEL
1745 && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1746 {
1747 for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1748 {
1749 rtx elt = XVECEXP (PATTERN (insn), 0, i);
1750
1751 switch (GET_CODE (elt))
1752 {
1753 /* This is important to combine floating point insns
1754 for the SH4 port. */
1755 case USE:
1756 /* Combining an isolated USE doesn't make sense.
1757 We depend here on combinable_i3pat to reject them. */
1758 /* The code below this loop only verifies that the inputs of
1759 the SET in INSN do not change. We call reg_set_between_p
1760 to verify that the REG in the USE does not change between
1761 I3 and INSN.
1762 If the USE in INSN was for a pseudo register, the matching
1763 insn pattern will likely match any register; combining this
1764 with any other USE would only be safe if we knew that the
1765 used registers have identical values, or if there was
1766 something to tell them apart, e.g. different modes. For
1767 now, we forgo such complicated tests and simply disallow
1768 combining of USES of pseudo registers with any other USE. */
1769 if (REG_P (XEXP (elt, 0))
1770 && GET_CODE (PATTERN (i3)) == PARALLEL)
1771 {
1772 rtx i3pat = PATTERN (i3);
1773 int i = XVECLEN (i3pat, 0) - 1;
1774 unsigned int regno = REGNO (XEXP (elt, 0));
1775
1776 do
1777 {
1778 rtx i3elt = XVECEXP (i3pat, 0, i);
1779
1780 if (GET_CODE (i3elt) == USE
1781 && REG_P (XEXP (i3elt, 0))
1782 && (REGNO (XEXP (i3elt, 0)) == regno
1783 ? reg_set_between_p (XEXP (elt, 0),
1784 PREV_INSN (insn), i3)
1785 : regno >= FIRST_PSEUDO_REGISTER))
1786 return 0;
1787 }
1788 while (--i >= 0);
1789 }
1790 break;
1791
1792 /* We can ignore CLOBBERs. */
1793 case CLOBBER:
1794 break;
1795
1796 case SET:
1797 /* Ignore SETs whose result isn't used but not those that
1798 have side-effects. */
1799 if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
1800 && insn_nothrow_p (insn)
1801 && !side_effects_p (elt))
1802 break;
1803
1804 /* If we have already found a SET, this is a second one and
1805 so we cannot combine with this insn. */
1806 if (set)
1807 return 0;
1808
1809 set = elt;
1810 break;
1811
1812 default:
1813 /* Anything else means we can't combine. */
1814 return 0;
1815 }
1816 }
1817
1818 if (set == 0
1819 /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
1820 so don't do anything with it. */
1821 || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1822 return 0;
1823 }
1824 else
1825 return 0;
1826
1827 if (set == 0)
1828 return 0;
1829
1830 /* The simplification in expand_field_assignment may call back to
1831 get_last_value, so set safe guard here. */
1832 subst_low_luid = DF_INSN_LUID (insn);
1833
1834 set = expand_field_assignment (set);
1835 src = SET_SRC (set), dest = SET_DEST (set);
1836
1837 /* Don't eliminate a store in the stack pointer. */
1838 if (dest == stack_pointer_rtx
1839 /* Don't combine with an insn that sets a register to itself if it has
1840 a REG_EQUAL note. This may be part of a LIBCALL sequence. */
1841 || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1842 /* Can't merge an ASM_OPERANDS. */
1843 || GET_CODE (src) == ASM_OPERANDS
1844 /* Can't merge a function call. */
1845 || GET_CODE (src) == CALL
1846 /* Don't eliminate a function call argument. */
1847 || (CALL_P (i3)
1848 && (find_reg_fusage (i3, USE, dest)
1849 || (REG_P (dest)
1850 && REGNO (dest) < FIRST_PSEUDO_REGISTER
1851 && global_regs[REGNO (dest)])))
1852 /* Don't substitute into an incremented register. */
1853 || FIND_REG_INC_NOTE (i3, dest)
1854 || (succ && FIND_REG_INC_NOTE (succ, dest))
1855 || (succ2 && FIND_REG_INC_NOTE (succ2, dest))
1856 /* Don't substitute into a non-local goto, this confuses CFG. */
1857 || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
1858 /* Make sure that DEST is not used after SUCC but before I3. */
1859 || (!all_adjacent
1860 && ((succ2
1861 && (reg_used_between_p (dest, succ2, i3)
1862 || reg_used_between_p (dest, succ, succ2)))
1863 || (!succ2 && succ && reg_used_between_p (dest, succ, i3))))
1864 /* Make sure that the value that is to be substituted for the register
1865 does not use any registers whose values alter in between. However,
1866 If the insns are adjacent, a use can't cross a set even though we
1867 think it might (this can happen for a sequence of insns each setting
1868 the same destination; last_set of that register might point to
1869 a NOTE). If INSN has a REG_EQUIV note, the register is always
1870 equivalent to the memory so the substitution is valid even if there
1871 are intervening stores. Also, don't move a volatile asm or
1872 UNSPEC_VOLATILE across any other insns. */
1873 || (! all_adjacent
1874 && (((!MEM_P (src)
1875 || ! find_reg_note (insn, REG_EQUIV, src))
1876 && use_crosses_set_p (src, DF_INSN_LUID (insn)))
1877 || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1878 || GET_CODE (src) == UNSPEC_VOLATILE))
1879 /* Don't combine across a CALL_INSN, because that would possibly
1880 change whether the life span of some REGs crosses calls or not,
1881 and it is a pain to update that information.
1882 Exception: if source is a constant, moving it later can't hurt.
1883 Accept that as a special case. */
1884 || (DF_INSN_LUID (insn) < last_call_luid && ! CONSTANT_P (src)))
1885 return 0;
1886
1887 /* DEST must either be a REG or CC0. */
1888 if (REG_P (dest))
1889 {
1890 /* If register alignment is being enforced for multi-word items in all
1891 cases except for parameters, it is possible to have a register copy
1892 insn referencing a hard register that is not allowed to contain the
1893 mode being copied and which would not be valid as an operand of most
1894 insns. Eliminate this problem by not combining with such an insn.
1895
1896 Also, on some machines we don't want to extend the life of a hard
1897 register. */
1898
1899 if (REG_P (src)
1900 && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1901 && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1902 /* Don't extend the life of a hard register unless it is
1903 user variable (if we have few registers) or it can't
1904 fit into the desired register (meaning something special
1905 is going on).
1906 Also avoid substituting a return register into I3, because
1907 reload can't handle a conflict with constraints of other
1908 inputs. */
1909 || (REGNO (src) < FIRST_PSEUDO_REGISTER
1910 && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))))
1911 return 0;
1912 }
1913 else if (GET_CODE (dest) != CC0)
1914 return 0;
1915
1916
1917 if (GET_CODE (PATTERN (i3)) == PARALLEL)
1918 for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1919 if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER)
1920 {
1921 /* Don't substitute for a register intended as a clobberable
1922 operand. */
1923 rtx reg = XEXP (XVECEXP (PATTERN (i3), 0, i), 0);
1924 if (rtx_equal_p (reg, dest))
1925 return 0;
1926
1927 /* If the clobber represents an earlyclobber operand, we must not
1928 substitute an expression containing the clobbered register.
1929 As we do not analyze the constraint strings here, we have to
1930 make the conservative assumption. However, if the register is
1931 a fixed hard reg, the clobber cannot represent any operand;
1932 we leave it up to the machine description to either accept or
1933 reject use-and-clobber patterns. */
1934 if (!REG_P (reg)
1935 || REGNO (reg) >= FIRST_PSEUDO_REGISTER
1936 || !fixed_regs[REGNO (reg)])
1937 if (reg_overlap_mentioned_p (reg, src))
1938 return 0;
1939 }
1940
1941 /* If INSN contains anything volatile, or is an `asm' (whether volatile
1942 or not), reject, unless nothing volatile comes between it and I3 */
1943
1944 if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1945 {
1946 /* Make sure neither succ nor succ2 contains a volatile reference. */
1947 if (succ2 != 0 && volatile_refs_p (PATTERN (succ2)))
1948 return 0;
1949 if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1950 return 0;
1951 /* We'll check insns between INSN and I3 below. */
1952 }
1953
1954 /* If INSN is an asm, and DEST is a hard register, reject, since it has
1955 to be an explicit register variable, and was chosen for a reason. */
1956
1957 if (GET_CODE (src) == ASM_OPERANDS
1958 && REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1959 return 0;
1960
1961 /* If INSN contains volatile references (specifically volatile MEMs),
1962 we cannot combine across any other volatile references.
1963 Even if INSN doesn't contain volatile references, any intervening
1964 volatile insn might affect machine state. */
1965
1966 is_volatile_p = volatile_refs_p (PATTERN (insn))
1967 ? volatile_refs_p
1968 : volatile_insn_p;
1969
1970 for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1971 if (INSN_P (p) && p != succ && p != succ2 && is_volatile_p (PATTERN (p)))
1972 return 0;
1973
1974 /* If INSN contains an autoincrement or autodecrement, make sure that
1975 register is not used between there and I3, and not already used in
1976 I3 either. Neither must it be used in PRED or SUCC, if they exist.
1977 Also insist that I3 not be a jump; if it were one
1978 and the incremented register were spilled, we would lose. */
1979
1980 #ifdef AUTO_INC_DEC
1981 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1982 if (REG_NOTE_KIND (link) == REG_INC
1983 && (JUMP_P (i3)
1984 || reg_used_between_p (XEXP (link, 0), insn, i3)
1985 || (pred != NULL_RTX
1986 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred)))
1987 || (pred2 != NULL_RTX
1988 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (pred2)))
1989 || (succ != NULL_RTX
1990 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ)))
1991 || (succ2 != NULL_RTX
1992 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (succ2)))
1993 || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1994 return 0;
1995 #endif
1996
1997 #ifdef HAVE_cc0
1998 /* Don't combine an insn that follows a CC0-setting insn.
1999 An insn that uses CC0 must not be separated from the one that sets it.
2000 We do, however, allow I2 to follow a CC0-setting insn if that insn
2001 is passed as I1; in that case it will be deleted also.
2002 We also allow combining in this case if all the insns are adjacent
2003 because that would leave the two CC0 insns adjacent as well.
2004 It would be more logical to test whether CC0 occurs inside I1 or I2,
2005 but that would be much slower, and this ought to be equivalent. */
2006
2007 p = prev_nonnote_insn (insn);
2008 if (p && p != pred && NONJUMP_INSN_P (p) && sets_cc0_p (PATTERN (p))
2009 && ! all_adjacent)
2010 return 0;
2011 #endif
2012
2013 /* If we get here, we have passed all the tests and the combination is
2014 to be allowed. */
2015
2016 *pdest = dest;
2017 *psrc = src;
2018
2019 return 1;
2020 }
2021 \f
2022 /* LOC is the location within I3 that contains its pattern or the component
2023 of a PARALLEL of the pattern. We validate that it is valid for combining.
2024
2025 One problem is if I3 modifies its output, as opposed to replacing it
2026 entirely, we can't allow the output to contain I2DEST, I1DEST or I0DEST as
2027 doing so would produce an insn that is not equivalent to the original insns.
2028
2029 Consider:
2030
2031 (set (reg:DI 101) (reg:DI 100))
2032 (set (subreg:SI (reg:DI 101) 0) <foo>)
2033
2034 This is NOT equivalent to:
2035
2036 (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
2037 (set (reg:DI 101) (reg:DI 100))])
2038
2039 Not only does this modify 100 (in which case it might still be valid
2040 if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100.
2041
2042 We can also run into a problem if I2 sets a register that I1
2043 uses and I1 gets directly substituted into I3 (not via I2). In that
2044 case, we would be getting the wrong value of I2DEST into I3, so we
2045 must reject the combination. This case occurs when I2 and I1 both
2046 feed into I3, rather than when I1 feeds into I2, which feeds into I3.
2047 If I1_NOT_IN_SRC is nonzero, it means that finding I1 in the source
2048 of a SET must prevent combination from occurring. The same situation
2049 can occur for I0, in which case I0_NOT_IN_SRC is set.
2050
2051 Before doing the above check, we first try to expand a field assignment
2052 into a set of logical operations.
2053
2054 If PI3_DEST_KILLED is nonzero, it is a pointer to a location in which
2055 we place a register that is both set and used within I3. If more than one
2056 such register is detected, we fail.
2057
2058 Return 1 if the combination is valid, zero otherwise. */
2059
2060 static int
2061 combinable_i3pat (rtx i3, rtx *loc, rtx i2dest, rtx i1dest, rtx i0dest,
2062 int i1_not_in_src, int i0_not_in_src, rtx *pi3dest_killed)
2063 {
2064 rtx x = *loc;
2065
2066 if (GET_CODE (x) == SET)
2067 {
2068 rtx set = x ;
2069 rtx dest = SET_DEST (set);
2070 rtx src = SET_SRC (set);
2071 rtx inner_dest = dest;
2072 rtx subdest;
2073
2074 while (GET_CODE (inner_dest) == STRICT_LOW_PART
2075 || GET_CODE (inner_dest) == SUBREG
2076 || GET_CODE (inner_dest) == ZERO_EXTRACT)
2077 inner_dest = XEXP (inner_dest, 0);
2078
2079 /* Check for the case where I3 modifies its output, as discussed
2080 above. We don't want to prevent pseudos from being combined
2081 into the address of a MEM, so only prevent the combination if
2082 i1 or i2 set the same MEM. */
2083 if ((inner_dest != dest &&
2084 (!MEM_P (inner_dest)
2085 || rtx_equal_p (i2dest, inner_dest)
2086 || (i1dest && rtx_equal_p (i1dest, inner_dest))
2087 || (i0dest && rtx_equal_p (i0dest, inner_dest)))
2088 && (reg_overlap_mentioned_p (i2dest, inner_dest)
2089 || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))
2090 || (i0dest && reg_overlap_mentioned_p (i0dest, inner_dest))))
2091
2092 /* This is the same test done in can_combine_p except we can't test
2093 all_adjacent; we don't have to, since this instruction will stay
2094 in place, thus we are not considering increasing the lifetime of
2095 INNER_DEST.
2096
2097 Also, if this insn sets a function argument, combining it with
2098 something that might need a spill could clobber a previous
2099 function argument; the all_adjacent test in can_combine_p also
2100 checks this; here, we do a more specific test for this case. */
2101
2102 || (REG_P (inner_dest)
2103 && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
2104 && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
2105 GET_MODE (inner_dest))))
2106 || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src))
2107 || (i0_not_in_src && reg_overlap_mentioned_p (i0dest, src)))
2108 return 0;
2109
2110 /* If DEST is used in I3, it is being killed in this insn, so
2111 record that for later. We have to consider paradoxical
2112 subregs here, since they kill the whole register, but we
2113 ignore partial subregs, STRICT_LOW_PART, etc.
2114 Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
2115 STACK_POINTER_REGNUM, since these are always considered to be
2116 live. Similarly for ARG_POINTER_REGNUM if it is fixed. */
2117 subdest = dest;
2118 if (GET_CODE (subdest) == SUBREG
2119 && (GET_MODE_SIZE (GET_MODE (subdest))
2120 >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (subdest)))))
2121 subdest = SUBREG_REG (subdest);
2122 if (pi3dest_killed
2123 && REG_P (subdest)
2124 && reg_referenced_p (subdest, PATTERN (i3))
2125 && REGNO (subdest) != FRAME_POINTER_REGNUM
2126 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
2127 && REGNO (subdest) != HARD_FRAME_POINTER_REGNUM
2128 #endif
2129 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
2130 && (REGNO (subdest) != ARG_POINTER_REGNUM
2131 || ! fixed_regs [REGNO (subdest)])
2132 #endif
2133 && REGNO (subdest) != STACK_POINTER_REGNUM)
2134 {
2135 if (*pi3dest_killed)
2136 return 0;
2137
2138 *pi3dest_killed = subdest;
2139 }
2140 }
2141
2142 else if (GET_CODE (x) == PARALLEL)
2143 {
2144 int i;
2145
2146 for (i = 0; i < XVECLEN (x, 0); i++)
2147 if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest, i0dest,
2148 i1_not_in_src, i0_not_in_src, pi3dest_killed))
2149 return 0;
2150 }
2151
2152 return 1;
2153 }
2154 \f
2155 /* Return 1 if X is an arithmetic expression that contains a multiplication
2156 and division. We don't count multiplications by powers of two here. */
2157
2158 static int
2159 contains_muldiv (rtx x)
2160 {
2161 switch (GET_CODE (x))
2162 {
2163 case MOD: case DIV: case UMOD: case UDIV:
2164 return 1;
2165
2166 case MULT:
2167 return ! (CONST_INT_P (XEXP (x, 1))
2168 && exact_log2 (UINTVAL (XEXP (x, 1))) >= 0);
2169 default:
2170 if (BINARY_P (x))
2171 return contains_muldiv (XEXP (x, 0))
2172 || contains_muldiv (XEXP (x, 1));
2173
2174 if (UNARY_P (x))
2175 return contains_muldiv (XEXP (x, 0));
2176
2177 return 0;
2178 }
2179 }
2180 \f
2181 /* Determine whether INSN can be used in a combination. Return nonzero if
2182 not. This is used in try_combine to detect early some cases where we
2183 can't perform combinations. */
2184
2185 static int
2186 cant_combine_insn_p (rtx insn)
2187 {
2188 rtx set;
2189 rtx src, dest;
2190
2191 /* If this isn't really an insn, we can't do anything.
2192 This can occur when flow deletes an insn that it has merged into an
2193 auto-increment address. */
2194 if (! INSN_P (insn))
2195 return 1;
2196
2197 /* Never combine loads and stores involving hard regs that are likely
2198 to be spilled. The register allocator can usually handle such
2199 reg-reg moves by tying. If we allow the combiner to make
2200 substitutions of likely-spilled regs, reload might die.
2201 As an exception, we allow combinations involving fixed regs; these are
2202 not available to the register allocator so there's no risk involved. */
2203
2204 set = single_set (insn);
2205 if (! set)
2206 return 0;
2207 src = SET_SRC (set);
2208 dest = SET_DEST (set);
2209 if (GET_CODE (src) == SUBREG)
2210 src = SUBREG_REG (src);
2211 if (GET_CODE (dest) == SUBREG)
2212 dest = SUBREG_REG (dest);
2213 if (REG_P (src) && REG_P (dest)
2214 && ((HARD_REGISTER_P (src)
2215 && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (src))
2216 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (src))))
2217 || (HARD_REGISTER_P (dest)
2218 && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (dest))
2219 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (dest))))))
2220 return 1;
2221
2222 return 0;
2223 }
2224
2225 struct likely_spilled_retval_info
2226 {
2227 unsigned regno, nregs;
2228 unsigned mask;
2229 };
2230
2231 /* Called via note_stores by likely_spilled_retval_p. Remove from info->mask
2232 hard registers that are known to be written to / clobbered in full. */
2233 static void
2234 likely_spilled_retval_1 (rtx x, const_rtx set, void *data)
2235 {
2236 struct likely_spilled_retval_info *const info =
2237 (struct likely_spilled_retval_info *) data;
2238 unsigned regno, nregs;
2239 unsigned new_mask;
2240
2241 if (!REG_P (XEXP (set, 0)))
2242 return;
2243 regno = REGNO (x);
2244 if (regno >= info->regno + info->nregs)
2245 return;
2246 nregs = hard_regno_nregs[regno][GET_MODE (x)];
2247 if (regno + nregs <= info->regno)
2248 return;
2249 new_mask = (2U << (nregs - 1)) - 1;
2250 if (regno < info->regno)
2251 new_mask >>= info->regno - regno;
2252 else
2253 new_mask <<= regno - info->regno;
2254 info->mask &= ~new_mask;
2255 }
2256
2257 /* Return nonzero iff part of the return value is live during INSN, and
2258 it is likely spilled. This can happen when more than one insn is needed
2259 to copy the return value, e.g. when we consider to combine into the
2260 second copy insn for a complex value. */
2261
2262 static int
2263 likely_spilled_retval_p (rtx insn)
2264 {
2265 rtx use = BB_END (this_basic_block);
2266 rtx reg, p;
2267 unsigned regno, nregs;
2268 /* We assume here that no machine mode needs more than
2269 32 hard registers when the value overlaps with a register
2270 for which TARGET_FUNCTION_VALUE_REGNO_P is true. */
2271 unsigned mask;
2272 struct likely_spilled_retval_info info;
2273
2274 if (!NONJUMP_INSN_P (use) || GET_CODE (PATTERN (use)) != USE || insn == use)
2275 return 0;
2276 reg = XEXP (PATTERN (use), 0);
2277 if (!REG_P (reg) || !targetm.calls.function_value_regno_p (REGNO (reg)))
2278 return 0;
2279 regno = REGNO (reg);
2280 nregs = hard_regno_nregs[regno][GET_MODE (reg)];
2281 if (nregs == 1)
2282 return 0;
2283 mask = (2U << (nregs - 1)) - 1;
2284
2285 /* Disregard parts of the return value that are set later. */
2286 info.regno = regno;
2287 info.nregs = nregs;
2288 info.mask = mask;
2289 for (p = PREV_INSN (use); info.mask && p != insn; p = PREV_INSN (p))
2290 if (INSN_P (p))
2291 note_stores (PATTERN (p), likely_spilled_retval_1, &info);
2292 mask = info.mask;
2293
2294 /* Check if any of the (probably) live return value registers is
2295 likely spilled. */
2296 nregs --;
2297 do
2298 {
2299 if ((mask & 1 << nregs)
2300 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno + nregs)))
2301 return 1;
2302 } while (nregs--);
2303 return 0;
2304 }
2305
2306 /* Adjust INSN after we made a change to its destination.
2307
2308 Changing the destination can invalidate notes that say something about
2309 the results of the insn and a LOG_LINK pointing to the insn. */
2310
2311 static void
2312 adjust_for_new_dest (rtx insn)
2313 {
2314 /* For notes, be conservative and simply remove them. */
2315 remove_reg_equal_equiv_notes (insn);
2316
2317 /* The new insn will have a destination that was previously the destination
2318 of an insn just above it. Call distribute_links to make a LOG_LINK from
2319 the next use of that destination. */
2320 distribute_links (alloc_insn_link (insn, NULL));
2321
2322 df_insn_rescan (insn);
2323 }
2324
2325 /* Return TRUE if combine can reuse reg X in mode MODE.
2326 ADDED_SETS is nonzero if the original set is still required. */
2327 static bool
2328 can_change_dest_mode (rtx x, int added_sets, enum machine_mode mode)
2329 {
2330 unsigned int regno;
2331
2332 if (!REG_P (x))
2333 return false;
2334
2335 regno = REGNO (x);
2336 /* Allow hard registers if the new mode is legal, and occupies no more
2337 registers than the old mode. */
2338 if (regno < FIRST_PSEUDO_REGISTER)
2339 return (HARD_REGNO_MODE_OK (regno, mode)
2340 && (hard_regno_nregs[regno][GET_MODE (x)]
2341 >= hard_regno_nregs[regno][mode]));
2342
2343 /* Or a pseudo that is only used once. */
2344 return (REG_N_SETS (regno) == 1 && !added_sets
2345 && !REG_USERVAR_P (x));
2346 }
2347
2348
2349 /* Check whether X, the destination of a set, refers to part of
2350 the register specified by REG. */
2351
2352 static bool
2353 reg_subword_p (rtx x, rtx reg)
2354 {
2355 /* Check that reg is an integer mode register. */
2356 if (!REG_P (reg) || GET_MODE_CLASS (GET_MODE (reg)) != MODE_INT)
2357 return false;
2358
2359 if (GET_CODE (x) == STRICT_LOW_PART
2360 || GET_CODE (x) == ZERO_EXTRACT)
2361 x = XEXP (x, 0);
2362
2363 return GET_CODE (x) == SUBREG
2364 && SUBREG_REG (x) == reg
2365 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT;
2366 }
2367
2368 /* Delete the unconditional jump INSN and adjust the CFG correspondingly.
2369 Note that the INSN should be deleted *after* removing dead edges, so
2370 that the kept edge is the fallthrough edge for a (set (pc) (pc))
2371 but not for a (set (pc) (label_ref FOO)). */
2372
2373 static void
2374 update_cfg_for_uncondjump (rtx insn)
2375 {
2376 basic_block bb = BLOCK_FOR_INSN (insn);
2377 gcc_assert (BB_END (bb) == insn);
2378
2379 purge_dead_edges (bb);
2380
2381 delete_insn (insn);
2382 if (EDGE_COUNT (bb->succs) == 1)
2383 {
2384 rtx insn;
2385
2386 single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
2387
2388 /* Remove barriers from the footer if there are any. */
2389 for (insn = BB_FOOTER (bb); insn; insn = NEXT_INSN (insn))
2390 if (BARRIER_P (insn))
2391 {
2392 if (PREV_INSN (insn))
2393 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2394 else
2395 BB_FOOTER (bb) = NEXT_INSN (insn);
2396 if (NEXT_INSN (insn))
2397 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2398 }
2399 else if (LABEL_P (insn))
2400 break;
2401 }
2402 }
2403
2404 /* Try to combine the insns I0, I1 and I2 into I3.
2405 Here I0, I1 and I2 appear earlier than I3.
2406 I0 and I1 can be zero; then we combine just I2 into I3, or I1 and I2 into
2407 I3.
2408
2409 If we are combining more than two insns and the resulting insn is not
2410 recognized, try splitting it into two insns. If that happens, I2 and I3
2411 are retained and I1/I0 are pseudo-deleted by turning them into a NOTE.
2412 Otherwise, I0, I1 and I2 are pseudo-deleted.
2413
2414 Return 0 if the combination does not work. Then nothing is changed.
2415 If we did the combination, return the insn at which combine should
2416 resume scanning.
2417
2418 Set NEW_DIRECT_JUMP_P to a nonzero value if try_combine creates a
2419 new direct jump instruction.
2420
2421 LAST_COMBINED_INSN is either I3, or some insn after I3 that has
2422 been I3 passed to an earlier try_combine within the same basic
2423 block. */
2424
2425 static rtx
2426 try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
2427 rtx last_combined_insn)
2428 {
2429 /* New patterns for I3 and I2, respectively. */
2430 rtx newpat, newi2pat = 0;
2431 rtvec newpat_vec_with_clobbers = 0;
2432 int substed_i2 = 0, substed_i1 = 0, substed_i0 = 0;
2433 /* Indicates need to preserve SET in I0, I1 or I2 in I3 if it is not
2434 dead. */
2435 int added_sets_0, added_sets_1, added_sets_2;
2436 /* Total number of SETs to put into I3. */
2437 int total_sets;
2438 /* Nonzero if I2's or I1's body now appears in I3. */
2439 int i2_is_used = 0, i1_is_used = 0;
2440 /* INSN_CODEs for new I3, new I2, and user of condition code. */
2441 int insn_code_number, i2_code_number = 0, other_code_number = 0;
2442 /* Contains I3 if the destination of I3 is used in its source, which means
2443 that the old life of I3 is being killed. If that usage is placed into
2444 I2 and not in I3, a REG_DEAD note must be made. */
2445 rtx i3dest_killed = 0;
2446 /* SET_DEST and SET_SRC of I2, I1 and I0. */
2447 rtx i2dest = 0, i2src = 0, i1dest = 0, i1src = 0, i0dest = 0, i0src = 0;
2448 /* Copy of SET_SRC of I1 and I0, if needed. */
2449 rtx i1src_copy = 0, i0src_copy = 0, i0src_copy2 = 0;
2450 /* Set if I2DEST was reused as a scratch register. */
2451 bool i2scratch = false;
2452 /* The PATTERNs of I0, I1, and I2, or a copy of them in certain cases. */
2453 rtx i0pat = 0, i1pat = 0, i2pat = 0;
2454 /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC. */
2455 int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
2456 int i0dest_in_i0src = 0, i1dest_in_i0src = 0, i2dest_in_i0src = 0;
2457 int i2dest_killed = 0, i1dest_killed = 0, i0dest_killed = 0;
2458 int i1_feeds_i2_n = 0, i0_feeds_i2_n = 0, i0_feeds_i1_n = 0;
2459 /* Notes that must be added to REG_NOTES in I3 and I2. */
2460 rtx new_i3_notes, new_i2_notes;
2461 /* Notes that we substituted I3 into I2 instead of the normal case. */
2462 int i3_subst_into_i2 = 0;
2463 /* Notes that I1, I2 or I3 is a MULT operation. */
2464 int have_mult = 0;
2465 int swap_i2i3 = 0;
2466 int changed_i3_dest = 0;
2467
2468 int maxreg;
2469 rtx temp;
2470 struct insn_link *link;
2471 rtx other_pat = 0;
2472 rtx new_other_notes;
2473 int i;
2474
2475 /* Only try four-insn combinations when there's high likelihood of
2476 success. Look for simple insns, such as loads of constants or
2477 binary operations involving a constant. */
2478 if (i0)
2479 {
2480 int i;
2481 int ngood = 0;
2482 int nshift = 0;
2483
2484 if (!flag_expensive_optimizations)
2485 return 0;
2486
2487 for (i = 0; i < 4; i++)
2488 {
2489 rtx insn = i == 0 ? i0 : i == 1 ? i1 : i == 2 ? i2 : i3;
2490 rtx set = single_set (insn);
2491 rtx src;
2492 if (!set)
2493 continue;
2494 src = SET_SRC (set);
2495 if (CONSTANT_P (src))
2496 {
2497 ngood += 2;
2498 break;
2499 }
2500 else if (BINARY_P (src) && CONSTANT_P (XEXP (src, 1)))
2501 ngood++;
2502 else if (GET_CODE (src) == ASHIFT || GET_CODE (src) == ASHIFTRT
2503 || GET_CODE (src) == LSHIFTRT)
2504 nshift++;
2505 }
2506 if (ngood < 2 && nshift < 2)
2507 return 0;
2508 }
2509
2510 /* Exit early if one of the insns involved can't be used for
2511 combinations. */
2512 if (cant_combine_insn_p (i3)
2513 || cant_combine_insn_p (i2)
2514 || (i1 && cant_combine_insn_p (i1))
2515 || (i0 && cant_combine_insn_p (i0))
2516 || likely_spilled_retval_p (i3))
2517 return 0;
2518
2519 combine_attempts++;
2520 undobuf.other_insn = 0;
2521
2522 /* Reset the hard register usage information. */
2523 CLEAR_HARD_REG_SET (newpat_used_regs);
2524
2525 if (dump_file && (dump_flags & TDF_DETAILS))
2526 {
2527 if (i0)
2528 fprintf (dump_file, "\nTrying %d, %d, %d -> %d:\n",
2529 INSN_UID (i0), INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2530 else if (i1)
2531 fprintf (dump_file, "\nTrying %d, %d -> %d:\n",
2532 INSN_UID (i1), INSN_UID (i2), INSN_UID (i3));
2533 else
2534 fprintf (dump_file, "\nTrying %d -> %d:\n",
2535 INSN_UID (i2), INSN_UID (i3));
2536 }
2537
2538 /* If multiple insns feed into one of I2 or I3, they can be in any
2539 order. To simplify the code below, reorder them in sequence. */
2540 if (i0 && DF_INSN_LUID (i0) > DF_INSN_LUID (i2))
2541 temp = i2, i2 = i0, i0 = temp;
2542 if (i0 && DF_INSN_LUID (i0) > DF_INSN_LUID (i1))
2543 temp = i1, i1 = i0, i0 = temp;
2544 if (i1 && DF_INSN_LUID (i1) > DF_INSN_LUID (i2))
2545 temp = i1, i1 = i2, i2 = temp;
2546
2547 added_links_insn = 0;
2548
2549 /* First check for one important special case that the code below will
2550 not handle. Namely, the case where I1 is zero, I2 is a PARALLEL
2551 and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case,
2552 we may be able to replace that destination with the destination of I3.
2553 This occurs in the common code where we compute both a quotient and
2554 remainder into a structure, in which case we want to do the computation
2555 directly into the structure to avoid register-register copies.
2556
2557 Note that this case handles both multiple sets in I2 and also cases
2558 where I2 has a number of CLOBBERs inside the PARALLEL.
2559
2560 We make very conservative checks below and only try to handle the
2561 most common cases of this. For example, we only handle the case
2562 where I2 and I3 are adjacent to avoid making difficult register
2563 usage tests. */
2564
2565 if (i1 == 0 && NONJUMP_INSN_P (i3) && GET_CODE (PATTERN (i3)) == SET
2566 && REG_P (SET_SRC (PATTERN (i3)))
2567 && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
2568 && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
2569 && GET_CODE (PATTERN (i2)) == PARALLEL
2570 && ! side_effects_p (SET_DEST (PATTERN (i3)))
2571 /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
2572 below would need to check what is inside (and reg_overlap_mentioned_p
2573 doesn't support those codes anyway). Don't allow those destinations;
2574 the resulting insn isn't likely to be recognized anyway. */
2575 && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
2576 && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
2577 && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
2578 SET_DEST (PATTERN (i3)))
2579 && next_active_insn (i2) == i3)
2580 {
2581 rtx p2 = PATTERN (i2);
2582
2583 /* Make sure that the destination of I3,
2584 which we are going to substitute into one output of I2,
2585 is not used within another output of I2. We must avoid making this:
2586 (parallel [(set (mem (reg 69)) ...)
2587 (set (reg 69) ...)])
2588 which is not well-defined as to order of actions.
2589 (Besides, reload can't handle output reloads for this.)
2590
2591 The problem can also happen if the dest of I3 is a memory ref,
2592 if another dest in I2 is an indirect memory ref. */
2593 for (i = 0; i < XVECLEN (p2, 0); i++)
2594 if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
2595 || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
2596 && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
2597 SET_DEST (XVECEXP (p2, 0, i))))
2598 break;
2599
2600 if (i == XVECLEN (p2, 0))
2601 for (i = 0; i < XVECLEN (p2, 0); i++)
2602 if (GET_CODE (XVECEXP (p2, 0, i)) == SET
2603 && SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
2604 {
2605 combine_merges++;
2606
2607 subst_insn = i3;
2608 subst_low_luid = DF_INSN_LUID (i2);
2609
2610 added_sets_2 = added_sets_1 = added_sets_0 = 0;
2611 i2src = SET_SRC (XVECEXP (p2, 0, i));
2612 i2dest = SET_DEST (XVECEXP (p2, 0, i));
2613 i2dest_killed = dead_or_set_p (i2, i2dest);
2614
2615 /* Replace the dest in I2 with our dest and make the resulting
2616 insn the new pattern for I3. Then skip to where we validate
2617 the pattern. Everything was set up above. */
2618 SUBST (SET_DEST (XVECEXP (p2, 0, i)), SET_DEST (PATTERN (i3)));
2619 newpat = p2;
2620 i3_subst_into_i2 = 1;
2621 goto validate_replacement;
2622 }
2623 }
2624
2625 /* If I2 is setting a pseudo to a constant and I3 is setting some
2626 sub-part of it to another constant, merge them by making a new
2627 constant. */
2628 if (i1 == 0
2629 && (temp = single_set (i2)) != 0
2630 && CONST_SCALAR_INT_P (SET_SRC (temp))
2631 && GET_CODE (PATTERN (i3)) == SET
2632 && CONST_SCALAR_INT_P (SET_SRC (PATTERN (i3)))
2633 && reg_subword_p (SET_DEST (PATTERN (i3)), SET_DEST (temp)))
2634 {
2635 rtx dest = SET_DEST (PATTERN (i3));
2636 int offset = -1;
2637 int width = 0;
2638
2639 if (GET_CODE (dest) == ZERO_EXTRACT)
2640 {
2641 if (CONST_INT_P (XEXP (dest, 1))
2642 && CONST_INT_P (XEXP (dest, 2)))
2643 {
2644 width = INTVAL (XEXP (dest, 1));
2645 offset = INTVAL (XEXP (dest, 2));
2646 dest = XEXP (dest, 0);
2647 if (BITS_BIG_ENDIAN)
2648 offset = GET_MODE_PRECISION (GET_MODE (dest)) - width - offset;
2649 }
2650 }
2651 else
2652 {
2653 if (GET_CODE (dest) == STRICT_LOW_PART)
2654 dest = XEXP (dest, 0);
2655 width = GET_MODE_PRECISION (GET_MODE (dest));
2656 offset = 0;
2657 }
2658
2659 if (offset >= 0)
2660 {
2661 /* If this is the low part, we're done. */
2662 if (subreg_lowpart_p (dest))
2663 ;
2664 /* Handle the case where inner is twice the size of outer. */
2665 else if (GET_MODE_PRECISION (GET_MODE (SET_DEST (temp)))
2666 == 2 * GET_MODE_PRECISION (GET_MODE (dest)))
2667 offset += GET_MODE_PRECISION (GET_MODE (dest));
2668 /* Otherwise give up for now. */
2669 else
2670 offset = -1;
2671 }
2672
2673 if (offset >= 0
2674 && (GET_MODE_PRECISION (GET_MODE (SET_DEST (temp)))
2675 <= HOST_BITS_PER_DOUBLE_INT))
2676 {
2677 double_int m, o, i;
2678 rtx inner = SET_SRC (PATTERN (i3));
2679 rtx outer = SET_SRC (temp);
2680
2681 o = rtx_to_double_int (outer);
2682 i = rtx_to_double_int (inner);
2683
2684 m = double_int::mask (width);
2685 i &= m;
2686 m = m.llshift (offset, HOST_BITS_PER_DOUBLE_INT);
2687 i = i.llshift (offset, HOST_BITS_PER_DOUBLE_INT);
2688 o = o.and_not (m) | i;
2689
2690 combine_merges++;
2691 subst_insn = i3;
2692 subst_low_luid = DF_INSN_LUID (i2);
2693 added_sets_2 = added_sets_1 = added_sets_0 = 0;
2694 i2dest = SET_DEST (temp);
2695 i2dest_killed = dead_or_set_p (i2, i2dest);
2696
2697 /* Replace the source in I2 with the new constant and make the
2698 resulting insn the new pattern for I3. Then skip to where we
2699 validate the pattern. Everything was set up above. */
2700 SUBST (SET_SRC (temp),
2701 immed_double_int_const (o, GET_MODE (SET_DEST (temp))));
2702
2703 newpat = PATTERN (i2);
2704
2705 /* The dest of I3 has been replaced with the dest of I2. */
2706 changed_i3_dest = 1;
2707 goto validate_replacement;
2708 }
2709 }
2710
2711 #ifndef HAVE_cc0
2712 /* If we have no I1 and I2 looks like:
2713 (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
2714 (set Y OP)])
2715 make up a dummy I1 that is
2716 (set Y OP)
2717 and change I2 to be
2718 (set (reg:CC X) (compare:CC Y (const_int 0)))
2719
2720 (We can ignore any trailing CLOBBERs.)
2721
2722 This undoes a previous combination and allows us to match a branch-and-
2723 decrement insn. */
2724
2725 if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
2726 && XVECLEN (PATTERN (i2), 0) >= 2
2727 && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
2728 && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
2729 == MODE_CC)
2730 && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
2731 && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
2732 && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
2733 && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)))
2734 && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
2735 SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
2736 {
2737 for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
2738 if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
2739 break;
2740
2741 if (i == 1)
2742 {
2743 /* We make I1 with the same INSN_UID as I2. This gives it
2744 the same DF_INSN_LUID for value tracking. Our fake I1 will
2745 never appear in the insn stream so giving it the same INSN_UID
2746 as I2 will not cause a problem. */
2747
2748 i1 = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
2749 BLOCK_FOR_INSN (i2), XVECEXP (PATTERN (i2), 0, 1),
2750 INSN_LOCATION (i2), -1, NULL_RTX);
2751
2752 SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
2753 SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
2754 SET_DEST (PATTERN (i1)));
2755 SUBST_LINK (LOG_LINKS (i2), alloc_insn_link (i1, LOG_LINKS (i2)));
2756 }
2757 }
2758 #endif
2759
2760 /* Verify that I2 and I1 are valid for combining. */
2761 if (! can_combine_p (i2, i3, i0, i1, NULL_RTX, NULL_RTX, &i2dest, &i2src)
2762 || (i1 && ! can_combine_p (i1, i3, i0, NULL_RTX, i2, NULL_RTX,
2763 &i1dest, &i1src))
2764 || (i0 && ! can_combine_p (i0, i3, NULL_RTX, NULL_RTX, i1, i2,
2765 &i0dest, &i0src)))
2766 {
2767 undo_all ();
2768 return 0;
2769 }
2770
2771 /* Record whether I2DEST is used in I2SRC and similarly for the other
2772 cases. Knowing this will help in register status updating below. */
2773 i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
2774 i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
2775 i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
2776 i0dest_in_i0src = i0 && reg_overlap_mentioned_p (i0dest, i0src);
2777 i1dest_in_i0src = i0 && reg_overlap_mentioned_p (i1dest, i0src);
2778 i2dest_in_i0src = i0 && reg_overlap_mentioned_p (i2dest, i0src);
2779 i2dest_killed = dead_or_set_p (i2, i2dest);
2780 i1dest_killed = i1 && dead_or_set_p (i1, i1dest);
2781 i0dest_killed = i0 && dead_or_set_p (i0, i0dest);
2782
2783 /* For the earlier insns, determine which of the subsequent ones they
2784 feed. */
2785 i1_feeds_i2_n = i1 && insn_a_feeds_b (i1, i2);
2786 i0_feeds_i1_n = i0 && insn_a_feeds_b (i0, i1);
2787 i0_feeds_i2_n = (i0 && (!i0_feeds_i1_n ? insn_a_feeds_b (i0, i2)
2788 : (!reg_overlap_mentioned_p (i1dest, i0dest)
2789 && reg_overlap_mentioned_p (i0dest, i2src))));
2790
2791 /* Ensure that I3's pattern can be the destination of combines. */
2792 if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest, i0dest,
2793 i1 && i2dest_in_i1src && !i1_feeds_i2_n,
2794 i0 && ((i2dest_in_i0src && !i0_feeds_i2_n)
2795 || (i1dest_in_i0src && !i0_feeds_i1_n)),
2796 &i3dest_killed))
2797 {
2798 undo_all ();
2799 return 0;
2800 }
2801
2802 /* See if any of the insns is a MULT operation. Unless one is, we will
2803 reject a combination that is, since it must be slower. Be conservative
2804 here. */
2805 if (GET_CODE (i2src) == MULT
2806 || (i1 != 0 && GET_CODE (i1src) == MULT)
2807 || (i0 != 0 && GET_CODE (i0src) == MULT)
2808 || (GET_CODE (PATTERN (i3)) == SET
2809 && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
2810 have_mult = 1;
2811
2812 /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
2813 We used to do this EXCEPT in one case: I3 has a post-inc in an
2814 output operand. However, that exception can give rise to insns like
2815 mov r3,(r3)+
2816 which is a famous insn on the PDP-11 where the value of r3 used as the
2817 source was model-dependent. Avoid this sort of thing. */
2818
2819 #if 0
2820 if (!(GET_CODE (PATTERN (i3)) == SET
2821 && REG_P (SET_SRC (PATTERN (i3)))
2822 && MEM_P (SET_DEST (PATTERN (i3)))
2823 && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
2824 || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
2825 /* It's not the exception. */
2826 #endif
2827 #ifdef AUTO_INC_DEC
2828 {
2829 rtx link;
2830 for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
2831 if (REG_NOTE_KIND (link) == REG_INC
2832 && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
2833 || (i1 != 0
2834 && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
2835 {
2836 undo_all ();
2837 return 0;
2838 }
2839 }
2840 #endif
2841
2842 /* See if the SETs in I1 or I2 need to be kept around in the merged
2843 instruction: whenever the value set there is still needed past I3.
2844 For the SET in I2, this is easy: we see if I2DEST dies or is set in I3.
2845
2846 For the SET in I1, we have two cases: if I1 and I2 independently feed
2847 into I3, the set in I1 needs to be kept around unless I1DEST dies
2848 or is set in I3. Otherwise (if I1 feeds I2 which feeds I3), the set
2849 in I1 needs to be kept around unless I1DEST dies or is set in either
2850 I2 or I3. The same considerations apply to I0. */
2851
2852 added_sets_2 = !dead_or_set_p (i3, i2dest);
2853
2854 if (i1)
2855 added_sets_1 = !(dead_or_set_p (i3, i1dest)
2856 || (i1_feeds_i2_n && dead_or_set_p (i2, i1dest)));
2857 else
2858 added_sets_1 = 0;
2859
2860 if (i0)
2861 added_sets_0 = !(dead_or_set_p (i3, i0dest)
2862 || (i0_feeds_i1_n && dead_or_set_p (i1, i0dest))
2863 || ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n))
2864 && dead_or_set_p (i2, i0dest)));
2865 else
2866 added_sets_0 = 0;
2867
2868 /* We are about to copy insns for the case where they need to be kept
2869 around. Check that they can be copied in the merged instruction. */
2870
2871 if (targetm.cannot_copy_insn_p
2872 && ((added_sets_2 && targetm.cannot_copy_insn_p (i2))
2873 || (i1 && added_sets_1 && targetm.cannot_copy_insn_p (i1))
2874 || (i0 && added_sets_0 && targetm.cannot_copy_insn_p (i0))))
2875 {
2876 undo_all ();
2877 return 0;
2878 }
2879
2880 /* If the set in I2 needs to be kept around, we must make a copy of
2881 PATTERN (I2), so that when we substitute I1SRC for I1DEST in
2882 PATTERN (I2), we are only substituting for the original I1DEST, not into
2883 an already-substituted copy. This also prevents making self-referential
2884 rtx. If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
2885 I2DEST. */
2886
2887 if (added_sets_2)
2888 {
2889 if (GET_CODE (PATTERN (i2)) == PARALLEL)
2890 i2pat = gen_rtx_SET (VOIDmode, i2dest, copy_rtx (i2src));
2891 else
2892 i2pat = copy_rtx (PATTERN (i2));
2893 }
2894
2895 if (added_sets_1)
2896 {
2897 if (GET_CODE (PATTERN (i1)) == PARALLEL)
2898 i1pat = gen_rtx_SET (VOIDmode, i1dest, copy_rtx (i1src));
2899 else
2900 i1pat = copy_rtx (PATTERN (i1));
2901 }
2902
2903 if (added_sets_0)
2904 {
2905 if (GET_CODE (PATTERN (i0)) == PARALLEL)
2906 i0pat = gen_rtx_SET (VOIDmode, i0dest, copy_rtx (i0src));
2907 else
2908 i0pat = copy_rtx (PATTERN (i0));
2909 }
2910
2911 combine_merges++;
2912
2913 /* Substitute in the latest insn for the regs set by the earlier ones. */
2914
2915 maxreg = max_reg_num ();
2916
2917 subst_insn = i3;
2918
2919 #ifndef HAVE_cc0
2920 /* Many machines that don't use CC0 have insns that can both perform an
2921 arithmetic operation and set the condition code. These operations will
2922 be represented as a PARALLEL with the first element of the vector
2923 being a COMPARE of an arithmetic operation with the constant zero.
2924 The second element of the vector will set some pseudo to the result
2925 of the same arithmetic operation. If we simplify the COMPARE, we won't
2926 match such a pattern and so will generate an extra insn. Here we test
2927 for this case, where both the comparison and the operation result are
2928 needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
2929 I2SRC. Later we will make the PARALLEL that contains I2. */
2930
2931 if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
2932 && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
2933 && CONST_INT_P (XEXP (SET_SRC (PATTERN (i3)), 1))
2934 && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
2935 {
2936 rtx newpat_dest;
2937 rtx *cc_use_loc = NULL, cc_use_insn = NULL_RTX;
2938 rtx op0 = i2src, op1 = XEXP (SET_SRC (PATTERN (i3)), 1);
2939 enum machine_mode compare_mode, orig_compare_mode;
2940 enum rtx_code compare_code = UNKNOWN, orig_compare_code = UNKNOWN;
2941
2942 newpat = PATTERN (i3);
2943 newpat_dest = SET_DEST (newpat);
2944 compare_mode = orig_compare_mode = GET_MODE (newpat_dest);
2945
2946 if (undobuf.other_insn == 0
2947 && (cc_use_loc = find_single_use (SET_DEST (newpat), i3,
2948 &cc_use_insn)))
2949 {
2950 compare_code = orig_compare_code = GET_CODE (*cc_use_loc);
2951 compare_code = simplify_compare_const (compare_code,
2952 op0, &op1);
2953 target_canonicalize_comparison (&compare_code, &op0, &op1, 1);
2954 }
2955
2956 /* Do the rest only if op1 is const0_rtx, which may be the
2957 result of simplification. */
2958 if (op1 == const0_rtx)
2959 {
2960 /* If a single use of the CC is found, prepare to modify it
2961 when SELECT_CC_MODE returns a new CC-class mode, or when
2962 the above simplify_compare_const() returned a new comparison
2963 operator. undobuf.other_insn is assigned the CC use insn
2964 when modifying it. */
2965 if (cc_use_loc)
2966 {
2967 #ifdef SELECT_CC_MODE
2968 enum machine_mode new_mode
2969 = SELECT_CC_MODE (compare_code, op0, op1);
2970 if (new_mode != orig_compare_mode
2971 && can_change_dest_mode (SET_DEST (newpat),
2972 added_sets_2, new_mode))
2973 {
2974 unsigned int regno = REGNO (newpat_dest);
2975 compare_mode = new_mode;
2976 if (regno < FIRST_PSEUDO_REGISTER)
2977 newpat_dest = gen_rtx_REG (compare_mode, regno);
2978 else
2979 {
2980 SUBST_MODE (regno_reg_rtx[regno], compare_mode);
2981 newpat_dest = regno_reg_rtx[regno];
2982 }
2983 }
2984 #endif
2985 /* Cases for modifying the CC-using comparison. */
2986 if (compare_code != orig_compare_code
2987 /* ??? Do we need to verify the zero rtx? */
2988 && XEXP (*cc_use_loc, 1) == const0_rtx)
2989 {
2990 /* Replace cc_use_loc with entire new RTX. */
2991 SUBST (*cc_use_loc,
2992 gen_rtx_fmt_ee (compare_code, compare_mode,
2993 newpat_dest, const0_rtx));
2994 undobuf.other_insn = cc_use_insn;
2995 }
2996 else if (compare_mode != orig_compare_mode)
2997 {
2998 /* Just replace the CC reg with a new mode. */
2999 SUBST (XEXP (*cc_use_loc, 0), newpat_dest);
3000 undobuf.other_insn = cc_use_insn;
3001 }
3002 }
3003
3004 /* Now we modify the current newpat:
3005 First, SET_DEST(newpat) is updated if the CC mode has been
3006 altered. For targets without SELECT_CC_MODE, this should be
3007 optimized away. */
3008 if (compare_mode != orig_compare_mode)
3009 SUBST (SET_DEST (newpat), newpat_dest);
3010 /* This is always done to propagate i2src into newpat. */
3011 SUBST (SET_SRC (newpat),
3012 gen_rtx_COMPARE (compare_mode, op0, op1));
3013 /* Create new version of i2pat if needed; the below PARALLEL
3014 creation needs this to work correctly. */
3015 if (! rtx_equal_p (i2src, op0))
3016 i2pat = gen_rtx_SET (VOIDmode, i2dest, op0);
3017 i2_is_used = 1;
3018 }
3019 }
3020 #endif
3021
3022 if (i2_is_used == 0)
3023 {
3024 /* It is possible that the source of I2 or I1 may be performing
3025 an unneeded operation, such as a ZERO_EXTEND of something
3026 that is known to have the high part zero. Handle that case
3027 by letting subst look at the inner insns.
3028
3029 Another way to do this would be to have a function that tries
3030 to simplify a single insn instead of merging two or more
3031 insns. We don't do this because of the potential of infinite
3032 loops and because of the potential extra memory required.
3033 However, doing it the way we are is a bit of a kludge and
3034 doesn't catch all cases.
3035
3036 But only do this if -fexpensive-optimizations since it slows
3037 things down and doesn't usually win.
3038
3039 This is not done in the COMPARE case above because the
3040 unmodified I2PAT is used in the PARALLEL and so a pattern
3041 with a modified I2SRC would not match. */
3042
3043 if (flag_expensive_optimizations)
3044 {
3045 /* Pass pc_rtx so no substitutions are done, just
3046 simplifications. */
3047 if (i1)
3048 {
3049 subst_low_luid = DF_INSN_LUID (i1);
3050 i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0, 0);
3051 }
3052
3053 subst_low_luid = DF_INSN_LUID (i2);
3054 i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0, 0);
3055 }
3056
3057 n_occurrences = 0; /* `subst' counts here */
3058 subst_low_luid = DF_INSN_LUID (i2);
3059
3060 /* If I1 feeds into I2 and I1DEST is in I1SRC, we need to make a unique
3061 copy of I2SRC each time we substitute it, in order to avoid creating
3062 self-referential RTL when we will be substituting I1SRC for I1DEST
3063 later. Likewise if I0 feeds into I2, either directly or indirectly
3064 through I1, and I0DEST is in I0SRC. */
3065 newpat = subst (PATTERN (i3), i2dest, i2src, 0, 0,
3066 (i1_feeds_i2_n && i1dest_in_i1src)
3067 || ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n))
3068 && i0dest_in_i0src));
3069 substed_i2 = 1;
3070
3071 /* Record whether I2's body now appears within I3's body. */
3072 i2_is_used = n_occurrences;
3073 }
3074
3075 /* If we already got a failure, don't try to do more. Otherwise, try to
3076 substitute I1 if we have it. */
3077
3078 if (i1 && GET_CODE (newpat) != CLOBBER)
3079 {
3080 /* Check that an autoincrement side-effect on I1 has not been lost.
3081 This happens if I1DEST is mentioned in I2 and dies there, and
3082 has disappeared from the new pattern. */
3083 if ((FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
3084 && i1_feeds_i2_n
3085 && dead_or_set_p (i2, i1dest)
3086 && !reg_overlap_mentioned_p (i1dest, newpat))
3087 /* Before we can do this substitution, we must redo the test done
3088 above (see detailed comments there) that ensures I1DEST isn't
3089 mentioned in any SETs in NEWPAT that are field assignments. */
3090 || !combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, NULL_RTX,
3091 0, 0, 0))
3092 {
3093 undo_all ();
3094 return 0;
3095 }
3096
3097 n_occurrences = 0;
3098 subst_low_luid = DF_INSN_LUID (i1);
3099
3100 /* If the following substitution will modify I1SRC, make a copy of it
3101 for the case where it is substituted for I1DEST in I2PAT later. */
3102 if (added_sets_2 && i1_feeds_i2_n)
3103 i1src_copy = copy_rtx (i1src);
3104
3105 /* If I0 feeds into I1 and I0DEST is in I0SRC, we need to make a unique
3106 copy of I1SRC each time we substitute it, in order to avoid creating
3107 self-referential RTL when we will be substituting I0SRC for I0DEST
3108 later. */
3109 newpat = subst (newpat, i1dest, i1src, 0, 0,
3110 i0_feeds_i1_n && i0dest_in_i0src);
3111 substed_i1 = 1;
3112
3113 /* Record whether I1's body now appears within I3's body. */
3114 i1_is_used = n_occurrences;
3115 }
3116
3117 /* Likewise for I0 if we have it. */
3118
3119 if (i0 && GET_CODE (newpat) != CLOBBER)
3120 {
3121 if ((FIND_REG_INC_NOTE (i0, NULL_RTX) != 0
3122 && ((i0_feeds_i2_n && dead_or_set_p (i2, i0dest))
3123 || (i0_feeds_i1_n && dead_or_set_p (i1, i0dest)))
3124 && !reg_overlap_mentioned_p (i0dest, newpat))
3125 || !combinable_i3pat (NULL_RTX, &newpat, i0dest, NULL_RTX, NULL_RTX,
3126 0, 0, 0))
3127 {
3128 undo_all ();
3129 return 0;
3130 }
3131
3132 /* If the following substitution will modify I0SRC, make a copy of it
3133 for the case where it is substituted for I0DEST in I1PAT later. */
3134 if (added_sets_1 && i0_feeds_i1_n)
3135 i0src_copy = copy_rtx (i0src);
3136 /* And a copy for I0DEST in I2PAT substitution. */
3137 if (added_sets_2 && ((i0_feeds_i1_n && i1_feeds_i2_n)
3138 || (i0_feeds_i2_n)))
3139 i0src_copy2 = copy_rtx (i0src);
3140
3141 n_occurrences = 0;
3142 subst_low_luid = DF_INSN_LUID (i0);
3143 newpat = subst (newpat, i0dest, i0src, 0, 0, 0);
3144 substed_i0 = 1;
3145 }
3146
3147 /* Fail if an autoincrement side-effect has been duplicated. Be careful
3148 to count all the ways that I2SRC and I1SRC can be used. */
3149 if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
3150 && i2_is_used + added_sets_2 > 1)
3151 || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
3152 && (i1_is_used + added_sets_1 + (added_sets_2 && i1_feeds_i2_n)
3153 > 1))
3154 || (i0 != 0 && FIND_REG_INC_NOTE (i0, NULL_RTX) != 0
3155 && (n_occurrences + added_sets_0
3156 + (added_sets_1 && i0_feeds_i1_n)
3157 + (added_sets_2 && i0_feeds_i2_n)
3158 > 1))
3159 /* Fail if we tried to make a new register. */
3160 || max_reg_num () != maxreg
3161 /* Fail if we couldn't do something and have a CLOBBER. */
3162 || GET_CODE (newpat) == CLOBBER
3163 /* Fail if this new pattern is a MULT and we didn't have one before
3164 at the outer level. */
3165 || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
3166 && ! have_mult))
3167 {
3168 undo_all ();
3169 return 0;
3170 }
3171
3172 /* If the actions of the earlier insns must be kept
3173 in addition to substituting them into the latest one,
3174 we must make a new PARALLEL for the latest insn
3175 to hold additional the SETs. */
3176
3177 if (added_sets_0 || added_sets_1 || added_sets_2)
3178 {
3179 int extra_sets = added_sets_0 + added_sets_1 + added_sets_2;
3180 combine_extras++;
3181
3182 if (GET_CODE (newpat) == PARALLEL)
3183 {
3184 rtvec old = XVEC (newpat, 0);
3185 total_sets = XVECLEN (newpat, 0) + extra_sets;
3186 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3187 memcpy (XVEC (newpat, 0)->elem, &old->elem[0],
3188 sizeof (old->elem[0]) * old->num_elem);
3189 }
3190 else
3191 {
3192 rtx old = newpat;
3193 total_sets = 1 + extra_sets;
3194 newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
3195 XVECEXP (newpat, 0, 0) = old;
3196 }
3197
3198 if (added_sets_0)
3199 XVECEXP (newpat, 0, --total_sets) = i0pat;
3200
3201 if (added_sets_1)
3202 {
3203 rtx t = i1pat;
3204 if (i0_feeds_i1_n)
3205 t = subst (t, i0dest, i0src_copy ? i0src_copy : i0src, 0, 0, 0);
3206
3207 XVECEXP (newpat, 0, --total_sets) = t;
3208 }
3209 if (added_sets_2)
3210 {
3211 rtx t = i2pat;
3212 if (i1_feeds_i2_n)
3213 t = subst (t, i1dest, i1src_copy ? i1src_copy : i1src, 0, 0,
3214 i0_feeds_i1_n && i0dest_in_i0src);
3215 if ((i0_feeds_i1_n && i1_feeds_i2_n) || i0_feeds_i2_n)
3216 t = subst (t, i0dest, i0src_copy2 ? i0src_copy2 : i0src, 0, 0, 0);
3217
3218 XVECEXP (newpat, 0, --total_sets) = t;
3219 }
3220 }
3221
3222 validate_replacement:
3223
3224 /* Note which hard regs this insn has as inputs. */
3225 mark_used_regs_combine (newpat);
3226
3227 /* If recog_for_combine fails, it strips existing clobbers. If we'll
3228 consider splitting this pattern, we might need these clobbers. */
3229 if (i1 && GET_CODE (newpat) == PARALLEL
3230 && GET_CODE (XVECEXP (newpat, 0, XVECLEN (newpat, 0) - 1)) == CLOBBER)
3231 {
3232 int len = XVECLEN (newpat, 0);
3233
3234 newpat_vec_with_clobbers = rtvec_alloc (len);
3235 for (i = 0; i < len; i++)
3236 RTVEC_ELT (newpat_vec_with_clobbers, i) = XVECEXP (newpat, 0, i);
3237 }
3238
3239 /* Is the result of combination a valid instruction? */
3240 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3241
3242 /* If the result isn't valid, see if it is a PARALLEL of two SETs where
3243 the second SET's destination is a register that is unused and isn't
3244 marked as an instruction that might trap in an EH region. In that case,
3245 we just need the first SET. This can occur when simplifying a divmod
3246 insn. We *must* test for this case here because the code below that
3247 splits two independent SETs doesn't handle this case correctly when it
3248 updates the register status.
3249
3250 It's pointless doing this if we originally had two sets, one from
3251 i3, and one from i2. Combining then splitting the parallel results
3252 in the original i2 again plus an invalid insn (which we delete).
3253 The net effect is only to move instructions around, which makes
3254 debug info less accurate.
3255
3256 Also check the case where the first SET's destination is unused.
3257 That would not cause incorrect code, but does cause an unneeded
3258 insn to remain. */
3259
3260 if (insn_code_number < 0
3261 && !(added_sets_2 && i1 == 0)
3262 && GET_CODE (newpat) == PARALLEL
3263 && XVECLEN (newpat, 0) == 2
3264 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3265 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3266 && asm_noperands (newpat) < 0)
3267 {
3268 rtx set0 = XVECEXP (newpat, 0, 0);
3269 rtx set1 = XVECEXP (newpat, 0, 1);
3270
3271 if (((REG_P (SET_DEST (set1))
3272 && find_reg_note (i3, REG_UNUSED, SET_DEST (set1)))
3273 || (GET_CODE (SET_DEST (set1)) == SUBREG
3274 && find_reg_note (i3, REG_UNUSED, SUBREG_REG (SET_DEST (set1)))))
3275 && insn_nothrow_p (i3)
3276 && !side_effects_p (SET_SRC (set1)))
3277 {
3278 newpat = set0;
3279 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3280 }
3281
3282 else if (((REG_P (SET_DEST (set0))
3283 && find_reg_note (i3, REG_UNUSED, SET_DEST (set0)))
3284 || (GET_CODE (SET_DEST (set0)) == SUBREG
3285 && find_reg_note (i3, REG_UNUSED,
3286 SUBREG_REG (SET_DEST (set0)))))
3287 && insn_nothrow_p (i3)
3288 && !side_effects_p (SET_SRC (set0)))
3289 {
3290 newpat = set1;
3291 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3292
3293 if (insn_code_number >= 0)
3294 changed_i3_dest = 1;
3295 }
3296 }
3297
3298 /* If we were combining three insns and the result is a simple SET
3299 with no ASM_OPERANDS that wasn't recognized, try to split it into two
3300 insns. There are two ways to do this. It can be split using a
3301 machine-specific method (like when you have an addition of a large
3302 constant) or by combine in the function find_split_point. */
3303
3304 if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
3305 && asm_noperands (newpat) < 0)
3306 {
3307 rtx parallel, m_split, *split;
3308
3309 /* See if the MD file can split NEWPAT. If it can't, see if letting it
3310 use I2DEST as a scratch register will help. In the latter case,
3311 convert I2DEST to the mode of the source of NEWPAT if we can. */
3312
3313 m_split = combine_split_insns (newpat, i3);
3314
3315 /* We can only use I2DEST as a scratch reg if it doesn't overlap any
3316 inputs of NEWPAT. */
3317
3318 /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
3319 possible to try that as a scratch reg. This would require adding
3320 more code to make it work though. */
3321
3322 if (m_split == 0 && ! reg_overlap_mentioned_p (i2dest, newpat))
3323 {
3324 enum machine_mode new_mode = GET_MODE (SET_DEST (newpat));
3325
3326 /* First try to split using the original register as a
3327 scratch register. */
3328 parallel = gen_rtx_PARALLEL (VOIDmode,
3329 gen_rtvec (2, newpat,
3330 gen_rtx_CLOBBER (VOIDmode,
3331 i2dest)));
3332 m_split = combine_split_insns (parallel, i3);
3333
3334 /* If that didn't work, try changing the mode of I2DEST if
3335 we can. */
3336 if (m_split == 0
3337 && new_mode != GET_MODE (i2dest)
3338 && new_mode != VOIDmode
3339 && can_change_dest_mode (i2dest, added_sets_2, new_mode))
3340 {
3341 enum machine_mode old_mode = GET_MODE (i2dest);
3342 rtx ni2dest;
3343
3344 if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3345 ni2dest = gen_rtx_REG (new_mode, REGNO (i2dest));
3346 else
3347 {
3348 SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], new_mode);
3349 ni2dest = regno_reg_rtx[REGNO (i2dest)];
3350 }
3351
3352 parallel = (gen_rtx_PARALLEL
3353 (VOIDmode,
3354 gen_rtvec (2, newpat,
3355 gen_rtx_CLOBBER (VOIDmode,
3356 ni2dest))));
3357 m_split = combine_split_insns (parallel, i3);
3358
3359 if (m_split == 0
3360 && REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
3361 {
3362 struct undo *buf;
3363
3364 adjust_reg_mode (regno_reg_rtx[REGNO (i2dest)], old_mode);
3365 buf = undobuf.undos;
3366 undobuf.undos = buf->next;
3367 buf->next = undobuf.frees;
3368 undobuf.frees = buf;
3369 }
3370 }
3371
3372 i2scratch = m_split != 0;
3373 }
3374
3375 /* If recog_for_combine has discarded clobbers, try to use them
3376 again for the split. */
3377 if (m_split == 0 && newpat_vec_with_clobbers)
3378 {
3379 parallel = gen_rtx_PARALLEL (VOIDmode, newpat_vec_with_clobbers);
3380 m_split = combine_split_insns (parallel, i3);
3381 }
3382
3383 if (m_split && NEXT_INSN (m_split) == NULL_RTX)
3384 {
3385 m_split = PATTERN (m_split);
3386 insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes);
3387 if (insn_code_number >= 0)
3388 newpat = m_split;
3389 }
3390 else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX
3391 && (next_nonnote_nondebug_insn (i2) == i3
3392 || ! use_crosses_set_p (PATTERN (m_split), DF_INSN_LUID (i2))))
3393 {
3394 rtx i2set, i3set;
3395 rtx newi3pat = PATTERN (NEXT_INSN (m_split));
3396 newi2pat = PATTERN (m_split);
3397
3398 i3set = single_set (NEXT_INSN (m_split));
3399 i2set = single_set (m_split);
3400
3401 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3402
3403 /* If I2 or I3 has multiple SETs, we won't know how to track
3404 register status, so don't use these insns. If I2's destination
3405 is used between I2 and I3, we also can't use these insns. */
3406
3407 if (i2_code_number >= 0 && i2set && i3set
3408 && (next_nonnote_nondebug_insn (i2) == i3
3409 || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
3410 insn_code_number = recog_for_combine (&newi3pat, i3,
3411 &new_i3_notes);
3412 if (insn_code_number >= 0)
3413 newpat = newi3pat;
3414
3415 /* It is possible that both insns now set the destination of I3.
3416 If so, we must show an extra use of it. */
3417
3418 if (insn_code_number >= 0)
3419 {
3420 rtx new_i3_dest = SET_DEST (i3set);
3421 rtx new_i2_dest = SET_DEST (i2set);
3422
3423 while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
3424 || GET_CODE (new_i3_dest) == STRICT_LOW_PART
3425 || GET_CODE (new_i3_dest) == SUBREG)
3426 new_i3_dest = XEXP (new_i3_dest, 0);
3427
3428 while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
3429 || GET_CODE (new_i2_dest) == STRICT_LOW_PART
3430 || GET_CODE (new_i2_dest) == SUBREG)
3431 new_i2_dest = XEXP (new_i2_dest, 0);
3432
3433 if (REG_P (new_i3_dest)
3434 && REG_P (new_i2_dest)
3435 && REGNO (new_i3_dest) == REGNO (new_i2_dest))
3436 INC_REG_N_SETS (REGNO (new_i2_dest), 1);
3437 }
3438 }
3439
3440 /* If we can split it and use I2DEST, go ahead and see if that
3441 helps things be recognized. Verify that none of the registers
3442 are set between I2 and I3. */
3443 if (insn_code_number < 0
3444 && (split = find_split_point (&newpat, i3, false)) != 0
3445 #ifdef HAVE_cc0
3446 && REG_P (i2dest)
3447 #endif
3448 /* We need I2DEST in the proper mode. If it is a hard register
3449 or the only use of a pseudo, we can change its mode.
3450 Make sure we don't change a hard register to have a mode that
3451 isn't valid for it, or change the number of registers. */
3452 && (GET_MODE (*split) == GET_MODE (i2dest)
3453 || GET_MODE (*split) == VOIDmode
3454 || can_change_dest_mode (i2dest, added_sets_2,
3455 GET_MODE (*split)))
3456 && (next_nonnote_nondebug_insn (i2) == i3
3457 || ! use_crosses_set_p (*split, DF_INSN_LUID (i2)))
3458 /* We can't overwrite I2DEST if its value is still used by
3459 NEWPAT. */
3460 && ! reg_referenced_p (i2dest, newpat))
3461 {
3462 rtx newdest = i2dest;
3463 enum rtx_code split_code = GET_CODE (*split);
3464 enum machine_mode split_mode = GET_MODE (*split);
3465 bool subst_done = false;
3466 newi2pat = NULL_RTX;
3467
3468 i2scratch = true;
3469
3470 /* *SPLIT may be part of I2SRC, so make sure we have the
3471 original expression around for later debug processing.
3472 We should not need I2SRC any more in other cases. */
3473 if (MAY_HAVE_DEBUG_INSNS)
3474 i2src = copy_rtx (i2src);
3475 else
3476 i2src = NULL;
3477
3478 /* Get NEWDEST as a register in the proper mode. We have already
3479 validated that we can do this. */
3480 if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
3481 {
3482 if (REGNO (i2dest) < FIRST_PSEUDO_REGISTER)
3483 newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
3484 else
3485 {
3486 SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], split_mode);
3487 newdest = regno_reg_rtx[REGNO (i2dest)];
3488 }
3489 }
3490
3491 /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
3492 an ASHIFT. This can occur if it was inside a PLUS and hence
3493 appeared to be a memory address. This is a kludge. */
3494 if (split_code == MULT
3495 && CONST_INT_P (XEXP (*split, 1))
3496 && INTVAL (XEXP (*split, 1)) > 0
3497 && (i = exact_log2 (UINTVAL (XEXP (*split, 1)))) >= 0)
3498 {
3499 SUBST (*split, gen_rtx_ASHIFT (split_mode,
3500 XEXP (*split, 0), GEN_INT (i)));
3501 /* Update split_code because we may not have a multiply
3502 anymore. */
3503 split_code = GET_CODE (*split);
3504 }
3505
3506 #ifdef INSN_SCHEDULING
3507 /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
3508 be written as a ZERO_EXTEND. */
3509 if (split_code == SUBREG && MEM_P (SUBREG_REG (*split)))
3510 {
3511 #ifdef LOAD_EXTEND_OP
3512 /* Or as a SIGN_EXTEND if LOAD_EXTEND_OP says that that's
3513 what it really is. */
3514 if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (*split)))
3515 == SIGN_EXTEND)
3516 SUBST (*split, gen_rtx_SIGN_EXTEND (split_mode,
3517 SUBREG_REG (*split)));
3518 else
3519 #endif
3520 SUBST (*split, gen_rtx_ZERO_EXTEND (split_mode,
3521 SUBREG_REG (*split)));
3522 }
3523 #endif
3524
3525 /* Attempt to split binary operators using arithmetic identities. */
3526 if (BINARY_P (SET_SRC (newpat))
3527 && split_mode == GET_MODE (SET_SRC (newpat))
3528 && ! side_effects_p (SET_SRC (newpat)))
3529 {
3530 rtx setsrc = SET_SRC (newpat);
3531 enum machine_mode mode = GET_MODE (setsrc);
3532 enum rtx_code code = GET_CODE (setsrc);
3533 rtx src_op0 = XEXP (setsrc, 0);
3534 rtx src_op1 = XEXP (setsrc, 1);
3535
3536 /* Split "X = Y op Y" as "Z = Y; X = Z op Z". */
3537 if (rtx_equal_p (src_op0, src_op1))
3538 {
3539 newi2pat = gen_rtx_SET (VOIDmode, newdest, src_op0);
3540 SUBST (XEXP (setsrc, 0), newdest);
3541 SUBST (XEXP (setsrc, 1), newdest);
3542 subst_done = true;
3543 }
3544 /* Split "((P op Q) op R) op S" where op is PLUS or MULT. */
3545 else if ((code == PLUS || code == MULT)
3546 && GET_CODE (src_op0) == code
3547 && GET_CODE (XEXP (src_op0, 0)) == code
3548 && (INTEGRAL_MODE_P (mode)
3549 || (FLOAT_MODE_P (mode)
3550 && flag_unsafe_math_optimizations)))
3551 {
3552 rtx p = XEXP (XEXP (src_op0, 0), 0);
3553 rtx q = XEXP (XEXP (src_op0, 0), 1);
3554 rtx r = XEXP (src_op0, 1);
3555 rtx s = src_op1;
3556
3557 /* Split both "((X op Y) op X) op Y" and
3558 "((X op Y) op Y) op X" as "T op T" where T is
3559 "X op Y". */
3560 if ((rtx_equal_p (p,r) && rtx_equal_p (q,s))
3561 || (rtx_equal_p (p,s) && rtx_equal_p (q,r)))
3562 {
3563 newi2pat = gen_rtx_SET (VOIDmode, newdest,
3564 XEXP (src_op0, 0));
3565 SUBST (XEXP (setsrc, 0), newdest);
3566 SUBST (XEXP (setsrc, 1), newdest);
3567 subst_done = true;
3568 }
3569 /* Split "((X op X) op Y) op Y)" as "T op T" where
3570 T is "X op Y". */
3571 else if (rtx_equal_p (p,q) && rtx_equal_p (r,s))
3572 {
3573 rtx tmp = simplify_gen_binary (code, mode, p, r);
3574 newi2pat = gen_rtx_SET (VOIDmode, newdest, tmp);
3575 SUBST (XEXP (setsrc, 0), newdest);
3576 SUBST (XEXP (setsrc, 1), newdest);
3577 subst_done = true;
3578 }
3579 }
3580 }
3581
3582 if (!subst_done)
3583 {
3584 newi2pat = gen_rtx_SET (VOIDmode, newdest, *split);
3585 SUBST (*split, newdest);
3586 }
3587
3588 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3589
3590 /* recog_for_combine might have added CLOBBERs to newi2pat.
3591 Make sure NEWPAT does not depend on the clobbered regs. */
3592 if (GET_CODE (newi2pat) == PARALLEL)
3593 for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3594 if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3595 {
3596 rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3597 if (reg_overlap_mentioned_p (reg, newpat))
3598 {
3599 undo_all ();
3600 return 0;
3601 }
3602 }
3603
3604 /* If the split point was a MULT and we didn't have one before,
3605 don't use one now. */
3606 if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
3607 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3608 }
3609 }
3610
3611 /* Check for a case where we loaded from memory in a narrow mode and
3612 then sign extended it, but we need both registers. In that case,
3613 we have a PARALLEL with both loads from the same memory location.
3614 We can split this into a load from memory followed by a register-register
3615 copy. This saves at least one insn, more if register allocation can
3616 eliminate the copy.
3617
3618 We cannot do this if the destination of the first assignment is a
3619 condition code register or cc0. We eliminate this case by making sure
3620 the SET_DEST and SET_SRC have the same mode.
3621
3622 We cannot do this if the destination of the second assignment is
3623 a register that we have already assumed is zero-extended. Similarly
3624 for a SUBREG of such a register. */
3625
3626 else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3627 && GET_CODE (newpat) == PARALLEL
3628 && XVECLEN (newpat, 0) == 2
3629 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3630 && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
3631 && (GET_MODE (SET_DEST (XVECEXP (newpat, 0, 0)))
3632 == GET_MODE (SET_SRC (XVECEXP (newpat, 0, 0))))
3633 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3634 && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3635 XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
3636 && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
3637 DF_INSN_LUID (i2))
3638 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3639 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3640 && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
3641 (REG_P (temp)
3642 && reg_stat[REGNO (temp)].nonzero_bits != 0
3643 && GET_MODE_PRECISION (GET_MODE (temp)) < BITS_PER_WORD
3644 && GET_MODE_PRECISION (GET_MODE (temp)) < HOST_BITS_PER_INT
3645 && (reg_stat[REGNO (temp)].nonzero_bits
3646 != GET_MODE_MASK (word_mode))))
3647 && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
3648 && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
3649 (REG_P (temp)
3650 && reg_stat[REGNO (temp)].nonzero_bits != 0
3651 && GET_MODE_PRECISION (GET_MODE (temp)) < BITS_PER_WORD
3652 && GET_MODE_PRECISION (GET_MODE (temp)) < HOST_BITS_PER_INT
3653 && (reg_stat[REGNO (temp)].nonzero_bits
3654 != GET_MODE_MASK (word_mode)))))
3655 && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3656 SET_SRC (XVECEXP (newpat, 0, 1)))
3657 && ! find_reg_note (i3, REG_UNUSED,
3658 SET_DEST (XVECEXP (newpat, 0, 0))))
3659 {
3660 rtx ni2dest;
3661
3662 newi2pat = XVECEXP (newpat, 0, 0);
3663 ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
3664 newpat = XVECEXP (newpat, 0, 1);
3665 SUBST (SET_SRC (newpat),
3666 gen_lowpart (GET_MODE (SET_SRC (newpat)), ni2dest));
3667 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3668
3669 if (i2_code_number >= 0)
3670 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3671
3672 if (insn_code_number >= 0)
3673 swap_i2i3 = 1;
3674 }
3675
3676 /* Similarly, check for a case where we have a PARALLEL of two independent
3677 SETs but we started with three insns. In this case, we can do the sets
3678 as two separate insns. This case occurs when some SET allows two
3679 other insns to combine, but the destination of that SET is still live. */
3680
3681 else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
3682 && GET_CODE (newpat) == PARALLEL
3683 && XVECLEN (newpat, 0) == 2
3684 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
3685 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
3686 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
3687 && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
3688 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
3689 && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
3690 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
3691 XVECEXP (newpat, 0, 0))
3692 && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
3693 XVECEXP (newpat, 0, 1))
3694 && ! (contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 0)))
3695 && contains_muldiv (SET_SRC (XVECEXP (newpat, 0, 1)))))
3696 {
3697 rtx set0 = XVECEXP (newpat, 0, 0);
3698 rtx set1 = XVECEXP (newpat, 0, 1);
3699
3700 /* Normally, it doesn't matter which of the two is done first,
3701 but the one that references cc0 can't be the second, and
3702 one which uses any regs/memory set in between i2 and i3 can't
3703 be first. The PARALLEL might also have been pre-existing in i3,
3704 so we need to make sure that we won't wrongly hoist a SET to i2
3705 that would conflict with a death note present in there. */
3706 if (!use_crosses_set_p (SET_SRC (set1), DF_INSN_LUID (i2))
3707 && !(REG_P (SET_DEST (set1))
3708 && find_reg_note (i2, REG_DEAD, SET_DEST (set1)))
3709 && !(GET_CODE (SET_DEST (set1)) == SUBREG
3710 && find_reg_note (i2, REG_DEAD,
3711 SUBREG_REG (SET_DEST (set1))))
3712 #ifdef HAVE_cc0
3713 && !reg_referenced_p (cc0_rtx, set0)
3714 #endif
3715 /* If I3 is a jump, ensure that set0 is a jump so that
3716 we do not create invalid RTL. */
3717 && (!JUMP_P (i3) || SET_DEST (set0) == pc_rtx)
3718 )
3719 {
3720 newi2pat = set1;
3721 newpat = set0;
3722 }
3723 else if (!use_crosses_set_p (SET_SRC (set0), DF_INSN_LUID (i2))
3724 && !(REG_P (SET_DEST (set0))
3725 && find_reg_note (i2, REG_DEAD, SET_DEST (set0)))
3726 && !(GET_CODE (SET_DEST (set0)) == SUBREG
3727 && find_reg_note (i2, REG_DEAD,
3728 SUBREG_REG (SET_DEST (set0))))
3729 #ifdef HAVE_cc0
3730 && !reg_referenced_p (cc0_rtx, set1)
3731 #endif
3732 /* If I3 is a jump, ensure that set1 is a jump so that
3733 we do not create invalid RTL. */
3734 && (!JUMP_P (i3) || SET_DEST (set1) == pc_rtx)
3735 )
3736 {
3737 newi2pat = set0;
3738 newpat = set1;
3739 }
3740 else
3741 {
3742 undo_all ();
3743 return 0;
3744 }
3745
3746 i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
3747
3748 if (i2_code_number >= 0)
3749 {
3750 /* recog_for_combine might have added CLOBBERs to newi2pat.
3751 Make sure NEWPAT does not depend on the clobbered regs. */
3752 if (GET_CODE (newi2pat) == PARALLEL)
3753 {
3754 for (i = XVECLEN (newi2pat, 0) - 1; i >= 0; i--)
3755 if (GET_CODE (XVECEXP (newi2pat, 0, i)) == CLOBBER)
3756 {
3757 rtx reg = XEXP (XVECEXP (newi2pat, 0, i), 0);
3758 if (reg_overlap_mentioned_p (reg, newpat))
3759 {
3760 undo_all ();
3761 return 0;
3762 }
3763 }
3764 }
3765
3766 insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
3767 }
3768 }
3769
3770 /* If it still isn't recognized, fail and change things back the way they
3771 were. */
3772 if ((insn_code_number < 0
3773 /* Is the result a reasonable ASM_OPERANDS? */
3774 && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
3775 {
3776 undo_all ();
3777 return 0;
3778 }
3779
3780 /* If we had to change another insn, make sure it is valid also. */
3781 if (undobuf.other_insn)
3782 {
3783 CLEAR_HARD_REG_SET (newpat_used_regs);
3784
3785 other_pat = PATTERN (undobuf.other_insn);
3786 other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
3787 &new_other_notes);
3788
3789 if (other_code_number < 0 && ! check_asm_operands (other_pat))
3790 {
3791 undo_all ();
3792 return 0;
3793 }
3794 }
3795
3796 #ifdef HAVE_cc0
3797 /* If I2 is the CC0 setter and I3 is the CC0 user then check whether
3798 they are adjacent to each other or not. */
3799 {
3800 rtx p = prev_nonnote_insn (i3);
3801 if (p && p != i2 && NONJUMP_INSN_P (p) && newi2pat
3802 && sets_cc0_p (newi2pat))
3803 {
3804 undo_all ();
3805 return 0;
3806 }
3807 }
3808 #endif
3809
3810 /* Only allow this combination if insn_rtx_costs reports that the
3811 replacement instructions are cheaper than the originals. */
3812 if (!combine_validate_cost (i0, i1, i2, i3, newpat, newi2pat, other_pat))
3813 {
3814 undo_all ();
3815 return 0;
3816 }
3817
3818 if (MAY_HAVE_DEBUG_INSNS)
3819 {
3820 struct undo *undo;
3821
3822 for (undo = undobuf.undos; undo; undo = undo->next)
3823 if (undo->kind == UNDO_MODE)
3824 {
3825 rtx reg = *undo->where.r;
3826 enum machine_mode new_mode = GET_MODE (reg);
3827 enum machine_mode old_mode = undo->old_contents.m;
3828
3829 /* Temporarily revert mode back. */
3830 adjust_reg_mode (reg, old_mode);
3831
3832 if (reg == i2dest && i2scratch)
3833 {
3834 /* If we used i2dest as a scratch register with a
3835 different mode, substitute it for the original
3836 i2src while its original mode is temporarily
3837 restored, and then clear i2scratch so that we don't
3838 do it again later. */
3839 propagate_for_debug (i2, last_combined_insn, reg, i2src,
3840 this_basic_block);
3841 i2scratch = false;
3842 /* Put back the new mode. */
3843 adjust_reg_mode (reg, new_mode);
3844 }
3845 else
3846 {
3847 rtx tempreg = gen_raw_REG (old_mode, REGNO (reg));
3848 rtx first, last;
3849
3850 if (reg == i2dest)
3851 {
3852 first = i2;
3853 last = last_combined_insn;
3854 }
3855 else
3856 {
3857 first = i3;
3858 last = undobuf.other_insn;
3859 gcc_assert (last);
3860 if (DF_INSN_LUID (last)
3861 < DF_INSN_LUID (last_combined_insn))
3862 last = last_combined_insn;
3863 }
3864
3865 /* We're dealing with a reg that changed mode but not
3866 meaning, so we want to turn it into a subreg for
3867 the new mode. However, because of REG sharing and
3868 because its mode had already changed, we have to do
3869 it in two steps. First, replace any debug uses of
3870 reg, with its original mode temporarily restored,
3871 with this copy we have created; then, replace the
3872 copy with the SUBREG of the original shared reg,
3873 once again changed to the new mode. */
3874 propagate_for_debug (first, last, reg, tempreg,
3875 this_basic_block);
3876 adjust_reg_mode (reg, new_mode);
3877 propagate_for_debug (first, last, tempreg,
3878 lowpart_subreg (old_mode, reg, new_mode),
3879 this_basic_block);
3880 }
3881 }
3882 }
3883
3884 /* If we will be able to accept this, we have made a
3885 change to the destination of I3. This requires us to
3886 do a few adjustments. */
3887
3888 if (changed_i3_dest)
3889 {
3890 PATTERN (i3) = newpat;
3891 adjust_for_new_dest (i3);
3892 }
3893
3894 /* We now know that we can do this combination. Merge the insns and
3895 update the status of registers and LOG_LINKS. */
3896
3897 if (undobuf.other_insn)
3898 {
3899 rtx note, next;
3900
3901 PATTERN (undobuf.other_insn) = other_pat;
3902
3903 /* If any of the notes in OTHER_INSN were REG_DEAD or REG_UNUSED,
3904 ensure that they are still valid. Then add any non-duplicate
3905 notes added by recog_for_combine. */
3906 for (note = REG_NOTES (undobuf.other_insn); note; note = next)
3907 {
3908 next = XEXP (note, 1);
3909
3910 if ((REG_NOTE_KIND (note) == REG_DEAD
3911 && !reg_referenced_p (XEXP (note, 0),
3912 PATTERN (undobuf.other_insn)))
3913 ||(REG_NOTE_KIND (note) == REG_UNUSED
3914 && !reg_set_p (XEXP (note, 0),
3915 PATTERN (undobuf.other_insn))))
3916 remove_note (undobuf.other_insn, note);
3917 }
3918
3919 distribute_notes (new_other_notes, undobuf.other_insn,
3920 undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX,
3921 NULL_RTX);
3922 }
3923
3924 if (swap_i2i3)
3925 {
3926 rtx insn;
3927 struct insn_link *link;
3928 rtx ni2dest;
3929
3930 /* I3 now uses what used to be its destination and which is now
3931 I2's destination. This requires us to do a few adjustments. */
3932 PATTERN (i3) = newpat;
3933 adjust_for_new_dest (i3);
3934
3935 /* We need a LOG_LINK from I3 to I2. But we used to have one,
3936 so we still will.
3937
3938 However, some later insn might be using I2's dest and have
3939 a LOG_LINK pointing at I3. We must remove this link.
3940 The simplest way to remove the link is to point it at I1,
3941 which we know will be a NOTE. */
3942
3943 /* newi2pat is usually a SET here; however, recog_for_combine might
3944 have added some clobbers. */
3945 if (GET_CODE (newi2pat) == PARALLEL)
3946 ni2dest = SET_DEST (XVECEXP (newi2pat, 0, 0));
3947 else
3948 ni2dest = SET_DEST (newi2pat);
3949
3950 for (insn = NEXT_INSN (i3);
3951 insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
3952 || insn != BB_HEAD (this_basic_block->next_bb));
3953 insn = NEXT_INSN (insn))
3954 {
3955 if (INSN_P (insn) && reg_referenced_p (ni2dest, PATTERN (insn)))
3956 {
3957 FOR_EACH_LOG_LINK (link, insn)
3958 if (link->insn == i3)
3959 link->insn = i1;
3960
3961 break;
3962 }
3963 }
3964 }
3965
3966 {
3967 rtx i3notes, i2notes, i1notes = 0, i0notes = 0;
3968 struct insn_link *i3links, *i2links, *i1links = 0, *i0links = 0;
3969 rtx midnotes = 0;
3970 int from_luid;
3971 /* Compute which registers we expect to eliminate. newi2pat may be setting
3972 either i3dest or i2dest, so we must check it. Also, i1dest may be the
3973 same as i3dest, in which case newi2pat may be setting i1dest. */
3974 rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
3975 || i2dest_in_i2src || i2dest_in_i1src || i2dest_in_i0src
3976 || !i2dest_killed
3977 ? 0 : i2dest);
3978 rtx elim_i1 = (i1 == 0 || i1dest_in_i1src || i1dest_in_i0src
3979 || (newi2pat && reg_set_p (i1dest, newi2pat))
3980 || !i1dest_killed
3981 ? 0 : i1dest);
3982 rtx elim_i0 = (i0 == 0 || i0dest_in_i0src
3983 || (newi2pat && reg_set_p (i0dest, newi2pat))
3984 || !i0dest_killed
3985 ? 0 : i0dest);
3986
3987 /* Get the old REG_NOTES and LOG_LINKS from all our insns and
3988 clear them. */
3989 i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
3990 i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
3991 if (i1)
3992 i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
3993 if (i0)
3994 i0notes = REG_NOTES (i0), i0links = LOG_LINKS (i0);
3995
3996 /* Ensure that we do not have something that should not be shared but
3997 occurs multiple times in the new insns. Check this by first
3998 resetting all the `used' flags and then copying anything is shared. */
3999
4000 reset_used_flags (i3notes);
4001 reset_used_flags (i2notes);
4002 reset_used_flags (i1notes);
4003 reset_used_flags (i0notes);
4004 reset_used_flags (newpat);
4005 reset_used_flags (newi2pat);
4006 if (undobuf.other_insn)
4007 reset_used_flags (PATTERN (undobuf.other_insn));
4008
4009 i3notes = copy_rtx_if_shared (i3notes);
4010 i2notes = copy_rtx_if_shared (i2notes);
4011 i1notes = copy_rtx_if_shared (i1notes);
4012 i0notes = copy_rtx_if_shared (i0notes);
4013 newpat = copy_rtx_if_shared (newpat);
4014 newi2pat = copy_rtx_if_shared (newi2pat);
4015 if (undobuf.other_insn)
4016 reset_used_flags (PATTERN (undobuf.other_insn));
4017
4018 INSN_CODE (i3) = insn_code_number;
4019 PATTERN (i3) = newpat;
4020
4021 if (CALL_P (i3) && CALL_INSN_FUNCTION_USAGE (i3))
4022 {
4023 rtx call_usage = CALL_INSN_FUNCTION_USAGE (i3);
4024
4025 reset_used_flags (call_usage);
4026 call_usage = copy_rtx (call_usage);
4027
4028 if (substed_i2)
4029 {
4030 /* I2SRC must still be meaningful at this point. Some splitting
4031 operations can invalidate I2SRC, but those operations do not
4032 apply to calls. */
4033 gcc_assert (i2src);
4034 replace_rtx (call_usage, i2dest, i2src);
4035 }
4036
4037 if (substed_i1)
4038 replace_rtx (call_usage, i1dest, i1src);
4039 if (substed_i0)
4040 replace_rtx (call_usage, i0dest, i0src);
4041
4042 CALL_INSN_FUNCTION_USAGE (i3) = call_usage;
4043 }
4044
4045 if (undobuf.other_insn)
4046 INSN_CODE (undobuf.other_insn) = other_code_number;
4047
4048 /* We had one special case above where I2 had more than one set and
4049 we replaced a destination of one of those sets with the destination
4050 of I3. In that case, we have to update LOG_LINKS of insns later
4051 in this basic block. Note that this (expensive) case is rare.
4052
4053 Also, in this case, we must pretend that all REG_NOTEs for I2
4054 actually came from I3, so that REG_UNUSED notes from I2 will be
4055 properly handled. */
4056
4057 if (i3_subst_into_i2)
4058 {
4059 for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
4060 if ((GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == SET
4061 || GET_CODE (XVECEXP (PATTERN (i2), 0, i)) == CLOBBER)
4062 && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, i)))
4063 && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
4064 && ! find_reg_note (i2, REG_UNUSED,
4065 SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
4066 for (temp = NEXT_INSN (i2);
4067 temp
4068 && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
4069 || BB_HEAD (this_basic_block) != temp);
4070 temp = NEXT_INSN (temp))
4071 if (temp != i3 && INSN_P (temp))
4072 FOR_EACH_LOG_LINK (link, temp)
4073 if (link->insn == i2)
4074 link->insn = i3;
4075
4076 if (i3notes)
4077 {
4078 rtx link = i3notes;
4079 while (XEXP (link, 1))
4080 link = XEXP (link, 1);
4081 XEXP (link, 1) = i2notes;
4082 }
4083 else
4084 i3notes = i2notes;
4085 i2notes = 0;
4086 }
4087
4088 LOG_LINKS (i3) = NULL;
4089 REG_NOTES (i3) = 0;
4090 LOG_LINKS (i2) = NULL;
4091 REG_NOTES (i2) = 0;
4092
4093 if (newi2pat)
4094 {
4095 if (MAY_HAVE_DEBUG_INSNS && i2scratch)
4096 propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
4097 this_basic_block);
4098 INSN_CODE (i2) = i2_code_number;
4099 PATTERN (i2) = newi2pat;
4100 }
4101 else
4102 {
4103 if (MAY_HAVE_DEBUG_INSNS && i2src)
4104 propagate_for_debug (i2, last_combined_insn, i2dest, i2src,
4105 this_basic_block);
4106 SET_INSN_DELETED (i2);
4107 }
4108
4109 if (i1)
4110 {
4111 LOG_LINKS (i1) = NULL;
4112 REG_NOTES (i1) = 0;
4113 if (MAY_HAVE_DEBUG_INSNS)
4114 propagate_for_debug (i1, last_combined_insn, i1dest, i1src,
4115 this_basic_block);
4116 SET_INSN_DELETED (i1);
4117 }
4118
4119 if (i0)
4120 {
4121 LOG_LINKS (i0) = NULL;
4122 REG_NOTES (i0) = 0;
4123 if (MAY_HAVE_DEBUG_INSNS)
4124 propagate_for_debug (i0, last_combined_insn, i0dest, i0src,
4125 this_basic_block);
4126 SET_INSN_DELETED (i0);
4127 }
4128
4129 /* Get death notes for everything that is now used in either I3 or
4130 I2 and used to die in a previous insn. If we built two new
4131 patterns, move from I1 to I2 then I2 to I3 so that we get the
4132 proper movement on registers that I2 modifies. */
4133
4134 if (i0)
4135 from_luid = DF_INSN_LUID (i0);
4136 else if (i1)
4137 from_luid = DF_INSN_LUID (i1);
4138 else
4139 from_luid = DF_INSN_LUID (i2);
4140 if (newi2pat)
4141 move_deaths (newi2pat, NULL_RTX, from_luid, i2, &midnotes);
4142 move_deaths (newpat, newi2pat, from_luid, i3, &midnotes);
4143
4144 /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */
4145 if (i3notes)
4146 distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
4147 elim_i2, elim_i1, elim_i0);
4148 if (i2notes)
4149 distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
4150 elim_i2, elim_i1, elim_i0);
4151 if (i1notes)
4152 distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
4153 elim_i2, elim_i1, elim_i0);
4154 if (i0notes)
4155 distribute_notes (i0notes, i0, i3, newi2pat ? i2 : NULL_RTX,
4156 elim_i2, elim_i1, elim_i0);
4157 if (midnotes)
4158 distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4159 elim_i2, elim_i1, elim_i0);
4160
4161 /* Distribute any notes added to I2 or I3 by recog_for_combine. We
4162 know these are REG_UNUSED and want them to go to the desired insn,
4163 so we always pass it as i3. */
4164
4165 if (newi2pat && new_i2_notes)
4166 distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX,
4167 NULL_RTX);
4168
4169 if (new_i3_notes)
4170 distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX,
4171 NULL_RTX);
4172
4173 /* If I3DEST was used in I3SRC, it really died in I3. We may need to
4174 put a REG_DEAD note for it somewhere. If NEWI2PAT exists and sets
4175 I3DEST, the death must be somewhere before I2, not I3. If we passed I3
4176 in that case, it might delete I2. Similarly for I2 and I1.
4177 Show an additional death due to the REG_DEAD note we make here. If
4178 we discard it in distribute_notes, we will decrement it again. */
4179
4180 if (i3dest_killed)
4181 {
4182 rtx new_note = alloc_reg_note (REG_DEAD, i3dest_killed, NULL_RTX);
4183 if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
4184 distribute_notes (new_note, NULL_RTX, i2, NULL_RTX, elim_i2,
4185 elim_i1, elim_i0);
4186 else
4187 distribute_notes (new_note, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4188 elim_i2, elim_i1, elim_i0);
4189 }
4190
4191 if (i2dest_in_i2src)
4192 {
4193 rtx new_note = alloc_reg_note (REG_DEAD, i2dest, NULL_RTX);
4194 if (newi2pat && reg_set_p (i2dest, newi2pat))
4195 distribute_notes (new_note, NULL_RTX, i2, NULL_RTX, NULL_RTX,
4196 NULL_RTX, NULL_RTX);
4197 else
4198 distribute_notes (new_note, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4199 NULL_RTX, NULL_RTX, NULL_RTX);
4200 }
4201
4202 if (i1dest_in_i1src)
4203 {
4204 rtx new_note = alloc_reg_note (REG_DEAD, i1dest, NULL_RTX);
4205 if (newi2pat && reg_set_p (i1dest, newi2pat))
4206 distribute_notes (new_note, NULL_RTX, i2, NULL_RTX, NULL_RTX,
4207 NULL_RTX, NULL_RTX);
4208 else
4209 distribute_notes (new_note, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4210 NULL_RTX, NULL_RTX, NULL_RTX);
4211 }
4212
4213 if (i0dest_in_i0src)
4214 {
4215 rtx new_note = alloc_reg_note (REG_DEAD, i0dest, NULL_RTX);
4216 if (newi2pat && reg_set_p (i0dest, newi2pat))
4217 distribute_notes (new_note, NULL_RTX, i2, NULL_RTX, NULL_RTX,
4218 NULL_RTX, NULL_RTX);
4219 else
4220 distribute_notes (new_note, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
4221 NULL_RTX, NULL_RTX, NULL_RTX);
4222 }
4223
4224 distribute_links (i3links);
4225 distribute_links (i2links);
4226 distribute_links (i1links);
4227 distribute_links (i0links);
4228
4229 if (REG_P (i2dest))
4230 {
4231 struct insn_link *link;
4232 rtx i2_insn = 0, i2_val = 0, set;
4233
4234 /* The insn that used to set this register doesn't exist, and
4235 this life of the register may not exist either. See if one of
4236 I3's links points to an insn that sets I2DEST. If it does,
4237 that is now the last known value for I2DEST. If we don't update
4238 this and I2 set the register to a value that depended on its old
4239 contents, we will get confused. If this insn is used, thing
4240 will be set correctly in combine_instructions. */
4241 FOR_EACH_LOG_LINK (link, i3)
4242 if ((set = single_set (link->insn)) != 0
4243 && rtx_equal_p (i2dest, SET_DEST (set)))
4244 i2_insn = link->insn, i2_val = SET_SRC (set);
4245
4246 record_value_for_reg (i2dest, i2_insn, i2_val);
4247
4248 /* If the reg formerly set in I2 died only once and that was in I3,
4249 zero its use count so it won't make `reload' do any work. */
4250 if (! added_sets_2
4251 && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
4252 && ! i2dest_in_i2src)
4253 INC_REG_N_SETS (REGNO (i2dest), -1);
4254 }
4255
4256 if (i1 && REG_P (i1dest))
4257 {
4258 struct insn_link *link;
4259 rtx i1_insn = 0, i1_val = 0, set;
4260
4261 FOR_EACH_LOG_LINK (link, i3)
4262 if ((set = single_set (link->insn)) != 0
4263 && rtx_equal_p (i1dest, SET_DEST (set)))
4264 i1_insn = link->insn, i1_val = SET_SRC (set);
4265
4266 record_value_for_reg (i1dest, i1_insn, i1_val);
4267
4268 if (! added_sets_1 && ! i1dest_in_i1src)
4269 INC_REG_N_SETS (REGNO (i1dest), -1);
4270 }
4271
4272 if (i0 && REG_P (i0dest))
4273 {
4274 struct insn_link *link;
4275 rtx i0_insn = 0, i0_val = 0, set;
4276
4277 FOR_EACH_LOG_LINK (link, i3)
4278 if ((set = single_set (link->insn)) != 0
4279 && rtx_equal_p (i0dest, SET_DEST (set)))
4280 i0_insn = link->insn, i0_val = SET_SRC (set);
4281
4282 record_value_for_reg (i0dest, i0_insn, i0_val);
4283
4284 if (! added_sets_0 && ! i0dest_in_i0src)
4285 INC_REG_N_SETS (REGNO (i0dest), -1);
4286 }
4287
4288 /* Update reg_stat[].nonzero_bits et al for any changes that may have
4289 been made to this insn. The order is important, because newi2pat
4290 can affect nonzero_bits of newpat. */
4291 if (newi2pat)
4292 note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
4293 note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
4294 }
4295
4296 if (undobuf.other_insn != NULL_RTX)
4297 {
4298 if (dump_file)
4299 {
4300 fprintf (dump_file, "modifying other_insn ");
4301 dump_insn_slim (dump_file, undobuf.other_insn);
4302 }
4303 df_insn_rescan (undobuf.other_insn);
4304 }
4305
4306 if (i0 && !(NOTE_P (i0) && (NOTE_KIND (i0) == NOTE_INSN_DELETED)))
4307 {
4308 if (dump_file)
4309 {
4310 fprintf (dump_file, "modifying insn i0 ");
4311 dump_insn_slim (dump_file, i0);
4312 }
4313 df_insn_rescan (i0);
4314 }
4315
4316 if (i1 && !(NOTE_P (i1) && (NOTE_KIND (i1) == NOTE_INSN_DELETED)))
4317 {
4318 if (dump_file)
4319 {
4320 fprintf (dump_file, "modifying insn i1 ");
4321 dump_insn_slim (dump_file, i1);
4322 }
4323 df_insn_rescan (i1);
4324 }
4325
4326 if (i2 && !(NOTE_P (i2) && (NOTE_KIND (i2) == NOTE_INSN_DELETED)))
4327 {
4328 if (dump_file)
4329 {
4330 fprintf (dump_file, "modifying insn i2 ");
4331 dump_insn_slim (dump_file, i2);
4332 }
4333 df_insn_rescan (i2);
4334 }
4335
4336 if (i3 && !(NOTE_P (i3) && (NOTE_KIND (i3) == NOTE_INSN_DELETED)))
4337 {
4338 if (dump_file)
4339 {
4340 fprintf (dump_file, "modifying insn i3 ");
4341 dump_insn_slim (dump_file, i3);
4342 }
4343 df_insn_rescan (i3);
4344 }
4345
4346 /* Set new_direct_jump_p if a new return or simple jump instruction
4347 has been created. Adjust the CFG accordingly. */
4348 if (returnjump_p (i3) || any_uncondjump_p (i3))
4349 {
4350 *new_direct_jump_p = 1;
4351 mark_jump_label (PATTERN (i3), i3, 0);
4352 update_cfg_for_uncondjump (i3);
4353 }
4354
4355 if (undobuf.other_insn != NULL_RTX
4356 && (returnjump_p (undobuf.other_insn)
4357 || any_uncondjump_p (undobuf.other_insn)))
4358 {
4359 *new_direct_jump_p = 1;
4360 update_cfg_for_uncondjump (undobuf.other_insn);
4361 }
4362
4363 /* A noop might also need cleaning up of CFG, if it comes from the
4364 simplification of a jump. */
4365 if (JUMP_P (i3)
4366 && GET_CODE (newpat) == SET
4367 && SET_SRC (newpat) == pc_rtx
4368 && SET_DEST (newpat) == pc_rtx)
4369 {
4370 *new_direct_jump_p = 1;
4371 update_cfg_for_uncondjump (i3);
4372 }
4373
4374 if (undobuf.other_insn != NULL_RTX
4375 && JUMP_P (undobuf.other_insn)
4376 && GET_CODE (PATTERN (undobuf.other_insn)) == SET
4377 && SET_SRC (PATTERN (undobuf.other_insn)) == pc_rtx
4378 && SET_DEST (PATTERN (undobuf.other_insn)) == pc_rtx)
4379 {
4380 *new_direct_jump_p = 1;
4381 update_cfg_for_uncondjump (undobuf.other_insn);
4382 }
4383
4384 combine_successes++;
4385 undo_commit ();
4386
4387 if (added_links_insn
4388 && (newi2pat == 0 || DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i2))
4389 && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (i3))
4390 return added_links_insn;
4391 else
4392 return newi2pat ? i2 : i3;
4393 }
4394 \f
4395 /* Undo all the modifications recorded in undobuf. */
4396
4397 static void
4398 undo_all (void)
4399 {
4400 struct undo *undo, *next;
4401
4402 for (undo = undobuf.undos; undo; undo = next)
4403 {
4404 next = undo->next;
4405 switch (undo->kind)
4406 {
4407 case UNDO_RTX:
4408 *undo->where.r = undo->old_contents.r;
4409 break;
4410 case UNDO_INT:
4411 *undo->where.i = undo->old_contents.i;
4412 break;
4413 case UNDO_MODE:
4414 adjust_reg_mode (*undo->where.r, undo->old_contents.m);
4415 break;
4416 case UNDO_LINKS:
4417 *undo->where.l = undo->old_contents.l;
4418 break;
4419 default:
4420 gcc_unreachable ();
4421 }
4422
4423 undo->next = undobuf.frees;
4424 undobuf.frees = undo;
4425 }
4426
4427 undobuf.undos = 0;
4428 }
4429
4430 /* We've committed to accepting the changes we made. Move all
4431 of the undos to the free list. */
4432
4433 static void
4434 undo_commit (void)
4435 {
4436 struct undo *undo, *next;
4437
4438 for (undo = undobuf.undos; undo; undo = next)
4439 {
4440 next = undo->next;
4441 undo->next = undobuf.frees;
4442 undobuf.frees = undo;
4443 }
4444 undobuf.undos = 0;
4445 }
4446 \f
4447 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
4448 where we have an arithmetic expression and return that point. LOC will
4449 be inside INSN.
4450
4451 try_combine will call this function to see if an insn can be split into
4452 two insns. */
4453
4454 static rtx *
4455 find_split_point (rtx *loc, rtx insn, bool set_src)
4456 {
4457 rtx x = *loc;
4458 enum rtx_code code = GET_CODE (x);
4459 rtx *split;
4460 unsigned HOST_WIDE_INT len = 0;
4461 HOST_WIDE_INT pos = 0;
4462 int unsignedp = 0;
4463 rtx inner = NULL_RTX;
4464
4465 /* First special-case some codes. */
4466 switch (code)
4467 {
4468 case SUBREG:
4469 #ifdef INSN_SCHEDULING
4470 /* If we are making a paradoxical SUBREG invalid, it becomes a split
4471 point. */
4472 if (MEM_P (SUBREG_REG (x)))
4473 return loc;
4474 #endif
4475 return find_split_point (&SUBREG_REG (x), insn, false);
4476
4477 case MEM:
4478 #ifdef HAVE_lo_sum
4479 /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
4480 using LO_SUM and HIGH. */
4481 if (GET_CODE (XEXP (x, 0)) == CONST
4482 || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
4483 {
4484 enum machine_mode address_mode = get_address_mode (x);
4485
4486 SUBST (XEXP (x, 0),
4487 gen_rtx_LO_SUM (address_mode,
4488 gen_rtx_HIGH (address_mode, XEXP (x, 0)),
4489 XEXP (x, 0)));
4490 return &XEXP (XEXP (x, 0), 0);
4491 }
4492 #endif
4493
4494 /* If we have a PLUS whose second operand is a constant and the
4495 address is not valid, perhaps will can split it up using
4496 the machine-specific way to split large constants. We use
4497 the first pseudo-reg (one of the virtual regs) as a placeholder;
4498 it will not remain in the result. */
4499 if (GET_CODE (XEXP (x, 0)) == PLUS
4500 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
4501 && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4502 MEM_ADDR_SPACE (x)))
4503 {
4504 rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
4505 rtx seq = combine_split_insns (gen_rtx_SET (VOIDmode, reg,
4506 XEXP (x, 0)),
4507 subst_insn);
4508
4509 /* This should have produced two insns, each of which sets our
4510 placeholder. If the source of the second is a valid address,
4511 we can make put both sources together and make a split point
4512 in the middle. */
4513
4514 if (seq
4515 && NEXT_INSN (seq) != NULL_RTX
4516 && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX
4517 && NONJUMP_INSN_P (seq)
4518 && GET_CODE (PATTERN (seq)) == SET
4519 && SET_DEST (PATTERN (seq)) == reg
4520 && ! reg_mentioned_p (reg,
4521 SET_SRC (PATTERN (seq)))
4522 && NONJUMP_INSN_P (NEXT_INSN (seq))
4523 && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET
4524 && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg
4525 && memory_address_addr_space_p
4526 (GET_MODE (x), SET_SRC (PATTERN (NEXT_INSN (seq))),
4527 MEM_ADDR_SPACE (x)))
4528 {
4529 rtx src1 = SET_SRC (PATTERN (seq));
4530 rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq)));
4531
4532 /* Replace the placeholder in SRC2 with SRC1. If we can
4533 find where in SRC2 it was placed, that can become our
4534 split point and we can replace this address with SRC2.
4535 Just try two obvious places. */
4536
4537 src2 = replace_rtx (src2, reg, src1);
4538 split = 0;
4539 if (XEXP (src2, 0) == src1)
4540 split = &XEXP (src2, 0);
4541 else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
4542 && XEXP (XEXP (src2, 0), 0) == src1)
4543 split = &XEXP (XEXP (src2, 0), 0);
4544
4545 if (split)
4546 {
4547 SUBST (XEXP (x, 0), src2);
4548 return split;
4549 }
4550 }
4551
4552 /* If that didn't work, perhaps the first operand is complex and
4553 needs to be computed separately, so make a split point there.
4554 This will occur on machines that just support REG + CONST
4555 and have a constant moved through some previous computation. */
4556
4557 else if (!OBJECT_P (XEXP (XEXP (x, 0), 0))
4558 && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4559 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4560 return &XEXP (XEXP (x, 0), 0);
4561 }
4562
4563 /* If we have a PLUS whose first operand is complex, try computing it
4564 separately by making a split there. */
4565 if (GET_CODE (XEXP (x, 0)) == PLUS
4566 && ! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
4567 MEM_ADDR_SPACE (x))
4568 && ! OBJECT_P (XEXP (XEXP (x, 0), 0))
4569 && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
4570 && OBJECT_P (SUBREG_REG (XEXP (XEXP (x, 0), 0)))))
4571 return &XEXP (XEXP (x, 0), 0);
4572 break;
4573
4574 case SET:
4575 #ifdef HAVE_cc0
4576 /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
4577 ZERO_EXTRACT, the most likely reason why this doesn't match is that
4578 we need to put the operand into a register. So split at that
4579 point. */
4580
4581 if (SET_DEST (x) == cc0_rtx
4582 && GET_CODE (SET_SRC (x)) != COMPARE
4583 && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
4584 && !OBJECT_P (SET_SRC (x))
4585 && ! (GET_CODE (SET_SRC (x)) == SUBREG
4586 && OBJECT_P (SUBREG_REG (SET_SRC (x)))))
4587 return &SET_SRC (x);
4588 #endif
4589
4590 /* See if we can split SET_SRC as it stands. */
4591 split = find_split_point (&SET_SRC (x), insn, true);
4592 if (split && split != &SET_SRC (x))
4593 return split;
4594
4595 /* See if we can split SET_DEST as it stands. */
4596 split = find_split_point (&SET_DEST (x), insn, false);
4597 if (split && split != &SET_DEST (x))
4598 return split;
4599
4600 /* See if this is a bitfield assignment with everything constant. If
4601 so, this is an IOR of an AND, so split it into that. */
4602 if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
4603 && HWI_COMPUTABLE_MODE_P (GET_MODE (XEXP (SET_DEST (x), 0)))
4604 && CONST_INT_P (XEXP (SET_DEST (x), 1))
4605 && CONST_INT_P (XEXP (SET_DEST (x), 2))
4606 && CONST_INT_P (SET_SRC (x))
4607 && ((INTVAL (XEXP (SET_DEST (x), 1))
4608 + INTVAL (XEXP (SET_DEST (x), 2)))
4609 <= GET_MODE_PRECISION (GET_MODE (XEXP (SET_DEST (x), 0))))
4610 && ! side_effects_p (XEXP (SET_DEST (x), 0)))
4611 {
4612 HOST_WIDE_INT pos = INTVAL (XEXP (SET_DEST (x), 2));
4613 unsigned HOST_WIDE_INT len = INTVAL (XEXP (SET_DEST (x), 1));
4614 unsigned HOST_WIDE_INT src = INTVAL (SET_SRC (x));
4615 rtx dest = XEXP (SET_DEST (x), 0);
4616 enum machine_mode mode = GET_MODE (dest);
4617 unsigned HOST_WIDE_INT mask
4618 = ((unsigned HOST_WIDE_INT) 1 << len) - 1;
4619 rtx or_mask;
4620
4621 if (BITS_BIG_ENDIAN)
4622 pos = GET_MODE_PRECISION (mode) - len - pos;
4623
4624 or_mask = gen_int_mode (src << pos, mode);
4625 if (src == mask)
4626 SUBST (SET_SRC (x),
4627 simplify_gen_binary (IOR, mode, dest, or_mask));
4628 else
4629 {
4630 rtx negmask = gen_int_mode (~(mask << pos), mode);
4631 SUBST (SET_SRC (x),
4632 simplify_gen_binary (IOR, mode,
4633 simplify_gen_binary (AND, mode,
4634 dest, negmask),
4635 or_mask));
4636 }
4637
4638 SUBST (SET_DEST (x), dest);
4639
4640 split = find_split_point (&SET_SRC (x), insn, true);
4641 if (split && split != &SET_SRC (x))
4642 return split;
4643 }
4644
4645 /* Otherwise, see if this is an operation that we can split into two.
4646 If so, try to split that. */
4647 code = GET_CODE (SET_SRC (x));
4648
4649 switch (code)
4650 {
4651 case AND:
4652 /* If we are AND'ing with a large constant that is only a single
4653 bit and the result is only being used in a context where we
4654 need to know if it is zero or nonzero, replace it with a bit
4655 extraction. This will avoid the large constant, which might
4656 have taken more than one insn to make. If the constant were
4657 not a valid argument to the AND but took only one insn to make,
4658 this is no worse, but if it took more than one insn, it will
4659 be better. */
4660
4661 if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4662 && REG_P (XEXP (SET_SRC (x), 0))
4663 && (pos = exact_log2 (UINTVAL (XEXP (SET_SRC (x), 1)))) >= 7
4664 && REG_P (SET_DEST (x))
4665 && (split = find_single_use (SET_DEST (x), insn, (rtx*) 0)) != 0
4666 && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
4667 && XEXP (*split, 0) == SET_DEST (x)
4668 && XEXP (*split, 1) == const0_rtx)
4669 {
4670 rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
4671 XEXP (SET_SRC (x), 0),
4672 pos, NULL_RTX, 1, 1, 0, 0);
4673 if (extraction != 0)
4674 {
4675 SUBST (SET_SRC (x), extraction);
4676 return find_split_point (loc, insn, false);
4677 }
4678 }
4679 break;
4680
4681 case NE:
4682 /* If STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
4683 is known to be on, this can be converted into a NEG of a shift. */
4684 if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
4685 && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
4686 && 1 <= (pos = exact_log2
4687 (nonzero_bits (XEXP (SET_SRC (x), 0),
4688 GET_MODE (XEXP (SET_SRC (x), 0))))))
4689 {
4690 enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
4691
4692 SUBST (SET_SRC (x),
4693 gen_rtx_NEG (mode,
4694 gen_rtx_LSHIFTRT (mode,
4695 XEXP (SET_SRC (x), 0),
4696 GEN_INT (pos))));
4697
4698 split = find_split_point (&SET_SRC (x), insn, true);
4699 if (split && split != &SET_SRC (x))
4700 return split;
4701 }
4702 break;
4703
4704 case SIGN_EXTEND:
4705 inner = XEXP (SET_SRC (x), 0);
4706
4707 /* We can't optimize if either mode is a partial integer
4708 mode as we don't know how many bits are significant
4709 in those modes. */
4710 if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
4711 || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
4712 break;
4713
4714 pos = 0;
4715 len = GET_MODE_PRECISION (GET_MODE (inner));
4716 unsignedp = 0;
4717 break;
4718
4719 case SIGN_EXTRACT:
4720 case ZERO_EXTRACT:
4721 if (CONST_INT_P (XEXP (SET_SRC (x), 1))
4722 && CONST_INT_P (XEXP (SET_SRC (x), 2)))
4723 {
4724 inner = XEXP (SET_SRC (x), 0);
4725 len = INTVAL (XEXP (SET_SRC (x), 1));
4726 pos = INTVAL (XEXP (SET_SRC (x), 2));
4727
4728 if (BITS_BIG_ENDIAN)
4729 pos = GET_MODE_PRECISION (GET_MODE (inner)) - len - pos;
4730 unsignedp = (code == ZERO_EXTRACT);
4731 }
4732 break;
4733
4734 default:
4735 break;
4736 }
4737
4738 if (len && pos >= 0
4739 && pos + len <= GET_MODE_PRECISION (GET_MODE (inner)))
4740 {
4741 enum machine_mode mode = GET_MODE (SET_SRC (x));
4742
4743 /* For unsigned, we have a choice of a shift followed by an
4744 AND or two shifts. Use two shifts for field sizes where the
4745 constant might be too large. We assume here that we can
4746 always at least get 8-bit constants in an AND insn, which is
4747 true for every current RISC. */
4748
4749 if (unsignedp && len <= 8)
4750 {
4751 unsigned HOST_WIDE_INT mask
4752 = ((unsigned HOST_WIDE_INT) 1 << len) - 1;
4753 SUBST (SET_SRC (x),
4754 gen_rtx_AND (mode,
4755 gen_rtx_LSHIFTRT
4756 (mode, gen_lowpart (mode, inner),
4757 GEN_INT (pos)),
4758 gen_int_mode (mask, mode)));
4759
4760 split = find_split_point (&SET_SRC (x), insn, true);
4761 if (split && split != &SET_SRC (x))
4762 return split;
4763 }
4764 else
4765 {
4766 SUBST (SET_SRC (x),
4767 gen_rtx_fmt_ee
4768 (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
4769 gen_rtx_ASHIFT (mode,
4770 gen_lowpart (mode, inner),
4771 GEN_INT (GET_MODE_PRECISION (mode)
4772 - len - pos)),
4773 GEN_INT (GET_MODE_PRECISION (mode) - len)));
4774
4775 split = find_split_point (&SET_SRC (x), insn, true);
4776 if (split && split != &SET_SRC (x))
4777 return split;
4778 }
4779 }
4780
4781 /* See if this is a simple operation with a constant as the second
4782 operand. It might be that this constant is out of range and hence
4783 could be used as a split point. */
4784 if (BINARY_P (SET_SRC (x))
4785 && CONSTANT_P (XEXP (SET_SRC (x), 1))
4786 && (OBJECT_P (XEXP (SET_SRC (x), 0))
4787 || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
4788 && OBJECT_P (SUBREG_REG (XEXP (SET_SRC (x), 0))))))
4789 return &XEXP (SET_SRC (x), 1);
4790
4791 /* Finally, see if this is a simple operation with its first operand
4792 not in a register. The operation might require this operand in a
4793 register, so return it as a split point. We can always do this
4794 because if the first operand were another operation, we would have
4795 already found it as a split point. */
4796 if ((BINARY_P (SET_SRC (x)) || UNARY_P (SET_SRC (x)))
4797 && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
4798 return &XEXP (SET_SRC (x), 0);
4799
4800 return 0;
4801
4802 case AND:
4803 case IOR:
4804 /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
4805 it is better to write this as (not (ior A B)) so we can split it.
4806 Similarly for IOR. */
4807 if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
4808 {
4809 SUBST (*loc,
4810 gen_rtx_NOT (GET_MODE (x),
4811 gen_rtx_fmt_ee (code == IOR ? AND : IOR,
4812 GET_MODE (x),
4813 XEXP (XEXP (x, 0), 0),
4814 XEXP (XEXP (x, 1), 0))));
4815 return find_split_point (loc, insn, set_src);
4816 }
4817
4818 /* Many RISC machines have a large set of logical insns. If the
4819 second operand is a NOT, put it first so we will try to split the
4820 other operand first. */
4821 if (GET_CODE (XEXP (x, 1)) == NOT)
4822 {
4823 rtx tem = XEXP (x, 0);
4824 SUBST (XEXP (x, 0), XEXP (x, 1));
4825 SUBST (XEXP (x, 1), tem);
4826 }
4827 break;
4828
4829 case PLUS:
4830 case MINUS:
4831 /* Canonicalization can produce (minus A (mult B C)), where C is a
4832 constant. It may be better to try splitting (plus (mult B -C) A)
4833 instead if this isn't a multiply by a power of two. */
4834 if (set_src && code == MINUS && GET_CODE (XEXP (x, 1)) == MULT
4835 && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
4836 && exact_log2 (INTVAL (XEXP (XEXP (x, 1), 1))) < 0)
4837 {
4838 enum machine_mode mode = GET_MODE (x);
4839 unsigned HOST_WIDE_INT this_int = INTVAL (XEXP (XEXP (x, 1), 1));
4840 HOST_WIDE_INT other_int = trunc_int_for_mode (-this_int, mode);
4841 SUBST (*loc, gen_rtx_PLUS (mode,
4842 gen_rtx_MULT (mode,
4843 XEXP (XEXP (x, 1), 0),
4844 gen_int_mode (other_int,
4845 mode)),
4846 XEXP (x, 0)));
4847 return find_split_point (loc, insn, set_src);
4848 }
4849
4850 /* Split at a multiply-accumulate instruction. However if this is
4851 the SET_SRC, we likely do not have such an instruction and it's
4852 worthless to try this split. */
4853 if (!set_src && GET_CODE (XEXP (x, 0)) == MULT)
4854 return loc;
4855
4856 default:
4857 break;
4858 }
4859
4860 /* Otherwise, select our actions depending on our rtx class. */
4861 switch (GET_RTX_CLASS (code))
4862 {
4863 case RTX_BITFIELD_OPS: /* This is ZERO_EXTRACT and SIGN_EXTRACT. */
4864 case RTX_TERNARY:
4865 split = find_split_point (&XEXP (x, 2), insn, false);
4866 if (split)
4867 return split;
4868 /* ... fall through ... */
4869 case RTX_BIN_ARITH:
4870 case RTX_COMM_ARITH:
4871 case RTX_COMPARE:
4872 case RTX_COMM_COMPARE:
4873 split = find_split_point (&XEXP (x, 1), insn, false);
4874 if (split)
4875 return split;
4876 /* ... fall through ... */
4877 case RTX_UNARY:
4878 /* Some machines have (and (shift ...) ...) insns. If X is not
4879 an AND, but XEXP (X, 0) is, use it as our split point. */
4880 if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
4881 return &XEXP (x, 0);
4882
4883 split = find_split_point (&XEXP (x, 0), insn, false);
4884 if (split)
4885 return split;
4886 return loc;
4887
4888 default:
4889 /* Otherwise, we don't have a split point. */
4890 return 0;
4891 }
4892 }
4893 \f
4894 /* Throughout X, replace FROM with TO, and return the result.
4895 The result is TO if X is FROM;
4896 otherwise the result is X, but its contents may have been modified.
4897 If they were modified, a record was made in undobuf so that
4898 undo_all will (among other things) return X to its original state.
4899
4900 If the number of changes necessary is too much to record to undo,
4901 the excess changes are not made, so the result is invalid.
4902 The changes already made can still be undone.
4903 undobuf.num_undo is incremented for such changes, so by testing that
4904 the caller can tell whether the result is valid.
4905
4906 `n_occurrences' is incremented each time FROM is replaced.
4907
4908 IN_DEST is nonzero if we are processing the SET_DEST of a SET.
4909
4910 IN_COND is nonzero if we are at the top level of a condition.
4911
4912 UNIQUE_COPY is nonzero if each substitution must be unique. We do this
4913 by copying if `n_occurrences' is nonzero. */
4914
4915 static rtx
4916 subst (rtx x, rtx from, rtx to, int in_dest, int in_cond, int unique_copy)
4917 {
4918 enum rtx_code code = GET_CODE (x);
4919 enum machine_mode op0_mode = VOIDmode;
4920 const char *fmt;
4921 int len, i;
4922 rtx new_rtx;
4923
4924 /* Two expressions are equal if they are identical copies of a shared
4925 RTX or if they are both registers with the same register number
4926 and mode. */
4927
4928 #define COMBINE_RTX_EQUAL_P(X,Y) \
4929 ((X) == (Y) \
4930 || (REG_P (X) && REG_P (Y) \
4931 && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
4932
4933 if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
4934 {
4935 n_occurrences++;
4936 return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
4937 }
4938
4939 /* If X and FROM are the same register but different modes, they
4940 will not have been seen as equal above. However, the log links code
4941 will make a LOG_LINKS entry for that case. If we do nothing, we
4942 will try to rerecognize our original insn and, when it succeeds,
4943 we will delete the feeding insn, which is incorrect.
4944
4945 So force this insn not to match in this (rare) case. */
4946 if (! in_dest && code == REG && REG_P (from)
4947 && reg_overlap_mentioned_p (x, from))
4948 return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
4949
4950 /* If this is an object, we are done unless it is a MEM or LO_SUM, both
4951 of which may contain things that can be combined. */
4952 if (code != MEM && code != LO_SUM && OBJECT_P (x))
4953 return x;
4954
4955 /* It is possible to have a subexpression appear twice in the insn.
4956 Suppose that FROM is a register that appears within TO.
4957 Then, after that subexpression has been scanned once by `subst',
4958 the second time it is scanned, TO may be found. If we were
4959 to scan TO here, we would find FROM within it and create a
4960 self-referent rtl structure which is completely wrong. */
4961 if (COMBINE_RTX_EQUAL_P (x, to))
4962 return to;
4963
4964 /* Parallel asm_operands need special attention because all of the
4965 inputs are shared across the arms. Furthermore, unsharing the
4966 rtl results in recognition failures. Failure to handle this case
4967 specially can result in circular rtl.
4968
4969 Solve this by doing a normal pass across the first entry of the
4970 parallel, and only processing the SET_DESTs of the subsequent
4971 entries. Ug. */
4972
4973 if (code == PARALLEL
4974 && GET_CODE (XVECEXP (x, 0, 0)) == SET
4975 && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
4976 {
4977 new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, 0, unique_copy);
4978
4979 /* If this substitution failed, this whole thing fails. */
4980 if (GET_CODE (new_rtx) == CLOBBER
4981 && XEXP (new_rtx, 0) == const0_rtx)
4982 return new_rtx;
4983
4984 SUBST (XVECEXP (x, 0, 0), new_rtx);
4985
4986 for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
4987 {
4988 rtx dest = SET_DEST (XVECEXP (x, 0, i));
4989
4990 if (!REG_P (dest)
4991 && GET_CODE (dest) != CC0
4992 && GET_CODE (dest) != PC)
4993 {
4994 new_rtx = subst (dest, from, to, 0, 0, unique_copy);
4995
4996 /* If this substitution failed, this whole thing fails. */
4997 if (GET_CODE (new_rtx) == CLOBBER
4998 && XEXP (new_rtx, 0) == const0_rtx)
4999 return new_rtx;
5000
5001 SUBST (SET_DEST (XVECEXP (x, 0, i)), new_rtx);
5002 }
5003 }
5004 }
5005 else
5006 {
5007 len = GET_RTX_LENGTH (code);
5008 fmt = GET_RTX_FORMAT (code);
5009
5010 /* We don't need to process a SET_DEST that is a register, CC0,
5011 or PC, so set up to skip this common case. All other cases
5012 where we want to suppress replacing something inside a
5013 SET_SRC are handled via the IN_DEST operand. */
5014 if (code == SET
5015 && (REG_P (SET_DEST (x))
5016 || GET_CODE (SET_DEST (x)) == CC0
5017 || GET_CODE (SET_DEST (x)) == PC))
5018 fmt = "ie";
5019
5020 /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
5021 constant. */
5022 if (fmt[0] == 'e')
5023 op0_mode = GET_MODE (XEXP (x, 0));
5024
5025 for (i = 0; i < len; i++)
5026 {
5027 if (fmt[i] == 'E')
5028 {
5029 int j;
5030 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
5031 {
5032 if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
5033 {
5034 new_rtx = (unique_copy && n_occurrences
5035 ? copy_rtx (to) : to);
5036 n_occurrences++;
5037 }
5038 else
5039 {
5040 new_rtx = subst (XVECEXP (x, i, j), from, to, 0, 0,
5041 unique_copy);
5042
5043 /* If this substitution failed, this whole thing
5044 fails. */
5045 if (GET_CODE (new_rtx) == CLOBBER
5046 && XEXP (new_rtx, 0) == const0_rtx)
5047 return new_rtx;
5048 }
5049
5050 SUBST (XVECEXP (x, i, j), new_rtx);
5051 }
5052 }
5053 else if (fmt[i] == 'e')
5054 {
5055 /* If this is a register being set, ignore it. */
5056 new_rtx = XEXP (x, i);
5057 if (in_dest
5058 && i == 0
5059 && (((code == SUBREG || code == ZERO_EXTRACT)
5060 && REG_P (new_rtx))
5061 || code == STRICT_LOW_PART))
5062 ;
5063
5064 else if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
5065 {
5066 /* In general, don't install a subreg involving two
5067 modes not tieable. It can worsen register
5068 allocation, and can even make invalid reload
5069 insns, since the reg inside may need to be copied
5070 from in the outside mode, and that may be invalid
5071 if it is an fp reg copied in integer mode.
5072
5073 We allow two exceptions to this: It is valid if
5074 it is inside another SUBREG and the mode of that
5075 SUBREG and the mode of the inside of TO is
5076 tieable and it is valid if X is a SET that copies
5077 FROM to CC0. */
5078
5079 if (GET_CODE (to) == SUBREG
5080 && ! MODES_TIEABLE_P (GET_MODE (to),
5081 GET_MODE (SUBREG_REG (to)))
5082 && ! (code == SUBREG
5083 && MODES_TIEABLE_P (GET_MODE (x),
5084 GET_MODE (SUBREG_REG (to))))
5085 #ifdef HAVE_cc0
5086 && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
5087 #endif
5088 )
5089 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5090
5091 #ifdef CANNOT_CHANGE_MODE_CLASS
5092 if (code == SUBREG
5093 && REG_P (to)
5094 && REGNO (to) < FIRST_PSEUDO_REGISTER
5095 && REG_CANNOT_CHANGE_MODE_P (REGNO (to),
5096 GET_MODE (to),
5097 GET_MODE (x)))
5098 return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
5099 #endif
5100
5101 new_rtx = (unique_copy && n_occurrences ? copy_rtx (to) : to);
5102 n_occurrences++;
5103 }
5104 else
5105 /* If we are in a SET_DEST, suppress most cases unless we
5106 have gone inside a MEM, in which case we want to
5107 simplify the address. We assume here that things that
5108 are actually part of the destination have their inner
5109 parts in the first expression. This is true for SUBREG,
5110 STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
5111 things aside from REG and MEM that should appear in a
5112 SET_DEST. */
5113 new_rtx = subst (XEXP (x, i), from, to,
5114 (((in_dest
5115 && (code == SUBREG || code == STRICT_LOW_PART
5116 || code == ZERO_EXTRACT))
5117 || code == SET)
5118 && i == 0),
5119 code == IF_THEN_ELSE && i == 0,
5120 unique_copy);
5121
5122 /* If we found that we will have to reject this combination,
5123 indicate that by returning the CLOBBER ourselves, rather than
5124 an expression containing it. This will speed things up as
5125 well as prevent accidents where two CLOBBERs are considered
5126 to be equal, thus producing an incorrect simplification. */
5127
5128 if (GET_CODE (new_rtx) == CLOBBER && XEXP (new_rtx, 0) == const0_rtx)
5129 return new_rtx;
5130
5131 if (GET_CODE (x) == SUBREG && CONST_SCALAR_INT_P (new_rtx))
5132 {
5133 enum machine_mode mode = GET_MODE (x);
5134
5135 x = simplify_subreg (GET_MODE (x), new_rtx,
5136 GET_MODE (SUBREG_REG (x)),
5137 SUBREG_BYTE (x));
5138 if (! x)
5139 x = gen_rtx_CLOBBER (mode, const0_rtx);
5140 }
5141 else if (CONST_INT_P (new_rtx)
5142 && GET_CODE (x) == ZERO_EXTEND)
5143 {
5144 x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
5145 new_rtx, GET_MODE (XEXP (x, 0)));
5146 gcc_assert (x);
5147 }
5148 else
5149 SUBST (XEXP (x, i), new_rtx);
5150 }
5151 }
5152 }
5153
5154 /* Check if we are loading something from the constant pool via float
5155 extension; in this case we would undo compress_float_constant
5156 optimization and degenerate constant load to an immediate value. */
5157 if (GET_CODE (x) == FLOAT_EXTEND
5158 && MEM_P (XEXP (x, 0))
5159 && MEM_READONLY_P (XEXP (x, 0)))
5160 {
5161 rtx tmp = avoid_constant_pool_reference (x);
5162 if (x != tmp)
5163 return x;
5164 }
5165
5166 /* Try to simplify X. If the simplification changed the code, it is likely
5167 that further simplification will help, so loop, but limit the number
5168 of repetitions that will be performed. */
5169
5170 for (i = 0; i < 4; i++)
5171 {
5172 /* If X is sufficiently simple, don't bother trying to do anything
5173 with it. */
5174 if (code != CONST_INT && code != REG && code != CLOBBER)
5175 x = combine_simplify_rtx (x, op0_mode, in_dest, in_cond);
5176
5177 if (GET_CODE (x) == code)
5178 break;
5179
5180 code = GET_CODE (x);
5181
5182 /* We no longer know the original mode of operand 0 since we
5183 have changed the form of X) */
5184 op0_mode = VOIDmode;
5185 }
5186
5187 return x;
5188 }
5189 \f
5190 /* Simplify X, a piece of RTL. We just operate on the expression at the
5191 outer level; call `subst' to simplify recursively. Return the new
5192 expression.
5193
5194 OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero
5195 if we are inside a SET_DEST. IN_COND is nonzero if we are at the top level
5196 of a condition. */
5197
5198 static rtx
5199 combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest,
5200 int in_cond)
5201 {
5202 enum rtx_code code = GET_CODE (x);
5203 enum machine_mode mode = GET_MODE (x);
5204 rtx temp;
5205 int i;
5206
5207 /* If this is a commutative operation, put a constant last and a complex
5208 expression first. We don't need to do this for comparisons here. */
5209 if (COMMUTATIVE_ARITH_P (x)
5210 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
5211 {
5212 temp = XEXP (x, 0);
5213 SUBST (XEXP (x, 0), XEXP (x, 1));
5214 SUBST (XEXP (x, 1), temp);
5215 }
5216
5217 /* If this is a simple operation applied to an IF_THEN_ELSE, try
5218 applying it to the arms of the IF_THEN_ELSE. This often simplifies
5219 things. Check for cases where both arms are testing the same
5220 condition.
5221
5222 Don't do anything if all operands are very simple. */
5223
5224 if ((BINARY_P (x)
5225 && ((!OBJECT_P (XEXP (x, 0))
5226 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5227 && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))
5228 || (!OBJECT_P (XEXP (x, 1))
5229 && ! (GET_CODE (XEXP (x, 1)) == SUBREG
5230 && OBJECT_P (SUBREG_REG (XEXP (x, 1)))))))
5231 || (UNARY_P (x)
5232 && (!OBJECT_P (XEXP (x, 0))
5233 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5234 && OBJECT_P (SUBREG_REG (XEXP (x, 0)))))))
5235 {
5236 rtx cond, true_rtx, false_rtx;
5237
5238 cond = if_then_else_cond (x, &true_rtx, &false_rtx);
5239 if (cond != 0
5240 /* If everything is a comparison, what we have is highly unlikely
5241 to be simpler, so don't use it. */
5242 && ! (COMPARISON_P (x)
5243 && (COMPARISON_P (true_rtx) || COMPARISON_P (false_rtx))))
5244 {
5245 rtx cop1 = const0_rtx;
5246 enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
5247
5248 if (cond_code == NE && COMPARISON_P (cond))
5249 return x;
5250
5251 /* Simplify the alternative arms; this may collapse the true and
5252 false arms to store-flag values. Be careful to use copy_rtx
5253 here since true_rtx or false_rtx might share RTL with x as a
5254 result of the if_then_else_cond call above. */
5255 true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0, 0);
5256 false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0, 0);
5257
5258 /* If true_rtx and false_rtx are not general_operands, an if_then_else
5259 is unlikely to be simpler. */
5260 if (general_operand (true_rtx, VOIDmode)
5261 && general_operand (false_rtx, VOIDmode))
5262 {
5263 enum rtx_code reversed;
5264
5265 /* Restarting if we generate a store-flag expression will cause
5266 us to loop. Just drop through in this case. */
5267
5268 /* If the result values are STORE_FLAG_VALUE and zero, we can
5269 just make the comparison operation. */
5270 if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
5271 x = simplify_gen_relational (cond_code, mode, VOIDmode,
5272 cond, cop1);
5273 else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
5274 && ((reversed = reversed_comparison_code_parts
5275 (cond_code, cond, cop1, NULL))
5276 != UNKNOWN))
5277 x = simplify_gen_relational (reversed, mode, VOIDmode,
5278 cond, cop1);
5279
5280 /* Likewise, we can make the negate of a comparison operation
5281 if the result values are - STORE_FLAG_VALUE and zero. */
5282 else if (CONST_INT_P (true_rtx)
5283 && INTVAL (true_rtx) == - STORE_FLAG_VALUE
5284 && false_rtx == const0_rtx)
5285 x = simplify_gen_unary (NEG, mode,
5286 simplify_gen_relational (cond_code,
5287 mode, VOIDmode,
5288 cond, cop1),
5289 mode);
5290 else if (CONST_INT_P (false_rtx)
5291 && INTVAL (false_rtx) == - STORE_FLAG_VALUE
5292 && true_rtx == const0_rtx
5293 && ((reversed = reversed_comparison_code_parts
5294 (cond_code, cond, cop1, NULL))
5295 != UNKNOWN))
5296 x = simplify_gen_unary (NEG, mode,
5297 simplify_gen_relational (reversed,
5298 mode, VOIDmode,
5299 cond, cop1),
5300 mode);
5301 else
5302 return gen_rtx_IF_THEN_ELSE (mode,
5303 simplify_gen_relational (cond_code,
5304 mode,
5305 VOIDmode,
5306 cond,
5307 cop1),
5308 true_rtx, false_rtx);
5309
5310 code = GET_CODE (x);
5311 op0_mode = VOIDmode;
5312 }
5313 }
5314 }
5315
5316 /* Try to fold this expression in case we have constants that weren't
5317 present before. */
5318 temp = 0;
5319 switch (GET_RTX_CLASS (code))
5320 {
5321 case RTX_UNARY:
5322 if (op0_mode == VOIDmode)
5323 op0_mode = GET_MODE (XEXP (x, 0));
5324 temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
5325 break;
5326 case RTX_COMPARE:
5327 case RTX_COMM_COMPARE:
5328 {
5329 enum machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
5330 if (cmp_mode == VOIDmode)
5331 {
5332 cmp_mode = GET_MODE (XEXP (x, 1));
5333 if (cmp_mode == VOIDmode)
5334 cmp_mode = op0_mode;
5335 }
5336 temp = simplify_relational_operation (code, mode, cmp_mode,
5337 XEXP (x, 0), XEXP (x, 1));
5338 }
5339 break;
5340 case RTX_COMM_ARITH:
5341 case RTX_BIN_ARITH:
5342 temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
5343 break;
5344 case RTX_BITFIELD_OPS:
5345 case RTX_TERNARY:
5346 temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
5347 XEXP (x, 1), XEXP (x, 2));
5348 break;
5349 default:
5350 break;
5351 }
5352
5353 if (temp)
5354 {
5355 x = temp;
5356 code = GET_CODE (temp);
5357 op0_mode = VOIDmode;
5358 mode = GET_MODE (temp);
5359 }
5360
5361 /* First see if we can apply the inverse distributive law. */
5362 if (code == PLUS || code == MINUS
5363 || code == AND || code == IOR || code == XOR)
5364 {
5365 x = apply_distributive_law (x);
5366 code = GET_CODE (x);
5367 op0_mode = VOIDmode;
5368 }
5369
5370 /* If CODE is an associative operation not otherwise handled, see if we
5371 can associate some operands. This can win if they are constants or
5372 if they are logically related (i.e. (a & b) & a). */
5373 if ((code == PLUS || code == MINUS || code == MULT || code == DIV
5374 || code == AND || code == IOR || code == XOR
5375 || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
5376 && ((INTEGRAL_MODE_P (mode) && code != DIV)
5377 || (flag_associative_math && FLOAT_MODE_P (mode))))
5378 {
5379 if (GET_CODE (XEXP (x, 0)) == code)
5380 {
5381 rtx other = XEXP (XEXP (x, 0), 0);
5382 rtx inner_op0 = XEXP (XEXP (x, 0), 1);
5383 rtx inner_op1 = XEXP (x, 1);
5384 rtx inner;
5385
5386 /* Make sure we pass the constant operand if any as the second
5387 one if this is a commutative operation. */
5388 if (CONSTANT_P (inner_op0) && COMMUTATIVE_ARITH_P (x))
5389 {
5390 rtx tem = inner_op0;
5391 inner_op0 = inner_op1;
5392 inner_op1 = tem;
5393 }
5394 inner = simplify_binary_operation (code == MINUS ? PLUS
5395 : code == DIV ? MULT
5396 : code,
5397 mode, inner_op0, inner_op1);
5398
5399 /* For commutative operations, try the other pair if that one
5400 didn't simplify. */
5401 if (inner == 0 && COMMUTATIVE_ARITH_P (x))
5402 {
5403 other = XEXP (XEXP (x, 0), 1);
5404 inner = simplify_binary_operation (code, mode,
5405 XEXP (XEXP (x, 0), 0),
5406 XEXP (x, 1));
5407 }
5408
5409 if (inner)
5410 return simplify_gen_binary (code, mode, other, inner);
5411 }
5412 }
5413
5414 /* A little bit of algebraic simplification here. */
5415 switch (code)
5416 {
5417 case MEM:
5418 /* Ensure that our address has any ASHIFTs converted to MULT in case
5419 address-recognizing predicates are called later. */
5420 temp = make_compound_operation (XEXP (x, 0), MEM);
5421 SUBST (XEXP (x, 0), temp);
5422 break;
5423
5424 case SUBREG:
5425 if (op0_mode == VOIDmode)
5426 op0_mode = GET_MODE (SUBREG_REG (x));
5427
5428 /* See if this can be moved to simplify_subreg. */
5429 if (CONSTANT_P (SUBREG_REG (x))
5430 && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
5431 /* Don't call gen_lowpart if the inner mode
5432 is VOIDmode and we cannot simplify it, as SUBREG without
5433 inner mode is invalid. */
5434 && (GET_MODE (SUBREG_REG (x)) != VOIDmode
5435 || gen_lowpart_common (mode, SUBREG_REG (x))))
5436 return gen_lowpart (mode, SUBREG_REG (x));
5437
5438 if (GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_CC)
5439 break;
5440 {
5441 rtx temp;
5442 temp = simplify_subreg (mode, SUBREG_REG (x), op0_mode,
5443 SUBREG_BYTE (x));
5444 if (temp)
5445 return temp;
5446
5447 /* If op is known to have all lower bits zero, the result is zero. */
5448 if (!in_dest
5449 && SCALAR_INT_MODE_P (mode)
5450 && SCALAR_INT_MODE_P (op0_mode)
5451 && GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (op0_mode)
5452 && subreg_lowpart_offset (mode, op0_mode) == SUBREG_BYTE (x)
5453 && HWI_COMPUTABLE_MODE_P (op0_mode)
5454 && (nonzero_bits (SUBREG_REG (x), op0_mode)
5455 & GET_MODE_MASK (mode)) == 0)
5456 return CONST0_RTX (mode);
5457 }
5458
5459 /* Don't change the mode of the MEM if that would change the meaning
5460 of the address. */
5461 if (MEM_P (SUBREG_REG (x))
5462 && (MEM_VOLATILE_P (SUBREG_REG (x))
5463 || mode_dependent_address_p (XEXP (SUBREG_REG (x), 0),
5464 MEM_ADDR_SPACE (SUBREG_REG (x)))))
5465 return gen_rtx_CLOBBER (mode, const0_rtx);
5466
5467 /* Note that we cannot do any narrowing for non-constants since
5468 we might have been counting on using the fact that some bits were
5469 zero. We now do this in the SET. */
5470
5471 break;
5472
5473 case NEG:
5474 temp = expand_compound_operation (XEXP (x, 0));
5475
5476 /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
5477 replaced by (lshiftrt X C). This will convert
5478 (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */
5479
5480 if (GET_CODE (temp) == ASHIFTRT
5481 && CONST_INT_P (XEXP (temp, 1))
5482 && INTVAL (XEXP (temp, 1)) == GET_MODE_PRECISION (mode) - 1)
5483 return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (temp, 0),
5484 INTVAL (XEXP (temp, 1)));
5485
5486 /* If X has only a single bit that might be nonzero, say, bit I, convert
5487 (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
5488 MODE minus 1. This will convert (neg (zero_extract X 1 Y)) to
5489 (sign_extract X 1 Y). But only do this if TEMP isn't a register
5490 or a SUBREG of one since we'd be making the expression more
5491 complex if it was just a register. */
5492
5493 if (!REG_P (temp)
5494 && ! (GET_CODE (temp) == SUBREG
5495 && REG_P (SUBREG_REG (temp)))
5496 && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
5497 {
5498 rtx temp1 = simplify_shift_const
5499 (NULL_RTX, ASHIFTRT, mode,
5500 simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
5501 GET_MODE_PRECISION (mode) - 1 - i),
5502 GET_MODE_PRECISION (mode) - 1 - i);
5503
5504 /* If all we did was surround TEMP with the two shifts, we
5505 haven't improved anything, so don't use it. Otherwise,
5506 we are better off with TEMP1. */
5507 if (GET_CODE (temp1) != ASHIFTRT
5508 || GET_CODE (XEXP (temp1, 0)) != ASHIFT
5509 || XEXP (XEXP (temp1, 0), 0) != temp)
5510 return temp1;
5511 }
5512 break;
5513
5514 case TRUNCATE:
5515 /* We can't handle truncation to a partial integer mode here
5516 because we don't know the real bitsize of the partial
5517 integer mode. */
5518 if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
5519 break;
5520
5521 if (HWI_COMPUTABLE_MODE_P (mode))
5522 SUBST (XEXP (x, 0),
5523 force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
5524 GET_MODE_MASK (mode), 0));
5525
5526 /* We can truncate a constant value and return it. */
5527 if (CONST_INT_P (XEXP (x, 0)))
5528 return gen_int_mode (INTVAL (XEXP (x, 0)), mode);
5529
5530 /* Similarly to what we do in simplify-rtx.c, a truncate of a register
5531 whose value is a comparison can be replaced with a subreg if
5532 STORE_FLAG_VALUE permits. */
5533 if (HWI_COMPUTABLE_MODE_P (mode)
5534 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (mode)) == 0
5535 && (temp = get_last_value (XEXP (x, 0)))
5536 && COMPARISON_P (temp))
5537 return gen_lowpart (mode, XEXP (x, 0));
5538 break;
5539
5540 case CONST:
5541 /* (const (const X)) can become (const X). Do it this way rather than
5542 returning the inner CONST since CONST can be shared with a
5543 REG_EQUAL note. */
5544 if (GET_CODE (XEXP (x, 0)) == CONST)
5545 SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
5546 break;
5547
5548 #ifdef HAVE_lo_sum
5549 case LO_SUM:
5550 /* Convert (lo_sum (high FOO) FOO) to FOO. This is necessary so we
5551 can add in an offset. find_split_point will split this address up
5552 again if it doesn't match. */
5553 if (GET_CODE (XEXP (x, 0)) == HIGH
5554 && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
5555 return XEXP (x, 1);
5556 break;
5557 #endif
5558
5559 case PLUS:
5560 /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
5561 when c is (const_int (pow2 + 1) / 2) is a sign extension of a
5562 bit-field and can be replaced by either a sign_extend or a
5563 sign_extract. The `and' may be a zero_extend and the two
5564 <c>, -<c> constants may be reversed. */
5565 if (GET_CODE (XEXP (x, 0)) == XOR
5566 && CONST_INT_P (XEXP (x, 1))
5567 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
5568 && INTVAL (XEXP (x, 1)) == -INTVAL (XEXP (XEXP (x, 0), 1))
5569 && ((i = exact_log2 (UINTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
5570 || (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0)
5571 && HWI_COMPUTABLE_MODE_P (mode)
5572 && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
5573 && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1))
5574 && (UINTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
5575 == ((unsigned HOST_WIDE_INT) 1 << (i + 1)) - 1))
5576 || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
5577 && (GET_MODE_PRECISION (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
5578 == (unsigned int) i + 1))))
5579 return simplify_shift_const
5580 (NULL_RTX, ASHIFTRT, mode,
5581 simplify_shift_const (NULL_RTX, ASHIFT, mode,
5582 XEXP (XEXP (XEXP (x, 0), 0), 0),
5583 GET_MODE_PRECISION (mode) - (i + 1)),
5584 GET_MODE_PRECISION (mode) - (i + 1));
5585
5586 /* If only the low-order bit of X is possibly nonzero, (plus x -1)
5587 can become (ashiftrt (ashift (xor x 1) C) C) where C is
5588 the bitsize of the mode - 1. This allows simplification of
5589 "a = (b & 8) == 0;" */
5590 if (XEXP (x, 1) == constm1_rtx
5591 && !REG_P (XEXP (x, 0))
5592 && ! (GET_CODE (XEXP (x, 0)) == SUBREG
5593 && REG_P (SUBREG_REG (XEXP (x, 0))))
5594 && nonzero_bits (XEXP (x, 0), mode) == 1)
5595 return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
5596 simplify_shift_const (NULL_RTX, ASHIFT, mode,
5597 gen_rtx_XOR (mode, XEXP (x, 0), const1_rtx),
5598 GET_MODE_PRECISION (mode) - 1),
5599 GET_MODE_PRECISION (mode) - 1);
5600
5601 /* If we are adding two things that have no bits in common, convert
5602 the addition into an IOR. This will often be further simplified,
5603 for example in cases like ((a & 1) + (a & 2)), which can
5604 become a & 3. */
5605
5606 if (HWI_COMPUTABLE_MODE_P (mode)
5607 && (nonzero_bits (XEXP (x, 0), mode)
5608 & nonzero_bits (XEXP (x, 1), mode)) == 0)
5609 {
5610 /* Try to simplify the expression further. */
5611 rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
5612 temp = combine_simplify_rtx (tor, VOIDmode, in_dest, 0);
5613
5614 /* If we could, great. If not, do not go ahead with the IOR
5615 replacement, since PLUS appears in many special purpose
5616 address arithmetic instructions. */
5617 if (GET_CODE (temp) != CLOBBER
5618 && (GET_CODE (temp) != IOR
5619 || ((XEXP (temp, 0) != XEXP (x, 0)
5620 || XEXP (temp, 1) != XEXP (x, 1))
5621 && (XEXP (temp, 0) != XEXP (x, 1)
5622 || XEXP (temp, 1) != XEXP (x, 0)))))
5623 return temp;
5624 }
5625 break;
5626
5627 case MINUS:
5628 /* (minus <foo> (and <foo> (const_int -pow2))) becomes
5629 (and <foo> (const_int pow2-1)) */
5630 if (GET_CODE (XEXP (x, 1)) == AND
5631 && CONST_INT_P (XEXP (XEXP (x, 1), 1))
5632 && exact_log2 (-UINTVAL (XEXP (XEXP (x, 1), 1))) >= 0
5633 && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
5634 return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
5635 -INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
5636 break;
5637
5638 case MULT:
5639 /* If we have (mult (plus A B) C), apply the distributive law and then
5640 the inverse distributive law to see if things simplify. This
5641 occurs mostly in addresses, often when unrolling loops. */
5642
5643 if (GET_CODE (XEXP (x, 0)) == PLUS)
5644 {
5645 rtx result = distribute_and_simplify_rtx (x, 0);
5646 if (result)
5647 return result;
5648 }
5649
5650 /* Try simplify a*(b/c) as (a*b)/c. */
5651 if (FLOAT_MODE_P (mode) && flag_associative_math
5652 && GET_CODE (XEXP (x, 0)) == DIV)
5653 {
5654 rtx tem = simplify_binary_operation (MULT, mode,
5655 XEXP (XEXP (x, 0), 0),
5656 XEXP (x, 1));
5657 if (tem)
5658 return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
5659 }
5660 break;
5661
5662 case UDIV:
5663 /* If this is a divide by a power of two, treat it as a shift if
5664 its first operand is a shift. */
5665 if (CONST_INT_P (XEXP (x, 1))
5666 && (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0
5667 && (GET_CODE (XEXP (x, 0)) == ASHIFT
5668 || GET_CODE (XEXP (x, 0)) == LSHIFTRT
5669 || GET_CODE (XEXP (x, 0)) == ASHIFTRT
5670 || GET_CODE (XEXP (x, 0)) == ROTATE
5671 || GET_CODE (XEXP (x, 0)) == ROTATERT))
5672 return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
5673 break;
5674
5675 case EQ: case NE:
5676 case GT: case GTU: case GE: case GEU:
5677 case LT: case LTU: case LE: case LEU:
5678 case UNEQ: case LTGT:
5679 case UNGT: case UNGE:
5680 case UNLT: case UNLE:
5681 case UNORDERED: case ORDERED:
5682 /* If the first operand is a condition code, we can't do anything
5683 with it. */
5684 if (GET_CODE (XEXP (x, 0)) == COMPARE
5685 || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
5686 && ! CC0_P (XEXP (x, 0))))
5687 {
5688 rtx op0 = XEXP (x, 0);
5689 rtx op1 = XEXP (x, 1);
5690 enum rtx_code new_code;
5691
5692 if (GET_CODE (op0) == COMPARE)
5693 op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
5694
5695 /* Simplify our comparison, if possible. */
5696 new_code = simplify_comparison (code, &op0, &op1);
5697
5698 /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
5699 if only the low-order bit is possibly nonzero in X (such as when
5700 X is a ZERO_EXTRACT of one bit). Similarly, we can convert EQ to
5701 (xor X 1) or (minus 1 X); we use the former. Finally, if X is
5702 known to be either 0 or -1, NE becomes a NEG and EQ becomes
5703 (plus X 1).
5704
5705 Remove any ZERO_EXTRACT we made when thinking this was a
5706 comparison. It may now be simpler to use, e.g., an AND. If a
5707 ZERO_EXTRACT is indeed appropriate, it will be placed back by
5708 the call to make_compound_operation in the SET case.
5709
5710 Don't apply these optimizations if the caller would
5711 prefer a comparison rather than a value.
5712 E.g., for the condition in an IF_THEN_ELSE most targets need
5713 an explicit comparison. */
5714
5715 if (in_cond)
5716 ;
5717
5718 else if (STORE_FLAG_VALUE == 1
5719 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5720 && op1 == const0_rtx
5721 && mode == GET_MODE (op0)
5722 && nonzero_bits (op0, mode) == 1)
5723 return gen_lowpart (mode,
5724 expand_compound_operation (op0));
5725
5726 else if (STORE_FLAG_VALUE == 1
5727 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5728 && op1 == const0_rtx
5729 && mode == GET_MODE (op0)
5730 && (num_sign_bit_copies (op0, mode)
5731 == GET_MODE_PRECISION (mode)))
5732 {
5733 op0 = expand_compound_operation (op0);
5734 return simplify_gen_unary (NEG, mode,
5735 gen_lowpart (mode, op0),
5736 mode);
5737 }
5738
5739 else if (STORE_FLAG_VALUE == 1
5740 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5741 && op1 == const0_rtx
5742 && mode == GET_MODE (op0)
5743 && nonzero_bits (op0, mode) == 1)
5744 {
5745 op0 = expand_compound_operation (op0);
5746 return simplify_gen_binary (XOR, mode,
5747 gen_lowpart (mode, op0),
5748 const1_rtx);
5749 }
5750
5751 else if (STORE_FLAG_VALUE == 1
5752 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5753 && op1 == const0_rtx
5754 && mode == GET_MODE (op0)
5755 && (num_sign_bit_copies (op0, mode)
5756 == GET_MODE_PRECISION (mode)))
5757 {
5758 op0 = expand_compound_operation (op0);
5759 return plus_constant (mode, gen_lowpart (mode, op0), 1);
5760 }
5761
5762 /* If STORE_FLAG_VALUE is -1, we have cases similar to
5763 those above. */
5764 if (in_cond)
5765 ;
5766
5767 else if (STORE_FLAG_VALUE == -1
5768 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5769 && op1 == const0_rtx
5770 && (num_sign_bit_copies (op0, mode)
5771 == GET_MODE_PRECISION (mode)))
5772 return gen_lowpart (mode,
5773 expand_compound_operation (op0));
5774
5775 else if (STORE_FLAG_VALUE == -1
5776 && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5777 && op1 == const0_rtx
5778 && mode == GET_MODE (op0)
5779 && nonzero_bits (op0, mode) == 1)
5780 {
5781 op0 = expand_compound_operation (op0);
5782 return simplify_gen_unary (NEG, mode,
5783 gen_lowpart (mode, op0),
5784 mode);
5785 }
5786
5787 else if (STORE_FLAG_VALUE == -1
5788 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5789 && op1 == const0_rtx
5790 && mode == GET_MODE (op0)
5791 && (num_sign_bit_copies (op0, mode)
5792 == GET_MODE_PRECISION (mode)))
5793 {
5794 op0 = expand_compound_operation (op0);
5795 return simplify_gen_unary (NOT, mode,
5796 gen_lowpart (mode, op0),
5797 mode);
5798 }
5799
5800 /* If X is 0/1, (eq X 0) is X-1. */
5801 else if (STORE_FLAG_VALUE == -1
5802 && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
5803 && op1 == const0_rtx
5804 && mode == GET_MODE (op0)
5805 && nonzero_bits (op0, mode) == 1)
5806 {
5807 op0 = expand_compound_operation (op0);
5808 return plus_constant (mode, gen_lowpart (mode, op0), -1);
5809 }
5810
5811 /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
5812 one bit that might be nonzero, we can convert (ne x 0) to
5813 (ashift x c) where C puts the bit in the sign bit. Remove any
5814 AND with STORE_FLAG_VALUE when we are done, since we are only
5815 going to test the sign bit. */
5816 if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
5817 && HWI_COMPUTABLE_MODE_P (mode)
5818 && val_signbit_p (mode, STORE_FLAG_VALUE)
5819 && op1 == const0_rtx
5820 && mode == GET_MODE (op0)
5821 && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
5822 {
5823 x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
5824 expand_compound_operation (op0),
5825 GET_MODE_PRECISION (mode) - 1 - i);
5826 if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
5827 return XEXP (x, 0);
5828 else
5829 return x;
5830 }
5831
5832 /* If the code changed, return a whole new comparison.
5833 We also need to avoid using SUBST in cases where
5834 simplify_comparison has widened a comparison with a CONST_INT,
5835 since in that case the wider CONST_INT may fail the sanity
5836 checks in do_SUBST. */
5837 if (new_code != code
5838 || (CONST_INT_P (op1)
5839 && GET_MODE (op0) != GET_MODE (XEXP (x, 0))
5840 && GET_MODE (op0) != GET_MODE (XEXP (x, 1))))
5841 return gen_rtx_fmt_ee (new_code, mode, op0, op1);
5842
5843 /* Otherwise, keep this operation, but maybe change its operands.
5844 This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR). */
5845 SUBST (XEXP (x, 0), op0);
5846 SUBST (XEXP (x, 1), op1);
5847 }
5848 break;
5849
5850 case IF_THEN_ELSE:
5851 return simplify_if_then_else (x);
5852
5853 case ZERO_EXTRACT:
5854 case SIGN_EXTRACT:
5855 case ZERO_EXTEND:
5856 case SIGN_EXTEND:
5857 /* If we are processing SET_DEST, we are done. */
5858 if (in_dest)
5859 return x;
5860
5861 return expand_compound_operation (x);
5862
5863 case SET:
5864 return simplify_set (x);
5865
5866 case AND:
5867 case IOR:
5868 return simplify_logical (x);
5869
5870 case ASHIFT:
5871 case LSHIFTRT:
5872 case ASHIFTRT:
5873 case ROTATE:
5874 case ROTATERT:
5875 /* If this is a shift by a constant amount, simplify it. */
5876 if (CONST_INT_P (XEXP (x, 1)))
5877 return simplify_shift_const (x, code, mode, XEXP (x, 0),
5878 INTVAL (XEXP (x, 1)));
5879
5880 else if (SHIFT_COUNT_TRUNCATED && !REG_P (XEXP (x, 1)))
5881 SUBST (XEXP (x, 1),
5882 force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
5883 ((unsigned HOST_WIDE_INT) 1
5884 << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
5885 - 1,
5886 0));
5887 break;
5888
5889 default:
5890 break;
5891 }
5892
5893 return x;
5894 }
5895 \f
5896 /* Simplify X, an IF_THEN_ELSE expression. Return the new expression. */
5897
5898 static rtx
5899 simplify_if_then_else (rtx x)
5900 {
5901 enum machine_mode mode = GET_MODE (x);
5902 rtx cond = XEXP (x, 0);
5903 rtx true_rtx = XEXP (x, 1);
5904 rtx false_rtx = XEXP (x, 2);
5905 enum rtx_code true_code = GET_CODE (cond);
5906 int comparison_p = COMPARISON_P (cond);
5907 rtx temp;
5908 int i;
5909 enum rtx_code false_code;
5910 rtx reversed;
5911
5912 /* Simplify storing of the truth value. */
5913 if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
5914 return simplify_gen_relational (true_code, mode, VOIDmode,
5915 XEXP (cond, 0), XEXP (cond, 1));
5916
5917 /* Also when the truth value has to be reversed. */
5918 if (comparison_p
5919 && true_rtx == const0_rtx && false_rtx == const_true_rtx
5920 && (reversed = reversed_comparison (cond, mode)))
5921 return reversed;
5922
5923 /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
5924 in it is being compared against certain values. Get the true and false
5925 comparisons and see if that says anything about the value of each arm. */
5926
5927 if (comparison_p
5928 && ((false_code = reversed_comparison_code (cond, NULL))
5929 != UNKNOWN)
5930 && REG_P (XEXP (cond, 0)))
5931 {
5932 HOST_WIDE_INT nzb;
5933 rtx from = XEXP (cond, 0);
5934 rtx true_val = XEXP (cond, 1);
5935 rtx false_val = true_val;
5936 int swapped = 0;
5937
5938 /* If FALSE_CODE is EQ, swap the codes and arms. */
5939
5940 if (false_code == EQ)
5941 {
5942 swapped = 1, true_code = EQ, false_code = NE;
5943 temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
5944 }
5945
5946 /* If we are comparing against zero and the expression being tested has
5947 only a single bit that might be nonzero, that is its value when it is
5948 not equal to zero. Similarly if it is known to be -1 or 0. */
5949
5950 if (true_code == EQ && true_val == const0_rtx
5951 && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
5952 {
5953 false_code = EQ;
5954 false_val = gen_int_mode (nzb, GET_MODE (from));
5955 }
5956 else if (true_code == EQ && true_val == const0_rtx
5957 && (num_sign_bit_copies (from, GET_MODE (from))
5958 == GET_MODE_PRECISION (GET_MODE (from))))
5959 {
5960 false_code = EQ;
5961 false_val = constm1_rtx;
5962 }
5963
5964 /* Now simplify an arm if we know the value of the register in the
5965 branch and it is used in the arm. Be careful due to the potential
5966 of locally-shared RTL. */
5967
5968 if (reg_mentioned_p (from, true_rtx))
5969 true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
5970 from, true_val),
5971 pc_rtx, pc_rtx, 0, 0, 0);
5972 if (reg_mentioned_p (from, false_rtx))
5973 false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
5974 from, false_val),
5975 pc_rtx, pc_rtx, 0, 0, 0);
5976
5977 SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
5978 SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
5979
5980 true_rtx = XEXP (x, 1);
5981 false_rtx = XEXP (x, 2);
5982 true_code = GET_CODE (cond);
5983 }
5984
5985 /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
5986 reversed, do so to avoid needing two sets of patterns for
5987 subtract-and-branch insns. Similarly if we have a constant in the true
5988 arm, the false arm is the same as the first operand of the comparison, or
5989 the false arm is more complicated than the true arm. */
5990
5991 if (comparison_p
5992 && reversed_comparison_code (cond, NULL) != UNKNOWN
5993 && (true_rtx == pc_rtx
5994 || (CONSTANT_P (true_rtx)
5995 && !CONST_INT_P (false_rtx) && false_rtx != pc_rtx)
5996 || true_rtx == const0_rtx
5997 || (OBJECT_P (true_rtx) && !OBJECT_P (false_rtx))
5998 || (GET_CODE (true_rtx) == SUBREG && OBJECT_P (SUBREG_REG (true_rtx))
5999 && !OBJECT_P (false_rtx))
6000 || reg_mentioned_p (true_rtx, false_rtx)
6001 || rtx_equal_p (false_rtx, XEXP (cond, 0))))
6002 {
6003 true_code = reversed_comparison_code (cond, NULL);
6004 SUBST (XEXP (x, 0), reversed_comparison (cond, GET_MODE (cond)));
6005 SUBST (XEXP (x, 1), false_rtx);
6006 SUBST (XEXP (x, 2), true_rtx);
6007
6008 temp = true_rtx, true_rtx = false_rtx, false_rtx = temp;
6009 cond = XEXP (x, 0);
6010
6011 /* It is possible that the conditional has been simplified out. */
6012 true_code = GET_CODE (cond);
6013 comparison_p = COMPARISON_P (cond);
6014 }
6015
6016 /* If the two arms are identical, we don't need the comparison. */
6017
6018 if (rtx_equal_p (true_rtx, false_rtx) && ! side_effects_p (cond))
6019 return true_rtx;
6020
6021 /* Convert a == b ? b : a to "a". */
6022 if (true_code == EQ && ! side_effects_p (cond)
6023 && !HONOR_NANS (mode)
6024 && rtx_equal_p (XEXP (cond, 0), false_rtx)
6025 && rtx_equal_p (XEXP (cond, 1), true_rtx))
6026 return false_rtx;
6027 else if (true_code == NE && ! side_effects_p (cond)
6028 && !HONOR_NANS (mode)
6029 && rtx_equal_p (XEXP (cond, 0), true_rtx)
6030 && rtx_equal_p (XEXP (cond, 1), false_rtx))
6031 return true_rtx;
6032
6033 /* Look for cases where we have (abs x) or (neg (abs X)). */
6034
6035 if (GET_MODE_CLASS (mode) == MODE_INT
6036 && comparison_p
6037 && XEXP (cond, 1) == const0_rtx
6038 && GET_CODE (false_rtx) == NEG
6039 && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
6040 && rtx_equal_p (true_rtx, XEXP (cond, 0))
6041 && ! side_effects_p (true_rtx))
6042 switch (true_code)
6043 {
6044 case GT:
6045 case GE:
6046 return simplify_gen_unary (ABS, mode, true_rtx, mode);
6047 case LT:
6048 case LE:
6049 return
6050 simplify_gen_unary (NEG, mode,
6051 simplify_gen_unary (ABS, mode, true_rtx, mode),
6052 mode);
6053 default:
6054 break;
6055 }
6056
6057 /* Look for MIN or MAX. */
6058
6059 if ((! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations)
6060 && comparison_p
6061 && rtx_equal_p (XEXP (cond, 0), true_rtx)
6062 && rtx_equal_p (XEXP (cond, 1), false_rtx)
6063 && ! side_effects_p (cond))
6064 switch (true_code)
6065 {
6066 case GE:
6067 case GT:
6068 return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
6069 case LE:
6070 case LT:
6071 return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
6072 case GEU:
6073 case GTU:
6074 return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
6075 case LEU:
6076 case LTU:
6077 return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
6078 default:
6079 break;
6080 }
6081
6082 /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
6083 second operand is zero, this can be done as (OP Z (mult COND C2)) where
6084 C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
6085 SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
6086 We can do this kind of thing in some cases when STORE_FLAG_VALUE is
6087 neither 1 or -1, but it isn't worth checking for. */
6088
6089 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
6090 && comparison_p
6091 && GET_MODE_CLASS (mode) == MODE_INT
6092 && ! side_effects_p (x))
6093 {
6094 rtx t = make_compound_operation (true_rtx, SET);
6095 rtx f = make_compound_operation (false_rtx, SET);
6096 rtx cond_op0 = XEXP (cond, 0);
6097 rtx cond_op1 = XEXP (cond, 1);
6098 enum rtx_code op = UNKNOWN, extend_op = UNKNOWN;
6099 enum machine_mode m = mode;
6100 rtx z = 0, c1 = NULL_RTX;
6101
6102 if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
6103 || GET_CODE (t) == IOR || GET_CODE (t) == XOR
6104 || GET_CODE (t) == ASHIFT
6105 || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
6106 && rtx_equal_p (XEXP (t, 0), f))
6107 c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
6108
6109 /* If an identity-zero op is commutative, check whether there
6110 would be a match if we swapped the operands. */
6111 else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
6112 || GET_CODE (t) == XOR)
6113 && rtx_equal_p (XEXP (t, 1), f))
6114 c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
6115 else if (GET_CODE (t) == SIGN_EXTEND
6116 && (GET_CODE (XEXP (t, 0)) == PLUS
6117 || GET_CODE (XEXP (t, 0)) == MINUS
6118 || GET_CODE (XEXP (t, 0)) == IOR
6119 || GET_CODE (XEXP (t, 0)) == XOR
6120 || GET_CODE (XEXP (t, 0)) == ASHIFT
6121 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
6122 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
6123 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
6124 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
6125 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
6126 && (num_sign_bit_copies (f, GET_MODE (f))
6127 > (unsigned int)
6128 (GET_MODE_PRECISION (mode)
6129 - GET_MODE_PRECISION (GET_MODE (XEXP (XEXP (t, 0), 0))))))
6130 {
6131 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
6132 extend_op = SIGN_EXTEND;
6133 m = GET_MODE (XEXP (t, 0));
6134 }
6135 else if (GET_CODE (t) == SIGN_EXTEND
6136 && (GET_CODE (XEXP (t, 0)) == PLUS
6137 || GET_CODE (XEXP (t, 0)) == IOR
6138 || GET_CODE (XEXP (t, 0)) == XOR)
6139 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
6140 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
6141 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
6142 && (num_sign_bit_copies (f, GET_MODE (f))
6143 > (unsigned int)
6144 (GET_MODE_PRECISION (mode)
6145 - GET_MODE_PRECISION (GET_MODE (XEXP (XEXP (t, 0), 1))))))
6146 {
6147 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
6148 extend_op = SIGN_EXTEND;
6149 m = GET_MODE (XEXP (t, 0));
6150 }
6151 else if (GET_CODE (t) == ZERO_EXTEND
6152 && (GET_CODE (XEXP (t, 0)) == PLUS
6153 || GET_CODE (XEXP (t, 0)) == MINUS
6154 || GET_CODE (XEXP (t, 0)) == IOR
6155 || GET_CODE (XEXP (t, 0)) == XOR
6156 || GET_CODE (XEXP (t, 0)) == ASHIFT
6157 || GET_CODE (XEXP (t, 0)) == LSHIFTRT
6158 || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
6159 && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
6160 && HWI_COMPUTABLE_MODE_P (mode)
6161 && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
6162 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
6163 && ((nonzero_bits (f, GET_MODE (f))
6164 & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
6165 == 0))
6166 {
6167 c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
6168 extend_op = ZERO_EXTEND;
6169 m = GET_MODE (XEXP (t, 0));
6170 }
6171 else if (GET_CODE (t) == ZERO_EXTEND
6172 && (GET_CODE (XEXP (t, 0)) == PLUS
6173 || GET_CODE (XEXP (t, 0)) == IOR
6174 || GET_CODE (XEXP (t, 0)) == XOR)
6175 && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
6176 && HWI_COMPUTABLE_MODE_P (mode)
6177 && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
6178 && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
6179 && ((nonzero_bits (f, GET_MODE (f))
6180 & ~GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
6181 == 0))
6182 {
6183 c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
6184 extend_op = ZERO_EXTEND;
6185 m = GET_MODE (XEXP (t, 0));
6186 }
6187
6188 if (z)
6189 {
6190 temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
6191 cond_op0, cond_op1),
6192 pc_rtx, pc_rtx, 0, 0, 0);
6193 temp = simplify_gen_binary (MULT, m, temp,
6194 simplify_gen_binary (MULT, m, c1,
6195 const_true_rtx));
6196 temp = subst (temp, pc_rtx, pc_rtx, 0, 0, 0);
6197 temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
6198
6199 if (extend_op != UNKNOWN)
6200 temp = simplify_gen_unary (extend_op, mode, temp, m);
6201
6202 return temp;
6203 }
6204 }
6205
6206 /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
6207 1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
6208 negation of a single bit, we can convert this operation to a shift. We
6209 can actually do this more generally, but it doesn't seem worth it. */
6210
6211 if (true_code == NE && XEXP (cond, 1) == const0_rtx
6212 && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
6213 && ((1 == nonzero_bits (XEXP (cond, 0), mode)
6214 && (i = exact_log2 (UINTVAL (true_rtx))) >= 0)
6215 || ((num_sign_bit_copies (XEXP (cond, 0), mode)
6216 == GET_MODE_PRECISION (mode))
6217 && (i = exact_log2 (-UINTVAL (true_rtx))) >= 0)))
6218 return
6219 simplify_shift_const (NULL_RTX, ASHIFT, mode,
6220 gen_lowpart (mode, XEXP (cond, 0)), i);
6221
6222 /* (IF_THEN_ELSE (NE REG 0) (0) (8)) is REG for nonzero_bits (REG) == 8. */
6223 if (true_code == NE && XEXP (cond, 1) == const0_rtx
6224 && false_rtx == const0_rtx && CONST_INT_P (true_rtx)
6225 && GET_MODE (XEXP (cond, 0)) == mode
6226 && (UINTVAL (true_rtx) & GET_MODE_MASK (mode))
6227 == nonzero_bits (XEXP (cond, 0), mode)
6228 && (i = exact_log2 (UINTVAL (true_rtx) & GET_MODE_MASK (mode))) >= 0)
6229 return XEXP (cond, 0);
6230
6231 return x;
6232 }
6233 \f
6234 /* Simplify X, a SET expression. Return the new expression. */
6235
6236 static rtx
6237 simplify_set (rtx x)
6238 {
6239 rtx src = SET_SRC (x);
6240 rtx dest = SET_DEST (x);
6241 enum machine_mode mode
6242 = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
6243 rtx other_insn;
6244 rtx *cc_use;
6245
6246 /* (set (pc) (return)) gets written as (return). */
6247 if (GET_CODE (dest) == PC && ANY_RETURN_P (src))
6248 return src;
6249
6250 /* Now that we know for sure which bits of SRC we are using, see if we can
6251 simplify the expression for the object knowing that we only need the
6252 low-order bits. */
6253
6254 if (GET_MODE_CLASS (mode) == MODE_INT && HWI_COMPUTABLE_MODE_P (mode))
6255 {
6256 src = force_to_mode (src, mode, ~(unsigned HOST_WIDE_INT) 0, 0);
6257 SUBST (SET_SRC (x), src);
6258 }
6259
6260 /* If we are setting CC0 or if the source is a COMPARE, look for the use of
6261 the comparison result and try to simplify it unless we already have used
6262 undobuf.other_insn. */
6263 if ((GET_MODE_CLASS (mode) == MODE_CC
6264 || GET_CODE (src) == COMPARE
6265 || CC0_P (dest))
6266 && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
6267 && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
6268 && COMPARISON_P (*cc_use)
6269 && rtx_equal_p (XEXP (*cc_use, 0), dest))
6270 {
6271 enum rtx_code old_code = GET_CODE (*cc_use);
6272 enum rtx_code new_code;
6273 rtx op0, op1, tmp;
6274 int other_changed = 0;
6275 rtx inner_compare = NULL_RTX;
6276 enum machine_mode compare_mode = GET_MODE (dest);
6277
6278 if (GET_CODE (src) == COMPARE)
6279 {
6280 op0 = XEXP (src, 0), op1 = XEXP (src, 1);
6281 if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
6282 {
6283 inner_compare = op0;
6284 op0 = XEXP (inner_compare, 0), op1 = XEXP (inner_compare, 1);
6285 }
6286 }
6287 else
6288 op0 = src, op1 = CONST0_RTX (GET_MODE (src));
6289
6290 tmp = simplify_relational_operation (old_code, compare_mode, VOIDmode,
6291 op0, op1);
6292 if (!tmp)
6293 new_code = old_code;
6294 else if (!CONSTANT_P (tmp))
6295 {
6296 new_code = GET_CODE (tmp);
6297 op0 = XEXP (tmp, 0);
6298 op1 = XEXP (tmp, 1);
6299 }
6300 else
6301 {
6302 rtx pat = PATTERN (other_insn);
6303 undobuf.other_insn = other_insn;
6304 SUBST (*cc_use, tmp);
6305
6306 /* Attempt to simplify CC user. */
6307 if (GET_CODE (pat) == SET)
6308 {
6309 rtx new_rtx = simplify_rtx (SET_SRC (pat));
6310 if (new_rtx != NULL_RTX)
6311 SUBST (SET_SRC (pat), new_rtx);
6312 }
6313
6314 /* Convert X into a no-op move. */
6315 SUBST (SET_DEST (x), pc_rtx);
6316 SUBST (SET_SRC (x), pc_rtx);
6317 return x;
6318 }
6319
6320 /* Simplify our comparison, if possible. */
6321 new_code = simplify_comparison (new_code, &op0, &op1);
6322
6323 #ifdef SELECT_CC_MODE
6324 /* If this machine has CC modes other than CCmode, check to see if we
6325 need to use a different CC mode here. */
6326 if (GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
6327 compare_mode = GET_MODE (op0);
6328 else if (inner_compare
6329 && GET_MODE_CLASS (GET_MODE (inner_compare)) == MODE_CC
6330 && new_code == old_code
6331 && op0 == XEXP (inner_compare, 0)
6332 && op1 == XEXP (inner_compare, 1))
6333 compare_mode = GET_MODE (inner_compare);
6334 else
6335 compare_mode = SELECT_CC_MODE (new_code, op0, op1);
6336
6337 #ifndef HAVE_cc0
6338 /* If the mode changed, we have to change SET_DEST, the mode in the
6339 compare, and the mode in the place SET_DEST is used. If SET_DEST is
6340 a hard register, just build new versions with the proper mode. If it
6341 is a pseudo, we lose unless it is only time we set the pseudo, in
6342 which case we can safely change its mode. */
6343 if (compare_mode != GET_MODE (dest))
6344 {
6345 if (can_change_dest_mode (dest, 0, compare_mode))
6346 {
6347 unsigned int regno = REGNO (dest);
6348 rtx new_dest;
6349
6350 if (regno < FIRST_PSEUDO_REGISTER)
6351 new_dest = gen_rtx_REG (compare_mode, regno);
6352 else
6353 {
6354 SUBST_MODE (regno_reg_rtx[regno], compare_mode);
6355 new_dest = regno_reg_rtx[regno];
6356 }
6357
6358 SUBST (SET_DEST (x), new_dest);
6359 SUBST (XEXP (*cc_use, 0), new_dest);
6360 other_changed = 1;
6361
6362 dest = new_dest;
6363 }
6364 }
6365 #endif /* cc0 */
6366 #endif /* SELECT_CC_MODE */
6367
6368 /* If the code changed, we have to build a new comparison in
6369 undobuf.other_insn. */
6370 if (new_code != old_code)
6371 {
6372 int other_changed_previously = other_changed;
6373 unsigned HOST_WIDE_INT mask;
6374 rtx old_cc_use = *cc_use;
6375
6376 SUBST (*cc_use, gen_rtx_fmt_ee (new_code, GET_MODE (*cc_use),
6377 dest, const0_rtx));
6378 other_changed = 1;
6379
6380 /* If the only change we made was to change an EQ into an NE or
6381 vice versa, OP0 has only one bit that might be nonzero, and OP1
6382 is zero, check if changing the user of the condition code will
6383 produce a valid insn. If it won't, we can keep the original code
6384 in that insn by surrounding our operation with an XOR. */
6385
6386 if (((old_code == NE && new_code == EQ)
6387 || (old_code == EQ && new_code == NE))
6388 && ! other_changed_previously && op1 == const0_rtx
6389 && HWI_COMPUTABLE_MODE_P (GET_MODE (op0))
6390 && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
6391 {
6392 rtx pat = PATTERN (other_insn), note = 0;
6393
6394 if ((recog_for_combine (&pat, other_insn, &note) < 0
6395 && ! check_asm_operands (pat)))
6396 {
6397 *cc_use = old_cc_use;
6398 other_changed = 0;
6399
6400 op0 = simplify_gen_binary (XOR, GET_MODE (op0), op0,
6401 gen_int_mode (mask,
6402 GET_MODE (op0)));
6403 }
6404 }
6405 }
6406
6407 if (other_changed)
6408 undobuf.other_insn = other_insn;
6409
6410 /* Otherwise, if we didn't previously have a COMPARE in the
6411 correct mode, we need one. */
6412 if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
6413 {
6414 SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
6415 src = SET_SRC (x);
6416 }
6417 else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
6418 {
6419 SUBST (SET_SRC (x), op0);
6420 src = SET_SRC (x);
6421 }
6422 /* Otherwise, update the COMPARE if needed. */
6423 else if (XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
6424 {
6425 SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
6426 src = SET_SRC (x);
6427 }
6428 }
6429 else
6430 {
6431 /* Get SET_SRC in a form where we have placed back any
6432 compound expressions. Then do the checks below. */
6433 src = make_compound_operation (src, SET);
6434 SUBST (SET_SRC (x), src);
6435 }
6436
6437 /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
6438 and X being a REG or (subreg (reg)), we may be able to convert this to
6439 (set (subreg:m2 x) (op)).
6440
6441 We can always do this if M1 is narrower than M2 because that means that
6442 we only care about the low bits of the result.
6443
6444 However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
6445 perform a narrower operation than requested since the high-order bits will
6446 be undefined. On machine where it is defined, this transformation is safe
6447 as long as M1 and M2 have the same number of words. */
6448
6449 if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6450 && !OBJECT_P (SUBREG_REG (src))
6451 && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
6452 / UNITS_PER_WORD)
6453 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
6454 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
6455 #ifndef WORD_REGISTER_OPERATIONS
6456 && (GET_MODE_SIZE (GET_MODE (src))
6457 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
6458 #endif
6459 #ifdef CANNOT_CHANGE_MODE_CLASS
6460 && ! (REG_P (dest) && REGNO (dest) < FIRST_PSEUDO_REGISTER
6461 && REG_CANNOT_CHANGE_MODE_P (REGNO (dest),
6462 GET_MODE (SUBREG_REG (src)),
6463 GET_MODE (src)))
6464 #endif
6465 && (REG_P (dest)
6466 || (GET_CODE (dest) == SUBREG
6467 && REG_P (SUBREG_REG (dest)))))
6468 {
6469 SUBST (SET_DEST (x),
6470 gen_lowpart (GET_MODE (SUBREG_REG (src)),
6471 dest));
6472 SUBST (SET_SRC (x), SUBREG_REG (src));
6473
6474 src = SET_SRC (x), dest = SET_DEST (x);
6475 }
6476
6477 #ifdef HAVE_cc0
6478 /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
6479 in SRC. */
6480 if (dest == cc0_rtx
6481 && GET_CODE (src) == SUBREG
6482 && subreg_lowpart_p (src)
6483 && (GET_MODE_PRECISION (GET_MODE (src))
6484 < GET_MODE_PRECISION (GET_MODE (SUBREG_REG (src)))))
6485 {
6486 rtx inner = SUBREG_REG (src);
6487 enum machine_mode inner_mode = GET_MODE (inner);
6488
6489 /* Here we make sure that we don't have a sign bit on. */
6490 if (val_signbit_known_clear_p (GET_MODE (src),
6491 nonzero_bits (inner, inner_mode)))
6492 {
6493 SUBST (SET_SRC (x), inner);
6494 src = SET_SRC (x);
6495 }
6496 }
6497 #endif
6498
6499 #ifdef LOAD_EXTEND_OP
6500 /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
6501 would require a paradoxical subreg. Replace the subreg with a
6502 zero_extend to avoid the reload that would otherwise be required. */
6503
6504 if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
6505 && INTEGRAL_MODE_P (GET_MODE (SUBREG_REG (src)))
6506 && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != UNKNOWN
6507 && SUBREG_BYTE (src) == 0
6508 && paradoxical_subreg_p (src)
6509 && MEM_P (SUBREG_REG (src)))
6510 {
6511 SUBST (SET_SRC (x),
6512 gen_rtx_fmt_e (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
6513 GET_MODE (src), SUBREG_REG (src)));
6514
6515 src = SET_SRC (x);
6516 }
6517 #endif
6518
6519 /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
6520 are comparing an item known to be 0 or -1 against 0, use a logical
6521 operation instead. Check for one of the arms being an IOR of the other
6522 arm with some value. We compute three terms to be IOR'ed together. In
6523 practice, at most two will be nonzero. Then we do the IOR's. */
6524
6525 if (GET_CODE (dest) != PC
6526 && GET_CODE (src) == IF_THEN_ELSE
6527 && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
6528 && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
6529 && XEXP (XEXP (src, 0), 1) == const0_rtx
6530 && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
6531 #ifdef HAVE_conditional_move
6532 && ! can_conditionally_move_p (GET_MODE (src))
6533 #endif
6534 && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
6535 GET_MODE (XEXP (XEXP (src, 0), 0)))
6536 == GET_MODE_PRECISION (GET_MODE (XEXP (XEXP (src, 0), 0))))
6537 && ! side_effects_p (src))
6538 {
6539 rtx true_rtx = (GET_CODE (XEXP (src, 0)) == NE
6540 ? XEXP (src, 1) : XEXP (src, 2));
6541 rtx false_rtx = (GET_CODE (XEXP (src, 0)) == NE
6542 ? XEXP (src, 2) : XEXP (src, 1));
6543 rtx term1 = const0_rtx, term2, term3;
6544
6545 if (GET_CODE (true_rtx) == IOR
6546 && rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
6547 term1 = false_rtx, true_rtx = XEXP (true_rtx, 1), false_rtx = const0_rtx;
6548 else if (GET_CODE (true_rtx) == IOR
6549 && rtx_equal_p (XEXP (true_rtx, 1), false_rtx))
6550 term1 = false_rtx, true_rtx = XEXP (true_rtx, 0), false_rtx = const0_rtx;
6551 else if (GET_CODE (false_rtx) == IOR
6552 && rtx_equal_p (XEXP (false_rtx, 0), true_rtx))
6553 term1 = true_rtx, false_rtx = XEXP (false_rtx, 1), true_rtx = const0_rtx;
6554 else if (GET_CODE (false_rtx) == IOR
6555 && rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
6556 term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
6557
6558 term2 = simplify_gen_binary (AND, GET_MODE (src),
6559 XEXP (XEXP (src, 0), 0), true_rtx);
6560 term3 = simplify_gen_binary (AND, GET_MODE (src),
6561 simplify_gen_unary (NOT, GET_MODE (src),
6562 XEXP (XEXP (src, 0), 0),
6563 GET_MODE (src)),
6564 false_rtx);
6565
6566 SUBST (SET_SRC (x),
6567 simplify_gen_binary (IOR, GET_MODE (src),
6568 simplify_gen_binary (IOR, GET_MODE (src),
6569 term1, term2),
6570 term3));
6571
6572 src = SET_SRC (x);
6573 }
6574
6575 /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
6576 whole thing fail. */
6577 if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
6578 return src;
6579 else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
6580 return dest;
6581 else
6582 /* Convert this into a field assignment operation, if possible. */
6583 return make_field_assignment (x);
6584 }
6585 \f
6586 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
6587 result. */
6588
6589 static rtx
6590 simplify_logical (rtx x)
6591 {
6592 enum machine_mode mode = GET_MODE (x);
6593 rtx op0 = XEXP (x, 0);
6594 rtx op1 = XEXP (x, 1);
6595
6596 switch (GET_CODE (x))
6597 {
6598 case AND:
6599 /* We can call simplify_and_const_int only if we don't lose
6600 any (sign) bits when converting INTVAL (op1) to
6601 "unsigned HOST_WIDE_INT". */
6602 if (CONST_INT_P (op1)
6603 && (HWI_COMPUTABLE_MODE_P (mode)
6604 || INTVAL (op1) > 0))
6605 {
6606 x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
6607 if (GET_CODE (x) != AND)
6608 return x;
6609
6610 op0 = XEXP (x, 0);
6611 op1 = XEXP (x, 1);
6612 }
6613
6614 /* If we have any of (and (ior A B) C) or (and (xor A B) C),
6615 apply the distributive law and then the inverse distributive
6616 law to see if things simplify. */
6617 if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
6618 {
6619 rtx result = distribute_and_simplify_rtx (x, 0);
6620 if (result)
6621 return result;
6622 }
6623 if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
6624 {
6625 rtx result = distribute_and_simplify_rtx (x, 1);
6626 if (result)
6627 return result;
6628 }
6629 break;
6630
6631 case IOR:
6632 /* If we have (ior (and A B) C), apply the distributive law and then
6633 the inverse distributive law to see if things simplify. */
6634
6635 if (GET_CODE (op0) == AND)
6636 {
6637 rtx result = distribute_and_simplify_rtx (x, 0);
6638 if (result)
6639 return result;
6640 }
6641
6642 if (GET_CODE (op1) == AND)
6643 {
6644 rtx result = distribute_and_simplify_rtx (x, 1);
6645 if (result)
6646 return result;
6647 }
6648 break;
6649
6650 default:
6651 gcc_unreachable ();
6652 }
6653
6654 return x;
6655 }
6656 \f
6657 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
6658 operations" because they can be replaced with two more basic operations.
6659 ZERO_EXTEND is also considered "compound" because it can be replaced with
6660 an AND operation, which is simpler, though only one operation.
6661
6662 The function expand_compound_operation is called with an rtx expression
6663 and will convert it to the appropriate shifts and AND operations,
6664 simplifying at each stage.
6665
6666 The function make_compound_operation is called to convert an expression
6667 consisting of shifts and ANDs into the equivalent compound expression.
6668 It is the inverse of this function, loosely speaking. */
6669
6670 static rtx
6671 expand_compound_operation (rtx x)
6672 {
6673 unsigned HOST_WIDE_INT pos = 0, len;
6674 int unsignedp = 0;
6675 unsigned int modewidth;
6676 rtx tem;
6677
6678 switch (GET_CODE (x))
6679 {
6680 case ZERO_EXTEND:
6681 unsignedp = 1;
6682 case SIGN_EXTEND:
6683 /* We can't necessarily use a const_int for a multiword mode;
6684 it depends on implicitly extending the value.
6685 Since we don't know the right way to extend it,
6686 we can't tell whether the implicit way is right.
6687
6688 Even for a mode that is no wider than a const_int,
6689 we can't win, because we need to sign extend one of its bits through
6690 the rest of it, and we don't know which bit. */
6691 if (CONST_INT_P (XEXP (x, 0)))
6692 return x;
6693
6694 /* Return if (subreg:MODE FROM 0) is not a safe replacement for
6695 (zero_extend:MODE FROM) or (sign_extend:MODE FROM). It is for any MEM
6696 because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
6697 reloaded. If not for that, MEM's would very rarely be safe.
6698
6699 Reject MODEs bigger than a word, because we might not be able
6700 to reference a two-register group starting with an arbitrary register
6701 (and currently gen_lowpart might crash for a SUBREG). */
6702
6703 if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
6704 return x;
6705
6706 /* Reject MODEs that aren't scalar integers because turning vector
6707 or complex modes into shifts causes problems. */
6708
6709 if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6710 return x;
6711
6712 len = GET_MODE_PRECISION (GET_MODE (XEXP (x, 0)));
6713 /* If the inner object has VOIDmode (the only way this can happen
6714 is if it is an ASM_OPERANDS), we can't do anything since we don't
6715 know how much masking to do. */
6716 if (len == 0)
6717 return x;
6718
6719 break;
6720
6721 case ZERO_EXTRACT:
6722 unsignedp = 1;
6723
6724 /* ... fall through ... */
6725
6726 case SIGN_EXTRACT:
6727 /* If the operand is a CLOBBER, just return it. */
6728 if (GET_CODE (XEXP (x, 0)) == CLOBBER)
6729 return XEXP (x, 0);
6730
6731 if (!CONST_INT_P (XEXP (x, 1))
6732 || !CONST_INT_P (XEXP (x, 2))
6733 || GET_MODE (XEXP (x, 0)) == VOIDmode)
6734 return x;
6735
6736 /* Reject MODEs that aren't scalar integers because turning vector
6737 or complex modes into shifts causes problems. */
6738
6739 if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
6740 return x;
6741
6742 len = INTVAL (XEXP (x, 1));
6743 pos = INTVAL (XEXP (x, 2));
6744
6745 /* This should stay within the object being extracted, fail otherwise. */
6746 if (len + pos > GET_MODE_PRECISION (GET_MODE (XEXP (x, 0))))
6747 return x;
6748
6749 if (BITS_BIG_ENDIAN)
6750 pos = GET_MODE_PRECISION (GET_MODE (XEXP (x, 0))) - len - pos;
6751
6752 break;
6753
6754 default:
6755 return x;
6756 }
6757 /* Convert sign extension to zero extension, if we know that the high
6758 bit is not set, as this is easier to optimize. It will be converted
6759 back to cheaper alternative in make_extraction. */
6760 if (GET_CODE (x) == SIGN_EXTEND
6761 && (HWI_COMPUTABLE_MODE_P (GET_MODE (x))
6762 && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
6763 & ~(((unsigned HOST_WIDE_INT)
6764 GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
6765 >> 1))
6766 == 0)))
6767 {
6768 rtx temp = gen_rtx_ZERO_EXTEND (GET_MODE (x), XEXP (x, 0));
6769 rtx temp2 = expand_compound_operation (temp);
6770
6771 /* Make sure this is a profitable operation. */
6772 if (set_src_cost (x, optimize_this_for_speed_p)
6773 > set_src_cost (temp2, optimize_this_for_speed_p))
6774 return temp2;
6775 else if (set_src_cost (x, optimize_this_for_speed_p)
6776 > set_src_cost (temp, optimize_this_for_speed_p))
6777 return temp;
6778 else
6779 return x;
6780 }
6781
6782 /* We can optimize some special cases of ZERO_EXTEND. */
6783 if (GET_CODE (x) == ZERO_EXTEND)
6784 {
6785 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
6786 know that the last value didn't have any inappropriate bits
6787 set. */
6788 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6789 && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6790 && HWI_COMPUTABLE_MODE_P (GET_MODE (x))
6791 && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
6792 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6793 return XEXP (XEXP (x, 0), 0);
6794
6795 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
6796 if (GET_CODE (XEXP (x, 0)) == SUBREG
6797 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6798 && subreg_lowpart_p (XEXP (x, 0))
6799 && HWI_COMPUTABLE_MODE_P (GET_MODE (x))
6800 && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
6801 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6802 return SUBREG_REG (XEXP (x, 0));
6803
6804 /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
6805 is a comparison and STORE_FLAG_VALUE permits. This is like
6806 the first case, but it works even when GET_MODE (x) is larger
6807 than HOST_WIDE_INT. */
6808 if (GET_CODE (XEXP (x, 0)) == TRUNCATE
6809 && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
6810 && COMPARISON_P (XEXP (XEXP (x, 0), 0))
6811 && (GET_MODE_PRECISION (GET_MODE (XEXP (x, 0)))
6812 <= HOST_BITS_PER_WIDE_INT)
6813 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6814 return XEXP (XEXP (x, 0), 0);
6815
6816 /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)). */
6817 if (GET_CODE (XEXP (x, 0)) == SUBREG
6818 && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
6819 && subreg_lowpart_p (XEXP (x, 0))
6820 && COMPARISON_P (SUBREG_REG (XEXP (x, 0)))
6821 && (GET_MODE_PRECISION (GET_MODE (XEXP (x, 0)))
6822 <= HOST_BITS_PER_WIDE_INT)
6823 && (STORE_FLAG_VALUE & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6824 return SUBREG_REG (XEXP (x, 0));
6825
6826 }
6827
6828 /* If we reach here, we want to return a pair of shifts. The inner
6829 shift is a left shift of BITSIZE - POS - LEN bits. The outer
6830 shift is a right shift of BITSIZE - LEN bits. It is arithmetic or
6831 logical depending on the value of UNSIGNEDP.
6832
6833 If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
6834 converted into an AND of a shift.
6835
6836 We must check for the case where the left shift would have a negative
6837 count. This can happen in a case like (x >> 31) & 255 on machines
6838 that can't shift by a constant. On those machines, we would first
6839 combine the shift with the AND to produce a variable-position
6840 extraction. Then the constant of 31 would be substituted in
6841 to produce such a position. */
6842
6843 modewidth = GET_MODE_PRECISION (GET_MODE (x));
6844 if (modewidth >= pos + len)
6845 {
6846 enum machine_mode mode = GET_MODE (x);
6847 tem = gen_lowpart (mode, XEXP (x, 0));
6848 if (!tem || GET_CODE (tem) == CLOBBER)
6849 return x;
6850 tem = simplify_shift_const (NULL_RTX, ASHIFT, mode,
6851 tem, modewidth - pos - len);
6852 tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
6853 mode, tem, modewidth - len);
6854 }
6855 else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
6856 tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
6857 simplify_shift_const (NULL_RTX, LSHIFTRT,
6858 GET_MODE (x),
6859 XEXP (x, 0), pos),
6860 ((unsigned HOST_WIDE_INT) 1 << len) - 1);
6861 else
6862 /* Any other cases we can't handle. */
6863 return x;
6864
6865 /* If we couldn't do this for some reason, return the original
6866 expression. */
6867 if (GET_CODE (tem) == CLOBBER)
6868 return x;
6869
6870 return tem;
6871 }
6872 \f
6873 /* X is a SET which contains an assignment of one object into
6874 a part of another (such as a bit-field assignment, STRICT_LOW_PART,
6875 or certain SUBREGS). If possible, convert it into a series of
6876 logical operations.
6877
6878 We half-heartedly support variable positions, but do not at all
6879 support variable lengths. */
6880
6881 static const_rtx
6882 expand_field_assignment (const_rtx x)
6883 {
6884 rtx inner;
6885 rtx pos; /* Always counts from low bit. */
6886 int len;
6887 rtx mask, cleared, masked;
6888 enum machine_mode compute_mode;
6889
6890 /* Loop until we find something we can't simplify. */
6891 while (1)
6892 {
6893 if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
6894 && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
6895 {
6896 inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
6897 len = GET_MODE_PRECISION (GET_MODE (XEXP (SET_DEST (x), 0)));
6898 pos = GEN_INT (subreg_lsb (XEXP (SET_DEST (x), 0)));
6899 }
6900 else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
6901 && CONST_INT_P (XEXP (SET_DEST (x), 1)))
6902 {
6903 inner = XEXP (SET_DEST (x), 0);
6904 len = INTVAL (XEXP (SET_DEST (x), 1));
6905 pos = XEXP (SET_DEST (x), 2);
6906
6907 /* A constant position should stay within the width of INNER. */
6908 if (CONST_INT_P (pos)
6909 && INTVAL (pos) + len > GET_MODE_PRECISION (GET_MODE (inner)))
6910 break;
6911
6912 if (BITS_BIG_ENDIAN)
6913 {
6914 if (CONST_INT_P (pos))
6915 pos = GEN_INT (GET_MODE_PRECISION (GET_MODE (inner)) - len
6916 - INTVAL (pos));
6917 else if (GET_CODE (pos) == MINUS
6918 && CONST_INT_P (XEXP (pos, 1))
6919 && (INTVAL (XEXP (pos, 1))
6920 == GET_MODE_PRECISION (GET_MODE (inner)) - len))
6921 /* If position is ADJUST - X, new position is X. */
6922 pos = XEXP (pos, 0);
6923 else
6924 {
6925 HOST_WIDE_INT prec = GET_MODE_PRECISION (GET_MODE (inner));
6926 pos = simplify_gen_binary (MINUS, GET_MODE (pos),
6927 gen_int_mode (prec - len,
6928 GET_MODE (pos)),
6929 pos);
6930 }
6931 }
6932 }
6933
6934 /* A SUBREG between two modes that occupy the same numbers of words
6935 can be done by moving the SUBREG to the source. */
6936 else if (GET_CODE (SET_DEST (x)) == SUBREG
6937 /* We need SUBREGs to compute nonzero_bits properly. */
6938 && nonzero_sign_valid
6939 && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
6940 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
6941 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
6942 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
6943 {
6944 x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
6945 gen_lowpart
6946 (GET_MODE (SUBREG_REG (SET_DEST (x))),
6947 SET_SRC (x)));
6948 continue;
6949 }
6950 else
6951 break;
6952
6953 while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
6954 inner = SUBREG_REG (inner);
6955
6956 compute_mode = GET_MODE (inner);
6957
6958 /* Don't attempt bitwise arithmetic on non scalar integer modes. */
6959 if (! SCALAR_INT_MODE_P (compute_mode))
6960 {
6961 enum machine_mode imode;
6962
6963 /* Don't do anything for vector or complex integral types. */
6964 if (! FLOAT_MODE_P (compute_mode))
6965 break;
6966
6967 /* Try to find an integral mode to pun with. */
6968 imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
6969 if (imode == BLKmode)
6970 break;
6971
6972 compute_mode = imode;
6973 inner = gen_lowpart (imode, inner);
6974 }
6975
6976 /* Compute a mask of LEN bits, if we can do this on the host machine. */
6977 if (len >= HOST_BITS_PER_WIDE_INT)
6978 break;
6979
6980 /* Now compute the equivalent expression. Make a copy of INNER
6981 for the SET_DEST in case it is a MEM into which we will substitute;
6982 we don't want shared RTL in that case. */
6983 mask = gen_int_mode (((unsigned HOST_WIDE_INT) 1 << len) - 1,
6984 compute_mode);
6985 cleared = simplify_gen_binary (AND, compute_mode,
6986 simplify_gen_unary (NOT, compute_mode,
6987 simplify_gen_binary (ASHIFT,
6988 compute_mode,
6989 mask, pos),
6990 compute_mode),
6991 inner);
6992 masked = simplify_gen_binary (ASHIFT, compute_mode,
6993 simplify_gen_binary (
6994 AND, compute_mode,
6995 gen_lowpart (compute_mode, SET_SRC (x)),
6996 mask),
6997 pos);
6998
6999 x = gen_rtx_SET (VOIDmode, copy_rtx (inner),
7000 simplify_gen_binary (IOR, compute_mode,
7001 cleared, masked));
7002 }
7003
7004 return x;
7005 }
7006 \f
7007 /* Return an RTX for a reference to LEN bits of INNER. If POS_RTX is nonzero,
7008 it is an RTX that represents the (variable) starting position; otherwise,
7009 POS is the (constant) starting bit position. Both are counted from the LSB.
7010
7011 UNSIGNEDP is nonzero for an unsigned reference and zero for a signed one.
7012
7013 IN_DEST is nonzero if this is a reference in the destination of a SET.
7014 This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If nonzero,
7015 a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
7016 be used.
7017
7018 IN_COMPARE is nonzero if we are in a COMPARE. This means that a
7019 ZERO_EXTRACT should be built even for bits starting at bit 0.
7020
7021 MODE is the desired mode of the result (if IN_DEST == 0).
7022
7023 The result is an RTX for the extraction or NULL_RTX if the target
7024 can't handle it. */
7025
7026 static rtx
7027 make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos,
7028 rtx pos_rtx, unsigned HOST_WIDE_INT len, int unsignedp,
7029 int in_dest, int in_compare)
7030 {
7031 /* This mode describes the size of the storage area
7032 to fetch the overall value from. Within that, we
7033 ignore the POS lowest bits, etc. */
7034 enum machine_mode is_mode = GET_MODE (inner);
7035 enum machine_mode inner_mode;
7036 enum machine_mode wanted_inner_mode;
7037 enum machine_mode wanted_inner_reg_mode = word_mode;
7038 enum machine_mode pos_mode = word_mode;
7039 enum machine_mode extraction_mode = word_mode;
7040 enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
7041 rtx new_rtx = 0;
7042 rtx orig_pos_rtx = pos_rtx;
7043 HOST_WIDE_INT orig_pos;
7044
7045 if (pos_rtx && CONST_INT_P (pos_rtx))
7046 pos = INTVAL (pos_rtx), pos_rtx = 0;
7047
7048 if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
7049 {
7050 /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
7051 consider just the QI as the memory to extract from.
7052 The subreg adds or removes high bits; its mode is
7053 irrelevant to the meaning of this extraction,
7054 since POS and LEN count from the lsb. */
7055 if (MEM_P (SUBREG_REG (inner)))
7056 is_mode = GET_MODE (SUBREG_REG (inner));
7057 inner = SUBREG_REG (inner);
7058 }
7059 else if (GET_CODE (inner) == ASHIFT
7060 && CONST_INT_P (XEXP (inner, 1))
7061 && pos_rtx == 0 && pos == 0
7062 && len > UINTVAL (XEXP (inner, 1)))
7063 {
7064 /* We're extracting the least significant bits of an rtx
7065 (ashift X (const_int C)), where LEN > C. Extract the
7066 least significant (LEN - C) bits of X, giving an rtx
7067 whose mode is MODE, then shift it left C times. */
7068 new_rtx = make_extraction (mode, XEXP (inner, 0),
7069 0, 0, len - INTVAL (XEXP (inner, 1)),
7070 unsignedp, in_dest, in_compare);
7071 if (new_rtx != 0)
7072 return gen_rtx_ASHIFT (mode, new_rtx, XEXP (inner, 1));
7073 }
7074 else if (GET_CODE (inner) == TRUNCATE)
7075 inner = XEXP (inner, 0);
7076
7077 inner_mode = GET_MODE (inner);
7078
7079 /* See if this can be done without an extraction. We never can if the
7080 width of the field is not the same as that of some integer mode. For
7081 registers, we can only avoid the extraction if the position is at the
7082 low-order bit and this is either not in the destination or we have the
7083 appropriate STRICT_LOW_PART operation available.
7084
7085 For MEM, we can avoid an extract if the field starts on an appropriate
7086 boundary and we can change the mode of the memory reference. */
7087
7088 if (tmode != BLKmode
7089 && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
7090 && !MEM_P (inner)
7091 && (inner_mode == tmode
7092 || !REG_P (inner)
7093 || TRULY_NOOP_TRUNCATION_MODES_P (tmode, inner_mode)
7094 || reg_truncated_to_mode (tmode, inner))
7095 && (! in_dest
7096 || (REG_P (inner)
7097 && have_insn_for (STRICT_LOW_PART, tmode))))
7098 || (MEM_P (inner) && pos_rtx == 0
7099 && (pos
7100 % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
7101 : BITS_PER_UNIT)) == 0
7102 /* We can't do this if we are widening INNER_MODE (it
7103 may not be aligned, for one thing). */
7104 && GET_MODE_PRECISION (inner_mode) >= GET_MODE_PRECISION (tmode)
7105 && (inner_mode == tmode
7106 || (! mode_dependent_address_p (XEXP (inner, 0),
7107 MEM_ADDR_SPACE (inner))
7108 && ! MEM_VOLATILE_P (inner))))))
7109 {
7110 /* If INNER is a MEM, make a new MEM that encompasses just the desired
7111 field. If the original and current mode are the same, we need not
7112 adjust the offset. Otherwise, we do if bytes big endian.
7113
7114 If INNER is not a MEM, get a piece consisting of just the field
7115 of interest (in this case POS % BITS_PER_WORD must be 0). */
7116
7117 if (MEM_P (inner))
7118 {
7119 HOST_WIDE_INT offset;
7120
7121 /* POS counts from lsb, but make OFFSET count in memory order. */
7122 if (BYTES_BIG_ENDIAN)
7123 offset = (GET_MODE_PRECISION (is_mode) - len - pos) / BITS_PER_UNIT;
7124 else
7125 offset = pos / BITS_PER_UNIT;
7126
7127 new_rtx = adjust_address_nv (inner, tmode, offset);
7128 }
7129 else if (REG_P (inner))
7130 {
7131 if (tmode != inner_mode)
7132 {
7133 /* We can't call gen_lowpart in a DEST since we
7134 always want a SUBREG (see below) and it would sometimes
7135 return a new hard register. */
7136 if (pos || in_dest)
7137 {
7138 HOST_WIDE_INT final_word = pos / BITS_PER_WORD;
7139
7140 if (WORDS_BIG_ENDIAN
7141 && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD)
7142 final_word = ((GET_MODE_SIZE (inner_mode)
7143 - GET_MODE_SIZE (tmode))
7144 / UNITS_PER_WORD) - final_word;
7145
7146 final_word *= UNITS_PER_WORD;
7147 if (BYTES_BIG_ENDIAN &&
7148 GET_MODE_SIZE (inner_mode) > GET_MODE_SIZE (tmode))
7149 final_word += (GET_MODE_SIZE (inner_mode)
7150 - GET_MODE_SIZE (tmode)) % UNITS_PER_WORD;
7151
7152 /* Avoid creating invalid subregs, for example when
7153 simplifying (x>>32)&255. */
7154 if (!validate_subreg (tmode, inner_mode, inner, final_word))
7155 return NULL_RTX;
7156
7157 new_rtx = gen_rtx_SUBREG (tmode, inner, final_word);
7158 }
7159 else
7160 new_rtx = gen_lowpart (tmode, inner);
7161 }
7162 else
7163 new_rtx = inner;
7164 }
7165 else
7166 new_rtx = force_to_mode (inner, tmode,
7167 len >= HOST_BITS_PER_WIDE_INT
7168 ? ~(unsigned HOST_WIDE_INT) 0
7169 : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
7170 0);
7171
7172 /* If this extraction is going into the destination of a SET,
7173 make a STRICT_LOW_PART unless we made a MEM. */
7174
7175 if (in_dest)
7176 return (MEM_P (new_rtx) ? new_rtx
7177 : (GET_CODE (new_rtx) != SUBREG
7178 ? gen_rtx_CLOBBER (tmode, const0_rtx)
7179 : gen_rtx_STRICT_LOW_PART (VOIDmode, new_rtx)));
7180
7181 if (mode == tmode)
7182 return new_rtx;
7183
7184 if (CONST_SCALAR_INT_P (new_rtx))
7185 return simplify_unary_operation (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
7186 mode, new_rtx, tmode);
7187
7188 /* If we know that no extraneous bits are set, and that the high
7189 bit is not set, convert the extraction to the cheaper of
7190 sign and zero extension, that are equivalent in these cases. */
7191 if (flag_expensive_optimizations
7192 && (HWI_COMPUTABLE_MODE_P (tmode)
7193 && ((nonzero_bits (new_rtx, tmode)
7194 & ~(((unsigned HOST_WIDE_INT)GET_MODE_MASK (tmode)) >> 1))
7195 == 0)))
7196 {
7197 rtx temp = gen_rtx_ZERO_EXTEND (mode, new_rtx);
7198 rtx temp1 = gen_rtx_SIGN_EXTEND (mode, new_rtx);
7199
7200 /* Prefer ZERO_EXTENSION, since it gives more information to
7201 backends. */
7202 if (set_src_cost (temp, optimize_this_for_speed_p)
7203 <= set_src_cost (temp1, optimize_this_for_speed_p))
7204 return temp;
7205 return temp1;
7206 }
7207
7208 /* Otherwise, sign- or zero-extend unless we already are in the
7209 proper mode. */
7210
7211 return (gen_rtx_fmt_e (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
7212 mode, new_rtx));
7213 }
7214
7215 /* Unless this is a COMPARE or we have a funny memory reference,
7216 don't do anything with zero-extending field extracts starting at
7217 the low-order bit since they are simple AND operations. */
7218 if (pos_rtx == 0 && pos == 0 && ! in_dest
7219 && ! in_compare && unsignedp)
7220 return 0;
7221
7222 /* Unless INNER is not MEM, reject this if we would be spanning bytes or
7223 if the position is not a constant and the length is not 1. In all
7224 other cases, we would only be going outside our object in cases when
7225 an original shift would have been undefined. */
7226 if (MEM_P (inner)
7227 && ((pos_rtx == 0 && pos + len > GET_MODE_PRECISION (is_mode))
7228 || (pos_rtx != 0 && len != 1)))
7229 return 0;
7230
7231 enum extraction_pattern pattern = (in_dest ? EP_insv
7232 : unsignedp ? EP_extzv : EP_extv);
7233
7234 /* If INNER is not from memory, we want it to have the mode of a register
7235 extraction pattern's structure operand, or word_mode if there is no
7236 such pattern. The same applies to extraction_mode and pos_mode
7237 and their respective operands.
7238
7239 For memory, assume that the desired extraction_mode and pos_mode
7240 are the same as for a register operation, since at present we don't
7241 have named patterns for aligned memory structures. */
7242 struct extraction_insn insn;
7243 if (get_best_reg_extraction_insn (&insn, pattern,
7244 GET_MODE_BITSIZE (inner_mode), mode))
7245 {
7246 wanted_inner_reg_mode = insn.struct_mode;
7247 pos_mode = insn.pos_mode;
7248 extraction_mode = insn.field_mode;
7249 }
7250
7251 /* Never narrow an object, since that might not be safe. */
7252
7253 if (mode != VOIDmode
7254 && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
7255 extraction_mode = mode;
7256
7257 if (!MEM_P (inner))
7258 wanted_inner_mode = wanted_inner_reg_mode;
7259 else
7260 {
7261 /* Be careful not to go beyond the extracted object and maintain the
7262 natural alignment of the memory. */
7263 wanted_inner_mode = smallest_mode_for_size (len, MODE_INT);
7264 while (pos % GET_MODE_BITSIZE (wanted_inner_mode) + len
7265 > GET_MODE_BITSIZE (wanted_inner_mode))
7266 {
7267 wanted_inner_mode = GET_MODE_WIDER_MODE (wanted_inner_mode);
7268 gcc_assert (wanted_inner_mode != VOIDmode);
7269 }
7270 }
7271
7272 orig_pos = pos;
7273
7274 if (BITS_BIG_ENDIAN)
7275 {
7276 /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
7277 BITS_BIG_ENDIAN style. If position is constant, compute new
7278 position. Otherwise, build subtraction.
7279 Note that POS is relative to the mode of the original argument.
7280 If it's a MEM we need to recompute POS relative to that.
7281 However, if we're extracting from (or inserting into) a register,
7282 we want to recompute POS relative to wanted_inner_mode. */
7283 int width = (MEM_P (inner)
7284 ? GET_MODE_BITSIZE (is_mode)
7285 : GET_MODE_BITSIZE (wanted_inner_mode));
7286
7287 if (pos_rtx == 0)
7288 pos = width - len - pos;
7289 else
7290 pos_rtx
7291 = gen_rtx_MINUS (GET_MODE (pos_rtx),
7292 gen_int_mode (width - len, GET_MODE (pos_rtx)),
7293 pos_rtx);
7294 /* POS may be less than 0 now, but we check for that below.
7295 Note that it can only be less than 0 if !MEM_P (inner). */
7296 }
7297
7298 /* If INNER has a wider mode, and this is a constant extraction, try to
7299 make it smaller and adjust the byte to point to the byte containing
7300 the value. */
7301 if (wanted_inner_mode != VOIDmode
7302 && inner_mode != wanted_inner_mode
7303 && ! pos_rtx
7304 && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
7305 && MEM_P (inner)
7306 && ! mode_dependent_address_p (XEXP (inner, 0), MEM_ADDR_SPACE (inner))
7307 && ! MEM_VOLATILE_P (inner))
7308 {
7309 int offset = 0;
7310
7311 /* The computations below will be correct if the machine is big
7312 endian in both bits and bytes or little endian in bits and bytes.
7313 If it is mixed, we must adjust. */
7314
7315 /* If bytes are big endian and we had a paradoxical SUBREG, we must
7316 adjust OFFSET to compensate. */
7317 if (BYTES_BIG_ENDIAN
7318 && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
7319 offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
7320
7321 /* We can now move to the desired byte. */
7322 offset += (pos / GET_MODE_BITSIZE (wanted_inner_mode))
7323 * GET_MODE_SIZE (wanted_inner_mode);
7324 pos %= GET_MODE_BITSIZE (wanted_inner_mode);
7325
7326 if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
7327 && is_mode != wanted_inner_mode)
7328 offset = (GET_MODE_SIZE (is_mode)
7329 - GET_MODE_SIZE (wanted_inner_mode) - offset);
7330
7331 inner = adjust_address_nv (inner, wanted_inner_mode, offset);
7332 }
7333
7334 /* If INNER is not memory, get it into the proper mode. If we are changing
7335 its mode, POS must be a constant and smaller than the size of the new
7336 mode. */
7337 else if (!MEM_P (inner))
7338 {
7339 /* On the LHS, don't create paradoxical subregs implicitely truncating
7340 the register unless TRULY_NOOP_TRUNCATION. */
7341 if (in_dest
7342 && !TRULY_NOOP_TRUNCATION_MODES_P (GET_MODE (inner),
7343 wanted_inner_mode))
7344 return NULL_RTX;
7345
7346 if (GET_MODE (inner) != wanted_inner_mode
7347 && (pos_rtx != 0
7348 || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
7349 return NULL_RTX;
7350
7351 if (orig_pos < 0)
7352 return NULL_RTX;
7353
7354 inner = force_to_mode (inner, wanted_inner_mode,
7355 pos_rtx
7356 || len + orig_pos >= HOST_BITS_PER_WIDE_INT
7357 ? ~(unsigned HOST_WIDE_INT) 0
7358 : ((((unsigned HOST_WIDE_INT) 1 << len) - 1)
7359 << orig_pos),
7360 0);
7361 }
7362
7363 /* Adjust mode of POS_RTX, if needed. If we want a wider mode, we
7364 have to zero extend. Otherwise, we can just use a SUBREG. */
7365 if (pos_rtx != 0
7366 && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
7367 {
7368 rtx temp = simplify_gen_unary (ZERO_EXTEND, pos_mode, pos_rtx,
7369 GET_MODE (pos_rtx));
7370
7371 /* If we know that no extraneous bits are set, and that the high
7372 bit is not set, convert extraction to cheaper one - either
7373 SIGN_EXTENSION or ZERO_EXTENSION, that are equivalent in these
7374 cases. */
7375 if (flag_expensive_optimizations
7376 && (HWI_COMPUTABLE_MODE_P (GET_MODE (pos_rtx))
7377 && ((nonzero_bits (pos_rtx, GET_MODE (pos_rtx))
7378 & ~(((unsigned HOST_WIDE_INT)
7379 GET_MODE_MASK (GET_MODE (pos_rtx)))
7380 >> 1))
7381 == 0)))
7382 {
7383 rtx temp1 = simplify_gen_unary (SIGN_EXTEND, pos_mode, pos_rtx,
7384 GET_MODE (pos_rtx));
7385
7386 /* Prefer ZERO_EXTENSION, since it gives more information to
7387 backends. */
7388 if (set_src_cost (temp1, optimize_this_for_speed_p)
7389 < set_src_cost (temp, optimize_this_for_speed_p))
7390 temp = temp1;
7391 }
7392 pos_rtx = temp;
7393 }
7394
7395 /* Make POS_RTX unless we already have it and it is correct. If we don't
7396 have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
7397 be a CONST_INT. */
7398 if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
7399 pos_rtx = orig_pos_rtx;
7400
7401 else if (pos_rtx == 0)
7402 pos_rtx = GEN_INT (pos);
7403
7404 /* Make the required operation. See if we can use existing rtx. */
7405 new_rtx = gen_rtx_fmt_eee (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
7406 extraction_mode, inner, GEN_INT (len), pos_rtx);
7407 if (! in_dest)
7408 new_rtx = gen_lowpart (mode, new_rtx);
7409
7410 return new_rtx;
7411 }
7412 \f
7413 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
7414 with any other operations in X. Return X without that shift if so. */
7415
7416 static rtx
7417 extract_left_shift (rtx x, int count)
7418 {
7419 enum rtx_code code = GET_CODE (x);
7420 enum machine_mode mode = GET_MODE (x);
7421 rtx tem;
7422
7423 switch (code)
7424 {
7425 case ASHIFT:
7426 /* This is the shift itself. If it is wide enough, we will return
7427 either the value being shifted if the shift count is equal to
7428 COUNT or a shift for the difference. */
7429 if (CONST_INT_P (XEXP (x, 1))
7430 && INTVAL (XEXP (x, 1)) >= count)
7431 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
7432 INTVAL (XEXP (x, 1)) - count);
7433 break;
7434
7435 case NEG: case NOT:
7436 if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7437 return simplify_gen_unary (code, mode, tem, mode);
7438
7439 break;
7440
7441 case PLUS: case IOR: case XOR: case AND:
7442 /* If we can safely shift this constant and we find the inner shift,
7443 make a new operation. */
7444 if (CONST_INT_P (XEXP (x, 1))
7445 && (UINTVAL (XEXP (x, 1))
7446 & ((((unsigned HOST_WIDE_INT) 1 << count)) - 1)) == 0
7447 && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
7448 {
7449 HOST_WIDE_INT val = INTVAL (XEXP (x, 1)) >> count;
7450 return simplify_gen_binary (code, mode, tem,
7451 gen_int_mode (val, mode));
7452 }
7453 break;
7454
7455 default:
7456 break;
7457 }
7458
7459 return 0;
7460 }
7461 \f
7462 /* Look at the expression rooted at X. Look for expressions
7463 equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
7464 Form these expressions.
7465
7466 Return the new rtx, usually just X.
7467
7468 Also, for machines like the VAX that don't have logical shift insns,
7469 try to convert logical to arithmetic shift operations in cases where
7470 they are equivalent. This undoes the canonicalizations to logical
7471 shifts done elsewhere.
7472
7473 We try, as much as possible, to re-use rtl expressions to save memory.
7474
7475 IN_CODE says what kind of expression we are processing. Normally, it is
7476 SET. In a memory address (inside a MEM, PLUS or minus, the latter two
7477 being kludges), it is MEM. When processing the arguments of a comparison
7478 or a COMPARE against zero, it is COMPARE. */
7479
7480 rtx
7481 make_compound_operation (rtx x, enum rtx_code in_code)
7482 {
7483 enum rtx_code code = GET_CODE (x);
7484 enum machine_mode mode = GET_MODE (x);
7485 int mode_width = GET_MODE_PRECISION (mode);
7486 rtx rhs, lhs;
7487 enum rtx_code next_code;
7488 int i, j;
7489 rtx new_rtx = 0;
7490 rtx tem;
7491 const char *fmt;
7492
7493 /* Select the code to be used in recursive calls. Once we are inside an
7494 address, we stay there. If we have a comparison, set to COMPARE,
7495 but once inside, go back to our default of SET. */
7496
7497 next_code = (code == MEM ? MEM
7498 : ((code == PLUS || code == MINUS)
7499 && SCALAR_INT_MODE_P (mode)) ? MEM
7500 : ((code == COMPARE || COMPARISON_P (x))
7501 && XEXP (x, 1) == const0_rtx) ? COMPARE
7502 : in_code == COMPARE ? SET : in_code);
7503
7504 /* Process depending on the code of this operation. If NEW is set
7505 nonzero, it will be returned. */
7506
7507 switch (code)
7508 {
7509 case ASHIFT:
7510 /* Convert shifts by constants into multiplications if inside
7511 an address. */
7512 if (in_code == MEM && CONST_INT_P (XEXP (x, 1))
7513 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
7514 && INTVAL (XEXP (x, 1)) >= 0
7515 && SCALAR_INT_MODE_P (mode))
7516 {
7517 HOST_WIDE_INT count = INTVAL (XEXP (x, 1));
7518 HOST_WIDE_INT multval = (HOST_WIDE_INT) 1 << count;
7519
7520 new_rtx = make_compound_operation (XEXP (x, 0), next_code);
7521 if (GET_CODE (new_rtx) == NEG)
7522 {
7523 new_rtx = XEXP (new_rtx, 0);
7524 multval = -multval;
7525 }
7526 multval = trunc_int_for_mode (multval, mode);
7527 new_rtx = gen_rtx_MULT (mode, new_rtx, gen_int_mode (multval, mode));
7528 }
7529 break;
7530
7531 case PLUS:
7532 lhs = XEXP (x, 0);
7533 rhs = XEXP (x, 1);
7534 lhs = make_compound_operation (lhs, next_code);
7535 rhs = make_compound_operation (rhs, next_code);
7536 if (GET_CODE (lhs) == MULT && GET_CODE (XEXP (lhs, 0)) == NEG
7537 && SCALAR_INT_MODE_P (mode))
7538 {
7539 tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (lhs, 0), 0),
7540 XEXP (lhs, 1));
7541 new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
7542 }
7543 else if (GET_CODE (lhs) == MULT
7544 && (CONST_INT_P (XEXP (lhs, 1)) && INTVAL (XEXP (lhs, 1)) < 0))
7545 {
7546 tem = simplify_gen_binary (MULT, mode, XEXP (lhs, 0),
7547 simplify_gen_unary (NEG, mode,
7548 XEXP (lhs, 1),
7549 mode));
7550 new_rtx = simplify_gen_binary (MINUS, mode, rhs, tem);
7551 }
7552 else
7553 {
7554 SUBST (XEXP (x, 0), lhs);
7555 SUBST (XEXP (x, 1), rhs);
7556 goto maybe_swap;
7557 }
7558 x = gen_lowpart (mode, new_rtx);
7559 goto maybe_swap;
7560
7561 case MINUS:
7562 lhs = XEXP (x, 0);
7563 rhs = XEXP (x, 1);
7564 lhs = make_compound_operation (lhs, next_code);
7565 rhs = make_compound_operation (rhs, next_code);
7566 if (GET_CODE (rhs) == MULT && GET_CODE (XEXP (rhs, 0)) == NEG
7567 && SCALAR_INT_MODE_P (mode))
7568 {
7569 tem = simplify_gen_binary (MULT, mode, XEXP (XEXP (rhs, 0), 0),
7570 XEXP (rhs, 1));
7571 new_rtx = simplify_gen_binary (PLUS, mode, tem, lhs);
7572 }
7573 else if (GET_CODE (rhs) == MULT
7574 && (CONST_INT_P (XEXP (rhs, 1)) && INTVAL (XEXP (rhs, 1)) < 0))
7575 {
7576 tem = simplify_gen_binary (MULT, mode, XEXP (rhs, 0),
7577 simplify_gen_unary (NEG, mode,
7578 XEXP (rhs, 1),
7579 mode));
7580 new_rtx = simplify_gen_binary (PLUS, mode, tem, lhs);
7581 }
7582 else
7583 {
7584 SUBST (XEXP (x, 0), lhs);
7585 SUBST (XEXP (x, 1), rhs);
7586 return x;
7587 }
7588 return gen_lowpart (mode, new_rtx);
7589
7590 case AND:
7591 /* If the second operand is not a constant, we can't do anything
7592 with it. */
7593 if (!CONST_INT_P (XEXP (x, 1)))
7594 break;
7595
7596 /* If the constant is a power of two minus one and the first operand
7597 is a logical right shift, make an extraction. */
7598 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7599 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7600 {
7601 new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7602 new_rtx = make_extraction (mode, new_rtx, 0, XEXP (XEXP (x, 0), 1), i, 1,
7603 0, in_code == COMPARE);
7604 }
7605
7606 /* Same as previous, but for (subreg (lshiftrt ...)) in first op. */
7607 else if (GET_CODE (XEXP (x, 0)) == SUBREG
7608 && subreg_lowpart_p (XEXP (x, 0))
7609 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
7610 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7611 {
7612 new_rtx = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
7613 next_code);
7614 new_rtx = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new_rtx, 0,
7615 XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
7616 0, in_code == COMPARE);
7617 }
7618 /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)). */
7619 else if ((GET_CODE (XEXP (x, 0)) == XOR
7620 || GET_CODE (XEXP (x, 0)) == IOR)
7621 && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
7622 && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
7623 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7624 {
7625 /* Apply the distributive law, and then try to make extractions. */
7626 new_rtx = gen_rtx_fmt_ee (GET_CODE (XEXP (x, 0)), mode,
7627 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
7628 XEXP (x, 1)),
7629 gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
7630 XEXP (x, 1)));
7631 new_rtx = make_compound_operation (new_rtx, in_code);
7632 }
7633
7634 /* If we are have (and (rotate X C) M) and C is larger than the number
7635 of bits in M, this is an extraction. */
7636
7637 else if (GET_CODE (XEXP (x, 0)) == ROTATE
7638 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7639 && (i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0
7640 && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
7641 {
7642 new_rtx = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
7643 new_rtx = make_extraction (mode, new_rtx,
7644 (GET_MODE_PRECISION (mode)
7645 - INTVAL (XEXP (XEXP (x, 0), 1))),
7646 NULL_RTX, i, 1, 0, in_code == COMPARE);
7647 }
7648
7649 /* On machines without logical shifts, if the operand of the AND is
7650 a logical shift and our mask turns off all the propagated sign
7651 bits, we can replace the logical shift with an arithmetic shift. */
7652 else if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
7653 && !have_insn_for (LSHIFTRT, mode)
7654 && have_insn_for (ASHIFTRT, mode)
7655 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
7656 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
7657 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
7658 && mode_width <= HOST_BITS_PER_WIDE_INT)
7659 {
7660 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
7661
7662 mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
7663 if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
7664 SUBST (XEXP (x, 0),
7665 gen_rtx_ASHIFTRT (mode,
7666 make_compound_operation
7667 (XEXP (XEXP (x, 0), 0), next_code),
7668 XEXP (XEXP (x, 0), 1)));
7669 }
7670
7671 /* If the constant is one less than a power of two, this might be
7672 representable by an extraction even if no shift is present.
7673 If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
7674 we are in a COMPARE. */
7675 else if ((i = exact_log2 (UINTVAL (XEXP (x, 1)) + 1)) >= 0)
7676 new_rtx = make_extraction (mode,
7677 make_compound_operation (XEXP (x, 0),
7678 next_code),
7679 0, NULL_RTX, i, 1, 0, in_code == COMPARE);
7680
7681 /* If we are in a comparison and this is an AND with a power of two,
7682 convert this into the appropriate bit extract. */
7683 else if (in_code == COMPARE
7684 && (i = exact_log2 (UINTVAL (XEXP (x, 1)))) >= 0)
7685 new_rtx = make_extraction (mode,
7686 make_compound_operation (XEXP (x, 0),
7687 next_code),
7688 i, NULL_RTX, 1, 1, 0, 1);
7689
7690 break;
7691
7692 case LSHIFTRT:
7693 /* If the sign bit is known to be zero, replace this with an
7694 arithmetic shift. */
7695 if (have_insn_for (ASHIFTRT, mode)
7696 && ! have_insn_for (LSHIFTRT, mode)
7697 && mode_width <= HOST_BITS_PER_WIDE_INT
7698 && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
7699 {
7700 new_rtx = gen_rtx_ASHIFTRT (mode,
7701 make_compound_operation (XEXP (x, 0),
7702 next_code),
7703 XEXP (x, 1));
7704 break;
7705 }
7706
7707 /* ... fall through ... */
7708
7709 case ASHIFTRT:
7710 lhs = XEXP (x, 0);
7711 rhs = XEXP (x, 1);
7712
7713 /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
7714 this is a SIGN_EXTRACT. */
7715 if (CONST_INT_P (rhs)
7716 && GET_CODE (lhs) == ASHIFT
7717 && CONST_INT_P (XEXP (lhs, 1))
7718 && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))
7719 && INTVAL (XEXP (lhs, 1)) >= 0
7720 && INTVAL (rhs) < mode_width)
7721 {
7722 new_rtx = make_compound_operation (XEXP (lhs, 0), next_code);
7723 new_rtx = make_extraction (mode, new_rtx,
7724 INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
7725 NULL_RTX, mode_width - INTVAL (rhs),
7726 code == LSHIFTRT, 0, in_code == COMPARE);
7727 break;
7728 }
7729
7730 /* See if we have operations between an ASHIFTRT and an ASHIFT.
7731 If so, try to merge the shifts into a SIGN_EXTEND. We could
7732 also do this for some cases of SIGN_EXTRACT, but it doesn't
7733 seem worth the effort; the case checked for occurs on Alpha. */
7734
7735 if (!OBJECT_P (lhs)
7736 && ! (GET_CODE (lhs) == SUBREG
7737 && (OBJECT_P (SUBREG_REG (lhs))))
7738 && CONST_INT_P (rhs)
7739 && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
7740 && INTVAL (rhs) < mode_width
7741 && (new_rtx = extract_left_shift (lhs, INTVAL (rhs))) != 0)
7742 new_rtx = make_extraction (mode, make_compound_operation (new_rtx, next_code),
7743 0, NULL_RTX, mode_width - INTVAL (rhs),
7744 code == LSHIFTRT, 0, in_code == COMPARE);
7745
7746 break;
7747
7748 case SUBREG:
7749 /* Call ourselves recursively on the inner expression. If we are
7750 narrowing the object and it has a different RTL code from
7751 what it originally did, do this SUBREG as a force_to_mode. */
7752 {
7753 rtx inner = SUBREG_REG (x), simplified;
7754 enum rtx_code subreg_code = in_code;
7755
7756 /* If in_code is COMPARE, it isn't always safe to pass it through
7757 to the recursive make_compound_operation call. */
7758 if (subreg_code == COMPARE
7759 && (!subreg_lowpart_p (x)
7760 || GET_CODE (inner) == SUBREG
7761 /* (subreg:SI (and:DI (reg:DI) (const_int 0x800000000)) 0)
7762 is (const_int 0), rather than
7763 (subreg:SI (lshiftrt:DI (reg:DI) (const_int 35)) 0). */
7764 || (GET_CODE (inner) == AND
7765 && CONST_INT_P (XEXP (inner, 1))
7766 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner))
7767 && exact_log2 (UINTVAL (XEXP (inner, 1)))
7768 >= GET_MODE_BITSIZE (mode))))
7769 subreg_code = SET;
7770
7771 tem = make_compound_operation (inner, subreg_code);
7772
7773 simplified
7774 = simplify_subreg (mode, tem, GET_MODE (inner), SUBREG_BYTE (x));
7775 if (simplified)
7776 tem = simplified;
7777
7778 if (GET_CODE (tem) != GET_CODE (inner)
7779 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner))
7780 && subreg_lowpart_p (x))
7781 {
7782 rtx newer
7783 = force_to_mode (tem, mode, ~(unsigned HOST_WIDE_INT) 0, 0);
7784
7785 /* If we have something other than a SUBREG, we might have
7786 done an expansion, so rerun ourselves. */
7787 if (GET_CODE (newer) != SUBREG)
7788 newer = make_compound_operation (newer, in_code);
7789
7790 /* force_to_mode can expand compounds. If it just re-expanded the
7791 compound, use gen_lowpart to convert to the desired mode. */
7792 if (rtx_equal_p (newer, x)
7793 /* Likewise if it re-expanded the compound only partially.
7794 This happens for SUBREG of ZERO_EXTRACT if they extract
7795 the same number of bits. */
7796 || (GET_CODE (newer) == SUBREG
7797 && (GET_CODE (SUBREG_REG (newer)) == LSHIFTRT
7798 || GET_CODE (SUBREG_REG (newer)) == ASHIFTRT)
7799 && GET_CODE (inner) == AND
7800 && rtx_equal_p (SUBREG_REG (newer), XEXP (inner, 0))))
7801 return gen_lowpart (GET_MODE (x), tem);
7802
7803 return newer;
7804 }
7805
7806 if (simplified)
7807 return tem;
7808 }
7809 break;
7810
7811 default:
7812 break;
7813 }
7814
7815 if (new_rtx)
7816 {
7817 x = gen_lowpart (mode, new_rtx);
7818 code = GET_CODE (x);
7819 }
7820
7821 /* Now recursively process each operand of this operation. We need to
7822 handle ZERO_EXTEND specially so that we don't lose track of the
7823 inner mode. */
7824 if (GET_CODE (x) == ZERO_EXTEND)
7825 {
7826 new_rtx = make_compound_operation (XEXP (x, 0), next_code);
7827 tem = simplify_const_unary_operation (ZERO_EXTEND, GET_MODE (x),
7828 new_rtx, GET_MODE (XEXP (x, 0)));
7829 if (tem)
7830 return tem;
7831 SUBST (XEXP (x, 0), new_rtx);
7832 return x;
7833 }
7834
7835 fmt = GET_RTX_FORMAT (code);
7836 for (i = 0; i < GET_RTX_LENGTH (code); i++)
7837 if (fmt[i] == 'e')
7838 {
7839 new_rtx = make_compound_operation (XEXP (x, i), next_code);
7840 SUBST (XEXP (x, i), new_rtx);
7841 }
7842 else if (fmt[i] == 'E')
7843 for (j = 0; j < XVECLEN (x, i); j++)
7844 {
7845 new_rtx = make_compound_operation (XVECEXP (x, i, j), next_code);
7846 SUBST (XVECEXP (x, i, j), new_rtx);
7847 }
7848
7849 maybe_swap:
7850 /* If this is a commutative operation, the changes to the operands
7851 may have made it noncanonical. */
7852 if (COMMUTATIVE_ARITH_P (x)
7853 && swap_commutative_operands_p (XEXP (x, 0), XEXP (x, 1)))
7854 {
7855 tem = XEXP (x, 0);
7856 SUBST (XEXP (x, 0), XEXP (x, 1));
7857 SUBST (XEXP (x, 1), tem);
7858 }
7859
7860 return x;
7861 }
7862 \f
7863 /* Given M see if it is a value that would select a field of bits
7864 within an item, but not the entire word. Return -1 if not.
7865 Otherwise, return the starting position of the field, where 0 is the
7866 low-order bit.
7867
7868 *PLEN is set to the length of the field. */
7869
7870 static int
7871 get_pos_from_mask (unsigned HOST_WIDE_INT m, unsigned HOST_WIDE_INT *plen)
7872 {
7873 /* Get the bit number of the first 1 bit from the right, -1 if none. */
7874 int pos = m ? ctz_hwi (m) : -1;
7875 int len = 0;
7876
7877 if (pos >= 0)
7878 /* Now shift off the low-order zero bits and see if we have a
7879 power of two minus 1. */
7880 len = exact_log2 ((m >> pos) + 1);
7881
7882 if (len <= 0)
7883 pos = -1;
7884
7885 *plen = len;
7886 return pos;
7887 }
7888 \f
7889 /* If X refers to a register that equals REG in value, replace these
7890 references with REG. */
7891 static rtx
7892 canon_reg_for_combine (rtx x, rtx reg)
7893 {
7894 rtx op0, op1, op2;
7895 const char *fmt;
7896 int i;
7897 bool copied;
7898
7899 enum rtx_code code = GET_CODE (x);
7900 switch (GET_RTX_CLASS (code))
7901 {
7902 case RTX_UNARY:
7903 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7904 if (op0 != XEXP (x, 0))
7905 return simplify_gen_unary (GET_CODE (x), GET_MODE (x), op0,
7906 GET_MODE (reg));
7907 break;
7908
7909 case RTX_BIN_ARITH:
7910 case RTX_COMM_ARITH:
7911 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7912 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7913 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7914 return simplify_gen_binary (GET_CODE (x), GET_MODE (x), op0, op1);
7915 break;
7916
7917 case RTX_COMPARE:
7918 case RTX_COMM_COMPARE:
7919 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7920 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7921 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
7922 return simplify_gen_relational (GET_CODE (x), GET_MODE (x),
7923 GET_MODE (op0), op0, op1);
7924 break;
7925
7926 case RTX_TERNARY:
7927 case RTX_BITFIELD_OPS:
7928 op0 = canon_reg_for_combine (XEXP (x, 0), reg);
7929 op1 = canon_reg_for_combine (XEXP (x, 1), reg);
7930 op2 = canon_reg_for_combine (XEXP (x, 2), reg);
7931 if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1) || op2 != XEXP (x, 2))
7932 return simplify_gen_ternary (GET_CODE (x), GET_MODE (x),
7933 GET_MODE (op0), op0, op1, op2);
7934
7935 case RTX_OBJ:
7936 if (REG_P (x))
7937 {
7938 if (rtx_equal_p (get_last_value (reg), x)
7939 || rtx_equal_p (reg, get_last_value (x)))
7940 return reg;
7941 else
7942 break;
7943 }
7944
7945 /* fall through */
7946
7947 default:
7948 fmt = GET_RTX_FORMAT (code);
7949 copied = false;
7950 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7951 if (fmt[i] == 'e')
7952 {
7953 rtx op = canon_reg_for_combine (XEXP (x, i), reg);
7954 if (op != XEXP (x, i))
7955 {
7956 if (!copied)
7957 {
7958 copied = true;
7959 x = copy_rtx (x);
7960 }
7961 XEXP (x, i) = op;
7962 }
7963 }
7964 else if (fmt[i] == 'E')
7965 {
7966 int j;
7967 for (j = 0; j < XVECLEN (x, i); j++)
7968 {
7969 rtx op = canon_reg_for_combine (XVECEXP (x, i, j), reg);
7970 if (op != XVECEXP (x, i, j))
7971 {
7972 if (!copied)
7973 {
7974 copied = true;
7975 x = copy_rtx (x);
7976 }
7977 XVECEXP (x, i, j) = op;
7978 }
7979 }
7980 }
7981
7982 break;
7983 }
7984
7985 return x;
7986 }
7987
7988 /* Return X converted to MODE. If the value is already truncated to
7989 MODE we can just return a subreg even though in the general case we
7990 would need an explicit truncation. */
7991
7992 static rtx
7993 gen_lowpart_or_truncate (enum machine_mode mode, rtx x)
7994 {
7995 if (!CONST_INT_P (x)
7996 && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x))
7997 && !TRULY_NOOP_TRUNCATION_MODES_P (mode, GET_MODE (x))
7998 && !(REG_P (x) && reg_truncated_to_mode (mode, x)))
7999 {
8000 /* Bit-cast X into an integer mode. */
8001 if (!SCALAR_INT_MODE_P (GET_MODE (x)))
8002 x = gen_lowpart (int_mode_for_mode (GET_MODE (x)), x);
8003 x = simplify_gen_unary (TRUNCATE, int_mode_for_mode (mode),
8004 x, GET_MODE (x));
8005 }
8006
8007 return gen_lowpart (mode, x);
8008 }
8009
8010 /* See if X can be simplified knowing that we will only refer to it in
8011 MODE and will only refer to those bits that are nonzero in MASK.
8012 If other bits are being computed or if masking operations are done
8013 that select a superset of the bits in MASK, they can sometimes be
8014 ignored.
8015
8016 Return a possibly simplified expression, but always convert X to
8017 MODE. If X is a CONST_INT, AND the CONST_INT with MASK.
8018
8019 If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
8020 are all off in X. This is used when X will be complemented, by either
8021 NOT, NEG, or XOR. */
8022
8023 static rtx
8024 force_to_mode (rtx x, enum machine_mode mode, unsigned HOST_WIDE_INT mask,
8025 int just_select)
8026 {
8027 enum rtx_code code = GET_CODE (x);
8028 int next_select = just_select || code == XOR || code == NOT || code == NEG;
8029 enum machine_mode op_mode;
8030 unsigned HOST_WIDE_INT fuller_mask, nonzero;
8031 rtx op0, op1, temp;
8032
8033 /* If this is a CALL or ASM_OPERANDS, don't do anything. Some of the
8034 code below will do the wrong thing since the mode of such an
8035 expression is VOIDmode.
8036
8037 Also do nothing if X is a CLOBBER; this can happen if X was
8038 the return value from a call to gen_lowpart. */
8039 if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
8040 return x;
8041
8042 /* We want to perform the operation in its present mode unless we know
8043 that the operation is valid in MODE, in which case we do the operation
8044 in MODE. */
8045 op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
8046 && have_insn_for (code, mode))
8047 ? mode : GET_MODE (x));
8048
8049 /* It is not valid to do a right-shift in a narrower mode
8050 than the one it came in with. */
8051 if ((code == LSHIFTRT || code == ASHIFTRT)
8052 && GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (GET_MODE (x)))
8053 op_mode = GET_MODE (x);
8054
8055 /* Truncate MASK to fit OP_MODE. */
8056 if (op_mode)
8057 mask &= GET_MODE_MASK (op_mode);
8058
8059 /* When we have an arithmetic operation, or a shift whose count we
8060 do not know, we need to assume that all bits up to the highest-order
8061 bit in MASK will be needed. This is how we form such a mask. */
8062 if (mask & ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1)))
8063 fuller_mask = ~(unsigned HOST_WIDE_INT) 0;
8064 else
8065 fuller_mask = (((unsigned HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1))
8066 - 1);
8067
8068 /* Determine what bits of X are guaranteed to be (non)zero. */
8069 nonzero = nonzero_bits (x, mode);
8070
8071 /* If none of the bits in X are needed, return a zero. */
8072 if (!just_select && (nonzero & mask) == 0 && !side_effects_p (x))
8073 x = const0_rtx;
8074
8075 /* If X is a CONST_INT, return a new one. Do this here since the
8076 test below will fail. */
8077 if (CONST_INT_P (x))
8078 {
8079 if (SCALAR_INT_MODE_P (mode))
8080 return gen_int_mode (INTVAL (x) & mask, mode);
8081 else
8082 {
8083 x = GEN_INT (INTVAL (x) & mask);
8084 return gen_lowpart_common (mode, x);
8085 }
8086 }
8087
8088 /* If X is narrower than MODE and we want all the bits in X's mode, just
8089 get X in the proper mode. */
8090 if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
8091 && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
8092 return gen_lowpart (mode, x);
8093
8094 /* We can ignore the effect of a SUBREG if it narrows the mode or
8095 if the constant masks to zero all the bits the mode doesn't have. */
8096 if (GET_CODE (x) == SUBREG
8097 && subreg_lowpart_p (x)
8098 && ((GET_MODE_SIZE (GET_MODE (x))
8099 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8100 || (0 == (mask
8101 & GET_MODE_MASK (GET_MODE (x))
8102 & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
8103 return force_to_mode (SUBREG_REG (x), mode, mask, next_select);
8104
8105 /* The arithmetic simplifications here only work for scalar integer modes. */
8106 if (!SCALAR_INT_MODE_P (mode) || !SCALAR_INT_MODE_P (GET_MODE (x)))
8107 return gen_lowpart_or_truncate (mode, x);
8108
8109 switch (code)
8110 {
8111 case CLOBBER:
8112 /* If X is a (clobber (const_int)), return it since we know we are
8113 generating something that won't match. */
8114 return x;
8115
8116 case SIGN_EXTEND:
8117 case ZERO_EXTEND:
8118 case ZERO_EXTRACT:
8119 case SIGN_EXTRACT:
8120 x = expand_compound_operation (x);
8121 if (GET_CODE (x) != code)
8122 return force_to_mode (x, mode, mask, next_select);
8123 break;
8124
8125 case TRUNCATE:
8126 /* Similarly for a truncate. */
8127 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8128
8129 case AND:
8130 /* If this is an AND with a constant, convert it into an AND
8131 whose constant is the AND of that constant with MASK. If it
8132 remains an AND of MASK, delete it since it is redundant. */
8133
8134 if (CONST_INT_P (XEXP (x, 1)))
8135 {
8136 x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
8137 mask & INTVAL (XEXP (x, 1)));
8138
8139 /* If X is still an AND, see if it is an AND with a mask that
8140 is just some low-order bits. If so, and it is MASK, we don't
8141 need it. */
8142
8143 if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
8144 && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x)))
8145 == mask))
8146 x = XEXP (x, 0);
8147
8148 /* If it remains an AND, try making another AND with the bits
8149 in the mode mask that aren't in MASK turned on. If the
8150 constant in the AND is wide enough, this might make a
8151 cheaper constant. */
8152
8153 if (GET_CODE (x) == AND && CONST_INT_P (XEXP (x, 1))
8154 && GET_MODE_MASK (GET_MODE (x)) != mask
8155 && HWI_COMPUTABLE_MODE_P (GET_MODE (x)))
8156 {
8157 unsigned HOST_WIDE_INT cval
8158 = UINTVAL (XEXP (x, 1))
8159 | (GET_MODE_MASK (GET_MODE (x)) & ~mask);
8160 rtx y;
8161
8162 y = simplify_gen_binary (AND, GET_MODE (x), XEXP (x, 0),
8163 gen_int_mode (cval, GET_MODE (x)));
8164 if (set_src_cost (y, optimize_this_for_speed_p)
8165 < set_src_cost (x, optimize_this_for_speed_p))
8166 x = y;
8167 }
8168
8169 break;
8170 }
8171
8172 goto binop;
8173
8174 case PLUS:
8175 /* In (and (plus FOO C1) M), if M is a mask that just turns off
8176 low-order bits (as in an alignment operation) and FOO is already
8177 aligned to that boundary, mask C1 to that boundary as well.
8178 This may eliminate that PLUS and, later, the AND. */
8179
8180 {
8181 unsigned int width = GET_MODE_PRECISION (mode);
8182 unsigned HOST_WIDE_INT smask = mask;
8183
8184 /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
8185 number, sign extend it. */
8186
8187 if (width < HOST_BITS_PER_WIDE_INT
8188 && (smask & (HOST_WIDE_INT_1U << (width - 1))) != 0)
8189 smask |= HOST_WIDE_INT_M1U << width;
8190
8191 if (CONST_INT_P (XEXP (x, 1))
8192 && exact_log2 (- smask) >= 0
8193 && (nonzero_bits (XEXP (x, 0), mode) & ~smask) == 0
8194 && (INTVAL (XEXP (x, 1)) & ~smask) != 0)
8195 return force_to_mode (plus_constant (GET_MODE (x), XEXP (x, 0),
8196 (INTVAL (XEXP (x, 1)) & smask)),
8197 mode, smask, next_select);
8198 }
8199
8200 /* ... fall through ... */
8201
8202 case MULT:
8203 /* For PLUS, MINUS and MULT, we need any bits less significant than the
8204 most significant bit in MASK since carries from those bits will
8205 affect the bits we are interested in. */
8206 mask = fuller_mask;
8207 goto binop;
8208
8209 case MINUS:
8210 /* If X is (minus C Y) where C's least set bit is larger than any bit
8211 in the mask, then we may replace with (neg Y). */
8212 if (CONST_INT_P (XEXP (x, 0))
8213 && ((UINTVAL (XEXP (x, 0)) & -UINTVAL (XEXP (x, 0))) > mask))
8214 {
8215 x = simplify_gen_unary (NEG, GET_MODE (x), XEXP (x, 1),
8216 GET_MODE (x));
8217 return force_to_mode (x, mode, mask, next_select);
8218 }
8219
8220 /* Similarly, if C contains every bit in the fuller_mask, then we may
8221 replace with (not Y). */
8222 if (CONST_INT_P (XEXP (x, 0))
8223 && ((UINTVAL (XEXP (x, 0)) | fuller_mask) == UINTVAL (XEXP (x, 0))))
8224 {
8225 x = simplify_gen_unary (NOT, GET_MODE (x),
8226 XEXP (x, 1), GET_MODE (x));
8227 return force_to_mode (x, mode, mask, next_select);
8228 }
8229
8230 mask = fuller_mask;
8231 goto binop;
8232
8233 case IOR:
8234 case XOR:
8235 /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
8236 LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
8237 operation which may be a bitfield extraction. Ensure that the
8238 constant we form is not wider than the mode of X. */
8239
8240 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8241 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8242 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8243 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
8244 && CONST_INT_P (XEXP (x, 1))
8245 && ((INTVAL (XEXP (XEXP (x, 0), 1))
8246 + floor_log2 (INTVAL (XEXP (x, 1))))
8247 < GET_MODE_PRECISION (GET_MODE (x)))
8248 && (UINTVAL (XEXP (x, 1))
8249 & ~nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
8250 {
8251 temp = gen_int_mode ((INTVAL (XEXP (x, 1)) & mask)
8252 << INTVAL (XEXP (XEXP (x, 0), 1)),
8253 GET_MODE (x));
8254 temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
8255 XEXP (XEXP (x, 0), 0), temp);
8256 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
8257 XEXP (XEXP (x, 0), 1));
8258 return force_to_mode (x, mode, mask, next_select);
8259 }
8260
8261 binop:
8262 /* For most binary operations, just propagate into the operation and
8263 change the mode if we have an operation of that mode. */
8264
8265 op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
8266 op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
8267
8268 /* If we ended up truncating both operands, truncate the result of the
8269 operation instead. */
8270 if (GET_CODE (op0) == TRUNCATE
8271 && GET_CODE (op1) == TRUNCATE)
8272 {
8273 op0 = XEXP (op0, 0);
8274 op1 = XEXP (op1, 0);
8275 }
8276
8277 op0 = gen_lowpart_or_truncate (op_mode, op0);
8278 op1 = gen_lowpart_or_truncate (op_mode, op1);
8279
8280 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
8281 x = simplify_gen_binary (code, op_mode, op0, op1);
8282 break;
8283
8284 case ASHIFT:
8285 /* For left shifts, do the same, but just for the first operand.
8286 However, we cannot do anything with shifts where we cannot
8287 guarantee that the counts are smaller than the size of the mode
8288 because such a count will have a different meaning in a
8289 wider mode. */
8290
8291 if (! (CONST_INT_P (XEXP (x, 1))
8292 && INTVAL (XEXP (x, 1)) >= 0
8293 && INTVAL (XEXP (x, 1)) < GET_MODE_PRECISION (mode))
8294 && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
8295 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
8296 < (unsigned HOST_WIDE_INT) GET_MODE_PRECISION (mode))))
8297 break;
8298
8299 /* If the shift count is a constant and we can do arithmetic in
8300 the mode of the shift, refine which bits we need. Otherwise, use the
8301 conservative form of the mask. */
8302 if (CONST_INT_P (XEXP (x, 1))
8303 && INTVAL (XEXP (x, 1)) >= 0
8304 && INTVAL (XEXP (x, 1)) < GET_MODE_PRECISION (op_mode)
8305 && HWI_COMPUTABLE_MODE_P (op_mode))
8306 mask >>= INTVAL (XEXP (x, 1));
8307 else
8308 mask = fuller_mask;
8309
8310 op0 = gen_lowpart_or_truncate (op_mode,
8311 force_to_mode (XEXP (x, 0), op_mode,
8312 mask, next_select));
8313
8314 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
8315 x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
8316 break;
8317
8318 case LSHIFTRT:
8319 /* Here we can only do something if the shift count is a constant,
8320 this shift constant is valid for the host, and we can do arithmetic
8321 in OP_MODE. */
8322
8323 if (CONST_INT_P (XEXP (x, 1))
8324 && INTVAL (XEXP (x, 1)) >= 0
8325 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
8326 && HWI_COMPUTABLE_MODE_P (op_mode))
8327 {
8328 rtx inner = XEXP (x, 0);
8329 unsigned HOST_WIDE_INT inner_mask;
8330
8331 /* Select the mask of the bits we need for the shift operand. */
8332 inner_mask = mask << INTVAL (XEXP (x, 1));
8333
8334 /* We can only change the mode of the shift if we can do arithmetic
8335 in the mode of the shift and INNER_MASK is no wider than the
8336 width of X's mode. */
8337 if ((inner_mask & ~GET_MODE_MASK (GET_MODE (x))) != 0)
8338 op_mode = GET_MODE (x);
8339
8340 inner = force_to_mode (inner, op_mode, inner_mask, next_select);
8341
8342 if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
8343 x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
8344 }
8345
8346 /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
8347 shift and AND produces only copies of the sign bit (C2 is one less
8348 than a power of two), we can do this with just a shift. */
8349
8350 if (GET_CODE (x) == LSHIFTRT
8351 && CONST_INT_P (XEXP (x, 1))
8352 /* The shift puts one of the sign bit copies in the least significant
8353 bit. */
8354 && ((INTVAL (XEXP (x, 1))
8355 + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
8356 >= GET_MODE_PRECISION (GET_MODE (x)))
8357 && exact_log2 (mask + 1) >= 0
8358 /* Number of bits left after the shift must be more than the mask
8359 needs. */
8360 && ((INTVAL (XEXP (x, 1)) + exact_log2 (mask + 1))
8361 <= GET_MODE_PRECISION (GET_MODE (x)))
8362 /* Must be more sign bit copies than the mask needs. */
8363 && ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
8364 >= exact_log2 (mask + 1)))
8365 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
8366 GEN_INT (GET_MODE_PRECISION (GET_MODE (x))
8367 - exact_log2 (mask + 1)));
8368
8369 goto shiftrt;
8370
8371 case ASHIFTRT:
8372 /* If we are just looking for the sign bit, we don't need this shift at
8373 all, even if it has a variable count. */
8374 if (val_signbit_p (GET_MODE (x), mask))
8375 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8376
8377 /* If this is a shift by a constant, get a mask that contains those bits
8378 that are not copies of the sign bit. We then have two cases: If
8379 MASK only includes those bits, this can be a logical shift, which may
8380 allow simplifications. If MASK is a single-bit field not within
8381 those bits, we are requesting a copy of the sign bit and hence can
8382 shift the sign bit to the appropriate location. */
8383
8384 if (CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0
8385 && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
8386 {
8387 int i;
8388
8389 /* If the considered data is wider than HOST_WIDE_INT, we can't
8390 represent a mask for all its bits in a single scalar.
8391 But we only care about the lower bits, so calculate these. */
8392
8393 if (GET_MODE_PRECISION (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
8394 {
8395 nonzero = ~(unsigned HOST_WIDE_INT) 0;
8396
8397 /* GET_MODE_PRECISION (GET_MODE (x)) - INTVAL (XEXP (x, 1))
8398 is the number of bits a full-width mask would have set.
8399 We need only shift if these are fewer than nonzero can
8400 hold. If not, we must keep all bits set in nonzero. */
8401
8402 if (GET_MODE_PRECISION (GET_MODE (x)) - INTVAL (XEXP (x, 1))
8403 < HOST_BITS_PER_WIDE_INT)
8404 nonzero >>= INTVAL (XEXP (x, 1))
8405 + HOST_BITS_PER_WIDE_INT
8406 - GET_MODE_PRECISION (GET_MODE (x)) ;
8407 }
8408 else
8409 {
8410 nonzero = GET_MODE_MASK (GET_MODE (x));
8411 nonzero >>= INTVAL (XEXP (x, 1));
8412 }
8413
8414 if ((mask & ~nonzero) == 0)
8415 {
8416 x = simplify_shift_const (NULL_RTX, LSHIFTRT, GET_MODE (x),
8417 XEXP (x, 0), INTVAL (XEXP (x, 1)));
8418 if (GET_CODE (x) != ASHIFTRT)
8419 return force_to_mode (x, mode, mask, next_select);
8420 }
8421
8422 else if ((i = exact_log2 (mask)) >= 0)
8423 {
8424 x = simplify_shift_const
8425 (NULL_RTX, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
8426 GET_MODE_PRECISION (GET_MODE (x)) - 1 - i);
8427
8428 if (GET_CODE (x) != ASHIFTRT)
8429 return force_to_mode (x, mode, mask, next_select);
8430 }
8431 }
8432
8433 /* If MASK is 1, convert this to an LSHIFTRT. This can be done
8434 even if the shift count isn't a constant. */
8435 if (mask == 1)
8436 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8437 XEXP (x, 0), XEXP (x, 1));
8438
8439 shiftrt:
8440
8441 /* If this is a zero- or sign-extension operation that just affects bits
8442 we don't care about, remove it. Be sure the call above returned
8443 something that is still a shift. */
8444
8445 if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
8446 && CONST_INT_P (XEXP (x, 1))
8447 && INTVAL (XEXP (x, 1)) >= 0
8448 && (INTVAL (XEXP (x, 1))
8449 <= GET_MODE_PRECISION (GET_MODE (x)) - (floor_log2 (mask) + 1))
8450 && GET_CODE (XEXP (x, 0)) == ASHIFT
8451 && XEXP (XEXP (x, 0), 1) == XEXP (x, 1))
8452 return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
8453 next_select);
8454
8455 break;
8456
8457 case ROTATE:
8458 case ROTATERT:
8459 /* If the shift count is constant and we can do computations
8460 in the mode of X, compute where the bits we care about are.
8461 Otherwise, we can't do anything. Don't change the mode of
8462 the shift or propagate MODE into the shift, though. */
8463 if (CONST_INT_P (XEXP (x, 1))
8464 && INTVAL (XEXP (x, 1)) >= 0)
8465 {
8466 temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
8467 GET_MODE (x),
8468 gen_int_mode (mask, GET_MODE (x)),
8469 XEXP (x, 1));
8470 if (temp && CONST_INT_P (temp))
8471 x = simplify_gen_binary (code, GET_MODE (x),
8472 force_to_mode (XEXP (x, 0), GET_MODE (x),
8473 INTVAL (temp), next_select),
8474 XEXP (x, 1));
8475 }
8476 break;
8477
8478 case NEG:
8479 /* If we just want the low-order bit, the NEG isn't needed since it
8480 won't change the low-order bit. */
8481 if (mask == 1)
8482 return force_to_mode (XEXP (x, 0), mode, mask, just_select);
8483
8484 /* We need any bits less significant than the most significant bit in
8485 MASK since carries from those bits will affect the bits we are
8486 interested in. */
8487 mask = fuller_mask;
8488 goto unop;
8489
8490 case NOT:
8491 /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
8492 same as the XOR case above. Ensure that the constant we form is not
8493 wider than the mode of X. */
8494
8495 if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
8496 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
8497 && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
8498 && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
8499 < GET_MODE_PRECISION (GET_MODE (x)))
8500 && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
8501 {
8502 temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
8503 GET_MODE (x));
8504 temp = simplify_gen_binary (XOR, GET_MODE (x),
8505 XEXP (XEXP (x, 0), 0), temp);
8506 x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
8507 temp, XEXP (XEXP (x, 0), 1));
8508
8509 return force_to_mode (x, mode, mask, next_select);
8510 }
8511
8512 /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
8513 use the full mask inside the NOT. */
8514 mask = fuller_mask;
8515
8516 unop:
8517 op0 = gen_lowpart_or_truncate (op_mode,
8518 force_to_mode (XEXP (x, 0), mode, mask,
8519 next_select));
8520 if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
8521 x = simplify_gen_unary (code, op_mode, op0, op_mode);
8522 break;
8523
8524 case NE:
8525 /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
8526 in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
8527 which is equal to STORE_FLAG_VALUE. */
8528 if ((mask & ~STORE_FLAG_VALUE) == 0
8529 && XEXP (x, 1) == const0_rtx
8530 && GET_MODE (XEXP (x, 0)) == mode
8531 && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
8532 && (nonzero_bits (XEXP (x, 0), mode)
8533 == (unsigned HOST_WIDE_INT) STORE_FLAG_VALUE))
8534 return force_to_mode (XEXP (x, 0), mode, mask, next_select);
8535
8536 break;
8537
8538 case IF_THEN_ELSE:
8539 /* We have no way of knowing if the IF_THEN_ELSE can itself be
8540 written in a narrower mode. We play it safe and do not do so. */
8541
8542 op0 = gen_lowpart_or_truncate (GET_MODE (x),
8543 force_to_mode (XEXP (x, 1), mode,
8544 mask, next_select));
8545 op1 = gen_lowpart_or_truncate (GET_MODE (x),
8546 force_to_mode (XEXP (x, 2), mode,
8547 mask, next_select));
8548 if (op0 != XEXP (x, 1) || op1 != XEXP (x, 2))
8549 x = simplify_gen_ternary (IF_THEN_ELSE, GET_MODE (x),
8550 GET_MODE (XEXP (x, 0)), XEXP (x, 0),
8551 op0, op1);
8552 break;
8553
8554 default:
8555 break;
8556 }
8557
8558 /* Ensure we return a value of the proper mode. */
8559 return gen_lowpart_or_truncate (mode, x);
8560 }
8561 \f
8562 /* Return nonzero if X is an expression that has one of two values depending on
8563 whether some other value is zero or nonzero. In that case, we return the
8564 value that is being tested, *PTRUE is set to the value if the rtx being
8565 returned has a nonzero value, and *PFALSE is set to the other alternative.
8566
8567 If we return zero, we set *PTRUE and *PFALSE to X. */
8568
8569 static rtx
8570 if_then_else_cond (rtx x, rtx *ptrue, rtx *pfalse)
8571 {
8572 enum machine_mode mode = GET_MODE (x);
8573 enum rtx_code code = GET_CODE (x);
8574 rtx cond0, cond1, true0, true1, false0, false1;
8575 unsigned HOST_WIDE_INT nz;
8576
8577 /* If we are comparing a value against zero, we are done. */
8578 if ((code == NE || code == EQ)
8579 && XEXP (x, 1) == const0_rtx)
8580 {
8581 *ptrue = (code == NE) ? const_true_rtx : const0_rtx;
8582 *pfalse = (code == NE) ? const0_rtx : const_true_rtx;
8583 return XEXP (x, 0);
8584 }
8585
8586 /* If this is a unary operation whose operand has one of two values, apply
8587 our opcode to compute those values. */
8588 else if (UNARY_P (x)
8589 && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
8590 {
8591 *ptrue = simplify_gen_unary (code, mode, true0, GET_MODE (XEXP (x, 0)));
8592 *pfalse = simplify_gen_unary (code, mode, false0,
8593 GET_MODE (XEXP (x, 0)));
8594 return cond0;
8595 }
8596
8597 /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
8598 make can't possibly match and would suppress other optimizations. */
8599 else if (code == COMPARE)
8600 ;
8601
8602 /* If this is a binary operation, see if either side has only one of two
8603 values. If either one does or if both do and they are conditional on
8604 the same value, compute the new true and false values. */
8605 else if (BINARY_P (x))
8606 {
8607 cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
8608 cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
8609
8610 if ((cond0 != 0 || cond1 != 0)
8611 && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
8612 {
8613 /* If if_then_else_cond returned zero, then true/false are the
8614 same rtl. We must copy one of them to prevent invalid rtl
8615 sharing. */
8616 if (cond0 == 0)
8617 true0 = copy_rtx (true0);
8618 else if (cond1 == 0)
8619 true1 = copy_rtx (true1);
8620
8621 if (COMPARISON_P (x))
8622 {
8623 *ptrue = simplify_gen_relational (code, mode, VOIDmode,
8624 true0, true1);
8625 *pfalse = simplify_gen_relational (code, mode, VOIDmode,
8626 false0, false1);
8627 }
8628 else
8629 {
8630 *ptrue = simplify_gen_binary (code, mode, true0, true1);
8631 *pfalse = simplify_gen_binary (code, mode, false0, false1);
8632 }
8633
8634 return cond0 ? cond0 : cond1;
8635 }
8636
8637 /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
8638 operands is zero when the other is nonzero, and vice-versa,
8639 and STORE_FLAG_VALUE is 1 or -1. */
8640
8641 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8642 && (code == PLUS || code == IOR || code == XOR || code == MINUS
8643 || code == UMAX)
8644 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
8645 {
8646 rtx op0 = XEXP (XEXP (x, 0), 1);
8647 rtx op1 = XEXP (XEXP (x, 1), 1);
8648
8649 cond0 = XEXP (XEXP (x, 0), 0);
8650 cond1 = XEXP (XEXP (x, 1), 0);
8651
8652 if (COMPARISON_P (cond0)
8653 && COMPARISON_P (cond1)
8654 && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
8655 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
8656 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
8657 || ((swap_condition (GET_CODE (cond0))
8658 == reversed_comparison_code (cond1, NULL))
8659 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
8660 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
8661 && ! side_effects_p (x))
8662 {
8663 *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
8664 *pfalse = simplify_gen_binary (MULT, mode,
8665 (code == MINUS
8666 ? simplify_gen_unary (NEG, mode,
8667 op1, mode)
8668 : op1),
8669 const_true_rtx);
8670 return cond0;
8671 }
8672 }
8673
8674 /* Similarly for MULT, AND and UMIN, except that for these the result
8675 is always zero. */
8676 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8677 && (code == MULT || code == AND || code == UMIN)
8678 && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
8679 {
8680 cond0 = XEXP (XEXP (x, 0), 0);
8681 cond1 = XEXP (XEXP (x, 1), 0);
8682
8683 if (COMPARISON_P (cond0)
8684 && COMPARISON_P (cond1)
8685 && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
8686 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
8687 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
8688 || ((swap_condition (GET_CODE (cond0))
8689 == reversed_comparison_code (cond1, NULL))
8690 && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
8691 && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
8692 && ! side_effects_p (x))
8693 {
8694 *ptrue = *pfalse = const0_rtx;
8695 return cond0;
8696 }
8697 }
8698 }
8699
8700 else if (code == IF_THEN_ELSE)
8701 {
8702 /* If we have IF_THEN_ELSE already, extract the condition and
8703 canonicalize it if it is NE or EQ. */
8704 cond0 = XEXP (x, 0);
8705 *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
8706 if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
8707 return XEXP (cond0, 0);
8708 else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
8709 {
8710 *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
8711 return XEXP (cond0, 0);
8712 }
8713 else
8714 return cond0;
8715 }
8716
8717 /* If X is a SUBREG, we can narrow both the true and false values
8718 if the inner expression, if there is a condition. */
8719 else if (code == SUBREG
8720 && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
8721 &true0, &false0)))
8722 {
8723 true0 = simplify_gen_subreg (mode, true0,
8724 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
8725 false0 = simplify_gen_subreg (mode, false0,
8726 GET_MODE (SUBREG_REG (x)), SUBREG_BYTE (x));
8727 if (true0 && false0)
8728 {
8729 *ptrue = true0;
8730 *pfalse = false0;
8731 return cond0;
8732 }
8733 }
8734
8735 /* If X is a constant, this isn't special and will cause confusions
8736 if we treat it as such. Likewise if it is equivalent to a constant. */
8737 else if (CONSTANT_P (x)
8738 || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
8739 ;
8740
8741 /* If we're in BImode, canonicalize on 0 and STORE_FLAG_VALUE, as that
8742 will be least confusing to the rest of the compiler. */
8743 else if (mode == BImode)
8744 {
8745 *ptrue = GEN_INT (STORE_FLAG_VALUE), *pfalse = const0_rtx;
8746 return x;
8747 }
8748
8749 /* If X is known to be either 0 or -1, those are the true and
8750 false values when testing X. */
8751 else if (x == constm1_rtx || x == const0_rtx
8752 || (mode != VOIDmode
8753 && num_sign_bit_copies (x, mode) == GET_MODE_PRECISION (mode)))
8754 {
8755 *ptrue = constm1_rtx, *pfalse = const0_rtx;
8756 return x;
8757 }
8758
8759 /* Likewise for 0 or a single bit. */
8760 else if (HWI_COMPUTABLE_MODE_P (mode)
8761 && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
8762 {
8763 *ptrue = gen_int_mode (nz, mode), *pfalse = const0_rtx;
8764 return x;
8765 }
8766
8767 /* Otherwise fail; show no condition with true and false values the same. */
8768 *ptrue = *pfalse = x;
8769 return 0;
8770 }
8771 \f
8772 /* Return the value of expression X given the fact that condition COND
8773 is known to be true when applied to REG as its first operand and VAL
8774 as its second. X is known to not be shared and so can be modified in
8775 place.
8776
8777 We only handle the simplest cases, and specifically those cases that
8778 arise with IF_THEN_ELSE expressions. */
8779
8780 static rtx
8781 known_cond (rtx x, enum rtx_code cond, rtx reg, rtx val)
8782 {
8783 enum rtx_code code = GET_CODE (x);
8784 rtx temp;
8785 const char *fmt;
8786 int i, j;
8787
8788 if (side_effects_p (x))
8789 return x;
8790
8791 /* If either operand of the condition is a floating point value,
8792 then we have to avoid collapsing an EQ comparison. */
8793 if (cond == EQ
8794 && rtx_equal_p (x, reg)
8795 && ! FLOAT_MODE_P (GET_MODE (x))
8796 && ! FLOAT_MODE_P (GET_MODE (val)))
8797 return val;
8798
8799 if (cond == UNEQ && rtx_equal_p (x, reg))
8800 return val;
8801
8802 /* If X is (abs REG) and we know something about REG's relationship
8803 with zero, we may be able to simplify this. */
8804
8805 if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
8806 switch (cond)
8807 {
8808 case GE: case GT: case EQ:
8809 return XEXP (x, 0);
8810 case LT: case LE:
8811 return simplify_gen_unary (NEG, GET_MODE (XEXP (x, 0)),
8812 XEXP (x, 0),
8813 GET_MODE (XEXP (x, 0)));
8814 default:
8815 break;
8816 }
8817
8818 /* The only other cases we handle are MIN, MAX, and comparisons if the
8819 operands are the same as REG and VAL. */
8820
8821 else if (COMPARISON_P (x) || COMMUTATIVE_ARITH_P (x))
8822 {
8823 if (rtx_equal_p (XEXP (x, 0), val))
8824 cond = swap_condition (cond), temp = val, val = reg, reg = temp;
8825
8826 if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
8827 {
8828 if (COMPARISON_P (x))
8829 {
8830 if (comparison_dominates_p (cond, code))
8831 return const_true_rtx;
8832
8833 code = reversed_comparison_code (x, NULL);
8834 if (code != UNKNOWN
8835 && comparison_dominates_p (cond, code))
8836 return const0_rtx;
8837 else
8838 return x;
8839 }
8840 else if (code == SMAX || code == SMIN
8841 || code == UMIN || code == UMAX)
8842 {
8843 int unsignedp = (code == UMIN || code == UMAX);
8844
8845 /* Do not reverse the condition when it is NE or EQ.
8846 This is because we cannot conclude anything about
8847 the value of 'SMAX (x, y)' when x is not equal to y,
8848 but we can when x equals y. */
8849 if ((code == SMAX || code == UMAX)
8850 && ! (cond == EQ || cond == NE))
8851 cond = reverse_condition (cond);
8852
8853 switch (cond)
8854 {
8855 case GE: case GT:
8856 return unsignedp ? x : XEXP (x, 1);
8857 case LE: case LT:
8858 return unsignedp ? x : XEXP (x, 0);
8859 case GEU: case GTU:
8860 return unsignedp ? XEXP (x, 1) : x;
8861 case LEU: case LTU:
8862 return unsignedp ? XEXP (x, 0) : x;
8863 default:
8864 break;
8865 }
8866 }
8867 }
8868 }
8869 else if (code == SUBREG)
8870 {
8871 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
8872 rtx new_rtx, r = known_cond (SUBREG_REG (x), cond, reg, val);
8873
8874 if (SUBREG_REG (x) != r)
8875 {
8876 /* We must simplify subreg here, before we lose track of the
8877 original inner_mode. */
8878 new_rtx = simplify_subreg (GET_MODE (x), r,
8879 inner_mode, SUBREG_BYTE (x));
8880 if (new_rtx)
8881 return new_rtx;
8882 else
8883 SUBST (SUBREG_REG (x), r);
8884 }
8885
8886 return x;
8887 }
8888 /* We don't have to handle SIGN_EXTEND here, because even in the
8889 case of replacing something with a modeless CONST_INT, a
8890 CONST_INT is already (supposed to be) a valid sign extension for
8891 its narrower mode, which implies it's already properly
8892 sign-extended for the wider mode. Now, for ZERO_EXTEND, the
8893 story is different. */
8894 else if (code == ZERO_EXTEND)
8895 {
8896 enum machine_mode inner_mode = GET_MODE (XEXP (x, 0));
8897 rtx new_rtx, r = known_cond (XEXP (x, 0), cond, reg, val);
8898
8899 if (XEXP (x, 0) != r)
8900 {
8901 /* We must simplify the zero_extend here, before we lose
8902 track of the original inner_mode. */
8903 new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
8904 r, inner_mode);
8905 if (new_rtx)
8906 return new_rtx;
8907 else
8908 SUBST (XEXP (x, 0), r);
8909 }
8910
8911 return x;
8912 }
8913
8914 fmt = GET_RTX_FORMAT (code);
8915 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8916 {
8917 if (fmt[i] == 'e')
8918 SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
8919 else if (fmt[i] == 'E')
8920 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8921 SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
8922 cond, reg, val));
8923 }
8924
8925 return x;
8926 }
8927 \f
8928 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
8929 assignment as a field assignment. */
8930
8931 static int
8932 rtx_equal_for_field_assignment_p (rtx x, rtx y)
8933 {
8934 if (x == y || rtx_equal_p (x, y))
8935 return 1;
8936
8937 if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
8938 return 0;
8939
8940 /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
8941 Note that all SUBREGs of MEM are paradoxical; otherwise they
8942 would have been rewritten. */
8943 if (MEM_P (x) && GET_CODE (y) == SUBREG
8944 && MEM_P (SUBREG_REG (y))
8945 && rtx_equal_p (SUBREG_REG (y),
8946 gen_lowpart (GET_MODE (SUBREG_REG (y)), x)))
8947 return 1;
8948
8949 if (MEM_P (y) && GET_CODE (x) == SUBREG
8950 && MEM_P (SUBREG_REG (x))
8951 && rtx_equal_p (SUBREG_REG (x),
8952 gen_lowpart (GET_MODE (SUBREG_REG (x)), y)))
8953 return 1;
8954
8955 /* We used to see if get_last_value of X and Y were the same but that's
8956 not correct. In one direction, we'll cause the assignment to have
8957 the wrong destination and in the case, we'll import a register into this
8958 insn that might have already have been dead. So fail if none of the
8959 above cases are true. */
8960 return 0;
8961 }
8962 \f
8963 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
8964 Return that assignment if so.
8965
8966 We only handle the most common cases. */
8967
8968 static rtx
8969 make_field_assignment (rtx x)
8970 {
8971 rtx dest = SET_DEST (x);
8972 rtx src = SET_SRC (x);
8973 rtx assign;
8974 rtx rhs, lhs;
8975 HOST_WIDE_INT c1;
8976 HOST_WIDE_INT pos;
8977 unsigned HOST_WIDE_INT len;
8978 rtx other;
8979 enum machine_mode mode;
8980
8981 /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
8982 a clear of a one-bit field. We will have changed it to
8983 (and (rotate (const_int -2) POS) DEST), so check for that. Also check
8984 for a SUBREG. */
8985
8986 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
8987 && CONST_INT_P (XEXP (XEXP (src, 0), 0))
8988 && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
8989 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
8990 {
8991 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
8992 1, 1, 1, 0);
8993 if (assign != 0)
8994 return gen_rtx_SET (VOIDmode, assign, const0_rtx);
8995 return x;
8996 }
8997
8998 if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
8999 && subreg_lowpart_p (XEXP (src, 0))
9000 && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
9001 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
9002 && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
9003 && CONST_INT_P (XEXP (SUBREG_REG (XEXP (src, 0)), 0))
9004 && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
9005 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
9006 {
9007 assign = make_extraction (VOIDmode, dest, 0,
9008 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
9009 1, 1, 1, 0);
9010 if (assign != 0)
9011 return gen_rtx_SET (VOIDmode, assign, const0_rtx);
9012 return x;
9013 }
9014
9015 /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
9016 one-bit field. */
9017 if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
9018 && XEXP (XEXP (src, 0), 0) == const1_rtx
9019 && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
9020 {
9021 assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
9022 1, 1, 1, 0);
9023 if (assign != 0)
9024 return gen_rtx_SET (VOIDmode, assign, const1_rtx);
9025 return x;
9026 }
9027
9028 /* If DEST is already a field assignment, i.e. ZERO_EXTRACT, and the
9029 SRC is an AND with all bits of that field set, then we can discard
9030 the AND. */
9031 if (GET_CODE (dest) == ZERO_EXTRACT
9032 && CONST_INT_P (XEXP (dest, 1))
9033 && GET_CODE (src) == AND
9034 && CONST_INT_P (XEXP (src, 1)))
9035 {
9036 HOST_WIDE_INT width = INTVAL (XEXP (dest, 1));
9037 unsigned HOST_WIDE_INT and_mask = INTVAL (XEXP (src, 1));
9038 unsigned HOST_WIDE_INT ze_mask;
9039
9040 if (width >= HOST_BITS_PER_WIDE_INT)
9041 ze_mask = -1;
9042 else
9043 ze_mask = ((unsigned HOST_WIDE_INT)1 << width) - 1;
9044
9045 /* Complete overlap. We can remove the source AND. */
9046 if ((and_mask & ze_mask) == ze_mask)
9047 return gen_rtx_SET (VOIDmode, dest, XEXP (src, 0));
9048
9049 /* Partial overlap. We can reduce the source AND. */
9050 if ((and_mask & ze_mask) != and_mask)
9051 {
9052 mode = GET_MODE (src);
9053 src = gen_rtx_AND (mode, XEXP (src, 0),
9054 gen_int_mode (and_mask & ze_mask, mode));
9055 return gen_rtx_SET (VOIDmode, dest, src);
9056 }
9057 }
9058
9059 /* The other case we handle is assignments into a constant-position
9060 field. They look like (ior/xor (and DEST C1) OTHER). If C1 represents
9061 a mask that has all one bits except for a group of zero bits and
9062 OTHER is known to have zeros where C1 has ones, this is such an
9063 assignment. Compute the position and length from C1. Shift OTHER
9064 to the appropriate position, force it to the required mode, and
9065 make the extraction. Check for the AND in both operands. */
9066
9067 if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
9068 return x;
9069
9070 rhs = expand_compound_operation (XEXP (src, 0));
9071 lhs = expand_compound_operation (XEXP (src, 1));
9072
9073 if (GET_CODE (rhs) == AND
9074 && CONST_INT_P (XEXP (rhs, 1))
9075 && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
9076 c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
9077 else if (GET_CODE (lhs) == AND
9078 && CONST_INT_P (XEXP (lhs, 1))
9079 && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
9080 c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
9081 else
9082 return x;
9083
9084 pos = get_pos_from_mask ((~c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
9085 if (pos < 0 || pos + len > GET_MODE_PRECISION (GET_MODE (dest))
9086 || GET_MODE_PRECISION (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
9087 || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
9088 return x;
9089
9090 assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
9091 if (assign == 0)
9092 return x;
9093
9094 /* The mode to use for the source is the mode of the assignment, or of
9095 what is inside a possible STRICT_LOW_PART. */
9096 mode = (GET_CODE (assign) == STRICT_LOW_PART
9097 ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
9098
9099 /* Shift OTHER right POS places and make it the source, restricting it
9100 to the proper length and mode. */
9101
9102 src = canon_reg_for_combine (simplify_shift_const (NULL_RTX, LSHIFTRT,
9103 GET_MODE (src),
9104 other, pos),
9105 dest);
9106 src = force_to_mode (src, mode,
9107 GET_MODE_PRECISION (mode) >= HOST_BITS_PER_WIDE_INT
9108 ? ~(unsigned HOST_WIDE_INT) 0
9109 : ((unsigned HOST_WIDE_INT) 1 << len) - 1,
9110 0);
9111
9112 /* If SRC is masked by an AND that does not make a difference in
9113 the value being stored, strip it. */
9114 if (GET_CODE (assign) == ZERO_EXTRACT
9115 && CONST_INT_P (XEXP (assign, 1))
9116 && INTVAL (XEXP (assign, 1)) < HOST_BITS_PER_WIDE_INT
9117 && GET_CODE (src) == AND
9118 && CONST_INT_P (XEXP (src, 1))
9119 && UINTVAL (XEXP (src, 1))
9120 == ((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (assign, 1))) - 1)
9121 src = XEXP (src, 0);
9122
9123 return gen_rtx_SET (VOIDmode, assign, src);
9124 }
9125 \f
9126 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
9127 if so. */
9128
9129 static rtx
9130 apply_distributive_law (rtx x)
9131 {
9132 enum rtx_code code = GET_CODE (x);
9133 enum rtx_code inner_code;
9134 rtx lhs, rhs, other;
9135 rtx tem;
9136
9137 /* Distributivity is not true for floating point as it can change the
9138 value. So we don't do it unless -funsafe-math-optimizations. */
9139 if (FLOAT_MODE_P (GET_MODE (x))
9140 && ! flag_unsafe_math_optimizations)
9141 return x;
9142
9143 /* The outer operation can only be one of the following: */
9144 if (code != IOR && code != AND && code != XOR
9145 && code != PLUS && code != MINUS)
9146 return x;
9147
9148 lhs = XEXP (x, 0);
9149 rhs = XEXP (x, 1);
9150
9151 /* If either operand is a primitive we can't do anything, so get out
9152 fast. */
9153 if (OBJECT_P (lhs) || OBJECT_P (rhs))
9154 return x;
9155
9156 lhs = expand_compound_operation (lhs);
9157 rhs = expand_compound_operation (rhs);
9158 inner_code = GET_CODE (lhs);
9159 if (inner_code != GET_CODE (rhs))
9160 return x;
9161
9162 /* See if the inner and outer operations distribute. */
9163 switch (inner_code)
9164 {
9165 case LSHIFTRT:
9166 case ASHIFTRT:
9167 case AND:
9168 case IOR:
9169 /* These all distribute except over PLUS. */
9170 if (code == PLUS || code == MINUS)
9171 return x;
9172 break;
9173
9174 case MULT:
9175 if (code != PLUS && code != MINUS)
9176 return x;
9177 break;
9178
9179 case ASHIFT:
9180 /* This is also a multiply, so it distributes over everything. */
9181 break;
9182
9183 /* This used to handle SUBREG, but this turned out to be counter-
9184 productive, since (subreg (op ...)) usually is not handled by
9185 insn patterns, and this "optimization" therefore transformed
9186 recognizable patterns into unrecognizable ones. Therefore the
9187 SUBREG case was removed from here.
9188
9189 It is possible that distributing SUBREG over arithmetic operations
9190 leads to an intermediate result than can then be optimized further,
9191 e.g. by moving the outer SUBREG to the other side of a SET as done
9192 in simplify_set. This seems to have been the original intent of
9193 handling SUBREGs here.
9194
9195 However, with current GCC this does not appear to actually happen,
9196 at least on major platforms. If some case is found where removing
9197 the SUBREG case here prevents follow-on optimizations, distributing
9198 SUBREGs ought to be re-added at that place, e.g. in simplify_set. */
9199
9200 default:
9201 return x;
9202 }
9203
9204 /* Set LHS and RHS to the inner operands (A and B in the example
9205 above) and set OTHER to the common operand (C in the example).
9206 There is only one way to do this unless the inner operation is
9207 commutative. */
9208 if (COMMUTATIVE_ARITH_P (lhs)
9209 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
9210 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
9211 else if (COMMUTATIVE_ARITH_P (lhs)
9212 && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
9213 other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
9214 else if (COMMUTATIVE_ARITH_P (lhs)
9215 && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
9216 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
9217 else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
9218 other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
9219 else
9220 return x;
9221
9222 /* Form the new inner operation, seeing if it simplifies first. */
9223 tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
9224
9225 /* There is one exception to the general way of distributing:
9226 (a | c) ^ (b | c) -> (a ^ b) & ~c */
9227 if (code == XOR && inner_code == IOR)
9228 {
9229 inner_code = AND;
9230 other = simplify_gen_unary (NOT, GET_MODE (x), other, GET_MODE (x));
9231 }
9232
9233 /* We may be able to continuing distributing the result, so call
9234 ourselves recursively on the inner operation before forming the
9235 outer operation, which we return. */
9236 return simplify_gen_binary (inner_code, GET_MODE (x),
9237 apply_distributive_law (tem), other);
9238 }
9239
9240 /* See if X is of the form (* (+ A B) C), and if so convert to
9241 (+ (* A C) (* B C)) and try to simplify.
9242
9243 Most of the time, this results in no change. However, if some of
9244 the operands are the same or inverses of each other, simplifications
9245 will result.
9246
9247 For example, (and (ior A B) (not B)) can occur as the result of
9248 expanding a bit field assignment. When we apply the distributive
9249 law to this, we get (ior (and (A (not B))) (and (B (not B)))),
9250 which then simplifies to (and (A (not B))).
9251
9252 Note that no checks happen on the validity of applying the inverse
9253 distributive law. This is pointless since we can do it in the
9254 few places where this routine is called.
9255
9256 N is the index of the term that is decomposed (the arithmetic operation,
9257 i.e. (+ A B) in the first example above). !N is the index of the term that
9258 is distributed, i.e. of C in the first example above. */
9259 static rtx
9260 distribute_and_simplify_rtx (rtx x, int n)
9261 {
9262 enum machine_mode mode;
9263 enum rtx_code outer_code, inner_code;
9264 rtx decomposed, distributed, inner_op0, inner_op1, new_op0, new_op1, tmp;
9265
9266 /* Distributivity is not true for floating point as it can change the
9267 value. So we don't do it unless -funsafe-math-optimizations. */
9268 if (FLOAT_MODE_P (GET_MODE (x))
9269 && ! flag_unsafe_math_optimizations)
9270 return NULL_RTX;
9271
9272 decomposed = XEXP (x, n);
9273 if (!ARITHMETIC_P (decomposed))
9274 return NULL_RTX;
9275
9276 mode = GET_MODE (x);
9277 outer_code = GET_CODE (x);
9278 distributed = XEXP (x, !n);
9279
9280 inner_code = GET_CODE (decomposed);
9281 inner_op0 = XEXP (decomposed, 0);
9282 inner_op1 = XEXP (decomposed, 1);
9283
9284 /* Special case (and (xor B C) (not A)), which is equivalent to
9285 (xor (ior A B) (ior A C)) */
9286 if (outer_code == AND && inner_code == XOR && GET_CODE (distributed) == NOT)
9287 {
9288 distributed = XEXP (distributed, 0);
9289 outer_code = IOR;
9290 }
9291
9292 if (n == 0)
9293 {
9294 /* Distribute the second term. */
9295 new_op0 = simplify_gen_binary (outer_code, mode, inner_op0, distributed);
9296 new_op1 = simplify_gen_binary (outer_code, mode, inner_op1, distributed);
9297 }
9298 else
9299 {
9300 /* Distribute the first term. */
9301 new_op0 = simplify_gen_binary (outer_code, mode, distributed, inner_op0);
9302 new_op1 = simplify_gen_binary (outer_code, mode, distributed, inner_op1);
9303 }
9304
9305 tmp = apply_distributive_law (simplify_gen_binary (inner_code, mode,
9306 new_op0, new_op1));
9307 if (GET_CODE (tmp) != outer_code
9308 && (set_src_cost (tmp, optimize_this_for_speed_p)
9309 < set_src_cost (x, optimize_this_for_speed_p)))
9310 return tmp;
9311
9312 return NULL_RTX;
9313 }
9314 \f
9315 /* Simplify a logical `and' of VAROP with the constant CONSTOP, to be done
9316 in MODE. Return an equivalent form, if different from (and VAROP
9317 (const_int CONSTOP)). Otherwise, return NULL_RTX. */
9318
9319 static rtx
9320 simplify_and_const_int_1 (enum machine_mode mode, rtx varop,
9321 unsigned HOST_WIDE_INT constop)
9322 {
9323 unsigned HOST_WIDE_INT nonzero;
9324 unsigned HOST_WIDE_INT orig_constop;
9325 rtx orig_varop;
9326 int i;
9327
9328 orig_varop = varop;
9329 orig_constop = constop;
9330 if (GET_CODE (varop) == CLOBBER)
9331 return NULL_RTX;
9332
9333 /* Simplify VAROP knowing that we will be only looking at some of the
9334 bits in it.
9335
9336 Note by passing in CONSTOP, we guarantee that the bits not set in
9337 CONSTOP are not significant and will never be examined. We must
9338 ensure that is the case by explicitly masking out those bits
9339 before returning. */
9340 varop = force_to_mode (varop, mode, constop, 0);
9341
9342 /* If VAROP is a CLOBBER, we will fail so return it. */
9343 if (GET_CODE (varop) == CLOBBER)
9344 return varop;
9345
9346 /* If VAROP is a CONST_INT, then we need to apply the mask in CONSTOP
9347 to VAROP and return the new constant. */
9348 if (CONST_INT_P (varop))
9349 return gen_int_mode (INTVAL (varop) & constop, mode);
9350
9351 /* See what bits may be nonzero in VAROP. Unlike the general case of
9352 a call to nonzero_bits, here we don't care about bits outside
9353 MODE. */
9354
9355 nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
9356
9357 /* Turn off all bits in the constant that are known to already be zero.
9358 Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
9359 which is tested below. */
9360
9361 constop &= nonzero;
9362
9363 /* If we don't have any bits left, return zero. */
9364 if (constop == 0)
9365 return const0_rtx;
9366
9367 /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
9368 a power of two, we can replace this with an ASHIFT. */
9369 if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
9370 && (i = exact_log2 (constop)) >= 0)
9371 return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
9372
9373 /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
9374 or XOR, then try to apply the distributive law. This may eliminate
9375 operations if either branch can be simplified because of the AND.
9376 It may also make some cases more complex, but those cases probably
9377 won't match a pattern either with or without this. */
9378
9379 if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
9380 return
9381 gen_lowpart
9382 (mode,
9383 apply_distributive_law
9384 (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
9385 simplify_and_const_int (NULL_RTX,
9386 GET_MODE (varop),
9387 XEXP (varop, 0),
9388 constop),
9389 simplify_and_const_int (NULL_RTX,
9390 GET_MODE (varop),
9391 XEXP (varop, 1),
9392 constop))));
9393
9394 /* If VAROP is PLUS, and the constant is a mask of low bits, distribute
9395 the AND and see if one of the operands simplifies to zero. If so, we
9396 may eliminate it. */
9397
9398 if (GET_CODE (varop) == PLUS
9399 && exact_log2 (constop + 1) >= 0)
9400 {
9401 rtx o0, o1;
9402
9403 o0 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 0), constop);
9404 o1 = simplify_and_const_int (NULL_RTX, mode, XEXP (varop, 1), constop);
9405 if (o0 == const0_rtx)
9406 return o1;
9407 if (o1 == const0_rtx)
9408 return o0;
9409 }
9410
9411 /* Make a SUBREG if necessary. If we can't make it, fail. */
9412 varop = gen_lowpart (mode, varop);
9413 if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
9414 return NULL_RTX;
9415
9416 /* If we are only masking insignificant bits, return VAROP. */
9417 if (constop == nonzero)
9418 return varop;
9419
9420 if (varop == orig_varop && constop == orig_constop)
9421 return NULL_RTX;
9422
9423 /* Otherwise, return an AND. */
9424 return simplify_gen_binary (AND, mode, varop, gen_int_mode (constop, mode));
9425 }
9426
9427
9428 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
9429 in MODE.
9430
9431 Return an equivalent form, if different from X. Otherwise, return X. If
9432 X is zero, we are to always construct the equivalent form. */
9433
9434 static rtx
9435 simplify_and_const_int (rtx x, enum machine_mode mode, rtx varop,
9436 unsigned HOST_WIDE_INT constop)
9437 {
9438 rtx tem = simplify_and_const_int_1 (mode, varop, constop);
9439 if (tem)
9440 return tem;
9441
9442 if (!x)
9443 x = simplify_gen_binary (AND, GET_MODE (varop), varop,
9444 gen_int_mode (constop, mode));
9445 if (GET_MODE (x) != mode)
9446 x = gen_lowpart (mode, x);
9447 return x;
9448 }
9449 \f
9450 /* Given a REG, X, compute which bits in X can be nonzero.
9451 We don't care about bits outside of those defined in MODE.
9452
9453 For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
9454 a shift, AND, or zero_extract, we can do better. */
9455
9456 static rtx
9457 reg_nonzero_bits_for_combine (const_rtx x, enum machine_mode mode,
9458 const_rtx known_x ATTRIBUTE_UNUSED,
9459 enum machine_mode known_mode ATTRIBUTE_UNUSED,
9460 unsigned HOST_WIDE_INT known_ret ATTRIBUTE_UNUSED,
9461 unsigned HOST_WIDE_INT *nonzero)
9462 {
9463 rtx tem;
9464 reg_stat_type *rsp;
9465
9466 /* If X is a register whose nonzero bits value is current, use it.
9467 Otherwise, if X is a register whose value we can find, use that
9468 value. Otherwise, use the previously-computed global nonzero bits
9469 for this register. */
9470
9471 rsp = &reg_stat[REGNO (x)];
9472 if (rsp->last_set_value != 0
9473 && (rsp->last_set_mode == mode
9474 || (GET_MODE_CLASS (rsp->last_set_mode) == MODE_INT
9475 && GET_MODE_CLASS (mode) == MODE_INT))
9476 && ((rsp->last_set_label >= label_tick_ebb_start
9477 && rsp->last_set_label < label_tick)
9478 || (rsp->last_set_label == label_tick
9479 && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
9480 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
9481 && REG_N_SETS (REGNO (x)) == 1
9482 && !REGNO_REG_SET_P
9483 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
9484 REGNO (x)))))
9485 {
9486 unsigned HOST_WIDE_INT mask = rsp->last_set_nonzero_bits;
9487
9488 if (GET_MODE_PRECISION (rsp->last_set_mode) < GET_MODE_PRECISION (mode))
9489 /* We don't know anything about the upper bits. */
9490 mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (rsp->last_set_mode);
9491
9492 *nonzero &= mask;
9493 return NULL;
9494 }
9495
9496 tem = get_last_value (x);
9497
9498 if (tem)
9499 {
9500 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
9501 /* If X is narrower than MODE and TEM is a non-negative
9502 constant that would appear negative in the mode of X,
9503 sign-extend it for use in reg_nonzero_bits because some
9504 machines (maybe most) will actually do the sign-extension
9505 and this is the conservative approach.
9506
9507 ??? For 2.5, try to tighten up the MD files in this regard
9508 instead of this kludge. */
9509
9510 if (GET_MODE_PRECISION (GET_MODE (x)) < GET_MODE_PRECISION (mode)
9511 && CONST_INT_P (tem)
9512 && INTVAL (tem) > 0
9513 && val_signbit_known_set_p (GET_MODE (x), INTVAL (tem)))
9514 tem = GEN_INT (INTVAL (tem) | ~GET_MODE_MASK (GET_MODE (x)));
9515 #endif
9516 return tem;
9517 }
9518 else if (nonzero_sign_valid && rsp->nonzero_bits)
9519 {
9520 unsigned HOST_WIDE_INT mask = rsp->nonzero_bits;
9521
9522 if (GET_MODE_PRECISION (GET_MODE (x)) < GET_MODE_PRECISION (mode))
9523 /* We don't know anything about the upper bits. */
9524 mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x));
9525
9526 *nonzero &= mask;
9527 }
9528
9529 return NULL;
9530 }
9531
9532 /* Return the number of bits at the high-order end of X that are known to
9533 be equal to the sign bit. X will be used in mode MODE; if MODE is
9534 VOIDmode, X will be used in its own mode. The returned value will always
9535 be between 1 and the number of bits in MODE. */
9536
9537 static rtx
9538 reg_num_sign_bit_copies_for_combine (const_rtx x, enum machine_mode mode,
9539 const_rtx known_x ATTRIBUTE_UNUSED,
9540 enum machine_mode known_mode
9541 ATTRIBUTE_UNUSED,
9542 unsigned int known_ret ATTRIBUTE_UNUSED,
9543 unsigned int *result)
9544 {
9545 rtx tem;
9546 reg_stat_type *rsp;
9547
9548 rsp = &reg_stat[REGNO (x)];
9549 if (rsp->last_set_value != 0
9550 && rsp->last_set_mode == mode
9551 && ((rsp->last_set_label >= label_tick_ebb_start
9552 && rsp->last_set_label < label_tick)
9553 || (rsp->last_set_label == label_tick
9554 && DF_INSN_LUID (rsp->last_set) < subst_low_luid)
9555 || (REGNO (x) >= FIRST_PSEUDO_REGISTER
9556 && REG_N_SETS (REGNO (x)) == 1
9557 && !REGNO_REG_SET_P
9558 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
9559 REGNO (x)))))
9560 {
9561 *result = rsp->last_set_sign_bit_copies;
9562 return NULL;
9563 }
9564
9565 tem = get_last_value (x);
9566 if (tem != 0)
9567 return tem;
9568
9569 if (nonzero_sign_valid && rsp->sign_bit_copies != 0
9570 && GET_MODE_PRECISION (GET_MODE (x)) == GET_MODE_PRECISION (mode))
9571 *result = rsp->sign_bit_copies;
9572
9573 return NULL;
9574 }
9575 \f
9576 /* Return the number of "extended" bits there are in X, when interpreted
9577 as a quantity in MODE whose signedness is indicated by UNSIGNEDP. For
9578 unsigned quantities, this is the number of high-order zero bits.
9579 For signed quantities, this is the number of copies of the sign bit
9580 minus 1. In both case, this function returns the number of "spare"
9581 bits. For example, if two quantities for which this function returns
9582 at least 1 are added, the addition is known not to overflow.
9583
9584 This function will always return 0 unless called during combine, which
9585 implies that it must be called from a define_split. */
9586
9587 unsigned int
9588 extended_count (const_rtx x, enum machine_mode mode, int unsignedp)
9589 {
9590 if (nonzero_sign_valid == 0)
9591 return 0;
9592
9593 return (unsignedp
9594 ? (HWI_COMPUTABLE_MODE_P (mode)
9595 ? (unsigned int) (GET_MODE_PRECISION (mode) - 1
9596 - floor_log2 (nonzero_bits (x, mode)))
9597 : 0)
9598 : num_sign_bit_copies (x, mode) - 1);
9599 }
9600
9601 /* This function is called from `simplify_shift_const' to merge two
9602 outer operations. Specifically, we have already found that we need
9603 to perform operation *POP0 with constant *PCONST0 at the outermost
9604 position. We would now like to also perform OP1 with constant CONST1
9605 (with *POP0 being done last).
9606
9607 Return 1 if we can do the operation and update *POP0 and *PCONST0 with
9608 the resulting operation. *PCOMP_P is set to 1 if we would need to
9609 complement the innermost operand, otherwise it is unchanged.
9610
9611 MODE is the mode in which the operation will be done. No bits outside
9612 the width of this mode matter. It is assumed that the width of this mode
9613 is smaller than or equal to HOST_BITS_PER_WIDE_INT.
9614
9615 If *POP0 or OP1 are UNKNOWN, it means no operation is required. Only NEG, PLUS,
9616 IOR, XOR, and AND are supported. We may set *POP0 to SET if the proper
9617 result is simply *PCONST0.
9618
9619 If the resulting operation cannot be expressed as one operation, we
9620 return 0 and do not change *POP0, *PCONST0, and *PCOMP_P. */
9621
9622 static int
9623 merge_outer_ops (enum rtx_code *pop0, HOST_WIDE_INT *pconst0, enum rtx_code op1, HOST_WIDE_INT const1, enum machine_mode mode, int *pcomp_p)
9624 {
9625 enum rtx_code op0 = *pop0;
9626 HOST_WIDE_INT const0 = *pconst0;
9627
9628 const0 &= GET_MODE_MASK (mode);
9629 const1 &= GET_MODE_MASK (mode);
9630
9631 /* If OP0 is an AND, clear unimportant bits in CONST1. */
9632 if (op0 == AND)
9633 const1 &= const0;
9634
9635 /* If OP0 or OP1 is UNKNOWN, this is easy. Similarly if they are the same or
9636 if OP0 is SET. */
9637
9638 if (op1 == UNKNOWN || op0 == SET)
9639 return 1;
9640
9641 else if (op0 == UNKNOWN)
9642 op0 = op1, const0 = const1;
9643
9644 else if (op0 == op1)
9645 {
9646 switch (op0)
9647 {
9648 case AND:
9649 const0 &= const1;
9650 break;
9651 case IOR:
9652 const0 |= const1;
9653 break;
9654 case XOR:
9655 const0 ^= const1;
9656 break;
9657 case PLUS:
9658 const0 += const1;
9659 break;
9660 case NEG:
9661 op0 = UNKNOWN;
9662 break;
9663 default:
9664 break;
9665 }
9666 }
9667
9668 /* Otherwise, if either is a PLUS or NEG, we can't do anything. */
9669 else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
9670 return 0;
9671
9672 /* If the two constants aren't the same, we can't do anything. The
9673 remaining six cases can all be done. */
9674 else if (const0 != const1)
9675 return 0;
9676
9677 else
9678 switch (op0)
9679 {
9680 case IOR:
9681 if (op1 == AND)
9682 /* (a & b) | b == b */
9683 op0 = SET;
9684 else /* op1 == XOR */
9685 /* (a ^ b) | b == a | b */
9686 {;}
9687 break;
9688
9689 case XOR:
9690 if (op1 == AND)
9691 /* (a & b) ^ b == (~a) & b */
9692 op0 = AND, *pcomp_p = 1;
9693 else /* op1 == IOR */
9694 /* (a | b) ^ b == a & ~b */
9695 op0 = AND, const0 = ~const0;
9696 break;
9697
9698 case AND:
9699 if (op1 == IOR)
9700 /* (a | b) & b == b */
9701 op0 = SET;
9702 else /* op1 == XOR */
9703 /* (a ^ b) & b) == (~a) & b */
9704 *pcomp_p = 1;
9705 break;
9706 default:
9707 break;
9708 }
9709
9710 /* Check for NO-OP cases. */
9711 const0 &= GET_MODE_MASK (mode);
9712 if (const0 == 0
9713 && (op0 == IOR || op0 == XOR || op0 == PLUS))
9714 op0 = UNKNOWN;
9715 else if (const0 == 0 && op0 == AND)
9716 op0 = SET;
9717 else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
9718 && op0 == AND)
9719 op0 = UNKNOWN;
9720
9721 *pop0 = op0;
9722
9723 /* ??? Slightly redundant with the above mask, but not entirely.
9724 Moving this above means we'd have to sign-extend the mode mask
9725 for the final test. */
9726 if (op0 != UNKNOWN && op0 != NEG)
9727 *pconst0 = trunc_int_for_mode (const0, mode);
9728
9729 return 1;
9730 }
9731 \f
9732 /* A helper to simplify_shift_const_1 to determine the mode we can perform
9733 the shift in. The original shift operation CODE is performed on OP in
9734 ORIG_MODE. Return the wider mode MODE if we can perform the operation
9735 in that mode. Return ORIG_MODE otherwise. We can also assume that the
9736 result of the shift is subject to operation OUTER_CODE with operand
9737 OUTER_CONST. */
9738
9739 static enum machine_mode
9740 try_widen_shift_mode (enum rtx_code code, rtx op, int count,
9741 enum machine_mode orig_mode, enum machine_mode mode,
9742 enum rtx_code outer_code, HOST_WIDE_INT outer_const)
9743 {
9744 if (orig_mode == mode)
9745 return mode;
9746 gcc_assert (GET_MODE_PRECISION (mode) > GET_MODE_PRECISION (orig_mode));
9747
9748 /* In general we can't perform in wider mode for right shift and rotate. */
9749 switch (code)
9750 {
9751 case ASHIFTRT:
9752 /* We can still widen if the bits brought in from the left are identical
9753 to the sign bit of ORIG_MODE. */
9754 if (num_sign_bit_copies (op, mode)
9755 > (unsigned) (GET_MODE_PRECISION (mode)
9756 - GET_MODE_PRECISION (orig_mode)))
9757 return mode;
9758 return orig_mode;
9759
9760 case LSHIFTRT:
9761 /* Similarly here but with zero bits. */
9762 if (HWI_COMPUTABLE_MODE_P (mode)
9763 && (nonzero_bits (op, mode) & ~GET_MODE_MASK (orig_mode)) == 0)
9764 return mode;
9765
9766 /* We can also widen if the bits brought in will be masked off. This
9767 operation is performed in ORIG_MODE. */
9768 if (outer_code == AND)
9769 {
9770 int care_bits = low_bitmask_len (orig_mode, outer_const);
9771
9772 if (care_bits >= 0
9773 && GET_MODE_PRECISION (orig_mode) - care_bits >= count)
9774 return mode;
9775 }
9776 /* fall through */
9777
9778 case ROTATE:
9779 return orig_mode;
9780
9781 case ROTATERT:
9782 gcc_unreachable ();
9783
9784 default:
9785 return mode;
9786 }
9787 }
9788
9789 /* Simplify a shift of VAROP by ORIG_COUNT bits. CODE says what kind
9790 of shift. The result of the shift is RESULT_MODE. Return NULL_RTX
9791 if we cannot simplify it. Otherwise, return a simplified value.
9792
9793 The shift is normally computed in the widest mode we find in VAROP, as
9794 long as it isn't a different number of words than RESULT_MODE. Exceptions
9795 are ASHIFTRT and ROTATE, which are always done in their original mode. */
9796
9797 static rtx
9798 simplify_shift_const_1 (enum rtx_code code, enum machine_mode result_mode,
9799 rtx varop, int orig_count)
9800 {
9801 enum rtx_code orig_code = code;
9802 rtx orig_varop = varop;
9803 int count;
9804 enum machine_mode mode = result_mode;
9805 enum machine_mode shift_mode, tmode;
9806 unsigned int mode_words
9807 = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
9808 /* We form (outer_op (code varop count) (outer_const)). */
9809 enum rtx_code outer_op = UNKNOWN;
9810 HOST_WIDE_INT outer_const = 0;
9811 int complement_p = 0;
9812 rtx new_rtx, x;
9813
9814 /* Make sure and truncate the "natural" shift on the way in. We don't
9815 want to do this inside the loop as it makes it more difficult to
9816 combine shifts. */
9817 if (SHIFT_COUNT_TRUNCATED)
9818 orig_count &= GET_MODE_BITSIZE (mode) - 1;
9819
9820 /* If we were given an invalid count, don't do anything except exactly
9821 what was requested. */
9822
9823 if (orig_count < 0 || orig_count >= (int) GET_MODE_PRECISION (mode))
9824 return NULL_RTX;
9825
9826 count = orig_count;
9827
9828 /* Unless one of the branches of the `if' in this loop does a `continue',
9829 we will `break' the loop after the `if'. */
9830
9831 while (count != 0)
9832 {
9833 /* If we have an operand of (clobber (const_int 0)), fail. */
9834 if (GET_CODE (varop) == CLOBBER)
9835 return NULL_RTX;
9836
9837 /* Convert ROTATERT to ROTATE. */
9838 if (code == ROTATERT)
9839 {
9840 unsigned int bitsize = GET_MODE_PRECISION (result_mode);
9841 code = ROTATE;
9842 if (VECTOR_MODE_P (result_mode))
9843 count = bitsize / GET_MODE_NUNITS (result_mode) - count;
9844 else
9845 count = bitsize - count;
9846 }
9847
9848 shift_mode = try_widen_shift_mode (code, varop, count, result_mode,
9849 mode, outer_op, outer_const);
9850
9851 /* Handle cases where the count is greater than the size of the mode
9852 minus 1. For ASHIFT, use the size minus one as the count (this can
9853 occur when simplifying (lshiftrt (ashiftrt ..))). For rotates,
9854 take the count modulo the size. For other shifts, the result is
9855 zero.
9856
9857 Since these shifts are being produced by the compiler by combining
9858 multiple operations, each of which are defined, we know what the
9859 result is supposed to be. */
9860
9861 if (count > (GET_MODE_PRECISION (shift_mode) - 1))
9862 {
9863 if (code == ASHIFTRT)
9864 count = GET_MODE_PRECISION (shift_mode) - 1;
9865 else if (code == ROTATE || code == ROTATERT)
9866 count %= GET_MODE_PRECISION (shift_mode);
9867 else
9868 {
9869 /* We can't simply return zero because there may be an
9870 outer op. */
9871 varop = const0_rtx;
9872 count = 0;
9873 break;
9874 }
9875 }
9876
9877 /* If we discovered we had to complement VAROP, leave. Making a NOT
9878 here would cause an infinite loop. */
9879 if (complement_p)
9880 break;
9881
9882 /* An arithmetic right shift of a quantity known to be -1 or 0
9883 is a no-op. */
9884 if (code == ASHIFTRT
9885 && (num_sign_bit_copies (varop, shift_mode)
9886 == GET_MODE_PRECISION (shift_mode)))
9887 {
9888 count = 0;
9889 break;
9890 }
9891
9892 /* If we are doing an arithmetic right shift and discarding all but
9893 the sign bit copies, this is equivalent to doing a shift by the
9894 bitsize minus one. Convert it into that shift because it will often
9895 allow other simplifications. */
9896
9897 if (code == ASHIFTRT
9898 && (count + num_sign_bit_copies (varop, shift_mode)
9899 >= GET_MODE_PRECISION (shift_mode)))
9900 count = GET_MODE_PRECISION (shift_mode) - 1;
9901
9902 /* We simplify the tests below and elsewhere by converting
9903 ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
9904 `make_compound_operation' will convert it to an ASHIFTRT for
9905 those machines (such as VAX) that don't have an LSHIFTRT. */
9906 if (code == ASHIFTRT
9907 && val_signbit_known_clear_p (shift_mode,
9908 nonzero_bits (varop, shift_mode)))
9909 code = LSHIFTRT;
9910
9911 if (((code == LSHIFTRT
9912 && HWI_COMPUTABLE_MODE_P (shift_mode)
9913 && !(nonzero_bits (varop, shift_mode) >> count))
9914 || (code == ASHIFT
9915 && HWI_COMPUTABLE_MODE_P (shift_mode)
9916 && !((nonzero_bits (varop, shift_mode) << count)
9917 & GET_MODE_MASK (shift_mode))))
9918 && !side_effects_p (varop))
9919 varop = const0_rtx;
9920
9921 switch (GET_CODE (varop))
9922 {
9923 case SIGN_EXTEND:
9924 case ZERO_EXTEND:
9925 case SIGN_EXTRACT:
9926 case ZERO_EXTRACT:
9927 new_rtx = expand_compound_operation (varop);
9928 if (new_rtx != varop)
9929 {
9930 varop = new_rtx;
9931 continue;
9932 }
9933 break;
9934
9935 case MEM:
9936 /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
9937 minus the width of a smaller mode, we can do this with a
9938 SIGN_EXTEND or ZERO_EXTEND from the narrower memory location. */
9939 if ((code == ASHIFTRT || code == LSHIFTRT)
9940 && ! mode_dependent_address_p (XEXP (varop, 0),
9941 MEM_ADDR_SPACE (varop))
9942 && ! MEM_VOLATILE_P (varop)
9943 && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
9944 MODE_INT, 1)) != BLKmode)
9945 {
9946 new_rtx = adjust_address_nv (varop, tmode,
9947 BYTES_BIG_ENDIAN ? 0
9948 : count / BITS_PER_UNIT);
9949
9950 varop = gen_rtx_fmt_e (code == ASHIFTRT ? SIGN_EXTEND
9951 : ZERO_EXTEND, mode, new_rtx);
9952 count = 0;
9953 continue;
9954 }
9955 break;
9956
9957 case SUBREG:
9958 /* If VAROP is a SUBREG, strip it as long as the inner operand has
9959 the same number of words as what we've seen so far. Then store
9960 the widest mode in MODE. */
9961 if (subreg_lowpart_p (varop)
9962 && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9963 > GET_MODE_SIZE (GET_MODE (varop)))
9964 && (unsigned int) ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
9965 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
9966 == mode_words
9967 && GET_MODE_CLASS (GET_MODE (varop)) == MODE_INT
9968 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (varop))) == MODE_INT)
9969 {
9970 varop = SUBREG_REG (varop);
9971 if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
9972 mode = GET_MODE (varop);
9973 continue;
9974 }
9975 break;
9976
9977 case MULT:
9978 /* Some machines use MULT instead of ASHIFT because MULT
9979 is cheaper. But it is still better on those machines to
9980 merge two shifts into one. */
9981 if (CONST_INT_P (XEXP (varop, 1))
9982 && exact_log2 (UINTVAL (XEXP (varop, 1))) >= 0)
9983 {
9984 varop
9985 = simplify_gen_binary (ASHIFT, GET_MODE (varop),
9986 XEXP (varop, 0),
9987 GEN_INT (exact_log2 (
9988 UINTVAL (XEXP (varop, 1)))));
9989 continue;
9990 }
9991 break;
9992
9993 case UDIV:
9994 /* Similar, for when divides are cheaper. */
9995 if (CONST_INT_P (XEXP (varop, 1))
9996 && exact_log2 (UINTVAL (XEXP (varop, 1))) >= 0)
9997 {
9998 varop
9999 = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
10000 XEXP (varop, 0),
10001 GEN_INT (exact_log2 (
10002 UINTVAL (XEXP (varop, 1)))));
10003 continue;
10004 }
10005 break;
10006
10007 case ASHIFTRT:
10008 /* If we are extracting just the sign bit of an arithmetic
10009 right shift, that shift is not needed. However, the sign
10010 bit of a wider mode may be different from what would be
10011 interpreted as the sign bit in a narrower mode, so, if
10012 the result is narrower, don't discard the shift. */
10013 if (code == LSHIFTRT
10014 && count == (GET_MODE_BITSIZE (result_mode) - 1)
10015 && (GET_MODE_BITSIZE (result_mode)
10016 >= GET_MODE_BITSIZE (GET_MODE (varop))))
10017 {
10018 varop = XEXP (varop, 0);
10019 continue;
10020 }
10021
10022 /* ... fall through ... */
10023
10024 case LSHIFTRT:
10025 case ASHIFT:
10026 case ROTATE:
10027 /* Here we have two nested shifts. The result is usually the
10028 AND of a new shift with a mask. We compute the result below. */
10029 if (CONST_INT_P (XEXP (varop, 1))
10030 && INTVAL (XEXP (varop, 1)) >= 0
10031 && INTVAL (XEXP (varop, 1)) < GET_MODE_PRECISION (GET_MODE (varop))
10032 && HWI_COMPUTABLE_MODE_P (result_mode)
10033 && HWI_COMPUTABLE_MODE_P (mode)
10034 && !VECTOR_MODE_P (result_mode))
10035 {
10036 enum rtx_code first_code = GET_CODE (varop);
10037 unsigned int first_count = INTVAL (XEXP (varop, 1));
10038 unsigned HOST_WIDE_INT mask;
10039 rtx mask_rtx;
10040
10041 /* We have one common special case. We can't do any merging if
10042 the inner code is an ASHIFTRT of a smaller mode. However, if
10043 we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
10044 with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
10045 we can convert it to
10046 (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0) C3) C2) C1).
10047 This simplifies certain SIGN_EXTEND operations. */
10048 if (code == ASHIFT && first_code == ASHIFTRT
10049 && count == (GET_MODE_PRECISION (result_mode)
10050 - GET_MODE_PRECISION (GET_MODE (varop))))
10051 {
10052 /* C3 has the low-order C1 bits zero. */
10053
10054 mask = GET_MODE_MASK (mode)
10055 & ~(((unsigned HOST_WIDE_INT) 1 << first_count) - 1);
10056
10057 varop = simplify_and_const_int (NULL_RTX, result_mode,
10058 XEXP (varop, 0), mask);
10059 varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
10060 varop, count);
10061 count = first_count;
10062 code = ASHIFTRT;
10063 continue;
10064 }
10065
10066 /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
10067 than C1 high-order bits equal to the sign bit, we can convert
10068 this to either an ASHIFT or an ASHIFTRT depending on the
10069 two counts.
10070
10071 We cannot do this if VAROP's mode is not SHIFT_MODE. */
10072
10073 if (code == ASHIFTRT && first_code == ASHIFT
10074 && GET_MODE (varop) == shift_mode
10075 && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
10076 > first_count))
10077 {
10078 varop = XEXP (varop, 0);
10079 count -= first_count;
10080 if (count < 0)
10081 {
10082 count = -count;
10083 code = ASHIFT;
10084 }
10085
10086 continue;
10087 }
10088
10089 /* There are some cases we can't do. If CODE is ASHIFTRT,
10090 we can only do this if FIRST_CODE is also ASHIFTRT.
10091
10092 We can't do the case when CODE is ROTATE and FIRST_CODE is
10093 ASHIFTRT.
10094
10095 If the mode of this shift is not the mode of the outer shift,
10096 we can't do this if either shift is a right shift or ROTATE.
10097
10098 Finally, we can't do any of these if the mode is too wide
10099 unless the codes are the same.
10100
10101 Handle the case where the shift codes are the same
10102 first. */
10103
10104 if (code == first_code)
10105 {
10106 if (GET_MODE (varop) != result_mode
10107 && (code == ASHIFTRT || code == LSHIFTRT
10108 || code == ROTATE))
10109 break;
10110
10111 count += first_count;
10112 varop = XEXP (varop, 0);
10113 continue;
10114 }
10115
10116 if (code == ASHIFTRT
10117 || (code == ROTATE && first_code == ASHIFTRT)
10118 || GET_MODE_PRECISION (mode) > HOST_BITS_PER_WIDE_INT
10119 || (GET_MODE (varop) != result_mode
10120 && (first_code == ASHIFTRT || first_code == LSHIFTRT
10121 || first_code == ROTATE
10122 || code == ROTATE)))
10123 break;
10124
10125 /* To compute the mask to apply after the shift, shift the
10126 nonzero bits of the inner shift the same way the
10127 outer shift will. */
10128
10129 mask_rtx = gen_int_mode (nonzero_bits (varop, GET_MODE (varop)),
10130 result_mode);
10131
10132 mask_rtx
10133 = simplify_const_binary_operation (code, result_mode, mask_rtx,
10134 GEN_INT (count));
10135
10136 /* Give up if we can't compute an outer operation to use. */
10137 if (mask_rtx == 0
10138 || !CONST_INT_P (mask_rtx)
10139 || ! merge_outer_ops (&outer_op, &outer_const, AND,
10140 INTVAL (mask_rtx),
10141 result_mode, &complement_p))
10142 break;
10143
10144 /* If the shifts are in the same direction, we add the
10145 counts. Otherwise, we subtract them. */
10146 if ((code == ASHIFTRT || code == LSHIFTRT)
10147 == (first_code == ASHIFTRT || first_code == LSHIFTRT))
10148 count += first_count;
10149 else
10150 count -= first_count;
10151
10152 /* If COUNT is positive, the new shift is usually CODE,
10153 except for the two exceptions below, in which case it is
10154 FIRST_CODE. If the count is negative, FIRST_CODE should
10155 always be used */
10156 if (count > 0
10157 && ((first_code == ROTATE && code == ASHIFT)
10158 || (first_code == ASHIFTRT && code == LSHIFTRT)))
10159 code = first_code;
10160 else if (count < 0)
10161 code = first_code, count = -count;
10162
10163 varop = XEXP (varop, 0);
10164 continue;
10165 }
10166
10167 /* If we have (A << B << C) for any shift, we can convert this to
10168 (A << C << B). This wins if A is a constant. Only try this if
10169 B is not a constant. */
10170
10171 else if (GET_CODE (varop) == code
10172 && CONST_INT_P (XEXP (varop, 0))
10173 && !CONST_INT_P (XEXP (varop, 1)))
10174 {
10175 rtx new_rtx = simplify_const_binary_operation (code, mode,
10176 XEXP (varop, 0),
10177 GEN_INT (count));
10178 varop = gen_rtx_fmt_ee (code, mode, new_rtx, XEXP (varop, 1));
10179 count = 0;
10180 continue;
10181 }
10182 break;
10183
10184 case NOT:
10185 if (VECTOR_MODE_P (mode))
10186 break;
10187
10188 /* Make this fit the case below. */
10189 varop = gen_rtx_XOR (mode, XEXP (varop, 0), constm1_rtx);
10190 continue;
10191
10192 case IOR:
10193 case AND:
10194 case XOR:
10195 /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
10196 with C the size of VAROP - 1 and the shift is logical if
10197 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
10198 we have an (le X 0) operation. If we have an arithmetic shift
10199 and STORE_FLAG_VALUE is 1 or we have a logical shift with
10200 STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation. */
10201
10202 if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
10203 && XEXP (XEXP (varop, 0), 1) == constm1_rtx
10204 && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
10205 && (code == LSHIFTRT || code == ASHIFTRT)
10206 && count == (GET_MODE_PRECISION (GET_MODE (varop)) - 1)
10207 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
10208 {
10209 count = 0;
10210 varop = gen_rtx_LE (GET_MODE (varop), XEXP (varop, 1),
10211 const0_rtx);
10212
10213 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
10214 varop = gen_rtx_NEG (GET_MODE (varop), varop);
10215
10216 continue;
10217 }
10218
10219 /* If we have (shift (logical)), move the logical to the outside
10220 to allow it to possibly combine with another logical and the
10221 shift to combine with another shift. This also canonicalizes to
10222 what a ZERO_EXTRACT looks like. Also, some machines have
10223 (and (shift)) insns. */
10224
10225 if (CONST_INT_P (XEXP (varop, 1))
10226 /* We can't do this if we have (ashiftrt (xor)) and the
10227 constant has its sign bit set in shift_mode. */
10228 && !(code == ASHIFTRT && GET_CODE (varop) == XOR
10229 && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
10230 shift_mode))
10231 && (new_rtx = simplify_const_binary_operation
10232 (code, result_mode,
10233 gen_int_mode (INTVAL (XEXP (varop, 1)), result_mode),
10234 GEN_INT (count))) != 0
10235 && CONST_INT_P (new_rtx)
10236 && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
10237 INTVAL (new_rtx), result_mode, &complement_p))
10238 {
10239 varop = XEXP (varop, 0);
10240 continue;
10241 }
10242
10243 /* If we can't do that, try to simplify the shift in each arm of the
10244 logical expression, make a new logical expression, and apply
10245 the inverse distributive law. This also can't be done
10246 for some (ashiftrt (xor)). */
10247 if (CONST_INT_P (XEXP (varop, 1))
10248 && !(code == ASHIFTRT && GET_CODE (varop) == XOR
10249 && 0 > trunc_int_for_mode (INTVAL (XEXP (varop, 1)),
10250 shift_mode)))
10251 {
10252 rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
10253 XEXP (varop, 0), count);
10254 rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
10255 XEXP (varop, 1), count);
10256
10257 varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
10258 lhs, rhs);
10259 varop = apply_distributive_law (varop);
10260
10261 count = 0;
10262 continue;
10263 }
10264 break;
10265
10266 case EQ:
10267 /* Convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
10268 says that the sign bit can be tested, FOO has mode MODE, C is
10269 GET_MODE_PRECISION (MODE) - 1, and FOO has only its low-order bit
10270 that may be nonzero. */
10271 if (code == LSHIFTRT
10272 && XEXP (varop, 1) == const0_rtx
10273 && GET_MODE (XEXP (varop, 0)) == result_mode
10274 && count == (GET_MODE_PRECISION (result_mode) - 1)
10275 && HWI_COMPUTABLE_MODE_P (result_mode)
10276 && STORE_FLAG_VALUE == -1
10277 && nonzero_bits (XEXP (varop, 0), result_mode) == 1
10278 && merge_outer_ops (&outer_op, &outer_const, XOR, 1, result_mode,
10279 &complement_p))
10280 {
10281 varop = XEXP (varop, 0);
10282 count = 0;
10283 continue;
10284 }
10285 break;
10286
10287 case NEG:
10288 /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
10289 than the number of bits in the mode is equivalent to A. */
10290 if (code == LSHIFTRT
10291 && count == (GET_MODE_PRECISION (result_mode) - 1)
10292 && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
10293 {
10294 varop = XEXP (varop, 0);
10295 count = 0;
10296 continue;
10297 }
10298
10299 /* NEG commutes with ASHIFT since it is multiplication. Move the
10300 NEG outside to allow shifts to combine. */
10301 if (code == ASHIFT
10302 && merge_outer_ops (&outer_op, &outer_const, NEG, 0, result_mode,
10303 &complement_p))
10304 {
10305 varop = XEXP (varop, 0);
10306 continue;
10307 }
10308 break;
10309
10310 case PLUS:
10311 /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
10312 is one less than the number of bits in the mode is
10313 equivalent to (xor A 1). */
10314 if (code == LSHIFTRT
10315 && count == (GET_MODE_PRECISION (result_mode) - 1)
10316 && XEXP (varop, 1) == constm1_rtx
10317 && nonzero_bits (XEXP (varop, 0), result_mode) == 1
10318 && merge_outer_ops (&outer_op, &outer_const, XOR, 1, result_mode,
10319 &complement_p))
10320 {
10321 count = 0;
10322 varop = XEXP (varop, 0);
10323 continue;
10324 }
10325
10326 /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
10327 that might be nonzero in BAR are those being shifted out and those
10328 bits are known zero in FOO, we can replace the PLUS with FOO.
10329 Similarly in the other operand order. This code occurs when
10330 we are computing the size of a variable-size array. */
10331
10332 if ((code == ASHIFTRT || code == LSHIFTRT)
10333 && count < HOST_BITS_PER_WIDE_INT
10334 && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
10335 && (nonzero_bits (XEXP (varop, 1), result_mode)
10336 & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
10337 {
10338 varop = XEXP (varop, 0);
10339 continue;
10340 }
10341 else if ((code == ASHIFTRT || code == LSHIFTRT)
10342 && count < HOST_BITS_PER_WIDE_INT
10343 && HWI_COMPUTABLE_MODE_P (result_mode)
10344 && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
10345 >> count)
10346 && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
10347 & nonzero_bits (XEXP (varop, 1),
10348 result_mode)))
10349 {
10350 varop = XEXP (varop, 1);
10351 continue;
10352 }
10353
10354 /* (ashift (plus foo C) N) is (plus (ashift foo N) C'). */
10355 if (code == ASHIFT
10356 && CONST_INT_P (XEXP (varop, 1))
10357 && (new_rtx = simplify_const_binary_operation (ASHIFT, result_mode,
10358 XEXP (varop, 1),
10359 GEN_INT (count))) != 0
10360 && CONST_INT_P (new_rtx)
10361 && merge_outer_ops (&outer_op, &outer_const, PLUS,
10362 INTVAL (new_rtx), result_mode, &complement_p))
10363 {
10364 varop = XEXP (varop, 0);
10365 continue;
10366 }
10367
10368 /* Check for 'PLUS signbit', which is the canonical form of 'XOR
10369 signbit', and attempt to change the PLUS to an XOR and move it to
10370 the outer operation as is done above in the AND/IOR/XOR case
10371 leg for shift(logical). See details in logical handling above
10372 for reasoning in doing so. */
10373 if (code == LSHIFTRT
10374 && CONST_INT_P (XEXP (varop, 1))
10375 && mode_signbit_p (result_mode, XEXP (varop, 1))
10376 && (new_rtx = simplify_const_binary_operation (code, result_mode,
10377 XEXP (varop, 1),
10378 GEN_INT (count))) != 0
10379 && CONST_INT_P (new_rtx)
10380 && merge_outer_ops (&outer_op, &outer_const, XOR,
10381 INTVAL (new_rtx), result_mode, &complement_p))
10382 {
10383 varop = XEXP (varop, 0);
10384 continue;
10385 }
10386
10387 break;
10388
10389 case MINUS:
10390 /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
10391 with C the size of VAROP - 1 and the shift is logical if
10392 STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
10393 we have a (gt X 0) operation. If the shift is arithmetic with
10394 STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
10395 we have a (neg (gt X 0)) operation. */
10396
10397 if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
10398 && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
10399 && count == (GET_MODE_PRECISION (GET_MODE (varop)) - 1)
10400 && (code == LSHIFTRT || code == ASHIFTRT)
10401 && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
10402 && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
10403 && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
10404 {
10405 count = 0;
10406 varop = gen_rtx_GT (GET_MODE (varop), XEXP (varop, 1),
10407 const0_rtx);
10408
10409 if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
10410 varop = gen_rtx_NEG (GET_MODE (varop), varop);
10411
10412 continue;
10413 }
10414 break;
10415
10416 case TRUNCATE:
10417 /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
10418 if the truncate does not affect the value. */
10419 if (code == LSHIFTRT
10420 && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
10421 && CONST_INT_P (XEXP (XEXP (varop, 0), 1))
10422 && (INTVAL (XEXP (XEXP (varop, 0), 1))
10423 >= (GET_MODE_PRECISION (GET_MODE (XEXP (varop, 0)))
10424 - GET_MODE_PRECISION (GET_MODE (varop)))))
10425 {
10426 rtx varop_inner = XEXP (varop, 0);
10427
10428 varop_inner
10429 = gen_rtx_LSHIFTRT (GET_MODE (varop_inner),
10430 XEXP (varop_inner, 0),
10431 GEN_INT
10432 (count + INTVAL (XEXP (varop_inner, 1))));
10433 varop = gen_rtx_TRUNCATE (GET_MODE (varop), varop_inner);
10434 count = 0;
10435 continue;
10436 }
10437 break;
10438
10439 default:
10440 break;
10441 }
10442
10443 break;
10444 }
10445
10446 shift_mode = try_widen_shift_mode (code, varop, count, result_mode, mode,
10447 outer_op, outer_const);
10448
10449 /* We have now finished analyzing the shift. The result should be
10450 a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places. If
10451 OUTER_OP is non-UNKNOWN, it is an operation that needs to be applied
10452 to the result of the shift. OUTER_CONST is the relevant constant,
10453 but we must turn off all bits turned off in the shift. */
10454
10455 if (outer_op == UNKNOWN
10456 && orig_code == code && orig_count == count
10457 && varop == orig_varop
10458 && shift_mode == GET_MODE (varop))
10459 return NULL_RTX;
10460
10461 /* Make a SUBREG if necessary. If we can't make it, fail. */
10462 varop = gen_lowpart (shift_mode, varop);
10463 if (varop == NULL_RTX || GET_CODE (varop) == CLOBBER)
10464 return NULL_RTX;
10465
10466 /* If we have an outer operation and we just made a shift, it is
10467 possible that we could have simplified the shift were it not
10468 for the outer operation. So try to do the simplification
10469 recursively. */
10470
10471 if (outer_op != UNKNOWN)
10472 x = simplify_shift_const_1 (code, shift_mode, varop, count);
10473 else
10474 x = NULL_RTX;
10475
10476 if (x == NULL_RTX)
10477 x = simplify_gen_binary (code, shift_mode, varop, GEN_INT (count));
10478
10479 /* If we were doing an LSHIFTRT in a wider mode than it was originally,
10480 turn off all the bits that the shift would have turned off. */
10481 if (orig_code == LSHIFTRT && result_mode != shift_mode)
10482 x = simplify_and_const_int (NULL_RTX, shift_mode, x,
10483 GET_MODE_MASK (result_mode) >> orig_count);
10484
10485 /* Do the remainder of the processing in RESULT_MODE. */
10486 x = gen_lowpart_or_truncate (result_mode, x);
10487
10488 /* If COMPLEMENT_P is set, we have to complement X before doing the outer
10489 operation. */
10490 if (complement_p)
10491 x = simplify_gen_unary (NOT, result_mode, x, result_mode);
10492
10493 if (outer_op != UNKNOWN)
10494 {
10495 if (GET_RTX_CLASS (outer_op) != RTX_UNARY
10496 && GET_MODE_PRECISION (result_mode) < HOST_BITS_PER_WIDE_INT)
10497 outer_const = trunc_int_for_mode (outer_const, result_mode);
10498
10499 if (outer_op == AND)
10500 x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
10501 else if (outer_op == SET)
10502 {
10503 /* This means that we have determined that the result is
10504 equivalent to a constant. This should be rare. */
10505 if (!side_effects_p (x))
10506 x = GEN_INT (outer_const);
10507 }
10508 else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
10509 x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
10510 else
10511 x = simplify_gen_binary (outer_op, result_mode, x,
10512 GEN_INT (outer_const));
10513 }
10514
10515 return x;
10516 }
10517
10518 /* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift.
10519 The result of the shift is RESULT_MODE. If we cannot simplify it,
10520 return X or, if it is NULL, synthesize the expression with
10521 simplify_gen_binary. Otherwise, return a simplified value.
10522
10523 The shift is normally computed in the widest mode we find in VAROP, as
10524 long as it isn't a different number of words than RESULT_MODE. Exceptions
10525 are ASHIFTRT and ROTATE, which are always done in their original mode. */
10526
10527 static rtx
10528 simplify_shift_const (rtx x, enum rtx_code code, enum machine_mode result_mode,
10529 rtx varop, int count)
10530 {
10531 rtx tem = simplify_shift_const_1 (code, result_mode, varop, count);
10532 if (tem)
10533 return tem;
10534
10535 if (!x)
10536 x = simplify_gen_binary (code, GET_MODE (varop), varop, GEN_INT (count));
10537 if (GET_MODE (x) != result_mode)
10538 x = gen_lowpart (result_mode, x);
10539 return x;
10540 }
10541
10542 \f
10543 /* Like recog, but we receive the address of a pointer to a new pattern.
10544 We try to match the rtx that the pointer points to.
10545 If that fails, we may try to modify or replace the pattern,
10546 storing the replacement into the same pointer object.
10547
10548 Modifications include deletion or addition of CLOBBERs.
10549
10550 PNOTES is a pointer to a location where any REG_UNUSED notes added for
10551 the CLOBBERs are placed.
10552
10553 The value is the final insn code from the pattern ultimately matched,
10554 or -1. */
10555
10556 static int
10557 recog_for_combine (rtx *pnewpat, rtx insn, rtx *pnotes)
10558 {
10559 rtx pat = *pnewpat;
10560 rtx pat_without_clobbers;
10561 int insn_code_number;
10562 int num_clobbers_to_add = 0;
10563 int i;
10564 rtx notes = NULL_RTX;
10565 rtx old_notes, old_pat;
10566 int old_icode;
10567
10568 /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
10569 we use to indicate that something didn't match. If we find such a
10570 thing, force rejection. */
10571 if (GET_CODE (pat) == PARALLEL)
10572 for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
10573 if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
10574 && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
10575 return -1;
10576
10577 old_pat = PATTERN (insn);
10578 old_notes = REG_NOTES (insn);
10579 PATTERN (insn) = pat;
10580 REG_NOTES (insn) = NULL_RTX;
10581
10582 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
10583 if (dump_file && (dump_flags & TDF_DETAILS))
10584 {
10585 if (insn_code_number < 0)
10586 fputs ("Failed to match this instruction:\n", dump_file);
10587 else
10588 fputs ("Successfully matched this instruction:\n", dump_file);
10589 print_rtl_single (dump_file, pat);
10590 }
10591
10592 /* If it isn't, there is the possibility that we previously had an insn
10593 that clobbered some register as a side effect, but the combined
10594 insn doesn't need to do that. So try once more without the clobbers
10595 unless this represents an ASM insn. */
10596
10597 if (insn_code_number < 0 && ! check_asm_operands (pat)
10598 && GET_CODE (pat) == PARALLEL)
10599 {
10600 int pos;
10601
10602 for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
10603 if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
10604 {
10605 if (i != pos)
10606 SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
10607 pos++;
10608 }
10609
10610 SUBST_INT (XVECLEN (pat, 0), pos);
10611
10612 if (pos == 1)
10613 pat = XVECEXP (pat, 0, 0);
10614
10615 PATTERN (insn) = pat;
10616 insn_code_number = recog (pat, insn, &num_clobbers_to_add);
10617 if (dump_file && (dump_flags & TDF_DETAILS))
10618 {
10619 if (insn_code_number < 0)
10620 fputs ("Failed to match this instruction:\n", dump_file);
10621 else
10622 fputs ("Successfully matched this instruction:\n", dump_file);
10623 print_rtl_single (dump_file, pat);
10624 }
10625 }
10626
10627 pat_without_clobbers = pat;
10628
10629 PATTERN (insn) = old_pat;
10630 REG_NOTES (insn) = old_notes;
10631
10632 /* Recognize all noop sets, these will be killed by followup pass. */
10633 if (insn_code_number < 0 && GET_CODE (pat) == SET && set_noop_p (pat))
10634 insn_code_number = NOOP_MOVE_INSN_CODE, num_clobbers_to_add = 0;
10635
10636 /* If we had any clobbers to add, make a new pattern than contains
10637 them. Then check to make sure that all of them are dead. */
10638 if (num_clobbers_to_add)
10639 {
10640 rtx newpat = gen_rtx_PARALLEL (VOIDmode,
10641 rtvec_alloc (GET_CODE (pat) == PARALLEL
10642 ? (XVECLEN (pat, 0)
10643 + num_clobbers_to_add)
10644 : num_clobbers_to_add + 1));
10645
10646 if (GET_CODE (pat) == PARALLEL)
10647 for (i = 0; i < XVECLEN (pat, 0); i++)
10648 XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
10649 else
10650 XVECEXP (newpat, 0, 0) = pat;
10651
10652 add_clobbers (newpat, insn_code_number);
10653
10654 for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
10655 i < XVECLEN (newpat, 0); i++)
10656 {
10657 if (REG_P (XEXP (XVECEXP (newpat, 0, i), 0))
10658 && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
10659 return -1;
10660 if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) != SCRATCH)
10661 {
10662 gcc_assert (REG_P (XEXP (XVECEXP (newpat, 0, i), 0)));
10663 notes = alloc_reg_note (REG_UNUSED,
10664 XEXP (XVECEXP (newpat, 0, i), 0), notes);
10665 }
10666 }
10667 pat = newpat;
10668 }
10669
10670 if (insn_code_number >= 0
10671 && insn_code_number != NOOP_MOVE_INSN_CODE)
10672 {
10673 old_pat = PATTERN (insn);
10674 old_notes = REG_NOTES (insn);
10675 old_icode = INSN_CODE (insn);
10676 PATTERN (insn) = pat;
10677 REG_NOTES (insn) = notes;
10678
10679 /* Allow targets to reject combined insn. */
10680 if (!targetm.legitimate_combined_insn (insn))
10681 {
10682 if (dump_file && (dump_flags & TDF_DETAILS))
10683 fputs ("Instruction not appropriate for target.",
10684 dump_file);
10685
10686 /* Callers expect recog_for_combine to strip
10687 clobbers from the pattern on failure. */
10688 pat = pat_without_clobbers;
10689 notes = NULL_RTX;
10690
10691 insn_code_number = -1;
10692 }
10693
10694 PATTERN (insn) = old_pat;
10695 REG_NOTES (insn) = old_notes;
10696 INSN_CODE (insn) = old_icode;
10697 }
10698
10699 *pnewpat = pat;
10700 *pnotes = notes;
10701
10702 return insn_code_number;
10703 }
10704 \f
10705 /* Like gen_lowpart_general but for use by combine. In combine it
10706 is not possible to create any new pseudoregs. However, it is
10707 safe to create invalid memory addresses, because combine will
10708 try to recognize them and all they will do is make the combine
10709 attempt fail.
10710
10711 If for some reason this cannot do its job, an rtx
10712 (clobber (const_int 0)) is returned.
10713 An insn containing that will not be recognized. */
10714
10715 static rtx
10716 gen_lowpart_for_combine (enum machine_mode omode, rtx x)
10717 {
10718 enum machine_mode imode = GET_MODE (x);
10719 unsigned int osize = GET_MODE_SIZE (omode);
10720 unsigned int isize = GET_MODE_SIZE (imode);
10721 rtx result;
10722
10723 if (omode == imode)
10724 return x;
10725
10726 /* We can only support MODE being wider than a word if X is a
10727 constant integer or has a mode the same size. */
10728 if (GET_MODE_SIZE (omode) > UNITS_PER_WORD
10729 && ! (CONST_SCALAR_INT_P (x) || isize == osize))
10730 goto fail;
10731
10732 /* X might be a paradoxical (subreg (mem)). In that case, gen_lowpart
10733 won't know what to do. So we will strip off the SUBREG here and
10734 process normally. */
10735 if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
10736 {
10737 x = SUBREG_REG (x);
10738
10739 /* For use in case we fall down into the address adjustments
10740 further below, we need to adjust the known mode and size of
10741 x; imode and isize, since we just adjusted x. */
10742 imode = GET_MODE (x);
10743
10744 if (imode == omode)
10745 return x;
10746
10747 isize = GET_MODE_SIZE (imode);
10748 }
10749
10750 result = gen_lowpart_common (omode, x);
10751
10752 if (result)
10753 return result;
10754
10755 if (MEM_P (x))
10756 {
10757 int offset = 0;
10758
10759 /* Refuse to work on a volatile memory ref or one with a mode-dependent
10760 address. */
10761 if (MEM_VOLATILE_P (x)
10762 || mode_dependent_address_p (XEXP (x, 0), MEM_ADDR_SPACE (x)))
10763 goto fail;
10764
10765 /* If we want to refer to something bigger than the original memref,
10766 generate a paradoxical subreg instead. That will force a reload
10767 of the original memref X. */
10768 if (isize < osize)
10769 return gen_rtx_SUBREG (omode, x, 0);
10770
10771 if (WORDS_BIG_ENDIAN)
10772 offset = MAX (isize, UNITS_PER_WORD) - MAX (osize, UNITS_PER_WORD);
10773
10774 /* Adjust the address so that the address-after-the-data is
10775 unchanged. */
10776 if (BYTES_BIG_ENDIAN)
10777 offset -= MIN (UNITS_PER_WORD, osize) - MIN (UNITS_PER_WORD, isize);
10778
10779 return adjust_address_nv (x, omode, offset);
10780 }
10781
10782 /* If X is a comparison operator, rewrite it in a new mode. This
10783 probably won't match, but may allow further simplifications. */
10784 else if (COMPARISON_P (x))
10785 return gen_rtx_fmt_ee (GET_CODE (x), omode, XEXP (x, 0), XEXP (x, 1));
10786
10787 /* If we couldn't simplify X any other way, just enclose it in a
10788 SUBREG. Normally, this SUBREG won't match, but some patterns may
10789 include an explicit SUBREG or we may simplify it further in combine. */
10790 else
10791 {
10792 int offset = 0;
10793 rtx res;
10794
10795 offset = subreg_lowpart_offset (omode, imode);
10796 if (imode == VOIDmode)
10797 {
10798 imode = int_mode_for_mode (omode);
10799 x = gen_lowpart_common (imode, x);
10800 if (x == NULL)
10801 goto fail;
10802 }
10803 res = simplify_gen_subreg (omode, x, imode, offset);
10804 if (res)
10805 return res;
10806 }
10807
10808 fail:
10809 return gen_rtx_CLOBBER (omode, const0_rtx);
10810 }
10811 \f
10812 /* Try to simplify a comparison between OP0 and a constant OP1,
10813 where CODE is the comparison code that will be tested, into a
10814 (CODE OP0 const0_rtx) form.
10815
10816 The result is a possibly different comparison code to use.
10817 *POP1 may be updated. */
10818
10819 static enum rtx_code
10820 simplify_compare_const (enum rtx_code code, rtx op0, rtx *pop1)
10821 {
10822 enum machine_mode mode = GET_MODE (op0);
10823 unsigned int mode_width = GET_MODE_PRECISION (mode);
10824 HOST_WIDE_INT const_op = INTVAL (*pop1);
10825
10826 /* Get the constant we are comparing against and turn off all bits
10827 not on in our mode. */
10828 if (mode != VOIDmode)
10829 const_op = trunc_int_for_mode (const_op, mode);
10830
10831 /* If we are comparing against a constant power of two and the value
10832 being compared can only have that single bit nonzero (e.g., it was
10833 `and'ed with that bit), we can replace this with a comparison
10834 with zero. */
10835 if (const_op
10836 && (code == EQ || code == NE || code == GE || code == GEU
10837 || code == LT || code == LTU)
10838 && mode_width <= HOST_BITS_PER_WIDE_INT
10839 && exact_log2 (const_op & GET_MODE_MASK (mode)) >= 0
10840 && (nonzero_bits (op0, mode)
10841 == (unsigned HOST_WIDE_INT) (const_op & GET_MODE_MASK (mode))))
10842 {
10843 code = (code == EQ || code == GE || code == GEU ? NE : EQ);
10844 const_op = 0;
10845 }
10846
10847 /* Similarly, if we are comparing a value known to be either -1 or
10848 0 with -1, change it to the opposite comparison against zero. */
10849 if (const_op == -1
10850 && (code == EQ || code == NE || code == GT || code == LE
10851 || code == GEU || code == LTU)
10852 && num_sign_bit_copies (op0, mode) == mode_width)
10853 {
10854 code = (code == EQ || code == LE || code == GEU ? NE : EQ);
10855 const_op = 0;
10856 }
10857
10858 /* Do some canonicalizations based on the comparison code. We prefer
10859 comparisons against zero and then prefer equality comparisons.
10860 If we can reduce the size of a constant, we will do that too. */
10861 switch (code)
10862 {
10863 case LT:
10864 /* < C is equivalent to <= (C - 1) */
10865 if (const_op > 0)
10866 {
10867 const_op -= 1;
10868 code = LE;
10869 /* ... fall through to LE case below. */
10870 }
10871 else
10872 break;
10873
10874 case LE:
10875 /* <= C is equivalent to < (C + 1); we do this for C < 0 */
10876 if (const_op < 0)
10877 {
10878 const_op += 1;
10879 code = LT;
10880 }
10881
10882 /* If we are doing a <= 0 comparison on a value known to have
10883 a zero sign bit, we can replace this with == 0. */
10884 else if (const_op == 0
10885 && mode_width <= HOST_BITS_PER_WIDE_INT
10886 && (nonzero_bits (op0, mode)
10887 & ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10888 == 0)
10889 code = EQ;
10890 break;
10891
10892 case GE:
10893 /* >= C is equivalent to > (C - 1). */
10894 if (const_op > 0)
10895 {
10896 const_op -= 1;
10897 code = GT;
10898 /* ... fall through to GT below. */
10899 }
10900 else
10901 break;
10902
10903 case GT:
10904 /* > C is equivalent to >= (C + 1); we do this for C < 0. */
10905 if (const_op < 0)
10906 {
10907 const_op += 1;
10908 code = GE;
10909 }
10910
10911 /* If we are doing a > 0 comparison on a value known to have
10912 a zero sign bit, we can replace this with != 0. */
10913 else if (const_op == 0
10914 && mode_width <= HOST_BITS_PER_WIDE_INT
10915 && (nonzero_bits (op0, mode)
10916 & ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10917 == 0)
10918 code = NE;
10919 break;
10920
10921 case LTU:
10922 /* < C is equivalent to <= (C - 1). */
10923 if (const_op > 0)
10924 {
10925 const_op -= 1;
10926 code = LEU;
10927 /* ... fall through ... */
10928 }
10929 /* (unsigned) < 0x80000000 is equivalent to >= 0. */
10930 else if (mode_width <= HOST_BITS_PER_WIDE_INT
10931 && (unsigned HOST_WIDE_INT) const_op
10932 == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1))
10933 {
10934 const_op = 0;
10935 code = GE;
10936 break;
10937 }
10938 else
10939 break;
10940
10941 case LEU:
10942 /* unsigned <= 0 is equivalent to == 0 */
10943 if (const_op == 0)
10944 code = EQ;
10945 /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */
10946 else if (mode_width <= HOST_BITS_PER_WIDE_INT
10947 && (unsigned HOST_WIDE_INT) const_op
10948 == ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)) - 1)
10949 {
10950 const_op = 0;
10951 code = GE;
10952 }
10953 break;
10954
10955 case GEU:
10956 /* >= C is equivalent to > (C - 1). */
10957 if (const_op > 1)
10958 {
10959 const_op -= 1;
10960 code = GTU;
10961 /* ... fall through ... */
10962 }
10963
10964 /* (unsigned) >= 0x80000000 is equivalent to < 0. */
10965 else if (mode_width <= HOST_BITS_PER_WIDE_INT
10966 && (unsigned HOST_WIDE_INT) const_op
10967 == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1))
10968 {
10969 const_op = 0;
10970 code = LT;
10971 break;
10972 }
10973 else
10974 break;
10975
10976 case GTU:
10977 /* unsigned > 0 is equivalent to != 0 */
10978 if (const_op == 0)
10979 code = NE;
10980 /* (unsigned) > 0x7fffffff is equivalent to < 0. */
10981 else if (mode_width <= HOST_BITS_PER_WIDE_INT
10982 && (unsigned HOST_WIDE_INT) const_op
10983 == ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)) - 1)
10984 {
10985 const_op = 0;
10986 code = LT;
10987 }
10988 break;
10989
10990 default:
10991 break;
10992 }
10993
10994 *pop1 = GEN_INT (const_op);
10995 return code;
10996 }
10997 \f
10998 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
10999 comparison code that will be tested.
11000
11001 The result is a possibly different comparison code to use. *POP0 and
11002 *POP1 may be updated.
11003
11004 It is possible that we might detect that a comparison is either always
11005 true or always false. However, we do not perform general constant
11006 folding in combine, so this knowledge isn't useful. Such tautologies
11007 should have been detected earlier. Hence we ignore all such cases. */
11008
11009 static enum rtx_code
11010 simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1)
11011 {
11012 rtx op0 = *pop0;
11013 rtx op1 = *pop1;
11014 rtx tem, tem1;
11015 int i;
11016 enum machine_mode mode, tmode;
11017
11018 /* Try a few ways of applying the same transformation to both operands. */
11019 while (1)
11020 {
11021 #ifndef WORD_REGISTER_OPERATIONS
11022 /* The test below this one won't handle SIGN_EXTENDs on these machines,
11023 so check specially. */
11024 if (code != GTU && code != GEU && code != LTU && code != LEU
11025 && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
11026 && GET_CODE (XEXP (op0, 0)) == ASHIFT
11027 && GET_CODE (XEXP (op1, 0)) == ASHIFT
11028 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
11029 && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
11030 && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
11031 == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
11032 && CONST_INT_P (XEXP (op0, 1))
11033 && XEXP (op0, 1) == XEXP (op1, 1)
11034 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
11035 && XEXP (op0, 1) == XEXP (XEXP (op1, 0), 1)
11036 && (INTVAL (XEXP (op0, 1))
11037 == (GET_MODE_PRECISION (GET_MODE (op0))
11038 - (GET_MODE_PRECISION
11039 (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
11040 {
11041 op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
11042 op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
11043 }
11044 #endif
11045
11046 /* If both operands are the same constant shift, see if we can ignore the
11047 shift. We can if the shift is a rotate or if the bits shifted out of
11048 this shift are known to be zero for both inputs and if the type of
11049 comparison is compatible with the shift. */
11050 if (GET_CODE (op0) == GET_CODE (op1)
11051 && HWI_COMPUTABLE_MODE_P (GET_MODE (op0))
11052 && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
11053 || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
11054 && (code != GT && code != LT && code != GE && code != LE))
11055 || (GET_CODE (op0) == ASHIFTRT
11056 && (code != GTU && code != LTU
11057 && code != GEU && code != LEU)))
11058 && CONST_INT_P (XEXP (op0, 1))
11059 && INTVAL (XEXP (op0, 1)) >= 0
11060 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
11061 && XEXP (op0, 1) == XEXP (op1, 1))
11062 {
11063 enum machine_mode mode = GET_MODE (op0);
11064 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
11065 int shift_count = INTVAL (XEXP (op0, 1));
11066
11067 if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
11068 mask &= (mask >> shift_count) << shift_count;
11069 else if (GET_CODE (op0) == ASHIFT)
11070 mask = (mask & (mask << shift_count)) >> shift_count;
11071
11072 if ((nonzero_bits (XEXP (op0, 0), mode) & ~mask) == 0
11073 && (nonzero_bits (XEXP (op1, 0), mode) & ~mask) == 0)
11074 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
11075 else
11076 break;
11077 }
11078
11079 /* If both operands are AND's of a paradoxical SUBREG by constant, the
11080 SUBREGs are of the same mode, and, in both cases, the AND would
11081 be redundant if the comparison was done in the narrower mode,
11082 do the comparison in the narrower mode (e.g., we are AND'ing with 1
11083 and the operand's possibly nonzero bits are 0xffffff01; in that case
11084 if we only care about QImode, we don't need the AND). This case
11085 occurs if the output mode of an scc insn is not SImode and
11086 STORE_FLAG_VALUE == 1 (e.g., the 386).
11087
11088 Similarly, check for a case where the AND's are ZERO_EXTEND
11089 operations from some narrower mode even though a SUBREG is not
11090 present. */
11091
11092 else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND
11093 && CONST_INT_P (XEXP (op0, 1))
11094 && CONST_INT_P (XEXP (op1, 1)))
11095 {
11096 rtx inner_op0 = XEXP (op0, 0);
11097 rtx inner_op1 = XEXP (op1, 0);
11098 HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
11099 HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
11100 int changed = 0;
11101
11102 if (paradoxical_subreg_p (inner_op0)
11103 && GET_CODE (inner_op1) == SUBREG
11104 && (GET_MODE (SUBREG_REG (inner_op0))
11105 == GET_MODE (SUBREG_REG (inner_op1)))
11106 && (GET_MODE_PRECISION (GET_MODE (SUBREG_REG (inner_op0)))
11107 <= HOST_BITS_PER_WIDE_INT)
11108 && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
11109 GET_MODE (SUBREG_REG (inner_op0)))))
11110 && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
11111 GET_MODE (SUBREG_REG (inner_op1))))))
11112 {
11113 op0 = SUBREG_REG (inner_op0);
11114 op1 = SUBREG_REG (inner_op1);
11115
11116 /* The resulting comparison is always unsigned since we masked
11117 off the original sign bit. */
11118 code = unsigned_condition (code);
11119
11120 changed = 1;
11121 }
11122
11123 else if (c0 == c1)
11124 for (tmode = GET_CLASS_NARROWEST_MODE
11125 (GET_MODE_CLASS (GET_MODE (op0)));
11126 tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
11127 if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
11128 {
11129 op0 = gen_lowpart (tmode, inner_op0);
11130 op1 = gen_lowpart (tmode, inner_op1);
11131 code = unsigned_condition (code);
11132 changed = 1;
11133 break;
11134 }
11135
11136 if (! changed)
11137 break;
11138 }
11139
11140 /* If both operands are NOT, we can strip off the outer operation
11141 and adjust the comparison code for swapped operands; similarly for
11142 NEG, except that this must be an equality comparison. */
11143 else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
11144 || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
11145 && (code == EQ || code == NE)))
11146 op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
11147
11148 else
11149 break;
11150 }
11151
11152 /* If the first operand is a constant, swap the operands and adjust the
11153 comparison code appropriately, but don't do this if the second operand
11154 is already a constant integer. */
11155 if (swap_commutative_operands_p (op0, op1))
11156 {
11157 tem = op0, op0 = op1, op1 = tem;
11158 code = swap_condition (code);
11159 }
11160
11161 /* We now enter a loop during which we will try to simplify the comparison.
11162 For the most part, we only are concerned with comparisons with zero,
11163 but some things may really be comparisons with zero but not start
11164 out looking that way. */
11165
11166 while (CONST_INT_P (op1))
11167 {
11168 enum machine_mode mode = GET_MODE (op0);
11169 unsigned int mode_width = GET_MODE_PRECISION (mode);
11170 unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
11171 int equality_comparison_p;
11172 int sign_bit_comparison_p;
11173 int unsigned_comparison_p;
11174 HOST_WIDE_INT const_op;
11175
11176 /* We only want to handle integral modes. This catches VOIDmode,
11177 CCmode, and the floating-point modes. An exception is that we
11178 can handle VOIDmode if OP0 is a COMPARE or a comparison
11179 operation. */
11180
11181 if (GET_MODE_CLASS (mode) != MODE_INT
11182 && ! (mode == VOIDmode
11183 && (GET_CODE (op0) == COMPARE || COMPARISON_P (op0))))
11184 break;
11185
11186 /* Try to simplify the compare to constant, possibly changing the
11187 comparison op, and/or changing op1 to zero. */
11188 code = simplify_compare_const (code, op0, &op1);
11189 const_op = INTVAL (op1);
11190
11191 /* Compute some predicates to simplify code below. */
11192
11193 equality_comparison_p = (code == EQ || code == NE);
11194 sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
11195 unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
11196 || code == GEU);
11197
11198 /* If this is a sign bit comparison and we can do arithmetic in
11199 MODE, say that we will only be needing the sign bit of OP0. */
11200 if (sign_bit_comparison_p && HWI_COMPUTABLE_MODE_P (mode))
11201 op0 = force_to_mode (op0, mode,
11202 (unsigned HOST_WIDE_INT) 1
11203 << (GET_MODE_PRECISION (mode) - 1),
11204 0);
11205
11206 /* Now try cases based on the opcode of OP0. If none of the cases
11207 does a "continue", we exit this loop immediately after the
11208 switch. */
11209
11210 switch (GET_CODE (op0))
11211 {
11212 case ZERO_EXTRACT:
11213 /* If we are extracting a single bit from a variable position in
11214 a constant that has only a single bit set and are comparing it
11215 with zero, we can convert this into an equality comparison
11216 between the position and the location of the single bit. */
11217 /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
11218 have already reduced the shift count modulo the word size. */
11219 if (!SHIFT_COUNT_TRUNCATED
11220 && CONST_INT_P (XEXP (op0, 0))
11221 && XEXP (op0, 1) == const1_rtx
11222 && equality_comparison_p && const_op == 0
11223 && (i = exact_log2 (UINTVAL (XEXP (op0, 0)))) >= 0)
11224 {
11225 if (BITS_BIG_ENDIAN)
11226 i = BITS_PER_WORD - 1 - i;
11227
11228 op0 = XEXP (op0, 2);
11229 op1 = GEN_INT (i);
11230 const_op = i;
11231
11232 /* Result is nonzero iff shift count is equal to I. */
11233 code = reverse_condition (code);
11234 continue;
11235 }
11236
11237 /* ... fall through ... */
11238
11239 case SIGN_EXTRACT:
11240 tem = expand_compound_operation (op0);
11241 if (tem != op0)
11242 {
11243 op0 = tem;
11244 continue;
11245 }
11246 break;
11247
11248 case NOT:
11249 /* If testing for equality, we can take the NOT of the constant. */
11250 if (equality_comparison_p
11251 && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
11252 {
11253 op0 = XEXP (op0, 0);
11254 op1 = tem;
11255 continue;
11256 }
11257
11258 /* If just looking at the sign bit, reverse the sense of the
11259 comparison. */
11260 if (sign_bit_comparison_p)
11261 {
11262 op0 = XEXP (op0, 0);
11263 code = (code == GE ? LT : GE);
11264 continue;
11265 }
11266 break;
11267
11268 case NEG:
11269 /* If testing for equality, we can take the NEG of the constant. */
11270 if (equality_comparison_p
11271 && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
11272 {
11273 op0 = XEXP (op0, 0);
11274 op1 = tem;
11275 continue;
11276 }
11277
11278 /* The remaining cases only apply to comparisons with zero. */
11279 if (const_op != 0)
11280 break;
11281
11282 /* When X is ABS or is known positive,
11283 (neg X) is < 0 if and only if X != 0. */
11284
11285 if (sign_bit_comparison_p
11286 && (GET_CODE (XEXP (op0, 0)) == ABS
11287 || (mode_width <= HOST_BITS_PER_WIDE_INT
11288 && (nonzero_bits (XEXP (op0, 0), mode)
11289 & ((unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
11290 == 0)))
11291 {
11292 op0 = XEXP (op0, 0);
11293 code = (code == LT ? NE : EQ);
11294 continue;
11295 }
11296
11297 /* If we have NEG of something whose two high-order bits are the
11298 same, we know that "(-a) < 0" is equivalent to "a > 0". */
11299 if (num_sign_bit_copies (op0, mode) >= 2)
11300 {
11301 op0 = XEXP (op0, 0);
11302 code = swap_condition (code);
11303 continue;
11304 }
11305 break;
11306
11307 case ROTATE:
11308 /* If we are testing equality and our count is a constant, we
11309 can perform the inverse operation on our RHS. */
11310 if (equality_comparison_p && CONST_INT_P (XEXP (op0, 1))
11311 && (tem = simplify_binary_operation (ROTATERT, mode,
11312 op1, XEXP (op0, 1))) != 0)
11313 {
11314 op0 = XEXP (op0, 0);
11315 op1 = tem;
11316 continue;
11317 }
11318
11319 /* If we are doing a < 0 or >= 0 comparison, it means we are testing
11320 a particular bit. Convert it to an AND of a constant of that
11321 bit. This will be converted into a ZERO_EXTRACT. */
11322 if (const_op == 0 && sign_bit_comparison_p
11323 && CONST_INT_P (XEXP (op0, 1))
11324 && mode_width <= HOST_BITS_PER_WIDE_INT)
11325 {
11326 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11327 ((unsigned HOST_WIDE_INT) 1
11328 << (mode_width - 1
11329 - INTVAL (XEXP (op0, 1)))));
11330 code = (code == LT ? NE : EQ);
11331 continue;
11332 }
11333
11334 /* Fall through. */
11335
11336 case ABS:
11337 /* ABS is ignorable inside an equality comparison with zero. */
11338 if (const_op == 0 && equality_comparison_p)
11339 {
11340 op0 = XEXP (op0, 0);
11341 continue;
11342 }
11343 break;
11344
11345 case SIGN_EXTEND:
11346 /* Can simplify (compare (zero/sign_extend FOO) CONST) to
11347 (compare FOO CONST) if CONST fits in FOO's mode and we
11348 are either testing inequality or have an unsigned
11349 comparison with ZERO_EXTEND or a signed comparison with
11350 SIGN_EXTEND. But don't do it if we don't have a compare
11351 insn of the given mode, since we'd have to revert it
11352 later on, and then we wouldn't know whether to sign- or
11353 zero-extend. */
11354 mode = GET_MODE (XEXP (op0, 0));
11355 if (GET_MODE_CLASS (mode) == MODE_INT
11356 && ! unsigned_comparison_p
11357 && HWI_COMPUTABLE_MODE_P (mode)
11358 && trunc_int_for_mode (const_op, mode) == const_op
11359 && have_insn_for (COMPARE, mode))
11360 {
11361 op0 = XEXP (op0, 0);
11362 continue;
11363 }
11364 break;
11365
11366 case SUBREG:
11367 /* Check for the case where we are comparing A - C1 with C2, that is
11368
11369 (subreg:MODE (plus (A) (-C1))) op (C2)
11370
11371 with C1 a constant, and try to lift the SUBREG, i.e. to do the
11372 comparison in the wider mode. One of the following two conditions
11373 must be true in order for this to be valid:
11374
11375 1. The mode extension results in the same bit pattern being added
11376 on both sides and the comparison is equality or unsigned. As
11377 C2 has been truncated to fit in MODE, the pattern can only be
11378 all 0s or all 1s.
11379
11380 2. The mode extension results in the sign bit being copied on
11381 each side.
11382
11383 The difficulty here is that we have predicates for A but not for
11384 (A - C1) so we need to check that C1 is within proper bounds so
11385 as to perturbate A as little as possible. */
11386
11387 if (mode_width <= HOST_BITS_PER_WIDE_INT
11388 && subreg_lowpart_p (op0)
11389 && GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op0))) > mode_width
11390 && GET_CODE (SUBREG_REG (op0)) == PLUS
11391 && CONST_INT_P (XEXP (SUBREG_REG (op0), 1)))
11392 {
11393 enum machine_mode inner_mode = GET_MODE (SUBREG_REG (op0));
11394 rtx a = XEXP (SUBREG_REG (op0), 0);
11395 HOST_WIDE_INT c1 = -INTVAL (XEXP (SUBREG_REG (op0), 1));
11396
11397 if ((c1 > 0
11398 && (unsigned HOST_WIDE_INT) c1
11399 < (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)
11400 && (equality_comparison_p || unsigned_comparison_p)
11401 /* (A - C1) zero-extends if it is positive and sign-extends
11402 if it is negative, C2 both zero- and sign-extends. */
11403 && ((0 == (nonzero_bits (a, inner_mode)
11404 & ~GET_MODE_MASK (mode))
11405 && const_op >= 0)
11406 /* (A - C1) sign-extends if it is positive and 1-extends
11407 if it is negative, C2 both sign- and 1-extends. */
11408 || (num_sign_bit_copies (a, inner_mode)
11409 > (unsigned int) (GET_MODE_PRECISION (inner_mode)
11410 - mode_width)
11411 && const_op < 0)))
11412 || ((unsigned HOST_WIDE_INT) c1
11413 < (unsigned HOST_WIDE_INT) 1 << (mode_width - 2)
11414 /* (A - C1) always sign-extends, like C2. */
11415 && num_sign_bit_copies (a, inner_mode)
11416 > (unsigned int) (GET_MODE_PRECISION (inner_mode)
11417 - (mode_width - 1))))
11418 {
11419 op0 = SUBREG_REG (op0);
11420 continue;
11421 }
11422 }
11423
11424 /* If the inner mode is narrower and we are extracting the low part,
11425 we can treat the SUBREG as if it were a ZERO_EXTEND. */
11426 if (subreg_lowpart_p (op0)
11427 && GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op0))) < mode_width)
11428 /* Fall through */ ;
11429 else
11430 break;
11431
11432 /* ... fall through ... */
11433
11434 case ZERO_EXTEND:
11435 mode = GET_MODE (XEXP (op0, 0));
11436 if (GET_MODE_CLASS (mode) == MODE_INT
11437 && (unsigned_comparison_p || equality_comparison_p)
11438 && HWI_COMPUTABLE_MODE_P (mode)
11439 && (unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (mode)
11440 && const_op >= 0
11441 && have_insn_for (COMPARE, mode))
11442 {
11443 op0 = XEXP (op0, 0);
11444 continue;
11445 }
11446 break;
11447
11448 case PLUS:
11449 /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do
11450 this for equality comparisons due to pathological cases involving
11451 overflows. */
11452 if (equality_comparison_p
11453 && 0 != (tem = simplify_binary_operation (MINUS, mode,
11454 op1, XEXP (op0, 1))))
11455 {
11456 op0 = XEXP (op0, 0);
11457 op1 = tem;
11458 continue;
11459 }
11460
11461 /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0. */
11462 if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
11463 && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
11464 {
11465 op0 = XEXP (XEXP (op0, 0), 0);
11466 code = (code == LT ? EQ : NE);
11467 continue;
11468 }
11469 break;
11470
11471 case MINUS:
11472 /* We used to optimize signed comparisons against zero, but that
11473 was incorrect. Unsigned comparisons against zero (GTU, LEU)
11474 arrive here as equality comparisons, or (GEU, LTU) are
11475 optimized away. No need to special-case them. */
11476
11477 /* (eq (minus A B) C) -> (eq A (plus B C)) or
11478 (eq B (minus A C)), whichever simplifies. We can only do
11479 this for equality comparisons due to pathological cases involving
11480 overflows. */
11481 if (equality_comparison_p
11482 && 0 != (tem = simplify_binary_operation (PLUS, mode,
11483 XEXP (op0, 1), op1)))
11484 {
11485 op0 = XEXP (op0, 0);
11486 op1 = tem;
11487 continue;
11488 }
11489
11490 if (equality_comparison_p
11491 && 0 != (tem = simplify_binary_operation (MINUS, mode,
11492 XEXP (op0, 0), op1)))
11493 {
11494 op0 = XEXP (op0, 1);
11495 op1 = tem;
11496 continue;
11497 }
11498
11499 /* The sign bit of (minus (ashiftrt X C) X), where C is the number
11500 of bits in X minus 1, is one iff X > 0. */
11501 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
11502 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11503 && UINTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
11504 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
11505 {
11506 op0 = XEXP (op0, 1);
11507 code = (code == GE ? LE : GT);
11508 continue;
11509 }
11510 break;
11511
11512 case XOR:
11513 /* (eq (xor A B) C) -> (eq A (xor B C)). This is a simplification
11514 if C is zero or B is a constant. */
11515 if (equality_comparison_p
11516 && 0 != (tem = simplify_binary_operation (XOR, mode,
11517 XEXP (op0, 1), op1)))
11518 {
11519 op0 = XEXP (op0, 0);
11520 op1 = tem;
11521 continue;
11522 }
11523 break;
11524
11525 case EQ: case NE:
11526 case UNEQ: case LTGT:
11527 case LT: case LTU: case UNLT: case LE: case LEU: case UNLE:
11528 case GT: case GTU: case UNGT: case GE: case GEU: case UNGE:
11529 case UNORDERED: case ORDERED:
11530 /* We can't do anything if OP0 is a condition code value, rather
11531 than an actual data value. */
11532 if (const_op != 0
11533 || CC0_P (XEXP (op0, 0))
11534 || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
11535 break;
11536
11537 /* Get the two operands being compared. */
11538 if (GET_CODE (XEXP (op0, 0)) == COMPARE)
11539 tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
11540 else
11541 tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
11542
11543 /* Check for the cases where we simply want the result of the
11544 earlier test or the opposite of that result. */
11545 if (code == NE || code == EQ
11546 || (val_signbit_known_set_p (GET_MODE (op0), STORE_FLAG_VALUE)
11547 && (code == LT || code == GE)))
11548 {
11549 enum rtx_code new_code;
11550 if (code == LT || code == NE)
11551 new_code = GET_CODE (op0);
11552 else
11553 new_code = reversed_comparison_code (op0, NULL);
11554
11555 if (new_code != UNKNOWN)
11556 {
11557 code = new_code;
11558 op0 = tem;
11559 op1 = tem1;
11560 continue;
11561 }
11562 }
11563 break;
11564
11565 case IOR:
11566 /* The sign bit of (ior (plus X (const_int -1)) X) is nonzero
11567 iff X <= 0. */
11568 if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
11569 && XEXP (XEXP (op0, 0), 1) == constm1_rtx
11570 && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
11571 {
11572 op0 = XEXP (op0, 1);
11573 code = (code == GE ? GT : LE);
11574 continue;
11575 }
11576 break;
11577
11578 case AND:
11579 /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1). This
11580 will be converted to a ZERO_EXTRACT later. */
11581 if (const_op == 0 && equality_comparison_p
11582 && GET_CODE (XEXP (op0, 0)) == ASHIFT
11583 && XEXP (XEXP (op0, 0), 0) == const1_rtx)
11584 {
11585 op0 = gen_rtx_LSHIFTRT (mode, XEXP (op0, 1),
11586 XEXP (XEXP (op0, 0), 1));
11587 op0 = simplify_and_const_int (NULL_RTX, mode, op0, 1);
11588 continue;
11589 }
11590
11591 /* If we are comparing (and (lshiftrt X C1) C2) for equality with
11592 zero and X is a comparison and C1 and C2 describe only bits set
11593 in STORE_FLAG_VALUE, we can compare with X. */
11594 if (const_op == 0 && equality_comparison_p
11595 && mode_width <= HOST_BITS_PER_WIDE_INT
11596 && CONST_INT_P (XEXP (op0, 1))
11597 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
11598 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11599 && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
11600 && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
11601 {
11602 mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
11603 << INTVAL (XEXP (XEXP (op0, 0), 1)));
11604 if ((~STORE_FLAG_VALUE & mask) == 0
11605 && (COMPARISON_P (XEXP (XEXP (op0, 0), 0))
11606 || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
11607 && COMPARISON_P (tem))))
11608 {
11609 op0 = XEXP (XEXP (op0, 0), 0);
11610 continue;
11611 }
11612 }
11613
11614 /* If we are doing an equality comparison of an AND of a bit equal
11615 to the sign bit, replace this with a LT or GE comparison of
11616 the underlying value. */
11617 if (equality_comparison_p
11618 && const_op == 0
11619 && CONST_INT_P (XEXP (op0, 1))
11620 && mode_width <= HOST_BITS_PER_WIDE_INT
11621 && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
11622 == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
11623 {
11624 op0 = XEXP (op0, 0);
11625 code = (code == EQ ? GE : LT);
11626 continue;
11627 }
11628
11629 /* If this AND operation is really a ZERO_EXTEND from a narrower
11630 mode, the constant fits within that mode, and this is either an
11631 equality or unsigned comparison, try to do this comparison in
11632 the narrower mode.
11633
11634 Note that in:
11635
11636 (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0))
11637 -> (ne:DI (reg:SI 4) (const_int 0))
11638
11639 unless TRULY_NOOP_TRUNCATION allows it or the register is
11640 known to hold a value of the required mode the
11641 transformation is invalid. */
11642 if ((equality_comparison_p || unsigned_comparison_p)
11643 && CONST_INT_P (XEXP (op0, 1))
11644 && (i = exact_log2 ((UINTVAL (XEXP (op0, 1))
11645 & GET_MODE_MASK (mode))
11646 + 1)) >= 0
11647 && const_op >> i == 0
11648 && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode
11649 && (TRULY_NOOP_TRUNCATION_MODES_P (tmode, GET_MODE (op0))
11650 || (REG_P (XEXP (op0, 0))
11651 && reg_truncated_to_mode (tmode, XEXP (op0, 0)))))
11652 {
11653 op0 = gen_lowpart (tmode, XEXP (op0, 0));
11654 continue;
11655 }
11656
11657 /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1
11658 fits in both M1 and M2 and the SUBREG is either paradoxical
11659 or represents the low part, permute the SUBREG and the AND
11660 and try again. */
11661 if (GET_CODE (XEXP (op0, 0)) == SUBREG)
11662 {
11663 unsigned HOST_WIDE_INT c1;
11664 tmode = GET_MODE (SUBREG_REG (XEXP (op0, 0)));
11665 /* Require an integral mode, to avoid creating something like
11666 (AND:SF ...). */
11667 if (SCALAR_INT_MODE_P (tmode)
11668 /* It is unsafe to commute the AND into the SUBREG if the
11669 SUBREG is paradoxical and WORD_REGISTER_OPERATIONS is
11670 not defined. As originally written the upper bits
11671 have a defined value due to the AND operation.
11672 However, if we commute the AND inside the SUBREG then
11673 they no longer have defined values and the meaning of
11674 the code has been changed. */
11675 && (0
11676 #ifdef WORD_REGISTER_OPERATIONS
11677 || (mode_width > GET_MODE_PRECISION (tmode)
11678 && mode_width <= BITS_PER_WORD)
11679 #endif
11680 || (mode_width <= GET_MODE_PRECISION (tmode)
11681 && subreg_lowpart_p (XEXP (op0, 0))))
11682 && CONST_INT_P (XEXP (op0, 1))
11683 && mode_width <= HOST_BITS_PER_WIDE_INT
11684 && HWI_COMPUTABLE_MODE_P (tmode)
11685 && ((c1 = INTVAL (XEXP (op0, 1))) & ~mask) == 0
11686 && (c1 & ~GET_MODE_MASK (tmode)) == 0
11687 && c1 != mask
11688 && c1 != GET_MODE_MASK (tmode))
11689 {
11690 op0 = simplify_gen_binary (AND, tmode,
11691 SUBREG_REG (XEXP (op0, 0)),
11692 gen_int_mode (c1, tmode));
11693 op0 = gen_lowpart (mode, op0);
11694 continue;
11695 }
11696 }
11697
11698 /* Convert (ne (and (not X) 1) 0) to (eq (and X 1) 0). */
11699 if (const_op == 0 && equality_comparison_p
11700 && XEXP (op0, 1) == const1_rtx
11701 && GET_CODE (XEXP (op0, 0)) == NOT)
11702 {
11703 op0 = simplify_and_const_int (NULL_RTX, mode,
11704 XEXP (XEXP (op0, 0), 0), 1);
11705 code = (code == NE ? EQ : NE);
11706 continue;
11707 }
11708
11709 /* Convert (ne (and (lshiftrt (not X)) 1) 0) to
11710 (eq (and (lshiftrt X) 1) 0).
11711 Also handle the case where (not X) is expressed using xor. */
11712 if (const_op == 0 && equality_comparison_p
11713 && XEXP (op0, 1) == const1_rtx
11714 && GET_CODE (XEXP (op0, 0)) == LSHIFTRT)
11715 {
11716 rtx shift_op = XEXP (XEXP (op0, 0), 0);
11717 rtx shift_count = XEXP (XEXP (op0, 0), 1);
11718
11719 if (GET_CODE (shift_op) == NOT
11720 || (GET_CODE (shift_op) == XOR
11721 && CONST_INT_P (XEXP (shift_op, 1))
11722 && CONST_INT_P (shift_count)
11723 && HWI_COMPUTABLE_MODE_P (mode)
11724 && (UINTVAL (XEXP (shift_op, 1))
11725 == (unsigned HOST_WIDE_INT) 1
11726 << INTVAL (shift_count))))
11727 {
11728 op0
11729 = gen_rtx_LSHIFTRT (mode, XEXP (shift_op, 0), shift_count);
11730 op0 = simplify_and_const_int (NULL_RTX, mode, op0, 1);
11731 code = (code == NE ? EQ : NE);
11732 continue;
11733 }
11734 }
11735 break;
11736
11737 case ASHIFT:
11738 /* If we have (compare (ashift FOO N) (const_int C)) and
11739 the high order N bits of FOO (N+1 if an inequality comparison)
11740 are known to be zero, we can do this by comparing FOO with C
11741 shifted right N bits so long as the low-order N bits of C are
11742 zero. */
11743 if (CONST_INT_P (XEXP (op0, 1))
11744 && INTVAL (XEXP (op0, 1)) >= 0
11745 && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
11746 < HOST_BITS_PER_WIDE_INT)
11747 && (((unsigned HOST_WIDE_INT) const_op
11748 & (((unsigned HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1)))
11749 - 1)) == 0)
11750 && mode_width <= HOST_BITS_PER_WIDE_INT
11751 && (nonzero_bits (XEXP (op0, 0), mode)
11752 & ~(mask >> (INTVAL (XEXP (op0, 1))
11753 + ! equality_comparison_p))) == 0)
11754 {
11755 /* We must perform a logical shift, not an arithmetic one,
11756 as we want the top N bits of C to be zero. */
11757 unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
11758
11759 temp >>= INTVAL (XEXP (op0, 1));
11760 op1 = gen_int_mode (temp, mode);
11761 op0 = XEXP (op0, 0);
11762 continue;
11763 }
11764
11765 /* If we are doing a sign bit comparison, it means we are testing
11766 a particular bit. Convert it to the appropriate AND. */
11767 if (sign_bit_comparison_p && CONST_INT_P (XEXP (op0, 1))
11768 && mode_width <= HOST_BITS_PER_WIDE_INT)
11769 {
11770 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
11771 ((unsigned HOST_WIDE_INT) 1
11772 << (mode_width - 1
11773 - INTVAL (XEXP (op0, 1)))));
11774 code = (code == LT ? NE : EQ);
11775 continue;
11776 }
11777
11778 /* If this an equality comparison with zero and we are shifting
11779 the low bit to the sign bit, we can convert this to an AND of the
11780 low-order bit. */
11781 if (const_op == 0 && equality_comparison_p
11782 && CONST_INT_P (XEXP (op0, 1))
11783 && UINTVAL (XEXP (op0, 1)) == mode_width - 1)
11784 {
11785 op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), 1);
11786 continue;
11787 }
11788 break;
11789
11790 case ASHIFTRT:
11791 /* If this is an equality comparison with zero, we can do this
11792 as a logical shift, which might be much simpler. */
11793 if (equality_comparison_p && const_op == 0
11794 && CONST_INT_P (XEXP (op0, 1)))
11795 {
11796 op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
11797 XEXP (op0, 0),
11798 INTVAL (XEXP (op0, 1)));
11799 continue;
11800 }
11801
11802 /* If OP0 is a sign extension and CODE is not an unsigned comparison,
11803 do the comparison in a narrower mode. */
11804 if (! unsigned_comparison_p
11805 && CONST_INT_P (XEXP (op0, 1))
11806 && GET_CODE (XEXP (op0, 0)) == ASHIFT
11807 && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
11808 && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11809 MODE_INT, 1)) != BLKmode
11810 && (((unsigned HOST_WIDE_INT) const_op
11811 + (GET_MODE_MASK (tmode) >> 1) + 1)
11812 <= GET_MODE_MASK (tmode)))
11813 {
11814 op0 = gen_lowpart (tmode, XEXP (XEXP (op0, 0), 0));
11815 continue;
11816 }
11817
11818 /* Likewise if OP0 is a PLUS of a sign extension with a
11819 constant, which is usually represented with the PLUS
11820 between the shifts. */
11821 if (! unsigned_comparison_p
11822 && CONST_INT_P (XEXP (op0, 1))
11823 && GET_CODE (XEXP (op0, 0)) == PLUS
11824 && CONST_INT_P (XEXP (XEXP (op0, 0), 1))
11825 && GET_CODE (XEXP (XEXP (op0, 0), 0)) == ASHIFT
11826 && XEXP (op0, 1) == XEXP (XEXP (XEXP (op0, 0), 0), 1)
11827 && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
11828 MODE_INT, 1)) != BLKmode
11829 && (((unsigned HOST_WIDE_INT) const_op
11830 + (GET_MODE_MASK (tmode) >> 1) + 1)
11831 <= GET_MODE_MASK (tmode)))
11832 {
11833 rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
11834 rtx add_const = XEXP (XEXP (op0, 0), 1);
11835 rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
11836 add_const, XEXP (op0, 1));
11837
11838 op0 = simplify_gen_binary (PLUS, tmode,
11839 gen_lowpart (tmode, inner),
11840 new_const);
11841 continue;
11842 }
11843
11844 /* ... fall through ... */
11845 case LSHIFTRT:
11846 /* If we have (compare (xshiftrt FOO N) (const_int C)) and
11847 the low order N bits of FOO are known to be zero, we can do this
11848 by comparing FOO with C shifted left N bits so long as no
11849 overflow occurs. Even if the low order N bits of FOO aren't known
11850 to be zero, if the comparison is >= or < we can use the same
11851 optimization and for > or <= by setting all the low
11852 order N bits in the comparison constant. */
11853 if (CONST_INT_P (XEXP (op0, 1))
11854 && INTVAL (XEXP (op0, 1)) > 0
11855 && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
11856 && mode_width <= HOST_BITS_PER_WIDE_INT
11857 && (((unsigned HOST_WIDE_INT) const_op
11858 + (GET_CODE (op0) != LSHIFTRT
11859 ? ((GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1)) >> 1)
11860 + 1)
11861 : 0))
11862 <= GET_MODE_MASK (mode) >> INTVAL (XEXP (op0, 1))))
11863 {
11864 unsigned HOST_WIDE_INT low_bits
11865 = (nonzero_bits (XEXP (op0, 0), mode)
11866 & (((unsigned HOST_WIDE_INT) 1
11867 << INTVAL (XEXP (op0, 1))) - 1));
11868 if (low_bits == 0 || !equality_comparison_p)
11869 {
11870 /* If the shift was logical, then we must make the condition
11871 unsigned. */
11872 if (GET_CODE (op0) == LSHIFTRT)
11873 code = unsigned_condition (code);
11874
11875 const_op <<= INTVAL (XEXP (op0, 1));
11876 if (low_bits != 0
11877 && (code == GT || code == GTU
11878 || code == LE || code == LEU))
11879 const_op
11880 |= (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1);
11881 op1 = GEN_INT (const_op);
11882 op0 = XEXP (op0, 0);
11883 continue;
11884 }
11885 }
11886
11887 /* If we are using this shift to extract just the sign bit, we
11888 can replace this with an LT or GE comparison. */
11889 if (const_op == 0
11890 && (equality_comparison_p || sign_bit_comparison_p)
11891 && CONST_INT_P (XEXP (op0, 1))
11892 && UINTVAL (XEXP (op0, 1)) == mode_width - 1)
11893 {
11894 op0 = XEXP (op0, 0);
11895 code = (code == NE || code == GT ? LT : GE);
11896 continue;
11897 }
11898 break;
11899
11900 default:
11901 break;
11902 }
11903
11904 break;
11905 }
11906
11907 /* Now make any compound operations involved in this comparison. Then,
11908 check for an outmost SUBREG on OP0 that is not doing anything or is
11909 paradoxical. The latter transformation must only be performed when
11910 it is known that the "extra" bits will be the same in op0 and op1 or
11911 that they don't matter. There are three cases to consider:
11912
11913 1. SUBREG_REG (op0) is a register. In this case the bits are don't
11914 care bits and we can assume they have any convenient value. So
11915 making the transformation is safe.
11916
11917 2. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is not defined.
11918 In this case the upper bits of op0 are undefined. We should not make
11919 the simplification in that case as we do not know the contents of
11920 those bits.
11921
11922 3. SUBREG_REG (op0) is a memory and LOAD_EXTEND_OP is defined and not
11923 UNKNOWN. In that case we know those bits are zeros or ones. We must
11924 also be sure that they are the same as the upper bits of op1.
11925
11926 We can never remove a SUBREG for a non-equality comparison because
11927 the sign bit is in a different place in the underlying object. */
11928
11929 op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
11930 op1 = make_compound_operation (op1, SET);
11931
11932 if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
11933 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
11934 && GET_MODE_CLASS (GET_MODE (SUBREG_REG (op0))) == MODE_INT
11935 && (code == NE || code == EQ))
11936 {
11937 if (paradoxical_subreg_p (op0))
11938 {
11939 /* For paradoxical subregs, allow case 1 as above. Case 3 isn't
11940 implemented. */
11941 if (REG_P (SUBREG_REG (op0)))
11942 {
11943 op0 = SUBREG_REG (op0);
11944 op1 = gen_lowpart (GET_MODE (op0), op1);
11945 }
11946 }
11947 else if ((GET_MODE_PRECISION (GET_MODE (SUBREG_REG (op0)))
11948 <= HOST_BITS_PER_WIDE_INT)
11949 && (nonzero_bits (SUBREG_REG (op0),
11950 GET_MODE (SUBREG_REG (op0)))
11951 & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11952 {
11953 tem = gen_lowpart (GET_MODE (SUBREG_REG (op0)), op1);
11954
11955 if ((nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
11956 & ~GET_MODE_MASK (GET_MODE (op0))) == 0)
11957 op0 = SUBREG_REG (op0), op1 = tem;
11958 }
11959 }
11960
11961 /* We now do the opposite procedure: Some machines don't have compare
11962 insns in all modes. If OP0's mode is an integer mode smaller than a
11963 word and we can't do a compare in that mode, see if there is a larger
11964 mode for which we can do the compare. There are a number of cases in
11965 which we can use the wider mode. */
11966
11967 mode = GET_MODE (op0);
11968 if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
11969 && GET_MODE_SIZE (mode) < UNITS_PER_WORD
11970 && ! have_insn_for (COMPARE, mode))
11971 for (tmode = GET_MODE_WIDER_MODE (mode);
11972 (tmode != VOIDmode && HWI_COMPUTABLE_MODE_P (tmode));
11973 tmode = GET_MODE_WIDER_MODE (tmode))
11974 if (have_insn_for (COMPARE, tmode))
11975 {
11976 int zero_extended;
11977
11978 /* If this is a test for negative, we can make an explicit
11979 test of the sign bit. Test this first so we can use
11980 a paradoxical subreg to extend OP0. */
11981
11982 if (op1 == const0_rtx && (code == LT || code == GE)
11983 && HWI_COMPUTABLE_MODE_P (mode))
11984 {
11985 unsigned HOST_WIDE_INT sign
11986 = (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1);
11987 op0 = simplify_gen_binary (AND, tmode,
11988 gen_lowpart (tmode, op0),
11989 gen_int_mode (sign, mode));
11990 code = (code == LT) ? NE : EQ;
11991 break;
11992 }
11993
11994 /* If the only nonzero bits in OP0 and OP1 are those in the
11995 narrower mode and this is an equality or unsigned comparison,
11996 we can use the wider mode. Similarly for sign-extended
11997 values, in which case it is true for all comparisons. */
11998 zero_extended = ((code == EQ || code == NE
11999 || code == GEU || code == GTU
12000 || code == LEU || code == LTU)
12001 && (nonzero_bits (op0, tmode)
12002 & ~GET_MODE_MASK (mode)) == 0
12003 && ((CONST_INT_P (op1)
12004 || (nonzero_bits (op1, tmode)
12005 & ~GET_MODE_MASK (mode)) == 0)));
12006
12007 if (zero_extended
12008 || ((num_sign_bit_copies (op0, tmode)
12009 > (unsigned int) (GET_MODE_PRECISION (tmode)
12010 - GET_MODE_PRECISION (mode)))
12011 && (num_sign_bit_copies (op1, tmode)
12012 > (unsigned int) (GET_MODE_PRECISION (tmode)
12013 - GET_MODE_PRECISION (mode)))))
12014 {
12015 /* If OP0 is an AND and we don't have an AND in MODE either,
12016 make a new AND in the proper mode. */
12017 if (GET_CODE (op0) == AND
12018 && !have_insn_for (AND, mode))
12019 op0 = simplify_gen_binary (AND, tmode,
12020 gen_lowpart (tmode,
12021 XEXP (op0, 0)),
12022 gen_lowpart (tmode,
12023 XEXP (op0, 1)));
12024 else
12025 {
12026 if (zero_extended)
12027 {
12028 op0 = simplify_gen_unary (ZERO_EXTEND, tmode, op0, mode);
12029 op1 = simplify_gen_unary (ZERO_EXTEND, tmode, op1, mode);
12030 }
12031 else
12032 {
12033 op0 = simplify_gen_unary (SIGN_EXTEND, tmode, op0, mode);
12034 op1 = simplify_gen_unary (SIGN_EXTEND, tmode, op1, mode);
12035 }
12036 break;
12037 }
12038 }
12039 }
12040
12041 /* We may have changed the comparison operands. Re-canonicalize. */
12042 if (swap_commutative_operands_p (op0, op1))
12043 {
12044 tem = op0, op0 = op1, op1 = tem;
12045 code = swap_condition (code);
12046 }
12047
12048 /* If this machine only supports a subset of valid comparisons, see if we
12049 can convert an unsupported one into a supported one. */
12050 target_canonicalize_comparison (&code, &op0, &op1, 0);
12051
12052 *pop0 = op0;
12053 *pop1 = op1;
12054
12055 return code;
12056 }
12057 \f
12058 /* Utility function for record_value_for_reg. Count number of
12059 rtxs in X. */
12060 static int
12061 count_rtxs (rtx x)
12062 {
12063 enum rtx_code code = GET_CODE (x);
12064 const char *fmt;
12065 int i, j, ret = 1;
12066
12067 if (GET_RTX_CLASS (code) == RTX_BIN_ARITH
12068 || GET_RTX_CLASS (code) == RTX_COMM_ARITH)
12069 {
12070 rtx x0 = XEXP (x, 0);
12071 rtx x1 = XEXP (x, 1);
12072
12073 if (x0 == x1)
12074 return 1 + 2 * count_rtxs (x0);
12075
12076 if ((GET_RTX_CLASS (GET_CODE (x1)) == RTX_BIN_ARITH
12077 || GET_RTX_CLASS (GET_CODE (x1)) == RTX_COMM_ARITH)
12078 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12079 return 2 + 2 * count_rtxs (x0)
12080 + count_rtxs (x == XEXP (x1, 0)
12081 ? XEXP (x1, 1) : XEXP (x1, 0));
12082
12083 if ((GET_RTX_CLASS (GET_CODE (x0)) == RTX_BIN_ARITH
12084 || GET_RTX_CLASS (GET_CODE (x0)) == RTX_COMM_ARITH)
12085 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12086 return 2 + 2 * count_rtxs (x1)
12087 + count_rtxs (x == XEXP (x0, 0)
12088 ? XEXP (x0, 1) : XEXP (x0, 0));
12089 }
12090
12091 fmt = GET_RTX_FORMAT (code);
12092 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12093 if (fmt[i] == 'e')
12094 ret += count_rtxs (XEXP (x, i));
12095 else if (fmt[i] == 'E')
12096 for (j = 0; j < XVECLEN (x, i); j++)
12097 ret += count_rtxs (XVECEXP (x, i, j));
12098
12099 return ret;
12100 }
12101 \f
12102 /* Utility function for following routine. Called when X is part of a value
12103 being stored into last_set_value. Sets last_set_table_tick
12104 for each register mentioned. Similar to mention_regs in cse.c */
12105
12106 static void
12107 update_table_tick (rtx x)
12108 {
12109 enum rtx_code code = GET_CODE (x);
12110 const char *fmt = GET_RTX_FORMAT (code);
12111 int i, j;
12112
12113 if (code == REG)
12114 {
12115 unsigned int regno = REGNO (x);
12116 unsigned int endregno = END_REGNO (x);
12117 unsigned int r;
12118
12119 for (r = regno; r < endregno; r++)
12120 {
12121 reg_stat_type *rsp = &reg_stat[r];
12122 rsp->last_set_table_tick = label_tick;
12123 }
12124
12125 return;
12126 }
12127
12128 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12129 if (fmt[i] == 'e')
12130 {
12131 /* Check for identical subexpressions. If x contains
12132 identical subexpression we only have to traverse one of
12133 them. */
12134 if (i == 0 && ARITHMETIC_P (x))
12135 {
12136 /* Note that at this point x1 has already been
12137 processed. */
12138 rtx x0 = XEXP (x, 0);
12139 rtx x1 = XEXP (x, 1);
12140
12141 /* If x0 and x1 are identical then there is no need to
12142 process x0. */
12143 if (x0 == x1)
12144 break;
12145
12146 /* If x0 is identical to a subexpression of x1 then while
12147 processing x1, x0 has already been processed. Thus we
12148 are done with x. */
12149 if (ARITHMETIC_P (x1)
12150 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12151 break;
12152
12153 /* If x1 is identical to a subexpression of x0 then we
12154 still have to process the rest of x0. */
12155 if (ARITHMETIC_P (x0)
12156 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12157 {
12158 update_table_tick (XEXP (x0, x1 == XEXP (x0, 0) ? 1 : 0));
12159 break;
12160 }
12161 }
12162
12163 update_table_tick (XEXP (x, i));
12164 }
12165 else if (fmt[i] == 'E')
12166 for (j = 0; j < XVECLEN (x, i); j++)
12167 update_table_tick (XVECEXP (x, i, j));
12168 }
12169
12170 /* Record that REG is set to VALUE in insn INSN. If VALUE is zero, we
12171 are saying that the register is clobbered and we no longer know its
12172 value. If INSN is zero, don't update reg_stat[].last_set; this is
12173 only permitted with VALUE also zero and is used to invalidate the
12174 register. */
12175
12176 static void
12177 record_value_for_reg (rtx reg, rtx insn, rtx value)
12178 {
12179 unsigned int regno = REGNO (reg);
12180 unsigned int endregno = END_REGNO (reg);
12181 unsigned int i;
12182 reg_stat_type *rsp;
12183
12184 /* If VALUE contains REG and we have a previous value for REG, substitute
12185 the previous value. */
12186 if (value && insn && reg_overlap_mentioned_p (reg, value))
12187 {
12188 rtx tem;
12189
12190 /* Set things up so get_last_value is allowed to see anything set up to
12191 our insn. */
12192 subst_low_luid = DF_INSN_LUID (insn);
12193 tem = get_last_value (reg);
12194
12195 /* If TEM is simply a binary operation with two CLOBBERs as operands,
12196 it isn't going to be useful and will take a lot of time to process,
12197 so just use the CLOBBER. */
12198
12199 if (tem)
12200 {
12201 if (ARITHMETIC_P (tem)
12202 && GET_CODE (XEXP (tem, 0)) == CLOBBER
12203 && GET_CODE (XEXP (tem, 1)) == CLOBBER)
12204 tem = XEXP (tem, 0);
12205 else if (count_occurrences (value, reg, 1) >= 2)
12206 {
12207 /* If there are two or more occurrences of REG in VALUE,
12208 prevent the value from growing too much. */
12209 if (count_rtxs (tem) > MAX_LAST_VALUE_RTL)
12210 tem = gen_rtx_CLOBBER (GET_MODE (tem), const0_rtx);
12211 }
12212
12213 value = replace_rtx (copy_rtx (value), reg, tem);
12214 }
12215 }
12216
12217 /* For each register modified, show we don't know its value, that
12218 we don't know about its bitwise content, that its value has been
12219 updated, and that we don't know the location of the death of the
12220 register. */
12221 for (i = regno; i < endregno; i++)
12222 {
12223 rsp = &reg_stat[i];
12224
12225 if (insn)
12226 rsp->last_set = insn;
12227
12228 rsp->last_set_value = 0;
12229 rsp->last_set_mode = VOIDmode;
12230 rsp->last_set_nonzero_bits = 0;
12231 rsp->last_set_sign_bit_copies = 0;
12232 rsp->last_death = 0;
12233 rsp->truncated_to_mode = VOIDmode;
12234 }
12235
12236 /* Mark registers that are being referenced in this value. */
12237 if (value)
12238 update_table_tick (value);
12239
12240 /* Now update the status of each register being set.
12241 If someone is using this register in this block, set this register
12242 to invalid since we will get confused between the two lives in this
12243 basic block. This makes using this register always invalid. In cse, we
12244 scan the table to invalidate all entries using this register, but this
12245 is too much work for us. */
12246
12247 for (i = regno; i < endregno; i++)
12248 {
12249 rsp = &reg_stat[i];
12250 rsp->last_set_label = label_tick;
12251 if (!insn
12252 || (value && rsp->last_set_table_tick >= label_tick_ebb_start))
12253 rsp->last_set_invalid = 1;
12254 else
12255 rsp->last_set_invalid = 0;
12256 }
12257
12258 /* The value being assigned might refer to X (like in "x++;"). In that
12259 case, we must replace it with (clobber (const_int 0)) to prevent
12260 infinite loops. */
12261 rsp = &reg_stat[regno];
12262 if (value && !get_last_value_validate (&value, insn, label_tick, 0))
12263 {
12264 value = copy_rtx (value);
12265 if (!get_last_value_validate (&value, insn, label_tick, 1))
12266 value = 0;
12267 }
12268
12269 /* For the main register being modified, update the value, the mode, the
12270 nonzero bits, and the number of sign bit copies. */
12271
12272 rsp->last_set_value = value;
12273
12274 if (value)
12275 {
12276 enum machine_mode mode = GET_MODE (reg);
12277 subst_low_luid = DF_INSN_LUID (insn);
12278 rsp->last_set_mode = mode;
12279 if (GET_MODE_CLASS (mode) == MODE_INT
12280 && HWI_COMPUTABLE_MODE_P (mode))
12281 mode = nonzero_bits_mode;
12282 rsp->last_set_nonzero_bits = nonzero_bits (value, mode);
12283 rsp->last_set_sign_bit_copies
12284 = num_sign_bit_copies (value, GET_MODE (reg));
12285 }
12286 }
12287
12288 /* Called via note_stores from record_dead_and_set_regs to handle one
12289 SET or CLOBBER in an insn. DATA is the instruction in which the
12290 set is occurring. */
12291
12292 static void
12293 record_dead_and_set_regs_1 (rtx dest, const_rtx setter, void *data)
12294 {
12295 rtx record_dead_insn = (rtx) data;
12296
12297 if (GET_CODE (dest) == SUBREG)
12298 dest = SUBREG_REG (dest);
12299
12300 if (!record_dead_insn)
12301 {
12302 if (REG_P (dest))
12303 record_value_for_reg (dest, NULL_RTX, NULL_RTX);
12304 return;
12305 }
12306
12307 if (REG_P (dest))
12308 {
12309 /* If we are setting the whole register, we know its value. Otherwise
12310 show that we don't know the value. We can handle SUBREG in
12311 some cases. */
12312 if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
12313 record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
12314 else if (GET_CODE (setter) == SET
12315 && GET_CODE (SET_DEST (setter)) == SUBREG
12316 && SUBREG_REG (SET_DEST (setter)) == dest
12317 && GET_MODE_PRECISION (GET_MODE (dest)) <= BITS_PER_WORD
12318 && subreg_lowpart_p (SET_DEST (setter)))
12319 record_value_for_reg (dest, record_dead_insn,
12320 gen_lowpart (GET_MODE (dest),
12321 SET_SRC (setter)));
12322 else
12323 record_value_for_reg (dest, record_dead_insn, NULL_RTX);
12324 }
12325 else if (MEM_P (dest)
12326 /* Ignore pushes, they clobber nothing. */
12327 && ! push_operand (dest, GET_MODE (dest)))
12328 mem_last_set = DF_INSN_LUID (record_dead_insn);
12329 }
12330
12331 /* Update the records of when each REG was most recently set or killed
12332 for the things done by INSN. This is the last thing done in processing
12333 INSN in the combiner loop.
12334
12335 We update reg_stat[], in particular fields last_set, last_set_value,
12336 last_set_mode, last_set_nonzero_bits, last_set_sign_bit_copies,
12337 last_death, and also the similar information mem_last_set (which insn
12338 most recently modified memory) and last_call_luid (which insn was the
12339 most recent subroutine call). */
12340
12341 static void
12342 record_dead_and_set_regs (rtx insn)
12343 {
12344 rtx link;
12345 unsigned int i;
12346
12347 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
12348 {
12349 if (REG_NOTE_KIND (link) == REG_DEAD
12350 && REG_P (XEXP (link, 0)))
12351 {
12352 unsigned int regno = REGNO (XEXP (link, 0));
12353 unsigned int endregno = END_REGNO (XEXP (link, 0));
12354
12355 for (i = regno; i < endregno; i++)
12356 {
12357 reg_stat_type *rsp;
12358
12359 rsp = &reg_stat[i];
12360 rsp->last_death = insn;
12361 }
12362 }
12363 else if (REG_NOTE_KIND (link) == REG_INC)
12364 record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
12365 }
12366
12367 if (CALL_P (insn))
12368 {
12369 hard_reg_set_iterator hrsi;
12370 EXECUTE_IF_SET_IN_HARD_REG_SET (regs_invalidated_by_call, 0, i, hrsi)
12371 {
12372 reg_stat_type *rsp;
12373
12374 rsp = &reg_stat[i];
12375 rsp->last_set_invalid = 1;
12376 rsp->last_set = insn;
12377 rsp->last_set_value = 0;
12378 rsp->last_set_mode = VOIDmode;
12379 rsp->last_set_nonzero_bits = 0;
12380 rsp->last_set_sign_bit_copies = 0;
12381 rsp->last_death = 0;
12382 rsp->truncated_to_mode = VOIDmode;
12383 }
12384
12385 last_call_luid = mem_last_set = DF_INSN_LUID (insn);
12386
12387 /* We can't combine into a call pattern. Remember, though, that
12388 the return value register is set at this LUID. We could
12389 still replace a register with the return value from the
12390 wrong subroutine call! */
12391 note_stores (PATTERN (insn), record_dead_and_set_regs_1, NULL_RTX);
12392 }
12393 else
12394 note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
12395 }
12396
12397 /* If a SUBREG has the promoted bit set, it is in fact a property of the
12398 register present in the SUBREG, so for each such SUBREG go back and
12399 adjust nonzero and sign bit information of the registers that are
12400 known to have some zero/sign bits set.
12401
12402 This is needed because when combine blows the SUBREGs away, the
12403 information on zero/sign bits is lost and further combines can be
12404 missed because of that. */
12405
12406 static void
12407 record_promoted_value (rtx insn, rtx subreg)
12408 {
12409 struct insn_link *links;
12410 rtx set;
12411 unsigned int regno = REGNO (SUBREG_REG (subreg));
12412 enum machine_mode mode = GET_MODE (subreg);
12413
12414 if (GET_MODE_PRECISION (mode) > HOST_BITS_PER_WIDE_INT)
12415 return;
12416
12417 for (links = LOG_LINKS (insn); links;)
12418 {
12419 reg_stat_type *rsp;
12420
12421 insn = links->insn;
12422 set = single_set (insn);
12423
12424 if (! set || !REG_P (SET_DEST (set))
12425 || REGNO (SET_DEST (set)) != regno
12426 || GET_MODE (SET_DEST (set)) != GET_MODE (SUBREG_REG (subreg)))
12427 {
12428 links = links->next;
12429 continue;
12430 }
12431
12432 rsp = &reg_stat[regno];
12433 if (rsp->last_set == insn)
12434 {
12435 if (SUBREG_PROMOTED_UNSIGNED_P (subreg) > 0)
12436 rsp->last_set_nonzero_bits &= GET_MODE_MASK (mode);
12437 }
12438
12439 if (REG_P (SET_SRC (set)))
12440 {
12441 regno = REGNO (SET_SRC (set));
12442 links = LOG_LINKS (insn);
12443 }
12444 else
12445 break;
12446 }
12447 }
12448
12449 /* Check if X, a register, is known to contain a value already
12450 truncated to MODE. In this case we can use a subreg to refer to
12451 the truncated value even though in the generic case we would need
12452 an explicit truncation. */
12453
12454 static bool
12455 reg_truncated_to_mode (enum machine_mode mode, const_rtx x)
12456 {
12457 reg_stat_type *rsp = &reg_stat[REGNO (x)];
12458 enum machine_mode truncated = rsp->truncated_to_mode;
12459
12460 if (truncated == 0
12461 || rsp->truncation_label < label_tick_ebb_start)
12462 return false;
12463 if (GET_MODE_SIZE (truncated) <= GET_MODE_SIZE (mode))
12464 return true;
12465 if (TRULY_NOOP_TRUNCATION_MODES_P (mode, truncated))
12466 return true;
12467 return false;
12468 }
12469
12470 /* Callback for for_each_rtx. If *P is a hard reg or a subreg record the mode
12471 that the register is accessed in. For non-TRULY_NOOP_TRUNCATION targets we
12472 might be able to turn a truncate into a subreg using this information.
12473 Return -1 if traversing *P is complete or 0 otherwise. */
12474
12475 static int
12476 record_truncated_value (rtx *p, void *data ATTRIBUTE_UNUSED)
12477 {
12478 rtx x = *p;
12479 enum machine_mode truncated_mode;
12480 reg_stat_type *rsp;
12481
12482 if (GET_CODE (x) == SUBREG && REG_P (SUBREG_REG (x)))
12483 {
12484 enum machine_mode original_mode = GET_MODE (SUBREG_REG (x));
12485 truncated_mode = GET_MODE (x);
12486
12487 if (GET_MODE_SIZE (original_mode) <= GET_MODE_SIZE (truncated_mode))
12488 return -1;
12489
12490 if (TRULY_NOOP_TRUNCATION_MODES_P (truncated_mode, original_mode))
12491 return -1;
12492
12493 x = SUBREG_REG (x);
12494 }
12495 /* ??? For hard-regs we now record everything. We might be able to
12496 optimize this using last_set_mode. */
12497 else if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
12498 truncated_mode = GET_MODE (x);
12499 else
12500 return 0;
12501
12502 rsp = &reg_stat[REGNO (x)];
12503 if (rsp->truncated_to_mode == 0
12504 || rsp->truncation_label < label_tick_ebb_start
12505 || (GET_MODE_SIZE (truncated_mode)
12506 < GET_MODE_SIZE (rsp->truncated_to_mode)))
12507 {
12508 rsp->truncated_to_mode = truncated_mode;
12509 rsp->truncation_label = label_tick;
12510 }
12511
12512 return -1;
12513 }
12514
12515 /* Callback for note_uses. Find hardregs and subregs of pseudos and
12516 the modes they are used in. This can help truning TRUNCATEs into
12517 SUBREGs. */
12518
12519 static void
12520 record_truncated_values (rtx *x, void *data ATTRIBUTE_UNUSED)
12521 {
12522 for_each_rtx (x, record_truncated_value, NULL);
12523 }
12524
12525 /* Scan X for promoted SUBREGs. For each one found,
12526 note what it implies to the registers used in it. */
12527
12528 static void
12529 check_promoted_subreg (rtx insn, rtx x)
12530 {
12531 if (GET_CODE (x) == SUBREG
12532 && SUBREG_PROMOTED_VAR_P (x)
12533 && REG_P (SUBREG_REG (x)))
12534 record_promoted_value (insn, x);
12535 else
12536 {
12537 const char *format = GET_RTX_FORMAT (GET_CODE (x));
12538 int i, j;
12539
12540 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (x)); i++)
12541 switch (format[i])
12542 {
12543 case 'e':
12544 check_promoted_subreg (insn, XEXP (x, i));
12545 break;
12546 case 'V':
12547 case 'E':
12548 if (XVEC (x, i) != 0)
12549 for (j = 0; j < XVECLEN (x, i); j++)
12550 check_promoted_subreg (insn, XVECEXP (x, i, j));
12551 break;
12552 }
12553 }
12554 }
12555 \f
12556 /* Verify that all the registers and memory references mentioned in *LOC are
12557 still valid. *LOC was part of a value set in INSN when label_tick was
12558 equal to TICK. Return 0 if some are not. If REPLACE is nonzero, replace
12559 the invalid references with (clobber (const_int 0)) and return 1. This
12560 replacement is useful because we often can get useful information about
12561 the form of a value (e.g., if it was produced by a shift that always
12562 produces -1 or 0) even though we don't know exactly what registers it
12563 was produced from. */
12564
12565 static int
12566 get_last_value_validate (rtx *loc, rtx insn, int tick, int replace)
12567 {
12568 rtx x = *loc;
12569 const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
12570 int len = GET_RTX_LENGTH (GET_CODE (x));
12571 int i, j;
12572
12573 if (REG_P (x))
12574 {
12575 unsigned int regno = REGNO (x);
12576 unsigned int endregno = END_REGNO (x);
12577 unsigned int j;
12578
12579 for (j = regno; j < endregno; j++)
12580 {
12581 reg_stat_type *rsp = &reg_stat[j];
12582 if (rsp->last_set_invalid
12583 /* If this is a pseudo-register that was only set once and not
12584 live at the beginning of the function, it is always valid. */
12585 || (! (regno >= FIRST_PSEUDO_REGISTER
12586 && REG_N_SETS (regno) == 1
12587 && (!REGNO_REG_SET_P
12588 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb),
12589 regno)))
12590 && rsp->last_set_label > tick))
12591 {
12592 if (replace)
12593 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
12594 return replace;
12595 }
12596 }
12597
12598 return 1;
12599 }
12600 /* If this is a memory reference, make sure that there were no stores after
12601 it that might have clobbered the value. We don't have alias info, so we
12602 assume any store invalidates it. Moreover, we only have local UIDs, so
12603 we also assume that there were stores in the intervening basic blocks. */
12604 else if (MEM_P (x) && !MEM_READONLY_P (x)
12605 && (tick != label_tick || DF_INSN_LUID (insn) <= mem_last_set))
12606 {
12607 if (replace)
12608 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
12609 return replace;
12610 }
12611
12612 for (i = 0; i < len; i++)
12613 {
12614 if (fmt[i] == 'e')
12615 {
12616 /* Check for identical subexpressions. If x contains
12617 identical subexpression we only have to traverse one of
12618 them. */
12619 if (i == 1 && ARITHMETIC_P (x))
12620 {
12621 /* Note that at this point x0 has already been checked
12622 and found valid. */
12623 rtx x0 = XEXP (x, 0);
12624 rtx x1 = XEXP (x, 1);
12625
12626 /* If x0 and x1 are identical then x is also valid. */
12627 if (x0 == x1)
12628 return 1;
12629
12630 /* If x1 is identical to a subexpression of x0 then
12631 while checking x0, x1 has already been checked. Thus
12632 it is valid and so as x. */
12633 if (ARITHMETIC_P (x0)
12634 && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
12635 return 1;
12636
12637 /* If x0 is identical to a subexpression of x1 then x is
12638 valid iff the rest of x1 is valid. */
12639 if (ARITHMETIC_P (x1)
12640 && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
12641 return
12642 get_last_value_validate (&XEXP (x1,
12643 x0 == XEXP (x1, 0) ? 1 : 0),
12644 insn, tick, replace);
12645 }
12646
12647 if (get_last_value_validate (&XEXP (x, i), insn, tick,
12648 replace) == 0)
12649 return 0;
12650 }
12651 else if (fmt[i] == 'E')
12652 for (j = 0; j < XVECLEN (x, i); j++)
12653 if (get_last_value_validate (&XVECEXP (x, i, j),
12654 insn, tick, replace) == 0)
12655 return 0;
12656 }
12657
12658 /* If we haven't found a reason for it to be invalid, it is valid. */
12659 return 1;
12660 }
12661
12662 /* Get the last value assigned to X, if known. Some registers
12663 in the value may be replaced with (clobber (const_int 0)) if their value
12664 is known longer known reliably. */
12665
12666 static rtx
12667 get_last_value (const_rtx x)
12668 {
12669 unsigned int regno;
12670 rtx value;
12671 reg_stat_type *rsp;
12672
12673 /* If this is a non-paradoxical SUBREG, get the value of its operand and
12674 then convert it to the desired mode. If this is a paradoxical SUBREG,
12675 we cannot predict what values the "extra" bits might have. */
12676 if (GET_CODE (x) == SUBREG
12677 && subreg_lowpart_p (x)
12678 && !paradoxical_subreg_p (x)
12679 && (value = get_last_value (SUBREG_REG (x))) != 0)
12680 return gen_lowpart (GET_MODE (x), value);
12681
12682 if (!REG_P (x))
12683 return 0;
12684
12685 regno = REGNO (x);
12686 rsp = &reg_stat[regno];
12687 value = rsp->last_set_value;
12688
12689 /* If we don't have a value, or if it isn't for this basic block and
12690 it's either a hard register, set more than once, or it's a live
12691 at the beginning of the function, return 0.
12692
12693 Because if it's not live at the beginning of the function then the reg
12694 is always set before being used (is never used without being set).
12695 And, if it's set only once, and it's always set before use, then all
12696 uses must have the same last value, even if it's not from this basic
12697 block. */
12698
12699 if (value == 0
12700 || (rsp->last_set_label < label_tick_ebb_start
12701 && (regno < FIRST_PSEUDO_REGISTER
12702 || REG_N_SETS (regno) != 1
12703 || REGNO_REG_SET_P
12704 (DF_LR_IN (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb), regno))))
12705 return 0;
12706
12707 /* If the value was set in a later insn than the ones we are processing,
12708 we can't use it even if the register was only set once. */
12709 if (rsp->last_set_label == label_tick
12710 && DF_INSN_LUID (rsp->last_set) >= subst_low_luid)
12711 return 0;
12712
12713 /* If the value has all its registers valid, return it. */
12714 if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 0))
12715 return value;
12716
12717 /* Otherwise, make a copy and replace any invalid register with
12718 (clobber (const_int 0)). If that fails for some reason, return 0. */
12719
12720 value = copy_rtx (value);
12721 if (get_last_value_validate (&value, rsp->last_set, rsp->last_set_label, 1))
12722 return value;
12723
12724 return 0;
12725 }
12726 \f
12727 /* Return nonzero if expression X refers to a REG or to memory
12728 that is set in an instruction more recent than FROM_LUID. */
12729
12730 static int
12731 use_crosses_set_p (const_rtx x, int from_luid)
12732 {
12733 const char *fmt;
12734 int i;
12735 enum rtx_code code = GET_CODE (x);
12736
12737 if (code == REG)
12738 {
12739 unsigned int regno = REGNO (x);
12740 unsigned endreg = END_REGNO (x);
12741
12742 #ifdef PUSH_ROUNDING
12743 /* Don't allow uses of the stack pointer to be moved,
12744 because we don't know whether the move crosses a push insn. */
12745 if (regno == STACK_POINTER_REGNUM && PUSH_ARGS)
12746 return 1;
12747 #endif
12748 for (; regno < endreg; regno++)
12749 {
12750 reg_stat_type *rsp = &reg_stat[regno];
12751 if (rsp->last_set
12752 && rsp->last_set_label == label_tick
12753 && DF_INSN_LUID (rsp->last_set) > from_luid)
12754 return 1;
12755 }
12756 return 0;
12757 }
12758
12759 if (code == MEM && mem_last_set > from_luid)
12760 return 1;
12761
12762 fmt = GET_RTX_FORMAT (code);
12763
12764 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12765 {
12766 if (fmt[i] == 'E')
12767 {
12768 int j;
12769 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
12770 if (use_crosses_set_p (XVECEXP (x, i, j), from_luid))
12771 return 1;
12772 }
12773 else if (fmt[i] == 'e'
12774 && use_crosses_set_p (XEXP (x, i), from_luid))
12775 return 1;
12776 }
12777 return 0;
12778 }
12779 \f
12780 /* Define three variables used for communication between the following
12781 routines. */
12782
12783 static unsigned int reg_dead_regno, reg_dead_endregno;
12784 static int reg_dead_flag;
12785
12786 /* Function called via note_stores from reg_dead_at_p.
12787
12788 If DEST is within [reg_dead_regno, reg_dead_endregno), set
12789 reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET. */
12790
12791 static void
12792 reg_dead_at_p_1 (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
12793 {
12794 unsigned int regno, endregno;
12795
12796 if (!REG_P (dest))
12797 return;
12798
12799 regno = REGNO (dest);
12800 endregno = END_REGNO (dest);
12801 if (reg_dead_endregno > regno && reg_dead_regno < endregno)
12802 reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
12803 }
12804
12805 /* Return nonzero if REG is known to be dead at INSN.
12806
12807 We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER
12808 referencing REG, it is dead. If we hit a SET referencing REG, it is
12809 live. Otherwise, see if it is live or dead at the start of the basic
12810 block we are in. Hard regs marked as being live in NEWPAT_USED_REGS
12811 must be assumed to be always live. */
12812
12813 static int
12814 reg_dead_at_p (rtx reg, rtx insn)
12815 {
12816 basic_block block;
12817 unsigned int i;
12818
12819 /* Set variables for reg_dead_at_p_1. */
12820 reg_dead_regno = REGNO (reg);
12821 reg_dead_endregno = END_REGNO (reg);
12822
12823 reg_dead_flag = 0;
12824
12825 /* Check that reg isn't mentioned in NEWPAT_USED_REGS. For fixed registers
12826 we allow the machine description to decide whether use-and-clobber
12827 patterns are OK. */
12828 if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
12829 {
12830 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12831 if (!fixed_regs[i] && TEST_HARD_REG_BIT (newpat_used_regs, i))
12832 return 0;
12833 }
12834
12835 /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, or
12836 beginning of basic block. */
12837 block = BLOCK_FOR_INSN (insn);
12838 for (;;)
12839 {
12840 if (INSN_P (insn))
12841 {
12842 note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
12843 if (reg_dead_flag)
12844 return reg_dead_flag == 1 ? 1 : 0;
12845
12846 if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
12847 return 1;
12848 }
12849
12850 if (insn == BB_HEAD (block))
12851 break;
12852
12853 insn = PREV_INSN (insn);
12854 }
12855
12856 /* Look at live-in sets for the basic block that we were in. */
12857 for (i = reg_dead_regno; i < reg_dead_endregno; i++)
12858 if (REGNO_REG_SET_P (df_get_live_in (block), i))
12859 return 0;
12860
12861 return 1;
12862 }
12863 \f
12864 /* Note hard registers in X that are used. */
12865
12866 static void
12867 mark_used_regs_combine (rtx x)
12868 {
12869 RTX_CODE code = GET_CODE (x);
12870 unsigned int regno;
12871 int i;
12872
12873 switch (code)
12874 {
12875 case LABEL_REF:
12876 case SYMBOL_REF:
12877 case CONST:
12878 CASE_CONST_ANY:
12879 case PC:
12880 case ADDR_VEC:
12881 case ADDR_DIFF_VEC:
12882 case ASM_INPUT:
12883 #ifdef HAVE_cc0
12884 /* CC0 must die in the insn after it is set, so we don't need to take
12885 special note of it here. */
12886 case CC0:
12887 #endif
12888 return;
12889
12890 case CLOBBER:
12891 /* If we are clobbering a MEM, mark any hard registers inside the
12892 address as used. */
12893 if (MEM_P (XEXP (x, 0)))
12894 mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
12895 return;
12896
12897 case REG:
12898 regno = REGNO (x);
12899 /* A hard reg in a wide mode may really be multiple registers.
12900 If so, mark all of them just like the first. */
12901 if (regno < FIRST_PSEUDO_REGISTER)
12902 {
12903 /* None of this applies to the stack, frame or arg pointers. */
12904 if (regno == STACK_POINTER_REGNUM
12905 #if !HARD_FRAME_POINTER_IS_FRAME_POINTER
12906 || regno == HARD_FRAME_POINTER_REGNUM
12907 #endif
12908 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
12909 || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
12910 #endif
12911 || regno == FRAME_POINTER_REGNUM)
12912 return;
12913
12914 add_to_hard_reg_set (&newpat_used_regs, GET_MODE (x), regno);
12915 }
12916 return;
12917
12918 case SET:
12919 {
12920 /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
12921 the address. */
12922 rtx testreg = SET_DEST (x);
12923
12924 while (GET_CODE (testreg) == SUBREG
12925 || GET_CODE (testreg) == ZERO_EXTRACT
12926 || GET_CODE (testreg) == STRICT_LOW_PART)
12927 testreg = XEXP (testreg, 0);
12928
12929 if (MEM_P (testreg))
12930 mark_used_regs_combine (XEXP (testreg, 0));
12931
12932 mark_used_regs_combine (SET_SRC (x));
12933 }
12934 return;
12935
12936 default:
12937 break;
12938 }
12939
12940 /* Recursively scan the operands of this expression. */
12941
12942 {
12943 const char *fmt = GET_RTX_FORMAT (code);
12944
12945 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
12946 {
12947 if (fmt[i] == 'e')
12948 mark_used_regs_combine (XEXP (x, i));
12949 else if (fmt[i] == 'E')
12950 {
12951 int j;
12952
12953 for (j = 0; j < XVECLEN (x, i); j++)
12954 mark_used_regs_combine (XVECEXP (x, i, j));
12955 }
12956 }
12957 }
12958 }
12959 \f
12960 /* Remove register number REGNO from the dead registers list of INSN.
12961
12962 Return the note used to record the death, if there was one. */
12963
12964 rtx
12965 remove_death (unsigned int regno, rtx insn)
12966 {
12967 rtx note = find_regno_note (insn, REG_DEAD, regno);
12968
12969 if (note)
12970 remove_note (insn, note);
12971
12972 return note;
12973 }
12974
12975 /* For each register (hardware or pseudo) used within expression X, if its
12976 death is in an instruction with luid between FROM_LUID (inclusive) and
12977 TO_INSN (exclusive), put a REG_DEAD note for that register in the
12978 list headed by PNOTES.
12979
12980 That said, don't move registers killed by maybe_kill_insn.
12981
12982 This is done when X is being merged by combination into TO_INSN. These
12983 notes will then be distributed as needed. */
12984
12985 static void
12986 move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx to_insn,
12987 rtx *pnotes)
12988 {
12989 const char *fmt;
12990 int len, i;
12991 enum rtx_code code = GET_CODE (x);
12992
12993 if (code == REG)
12994 {
12995 unsigned int regno = REGNO (x);
12996 rtx where_dead = reg_stat[regno].last_death;
12997
12998 /* Don't move the register if it gets killed in between from and to. */
12999 if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
13000 && ! reg_referenced_p (x, maybe_kill_insn))
13001 return;
13002
13003 if (where_dead
13004 && BLOCK_FOR_INSN (where_dead) == BLOCK_FOR_INSN (to_insn)
13005 && DF_INSN_LUID (where_dead) >= from_luid
13006 && DF_INSN_LUID (where_dead) < DF_INSN_LUID (to_insn))
13007 {
13008 rtx note = remove_death (regno, where_dead);
13009
13010 /* It is possible for the call above to return 0. This can occur
13011 when last_death points to I2 or I1 that we combined with.
13012 In that case make a new note.
13013
13014 We must also check for the case where X is a hard register
13015 and NOTE is a death note for a range of hard registers
13016 including X. In that case, we must put REG_DEAD notes for
13017 the remaining registers in place of NOTE. */
13018
13019 if (note != 0 && regno < FIRST_PSEUDO_REGISTER
13020 && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
13021 > GET_MODE_SIZE (GET_MODE (x))))
13022 {
13023 unsigned int deadregno = REGNO (XEXP (note, 0));
13024 unsigned int deadend = END_HARD_REGNO (XEXP (note, 0));
13025 unsigned int ourend = END_HARD_REGNO (x);
13026 unsigned int i;
13027
13028 for (i = deadregno; i < deadend; i++)
13029 if (i < regno || i >= ourend)
13030 add_reg_note (where_dead, REG_DEAD, regno_reg_rtx[i]);
13031 }
13032
13033 /* If we didn't find any note, or if we found a REG_DEAD note that
13034 covers only part of the given reg, and we have a multi-reg hard
13035 register, then to be safe we must check for REG_DEAD notes
13036 for each register other than the first. They could have
13037 their own REG_DEAD notes lying around. */
13038 else if ((note == 0
13039 || (note != 0
13040 && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
13041 < GET_MODE_SIZE (GET_MODE (x)))))
13042 && regno < FIRST_PSEUDO_REGISTER
13043 && hard_regno_nregs[regno][GET_MODE (x)] > 1)
13044 {
13045 unsigned int ourend = END_HARD_REGNO (x);
13046 unsigned int i, offset;
13047 rtx oldnotes = 0;
13048
13049 if (note)
13050 offset = hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))];
13051 else
13052 offset = 1;
13053
13054 for (i = regno + offset; i < ourend; i++)
13055 move_deaths (regno_reg_rtx[i],
13056 maybe_kill_insn, from_luid, to_insn, &oldnotes);
13057 }
13058
13059 if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
13060 {
13061 XEXP (note, 1) = *pnotes;
13062 *pnotes = note;
13063 }
13064 else
13065 *pnotes = alloc_reg_note (REG_DEAD, x, *pnotes);
13066 }
13067
13068 return;
13069 }
13070
13071 else if (GET_CODE (x) == SET)
13072 {
13073 rtx dest = SET_DEST (x);
13074
13075 move_deaths (SET_SRC (x), maybe_kill_insn, from_luid, to_insn, pnotes);
13076
13077 /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
13078 that accesses one word of a multi-word item, some
13079 piece of everything register in the expression is used by
13080 this insn, so remove any old death. */
13081 /* ??? So why do we test for equality of the sizes? */
13082
13083 if (GET_CODE (dest) == ZERO_EXTRACT
13084 || GET_CODE (dest) == STRICT_LOW_PART
13085 || (GET_CODE (dest) == SUBREG
13086 && (((GET_MODE_SIZE (GET_MODE (dest))
13087 + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
13088 == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
13089 + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
13090 {
13091 move_deaths (dest, maybe_kill_insn, from_luid, to_insn, pnotes);
13092 return;
13093 }
13094
13095 /* If this is some other SUBREG, we know it replaces the entire
13096 value, so use that as the destination. */
13097 if (GET_CODE (dest) == SUBREG)
13098 dest = SUBREG_REG (dest);
13099
13100 /* If this is a MEM, adjust deaths of anything used in the address.
13101 For a REG (the only other possibility), the entire value is
13102 being replaced so the old value is not used in this insn. */
13103
13104 if (MEM_P (dest))
13105 move_deaths (XEXP (dest, 0), maybe_kill_insn, from_luid,
13106 to_insn, pnotes);
13107 return;
13108 }
13109
13110 else if (GET_CODE (x) == CLOBBER)
13111 return;
13112
13113 len = GET_RTX_LENGTH (code);
13114 fmt = GET_RTX_FORMAT (code);
13115
13116 for (i = 0; i < len; i++)
13117 {
13118 if (fmt[i] == 'E')
13119 {
13120 int j;
13121 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
13122 move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_luid,
13123 to_insn, pnotes);
13124 }
13125 else if (fmt[i] == 'e')
13126 move_deaths (XEXP (x, i), maybe_kill_insn, from_luid, to_insn, pnotes);
13127 }
13128 }
13129 \f
13130 /* Return 1 if X is the target of a bit-field assignment in BODY, the
13131 pattern of an insn. X must be a REG. */
13132
13133 static int
13134 reg_bitfield_target_p (rtx x, rtx body)
13135 {
13136 int i;
13137
13138 if (GET_CODE (body) == SET)
13139 {
13140 rtx dest = SET_DEST (body);
13141 rtx target;
13142 unsigned int regno, tregno, endregno, endtregno;
13143
13144 if (GET_CODE (dest) == ZERO_EXTRACT)
13145 target = XEXP (dest, 0);
13146 else if (GET_CODE (dest) == STRICT_LOW_PART)
13147 target = SUBREG_REG (XEXP (dest, 0));
13148 else
13149 return 0;
13150
13151 if (GET_CODE (target) == SUBREG)
13152 target = SUBREG_REG (target);
13153
13154 if (!REG_P (target))
13155 return 0;
13156
13157 tregno = REGNO (target), regno = REGNO (x);
13158 if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
13159 return target == x;
13160
13161 endtregno = end_hard_regno (GET_MODE (target), tregno);
13162 endregno = end_hard_regno (GET_MODE (x), regno);
13163
13164 return endregno > tregno && regno < endtregno;
13165 }
13166
13167 else if (GET_CODE (body) == PARALLEL)
13168 for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
13169 if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
13170 return 1;
13171
13172 return 0;
13173 }
13174 \f
13175 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
13176 as appropriate. I3 and I2 are the insns resulting from the combination
13177 insns including FROM (I2 may be zero).
13178
13179 ELIM_I2 and ELIM_I1 are either zero or registers that we know will
13180 not need REG_DEAD notes because they are being substituted for. This
13181 saves searching in the most common cases.
13182
13183 Each note in the list is either ignored or placed on some insns, depending
13184 on the type of note. */
13185
13186 static void
13187 distribute_notes (rtx notes, rtx from_insn, rtx i3, rtx i2, rtx elim_i2,
13188 rtx elim_i1, rtx elim_i0)
13189 {
13190 rtx note, next_note;
13191 rtx tem;
13192
13193 for (note = notes; note; note = next_note)
13194 {
13195 rtx place = 0, place2 = 0;
13196
13197 next_note = XEXP (note, 1);
13198 switch (REG_NOTE_KIND (note))
13199 {
13200 case REG_BR_PROB:
13201 case REG_BR_PRED:
13202 /* Doesn't matter much where we put this, as long as it's somewhere.
13203 It is preferable to keep these notes on branches, which is most
13204 likely to be i3. */
13205 place = i3;
13206 break;
13207
13208 case REG_NON_LOCAL_GOTO:
13209 if (JUMP_P (i3))
13210 place = i3;
13211 else
13212 {
13213 gcc_assert (i2 && JUMP_P (i2));
13214 place = i2;
13215 }
13216 break;
13217
13218 case REG_EH_REGION:
13219 /* These notes must remain with the call or trapping instruction. */
13220 if (CALL_P (i3))
13221 place = i3;
13222 else if (i2 && CALL_P (i2))
13223 place = i2;
13224 else
13225 {
13226 gcc_assert (cfun->can_throw_non_call_exceptions);
13227 if (may_trap_p (i3))
13228 place = i3;
13229 else if (i2 && may_trap_p (i2))
13230 place = i2;
13231 /* ??? Otherwise assume we've combined things such that we
13232 can now prove that the instructions can't trap. Drop the
13233 note in this case. */
13234 }
13235 break;
13236
13237 case REG_ARGS_SIZE:
13238 /* ??? How to distribute between i3-i1. Assume i3 contains the
13239 entire adjustment. Assert i3 contains at least some adjust. */
13240 if (!noop_move_p (i3))
13241 {
13242 int old_size, args_size = INTVAL (XEXP (note, 0));
13243 /* fixup_args_size_notes looks at REG_NORETURN note,
13244 so ensure the note is placed there first. */
13245 if (CALL_P (i3))
13246 {
13247 rtx *np;
13248 for (np = &next_note; *np; np = &XEXP (*np, 1))
13249 if (REG_NOTE_KIND (*np) == REG_NORETURN)
13250 {
13251 rtx n = *np;
13252 *np = XEXP (n, 1);
13253 XEXP (n, 1) = REG_NOTES (i3);
13254 REG_NOTES (i3) = n;
13255 break;
13256 }
13257 }
13258 old_size = fixup_args_size_notes (PREV_INSN (i3), i3, args_size);
13259 /* emit_call_1 adds for !ACCUMULATE_OUTGOING_ARGS
13260 REG_ARGS_SIZE note to all noreturn calls, allow that here. */
13261 gcc_assert (old_size != args_size
13262 || (CALL_P (i3)
13263 && !ACCUMULATE_OUTGOING_ARGS
13264 && find_reg_note (i3, REG_NORETURN, NULL_RTX)));
13265 }
13266 break;
13267
13268 case REG_NORETURN:
13269 case REG_SETJMP:
13270 case REG_TM:
13271 /* These notes must remain with the call. It should not be
13272 possible for both I2 and I3 to be a call. */
13273 if (CALL_P (i3))
13274 place = i3;
13275 else
13276 {
13277 gcc_assert (i2 && CALL_P (i2));
13278 place = i2;
13279 }
13280 break;
13281
13282 case REG_UNUSED:
13283 /* Any clobbers for i3 may still exist, and so we must process
13284 REG_UNUSED notes from that insn.
13285
13286 Any clobbers from i2 or i1 can only exist if they were added by
13287 recog_for_combine. In that case, recog_for_combine created the
13288 necessary REG_UNUSED notes. Trying to keep any original
13289 REG_UNUSED notes from these insns can cause incorrect output
13290 if it is for the same register as the original i3 dest.
13291 In that case, we will notice that the register is set in i3,
13292 and then add a REG_UNUSED note for the destination of i3, which
13293 is wrong. However, it is possible to have REG_UNUSED notes from
13294 i2 or i1 for register which were both used and clobbered, so
13295 we keep notes from i2 or i1 if they will turn into REG_DEAD
13296 notes. */
13297
13298 /* If this register is set or clobbered in I3, put the note there
13299 unless there is one already. */
13300 if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
13301 {
13302 if (from_insn != i3)
13303 break;
13304
13305 if (! (REG_P (XEXP (note, 0))
13306 ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
13307 : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
13308 place = i3;
13309 }
13310 /* Otherwise, if this register is used by I3, then this register
13311 now dies here, so we must put a REG_DEAD note here unless there
13312 is one already. */
13313 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
13314 && ! (REG_P (XEXP (note, 0))
13315 ? find_regno_note (i3, REG_DEAD,
13316 REGNO (XEXP (note, 0)))
13317 : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
13318 {
13319 PUT_REG_NOTE_KIND (note, REG_DEAD);
13320 place = i3;
13321 }
13322 break;
13323
13324 case REG_EQUAL:
13325 case REG_EQUIV:
13326 case REG_NOALIAS:
13327 /* These notes say something about results of an insn. We can
13328 only support them if they used to be on I3 in which case they
13329 remain on I3. Otherwise they are ignored.
13330
13331 If the note refers to an expression that is not a constant, we
13332 must also ignore the note since we cannot tell whether the
13333 equivalence is still true. It might be possible to do
13334 slightly better than this (we only have a problem if I2DEST
13335 or I1DEST is present in the expression), but it doesn't
13336 seem worth the trouble. */
13337
13338 if (from_insn == i3
13339 && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
13340 place = i3;
13341 break;
13342
13343 case REG_INC:
13344 /* These notes say something about how a register is used. They must
13345 be present on any use of the register in I2 or I3. */
13346 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
13347 place = i3;
13348
13349 if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
13350 {
13351 if (place)
13352 place2 = i2;
13353 else
13354 place = i2;
13355 }
13356 break;
13357
13358 case REG_LABEL_TARGET:
13359 case REG_LABEL_OPERAND:
13360 /* This can show up in several ways -- either directly in the
13361 pattern, or hidden off in the constant pool with (or without?)
13362 a REG_EQUAL note. */
13363 /* ??? Ignore the without-reg_equal-note problem for now. */
13364 if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
13365 || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
13366 && GET_CODE (XEXP (tem, 0)) == LABEL_REF
13367 && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
13368 place = i3;
13369
13370 if (i2
13371 && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
13372 || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
13373 && GET_CODE (XEXP (tem, 0)) == LABEL_REF
13374 && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
13375 {
13376 if (place)
13377 place2 = i2;
13378 else
13379 place = i2;
13380 }
13381
13382 /* For REG_LABEL_TARGET on a JUMP_P, we prefer to put the note
13383 as a JUMP_LABEL or decrement LABEL_NUSES if it's already
13384 there. */
13385 if (place && JUMP_P (place)
13386 && REG_NOTE_KIND (note) == REG_LABEL_TARGET
13387 && (JUMP_LABEL (place) == NULL
13388 || JUMP_LABEL (place) == XEXP (note, 0)))
13389 {
13390 rtx label = JUMP_LABEL (place);
13391
13392 if (!label)
13393 JUMP_LABEL (place) = XEXP (note, 0);
13394 else if (LABEL_P (label))
13395 LABEL_NUSES (label)--;
13396 }
13397
13398 if (place2 && JUMP_P (place2)
13399 && REG_NOTE_KIND (note) == REG_LABEL_TARGET
13400 && (JUMP_LABEL (place2) == NULL
13401 || JUMP_LABEL (place2) == XEXP (note, 0)))
13402 {
13403 rtx label = JUMP_LABEL (place2);
13404
13405 if (!label)
13406 JUMP_LABEL (place2) = XEXP (note, 0);
13407 else if (LABEL_P (label))
13408 LABEL_NUSES (label)--;
13409 place2 = 0;
13410 }
13411 break;
13412
13413 case REG_NONNEG:
13414 /* This note says something about the value of a register prior
13415 to the execution of an insn. It is too much trouble to see
13416 if the note is still correct in all situations. It is better
13417 to simply delete it. */
13418 break;
13419
13420 case REG_DEAD:
13421 /* If we replaced the right hand side of FROM_INSN with a
13422 REG_EQUAL note, the original use of the dying register
13423 will not have been combined into I3 and I2. In such cases,
13424 FROM_INSN is guaranteed to be the first of the combined
13425 instructions, so we simply need to search back before
13426 FROM_INSN for the previous use or set of this register,
13427 then alter the notes there appropriately.
13428
13429 If the register is used as an input in I3, it dies there.
13430 Similarly for I2, if it is nonzero and adjacent to I3.
13431
13432 If the register is not used as an input in either I3 or I2
13433 and it is not one of the registers we were supposed to eliminate,
13434 there are two possibilities. We might have a non-adjacent I2
13435 or we might have somehow eliminated an additional register
13436 from a computation. For example, we might have had A & B where
13437 we discover that B will always be zero. In this case we will
13438 eliminate the reference to A.
13439
13440 In both cases, we must search to see if we can find a previous
13441 use of A and put the death note there. */
13442
13443 if (from_insn
13444 && from_insn == i2mod
13445 && !reg_overlap_mentioned_p (XEXP (note, 0), i2mod_new_rhs))
13446 tem = from_insn;
13447 else
13448 {
13449 if (from_insn
13450 && CALL_P (from_insn)
13451 && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
13452 place = from_insn;
13453 else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
13454 place = i3;
13455 else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
13456 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
13457 place = i2;
13458 else if ((rtx_equal_p (XEXP (note, 0), elim_i2)
13459 && !(i2mod
13460 && reg_overlap_mentioned_p (XEXP (note, 0),
13461 i2mod_old_rhs)))
13462 || rtx_equal_p (XEXP (note, 0), elim_i1)
13463 || rtx_equal_p (XEXP (note, 0), elim_i0))
13464 break;
13465 tem = i3;
13466 }
13467
13468 if (place == 0)
13469 {
13470 basic_block bb = this_basic_block;
13471
13472 for (tem = PREV_INSN (tem); place == 0; tem = PREV_INSN (tem))
13473 {
13474 if (!NONDEBUG_INSN_P (tem))
13475 {
13476 if (tem == BB_HEAD (bb))
13477 break;
13478 continue;
13479 }
13480
13481 /* If the register is being set at TEM, see if that is all
13482 TEM is doing. If so, delete TEM. Otherwise, make this
13483 into a REG_UNUSED note instead. Don't delete sets to
13484 global register vars. */
13485 if ((REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER
13486 || !global_regs[REGNO (XEXP (note, 0))])
13487 && reg_set_p (XEXP (note, 0), PATTERN (tem)))
13488 {
13489 rtx set = single_set (tem);
13490 rtx inner_dest = 0;
13491 #ifdef HAVE_cc0
13492 rtx cc0_setter = NULL_RTX;
13493 #endif
13494
13495 if (set != 0)
13496 for (inner_dest = SET_DEST (set);
13497 (GET_CODE (inner_dest) == STRICT_LOW_PART
13498 || GET_CODE (inner_dest) == SUBREG
13499 || GET_CODE (inner_dest) == ZERO_EXTRACT);
13500 inner_dest = XEXP (inner_dest, 0))
13501 ;
13502
13503 /* Verify that it was the set, and not a clobber that
13504 modified the register.
13505
13506 CC0 targets must be careful to maintain setter/user
13507 pairs. If we cannot delete the setter due to side
13508 effects, mark the user with an UNUSED note instead
13509 of deleting it. */
13510
13511 if (set != 0 && ! side_effects_p (SET_SRC (set))
13512 && rtx_equal_p (XEXP (note, 0), inner_dest)
13513 #ifdef HAVE_cc0
13514 && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
13515 || ((cc0_setter = prev_cc0_setter (tem)) != NULL
13516 && sets_cc0_p (PATTERN (cc0_setter)) > 0))
13517 #endif
13518 )
13519 {
13520 /* Move the notes and links of TEM elsewhere.
13521 This might delete other dead insns recursively.
13522 First set the pattern to something that won't use
13523 any register. */
13524 rtx old_notes = REG_NOTES (tem);
13525
13526 PATTERN (tem) = pc_rtx;
13527 REG_NOTES (tem) = NULL;
13528
13529 distribute_notes (old_notes, tem, tem, NULL_RTX,
13530 NULL_RTX, NULL_RTX, NULL_RTX);
13531 distribute_links (LOG_LINKS (tem));
13532
13533 SET_INSN_DELETED (tem);
13534 if (tem == i2)
13535 i2 = NULL_RTX;
13536
13537 #ifdef HAVE_cc0
13538 /* Delete the setter too. */
13539 if (cc0_setter)
13540 {
13541 PATTERN (cc0_setter) = pc_rtx;
13542 old_notes = REG_NOTES (cc0_setter);
13543 REG_NOTES (cc0_setter) = NULL;
13544
13545 distribute_notes (old_notes, cc0_setter,
13546 cc0_setter, NULL_RTX,
13547 NULL_RTX, NULL_RTX, NULL_RTX);
13548 distribute_links (LOG_LINKS (cc0_setter));
13549
13550 SET_INSN_DELETED (cc0_setter);
13551 if (cc0_setter == i2)
13552 i2 = NULL_RTX;
13553 }
13554 #endif
13555 }
13556 else
13557 {
13558 PUT_REG_NOTE_KIND (note, REG_UNUSED);
13559
13560 /* If there isn't already a REG_UNUSED note, put one
13561 here. Do not place a REG_DEAD note, even if
13562 the register is also used here; that would not
13563 match the algorithm used in lifetime analysis
13564 and can cause the consistency check in the
13565 scheduler to fail. */
13566 if (! find_regno_note (tem, REG_UNUSED,
13567 REGNO (XEXP (note, 0))))
13568 place = tem;
13569 break;
13570 }
13571 }
13572 else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
13573 || (CALL_P (tem)
13574 && find_reg_fusage (tem, USE, XEXP (note, 0))))
13575 {
13576 place = tem;
13577
13578 /* If we are doing a 3->2 combination, and we have a
13579 register which formerly died in i3 and was not used
13580 by i2, which now no longer dies in i3 and is used in
13581 i2 but does not die in i2, and place is between i2
13582 and i3, then we may need to move a link from place to
13583 i2. */
13584 if (i2 && DF_INSN_LUID (place) > DF_INSN_LUID (i2)
13585 && from_insn
13586 && DF_INSN_LUID (from_insn) > DF_INSN_LUID (i2)
13587 && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
13588 {
13589 struct insn_link *links = LOG_LINKS (place);
13590 LOG_LINKS (place) = NULL;
13591 distribute_links (links);
13592 }
13593 break;
13594 }
13595
13596 if (tem == BB_HEAD (bb))
13597 break;
13598 }
13599
13600 }
13601
13602 /* If the register is set or already dead at PLACE, we needn't do
13603 anything with this note if it is still a REG_DEAD note.
13604 We check here if it is set at all, not if is it totally replaced,
13605 which is what `dead_or_set_p' checks, so also check for it being
13606 set partially. */
13607
13608 if (place && REG_NOTE_KIND (note) == REG_DEAD)
13609 {
13610 unsigned int regno = REGNO (XEXP (note, 0));
13611 reg_stat_type *rsp = &reg_stat[regno];
13612
13613 if (dead_or_set_p (place, XEXP (note, 0))
13614 || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
13615 {
13616 /* Unless the register previously died in PLACE, clear
13617 last_death. [I no longer understand why this is
13618 being done.] */
13619 if (rsp->last_death != place)
13620 rsp->last_death = 0;
13621 place = 0;
13622 }
13623 else
13624 rsp->last_death = place;
13625
13626 /* If this is a death note for a hard reg that is occupying
13627 multiple registers, ensure that we are still using all
13628 parts of the object. If we find a piece of the object
13629 that is unused, we must arrange for an appropriate REG_DEAD
13630 note to be added for it. However, we can't just emit a USE
13631 and tag the note to it, since the register might actually
13632 be dead; so we recourse, and the recursive call then finds
13633 the previous insn that used this register. */
13634
13635 if (place && regno < FIRST_PSEUDO_REGISTER
13636 && hard_regno_nregs[regno][GET_MODE (XEXP (note, 0))] > 1)
13637 {
13638 unsigned int endregno = END_HARD_REGNO (XEXP (note, 0));
13639 bool all_used = true;
13640 unsigned int i;
13641
13642 for (i = regno; i < endregno; i++)
13643 if ((! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
13644 && ! find_regno_fusage (place, USE, i))
13645 || dead_or_set_regno_p (place, i))
13646 {
13647 all_used = false;
13648 break;
13649 }
13650
13651 if (! all_used)
13652 {
13653 /* Put only REG_DEAD notes for pieces that are
13654 not already dead or set. */
13655
13656 for (i = regno; i < endregno;
13657 i += hard_regno_nregs[i][reg_raw_mode[i]])
13658 {
13659 rtx piece = regno_reg_rtx[i];
13660 basic_block bb = this_basic_block;
13661
13662 if (! dead_or_set_p (place, piece)
13663 && ! reg_bitfield_target_p (piece,
13664 PATTERN (place)))
13665 {
13666 rtx new_note = alloc_reg_note (REG_DEAD, piece,
13667 NULL_RTX);
13668
13669 distribute_notes (new_note, place, place,
13670 NULL_RTX, NULL_RTX, NULL_RTX,
13671 NULL_RTX);
13672 }
13673 else if (! refers_to_regno_p (i, i + 1,
13674 PATTERN (place), 0)
13675 && ! find_regno_fusage (place, USE, i))
13676 for (tem = PREV_INSN (place); ;
13677 tem = PREV_INSN (tem))
13678 {
13679 if (!NONDEBUG_INSN_P (tem))
13680 {
13681 if (tem == BB_HEAD (bb))
13682 break;
13683 continue;
13684 }
13685 if (dead_or_set_p (tem, piece)
13686 || reg_bitfield_target_p (piece,
13687 PATTERN (tem)))
13688 {
13689 add_reg_note (tem, REG_UNUSED, piece);
13690 break;
13691 }
13692 }
13693 }
13694
13695 place = 0;
13696 }
13697 }
13698 }
13699 break;
13700
13701 default:
13702 /* Any other notes should not be present at this point in the
13703 compilation. */
13704 gcc_unreachable ();
13705 }
13706
13707 if (place)
13708 {
13709 XEXP (note, 1) = REG_NOTES (place);
13710 REG_NOTES (place) = note;
13711 }
13712
13713 if (place2)
13714 add_shallow_copy_of_reg_note (place2, note);
13715 }
13716 }
13717 \f
13718 /* Similarly to above, distribute the LOG_LINKS that used to be present on
13719 I3, I2, and I1 to new locations. This is also called to add a link
13720 pointing at I3 when I3's destination is changed. */
13721
13722 static void
13723 distribute_links (struct insn_link *links)
13724 {
13725 struct insn_link *link, *next_link;
13726
13727 for (link = links; link; link = next_link)
13728 {
13729 rtx place = 0;
13730 rtx insn;
13731 rtx set, reg;
13732
13733 next_link = link->next;
13734
13735 /* If the insn that this link points to is a NOTE or isn't a single
13736 set, ignore it. In the latter case, it isn't clear what we
13737 can do other than ignore the link, since we can't tell which
13738 register it was for. Such links wouldn't be used by combine
13739 anyway.
13740
13741 It is not possible for the destination of the target of the link to
13742 have been changed by combine. The only potential of this is if we
13743 replace I3, I2, and I1 by I3 and I2. But in that case the
13744 destination of I2 also remains unchanged. */
13745
13746 if (NOTE_P (link->insn)
13747 || (set = single_set (link->insn)) == 0)
13748 continue;
13749
13750 reg = SET_DEST (set);
13751 while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
13752 || GET_CODE (reg) == STRICT_LOW_PART)
13753 reg = XEXP (reg, 0);
13754
13755 /* A LOG_LINK is defined as being placed on the first insn that uses
13756 a register and points to the insn that sets the register. Start
13757 searching at the next insn after the target of the link and stop
13758 when we reach a set of the register or the end of the basic block.
13759
13760 Note that this correctly handles the link that used to point from
13761 I3 to I2. Also note that not much searching is typically done here
13762 since most links don't point very far away. */
13763
13764 for (insn = NEXT_INSN (link->insn);
13765 (insn && (this_basic_block->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
13766 || BB_HEAD (this_basic_block->next_bb) != insn));
13767 insn = NEXT_INSN (insn))
13768 if (DEBUG_INSN_P (insn))
13769 continue;
13770 else if (INSN_P (insn) && reg_overlap_mentioned_p (reg, PATTERN (insn)))
13771 {
13772 if (reg_referenced_p (reg, PATTERN (insn)))
13773 place = insn;
13774 break;
13775 }
13776 else if (CALL_P (insn)
13777 && find_reg_fusage (insn, USE, reg))
13778 {
13779 place = insn;
13780 break;
13781 }
13782 else if (INSN_P (insn) && reg_set_p (reg, insn))
13783 break;
13784
13785 /* If we found a place to put the link, place it there unless there
13786 is already a link to the same insn as LINK at that point. */
13787
13788 if (place)
13789 {
13790 struct insn_link *link2;
13791
13792 FOR_EACH_LOG_LINK (link2, place)
13793 if (link2->insn == link->insn)
13794 break;
13795
13796 if (link2 == NULL)
13797 {
13798 link->next = LOG_LINKS (place);
13799 LOG_LINKS (place) = link;
13800
13801 /* Set added_links_insn to the earliest insn we added a
13802 link to. */
13803 if (added_links_insn == 0
13804 || DF_INSN_LUID (added_links_insn) > DF_INSN_LUID (place))
13805 added_links_insn = place;
13806 }
13807 }
13808 }
13809 }
13810 \f
13811 /* Subroutine of unmentioned_reg_p and callback from for_each_rtx.
13812 Check whether the expression pointer to by LOC is a register or
13813 memory, and if so return 1 if it isn't mentioned in the rtx EXPR.
13814 Otherwise return zero. */
13815
13816 static int
13817 unmentioned_reg_p_1 (rtx *loc, void *expr)
13818 {
13819 rtx x = *loc;
13820
13821 if (x != NULL_RTX
13822 && (REG_P (x) || MEM_P (x))
13823 && ! reg_mentioned_p (x, (rtx) expr))
13824 return 1;
13825 return 0;
13826 }
13827
13828 /* Check for any register or memory mentioned in EQUIV that is not
13829 mentioned in EXPR. This is used to restrict EQUIV to "specializations"
13830 of EXPR where some registers may have been replaced by constants. */
13831
13832 static bool
13833 unmentioned_reg_p (rtx equiv, rtx expr)
13834 {
13835 return for_each_rtx (&equiv, unmentioned_reg_p_1, expr);
13836 }
13837 \f
13838 DEBUG_FUNCTION void
13839 dump_combine_stats (FILE *file)
13840 {
13841 fprintf
13842 (file,
13843 ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
13844 combine_attempts, combine_merges, combine_extras, combine_successes);
13845 }
13846
13847 void
13848 dump_combine_total_stats (FILE *file)
13849 {
13850 fprintf
13851 (file,
13852 "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
13853 total_attempts, total_merges, total_extras, total_successes);
13854 }
13855 \f
13856 static bool
13857 gate_handle_combine (void)
13858 {
13859 return (optimize > 0);
13860 }
13861
13862 /* Try combining insns through substitution. */
13863 static unsigned int
13864 rest_of_handle_combine (void)
13865 {
13866 int rebuild_jump_labels_after_combine;
13867
13868 df_set_flags (DF_LR_RUN_DCE + DF_DEFER_INSN_RESCAN);
13869 df_note_add_problem ();
13870 df_analyze ();
13871
13872 regstat_init_n_sets_and_refs ();
13873
13874 rebuild_jump_labels_after_combine
13875 = combine_instructions (get_insns (), max_reg_num ());
13876
13877 /* Combining insns may have turned an indirect jump into a
13878 direct jump. Rebuild the JUMP_LABEL fields of jumping
13879 instructions. */
13880 if (rebuild_jump_labels_after_combine)
13881 {
13882 timevar_push (TV_JUMP);
13883 rebuild_jump_labels (get_insns ());
13884 cleanup_cfg (0);
13885 timevar_pop (TV_JUMP);
13886 }
13887
13888 regstat_free_n_sets_and_refs ();
13889 return 0;
13890 }
13891
13892 namespace {
13893
13894 const pass_data pass_data_combine =
13895 {
13896 RTL_PASS, /* type */
13897 "combine", /* name */
13898 OPTGROUP_NONE, /* optinfo_flags */
13899 true, /* has_gate */
13900 true, /* has_execute */
13901 TV_COMBINE, /* tv_id */
13902 PROP_cfglayout, /* properties_required */
13903 0, /* properties_provided */
13904 0, /* properties_destroyed */
13905 0, /* todo_flags_start */
13906 ( TODO_df_finish | TODO_verify_rtl_sharing ), /* todo_flags_finish */
13907 };
13908
13909 class pass_combine : public rtl_opt_pass
13910 {
13911 public:
13912 pass_combine (gcc::context *ctxt)
13913 : rtl_opt_pass (pass_data_combine, ctxt)
13914 {}
13915
13916 /* opt_pass methods: */
13917 bool gate () { return gate_handle_combine (); }
13918 unsigned int execute () { return rest_of_handle_combine (); }
13919
13920 }; // class pass_combine
13921
13922 } // anon namespace
13923
13924 rtl_opt_pass *
13925 make_pass_combine (gcc::context *ctxt)
13926 {
13927 return new pass_combine (ctxt);
13928 }