OSDN Git Service

a47c36f0b099c8e86e5cbf824fdf261a348c6db0
[pf3gnuchains/gcc-fork.git] / gcc / rtlanal.c
1 /* Analyze RTL for GNU compiler.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
4    Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "toplev.h"
28 #include "rtl.h"
29 #include "hard-reg-set.h"
30 #include "insn-config.h"
31 #include "recog.h"
32 #include "target.h"
33 #include "output.h"
34 #include "tm_p.h"
35 #include "flags.h"
36 #include "real.h"
37 #include "regs.h"
38 #include "function.h"
39 #include "df.h"
40 #include "tree.h"
41
42 /* Information about a subreg of a hard register.  */
43 struct subreg_info
44 {
45   /* Offset of first hard register involved in the subreg.  */
46   int offset;
47   /* Number of hard registers involved in the subreg.  */
48   int nregs;
49   /* Whether this subreg can be represented as a hard reg with the new
50      mode.  */
51   bool representable_p;
52 };
53
54 /* Forward declarations */
55 static void set_of_1 (rtx, const_rtx, void *);
56 static bool covers_regno_p (const_rtx, unsigned int);
57 static bool covers_regno_no_parallel_p (const_rtx, unsigned int);
58 static int rtx_referenced_p_1 (rtx *, void *);
59 static int computed_jump_p_1 (const_rtx);
60 static void parms_set (rtx, const_rtx, void *);
61 static void subreg_get_info (unsigned int, enum machine_mode,
62                              unsigned int, enum machine_mode,
63                              struct subreg_info *);
64
65 static unsigned HOST_WIDE_INT cached_nonzero_bits (const_rtx, enum machine_mode,
66                                                    const_rtx, enum machine_mode,
67                                                    unsigned HOST_WIDE_INT);
68 static unsigned HOST_WIDE_INT nonzero_bits1 (const_rtx, enum machine_mode,
69                                              const_rtx, enum machine_mode,
70                                              unsigned HOST_WIDE_INT);
71 static unsigned int cached_num_sign_bit_copies (const_rtx, enum machine_mode, const_rtx,
72                                                 enum machine_mode,
73                                                 unsigned int);
74 static unsigned int num_sign_bit_copies1 (const_rtx, enum machine_mode, const_rtx,
75                                           enum machine_mode, unsigned int);
76
77 /* Offset of the first 'e', 'E' or 'V' operand for each rtx code, or
78    -1 if a code has no such operand.  */
79 static int non_rtx_starting_operands[NUM_RTX_CODE];
80
81 /* Bit flags that specify the machine subtype we are compiling for.
82    Bits are tested using macros TARGET_... defined in the tm.h file
83    and set by `-m...' switches.  Must be defined in rtlanal.c.  */
84
85 int target_flags;
86
87 /* Truncation narrows the mode from SOURCE mode to DESTINATION mode.
88    If TARGET_MODE_REP_EXTENDED (DESTINATION, DESTINATION_REP) is
89    SIGN_EXTEND then while narrowing we also have to enforce the
90    representation and sign-extend the value to mode DESTINATION_REP.
91
92    If the value is already sign-extended to DESTINATION_REP mode we
93    can just switch to DESTINATION mode on it.  For each pair of
94    integral modes SOURCE and DESTINATION, when truncating from SOURCE
95    to DESTINATION, NUM_SIGN_BIT_COPIES_IN_REP[SOURCE][DESTINATION]
96    contains the number of high-order bits in SOURCE that have to be
97    copies of the sign-bit so that we can do this mode-switch to
98    DESTINATION.  */
99
100 static unsigned int
101 num_sign_bit_copies_in_rep[MAX_MODE_INT + 1][MAX_MODE_INT + 1];
102 \f
103 /* Return 1 if the value of X is unstable
104    (would be different at a different point in the program).
105    The frame pointer, arg pointer, etc. are considered stable
106    (within one function) and so is anything marked `unchanging'.  */
107
108 int
109 rtx_unstable_p (const_rtx x)
110 {
111   const RTX_CODE code = GET_CODE (x);
112   int i;
113   const char *fmt;
114
115   switch (code)
116     {
117     case MEM:
118       return !MEM_READONLY_P (x) || rtx_unstable_p (XEXP (x, 0));
119
120     case CONST:
121     case CONST_INT:
122     case CONST_DOUBLE:
123     case CONST_FIXED:
124     case CONST_VECTOR:
125     case SYMBOL_REF:
126     case LABEL_REF:
127       return 0;
128
129     case REG:
130       /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
131       if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
132           /* The arg pointer varies if it is not a fixed register.  */
133           || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
134         return 0;
135 #ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
136       /* ??? When call-clobbered, the value is stable modulo the restore
137          that must happen after a call.  This currently screws up local-alloc
138          into believing that the restore is not needed.  */
139       if (x == pic_offset_table_rtx)
140         return 0;
141 #endif
142       return 1;
143
144     case ASM_OPERANDS:
145       if (MEM_VOLATILE_P (x))
146         return 1;
147
148       /* Fall through.  */
149
150     default:
151       break;
152     }
153
154   fmt = GET_RTX_FORMAT (code);
155   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
156     if (fmt[i] == 'e')
157       {
158         if (rtx_unstable_p (XEXP (x, i)))
159           return 1;
160       }
161     else if (fmt[i] == 'E')
162       {
163         int j;
164         for (j = 0; j < XVECLEN (x, i); j++)
165           if (rtx_unstable_p (XVECEXP (x, i, j)))
166             return 1;
167       }
168
169   return 0;
170 }
171
172 /* Return 1 if X has a value that can vary even between two
173    executions of the program.  0 means X can be compared reliably
174    against certain constants or near-constants.
175    FOR_ALIAS is nonzero if we are called from alias analysis; if it is
176    zero, we are slightly more conservative.
177    The frame pointer and the arg pointer are considered constant.  */
178
179 bool
180 rtx_varies_p (const_rtx x, bool for_alias)
181 {
182   RTX_CODE code;
183   int i;
184   const char *fmt;
185
186   if (!x)
187     return 0;
188
189   code = GET_CODE (x);
190   switch (code)
191     {
192     case MEM:
193       return !MEM_READONLY_P (x) || rtx_varies_p (XEXP (x, 0), for_alias);
194
195     case CONST:
196     case CONST_INT:
197     case CONST_DOUBLE:
198     case CONST_FIXED:
199     case CONST_VECTOR:
200     case SYMBOL_REF:
201     case LABEL_REF:
202       return 0;
203
204     case REG:
205       /* Note that we have to test for the actual rtx used for the frame
206          and arg pointers and not just the register number in case we have
207          eliminated the frame and/or arg pointer and are using it
208          for pseudos.  */
209       if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
210           /* The arg pointer varies if it is not a fixed register.  */
211           || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
212         return 0;
213       if (x == pic_offset_table_rtx
214 #ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
215           /* ??? When call-clobbered, the value is stable modulo the restore
216              that must happen after a call.  This currently screws up
217              local-alloc into believing that the restore is not needed, so we
218              must return 0 only if we are called from alias analysis.  */
219           && for_alias
220 #endif
221           )
222         return 0;
223       return 1;
224
225     case LO_SUM:
226       /* The operand 0 of a LO_SUM is considered constant
227          (in fact it is related specifically to operand 1)
228          during alias analysis.  */
229       return (! for_alias && rtx_varies_p (XEXP (x, 0), for_alias))
230              || rtx_varies_p (XEXP (x, 1), for_alias);
231
232     case ASM_OPERANDS:
233       if (MEM_VOLATILE_P (x))
234         return 1;
235
236       /* Fall through.  */
237
238     default:
239       break;
240     }
241
242   fmt = GET_RTX_FORMAT (code);
243   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
244     if (fmt[i] == 'e')
245       {
246         if (rtx_varies_p (XEXP (x, i), for_alias))
247           return 1;
248       }
249     else if (fmt[i] == 'E')
250       {
251         int j;
252         for (j = 0; j < XVECLEN (x, i); j++)
253           if (rtx_varies_p (XVECEXP (x, i, j), for_alias))
254             return 1;
255       }
256
257   return 0;
258 }
259
260 /* Return nonzero if the use of X as an address in a MEM can cause a trap.
261    MODE is the mode of the MEM (not that of X) and UNALIGNED_MEMS controls
262    whether nonzero is returned for unaligned memory accesses on strict
263    alignment machines.  */
264
265 static int
266 rtx_addr_can_trap_p_1 (const_rtx x, enum machine_mode mode, bool unaligned_mems)
267 {
268   enum rtx_code code = GET_CODE (x);
269
270   switch (code)
271     {
272     case SYMBOL_REF:
273       return SYMBOL_REF_WEAK (x);
274
275     case LABEL_REF:
276       return 0;
277
278     case REG:
279       /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
280       if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
281           || x == stack_pointer_rtx
282           /* The arg pointer varies if it is not a fixed register.  */
283           || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
284         return 0;
285       /* All of the virtual frame registers are stack references.  */
286       if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
287           && REGNO (x) <= LAST_VIRTUAL_REGISTER)
288         return 0;
289       return 1;
290
291     case CONST:
292       return rtx_addr_can_trap_p_1 (XEXP (x, 0), mode, unaligned_mems);
293
294     case PLUS:
295       /* An address is assumed not to trap if:
296          - it is an address that can't trap plus a constant integer,
297            with the proper remainder modulo the mode size if we are
298            considering unaligned memory references.  */
299       if (!rtx_addr_can_trap_p_1 (XEXP (x, 0), mode, unaligned_mems)
300           && GET_CODE (XEXP (x, 1)) == CONST_INT)
301         {
302           HOST_WIDE_INT offset;
303
304           if (!STRICT_ALIGNMENT
305               || !unaligned_mems
306               || GET_MODE_SIZE (mode) == 0)
307             return 0;
308
309           offset = INTVAL (XEXP (x, 1));
310
311 #ifdef SPARC_STACK_BOUNDARY_HACK
312           /* ??? The SPARC port may claim a STACK_BOUNDARY higher than
313              the real alignment of %sp.  However, when it does this, the
314              alignment of %sp+STACK_POINTER_OFFSET is STACK_BOUNDARY.  */
315           if (SPARC_STACK_BOUNDARY_HACK
316               && (XEXP (x, 0) == stack_pointer_rtx
317                   || XEXP (x, 0) == hard_frame_pointer_rtx))
318             offset -= STACK_POINTER_OFFSET;
319 #endif
320
321           return offset % GET_MODE_SIZE (mode) != 0;
322         }
323
324       /* - or it is the pic register plus a constant.  */
325       if (XEXP (x, 0) == pic_offset_table_rtx && CONSTANT_P (XEXP (x, 1)))
326         return 0;
327
328       return 1;
329
330     case LO_SUM:
331     case PRE_MODIFY:
332       return rtx_addr_can_trap_p_1 (XEXP (x, 1), mode, unaligned_mems);
333
334     case PRE_DEC:
335     case PRE_INC:
336     case POST_DEC:
337     case POST_INC:
338     case POST_MODIFY:
339       return rtx_addr_can_trap_p_1 (XEXP (x, 0), mode, unaligned_mems);
340
341     default:
342       break;
343     }
344
345   /* If it isn't one of the case above, it can cause a trap.  */
346   return 1;
347 }
348
349 /* Return nonzero if the use of X as an address in a MEM can cause a trap.  */
350
351 int
352 rtx_addr_can_trap_p (const_rtx x)
353 {
354   return rtx_addr_can_trap_p_1 (x, VOIDmode, false);
355 }
356
357 /* Return true if X is an address that is known to not be zero.  */
358
359 bool
360 nonzero_address_p (const_rtx x)
361 {
362   const enum rtx_code code = GET_CODE (x);
363
364   switch (code)
365     {
366     case SYMBOL_REF:
367       return !SYMBOL_REF_WEAK (x);
368
369     case LABEL_REF:
370       return true;
371
372     case REG:
373       /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
374       if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
375           || x == stack_pointer_rtx
376           || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
377         return true;
378       /* All of the virtual frame registers are stack references.  */
379       if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
380           && REGNO (x) <= LAST_VIRTUAL_REGISTER)
381         return true;
382       return false;
383
384     case CONST:
385       return nonzero_address_p (XEXP (x, 0));
386
387     case PLUS:
388       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
389         return nonzero_address_p (XEXP (x, 0));
390       /* Handle PIC references.  */
391       else if (XEXP (x, 0) == pic_offset_table_rtx
392                && CONSTANT_P (XEXP (x, 1)))
393         return true;
394       return false;
395
396     case PRE_MODIFY:
397       /* Similar to the above; allow positive offsets.  Further, since
398          auto-inc is only allowed in memories, the register must be a
399          pointer.  */
400       if (GET_CODE (XEXP (x, 1)) == CONST_INT
401           && INTVAL (XEXP (x, 1)) > 0)
402         return true;
403       return nonzero_address_p (XEXP (x, 0));
404
405     case PRE_INC:
406       /* Similarly.  Further, the offset is always positive.  */
407       return true;
408
409     case PRE_DEC:
410     case POST_DEC:
411     case POST_INC:
412     case POST_MODIFY:
413       return nonzero_address_p (XEXP (x, 0));
414
415     case LO_SUM:
416       return nonzero_address_p (XEXP (x, 1));
417
418     default:
419       break;
420     }
421
422   /* If it isn't one of the case above, might be zero.  */
423   return false;
424 }
425
426 /* Return 1 if X refers to a memory location whose address
427    cannot be compared reliably with constant addresses,
428    or if X refers to a BLKmode memory object.
429    FOR_ALIAS is nonzero if we are called from alias analysis; if it is
430    zero, we are slightly more conservative.  */
431
432 bool
433 rtx_addr_varies_p (const_rtx x, bool for_alias)
434 {
435   enum rtx_code code;
436   int i;
437   const char *fmt;
438
439   if (x == 0)
440     return 0;
441
442   code = GET_CODE (x);
443   if (code == MEM)
444     return GET_MODE (x) == BLKmode || rtx_varies_p (XEXP (x, 0), for_alias);
445
446   fmt = GET_RTX_FORMAT (code);
447   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
448     if (fmt[i] == 'e')
449       {
450         if (rtx_addr_varies_p (XEXP (x, i), for_alias))
451           return 1;
452       }
453     else if (fmt[i] == 'E')
454       {
455         int j;
456         for (j = 0; j < XVECLEN (x, i); j++)
457           if (rtx_addr_varies_p (XVECEXP (x, i, j), for_alias))
458             return 1;
459       }
460   return 0;
461 }
462 \f
463 /* Return the value of the integer term in X, if one is apparent;
464    otherwise return 0.
465    Only obvious integer terms are detected.
466    This is used in cse.c with the `related_value' field.  */
467
468 HOST_WIDE_INT
469 get_integer_term (const_rtx x)
470 {
471   if (GET_CODE (x) == CONST)
472     x = XEXP (x, 0);
473
474   if (GET_CODE (x) == MINUS
475       && GET_CODE (XEXP (x, 1)) == CONST_INT)
476     return - INTVAL (XEXP (x, 1));
477   if (GET_CODE (x) == PLUS
478       && GET_CODE (XEXP (x, 1)) == CONST_INT)
479     return INTVAL (XEXP (x, 1));
480   return 0;
481 }
482
483 /* If X is a constant, return the value sans apparent integer term;
484    otherwise return 0.
485    Only obvious integer terms are detected.  */
486
487 rtx
488 get_related_value (const_rtx x)
489 {
490   if (GET_CODE (x) != CONST)
491     return 0;
492   x = XEXP (x, 0);
493   if (GET_CODE (x) == PLUS
494       && GET_CODE (XEXP (x, 1)) == CONST_INT)
495     return XEXP (x, 0);
496   else if (GET_CODE (x) == MINUS
497            && GET_CODE (XEXP (x, 1)) == CONST_INT)
498     return XEXP (x, 0);
499   return 0;
500 }
501 \f
502 /* Return true if SYMBOL is a SYMBOL_REF and OFFSET + SYMBOL points
503    to somewhere in the same object or object_block as SYMBOL.  */
504
505 bool
506 offset_within_block_p (const_rtx symbol, HOST_WIDE_INT offset)
507 {
508   tree decl;
509
510   if (GET_CODE (symbol) != SYMBOL_REF)
511     return false;
512
513   if (offset == 0)
514     return true;
515
516   if (offset > 0)
517     {
518       if (CONSTANT_POOL_ADDRESS_P (symbol)
519           && offset < (int) GET_MODE_SIZE (get_pool_mode (symbol)))
520         return true;
521
522       decl = SYMBOL_REF_DECL (symbol);
523       if (decl && offset < int_size_in_bytes (TREE_TYPE (decl)))
524         return true;
525     }
526
527   if (SYMBOL_REF_HAS_BLOCK_INFO_P (symbol)
528       && SYMBOL_REF_BLOCK (symbol)
529       && SYMBOL_REF_BLOCK_OFFSET (symbol) >= 0
530       && ((unsigned HOST_WIDE_INT) offset + SYMBOL_REF_BLOCK_OFFSET (symbol)
531           < (unsigned HOST_WIDE_INT) SYMBOL_REF_BLOCK (symbol)->size))
532     return true;
533
534   return false;
535 }
536
537 /* Split X into a base and a constant offset, storing them in *BASE_OUT
538    and *OFFSET_OUT respectively.  */
539
540 void
541 split_const (rtx x, rtx *base_out, rtx *offset_out)
542 {
543   if (GET_CODE (x) == CONST)
544     {
545       x = XEXP (x, 0);
546       if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
547         {
548           *base_out = XEXP (x, 0);
549           *offset_out = XEXP (x, 1);
550           return;
551         }
552     }
553   *base_out = x;
554   *offset_out = const0_rtx;
555 }
556 \f
557 /* Return the number of places FIND appears within X.  If COUNT_DEST is
558    zero, we do not count occurrences inside the destination of a SET.  */
559
560 int
561 count_occurrences (const_rtx x, const_rtx find, int count_dest)
562 {
563   int i, j;
564   enum rtx_code code;
565   const char *format_ptr;
566   int count;
567
568   if (x == find)
569     return 1;
570
571   code = GET_CODE (x);
572
573   switch (code)
574     {
575     case REG:
576     case CONST_INT:
577     case CONST_DOUBLE:
578     case CONST_FIXED:
579     case CONST_VECTOR:
580     case SYMBOL_REF:
581     case CODE_LABEL:
582     case PC:
583     case CC0:
584       return 0;
585
586     case EXPR_LIST:
587       count = count_occurrences (XEXP (x, 0), find, count_dest);
588       if (XEXP (x, 1))
589         count += count_occurrences (XEXP (x, 1), find, count_dest);
590       return count;
591         
592     case MEM:
593       if (MEM_P (find) && rtx_equal_p (x, find))
594         return 1;
595       break;
596
597     case SET:
598       if (SET_DEST (x) == find && ! count_dest)
599         return count_occurrences (SET_SRC (x), find, count_dest);
600       break;
601
602     default:
603       break;
604     }
605
606   format_ptr = GET_RTX_FORMAT (code);
607   count = 0;
608
609   for (i = 0; i < GET_RTX_LENGTH (code); i++)
610     {
611       switch (*format_ptr++)
612         {
613         case 'e':
614           count += count_occurrences (XEXP (x, i), find, count_dest);
615           break;
616
617         case 'E':
618           for (j = 0; j < XVECLEN (x, i); j++)
619             count += count_occurrences (XVECEXP (x, i, j), find, count_dest);
620           break;
621         }
622     }
623   return count;
624 }
625
626 \f
627 /* Nonzero if register REG appears somewhere within IN.
628    Also works if REG is not a register; in this case it checks
629    for a subexpression of IN that is Lisp "equal" to REG.  */
630
631 int
632 reg_mentioned_p (const_rtx reg, const_rtx in)
633 {
634   const char *fmt;
635   int i;
636   enum rtx_code code;
637
638   if (in == 0)
639     return 0;
640
641   if (reg == in)
642     return 1;
643
644   if (GET_CODE (in) == LABEL_REF)
645     return reg == XEXP (in, 0);
646
647   code = GET_CODE (in);
648
649   switch (code)
650     {
651       /* Compare registers by number.  */
652     case REG:
653       return REG_P (reg) && REGNO (in) == REGNO (reg);
654
655       /* These codes have no constituent expressions
656          and are unique.  */
657     case SCRATCH:
658     case CC0:
659     case PC:
660       return 0;
661
662     case CONST_INT:
663     case CONST_VECTOR:
664     case CONST_DOUBLE:
665     case CONST_FIXED:
666       /* These are kept unique for a given value.  */
667       return 0;
668
669     default:
670       break;
671     }
672
673   if (GET_CODE (reg) == code && rtx_equal_p (reg, in))
674     return 1;
675
676   fmt = GET_RTX_FORMAT (code);
677
678   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
679     {
680       if (fmt[i] == 'E')
681         {
682           int j;
683           for (j = XVECLEN (in, i) - 1; j >= 0; j--)
684             if (reg_mentioned_p (reg, XVECEXP (in, i, j)))
685               return 1;
686         }
687       else if (fmt[i] == 'e'
688                && reg_mentioned_p (reg, XEXP (in, i)))
689         return 1;
690     }
691   return 0;
692 }
693 \f
694 /* Return 1 if in between BEG and END, exclusive of BEG and END, there is
695    no CODE_LABEL insn.  */
696
697 int
698 no_labels_between_p (const_rtx beg, const_rtx end)
699 {
700   rtx p;
701   if (beg == end)
702     return 0;
703   for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
704     if (LABEL_P (p))
705       return 0;
706   return 1;
707 }
708
709 /* Nonzero if register REG is used in an insn between
710    FROM_INSN and TO_INSN (exclusive of those two).  */
711
712 int
713 reg_used_between_p (const_rtx reg, const_rtx from_insn, const_rtx to_insn)
714 {
715   rtx insn;
716
717   if (from_insn == to_insn)
718     return 0;
719
720   for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
721     if (INSN_P (insn)
722         && (reg_overlap_mentioned_p (reg, PATTERN (insn))
723            || (CALL_P (insn) && find_reg_fusage (insn, USE, reg))))
724       return 1;
725   return 0;
726 }
727 \f
728 /* Nonzero if the old value of X, a register, is referenced in BODY.  If X
729    is entirely replaced by a new value and the only use is as a SET_DEST,
730    we do not consider it a reference.  */
731
732 int
733 reg_referenced_p (const_rtx x, const_rtx body)
734 {
735   int i;
736
737   switch (GET_CODE (body))
738     {
739     case SET:
740       if (reg_overlap_mentioned_p (x, SET_SRC (body)))
741         return 1;
742
743       /* If the destination is anything other than CC0, PC, a REG or a SUBREG
744          of a REG that occupies all of the REG, the insn references X if
745          it is mentioned in the destination.  */
746       if (GET_CODE (SET_DEST (body)) != CC0
747           && GET_CODE (SET_DEST (body)) != PC
748           && !REG_P (SET_DEST (body))
749           && ! (GET_CODE (SET_DEST (body)) == SUBREG
750                 && REG_P (SUBREG_REG (SET_DEST (body)))
751                 && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body))))
752                       + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
753                     == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body)))
754                          + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
755           && reg_overlap_mentioned_p (x, SET_DEST (body)))
756         return 1;
757       return 0;
758
759     case ASM_OPERANDS:
760       for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
761         if (reg_overlap_mentioned_p (x, ASM_OPERANDS_INPUT (body, i)))
762           return 1;
763       return 0;
764
765     case CALL:
766     case USE:
767     case IF_THEN_ELSE:
768       return reg_overlap_mentioned_p (x, body);
769
770     case TRAP_IF:
771       return reg_overlap_mentioned_p (x, TRAP_CONDITION (body));
772
773     case PREFETCH:
774       return reg_overlap_mentioned_p (x, XEXP (body, 0));
775
776     case UNSPEC:
777     case UNSPEC_VOLATILE:
778       for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
779         if (reg_overlap_mentioned_p (x, XVECEXP (body, 0, i)))
780           return 1;
781       return 0;
782
783     case PARALLEL:
784       for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
785         if (reg_referenced_p (x, XVECEXP (body, 0, i)))
786           return 1;
787       return 0;
788
789     case CLOBBER:
790       if (MEM_P (XEXP (body, 0)))
791         if (reg_overlap_mentioned_p (x, XEXP (XEXP (body, 0), 0)))
792           return 1;
793       return 0;
794
795     case COND_EXEC:
796       if (reg_overlap_mentioned_p (x, COND_EXEC_TEST (body)))
797         return 1;
798       return reg_referenced_p (x, COND_EXEC_CODE (body));
799
800     default:
801       return 0;
802     }
803 }
804 \f
805 /* Nonzero if register REG is set or clobbered in an insn between
806    FROM_INSN and TO_INSN (exclusive of those two).  */
807
808 int
809 reg_set_between_p (const_rtx reg, const_rtx from_insn, const_rtx to_insn)
810 {
811   const_rtx insn;
812
813   if (from_insn == to_insn)
814     return 0;
815
816   for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
817     if (INSN_P (insn) && reg_set_p (reg, insn))
818       return 1;
819   return 0;
820 }
821
822 /* Internals of reg_set_between_p.  */
823 int
824 reg_set_p (const_rtx reg, const_rtx insn)
825 {
826   /* We can be passed an insn or part of one.  If we are passed an insn,
827      check if a side-effect of the insn clobbers REG.  */
828   if (INSN_P (insn)
829       && (FIND_REG_INC_NOTE (insn, reg)
830           || (CALL_P (insn)
831               && ((REG_P (reg)
832                    && REGNO (reg) < FIRST_PSEUDO_REGISTER
833                    && overlaps_hard_reg_set_p (regs_invalidated_by_call,
834                                                GET_MODE (reg), REGNO (reg)))
835                   || MEM_P (reg)
836                   || find_reg_fusage (insn, CLOBBER, reg)))))
837     return 1;
838
839   return set_of (reg, insn) != NULL_RTX;
840 }
841
842 /* Similar to reg_set_between_p, but check all registers in X.  Return 0
843    only if none of them are modified between START and END.  Return 1 if
844    X contains a MEM; this routine does usememory aliasing.  */
845
846 int
847 modified_between_p (const_rtx x, const_rtx start, const_rtx end)
848 {
849   const enum rtx_code code = GET_CODE (x);
850   const char *fmt;
851   int i, j;
852   rtx insn;
853
854   if (start == end)
855     return 0;
856
857   switch (code)
858     {
859     case CONST_INT:
860     case CONST_DOUBLE:
861     case CONST_FIXED:
862     case CONST_VECTOR:
863     case CONST:
864     case SYMBOL_REF:
865     case LABEL_REF:
866       return 0;
867
868     case PC:
869     case CC0:
870       return 1;
871
872     case MEM:
873       if (modified_between_p (XEXP (x, 0), start, end))
874         return 1;
875       if (MEM_READONLY_P (x))
876         return 0;
877       for (insn = NEXT_INSN (start); insn != end; insn = NEXT_INSN (insn))
878         if (memory_modified_in_insn_p (x, insn))
879           return 1;
880       return 0;
881       break;
882
883     case REG:
884       return reg_set_between_p (x, start, end);
885
886     default:
887       break;
888     }
889
890   fmt = GET_RTX_FORMAT (code);
891   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
892     {
893       if (fmt[i] == 'e' && modified_between_p (XEXP (x, i), start, end))
894         return 1;
895
896       else if (fmt[i] == 'E')
897         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
898           if (modified_between_p (XVECEXP (x, i, j), start, end))
899             return 1;
900     }
901
902   return 0;
903 }
904
905 /* Similar to reg_set_p, but check all registers in X.  Return 0 only if none
906    of them are modified in INSN.  Return 1 if X contains a MEM; this routine
907    does use memory aliasing.  */
908
909 int
910 modified_in_p (const_rtx x, const_rtx insn)
911 {
912   const enum rtx_code code = GET_CODE (x);
913   const char *fmt;
914   int i, j;
915
916   switch (code)
917     {
918     case CONST_INT:
919     case CONST_DOUBLE:
920     case CONST_FIXED:
921     case CONST_VECTOR:
922     case CONST:
923     case SYMBOL_REF:
924     case LABEL_REF:
925       return 0;
926
927     case PC:
928     case CC0:
929       return 1;
930
931     case MEM:
932       if (modified_in_p (XEXP (x, 0), insn))
933         return 1;
934       if (MEM_READONLY_P (x))
935         return 0;
936       if (memory_modified_in_insn_p (x, insn))
937         return 1;
938       return 0;
939       break;
940
941     case REG:
942       return reg_set_p (x, insn);
943
944     default:
945       break;
946     }
947
948   fmt = GET_RTX_FORMAT (code);
949   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
950     {
951       if (fmt[i] == 'e' && modified_in_p (XEXP (x, i), insn))
952         return 1;
953
954       else if (fmt[i] == 'E')
955         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
956           if (modified_in_p (XVECEXP (x, i, j), insn))
957             return 1;
958     }
959
960   return 0;
961 }
962 \f
963 /* Helper function for set_of.  */
964 struct set_of_data
965   {
966     const_rtx found;
967     const_rtx pat;
968   };
969
970 static void
971 set_of_1 (rtx x, const_rtx pat, void *data1)
972 {
973   struct set_of_data *const data = (struct set_of_data *) (data1);
974   if (rtx_equal_p (x, data->pat)
975       || (!MEM_P (x) && reg_overlap_mentioned_p (data->pat, x)))
976     data->found = pat;
977 }
978
979 /* Give an INSN, return a SET or CLOBBER expression that does modify PAT
980    (either directly or via STRICT_LOW_PART and similar modifiers).  */
981 const_rtx
982 set_of (const_rtx pat, const_rtx insn)
983 {
984   struct set_of_data data;
985   data.found = NULL_RTX;
986   data.pat = pat;
987   note_stores (INSN_P (insn) ? PATTERN (insn) : insn, set_of_1, &data);
988   return data.found;
989 }
990 \f
991 /* Given an INSN, return a SET expression if this insn has only a single SET.
992    It may also have CLOBBERs, USEs, or SET whose output
993    will not be used, which we ignore.  */
994
995 rtx
996 single_set_2 (const_rtx insn, const_rtx pat)
997 {
998   rtx set = NULL;
999   int set_verified = 1;
1000   int i;
1001
1002   if (GET_CODE (pat) == PARALLEL)
1003     {
1004       for (i = 0; i < XVECLEN (pat, 0); i++)
1005         {
1006           rtx sub = XVECEXP (pat, 0, i);
1007           switch (GET_CODE (sub))
1008             {
1009             case USE:
1010             case CLOBBER:
1011               break;
1012
1013             case SET:
1014               /* We can consider insns having multiple sets, where all
1015                  but one are dead as single set insns.  In common case
1016                  only single set is present in the pattern so we want
1017                  to avoid checking for REG_UNUSED notes unless necessary.
1018
1019                  When we reach set first time, we just expect this is
1020                  the single set we are looking for and only when more
1021                  sets are found in the insn, we check them.  */
1022               if (!set_verified)
1023                 {
1024                   if (find_reg_note (insn, REG_UNUSED, SET_DEST (set))
1025                       && !side_effects_p (set))
1026                     set = NULL;
1027                   else
1028                     set_verified = 1;
1029                 }
1030               if (!set)
1031                 set = sub, set_verified = 0;
1032               else if (!find_reg_note (insn, REG_UNUSED, SET_DEST (sub))
1033                        || side_effects_p (sub))
1034                 return NULL_RTX;
1035               break;
1036
1037             default:
1038               return NULL_RTX;
1039             }
1040         }
1041     }
1042   return set;
1043 }
1044
1045 /* Given an INSN, return nonzero if it has more than one SET, else return
1046    zero.  */
1047
1048 int
1049 multiple_sets (const_rtx insn)
1050 {
1051   int found;
1052   int i;
1053
1054   /* INSN must be an insn.  */
1055   if (! INSN_P (insn))
1056     return 0;
1057
1058   /* Only a PARALLEL can have multiple SETs.  */
1059   if (GET_CODE (PATTERN (insn)) == PARALLEL)
1060     {
1061       for (i = 0, found = 0; i < XVECLEN (PATTERN (insn), 0); i++)
1062         if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
1063           {
1064             /* If we have already found a SET, then return now.  */
1065             if (found)
1066               return 1;
1067             else
1068               found = 1;
1069           }
1070     }
1071
1072   /* Either zero or one SET.  */
1073   return 0;
1074 }
1075 \f
1076 /* Return nonzero if the destination of SET equals the source
1077    and there are no side effects.  */
1078
1079 int
1080 set_noop_p (const_rtx set)
1081 {
1082   rtx src = SET_SRC (set);
1083   rtx dst = SET_DEST (set);
1084
1085   if (dst == pc_rtx && src == pc_rtx)
1086     return 1;
1087
1088   if (MEM_P (dst) && MEM_P (src))
1089     return rtx_equal_p (dst, src) && !side_effects_p (dst);
1090
1091   if (GET_CODE (dst) == ZERO_EXTRACT)
1092     return rtx_equal_p (XEXP (dst, 0), src)
1093            && ! BYTES_BIG_ENDIAN && XEXP (dst, 2) == const0_rtx
1094            && !side_effects_p (src);
1095
1096   if (GET_CODE (dst) == STRICT_LOW_PART)
1097     dst = XEXP (dst, 0);
1098
1099   if (GET_CODE (src) == SUBREG && GET_CODE (dst) == SUBREG)
1100     {
1101       if (SUBREG_BYTE (src) != SUBREG_BYTE (dst))
1102         return 0;
1103       src = SUBREG_REG (src);
1104       dst = SUBREG_REG (dst);
1105     }
1106
1107   return (REG_P (src) && REG_P (dst)
1108           && REGNO (src) == REGNO (dst));
1109 }
1110 \f
1111 /* Return nonzero if an insn consists only of SETs, each of which only sets a
1112    value to itself.  */
1113
1114 int
1115 noop_move_p (const_rtx insn)
1116 {
1117   rtx pat = PATTERN (insn);
1118
1119   if (INSN_CODE (insn) == NOOP_MOVE_INSN_CODE)
1120     return 1;
1121
1122   /* Insns carrying these notes are useful later on.  */
1123   if (find_reg_note (insn, REG_EQUAL, NULL_RTX))
1124     return 0;
1125
1126   /* For now treat an insn with a REG_RETVAL note as a
1127      a special insn which should not be considered a no-op.  */
1128   if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
1129     return 0;
1130
1131   if (GET_CODE (pat) == SET && set_noop_p (pat))
1132     return 1;
1133
1134   if (GET_CODE (pat) == PARALLEL)
1135     {
1136       int i;
1137       /* If nothing but SETs of registers to themselves,
1138          this insn can also be deleted.  */
1139       for (i = 0; i < XVECLEN (pat, 0); i++)
1140         {
1141           rtx tem = XVECEXP (pat, 0, i);
1142
1143           if (GET_CODE (tem) == USE
1144               || GET_CODE (tem) == CLOBBER)
1145             continue;
1146
1147           if (GET_CODE (tem) != SET || ! set_noop_p (tem))
1148             return 0;
1149         }
1150
1151       return 1;
1152     }
1153   return 0;
1154 }
1155 \f
1156
1157 /* Return the last thing that X was assigned from before *PINSN.  If VALID_TO
1158    is not NULL_RTX then verify that the object is not modified up to VALID_TO.
1159    If the object was modified, if we hit a partial assignment to X, or hit a
1160    CODE_LABEL first, return X.  If we found an assignment, update *PINSN to
1161    point to it.  ALLOW_HWREG is set to 1 if hardware registers are allowed to
1162    be the src.  */
1163
1164 rtx
1165 find_last_value (rtx x, rtx *pinsn, rtx valid_to, int allow_hwreg)
1166 {
1167   rtx p;
1168
1169   for (p = PREV_INSN (*pinsn); p && !LABEL_P (p);
1170        p = PREV_INSN (p))
1171     if (INSN_P (p))
1172       {
1173         rtx set = single_set (p);
1174         rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
1175
1176         if (set && rtx_equal_p (x, SET_DEST (set)))
1177           {
1178             rtx src = SET_SRC (set);
1179
1180             if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
1181               src = XEXP (note, 0);
1182
1183             if ((valid_to == NULL_RTX
1184                  || ! modified_between_p (src, PREV_INSN (p), valid_to))
1185                 /* Reject hard registers because we don't usually want
1186                    to use them; we'd rather use a pseudo.  */
1187                 && (! (REG_P (src)
1188                       && REGNO (src) < FIRST_PSEUDO_REGISTER) || allow_hwreg))
1189               {
1190                 *pinsn = p;
1191                 return src;
1192               }
1193           }
1194
1195         /* If set in non-simple way, we don't have a value.  */
1196         if (reg_set_p (x, p))
1197           break;
1198       }
1199
1200   return x;
1201 }
1202 \f
1203 /* Return nonzero if register in range [REGNO, ENDREGNO)
1204    appears either explicitly or implicitly in X
1205    other than being stored into.
1206
1207    References contained within the substructure at LOC do not count.
1208    LOC may be zero, meaning don't ignore anything.  */
1209
1210 int
1211 refers_to_regno_p (unsigned int regno, unsigned int endregno, const_rtx x,
1212                    rtx *loc)
1213 {
1214   int i;
1215   unsigned int x_regno;
1216   RTX_CODE code;
1217   const char *fmt;
1218
1219  repeat:
1220   /* The contents of a REG_NONNEG note is always zero, so we must come here
1221      upon repeat in case the last REG_NOTE is a REG_NONNEG note.  */
1222   if (x == 0)
1223     return 0;
1224
1225   code = GET_CODE (x);
1226
1227   switch (code)
1228     {
1229     case REG:
1230       x_regno = REGNO (x);
1231
1232       /* If we modifying the stack, frame, or argument pointer, it will
1233          clobber a virtual register.  In fact, we could be more precise,
1234          but it isn't worth it.  */
1235       if ((x_regno == STACK_POINTER_REGNUM
1236 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
1237            || x_regno == ARG_POINTER_REGNUM
1238 #endif
1239            || x_regno == FRAME_POINTER_REGNUM)
1240           && regno >= FIRST_VIRTUAL_REGISTER && regno <= LAST_VIRTUAL_REGISTER)
1241         return 1;
1242
1243       return endregno > x_regno && regno < END_REGNO (x);
1244
1245     case SUBREG:
1246       /* If this is a SUBREG of a hard reg, we can see exactly which
1247          registers are being modified.  Otherwise, handle normally.  */
1248       if (REG_P (SUBREG_REG (x))
1249           && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
1250         {
1251           unsigned int inner_regno = subreg_regno (x);
1252           unsigned int inner_endregno
1253             = inner_regno + (inner_regno < FIRST_PSEUDO_REGISTER
1254                              ? subreg_nregs (x) : 1);
1255
1256           return endregno > inner_regno && regno < inner_endregno;
1257         }
1258       break;
1259
1260     case CLOBBER:
1261     case SET:
1262       if (&SET_DEST (x) != loc
1263           /* Note setting a SUBREG counts as referring to the REG it is in for
1264              a pseudo but not for hard registers since we can
1265              treat each word individually.  */
1266           && ((GET_CODE (SET_DEST (x)) == SUBREG
1267                && loc != &SUBREG_REG (SET_DEST (x))
1268                && REG_P (SUBREG_REG (SET_DEST (x)))
1269                && REGNO (SUBREG_REG (SET_DEST (x))) >= FIRST_PSEUDO_REGISTER
1270                && refers_to_regno_p (regno, endregno,
1271                                      SUBREG_REG (SET_DEST (x)), loc))
1272               || (!REG_P (SET_DEST (x))
1273                   && refers_to_regno_p (regno, endregno, SET_DEST (x), loc))))
1274         return 1;
1275
1276       if (code == CLOBBER || loc == &SET_SRC (x))
1277         return 0;
1278       x = SET_SRC (x);
1279       goto repeat;
1280
1281     default:
1282       break;
1283     }
1284
1285   /* X does not match, so try its subexpressions.  */
1286
1287   fmt = GET_RTX_FORMAT (code);
1288   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1289     {
1290       if (fmt[i] == 'e' && loc != &XEXP (x, i))
1291         {
1292           if (i == 0)
1293             {
1294               x = XEXP (x, 0);
1295               goto repeat;
1296             }
1297           else
1298             if (refers_to_regno_p (regno, endregno, XEXP (x, i), loc))
1299               return 1;
1300         }
1301       else if (fmt[i] == 'E')
1302         {
1303           int j;
1304           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1305             if (loc != &XVECEXP (x, i, j)
1306                 && refers_to_regno_p (regno, endregno, XVECEXP (x, i, j), loc))
1307               return 1;
1308         }
1309     }
1310   return 0;
1311 }
1312
1313 /* Nonzero if modifying X will affect IN.  If X is a register or a SUBREG,
1314    we check if any register number in X conflicts with the relevant register
1315    numbers.  If X is a constant, return 0.  If X is a MEM, return 1 iff IN
1316    contains a MEM (we don't bother checking for memory addresses that can't
1317    conflict because we expect this to be a rare case.  */
1318
1319 int
1320 reg_overlap_mentioned_p (const_rtx x, const_rtx in)
1321 {
1322   unsigned int regno, endregno;
1323
1324   /* If either argument is a constant, then modifying X can not
1325      affect IN.  Here we look at IN, we can profitably combine
1326      CONSTANT_P (x) with the switch statement below.  */
1327   if (CONSTANT_P (in))
1328     return 0;
1329
1330  recurse:
1331   switch (GET_CODE (x))
1332     {
1333     case STRICT_LOW_PART:
1334     case ZERO_EXTRACT:
1335     case SIGN_EXTRACT:
1336       /* Overly conservative.  */
1337       x = XEXP (x, 0);
1338       goto recurse;
1339
1340     case SUBREG:
1341       regno = REGNO (SUBREG_REG (x));
1342       if (regno < FIRST_PSEUDO_REGISTER)
1343         regno = subreg_regno (x);
1344       endregno = regno + (regno < FIRST_PSEUDO_REGISTER
1345                           ? subreg_nregs (x) : 1);
1346       goto do_reg;
1347
1348     case REG:
1349       regno = REGNO (x);
1350       endregno = END_REGNO (x);
1351     do_reg:
1352       return refers_to_regno_p (regno, endregno, in, (rtx*) 0);
1353
1354     case MEM:
1355       {
1356         const char *fmt;
1357         int i;
1358
1359         if (MEM_P (in))
1360           return 1;
1361
1362         fmt = GET_RTX_FORMAT (GET_CODE (in));
1363         for (i = GET_RTX_LENGTH (GET_CODE (in)) - 1; i >= 0; i--)
1364           if (fmt[i] == 'e')
1365             {
1366               if (reg_overlap_mentioned_p (x, XEXP (in, i)))
1367                 return 1;
1368             }
1369           else if (fmt[i] == 'E')
1370             {
1371               int j;
1372               for (j = XVECLEN (in, i) - 1; j >= 0; --j)
1373                 if (reg_overlap_mentioned_p (x, XVECEXP (in, i, j)))
1374                   return 1;
1375             }
1376
1377         return 0;
1378       }
1379
1380     case SCRATCH:
1381     case PC:
1382     case CC0:
1383       return reg_mentioned_p (x, in);
1384
1385     case PARALLEL:
1386       {
1387         int i;
1388
1389         /* If any register in here refers to it we return true.  */
1390         for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
1391           if (XEXP (XVECEXP (x, 0, i), 0) != 0
1392               && reg_overlap_mentioned_p (XEXP (XVECEXP (x, 0, i), 0), in))
1393             return 1;
1394         return 0;
1395       }
1396
1397     default:
1398       gcc_assert (CONSTANT_P (x));
1399       return 0;
1400     }
1401 }
1402 \f
1403 /* Call FUN on each register or MEM that is stored into or clobbered by X.
1404    (X would be the pattern of an insn).  DATA is an arbitrary pointer,
1405    ignored by note_stores, but passed to FUN.
1406
1407    FUN receives three arguments:
1408    1. the REG, MEM, CC0 or PC being stored in or clobbered,
1409    2. the SET or CLOBBER rtx that does the store,
1410    3. the pointer DATA provided to note_stores.
1411
1412   If the item being stored in or clobbered is a SUBREG of a hard register,
1413   the SUBREG will be passed.  */
1414
1415 #define NOTE_STORES_BODY(NOTE_STORES_FN) do { \
1416   int i; \
1417   if (GET_CODE (x) == COND_EXEC) \
1418     x = COND_EXEC_CODE (x); \
1419   if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER) \
1420     { \
1421       rtx dest = SET_DEST (x); \
1422       while ((GET_CODE (dest) == SUBREG \
1423               && (!REG_P (SUBREG_REG (dest)) \
1424                   || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER)) \
1425              || GET_CODE (dest) == ZERO_EXTRACT \
1426              || GET_CODE (dest) == STRICT_LOW_PART) \
1427         dest = XEXP (dest, 0); \
1428       /* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions, \
1429          each of whose first operand is a register.  */ \
1430       if (GET_CODE (dest) == PARALLEL) \
1431         { \
1432           for (i = XVECLEN (dest, 0) - 1; i >= 0; i--) \
1433             if (XEXP (XVECEXP (dest, 0, i), 0) != 0) \
1434               (*fun) (XEXP (XVECEXP (dest, 0, i), 0), x, data); \
1435         } \
1436       else \
1437         (*fun) (dest, x, data); \
1438     } \
1439   else if (GET_CODE (x) == PARALLEL) \
1440     for (i = XVECLEN (x, 0) - 1; i >= 0; i--) \
1441       NOTE_STORES_FN (XVECEXP (x, 0, i), fun, data); \
1442 } while (0)
1443
1444 void
1445 note_stores (const_rtx x, void (*fun) (rtx, const_rtx, void *), void *data)
1446 {
1447   NOTE_STORES_BODY(note_stores);
1448 }
1449
1450 void
1451 const_note_stores (const_rtx x, void (*fun) (const_rtx, const_rtx, const void *), const void *data)
1452 {
1453   NOTE_STORES_BODY(const_note_stores);
1454 }
1455
1456 #undef NOTE_STORES_BODY
1457
1458 \f
1459 /* Like notes_stores, but call FUN for each expression that is being
1460    referenced in PBODY, a pointer to the PATTERN of an insn.  We only call
1461    FUN for each expression, not any interior subexpressions.  FUN receives a
1462    pointer to the expression and the DATA passed to this function.
1463
1464    Note that this is not quite the same test as that done in reg_referenced_p
1465    since that considers something as being referenced if it is being
1466    partially set, while we do not.  */
1467
1468 void
1469 note_uses (rtx *pbody, void (*fun) (rtx *, void *), void *data)
1470 {
1471   rtx body = *pbody;
1472   int i;
1473
1474   switch (GET_CODE (body))
1475     {
1476     case COND_EXEC:
1477       (*fun) (&COND_EXEC_TEST (body), data);
1478       note_uses (&COND_EXEC_CODE (body), fun, data);
1479       return;
1480
1481     case PARALLEL:
1482       for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
1483         note_uses (&XVECEXP (body, 0, i), fun, data);
1484       return;
1485
1486     case SEQUENCE:
1487       for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
1488         note_uses (&PATTERN (XVECEXP (body, 0, i)), fun, data);
1489       return;
1490
1491     case USE:
1492       (*fun) (&XEXP (body, 0), data);
1493       return;
1494
1495     case ASM_OPERANDS:
1496       for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
1497         (*fun) (&ASM_OPERANDS_INPUT (body, i), data);
1498       return;
1499
1500     case TRAP_IF:
1501       (*fun) (&TRAP_CONDITION (body), data);
1502       return;
1503
1504     case PREFETCH:
1505       (*fun) (&XEXP (body, 0), data);
1506       return;
1507
1508     case UNSPEC:
1509     case UNSPEC_VOLATILE:
1510       for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
1511         (*fun) (&XVECEXP (body, 0, i), data);
1512       return;
1513
1514     case CLOBBER:
1515       if (MEM_P (XEXP (body, 0)))
1516         (*fun) (&XEXP (XEXP (body, 0), 0), data);
1517       return;
1518
1519     case SET:
1520       {
1521         rtx dest = SET_DEST (body);
1522
1523         /* For sets we replace everything in source plus registers in memory
1524            expression in store and operands of a ZERO_EXTRACT.  */
1525         (*fun) (&SET_SRC (body), data);
1526
1527         if (GET_CODE (dest) == ZERO_EXTRACT)
1528           {
1529             (*fun) (&XEXP (dest, 1), data);
1530             (*fun) (&XEXP (dest, 2), data);
1531           }
1532
1533         while (GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART)
1534           dest = XEXP (dest, 0);
1535
1536         if (MEM_P (dest))
1537           (*fun) (&XEXP (dest, 0), data);
1538       }
1539       return;
1540
1541     default:
1542       /* All the other possibilities never store.  */
1543       (*fun) (pbody, data);
1544       return;
1545     }
1546 }
1547 \f
1548 /* Return nonzero if X's old contents don't survive after INSN.
1549    This will be true if X is (cc0) or if X is a register and
1550    X dies in INSN or because INSN entirely sets X.
1551
1552    "Entirely set" means set directly and not through a SUBREG, or
1553    ZERO_EXTRACT, so no trace of the old contents remains.
1554    Likewise, REG_INC does not count.
1555
1556    REG may be a hard or pseudo reg.  Renumbering is not taken into account,
1557    but for this use that makes no difference, since regs don't overlap
1558    during their lifetimes.  Therefore, this function may be used
1559    at any time after deaths have been computed.
1560
1561    If REG is a hard reg that occupies multiple machine registers, this
1562    function will only return 1 if each of those registers will be replaced
1563    by INSN.  */
1564
1565 int
1566 dead_or_set_p (const_rtx insn, const_rtx x)
1567 {
1568   unsigned int regno, end_regno;
1569   unsigned int i;
1570
1571   /* Can't use cc0_rtx below since this file is used by genattrtab.c.  */
1572   if (GET_CODE (x) == CC0)
1573     return 1;
1574
1575   gcc_assert (REG_P (x));
1576
1577   regno = REGNO (x);
1578   end_regno = END_REGNO (x);
1579   for (i = regno; i < end_regno; i++)
1580     if (! dead_or_set_regno_p (insn, i))
1581       return 0;
1582
1583   return 1;
1584 }
1585
1586 /* Return TRUE iff DEST is a register or subreg of a register and
1587    doesn't change the number of words of the inner register, and any
1588    part of the register is TEST_REGNO.  */
1589
1590 static bool
1591 covers_regno_no_parallel_p (const_rtx dest, unsigned int test_regno)
1592 {
1593   unsigned int regno, endregno;
1594
1595   if (GET_CODE (dest) == SUBREG
1596       && (((GET_MODE_SIZE (GET_MODE (dest))
1597             + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1598           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1599                + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1600     dest = SUBREG_REG (dest);
1601
1602   if (!REG_P (dest))
1603     return false;
1604
1605   regno = REGNO (dest);
1606   endregno = END_REGNO (dest);
1607   return (test_regno >= regno && test_regno < endregno);
1608 }
1609
1610 /* Like covers_regno_no_parallel_p, but also handles PARALLELs where
1611    any member matches the covers_regno_no_parallel_p criteria.  */
1612
1613 static bool
1614 covers_regno_p (const_rtx dest, unsigned int test_regno)
1615 {
1616   if (GET_CODE (dest) == PARALLEL)
1617     {
1618       /* Some targets place small structures in registers for return
1619          values of functions, and those registers are wrapped in
1620          PARALLELs that we may see as the destination of a SET.  */
1621       int i;
1622
1623       for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
1624         {
1625           rtx inner = XEXP (XVECEXP (dest, 0, i), 0);
1626           if (inner != NULL_RTX
1627               && covers_regno_no_parallel_p (inner, test_regno))
1628             return true;
1629         }
1630
1631       return false;
1632     }
1633   else
1634     return covers_regno_no_parallel_p (dest, test_regno);
1635 }
1636
1637 /* Utility function for dead_or_set_p to check an individual register. */
1638
1639 int
1640 dead_or_set_regno_p (const_rtx insn, unsigned int test_regno)
1641 {
1642   const_rtx pattern;
1643
1644   /* See if there is a death note for something that includes TEST_REGNO.  */
1645   if (find_regno_note (insn, REG_DEAD, test_regno))
1646     return 1;
1647
1648   if (CALL_P (insn)
1649       && find_regno_fusage (insn, CLOBBER, test_regno))
1650     return 1;
1651
1652   pattern = PATTERN (insn);
1653
1654   if (GET_CODE (pattern) == COND_EXEC)
1655     pattern = COND_EXEC_CODE (pattern);
1656
1657   if (GET_CODE (pattern) == SET)
1658     return covers_regno_p (SET_DEST (pattern), test_regno);
1659   else if (GET_CODE (pattern) == PARALLEL)
1660     {
1661       int i;
1662
1663       for (i = XVECLEN (pattern, 0) - 1; i >= 0; i--)
1664         {
1665           rtx body = XVECEXP (pattern, 0, i);
1666
1667           if (GET_CODE (body) == COND_EXEC)
1668             body = COND_EXEC_CODE (body);
1669
1670           if ((GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1671               && covers_regno_p (SET_DEST (body), test_regno))
1672             return 1;
1673         }
1674     }
1675
1676   return 0;
1677 }
1678
1679 /* Return the reg-note of kind KIND in insn INSN, if there is one.
1680    If DATUM is nonzero, look for one whose datum is DATUM.  */
1681
1682 rtx
1683 find_reg_note (const_rtx insn, enum reg_note kind, const_rtx datum)
1684 {
1685   rtx link;
1686
1687   gcc_assert (insn);
1688
1689   /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN.  */
1690   if (! INSN_P (insn))
1691     return 0;
1692   if (datum == 0)
1693     {
1694       for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1695         if (REG_NOTE_KIND (link) == kind)
1696           return link;
1697       return 0;
1698     }
1699
1700   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1701     if (REG_NOTE_KIND (link) == kind && datum == XEXP (link, 0))
1702       return link;
1703   return 0;
1704 }
1705
1706 /* Return the reg-note of kind KIND in insn INSN which applies to register
1707    number REGNO, if any.  Return 0 if there is no such reg-note.  Note that
1708    the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
1709    it might be the case that the note overlaps REGNO.  */
1710
1711 rtx
1712 find_regno_note (const_rtx insn, enum reg_note kind, unsigned int regno)
1713 {
1714   rtx link;
1715
1716   /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN.  */
1717   if (! INSN_P (insn))
1718     return 0;
1719
1720   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1721     if (REG_NOTE_KIND (link) == kind
1722         /* Verify that it is a register, so that scratch and MEM won't cause a
1723            problem here.  */
1724         && REG_P (XEXP (link, 0))
1725         && REGNO (XEXP (link, 0)) <= regno
1726         && END_REGNO (XEXP (link, 0)) > regno)
1727       return link;
1728   return 0;
1729 }
1730
1731 /* Return a REG_EQUIV or REG_EQUAL note if insn has only a single set and
1732    has such a note.  */
1733
1734 rtx
1735 find_reg_equal_equiv_note (const_rtx insn)
1736 {
1737   rtx link;
1738
1739   if (!INSN_P (insn))
1740     return 0;
1741
1742   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1743     if (REG_NOTE_KIND (link) == REG_EQUAL
1744         || REG_NOTE_KIND (link) == REG_EQUIV)
1745       {
1746         /* FIXME: We should never have REG_EQUAL/REG_EQUIV notes on
1747            insns that have multiple sets.  Checking single_set to
1748            make sure of this is not the proper check, as explained
1749            in the comment in set_unique_reg_note.
1750
1751            This should be changed into an assert.  */
1752         if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
1753           return 0;
1754         return link;
1755       }
1756   return NULL;
1757 }
1758
1759 /* Check whether INSN is a single_set whose source is known to be
1760    equivalent to a constant.  Return that constant if so, otherwise
1761    return null.  */
1762
1763 rtx
1764 find_constant_src (const_rtx insn)
1765 {
1766   rtx note, set, x;
1767
1768   set = single_set (insn);
1769   if (set)
1770     {
1771       x = avoid_constant_pool_reference (SET_SRC (set));
1772       if (CONSTANT_P (x))
1773         return x;
1774     }
1775
1776   note = find_reg_equal_equiv_note (insn);
1777   if (note && CONSTANT_P (XEXP (note, 0)))
1778     return XEXP (note, 0);
1779
1780   return NULL_RTX;
1781 }
1782
1783 /* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
1784    in the CALL_INSN_FUNCTION_USAGE information of INSN.  */
1785
1786 int
1787 find_reg_fusage (const_rtx insn, enum rtx_code code, const_rtx datum)
1788 {
1789   /* If it's not a CALL_INSN, it can't possibly have a
1790      CALL_INSN_FUNCTION_USAGE field, so don't bother checking.  */
1791   if (!CALL_P (insn))
1792     return 0;
1793
1794   gcc_assert (datum);
1795
1796   if (!REG_P (datum))
1797     {
1798       rtx link;
1799
1800       for (link = CALL_INSN_FUNCTION_USAGE (insn);
1801            link;
1802            link = XEXP (link, 1))
1803         if (GET_CODE (XEXP (link, 0)) == code
1804             && rtx_equal_p (datum, XEXP (XEXP (link, 0), 0)))
1805           return 1;
1806     }
1807   else
1808     {
1809       unsigned int regno = REGNO (datum);
1810
1811       /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1812          to pseudo registers, so don't bother checking.  */
1813
1814       if (regno < FIRST_PSEUDO_REGISTER)
1815         {
1816           unsigned int end_regno = END_HARD_REGNO (datum);
1817           unsigned int i;
1818
1819           for (i = regno; i < end_regno; i++)
1820             if (find_regno_fusage (insn, code, i))
1821               return 1;
1822         }
1823     }
1824
1825   return 0;
1826 }
1827
1828 /* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
1829    in the CALL_INSN_FUNCTION_USAGE information of INSN.  */
1830
1831 int
1832 find_regno_fusage (const_rtx insn, enum rtx_code code, unsigned int regno)
1833 {
1834   rtx link;
1835
1836   /* CALL_INSN_FUNCTION_USAGE information cannot contain references
1837      to pseudo registers, so don't bother checking.  */
1838
1839   if (regno >= FIRST_PSEUDO_REGISTER
1840       || !CALL_P (insn) )
1841     return 0;
1842
1843   for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1844     {
1845       rtx op, reg;
1846
1847       if (GET_CODE (op = XEXP (link, 0)) == code
1848           && REG_P (reg = XEXP (op, 0))
1849           && REGNO (reg) <= regno
1850           && END_HARD_REGNO (reg) > regno)
1851         return 1;
1852     }
1853
1854   return 0;
1855 }
1856
1857 /* Return true if INSN is a call to a pure function.  */
1858
1859 int
1860 pure_call_p (const_rtx insn)
1861 {
1862   const_rtx link;
1863
1864   if (!CALL_P (insn) || ! CONST_OR_PURE_CALL_P (insn))
1865     return 0;
1866
1867   /* Look for the note that differentiates const and pure functions.  */
1868   for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
1869     {
1870       rtx u, m;
1871
1872       if (GET_CODE (u = XEXP (link, 0)) == USE
1873           && MEM_P (m = XEXP (u, 0)) && GET_MODE (m) == BLKmode
1874           && GET_CODE (XEXP (m, 0)) == SCRATCH)
1875         return 1;
1876     }
1877
1878   return 0;
1879 }
1880 \f
1881 /* Remove register note NOTE from the REG_NOTES of INSN.  */
1882
1883 void
1884 remove_note (rtx insn, const_rtx note)
1885 {
1886   rtx link;
1887
1888   if (note == NULL_RTX)
1889     return;
1890
1891   if (REG_NOTES (insn) == note)
1892     REG_NOTES (insn) = XEXP (note, 1);
1893   else
1894     for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1895       if (XEXP (link, 1) == note)
1896         {
1897           XEXP (link, 1) = XEXP (note, 1);
1898           break;
1899         }
1900
1901   switch (REG_NOTE_KIND (note))
1902     {
1903     case REG_EQUAL:
1904     case REG_EQUIV:
1905       df_notes_rescan (insn);
1906       break;
1907     default:
1908       break;
1909     }
1910 }
1911
1912 /* Remove REG_EQUAL and/or REG_EQUIV notes if INSN has such notes.  */
1913
1914 void
1915 remove_reg_equal_equiv_notes (rtx insn)
1916 {
1917   rtx *loc;
1918
1919   loc = &REG_NOTES (insn);
1920   while (*loc)
1921     {
1922       enum reg_note kind = REG_NOTE_KIND (*loc);
1923       if (kind == REG_EQUAL || kind == REG_EQUIV)
1924         *loc = XEXP (*loc, 1);
1925       else
1926         loc = &XEXP (*loc, 1);
1927     }
1928 }
1929
1930 /* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
1931    return 1 if it is found.  A simple equality test is used to determine if
1932    NODE matches.  */
1933
1934 int
1935 in_expr_list_p (const_rtx listp, const_rtx node)
1936 {
1937   const_rtx x;
1938
1939   for (x = listp; x; x = XEXP (x, 1))
1940     if (node == XEXP (x, 0))
1941       return 1;
1942
1943   return 0;
1944 }
1945
1946 /* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
1947    remove that entry from the list if it is found.
1948
1949    A simple equality test is used to determine if NODE matches.  */
1950
1951 void
1952 remove_node_from_expr_list (const_rtx node, rtx *listp)
1953 {
1954   rtx temp = *listp;
1955   rtx prev = NULL_RTX;
1956
1957   while (temp)
1958     {
1959       if (node == XEXP (temp, 0))
1960         {
1961           /* Splice the node out of the list.  */
1962           if (prev)
1963             XEXP (prev, 1) = XEXP (temp, 1);
1964           else
1965             *listp = XEXP (temp, 1);
1966
1967           return;
1968         }
1969
1970       prev = temp;
1971       temp = XEXP (temp, 1);
1972     }
1973 }
1974 \f
1975 /* Nonzero if X contains any volatile instructions.  These are instructions
1976    which may cause unpredictable machine state instructions, and thus no
1977    instructions should be moved or combined across them.  This includes
1978    only volatile asms and UNSPEC_VOLATILE instructions.  */
1979
1980 int
1981 volatile_insn_p (const_rtx x)
1982 {
1983   const RTX_CODE code = GET_CODE (x);
1984   switch (code)
1985     {
1986     case LABEL_REF:
1987     case SYMBOL_REF:
1988     case CONST_INT:
1989     case CONST:
1990     case CONST_DOUBLE:
1991     case CONST_FIXED:
1992     case CONST_VECTOR:
1993     case CC0:
1994     case PC:
1995     case REG:
1996     case SCRATCH:
1997     case CLOBBER:
1998     case ADDR_VEC:
1999     case ADDR_DIFF_VEC:
2000     case CALL:
2001     case MEM:
2002       return 0;
2003
2004     case UNSPEC_VOLATILE:
2005  /* case TRAP_IF: This isn't clear yet.  */
2006       return 1;
2007
2008     case ASM_INPUT:
2009     case ASM_OPERANDS:
2010       if (MEM_VOLATILE_P (x))
2011         return 1;
2012
2013     default:
2014       break;
2015     }
2016
2017   /* Recursively scan the operands of this expression.  */
2018
2019   {
2020     const char *const fmt = GET_RTX_FORMAT (code);
2021     int i;
2022
2023     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2024       {
2025         if (fmt[i] == 'e')
2026           {
2027             if (volatile_insn_p (XEXP (x, i)))
2028               return 1;
2029           }
2030         else if (fmt[i] == 'E')
2031           {
2032             int j;
2033             for (j = 0; j < XVECLEN (x, i); j++)
2034               if (volatile_insn_p (XVECEXP (x, i, j)))
2035                 return 1;
2036           }
2037       }
2038   }
2039   return 0;
2040 }
2041
2042 /* Nonzero if X contains any volatile memory references
2043    UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions.  */
2044
2045 int
2046 volatile_refs_p (const_rtx x)
2047 {
2048   const RTX_CODE code = GET_CODE (x);
2049   switch (code)
2050     {
2051     case LABEL_REF:
2052     case SYMBOL_REF:
2053     case CONST_INT:
2054     case CONST:
2055     case CONST_DOUBLE:
2056     case CONST_FIXED:
2057     case CONST_VECTOR:
2058     case CC0:
2059     case PC:
2060     case REG:
2061     case SCRATCH:
2062     case CLOBBER:
2063     case ADDR_VEC:
2064     case ADDR_DIFF_VEC:
2065       return 0;
2066
2067     case UNSPEC_VOLATILE:
2068       return 1;
2069
2070     case MEM:
2071     case ASM_INPUT:
2072     case ASM_OPERANDS:
2073       if (MEM_VOLATILE_P (x))
2074         return 1;
2075
2076     default:
2077       break;
2078     }
2079
2080   /* Recursively scan the operands of this expression.  */
2081
2082   {
2083     const char *const fmt = GET_RTX_FORMAT (code);
2084     int i;
2085
2086     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2087       {
2088         if (fmt[i] == 'e')
2089           {
2090             if (volatile_refs_p (XEXP (x, i)))
2091               return 1;
2092           }
2093         else if (fmt[i] == 'E')
2094           {
2095             int j;
2096             for (j = 0; j < XVECLEN (x, i); j++)
2097               if (volatile_refs_p (XVECEXP (x, i, j)))
2098                 return 1;
2099           }
2100       }
2101   }
2102   return 0;
2103 }
2104
2105 /* Similar to above, except that it also rejects register pre- and post-
2106    incrementing.  */
2107
2108 int
2109 side_effects_p (const_rtx x)
2110 {
2111   const RTX_CODE code = GET_CODE (x);
2112   switch (code)
2113     {
2114     case LABEL_REF:
2115     case SYMBOL_REF:
2116     case CONST_INT:
2117     case CONST:
2118     case CONST_DOUBLE:
2119     case CONST_FIXED:
2120     case CONST_VECTOR:
2121     case CC0:
2122     case PC:
2123     case REG:
2124     case SCRATCH:
2125     case ADDR_VEC:
2126     case ADDR_DIFF_VEC:
2127       return 0;
2128
2129     case CLOBBER:
2130       /* Reject CLOBBER with a non-VOID mode.  These are made by combine.c
2131          when some combination can't be done.  If we see one, don't think
2132          that we can simplify the expression.  */
2133       return (GET_MODE (x) != VOIDmode);
2134
2135     case PRE_INC:
2136     case PRE_DEC:
2137     case POST_INC:
2138     case POST_DEC:
2139     case PRE_MODIFY:
2140     case POST_MODIFY:
2141     case CALL:
2142     case UNSPEC_VOLATILE:
2143  /* case TRAP_IF: This isn't clear yet.  */
2144       return 1;
2145
2146     case MEM:
2147     case ASM_INPUT:
2148     case ASM_OPERANDS:
2149       if (MEM_VOLATILE_P (x))
2150         return 1;
2151
2152     default:
2153       break;
2154     }
2155
2156   /* Recursively scan the operands of this expression.  */
2157
2158   {
2159     const char *fmt = GET_RTX_FORMAT (code);
2160     int i;
2161
2162     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2163       {
2164         if (fmt[i] == 'e')
2165           {
2166             if (side_effects_p (XEXP (x, i)))
2167               return 1;
2168           }
2169         else if (fmt[i] == 'E')
2170           {
2171             int j;
2172             for (j = 0; j < XVECLEN (x, i); j++)
2173               if (side_effects_p (XVECEXP (x, i, j)))
2174                 return 1;
2175           }
2176       }
2177   }
2178   return 0;
2179 }
2180 \f
2181 enum may_trap_p_flags
2182 {
2183   MTP_UNALIGNED_MEMS = 1,
2184   MTP_AFTER_MOVE = 2
2185 };
2186 /* Return nonzero if evaluating rtx X might cause a trap.
2187    (FLAGS & MTP_UNALIGNED_MEMS) controls whether nonzero is returned for
2188    unaligned memory accesses on strict alignment machines.  If
2189    (FLAGS & AFTER_MOVE) is true, returns nonzero even in case the expression
2190    cannot trap at its current location, but it might become trapping if moved
2191    elsewhere.  */
2192
2193 static int
2194 may_trap_p_1 (const_rtx x, unsigned flags)
2195 {
2196   int i;
2197   enum rtx_code code;
2198   const char *fmt;
2199   bool unaligned_mems = (flags & MTP_UNALIGNED_MEMS) != 0;
2200
2201   if (x == 0)
2202     return 0;
2203   code = GET_CODE (x);
2204   switch (code)
2205     {
2206       /* Handle these cases quickly.  */
2207     case CONST_INT:
2208     case CONST_DOUBLE:
2209     case CONST_FIXED:
2210     case CONST_VECTOR:
2211     case SYMBOL_REF:
2212     case LABEL_REF:
2213     case CONST:
2214     case PC:
2215     case CC0:
2216     case REG:
2217     case SCRATCH:
2218       return 0;
2219
2220     case ASM_INPUT:
2221     case UNSPEC_VOLATILE:
2222     case TRAP_IF:
2223       return 1;
2224
2225     case ASM_OPERANDS:
2226       return MEM_VOLATILE_P (x);
2227
2228       /* Memory ref can trap unless it's a static var or a stack slot.  */
2229     case MEM:
2230       if (/* MEM_NOTRAP_P only relates to the actual position of the memory
2231              reference; moving it out of condition might cause its address
2232              become invalid.  */
2233           !(flags & MTP_AFTER_MOVE)
2234           && MEM_NOTRAP_P (x)
2235           && (!STRICT_ALIGNMENT || !unaligned_mems))
2236         return 0;
2237       return
2238         rtx_addr_can_trap_p_1 (XEXP (x, 0), GET_MODE (x), unaligned_mems);
2239
2240       /* Division by a non-constant might trap.  */
2241     case DIV:
2242     case MOD:
2243     case UDIV:
2244     case UMOD:
2245       if (HONOR_SNANS (GET_MODE (x)))
2246         return 1;
2247       if (SCALAR_FLOAT_MODE_P (GET_MODE (x)))
2248         return flag_trapping_math;
2249       if (!CONSTANT_P (XEXP (x, 1)) || (XEXP (x, 1) == const0_rtx))
2250         return 1;
2251       break;
2252
2253     case EXPR_LIST:
2254       /* An EXPR_LIST is used to represent a function call.  This
2255          certainly may trap.  */
2256       return 1;
2257
2258     case GE:
2259     case GT:
2260     case LE:
2261     case LT:
2262     case LTGT:
2263     case COMPARE:
2264       /* Some floating point comparisons may trap.  */
2265       if (!flag_trapping_math)
2266         break;
2267       /* ??? There is no machine independent way to check for tests that trap
2268          when COMPARE is used, though many targets do make this distinction.
2269          For instance, sparc uses CCFPE for compares which generate exceptions
2270          and CCFP for compares which do not generate exceptions.  */
2271       if (HONOR_NANS (GET_MODE (x)))
2272         return 1;
2273       /* But often the compare has some CC mode, so check operand
2274          modes as well.  */
2275       if (HONOR_NANS (GET_MODE (XEXP (x, 0)))
2276           || HONOR_NANS (GET_MODE (XEXP (x, 1))))
2277         return 1;
2278       break;
2279
2280     case EQ:
2281     case NE:
2282       if (HONOR_SNANS (GET_MODE (x)))
2283         return 1;
2284       /* Often comparison is CC mode, so check operand modes.  */
2285       if (HONOR_SNANS (GET_MODE (XEXP (x, 0)))
2286           || HONOR_SNANS (GET_MODE (XEXP (x, 1))))
2287         return 1;
2288       break;
2289
2290     case FIX:
2291       /* Conversion of floating point might trap.  */
2292       if (flag_trapping_math && HONOR_NANS (GET_MODE (XEXP (x, 0))))
2293         return 1;
2294       break;
2295
2296     case NEG:
2297     case ABS:
2298     case SUBREG:
2299       /* These operations don't trap even with floating point.  */
2300       break;
2301
2302     default:
2303       /* Any floating arithmetic may trap.  */
2304       if (SCALAR_FLOAT_MODE_P (GET_MODE (x))
2305           && flag_trapping_math)
2306         return 1;
2307     }
2308
2309   fmt = GET_RTX_FORMAT (code);
2310   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2311     {
2312       if (fmt[i] == 'e')
2313         {
2314           if (may_trap_p_1 (XEXP (x, i), flags))
2315             return 1;
2316         }
2317       else if (fmt[i] == 'E')
2318         {
2319           int j;
2320           for (j = 0; j < XVECLEN (x, i); j++)
2321             if (may_trap_p_1 (XVECEXP (x, i, j), flags))
2322               return 1;
2323         }
2324     }
2325   return 0;
2326 }
2327
2328 /* Return nonzero if evaluating rtx X might cause a trap.  */
2329
2330 int
2331 may_trap_p (const_rtx x)
2332 {
2333   return may_trap_p_1 (x, 0);
2334 }
2335
2336 /* Return nonzero if evaluating rtx X might cause a trap, when the expression
2337    is moved from its current location by some optimization.  */
2338
2339 int
2340 may_trap_after_code_motion_p (const_rtx x)
2341 {
2342   return may_trap_p_1 (x, MTP_AFTER_MOVE);
2343 }
2344
2345 /* Same as above, but additionally return nonzero if evaluating rtx X might
2346    cause a fault.  We define a fault for the purpose of this function as a
2347    erroneous execution condition that cannot be encountered during the normal
2348    execution of a valid program; the typical example is an unaligned memory
2349    access on a strict alignment machine.  The compiler guarantees that it
2350    doesn't generate code that will fault from a valid program, but this
2351    guarantee doesn't mean anything for individual instructions.  Consider
2352    the following example:
2353
2354       struct S { int d; union { char *cp; int *ip; }; };
2355
2356       int foo(struct S *s)
2357       {
2358         if (s->d == 1)
2359           return *s->ip;
2360         else
2361           return *s->cp;
2362       }
2363
2364    on a strict alignment machine.  In a valid program, foo will never be
2365    invoked on a structure for which d is equal to 1 and the underlying
2366    unique field of the union not aligned on a 4-byte boundary, but the
2367    expression *s->ip might cause a fault if considered individually.
2368
2369    At the RTL level, potentially problematic expressions will almost always
2370    verify may_trap_p; for example, the above dereference can be emitted as
2371    (mem:SI (reg:P)) and this expression is may_trap_p for a generic register.
2372    However, suppose that foo is inlined in a caller that causes s->cp to
2373    point to a local character variable and guarantees that s->d is not set
2374    to 1; foo may have been effectively translated into pseudo-RTL as:
2375
2376       if ((reg:SI) == 1)
2377         (set (reg:SI) (mem:SI (%fp - 7)))
2378       else
2379         (set (reg:QI) (mem:QI (%fp - 7)))
2380
2381    Now (mem:SI (%fp - 7)) is considered as not may_trap_p since it is a
2382    memory reference to a stack slot, but it will certainly cause a fault
2383    on a strict alignment machine.  */
2384
2385 int
2386 may_trap_or_fault_p (const_rtx x)
2387 {
2388   return may_trap_p_1 (x, MTP_UNALIGNED_MEMS);
2389 }
2390 \f
2391 /* Return nonzero if X contains a comparison that is not either EQ or NE,
2392    i.e., an inequality.  */
2393
2394 int
2395 inequality_comparisons_p (const_rtx x)
2396 {
2397   const char *fmt;
2398   int len, i;
2399   const enum rtx_code code = GET_CODE (x);
2400
2401   switch (code)
2402     {
2403     case REG:
2404     case SCRATCH:
2405     case PC:
2406     case CC0:
2407     case CONST_INT:
2408     case CONST_DOUBLE:
2409     case CONST_FIXED:
2410     case CONST_VECTOR:
2411     case CONST:
2412     case LABEL_REF:
2413     case SYMBOL_REF:
2414       return 0;
2415
2416     case LT:
2417     case LTU:
2418     case GT:
2419     case GTU:
2420     case LE:
2421     case LEU:
2422     case GE:
2423     case GEU:
2424       return 1;
2425
2426     default:
2427       break;
2428     }
2429
2430   len = GET_RTX_LENGTH (code);
2431   fmt = GET_RTX_FORMAT (code);
2432
2433   for (i = 0; i < len; i++)
2434     {
2435       if (fmt[i] == 'e')
2436         {
2437           if (inequality_comparisons_p (XEXP (x, i)))
2438             return 1;
2439         }
2440       else if (fmt[i] == 'E')
2441         {
2442           int j;
2443           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2444             if (inequality_comparisons_p (XVECEXP (x, i, j)))
2445               return 1;
2446         }
2447     }
2448
2449   return 0;
2450 }
2451 \f
2452 /* Replace any occurrence of FROM in X with TO.  The function does
2453    not enter into CONST_DOUBLE for the replace.
2454
2455    Note that copying is not done so X must not be shared unless all copies
2456    are to be modified.  */
2457
2458 rtx
2459 replace_rtx (rtx x, rtx from, rtx to)
2460 {
2461   int i, j;
2462   const char *fmt;
2463
2464   /* The following prevents loops occurrence when we change MEM in
2465      CONST_DOUBLE onto the same CONST_DOUBLE.  */
2466   if (x != 0 && GET_CODE (x) == CONST_DOUBLE)
2467     return x;
2468
2469   if (x == from)
2470     return to;
2471
2472   /* Allow this function to make replacements in EXPR_LISTs.  */
2473   if (x == 0)
2474     return 0;
2475
2476   if (GET_CODE (x) == SUBREG)
2477     {
2478       rtx new = replace_rtx (SUBREG_REG (x), from, to);
2479
2480       if (GET_CODE (new) == CONST_INT)
2481         {
2482           x = simplify_subreg (GET_MODE (x), new,
2483                                GET_MODE (SUBREG_REG (x)),
2484                                SUBREG_BYTE (x));
2485           gcc_assert (x);
2486         }
2487       else
2488         SUBREG_REG (x) = new;
2489
2490       return x;
2491     }
2492   else if (GET_CODE (x) == ZERO_EXTEND)
2493     {
2494       rtx new = replace_rtx (XEXP (x, 0), from, to);
2495
2496       if (GET_CODE (new) == CONST_INT)
2497         {
2498           x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
2499                                         new, GET_MODE (XEXP (x, 0)));
2500           gcc_assert (x);
2501         }
2502       else
2503         XEXP (x, 0) = new;
2504
2505       return x;
2506     }
2507
2508   fmt = GET_RTX_FORMAT (GET_CODE (x));
2509   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2510     {
2511       if (fmt[i] == 'e')
2512         XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
2513       else if (fmt[i] == 'E')
2514         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2515           XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
2516     }
2517
2518   return x;
2519 }
2520 \f
2521 /* Replace occurrences of the old label in *X with the new one.
2522    DATA is a REPLACE_LABEL_DATA containing the old and new labels.  */
2523
2524 int
2525 replace_label (rtx *x, void *data)
2526 {
2527   rtx l = *x;
2528   rtx old_label = ((replace_label_data *) data)->r1;
2529   rtx new_label = ((replace_label_data *) data)->r2;
2530   bool update_label_nuses = ((replace_label_data *) data)->update_label_nuses;
2531
2532   if (l == NULL_RTX)
2533     return 0;
2534
2535   if (GET_CODE (l) == SYMBOL_REF
2536       && CONSTANT_POOL_ADDRESS_P (l))
2537     {
2538       rtx c = get_pool_constant (l);
2539       if (rtx_referenced_p (old_label, c))
2540         {
2541           rtx new_c, new_l;
2542           replace_label_data *d = (replace_label_data *) data;
2543
2544           /* Create a copy of constant C; replace the label inside
2545              but do not update LABEL_NUSES because uses in constant pool
2546              are not counted.  */
2547           new_c = copy_rtx (c);
2548           d->update_label_nuses = false;
2549           for_each_rtx (&new_c, replace_label, data);
2550           d->update_label_nuses = update_label_nuses;
2551
2552           /* Add the new constant NEW_C to constant pool and replace
2553              the old reference to constant by new reference.  */
2554           new_l = XEXP (force_const_mem (get_pool_mode (l), new_c), 0);
2555           *x = replace_rtx (l, l, new_l);
2556         }
2557       return 0;
2558     }
2559
2560   /* If this is a JUMP_INSN, then we also need to fix the JUMP_LABEL
2561      field.  This is not handled by for_each_rtx because it doesn't
2562      handle unprinted ('0') fields.  */
2563   if (JUMP_P (l) && JUMP_LABEL (l) == old_label)
2564     JUMP_LABEL (l) = new_label;
2565
2566   if ((GET_CODE (l) == LABEL_REF
2567        || GET_CODE (l) == INSN_LIST)
2568       && XEXP (l, 0) == old_label)
2569     {
2570       XEXP (l, 0) = new_label;
2571       if (update_label_nuses)
2572         {
2573           ++LABEL_NUSES (new_label);
2574           --LABEL_NUSES (old_label);
2575         }
2576       return 0;
2577     }
2578
2579   return 0;
2580 }
2581
2582 /* When *BODY is equal to X or X is directly referenced by *BODY
2583    return nonzero, thus FOR_EACH_RTX stops traversing and returns nonzero
2584    too, otherwise FOR_EACH_RTX continues traversing *BODY.  */
2585
2586 static int
2587 rtx_referenced_p_1 (rtx *body, void *x)
2588 {
2589   rtx y = (rtx) x;
2590
2591   if (*body == NULL_RTX)
2592     return y == NULL_RTX;
2593
2594   /* Return true if a label_ref *BODY refers to label Y.  */
2595   if (GET_CODE (*body) == LABEL_REF && LABEL_P (y))
2596     return XEXP (*body, 0) == y;
2597
2598   /* If *BODY is a reference to pool constant traverse the constant.  */
2599   if (GET_CODE (*body) == SYMBOL_REF
2600       && CONSTANT_POOL_ADDRESS_P (*body))
2601     return rtx_referenced_p (y, get_pool_constant (*body));
2602
2603   /* By default, compare the RTL expressions.  */
2604   return rtx_equal_p (*body, y);
2605 }
2606
2607 /* Return true if X is referenced in BODY.  */
2608
2609 int
2610 rtx_referenced_p (rtx x, rtx body)
2611 {
2612   return for_each_rtx (&body, rtx_referenced_p_1, x);
2613 }
2614
2615 /* If INSN is a tablejump return true and store the label (before jump table) to
2616    *LABELP and the jump table to *TABLEP.  LABELP and TABLEP may be NULL.  */
2617
2618 bool
2619 tablejump_p (const_rtx insn, rtx *labelp, rtx *tablep)
2620 {
2621   rtx label, table;
2622
2623   if (JUMP_P (insn)
2624       && (label = JUMP_LABEL (insn)) != NULL_RTX
2625       && (table = next_active_insn (label)) != NULL_RTX
2626       && JUMP_P (table)
2627       && (GET_CODE (PATTERN (table)) == ADDR_VEC
2628           || GET_CODE (PATTERN (table)) == ADDR_DIFF_VEC))
2629     {
2630       if (labelp)
2631         *labelp = label;
2632       if (tablep)
2633         *tablep = table;
2634       return true;
2635     }
2636   return false;
2637 }
2638
2639 /* A subroutine of computed_jump_p, return 1 if X contains a REG or MEM or
2640    constant that is not in the constant pool and not in the condition
2641    of an IF_THEN_ELSE.  */
2642
2643 static int
2644 computed_jump_p_1 (const_rtx x)
2645 {
2646   const enum rtx_code code = GET_CODE (x);
2647   int i, j;
2648   const char *fmt;
2649
2650   switch (code)
2651     {
2652     case LABEL_REF:
2653     case PC:
2654       return 0;
2655
2656     case CONST:
2657     case CONST_INT:
2658     case CONST_DOUBLE:
2659     case CONST_FIXED:
2660     case CONST_VECTOR:
2661     case SYMBOL_REF:
2662     case REG:
2663       return 1;
2664
2665     case MEM:
2666       return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
2667                 && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
2668
2669     case IF_THEN_ELSE:
2670       return (computed_jump_p_1 (XEXP (x, 1))
2671               || computed_jump_p_1 (XEXP (x, 2)));
2672
2673     default:
2674       break;
2675     }
2676
2677   fmt = GET_RTX_FORMAT (code);
2678   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2679     {
2680       if (fmt[i] == 'e'
2681           && computed_jump_p_1 (XEXP (x, i)))
2682         return 1;
2683
2684       else if (fmt[i] == 'E')
2685         for (j = 0; j < XVECLEN (x, i); j++)
2686           if (computed_jump_p_1 (XVECEXP (x, i, j)))
2687             return 1;
2688     }
2689
2690   return 0;
2691 }
2692
2693 /* Return nonzero if INSN is an indirect jump (aka computed jump).
2694
2695    Tablejumps and casesi insns are not considered indirect jumps;
2696    we can recognize them by a (use (label_ref)).  */
2697
2698 int
2699 computed_jump_p (const_rtx insn)
2700 {
2701   int i;
2702   if (JUMP_P (insn))
2703     {
2704       rtx pat = PATTERN (insn);
2705
2706       /* If we have a JUMP_LABEL set, we're not a computed jump.  */
2707       if (JUMP_LABEL (insn) != NULL)
2708         return 0;
2709
2710       if (GET_CODE (pat) == PARALLEL)
2711         {
2712           int len = XVECLEN (pat, 0);
2713           int has_use_labelref = 0;
2714
2715           for (i = len - 1; i >= 0; i--)
2716             if (GET_CODE (XVECEXP (pat, 0, i)) == USE
2717                 && (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0))
2718                     == LABEL_REF))
2719               has_use_labelref = 1;
2720
2721           if (! has_use_labelref)
2722             for (i = len - 1; i >= 0; i--)
2723               if (GET_CODE (XVECEXP (pat, 0, i)) == SET
2724                   && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
2725                   && computed_jump_p_1 (SET_SRC (XVECEXP (pat, 0, i))))
2726                 return 1;
2727         }
2728       else if (GET_CODE (pat) == SET
2729                && SET_DEST (pat) == pc_rtx
2730                && computed_jump_p_1 (SET_SRC (pat)))
2731         return 1;
2732     }
2733   return 0;
2734 }
2735
2736 /* Optimized loop of for_each_rtx, trying to avoid useless recursive
2737    calls.  Processes the subexpressions of EXP and passes them to F.  */
2738 static int
2739 for_each_rtx_1 (rtx exp, int n, rtx_function f, void *data)
2740 {
2741   int result, i, j;
2742   const char *format = GET_RTX_FORMAT (GET_CODE (exp));
2743   rtx *x;
2744
2745   for (; format[n] != '\0'; n++)
2746     {
2747       switch (format[n])
2748         {
2749         case 'e':
2750           /* Call F on X.  */
2751           x = &XEXP (exp, n);
2752           result = (*f) (x, data);
2753           if (result == -1)
2754             /* Do not traverse sub-expressions.  */
2755             continue;
2756           else if (result != 0)
2757             /* Stop the traversal.  */
2758             return result;
2759         
2760           if (*x == NULL_RTX)
2761             /* There are no sub-expressions.  */
2762             continue;
2763         
2764           i = non_rtx_starting_operands[GET_CODE (*x)];
2765           if (i >= 0)
2766             {
2767               result = for_each_rtx_1 (*x, i, f, data);
2768               if (result != 0)
2769                 return result;
2770             }
2771           break;
2772
2773         case 'V':
2774         case 'E':
2775           if (XVEC (exp, n) == 0)
2776             continue;
2777           for (j = 0; j < XVECLEN (exp, n); ++j)
2778             {
2779               /* Call F on X.  */
2780               x = &XVECEXP (exp, n, j);
2781               result = (*f) (x, data);
2782               if (result == -1)
2783                 /* Do not traverse sub-expressions.  */
2784                 continue;
2785               else if (result != 0)
2786                 /* Stop the traversal.  */
2787                 return result;
2788         
2789               if (*x == NULL_RTX)
2790                 /* There are no sub-expressions.  */
2791                 continue;
2792         
2793               i = non_rtx_starting_operands[GET_CODE (*x)];
2794               if (i >= 0)
2795                 {
2796                   result = for_each_rtx_1 (*x, i, f, data);
2797                   if (result != 0)
2798                     return result;
2799                 }
2800             }
2801           break;
2802
2803         default:
2804           /* Nothing to do.  */
2805           break;
2806         }
2807     }
2808
2809   return 0;
2810 }
2811
2812 /* Traverse X via depth-first search, calling F for each
2813    sub-expression (including X itself).  F is also passed the DATA.
2814    If F returns -1, do not traverse sub-expressions, but continue
2815    traversing the rest of the tree.  If F ever returns any other
2816    nonzero value, stop the traversal, and return the value returned
2817    by F.  Otherwise, return 0.  This function does not traverse inside
2818    tree structure that contains RTX_EXPRs, or into sub-expressions
2819    whose format code is `0' since it is not known whether or not those
2820    codes are actually RTL.
2821
2822    This routine is very general, and could (should?) be used to
2823    implement many of the other routines in this file.  */
2824
2825 int
2826 for_each_rtx (rtx *x, rtx_function f, void *data)
2827 {
2828   int result;
2829   int i;
2830
2831   /* Call F on X.  */
2832   result = (*f) (x, data);
2833   if (result == -1)
2834     /* Do not traverse sub-expressions.  */
2835     return 0;
2836   else if (result != 0)
2837     /* Stop the traversal.  */
2838     return result;
2839
2840   if (*x == NULL_RTX)
2841     /* There are no sub-expressions.  */
2842     return 0;
2843
2844   i = non_rtx_starting_operands[GET_CODE (*x)];
2845   if (i < 0)
2846     return 0;
2847
2848   return for_each_rtx_1 (*x, i, f, data);
2849 }
2850
2851
2852 /* Searches X for any reference to REGNO, returning the rtx of the
2853    reference found if any.  Otherwise, returns NULL_RTX.  */
2854
2855 rtx
2856 regno_use_in (unsigned int regno, rtx x)
2857 {
2858   const char *fmt;
2859   int i, j;
2860   rtx tem;
2861
2862   if (REG_P (x) && REGNO (x) == regno)
2863     return x;
2864
2865   fmt = GET_RTX_FORMAT (GET_CODE (x));
2866   for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
2867     {
2868       if (fmt[i] == 'e')
2869         {
2870           if ((tem = regno_use_in (regno, XEXP (x, i))))
2871             return tem;
2872         }
2873       else if (fmt[i] == 'E')
2874         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2875           if ((tem = regno_use_in (regno , XVECEXP (x, i, j))))
2876             return tem;
2877     }
2878
2879   return NULL_RTX;
2880 }
2881
2882 /* Return a value indicating whether OP, an operand of a commutative
2883    operation, is preferred as the first or second operand.  The higher
2884    the value, the stronger the preference for being the first operand.
2885    We use negative values to indicate a preference for the first operand
2886    and positive values for the second operand.  */
2887
2888 int
2889 commutative_operand_precedence (rtx op)
2890 {
2891   enum rtx_code code = GET_CODE (op);
2892   
2893   /* Constants always come the second operand.  Prefer "nice" constants.  */
2894   if (code == CONST_INT)
2895     return -8;
2896   if (code == CONST_DOUBLE)
2897     return -7;
2898   if (code == CONST_FIXED)
2899     return -7;
2900   op = avoid_constant_pool_reference (op);
2901   code = GET_CODE (op);
2902
2903   switch (GET_RTX_CLASS (code))
2904     {
2905     case RTX_CONST_OBJ:
2906       if (code == CONST_INT)
2907         return -6;
2908       if (code == CONST_DOUBLE)
2909         return -5;
2910       if (code == CONST_FIXED)
2911         return -5;
2912       return -4;
2913
2914     case RTX_EXTRA:
2915       /* SUBREGs of objects should come second.  */
2916       if (code == SUBREG && OBJECT_P (SUBREG_REG (op)))
2917         return -3;
2918       return 0;
2919
2920     case RTX_OBJ:
2921       /* Complex expressions should be the first, so decrease priority
2922          of objects.  Prefer pointer objects over non pointer objects.  */
2923       if ((REG_P (op) && REG_POINTER (op))
2924           || (MEM_P (op) && MEM_POINTER (op)))
2925         return -1;
2926       return -2;
2927
2928     case RTX_COMM_ARITH:
2929       /* Prefer operands that are themselves commutative to be first.
2930          This helps to make things linear.  In particular,
2931          (and (and (reg) (reg)) (not (reg))) is canonical.  */
2932       return 4;
2933
2934     case RTX_BIN_ARITH:
2935       /* If only one operand is a binary expression, it will be the first
2936          operand.  In particular,  (plus (minus (reg) (reg)) (neg (reg)))
2937          is canonical, although it will usually be further simplified.  */
2938       return 2;
2939   
2940     case RTX_UNARY:
2941       /* Then prefer NEG and NOT.  */
2942       if (code == NEG || code == NOT)
2943         return 1;
2944
2945     default:
2946       return 0;
2947     }
2948 }
2949
2950 /* Return 1 iff it is necessary to swap operands of commutative operation
2951    in order to canonicalize expression.  */
2952
2953 bool
2954 swap_commutative_operands_p (rtx x, rtx y)
2955 {
2956   return (commutative_operand_precedence (x)
2957           < commutative_operand_precedence (y));
2958 }
2959
2960 /* Return 1 if X is an autoincrement side effect and the register is
2961    not the stack pointer.  */
2962 int
2963 auto_inc_p (const_rtx x)
2964 {
2965   switch (GET_CODE (x))
2966     {
2967     case PRE_INC:
2968     case POST_INC:
2969     case PRE_DEC:
2970     case POST_DEC:
2971     case PRE_MODIFY:
2972     case POST_MODIFY:
2973       /* There are no REG_INC notes for SP.  */
2974       if (XEXP (x, 0) != stack_pointer_rtx)
2975         return 1;
2976     default:
2977       break;
2978     }
2979   return 0;
2980 }
2981
2982 /* Return nonzero if IN contains a piece of rtl that has the address LOC.  */
2983 int
2984 loc_mentioned_in_p (rtx *loc, const_rtx in)
2985 {
2986   enum rtx_code code;
2987   const char *fmt;
2988   int i, j;
2989
2990   if (!in)
2991     return 0;
2992
2993   code = GET_CODE (in);
2994   fmt = GET_RTX_FORMAT (code);
2995   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2996     {
2997       if (loc == &in->u.fld[i].rt_rtx)
2998         return 1;
2999       if (fmt[i] == 'e')
3000         {
3001           if (loc_mentioned_in_p (loc, XEXP (in, i)))
3002             return 1;
3003         }
3004       else if (fmt[i] == 'E')
3005         for (j = XVECLEN (in, i) - 1; j >= 0; j--)
3006           if (loc_mentioned_in_p (loc, XVECEXP (in, i, j)))
3007             return 1;
3008     }
3009   return 0;
3010 }
3011
3012 /* Helper function for subreg_lsb.  Given a subreg's OUTER_MODE, INNER_MODE,
3013    and SUBREG_BYTE, return the bit offset where the subreg begins
3014    (counting from the least significant bit of the operand).  */
3015
3016 unsigned int
3017 subreg_lsb_1 (enum machine_mode outer_mode,
3018               enum machine_mode inner_mode,
3019               unsigned int subreg_byte)
3020 {
3021   unsigned int bitpos;
3022   unsigned int byte;
3023   unsigned int word;
3024
3025   /* A paradoxical subreg begins at bit position 0.  */
3026   if (GET_MODE_BITSIZE (outer_mode) > GET_MODE_BITSIZE (inner_mode))
3027     return 0;
3028
3029   if (WORDS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
3030     /* If the subreg crosses a word boundary ensure that
3031        it also begins and ends on a word boundary.  */
3032     gcc_assert (!((subreg_byte % UNITS_PER_WORD
3033                   + GET_MODE_SIZE (outer_mode)) > UNITS_PER_WORD
3034                   && (subreg_byte % UNITS_PER_WORD
3035                       || GET_MODE_SIZE (outer_mode) % UNITS_PER_WORD)));
3036
3037   if (WORDS_BIG_ENDIAN)
3038     word = (GET_MODE_SIZE (inner_mode)
3039             - (subreg_byte + GET_MODE_SIZE (outer_mode))) / UNITS_PER_WORD;
3040   else
3041     word = subreg_byte / UNITS_PER_WORD;
3042   bitpos = word * BITS_PER_WORD;
3043
3044   if (BYTES_BIG_ENDIAN)
3045     byte = (GET_MODE_SIZE (inner_mode)
3046             - (subreg_byte + GET_MODE_SIZE (outer_mode))) % UNITS_PER_WORD;
3047   else
3048     byte = subreg_byte % UNITS_PER_WORD;
3049   bitpos += byte * BITS_PER_UNIT;
3050
3051   return bitpos;
3052 }
3053
3054 /* Given a subreg X, return the bit offset where the subreg begins
3055    (counting from the least significant bit of the reg).  */
3056
3057 unsigned int
3058 subreg_lsb (const_rtx x)
3059 {
3060   return subreg_lsb_1 (GET_MODE (x), GET_MODE (SUBREG_REG (x)),
3061                        SUBREG_BYTE (x));
3062 }
3063
3064 /* Fill in information about a subreg of a hard register.
3065    xregno - A regno of an inner hard subreg_reg (or what will become one).
3066    xmode  - The mode of xregno.
3067    offset - The byte offset.
3068    ymode  - The mode of a top level SUBREG (or what may become one).
3069    info   - Pointer to structure to fill in.  */
3070 static void
3071 subreg_get_info (unsigned int xregno, enum machine_mode xmode,
3072                  unsigned int offset, enum machine_mode ymode,
3073                  struct subreg_info *info)
3074 {
3075   int nregs_xmode, nregs_ymode;
3076   int mode_multiple, nregs_multiple;
3077   int offset_adj, y_offset, y_offset_adj;
3078   int regsize_xmode, regsize_ymode;
3079   bool rknown;
3080
3081   gcc_assert (xregno < FIRST_PSEUDO_REGISTER);
3082
3083   rknown = false;
3084
3085   /* If there are holes in a non-scalar mode in registers, we expect
3086      that it is made up of its units concatenated together.  */
3087   if (HARD_REGNO_NREGS_HAS_PADDING (xregno, xmode))
3088     {
3089       enum machine_mode xmode_unit;
3090
3091       nregs_xmode = HARD_REGNO_NREGS_WITH_PADDING (xregno, xmode);
3092       if (GET_MODE_INNER (xmode) == VOIDmode)
3093         xmode_unit = xmode;
3094       else
3095         xmode_unit = GET_MODE_INNER (xmode);
3096       gcc_assert (HARD_REGNO_NREGS_HAS_PADDING (xregno, xmode_unit));
3097       gcc_assert (nregs_xmode
3098                   == (GET_MODE_NUNITS (xmode)
3099                       * HARD_REGNO_NREGS_WITH_PADDING (xregno, xmode_unit)));
3100       gcc_assert (hard_regno_nregs[xregno][xmode]
3101                   == (hard_regno_nregs[xregno][xmode_unit]
3102                       * GET_MODE_NUNITS (xmode)));
3103
3104       /* You can only ask for a SUBREG of a value with holes in the middle
3105          if you don't cross the holes.  (Such a SUBREG should be done by
3106          picking a different register class, or doing it in memory if
3107          necessary.)  An example of a value with holes is XCmode on 32-bit
3108          x86 with -m128bit-long-double; it's represented in 6 32-bit registers,
3109          3 for each part, but in memory it's two 128-bit parts.  
3110          Padding is assumed to be at the end (not necessarily the 'high part')
3111          of each unit.  */
3112       if ((offset / GET_MODE_SIZE (xmode_unit) + 1 
3113            < GET_MODE_NUNITS (xmode))
3114           && (offset / GET_MODE_SIZE (xmode_unit)
3115               != ((offset + GET_MODE_SIZE (ymode) - 1)
3116                   / GET_MODE_SIZE (xmode_unit))))
3117         {
3118           info->representable_p = false;
3119           rknown = true;
3120         }
3121     }
3122   else
3123     nregs_xmode = hard_regno_nregs[xregno][xmode];
3124   
3125   nregs_ymode = hard_regno_nregs[xregno][ymode];
3126
3127   /* Paradoxical subregs are otherwise valid.  */
3128   if (!rknown
3129       && offset == 0
3130       && GET_MODE_SIZE (ymode) > GET_MODE_SIZE (xmode))
3131     {
3132       info->representable_p = true;
3133       /* If this is a big endian paradoxical subreg, which uses more
3134          actual hard registers than the original register, we must
3135          return a negative offset so that we find the proper highpart
3136          of the register.  */
3137       if (GET_MODE_SIZE (ymode) > UNITS_PER_WORD
3138           ? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN)
3139         info->offset = nregs_xmode - nregs_ymode;
3140       else
3141         info->offset = 0;
3142       info->nregs = nregs_ymode;
3143       return;
3144     }
3145
3146   /* If registers store different numbers of bits in the different
3147      modes, we cannot generally form this subreg.  */
3148   if (!HARD_REGNO_NREGS_HAS_PADDING (xregno, xmode)
3149       && !HARD_REGNO_NREGS_HAS_PADDING (xregno, ymode)
3150       && (GET_MODE_SIZE (xmode) % nregs_xmode) == 0
3151       && (GET_MODE_SIZE (ymode) % nregs_ymode) == 0)
3152     {
3153       regsize_xmode = GET_MODE_SIZE (xmode) / nregs_xmode;
3154       regsize_ymode = GET_MODE_SIZE (ymode) / nregs_ymode;
3155       if (!rknown && regsize_xmode > regsize_ymode && nregs_ymode > 1)
3156         {
3157           info->representable_p = false;
3158           info->nregs
3159             = (GET_MODE_SIZE (ymode) + regsize_xmode - 1) / regsize_xmode;
3160           info->offset = offset / regsize_xmode;
3161           return;
3162         }
3163       if (!rknown && regsize_ymode > regsize_xmode && nregs_xmode > 1)
3164         {
3165           info->representable_p = false;
3166           info->nregs
3167             = (GET_MODE_SIZE (ymode) + regsize_xmode - 1) / regsize_xmode;
3168           info->offset = offset / regsize_xmode;
3169           return;
3170         }
3171     }
3172
3173   /* Lowpart subregs are otherwise valid.  */
3174   if (!rknown && offset == subreg_lowpart_offset (ymode, xmode))
3175     {
3176       info->representable_p = true;
3177       rknown = true;
3178
3179       if (offset == 0 || nregs_xmode == nregs_ymode)
3180         {
3181           info->offset = 0;
3182           info->nregs = nregs_ymode;
3183           return;
3184         }
3185     }
3186
3187   /* This should always pass, otherwise we don't know how to verify
3188      the constraint.  These conditions may be relaxed but
3189      subreg_regno_offset would need to be redesigned.  */
3190   gcc_assert ((GET_MODE_SIZE (xmode) % GET_MODE_SIZE (ymode)) == 0);
3191   gcc_assert ((nregs_xmode % nregs_ymode) == 0);
3192
3193   /* The XMODE value can be seen as a vector of NREGS_XMODE
3194      values.  The subreg must represent a lowpart of given field.
3195      Compute what field it is.  */
3196   offset_adj = offset;
3197   offset_adj -= subreg_lowpart_offset (ymode,
3198                                        mode_for_size (GET_MODE_BITSIZE (xmode)
3199                                                       / nregs_xmode,
3200                                                       MODE_INT, 0));
3201
3202   /* Size of ymode must not be greater than the size of xmode.  */
3203   mode_multiple = GET_MODE_SIZE (xmode) / GET_MODE_SIZE (ymode);
3204   gcc_assert (mode_multiple != 0);
3205
3206   y_offset = offset / GET_MODE_SIZE (ymode);
3207   y_offset_adj = offset_adj / GET_MODE_SIZE (ymode);
3208   nregs_multiple = nregs_xmode / nregs_ymode;
3209
3210   gcc_assert ((offset_adj % GET_MODE_SIZE (ymode)) == 0);
3211   gcc_assert ((mode_multiple % nregs_multiple) == 0);
3212
3213   if (!rknown)
3214     {
3215       info->representable_p = (!(y_offset_adj % (mode_multiple / nregs_multiple)));
3216       rknown = true;
3217     }
3218   info->offset = (y_offset / (mode_multiple / nregs_multiple)) * nregs_ymode;
3219   info->nregs = nregs_ymode;
3220 }
3221
3222 /* This function returns the regno offset of a subreg expression.
3223    xregno - A regno of an inner hard subreg_reg (or what will become one).
3224    xmode  - The mode of xregno.
3225    offset - The byte offset.
3226    ymode  - The mode of a top level SUBREG (or what may become one).
3227    RETURN - The regno offset which would be used.  */
3228 unsigned int
3229 subreg_regno_offset (unsigned int xregno, enum machine_mode xmode,
3230                      unsigned int offset, enum machine_mode ymode)
3231 {
3232   struct subreg_info info;
3233   subreg_get_info (xregno, xmode, offset, ymode, &info);
3234   return info.offset;
3235 }
3236
3237 /* This function returns true when the offset is representable via
3238    subreg_offset in the given regno.
3239    xregno - A regno of an inner hard subreg_reg (or what will become one).
3240    xmode  - The mode of xregno.
3241    offset - The byte offset.
3242    ymode  - The mode of a top level SUBREG (or what may become one).
3243    RETURN - Whether the offset is representable.  */
3244 bool
3245 subreg_offset_representable_p (unsigned int xregno, enum machine_mode xmode,
3246                                unsigned int offset, enum machine_mode ymode)
3247 {
3248   struct subreg_info info;
3249   subreg_get_info (xregno, xmode, offset, ymode, &info);
3250   return info.representable_p;
3251 }
3252
3253 /* Return the final regno that a subreg expression refers to.  */
3254 unsigned int
3255 subreg_regno (const_rtx x)
3256 {
3257   unsigned int ret;
3258   rtx subreg = SUBREG_REG (x);
3259   int regno = REGNO (subreg);
3260
3261   ret = regno + subreg_regno_offset (regno,
3262                                      GET_MODE (subreg),
3263                                      SUBREG_BYTE (x),
3264                                      GET_MODE (x));
3265   return ret;
3266
3267 }
3268
3269 /* Return the number of registers that a subreg expression refers
3270    to.  */
3271 unsigned int
3272 subreg_nregs (const_rtx x)
3273 {
3274   struct subreg_info info;
3275   rtx subreg = SUBREG_REG (x);
3276   int regno = REGNO (subreg);
3277
3278   subreg_get_info (regno, GET_MODE (subreg), SUBREG_BYTE (x), GET_MODE (x),
3279                    &info);
3280   return info.nregs;
3281 }
3282
3283 struct parms_set_data
3284 {
3285   int nregs;
3286   HARD_REG_SET regs;
3287 };
3288
3289 /* Helper function for noticing stores to parameter registers.  */
3290 static void
3291 parms_set (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
3292 {
3293   struct parms_set_data *d = data;
3294   if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER
3295       && TEST_HARD_REG_BIT (d->regs, REGNO (x)))
3296     {
3297       CLEAR_HARD_REG_BIT (d->regs, REGNO (x));
3298       d->nregs--;
3299     }
3300 }
3301
3302 /* Look backward for first parameter to be loaded.
3303    Note that loads of all parameters will not necessarily be
3304    found if CSE has eliminated some of them (e.g., an argument
3305    to the outer function is passed down as a parameter).
3306    Do not skip BOUNDARY.  */
3307 rtx
3308 find_first_parameter_load (rtx call_insn, rtx boundary)
3309 {
3310   struct parms_set_data parm;
3311   rtx p, before, first_set;
3312
3313   /* Since different machines initialize their parameter registers
3314      in different orders, assume nothing.  Collect the set of all
3315      parameter registers.  */
3316   CLEAR_HARD_REG_SET (parm.regs);
3317   parm.nregs = 0;
3318   for (p = CALL_INSN_FUNCTION_USAGE (call_insn); p; p = XEXP (p, 1))
3319     if (GET_CODE (XEXP (p, 0)) == USE
3320         && REG_P (XEXP (XEXP (p, 0), 0)))
3321       {
3322         gcc_assert (REGNO (XEXP (XEXP (p, 0), 0)) < FIRST_PSEUDO_REGISTER);
3323
3324         /* We only care about registers which can hold function
3325            arguments.  */
3326         if (!FUNCTION_ARG_REGNO_P (REGNO (XEXP (XEXP (p, 0), 0))))
3327           continue;
3328
3329         SET_HARD_REG_BIT (parm.regs, REGNO (XEXP (XEXP (p, 0), 0)));
3330         parm.nregs++;
3331       }
3332   before = call_insn;
3333   first_set = call_insn;
3334
3335   /* Search backward for the first set of a register in this set.  */
3336   while (parm.nregs && before != boundary)
3337     {
3338       before = PREV_INSN (before);
3339
3340       /* It is possible that some loads got CSEed from one call to
3341          another.  Stop in that case.  */
3342       if (CALL_P (before))
3343         break;
3344
3345       /* Our caller needs either ensure that we will find all sets
3346          (in case code has not been optimized yet), or take care
3347          for possible labels in a way by setting boundary to preceding
3348          CODE_LABEL.  */
3349       if (LABEL_P (before))
3350         {
3351           gcc_assert (before == boundary);
3352           break;
3353         }
3354
3355       if (INSN_P (before))
3356         {
3357           int nregs_old = parm.nregs;
3358           note_stores (PATTERN (before), parms_set, &parm);
3359           /* If we found something that did not set a parameter reg,
3360              we're done.  Do not keep going, as that might result
3361              in hoisting an insn before the setting of a pseudo
3362              that is used by the hoisted insn. */
3363           if (nregs_old != parm.nregs)
3364             first_set = before;
3365           else
3366             break;
3367         }
3368     }
3369   return first_set;
3370 }
3371
3372 /* Return true if we should avoid inserting code between INSN and preceding
3373    call instruction.  */
3374
3375 bool
3376 keep_with_call_p (const_rtx insn)
3377 {
3378   rtx set;
3379
3380   if (INSN_P (insn) && (set = single_set (insn)) != NULL)
3381     {
3382       if (REG_P (SET_DEST (set))
3383           && REGNO (SET_DEST (set)) < FIRST_PSEUDO_REGISTER
3384           && fixed_regs[REGNO (SET_DEST (set))]
3385           && general_operand (SET_SRC (set), VOIDmode))
3386         return true;
3387       if (REG_P (SET_SRC (set))
3388           && FUNCTION_VALUE_REGNO_P (REGNO (SET_SRC (set)))
3389           && REG_P (SET_DEST (set))
3390           && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
3391         return true;
3392       /* There may be a stack pop just after the call and before the store
3393          of the return register.  Search for the actual store when deciding
3394          if we can break or not.  */
3395       if (SET_DEST (set) == stack_pointer_rtx)
3396         {
3397           /* This CONST_CAST is okay because next_nonnote_insn just
3398              returns it's argument and we assign it to a const_rtx
3399              variable.  */
3400           const_rtx i2 = next_nonnote_insn (CONST_CAST_RTX(insn));
3401           if (i2 && keep_with_call_p (i2))
3402             return true;
3403         }
3404     }
3405   return false;
3406 }
3407
3408 /* Return true if LABEL is a target of JUMP_INSN.  This applies only
3409    to non-complex jumps.  That is, direct unconditional, conditional,
3410    and tablejumps, but not computed jumps or returns.  It also does
3411    not apply to the fallthru case of a conditional jump.  */
3412
3413 bool
3414 label_is_jump_target_p (const_rtx label, const_rtx jump_insn)
3415 {
3416   rtx tmp = JUMP_LABEL (jump_insn);
3417
3418   if (label == tmp)
3419     return true;
3420
3421   if (tablejump_p (jump_insn, NULL, &tmp))
3422     {
3423       rtvec vec = XVEC (PATTERN (tmp),
3424                         GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC);
3425       int i, veclen = GET_NUM_ELEM (vec);
3426
3427       for (i = 0; i < veclen; ++i)
3428         if (XEXP (RTVEC_ELT (vec, i), 0) == label)
3429           return true;
3430     }
3431
3432   return false;
3433 }
3434
3435 \f
3436 /* Return an estimate of the cost of computing rtx X.
3437    One use is in cse, to decide which expression to keep in the hash table.
3438    Another is in rtl generation, to pick the cheapest way to multiply.
3439    Other uses like the latter are expected in the future.  */
3440
3441 int
3442 rtx_cost (rtx x, enum rtx_code outer_code ATTRIBUTE_UNUSED)
3443 {
3444   int i, j;
3445   enum rtx_code code;
3446   const char *fmt;
3447   int total;
3448
3449   if (x == 0)
3450     return 0;
3451
3452   /* Compute the default costs of certain things.
3453      Note that targetm.rtx_costs can override the defaults.  */
3454
3455   code = GET_CODE (x);
3456   switch (code)
3457     {
3458     case MULT:
3459       total = COSTS_N_INSNS (5);
3460       break;
3461     case DIV:
3462     case UDIV:
3463     case MOD:
3464     case UMOD:
3465       total = COSTS_N_INSNS (7);
3466       break;
3467     case USE:
3468       /* Used in combine.c as a marker.  */
3469       total = 0;
3470       break;
3471     default:
3472       total = COSTS_N_INSNS (1);
3473     }
3474
3475   switch (code)
3476     {
3477     case REG:
3478       return 0;
3479
3480     case SUBREG:
3481       total = 0;
3482       /* If we can't tie these modes, make this expensive.  The larger
3483          the mode, the more expensive it is.  */
3484       if (! MODES_TIEABLE_P (GET_MODE (x), GET_MODE (SUBREG_REG (x))))
3485         return COSTS_N_INSNS (2
3486                               + GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD);
3487       break;
3488
3489     default:
3490       if (targetm.rtx_costs (x, code, outer_code, &total))
3491         return total;
3492       break;
3493     }
3494
3495   /* Sum the costs of the sub-rtx's, plus cost of this operation,
3496      which is already in total.  */
3497
3498   fmt = GET_RTX_FORMAT (code);
3499   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3500     if (fmt[i] == 'e')
3501       total += rtx_cost (XEXP (x, i), code);
3502     else if (fmt[i] == 'E')
3503       for (j = 0; j < XVECLEN (x, i); j++)
3504         total += rtx_cost (XVECEXP (x, i, j), code);
3505
3506   return total;
3507 }
3508 \f
3509 /* Return cost of address expression X.
3510    Expect that X is properly formed address reference.  */
3511
3512 int
3513 address_cost (rtx x, enum machine_mode mode)
3514 {
3515   /* We may be asked for cost of various unusual addresses, such as operands
3516      of push instruction.  It is not worthwhile to complicate writing
3517      of the target hook by such cases.  */
3518
3519   if (!memory_address_p (mode, x))
3520     return 1000;
3521
3522   return targetm.address_cost (x);
3523 }
3524
3525 /* If the target doesn't override, compute the cost as with arithmetic.  */
3526
3527 int
3528 default_address_cost (rtx x)
3529 {
3530   return rtx_cost (x, MEM);
3531 }
3532 \f
3533
3534 unsigned HOST_WIDE_INT
3535 nonzero_bits (const_rtx x, enum machine_mode mode)
3536 {
3537   return cached_nonzero_bits (x, mode, NULL_RTX, VOIDmode, 0);
3538 }
3539
3540 unsigned int
3541 num_sign_bit_copies (const_rtx x, enum machine_mode mode)
3542 {
3543   return cached_num_sign_bit_copies (x, mode, NULL_RTX, VOIDmode, 0);
3544 }
3545
3546 /* The function cached_nonzero_bits is a wrapper around nonzero_bits1.
3547    It avoids exponential behavior in nonzero_bits1 when X has
3548    identical subexpressions on the first or the second level.  */
3549
3550 static unsigned HOST_WIDE_INT
3551 cached_nonzero_bits (const_rtx x, enum machine_mode mode, const_rtx known_x,
3552                      enum machine_mode known_mode,
3553                      unsigned HOST_WIDE_INT known_ret)
3554 {
3555   if (x == known_x && mode == known_mode)
3556     return known_ret;
3557
3558   /* Try to find identical subexpressions.  If found call
3559      nonzero_bits1 on X with the subexpressions as KNOWN_X and the
3560      precomputed value for the subexpression as KNOWN_RET.  */
3561
3562   if (ARITHMETIC_P (x))
3563     {
3564       rtx x0 = XEXP (x, 0);
3565       rtx x1 = XEXP (x, 1);
3566
3567       /* Check the first level.  */
3568       if (x0 == x1)
3569         return nonzero_bits1 (x, mode, x0, mode,
3570                               cached_nonzero_bits (x0, mode, known_x,
3571                                                    known_mode, known_ret));
3572
3573       /* Check the second level.  */
3574       if (ARITHMETIC_P (x0)
3575           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
3576         return nonzero_bits1 (x, mode, x1, mode,
3577                               cached_nonzero_bits (x1, mode, known_x,
3578                                                    known_mode, known_ret));
3579
3580       if (ARITHMETIC_P (x1)
3581           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
3582         return nonzero_bits1 (x, mode, x0, mode,
3583                               cached_nonzero_bits (x0, mode, known_x,
3584                                                    known_mode, known_ret));
3585     }
3586
3587   return nonzero_bits1 (x, mode, known_x, known_mode, known_ret);
3588 }
3589
3590 /* We let num_sign_bit_copies recur into nonzero_bits as that is useful.
3591    We don't let nonzero_bits recur into num_sign_bit_copies, because that
3592    is less useful.  We can't allow both, because that results in exponential
3593    run time recursion.  There is a nullstone testcase that triggered
3594    this.  This macro avoids accidental uses of num_sign_bit_copies.  */
3595 #define cached_num_sign_bit_copies sorry_i_am_preventing_exponential_behavior
3596
3597 /* Given an expression, X, compute which bits in X can be nonzero.
3598    We don't care about bits outside of those defined in MODE.
3599
3600    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
3601    an arithmetic operation, we can do better.  */
3602
3603 static unsigned HOST_WIDE_INT
3604 nonzero_bits1 (const_rtx x, enum machine_mode mode, const_rtx known_x,
3605                enum machine_mode known_mode,
3606                unsigned HOST_WIDE_INT known_ret)
3607 {
3608   unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode);
3609   unsigned HOST_WIDE_INT inner_nz;
3610   enum rtx_code code;
3611   unsigned int mode_width = GET_MODE_BITSIZE (mode);
3612
3613   /* For floating-point values, assume all bits are needed.  */
3614   if (FLOAT_MODE_P (GET_MODE (x)) || FLOAT_MODE_P (mode))
3615     return nonzero;
3616
3617   /* If X is wider than MODE, use its mode instead.  */
3618   if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width)
3619     {
3620       mode = GET_MODE (x);
3621       nonzero = GET_MODE_MASK (mode);
3622       mode_width = GET_MODE_BITSIZE (mode);
3623     }
3624
3625   if (mode_width > HOST_BITS_PER_WIDE_INT)
3626     /* Our only callers in this case look for single bit values.  So
3627        just return the mode mask.  Those tests will then be false.  */
3628     return nonzero;
3629
3630 #ifndef WORD_REGISTER_OPERATIONS
3631   /* If MODE is wider than X, but both are a single word for both the host
3632      and target machines, we can compute this from which bits of the
3633      object might be nonzero in its own mode, taking into account the fact
3634      that on many CISC machines, accessing an object in a wider mode
3635      causes the high-order bits to become undefined.  So they are
3636      not known to be zero.  */
3637
3638   if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode
3639       && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD
3640       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
3641       && GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (GET_MODE (x)))
3642     {
3643       nonzero &= cached_nonzero_bits (x, GET_MODE (x),
3644                                       known_x, known_mode, known_ret);
3645       nonzero |= GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x));
3646       return nonzero;
3647     }
3648 #endif
3649
3650   code = GET_CODE (x);
3651   switch (code)
3652     {
3653     case REG:
3654 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
3655       /* If pointers extend unsigned and this is a pointer in Pmode, say that
3656          all the bits above ptr_mode are known to be zero.  */
3657       if (POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
3658           && REG_POINTER (x))
3659         nonzero &= GET_MODE_MASK (ptr_mode);
3660 #endif
3661
3662       /* Include declared information about alignment of pointers.  */
3663       /* ??? We don't properly preserve REG_POINTER changes across
3664          pointer-to-integer casts, so we can't trust it except for
3665          things that we know must be pointers.  See execute/960116-1.c.  */
3666       if ((x == stack_pointer_rtx
3667            || x == frame_pointer_rtx
3668            || x == arg_pointer_rtx)
3669           && REGNO_POINTER_ALIGN (REGNO (x)))
3670         {
3671           unsigned HOST_WIDE_INT alignment
3672             = REGNO_POINTER_ALIGN (REGNO (x)) / BITS_PER_UNIT;
3673
3674 #ifdef PUSH_ROUNDING
3675           /* If PUSH_ROUNDING is defined, it is possible for the
3676              stack to be momentarily aligned only to that amount,
3677              so we pick the least alignment.  */
3678           if (x == stack_pointer_rtx && PUSH_ARGS)
3679             alignment = MIN ((unsigned HOST_WIDE_INT) PUSH_ROUNDING (1),
3680                              alignment);
3681 #endif
3682
3683           nonzero &= ~(alignment - 1);
3684         }
3685
3686       {
3687         unsigned HOST_WIDE_INT nonzero_for_hook = nonzero;
3688         rtx new = rtl_hooks.reg_nonzero_bits (x, mode, known_x,
3689                                               known_mode, known_ret,
3690                                               &nonzero_for_hook);
3691
3692         if (new)
3693           nonzero_for_hook &= cached_nonzero_bits (new, mode, known_x,
3694                                                    known_mode, known_ret);
3695
3696         return nonzero_for_hook;
3697       }
3698
3699     case CONST_INT:
3700 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
3701       /* If X is negative in MODE, sign-extend the value.  */
3702       if (INTVAL (x) > 0 && mode_width < BITS_PER_WORD
3703           && 0 != (INTVAL (x) & ((HOST_WIDE_INT) 1 << (mode_width - 1))))
3704         return (INTVAL (x) | ((HOST_WIDE_INT) (-1) << mode_width));
3705 #endif
3706
3707       return INTVAL (x);
3708
3709     case MEM:
3710 #ifdef LOAD_EXTEND_OP
3711       /* In many, if not most, RISC machines, reading a byte from memory
3712          zeros the rest of the register.  Noticing that fact saves a lot
3713          of extra zero-extends.  */
3714       if (LOAD_EXTEND_OP (GET_MODE (x)) == ZERO_EXTEND)
3715         nonzero &= GET_MODE_MASK (GET_MODE (x));
3716 #endif
3717       break;
3718
3719     case EQ:  case NE:
3720     case UNEQ:  case LTGT:
3721     case GT:  case GTU:  case UNGT:
3722     case LT:  case LTU:  case UNLT:
3723     case GE:  case GEU:  case UNGE:
3724     case LE:  case LEU:  case UNLE:
3725     case UNORDERED: case ORDERED:
3726       /* If this produces an integer result, we know which bits are set.
3727          Code here used to clear bits outside the mode of X, but that is
3728          now done above.  */
3729       /* Mind that MODE is the mode the caller wants to look at this 
3730          operation in, and not the actual operation mode.  We can wind 
3731          up with (subreg:DI (gt:V4HI x y)), and we don't have anything
3732          that describes the results of a vector compare.  */
3733       if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
3734           && mode_width <= HOST_BITS_PER_WIDE_INT)
3735         nonzero = STORE_FLAG_VALUE;
3736       break;
3737
3738     case NEG:
3739 #if 0
3740       /* Disabled to avoid exponential mutual recursion between nonzero_bits
3741          and num_sign_bit_copies.  */
3742       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
3743           == GET_MODE_BITSIZE (GET_MODE (x)))
3744         nonzero = 1;
3745 #endif
3746
3747       if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
3748         nonzero |= (GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x)));
3749       break;
3750
3751     case ABS:
3752 #if 0
3753       /* Disabled to avoid exponential mutual recursion between nonzero_bits
3754          and num_sign_bit_copies.  */
3755       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
3756           == GET_MODE_BITSIZE (GET_MODE (x)))
3757         nonzero = 1;
3758 #endif
3759       break;
3760
3761     case TRUNCATE:
3762       nonzero &= (cached_nonzero_bits (XEXP (x, 0), mode,
3763                                        known_x, known_mode, known_ret)
3764                   & GET_MODE_MASK (mode));
3765       break;
3766
3767     case ZERO_EXTEND:
3768       nonzero &= cached_nonzero_bits (XEXP (x, 0), mode,
3769                                       known_x, known_mode, known_ret);
3770       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
3771         nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
3772       break;
3773
3774     case SIGN_EXTEND:
3775       /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
3776          Otherwise, show all the bits in the outer mode but not the inner
3777          may be nonzero.  */
3778       inner_nz = cached_nonzero_bits (XEXP (x, 0), mode,
3779                                       known_x, known_mode, known_ret);
3780       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
3781         {
3782           inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
3783           if (inner_nz
3784               & (((HOST_WIDE_INT) 1
3785                   << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))))
3786             inner_nz |= (GET_MODE_MASK (mode)
3787                          & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0))));
3788         }
3789
3790       nonzero &= inner_nz;
3791       break;
3792
3793     case AND:
3794       nonzero &= cached_nonzero_bits (XEXP (x, 0), mode,
3795                                        known_x, known_mode, known_ret)
3796                  & cached_nonzero_bits (XEXP (x, 1), mode,
3797                                         known_x, known_mode, known_ret);
3798       break;
3799
3800     case XOR:   case IOR:
3801     case UMIN:  case UMAX:  case SMIN:  case SMAX:
3802       {
3803         unsigned HOST_WIDE_INT nonzero0 =
3804           cached_nonzero_bits (XEXP (x, 0), mode,
3805                                known_x, known_mode, known_ret);
3806
3807         /* Don't call nonzero_bits for the second time if it cannot change
3808            anything.  */
3809         if ((nonzero & nonzero0) != nonzero)
3810           nonzero &= nonzero0
3811                      | cached_nonzero_bits (XEXP (x, 1), mode,
3812                                             known_x, known_mode, known_ret);
3813       }
3814       break;
3815
3816     case PLUS:  case MINUS:
3817     case MULT:
3818     case DIV:   case UDIV:
3819     case MOD:   case UMOD:
3820       /* We can apply the rules of arithmetic to compute the number of
3821          high- and low-order zero bits of these operations.  We start by
3822          computing the width (position of the highest-order nonzero bit)
3823          and the number of low-order zero bits for each value.  */
3824       {
3825         unsigned HOST_WIDE_INT nz0 =
3826           cached_nonzero_bits (XEXP (x, 0), mode,
3827                                known_x, known_mode, known_ret);
3828         unsigned HOST_WIDE_INT nz1 =
3829           cached_nonzero_bits (XEXP (x, 1), mode,
3830                                known_x, known_mode, known_ret);
3831         int sign_index = GET_MODE_BITSIZE (GET_MODE (x)) - 1;
3832         int width0 = floor_log2 (nz0) + 1;
3833         int width1 = floor_log2 (nz1) + 1;
3834         int low0 = floor_log2 (nz0 & -nz0);
3835         int low1 = floor_log2 (nz1 & -nz1);
3836         HOST_WIDE_INT op0_maybe_minusp
3837           = (nz0 & ((HOST_WIDE_INT) 1 << sign_index));
3838         HOST_WIDE_INT op1_maybe_minusp
3839           = (nz1 & ((HOST_WIDE_INT) 1 << sign_index));
3840         unsigned int result_width = mode_width;
3841         int result_low = 0;
3842
3843         switch (code)
3844           {
3845           case PLUS:
3846             result_width = MAX (width0, width1) + 1;
3847             result_low = MIN (low0, low1);
3848             break;
3849           case MINUS:
3850             result_low = MIN (low0, low1);
3851             break;
3852           case MULT:
3853             result_width = width0 + width1;
3854             result_low = low0 + low1;
3855             break;
3856           case DIV:
3857             if (width1 == 0)
3858               break;
3859             if (! op0_maybe_minusp && ! op1_maybe_minusp)
3860               result_width = width0;
3861             break;
3862           case UDIV:
3863             if (width1 == 0)
3864               break;
3865             result_width = width0;
3866             break;
3867           case MOD:
3868             if (width1 == 0)
3869               break;
3870             if (! op0_maybe_minusp && ! op1_maybe_minusp)
3871               result_width = MIN (width0, width1);
3872             result_low = MIN (low0, low1);
3873             break;
3874           case UMOD:
3875             if (width1 == 0)
3876               break;
3877             result_width = MIN (width0, width1);
3878             result_low = MIN (low0, low1);
3879             break;
3880           default:
3881             gcc_unreachable ();
3882           }
3883
3884         if (result_width < mode_width)
3885           nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1;
3886
3887         if (result_low > 0)
3888           nonzero &= ~(((HOST_WIDE_INT) 1 << result_low) - 1);
3889
3890 #ifdef POINTERS_EXTEND_UNSIGNED
3891         /* If pointers extend unsigned and this is an addition or subtraction
3892            to a pointer in Pmode, all the bits above ptr_mode are known to be
3893            zero.  */
3894         if (POINTERS_EXTEND_UNSIGNED > 0 && GET_MODE (x) == Pmode
3895             && (code == PLUS || code == MINUS)
3896             && REG_P (XEXP (x, 0)) && REG_POINTER (XEXP (x, 0)))
3897           nonzero &= GET_MODE_MASK (ptr_mode);
3898 #endif
3899       }
3900       break;
3901
3902     case ZERO_EXTRACT:
3903       if (GET_CODE (XEXP (x, 1)) == CONST_INT
3904           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
3905         nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1;
3906       break;
3907
3908     case SUBREG:
3909       /* If this is a SUBREG formed for a promoted variable that has
3910          been zero-extended, we know that at least the high-order bits
3911          are zero, though others might be too.  */
3912
3913       if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x) > 0)
3914         nonzero = GET_MODE_MASK (GET_MODE (x))
3915                   & cached_nonzero_bits (SUBREG_REG (x), GET_MODE (x),
3916                                          known_x, known_mode, known_ret);
3917
3918       /* If the inner mode is a single word for both the host and target
3919          machines, we can compute this from which bits of the inner
3920          object might be nonzero.  */
3921       if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD
3922           && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
3923               <= HOST_BITS_PER_WIDE_INT))
3924         {
3925           nonzero &= cached_nonzero_bits (SUBREG_REG (x), mode,
3926                                           known_x, known_mode, known_ret);
3927
3928 #if defined (WORD_REGISTER_OPERATIONS) && defined (LOAD_EXTEND_OP)
3929           /* If this is a typical RISC machine, we only have to worry
3930              about the way loads are extended.  */
3931           if ((LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
3932                ? (((nonzero
3933                     & (((unsigned HOST_WIDE_INT) 1
3934                         << (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) - 1))))
3935                    != 0))
3936                : LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) != ZERO_EXTEND)
3937               || !MEM_P (SUBREG_REG (x)))
3938 #endif
3939             {
3940               /* On many CISC machines, accessing an object in a wider mode
3941                  causes the high-order bits to become undefined.  So they are
3942                  not known to be zero.  */
3943               if (GET_MODE_SIZE (GET_MODE (x))
3944                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
3945                 nonzero |= (GET_MODE_MASK (GET_MODE (x))
3946                             & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x))));
3947             }
3948         }
3949       break;
3950
3951     case ASHIFTRT:
3952     case LSHIFTRT:
3953     case ASHIFT:
3954     case ROTATE:
3955       /* The nonzero bits are in two classes: any bits within MODE
3956          that aren't in GET_MODE (x) are always significant.  The rest of the
3957          nonzero bits are those that are significant in the operand of
3958          the shift when shifted the appropriate number of bits.  This
3959          shows that high-order bits are cleared by the right shift and
3960          low-order bits by left shifts.  */
3961       if (GET_CODE (XEXP (x, 1)) == CONST_INT
3962           && INTVAL (XEXP (x, 1)) >= 0
3963           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
3964         {
3965           enum machine_mode inner_mode = GET_MODE (x);
3966           unsigned int width = GET_MODE_BITSIZE (inner_mode);
3967           int count = INTVAL (XEXP (x, 1));
3968           unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode);
3969           unsigned HOST_WIDE_INT op_nonzero =
3970             cached_nonzero_bits (XEXP (x, 0), mode,
3971                                  known_x, known_mode, known_ret);
3972           unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask;
3973           unsigned HOST_WIDE_INT outer = 0;
3974
3975           if (mode_width > width)
3976             outer = (op_nonzero & nonzero & ~mode_mask);
3977
3978           if (code == LSHIFTRT)
3979             inner >>= count;
3980           else if (code == ASHIFTRT)
3981             {
3982               inner >>= count;
3983
3984               /* If the sign bit may have been nonzero before the shift, we
3985                  need to mark all the places it could have been copied to
3986                  by the shift as possibly nonzero.  */
3987               if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count)))
3988                 inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count);
3989             }
3990           else if (code == ASHIFT)
3991             inner <<= count;
3992           else
3993             inner = ((inner << (count % width)
3994                       | (inner >> (width - (count % width)))) & mode_mask);
3995
3996           nonzero &= (outer | inner);
3997         }
3998       break;
3999
4000     case FFS:
4001     case POPCOUNT:
4002       /* This is at most the number of bits in the mode.  */
4003       nonzero = ((HOST_WIDE_INT) 2 << (floor_log2 (mode_width))) - 1;
4004       break;
4005
4006     case CLZ:
4007       /* If CLZ has a known value at zero, then the nonzero bits are
4008          that value, plus the number of bits in the mode minus one.  */
4009       if (CLZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
4010         nonzero |= ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width))) - 1;
4011       else
4012         nonzero = -1;
4013       break;
4014
4015     case CTZ:
4016       /* If CTZ has a known value at zero, then the nonzero bits are
4017          that value, plus the number of bits in the mode minus one.  */
4018       if (CTZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
4019         nonzero |= ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width))) - 1;
4020       else
4021         nonzero = -1;
4022       break;
4023
4024     case PARITY:
4025       nonzero = 1;
4026       break;
4027
4028     case IF_THEN_ELSE:
4029       {
4030         unsigned HOST_WIDE_INT nonzero_true =
4031           cached_nonzero_bits (XEXP (x, 1), mode,
4032                                known_x, known_mode, known_ret);
4033
4034         /* Don't call nonzero_bits for the second time if it cannot change
4035            anything.  */
4036         if ((nonzero & nonzero_true) != nonzero)
4037           nonzero &= nonzero_true
4038                      | cached_nonzero_bits (XEXP (x, 2), mode,
4039                                             known_x, known_mode, known_ret);
4040       }
4041       break;
4042
4043     default:
4044       break;
4045     }
4046
4047   return nonzero;
4048 }
4049
4050 /* See the macro definition above.  */
4051 #undef cached_num_sign_bit_copies
4052
4053 \f
4054 /* The function cached_num_sign_bit_copies is a wrapper around
4055    num_sign_bit_copies1.  It avoids exponential behavior in
4056    num_sign_bit_copies1 when X has identical subexpressions on the
4057    first or the second level.  */
4058
4059 static unsigned int
4060 cached_num_sign_bit_copies (const_rtx x, enum machine_mode mode, const_rtx known_x,
4061                             enum machine_mode known_mode,
4062                             unsigned int known_ret)
4063 {
4064   if (x == known_x && mode == known_mode)
4065     return known_ret;
4066
4067   /* Try to find identical subexpressions.  If found call
4068      num_sign_bit_copies1 on X with the subexpressions as KNOWN_X and
4069      the precomputed value for the subexpression as KNOWN_RET.  */
4070
4071   if (ARITHMETIC_P (x))
4072     {
4073       rtx x0 = XEXP (x, 0);
4074       rtx x1 = XEXP (x, 1);
4075
4076       /* Check the first level.  */
4077       if (x0 == x1)
4078         return
4079           num_sign_bit_copies1 (x, mode, x0, mode,
4080                                 cached_num_sign_bit_copies (x0, mode, known_x,
4081                                                             known_mode,
4082                                                             known_ret));
4083
4084       /* Check the second level.  */
4085       if (ARITHMETIC_P (x0)
4086           && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
4087         return
4088           num_sign_bit_copies1 (x, mode, x1, mode,
4089                                 cached_num_sign_bit_copies (x1, mode, known_x,
4090                                                             known_mode,
4091                                                             known_ret));
4092
4093       if (ARITHMETIC_P (x1)
4094           && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
4095         return
4096           num_sign_bit_copies1 (x, mode, x0, mode,
4097                                 cached_num_sign_bit_copies (x0, mode, known_x,
4098                                                             known_mode,
4099                                                             known_ret));
4100     }
4101
4102   return num_sign_bit_copies1 (x, mode, known_x, known_mode, known_ret);
4103 }
4104
4105 /* Return the number of bits at the high-order end of X that are known to
4106    be equal to the sign bit.  X will be used in mode MODE; if MODE is
4107    VOIDmode, X will be used in its own mode.  The returned value  will always
4108    be between 1 and the number of bits in MODE.  */
4109
4110 static unsigned int
4111 num_sign_bit_copies1 (const_rtx x, enum machine_mode mode, const_rtx known_x,
4112                       enum machine_mode known_mode,
4113                       unsigned int known_ret)
4114 {
4115   enum rtx_code code = GET_CODE (x);
4116   unsigned int bitwidth = GET_MODE_BITSIZE (mode);
4117   int num0, num1, result;
4118   unsigned HOST_WIDE_INT nonzero;
4119
4120   /* If we weren't given a mode, use the mode of X.  If the mode is still
4121      VOIDmode, we don't know anything.  Likewise if one of the modes is
4122      floating-point.  */
4123
4124   if (mode == VOIDmode)
4125     mode = GET_MODE (x);
4126
4127   if (mode == VOIDmode || FLOAT_MODE_P (mode) || FLOAT_MODE_P (GET_MODE (x)))
4128     return 1;
4129
4130   /* For a smaller object, just ignore the high bits.  */
4131   if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x)))
4132     {
4133       num0 = cached_num_sign_bit_copies (x, GET_MODE (x),
4134                                          known_x, known_mode, known_ret);
4135       return MAX (1,
4136                   num0 - (int) (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth));
4137     }
4138
4139   if (GET_MODE (x) != VOIDmode && bitwidth > GET_MODE_BITSIZE (GET_MODE (x)))
4140     {
4141 #ifndef WORD_REGISTER_OPERATIONS
4142   /* If this machine does not do all register operations on the entire
4143      register and MODE is wider than the mode of X, we can say nothing
4144      at all about the high-order bits.  */
4145       return 1;
4146 #else
4147       /* Likewise on machines that do, if the mode of the object is smaller
4148          than a word and loads of that size don't sign extend, we can say
4149          nothing about the high order bits.  */
4150       if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
4151 #ifdef LOAD_EXTEND_OP
4152           && LOAD_EXTEND_OP (GET_MODE (x)) != SIGN_EXTEND
4153 #endif
4154           )
4155         return 1;
4156 #endif
4157     }
4158
4159   switch (code)
4160     {
4161     case REG:
4162
4163 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
4164       /* If pointers extend signed and this is a pointer in Pmode, say that
4165          all the bits above ptr_mode are known to be sign bit copies.  */
4166       if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode && mode == Pmode
4167           && REG_POINTER (x))
4168         return GET_MODE_BITSIZE (Pmode) - GET_MODE_BITSIZE (ptr_mode) + 1;
4169 #endif
4170
4171       {
4172         unsigned int copies_for_hook = 1, copies = 1;
4173         rtx new = rtl_hooks.reg_num_sign_bit_copies (x, mode, known_x,
4174                                                      known_mode, known_ret,
4175                                                      &copies_for_hook);
4176
4177         if (new)
4178           copies = cached_num_sign_bit_copies (new, mode, known_x,
4179                                                known_mode, known_ret);
4180
4181         if (copies > 1 || copies_for_hook > 1)
4182           return MAX (copies, copies_for_hook);
4183
4184         /* Else, use nonzero_bits to guess num_sign_bit_copies (see below).  */
4185       }
4186       break;
4187
4188     case MEM:
4189 #ifdef LOAD_EXTEND_OP
4190       /* Some RISC machines sign-extend all loads of smaller than a word.  */
4191       if (LOAD_EXTEND_OP (GET_MODE (x)) == SIGN_EXTEND)
4192         return MAX (1, ((int) bitwidth
4193                         - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1));
4194 #endif
4195       break;
4196
4197     case CONST_INT:
4198       /* If the constant is negative, take its 1's complement and remask.
4199          Then see how many zero bits we have.  */
4200       nonzero = INTVAL (x) & GET_MODE_MASK (mode);
4201       if (bitwidth <= HOST_BITS_PER_WIDE_INT
4202           && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
4203         nonzero = (~nonzero) & GET_MODE_MASK (mode);
4204
4205       return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
4206
4207     case SUBREG:
4208       /* If this is a SUBREG for a promoted object that is sign-extended
4209          and we are looking at it in a wider mode, we know that at least the
4210          high-order bits are known to be sign bit copies.  */
4211
4212       if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x))
4213         {
4214           num0 = cached_num_sign_bit_copies (SUBREG_REG (x), mode,
4215                                              known_x, known_mode, known_ret);
4216           return MAX ((int) bitwidth
4217                       - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1,
4218                       num0);
4219         }
4220
4221       /* For a smaller object, just ignore the high bits.  */
4222       if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))))
4223         {
4224           num0 = cached_num_sign_bit_copies (SUBREG_REG (x), VOIDmode,
4225                                              known_x, known_mode, known_ret);
4226           return MAX (1, (num0
4227                           - (int) (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
4228                                    - bitwidth)));
4229         }
4230
4231 #ifdef WORD_REGISTER_OPERATIONS
4232 #ifdef LOAD_EXTEND_OP
4233       /* For paradoxical SUBREGs on machines where all register operations
4234          affect the entire register, just look inside.  Note that we are
4235          passing MODE to the recursive call, so the number of sign bit copies
4236          will remain relative to that mode, not the inner mode.  */
4237
4238       /* This works only if loads sign extend.  Otherwise, if we get a
4239          reload for the inner part, it may be loaded from the stack, and
4240          then we lose all sign bit copies that existed before the store
4241          to the stack.  */
4242
4243       if ((GET_MODE_SIZE (GET_MODE (x))
4244            > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
4245           && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
4246           && MEM_P (SUBREG_REG (x)))
4247         return cached_num_sign_bit_copies (SUBREG_REG (x), mode,
4248                                            known_x, known_mode, known_ret);
4249 #endif
4250 #endif
4251       break;
4252
4253     case SIGN_EXTRACT:
4254       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
4255         return MAX (1, (int) bitwidth - INTVAL (XEXP (x, 1)));
4256       break;
4257
4258     case SIGN_EXTEND:
4259       return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4260               + cached_num_sign_bit_copies (XEXP (x, 0), VOIDmode,
4261                                             known_x, known_mode, known_ret));
4262
4263     case TRUNCATE:
4264       /* For a smaller object, just ignore the high bits.  */
4265       num0 = cached_num_sign_bit_copies (XEXP (x, 0), VOIDmode,
4266                                          known_x, known_mode, known_ret);
4267       return MAX (1, (num0 - (int) (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4268                                     - bitwidth)));
4269
4270     case NOT:
4271       return cached_num_sign_bit_copies (XEXP (x, 0), mode,
4272                                          known_x, known_mode, known_ret);
4273
4274     case ROTATE:       case ROTATERT:
4275       /* If we are rotating left by a number of bits less than the number
4276          of sign bit copies, we can just subtract that amount from the
4277          number.  */
4278       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4279           && INTVAL (XEXP (x, 1)) >= 0
4280           && INTVAL (XEXP (x, 1)) < (int) bitwidth)
4281         {
4282           num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4283                                              known_x, known_mode, known_ret);
4284           return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1))
4285                                  : (int) bitwidth - INTVAL (XEXP (x, 1))));
4286         }
4287       break;
4288
4289     case NEG:
4290       /* In general, this subtracts one sign bit copy.  But if the value
4291          is known to be positive, the number of sign bit copies is the
4292          same as that of the input.  Finally, if the input has just one bit
4293          that might be nonzero, all the bits are copies of the sign bit.  */
4294       num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4295                                          known_x, known_mode, known_ret);
4296       if (bitwidth > HOST_BITS_PER_WIDE_INT)
4297         return num0 > 1 ? num0 - 1 : 1;
4298
4299       nonzero = nonzero_bits (XEXP (x, 0), mode);
4300       if (nonzero == 1)
4301         return bitwidth;
4302
4303       if (num0 > 1
4304           && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero))
4305         num0--;
4306
4307       return num0;
4308
4309     case IOR:   case AND:   case XOR:
4310     case SMIN:  case SMAX:  case UMIN:  case UMAX:
4311       /* Logical operations will preserve the number of sign-bit copies.
4312          MIN and MAX operations always return one of the operands.  */
4313       num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4314                                          known_x, known_mode, known_ret);
4315       num1 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4316                                          known_x, known_mode, known_ret);
4317
4318       /* If num1 is clearing some of the top bits then regardless of
4319          the other term, we are guaranteed to have at least that many
4320          high-order zero bits.  */
4321       if (code == AND
4322           && num1 > 1
4323           && bitwidth <= HOST_BITS_PER_WIDE_INT
4324           && GET_CODE (XEXP (x, 1)) == CONST_INT
4325           && !(INTVAL (XEXP (x, 1)) & ((HOST_WIDE_INT) 1 << (bitwidth - 1))))
4326         return num1;
4327
4328       /* Similarly for IOR when setting high-order bits.  */
4329       if (code == IOR
4330           && num1 > 1
4331           && bitwidth <= HOST_BITS_PER_WIDE_INT
4332           && GET_CODE (XEXP (x, 1)) == CONST_INT
4333           && (INTVAL (XEXP (x, 1)) & ((HOST_WIDE_INT) 1 << (bitwidth - 1))))
4334         return num1;
4335
4336       return MIN (num0, num1);
4337
4338     case PLUS:  case MINUS:
4339       /* For addition and subtraction, we can have a 1-bit carry.  However,
4340          if we are subtracting 1 from a positive number, there will not
4341          be such a carry.  Furthermore, if the positive number is known to
4342          be 0 or 1, we know the result is either -1 or 0.  */
4343
4344       if (code == PLUS && XEXP (x, 1) == constm1_rtx
4345           && bitwidth <= HOST_BITS_PER_WIDE_INT)
4346         {
4347           nonzero = nonzero_bits (XEXP (x, 0), mode);
4348           if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0)
4349             return (nonzero == 1 || nonzero == 0 ? bitwidth
4350                     : bitwidth - floor_log2 (nonzero) - 1);
4351         }
4352
4353       num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4354                                          known_x, known_mode, known_ret);
4355       num1 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4356                                          known_x, known_mode, known_ret);
4357       result = MAX (1, MIN (num0, num1) - 1);
4358
4359 #ifdef POINTERS_EXTEND_UNSIGNED
4360       /* If pointers extend signed and this is an addition or subtraction
4361          to a pointer in Pmode, all the bits above ptr_mode are known to be
4362          sign bit copies.  */
4363       if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
4364           && (code == PLUS || code == MINUS)
4365           && REG_P (XEXP (x, 0)) && REG_POINTER (XEXP (x, 0)))
4366         result = MAX ((int) (GET_MODE_BITSIZE (Pmode)
4367                              - GET_MODE_BITSIZE (ptr_mode) + 1),
4368                       result);
4369 #endif
4370       return result;
4371
4372     case MULT:
4373       /* The number of bits of the product is the sum of the number of
4374          bits of both terms.  However, unless one of the terms if known
4375          to be positive, we must allow for an additional bit since negating
4376          a negative number can remove one sign bit copy.  */
4377
4378       num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4379                                          known_x, known_mode, known_ret);
4380       num1 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4381                                          known_x, known_mode, known_ret);
4382
4383       result = bitwidth - (bitwidth - num0) - (bitwidth - num1);
4384       if (result > 0
4385           && (bitwidth > HOST_BITS_PER_WIDE_INT
4386               || (((nonzero_bits (XEXP (x, 0), mode)
4387                     & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
4388                   && ((nonzero_bits (XEXP (x, 1), mode)
4389                        & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))))
4390         result--;
4391
4392       return MAX (1, result);
4393
4394     case UDIV:
4395       /* The result must be <= the first operand.  If the first operand
4396          has the high bit set, we know nothing about the number of sign
4397          bit copies.  */
4398       if (bitwidth > HOST_BITS_PER_WIDE_INT)
4399         return 1;
4400       else if ((nonzero_bits (XEXP (x, 0), mode)
4401                 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
4402         return 1;
4403       else
4404         return cached_num_sign_bit_copies (XEXP (x, 0), mode,
4405                                            known_x, known_mode, known_ret);
4406
4407     case UMOD:
4408       /* The result must be <= the second operand.  */
4409       return cached_num_sign_bit_copies (XEXP (x, 1), mode,
4410                                            known_x, known_mode, known_ret);
4411
4412     case DIV:
4413       /* Similar to unsigned division, except that we have to worry about
4414          the case where the divisor is negative, in which case we have
4415          to add 1.  */
4416       result = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4417                                            known_x, known_mode, known_ret);
4418       if (result > 1
4419           && (bitwidth > HOST_BITS_PER_WIDE_INT
4420               || (nonzero_bits (XEXP (x, 1), mode)
4421                   & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
4422         result--;
4423
4424       return result;
4425
4426     case MOD:
4427       result = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4428                                            known_x, known_mode, known_ret);
4429       if (result > 1
4430           && (bitwidth > HOST_BITS_PER_WIDE_INT
4431               || (nonzero_bits (XEXP (x, 1), mode)
4432                   & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
4433         result--;
4434
4435       return result;
4436
4437     case ASHIFTRT:
4438       /* Shifts by a constant add to the number of bits equal to the
4439          sign bit.  */
4440       num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4441                                          known_x, known_mode, known_ret);
4442       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4443           && INTVAL (XEXP (x, 1)) > 0)
4444         num0 = MIN ((int) bitwidth, num0 + INTVAL (XEXP (x, 1)));
4445
4446       return num0;
4447
4448     case ASHIFT:
4449       /* Left shifts destroy copies.  */
4450       if (GET_CODE (XEXP (x, 1)) != CONST_INT
4451           || INTVAL (XEXP (x, 1)) < 0
4452           || INTVAL (XEXP (x, 1)) >= (int) bitwidth)
4453         return 1;
4454
4455       num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4456                                          known_x, known_mode, known_ret);
4457       return MAX (1, num0 - INTVAL (XEXP (x, 1)));
4458
4459     case IF_THEN_ELSE:
4460       num0 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4461                                          known_x, known_mode, known_ret);
4462       num1 = cached_num_sign_bit_copies (XEXP (x, 2), mode,
4463                                          known_x, known_mode, known_ret);
4464       return MIN (num0, num1);
4465
4466     case EQ:  case NE:  case GE:  case GT:  case LE:  case LT:
4467     case UNEQ:  case LTGT:  case UNGE:  case UNGT:  case UNLE:  case UNLT:
4468     case GEU: case GTU: case LEU: case LTU:
4469     case UNORDERED: case ORDERED:
4470       /* If the constant is negative, take its 1's complement and remask.
4471          Then see how many zero bits we have.  */
4472       nonzero = STORE_FLAG_VALUE;
4473       if (bitwidth <= HOST_BITS_PER_WIDE_INT
4474           && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
4475         nonzero = (~nonzero) & GET_MODE_MASK (mode);
4476
4477       return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
4478
4479     default:
4480       break;
4481     }
4482
4483   /* If we haven't been able to figure it out by one of the above rules,
4484      see if some of the high-order bits are known to be zero.  If so,
4485      count those bits and return one less than that amount.  If we can't
4486      safely compute the mask for this mode, always return BITWIDTH.  */
4487
4488   bitwidth = GET_MODE_BITSIZE (mode);
4489   if (bitwidth > HOST_BITS_PER_WIDE_INT)
4490     return 1;
4491
4492   nonzero = nonzero_bits (x, mode);
4493   return nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))
4494          ? 1 : bitwidth - floor_log2 (nonzero) - 1;
4495 }
4496
4497 /* Calculate the rtx_cost of a single instruction.  A return value of
4498    zero indicates an instruction pattern without a known cost.  */
4499
4500 int
4501 insn_rtx_cost (rtx pat)
4502 {
4503   int i, cost;
4504   rtx set;
4505
4506   /* Extract the single set rtx from the instruction pattern.
4507      We can't use single_set since we only have the pattern.  */
4508   if (GET_CODE (pat) == SET)
4509     set = pat;
4510   else if (GET_CODE (pat) == PARALLEL)
4511     {
4512       set = NULL_RTX;
4513       for (i = 0; i < XVECLEN (pat, 0); i++)
4514         {
4515           rtx x = XVECEXP (pat, 0, i);
4516           if (GET_CODE (x) == SET)
4517             {
4518               if (set)
4519                 return 0;
4520               set = x;
4521             }
4522         }
4523       if (!set)
4524         return 0;
4525     }
4526   else
4527     return 0;
4528
4529   cost = rtx_cost (SET_SRC (set), SET);
4530   return cost > 0 ? cost : COSTS_N_INSNS (1);
4531 }
4532
4533 /* Given an insn INSN and condition COND, return the condition in a
4534    canonical form to simplify testing by callers.  Specifically:
4535
4536    (1) The code will always be a comparison operation (EQ, NE, GT, etc.).
4537    (2) Both operands will be machine operands; (cc0) will have been replaced.
4538    (3) If an operand is a constant, it will be the second operand.
4539    (4) (LE x const) will be replaced with (LT x <const+1>) and similarly
4540        for GE, GEU, and LEU.
4541
4542    If the condition cannot be understood, or is an inequality floating-point
4543    comparison which needs to be reversed, 0 will be returned.
4544
4545    If REVERSE is nonzero, then reverse the condition prior to canonizing it.
4546
4547    If EARLIEST is nonzero, it is a pointer to a place where the earliest
4548    insn used in locating the condition was found.  If a replacement test
4549    of the condition is desired, it should be placed in front of that
4550    insn and we will be sure that the inputs are still valid.
4551
4552    If WANT_REG is nonzero, we wish the condition to be relative to that
4553    register, if possible.  Therefore, do not canonicalize the condition
4554    further.  If ALLOW_CC_MODE is nonzero, allow the condition returned 
4555    to be a compare to a CC mode register.
4556
4557    If VALID_AT_INSN_P, the condition must be valid at both *EARLIEST
4558    and at INSN.  */
4559
4560 rtx
4561 canonicalize_condition (rtx insn, rtx cond, int reverse, rtx *earliest,
4562                         rtx want_reg, int allow_cc_mode, int valid_at_insn_p)
4563 {
4564   enum rtx_code code;
4565   rtx prev = insn;
4566   const_rtx set;
4567   rtx tem;
4568   rtx op0, op1;
4569   int reverse_code = 0;
4570   enum machine_mode mode;
4571   basic_block bb = BLOCK_FOR_INSN (insn);
4572
4573   code = GET_CODE (cond);
4574   mode = GET_MODE (cond);
4575   op0 = XEXP (cond, 0);
4576   op1 = XEXP (cond, 1);
4577
4578   if (reverse)
4579     code = reversed_comparison_code (cond, insn);
4580   if (code == UNKNOWN)
4581     return 0;
4582
4583   if (earliest)
4584     *earliest = insn;
4585
4586   /* If we are comparing a register with zero, see if the register is set
4587      in the previous insn to a COMPARE or a comparison operation.  Perform
4588      the same tests as a function of STORE_FLAG_VALUE as find_comparison_args
4589      in cse.c  */
4590
4591   while ((GET_RTX_CLASS (code) == RTX_COMPARE
4592           || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
4593          && op1 == CONST0_RTX (GET_MODE (op0))
4594          && op0 != want_reg)
4595     {
4596       /* Set nonzero when we find something of interest.  */
4597       rtx x = 0;
4598
4599 #ifdef HAVE_cc0
4600       /* If comparison with cc0, import actual comparison from compare
4601          insn.  */
4602       if (op0 == cc0_rtx)
4603         {
4604           if ((prev = prev_nonnote_insn (prev)) == 0
4605               || !NONJUMP_INSN_P (prev)
4606               || (set = single_set (prev)) == 0
4607               || SET_DEST (set) != cc0_rtx)
4608             return 0;
4609
4610           op0 = SET_SRC (set);
4611           op1 = CONST0_RTX (GET_MODE (op0));
4612           if (earliest)
4613             *earliest = prev;
4614         }
4615 #endif
4616
4617       /* If this is a COMPARE, pick up the two things being compared.  */
4618       if (GET_CODE (op0) == COMPARE)
4619         {
4620           op1 = XEXP (op0, 1);
4621           op0 = XEXP (op0, 0);
4622           continue;
4623         }
4624       else if (!REG_P (op0))
4625         break;
4626
4627       /* Go back to the previous insn.  Stop if it is not an INSN.  We also
4628          stop if it isn't a single set or if it has a REG_INC note because
4629          we don't want to bother dealing with it.  */
4630
4631       if ((prev = prev_nonnote_insn (prev)) == 0
4632           || !NONJUMP_INSN_P (prev)
4633           || FIND_REG_INC_NOTE (prev, NULL_RTX)
4634           /* In cfglayout mode, there do not have to be labels at the
4635              beginning of a block, or jumps at the end, so the previous
4636              conditions would not stop us when we reach bb boundary.  */
4637           || BLOCK_FOR_INSN (prev) != bb)
4638         break;
4639
4640       set = set_of (op0, prev);
4641
4642       if (set
4643           && (GET_CODE (set) != SET
4644               || !rtx_equal_p (SET_DEST (set), op0)))
4645         break;
4646
4647       /* If this is setting OP0, get what it sets it to if it looks
4648          relevant.  */
4649       if (set)
4650         {
4651           enum machine_mode inner_mode = GET_MODE (SET_DEST (set));
4652 #ifdef FLOAT_STORE_FLAG_VALUE
4653           REAL_VALUE_TYPE fsfv;
4654 #endif
4655
4656           /* ??? We may not combine comparisons done in a CCmode with
4657              comparisons not done in a CCmode.  This is to aid targets
4658              like Alpha that have an IEEE compliant EQ instruction, and
4659              a non-IEEE compliant BEQ instruction.  The use of CCmode is
4660              actually artificial, simply to prevent the combination, but
4661              should not affect other platforms.
4662
4663              However, we must allow VOIDmode comparisons to match either
4664              CCmode or non-CCmode comparison, because some ports have
4665              modeless comparisons inside branch patterns.
4666
4667              ??? This mode check should perhaps look more like the mode check
4668              in simplify_comparison in combine.  */
4669
4670           if ((GET_CODE (SET_SRC (set)) == COMPARE
4671                || (((code == NE
4672                      || (code == LT
4673                          && GET_MODE_CLASS (inner_mode) == MODE_INT
4674                          && (GET_MODE_BITSIZE (inner_mode)
4675                              <= HOST_BITS_PER_WIDE_INT)
4676                          && (STORE_FLAG_VALUE
4677                              & ((HOST_WIDE_INT) 1
4678                                 << (GET_MODE_BITSIZE (inner_mode) - 1))))
4679 #ifdef FLOAT_STORE_FLAG_VALUE
4680                      || (code == LT
4681                          && SCALAR_FLOAT_MODE_P (inner_mode)
4682                          && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode),
4683                              REAL_VALUE_NEGATIVE (fsfv)))
4684 #endif
4685                      ))
4686                    && COMPARISON_P (SET_SRC (set))))
4687               && (((GET_MODE_CLASS (mode) == MODE_CC)
4688                    == (GET_MODE_CLASS (inner_mode) == MODE_CC))
4689                   || mode == VOIDmode || inner_mode == VOIDmode))
4690             x = SET_SRC (set);
4691           else if (((code == EQ
4692                      || (code == GE
4693                          && (GET_MODE_BITSIZE (inner_mode)
4694                              <= HOST_BITS_PER_WIDE_INT)
4695                          && GET_MODE_CLASS (inner_mode) == MODE_INT
4696                          && (STORE_FLAG_VALUE
4697                              & ((HOST_WIDE_INT) 1
4698                                 << (GET_MODE_BITSIZE (inner_mode) - 1))))
4699 #ifdef FLOAT_STORE_FLAG_VALUE
4700                      || (code == GE
4701                          && SCALAR_FLOAT_MODE_P (inner_mode)
4702                          && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode),
4703                              REAL_VALUE_NEGATIVE (fsfv)))
4704 #endif
4705                      ))
4706                    && COMPARISON_P (SET_SRC (set))
4707                    && (((GET_MODE_CLASS (mode) == MODE_CC)
4708                         == (GET_MODE_CLASS (inner_mode) == MODE_CC))
4709                        || mode == VOIDmode || inner_mode == VOIDmode))
4710
4711             {
4712               reverse_code = 1;
4713               x = SET_SRC (set);
4714             }
4715           else
4716             break;
4717         }
4718
4719       else if (reg_set_p (op0, prev))
4720         /* If this sets OP0, but not directly, we have to give up.  */
4721         break;
4722
4723       if (x)
4724         {
4725           /* If the caller is expecting the condition to be valid at INSN,
4726              make sure X doesn't change before INSN.  */
4727           if (valid_at_insn_p)
4728             if (modified_in_p (x, prev) || modified_between_p (x, prev, insn))
4729               break;
4730           if (COMPARISON_P (x))
4731             code = GET_CODE (x);
4732           if (reverse_code)
4733             {
4734               code = reversed_comparison_code (x, prev);
4735               if (code == UNKNOWN)
4736                 return 0;
4737               reverse_code = 0;
4738             }
4739
4740           op0 = XEXP (x, 0), op1 = XEXP (x, 1);
4741           if (earliest)
4742             *earliest = prev;
4743         }
4744     }
4745
4746   /* If constant is first, put it last.  */
4747   if (CONSTANT_P (op0))
4748     code = swap_condition (code), tem = op0, op0 = op1, op1 = tem;
4749
4750   /* If OP0 is the result of a comparison, we weren't able to find what
4751      was really being compared, so fail.  */
4752   if (!allow_cc_mode
4753       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
4754     return 0;
4755
4756   /* Canonicalize any ordered comparison with integers involving equality
4757      if we can do computations in the relevant mode and we do not
4758      overflow.  */
4759
4760   if (GET_MODE_CLASS (GET_MODE (op0)) != MODE_CC
4761       && GET_CODE (op1) == CONST_INT
4762       && GET_MODE (op0) != VOIDmode
4763       && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT)
4764     {
4765       HOST_WIDE_INT const_val = INTVAL (op1);
4766       unsigned HOST_WIDE_INT uconst_val = const_val;
4767       unsigned HOST_WIDE_INT max_val
4768         = (unsigned HOST_WIDE_INT) GET_MODE_MASK (GET_MODE (op0));
4769
4770       switch (code)
4771         {
4772         case LE:
4773           if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1)
4774             code = LT, op1 = gen_int_mode (const_val + 1, GET_MODE (op0));
4775           break;
4776
4777         /* When cross-compiling, const_val might be sign-extended from
4778            BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
4779         case GE:
4780           if ((HOST_WIDE_INT) (const_val & max_val)
4781               != (((HOST_WIDE_INT) 1
4782                    << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
4783             code = GT, op1 = gen_int_mode (const_val - 1, GET_MODE (op0));
4784           break;
4785
4786         case LEU:
4787           if (uconst_val < max_val)
4788             code = LTU, op1 = gen_int_mode (uconst_val + 1, GET_MODE (op0));
4789           break;
4790
4791         case GEU:
4792           if (uconst_val != 0)
4793             code = GTU, op1 = gen_int_mode (uconst_val - 1, GET_MODE (op0));
4794           break;
4795
4796         default:
4797           break;
4798         }
4799     }
4800
4801   /* Never return CC0; return zero instead.  */
4802   if (CC0_P (op0))
4803     return 0;
4804
4805   return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
4806 }
4807
4808 /* Given a jump insn JUMP, return the condition that will cause it to branch
4809    to its JUMP_LABEL.  If the condition cannot be understood, or is an
4810    inequality floating-point comparison which needs to be reversed, 0 will
4811    be returned.
4812
4813    If EARLIEST is nonzero, it is a pointer to a place where the earliest
4814    insn used in locating the condition was found.  If a replacement test
4815    of the condition is desired, it should be placed in front of that
4816    insn and we will be sure that the inputs are still valid.  If EARLIEST
4817    is null, the returned condition will be valid at INSN.
4818
4819    If ALLOW_CC_MODE is nonzero, allow the condition returned to be a
4820    compare CC mode register.
4821
4822    VALID_AT_INSN_P is the same as for canonicalize_condition.  */
4823
4824 rtx
4825 get_condition (rtx jump, rtx *earliest, int allow_cc_mode, int valid_at_insn_p)
4826 {
4827   rtx cond;
4828   int reverse;
4829   rtx set;
4830
4831   /* If this is not a standard conditional jump, we can't parse it.  */
4832   if (!JUMP_P (jump)
4833       || ! any_condjump_p (jump))
4834     return 0;
4835   set = pc_set (jump);
4836
4837   cond = XEXP (SET_SRC (set), 0);
4838
4839   /* If this branches to JUMP_LABEL when the condition is false, reverse
4840      the condition.  */
4841   reverse
4842     = GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
4843       && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump);
4844
4845   return canonicalize_condition (jump, cond, reverse, earliest, NULL_RTX,
4846                                  allow_cc_mode, valid_at_insn_p);
4847 }
4848
4849 /* Initialize the table NUM_SIGN_BIT_COPIES_IN_REP based on
4850    TARGET_MODE_REP_EXTENDED.
4851
4852    Note that we assume that the property of
4853    TARGET_MODE_REP_EXTENDED(B, C) is sticky to the integral modes
4854    narrower than mode B.  I.e., if A is a mode narrower than B then in
4855    order to be able to operate on it in mode B, mode A needs to
4856    satisfy the requirements set by the representation of mode B.  */
4857
4858 static void
4859 init_num_sign_bit_copies_in_rep (void)
4860 {
4861   enum machine_mode mode, in_mode;
4862
4863   for (in_mode = GET_CLASS_NARROWEST_MODE (MODE_INT); in_mode != VOIDmode;
4864        in_mode = GET_MODE_WIDER_MODE (mode))
4865     for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != in_mode;
4866          mode = GET_MODE_WIDER_MODE (mode))
4867       {
4868         enum machine_mode i;
4869
4870         /* Currently, it is assumed that TARGET_MODE_REP_EXTENDED
4871            extends to the next widest mode.  */
4872         gcc_assert (targetm.mode_rep_extended (mode, in_mode) == UNKNOWN
4873                     || GET_MODE_WIDER_MODE (mode) == in_mode);
4874
4875         /* We are in in_mode.  Count how many bits outside of mode
4876            have to be copies of the sign-bit.  */
4877         for (i = mode; i != in_mode; i = GET_MODE_WIDER_MODE (i))
4878           {
4879             enum machine_mode wider = GET_MODE_WIDER_MODE (i);
4880
4881             if (targetm.mode_rep_extended (i, wider) == SIGN_EXTEND
4882                 /* We can only check sign-bit copies starting from the
4883                    top-bit.  In order to be able to check the bits we
4884                    have already seen we pretend that subsequent bits
4885                    have to be sign-bit copies too.  */
4886                 || num_sign_bit_copies_in_rep [in_mode][mode])
4887               num_sign_bit_copies_in_rep [in_mode][mode]
4888                 += GET_MODE_BITSIZE (wider) - GET_MODE_BITSIZE (i);
4889           }
4890       }
4891 }
4892
4893 /* Suppose that truncation from the machine mode of X to MODE is not a
4894    no-op.  See if there is anything special about X so that we can
4895    assume it already contains a truncated value of MODE.  */
4896
4897 bool
4898 truncated_to_mode (enum machine_mode mode, const_rtx x)
4899 {
4900   /* This register has already been used in MODE without explicit
4901      truncation.  */
4902   if (REG_P (x) && rtl_hooks.reg_truncated_to_mode (mode, x))
4903     return true;
4904
4905   /* See if we already satisfy the requirements of MODE.  If yes we
4906      can just switch to MODE.  */
4907   if (num_sign_bit_copies_in_rep[GET_MODE (x)][mode]
4908       && (num_sign_bit_copies (x, GET_MODE (x))
4909           >= num_sign_bit_copies_in_rep[GET_MODE (x)][mode] + 1))
4910     return true;
4911
4912   return false;
4913 }
4914 \f
4915 /* Initialize non_rtx_starting_operands, which is used to speed up
4916    for_each_rtx.  */
4917 void
4918 init_rtlanal (void)
4919 {
4920   int i;
4921   for (i = 0; i < NUM_RTX_CODE; i++)
4922     {
4923       const char *format = GET_RTX_FORMAT (i);
4924       const char *first = strpbrk (format, "eEV");
4925       non_rtx_starting_operands[i] = first ? first - format : -1;
4926     }
4927
4928   init_num_sign_bit_copies_in_rep ();
4929 }
4930 \f
4931 /* Check whether this is a constant pool constant.  */
4932 bool
4933 constant_pool_constant_p (rtx x)
4934 {
4935   x = avoid_constant_pool_reference (x);
4936   return GET_CODE (x) == CONST_DOUBLE;
4937 }
4938