1169689Skan/* Analyze RTL for GNU compiler.
290075Sobrien   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3169689Skan   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
4169689Skan   Foundation, Inc.
518334Speter
690075SobrienThis file is part of GCC.
718334Speter
890075SobrienGCC is free software; you can redistribute it and/or modify it under
990075Sobrienthe terms of the GNU General Public License as published by the Free
1090075SobrienSoftware Foundation; either version 2, or (at your option) any later
1190075Sobrienversion.
1218334Speter
1390075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1490075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1590075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1690075Sobrienfor more details.
1718334Speter
1818334SpeterYou should have received a copy of the GNU General Public License
1990075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
20169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21169689Skan02110-1301, USA.  */
2218334Speter
2318334Speter
2418334Speter#include "config.h"
2550397Sobrien#include "system.h"
26132718Skan#include "coretypes.h"
27132718Skan#include "tm.h"
2890075Sobrien#include "toplev.h"
2918334Speter#include "rtl.h"
3090075Sobrien#include "hard-reg-set.h"
31117395Skan#include "insn-config.h"
32117395Skan#include "recog.h"
33169689Skan#include "target.h"
34169689Skan#include "output.h"
3590075Sobrien#include "tm_p.h"
36117395Skan#include "flags.h"
37117395Skan#include "real.h"
38169689Skan#include "regs.h"
39169689Skan#include "function.h"
4018334Speter
4150397Sobrien/* Forward declarations */
42132718Skanstatic void set_of_1 (rtx, rtx, void *);
43169689Skanstatic bool covers_regno_p (rtx, unsigned int);
44169689Skanstatic bool covers_regno_no_parallel_p (rtx, unsigned int);
45132718Skanstatic int rtx_referenced_p_1 (rtx *, void *);
46132718Skanstatic int computed_jump_p_1 (rtx);
47132718Skanstatic void parms_set (rtx, rtx, void *);
4850397Sobrien
49169689Skanstatic unsigned HOST_WIDE_INT cached_nonzero_bits (rtx, enum machine_mode,
50169689Skan                                                   rtx, enum machine_mode,
51169689Skan                                                   unsigned HOST_WIDE_INT);
52169689Skanstatic unsigned HOST_WIDE_INT nonzero_bits1 (rtx, enum machine_mode, rtx,
53169689Skan                                             enum machine_mode,
54169689Skan                                             unsigned HOST_WIDE_INT);
55169689Skanstatic unsigned int cached_num_sign_bit_copies (rtx, enum machine_mode, rtx,
56169689Skan                                                enum machine_mode,
57169689Skan                                                unsigned int);
58169689Skanstatic unsigned int num_sign_bit_copies1 (rtx, enum machine_mode, rtx,
59169689Skan                                          enum machine_mode, unsigned int);
60169689Skan
61169689Skan/* Offset of the first 'e', 'E' or 'V' operand for each rtx code, or
62169689Skan   -1 if a code has no such operand.  */
63169689Skanstatic int non_rtx_starting_operands[NUM_RTX_CODE];
64169689Skan
6518334Speter/* Bit flags that specify the machine subtype we are compiling for.
6618334Speter   Bits are tested using macros TARGET_... defined in the tm.h file
6718334Speter   and set by `-m...' switches.  Must be defined in rtlanal.c.  */
6818334Speter
6918334Speterint target_flags;
70169689Skan
71169689Skan/* Truncation narrows the mode from SOURCE mode to DESTINATION mode.
72169689Skan   If TARGET_MODE_REP_EXTENDED (DESTINATION, DESTINATION_REP) is
73169689Skan   SIGN_EXTEND then while narrowing we also have to enforce the
74169689Skan   representation and sign-extend the value to mode DESTINATION_REP.
75169689Skan
76169689Skan   If the value is already sign-extended to DESTINATION_REP mode we
77169689Skan   can just switch to DESTINATION mode on it.  For each pair of
78169689Skan   integral modes SOURCE and DESTINATION, when truncating from SOURCE
79169689Skan   to DESTINATION, NUM_SIGN_BIT_COPIES_IN_REP[SOURCE][DESTINATION]
80169689Skan   contains the number of high-order bits in SOURCE that have to be
81169689Skan   copies of the sign-bit so that we can do this mode-switch to
82169689Skan   DESTINATION.  */
83169689Skan
84169689Skanstatic unsigned int
85169689Skannum_sign_bit_copies_in_rep[MAX_MODE_INT + 1][MAX_MODE_INT + 1];
8618334Speter
8718334Speter/* Return 1 if the value of X is unstable
8818334Speter   (would be different at a different point in the program).
8918334Speter   The frame pointer, arg pointer, etc. are considered stable
9018334Speter   (within one function) and so is anything marked `unchanging'.  */
9118334Speter
9218334Speterint
93132718Skanrtx_unstable_p (rtx x)
9418334Speter{
9590075Sobrien  RTX_CODE code = GET_CODE (x);
9690075Sobrien  int i;
9790075Sobrien  const char *fmt;
9818334Speter
9990075Sobrien  switch (code)
10090075Sobrien    {
10190075Sobrien    case MEM:
102169689Skan      return !MEM_READONLY_P (x) || rtx_unstable_p (XEXP (x, 0));
10318334Speter
10490075Sobrien    case CONST:
10590075Sobrien    case CONST_INT:
10690075Sobrien    case CONST_DOUBLE:
10796263Sobrien    case CONST_VECTOR:
10890075Sobrien    case SYMBOL_REF:
10990075Sobrien    case LABEL_REF:
11090075Sobrien      return 0;
11118334Speter
11290075Sobrien    case REG:
11390075Sobrien      /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
11490075Sobrien      if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
11590075Sobrien	  /* The arg pointer varies if it is not a fixed register.  */
116169689Skan	  || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
11790075Sobrien	return 0;
11890075Sobrien#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
11990075Sobrien      /* ??? When call-clobbered, the value is stable modulo the restore
12090075Sobrien	 that must happen after a call.  This currently screws up local-alloc
12190075Sobrien	 into believing that the restore is not needed.  */
12290075Sobrien      if (x == pic_offset_table_rtx)
12390075Sobrien	return 0;
12490075Sobrien#endif
12590075Sobrien      return 1;
12618334Speter
12790075Sobrien    case ASM_OPERANDS:
12890075Sobrien      if (MEM_VOLATILE_P (x))
12990075Sobrien	return 1;
13090075Sobrien
131132718Skan      /* Fall through.  */
13290075Sobrien
13390075Sobrien    default:
13490075Sobrien      break;
13590075Sobrien    }
13690075Sobrien
13718334Speter  fmt = GET_RTX_FORMAT (code);
13818334Speter  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
13918334Speter    if (fmt[i] == 'e')
14090075Sobrien      {
14190075Sobrien	if (rtx_unstable_p (XEXP (x, i)))
14290075Sobrien	  return 1;
14390075Sobrien      }
14490075Sobrien    else if (fmt[i] == 'E')
14590075Sobrien      {
14690075Sobrien	int j;
14790075Sobrien	for (j = 0; j < XVECLEN (x, i); j++)
14890075Sobrien	  if (rtx_unstable_p (XVECEXP (x, i, j)))
14990075Sobrien	    return 1;
15090075Sobrien      }
15190075Sobrien
15218334Speter  return 0;
15318334Speter}
15418334Speter
15518334Speter/* Return 1 if X has a value that can vary even between two
15618334Speter   executions of the program.  0 means X can be compared reliably
15718334Speter   against certain constants or near-constants.
15890075Sobrien   FOR_ALIAS is nonzero if we are called from alias analysis; if it is
15990075Sobrien   zero, we are slightly more conservative.
16018334Speter   The frame pointer and the arg pointer are considered constant.  */
16118334Speter
16218334Speterint
163132718Skanrtx_varies_p (rtx x, int for_alias)
16418334Speter{
165132718Skan  RTX_CODE code;
16690075Sobrien  int i;
16790075Sobrien  const char *fmt;
16818334Speter
169132718Skan  if (!x)
170132718Skan    return 0;
171132718Skan
172132718Skan  code = GET_CODE (x);
17318334Speter  switch (code)
17418334Speter    {
17518334Speter    case MEM:
176169689Skan      return !MEM_READONLY_P (x) || rtx_varies_p (XEXP (x, 0), for_alias);
17790075Sobrien
17818334Speter    case CONST:
17918334Speter    case CONST_INT:
18018334Speter    case CONST_DOUBLE:
18196263Sobrien    case CONST_VECTOR:
18218334Speter    case SYMBOL_REF:
18318334Speter    case LABEL_REF:
18418334Speter      return 0;
18518334Speter
18618334Speter    case REG:
18718334Speter      /* Note that we have to test for the actual rtx used for the frame
18818334Speter	 and arg pointers and not just the register number in case we have
18918334Speter	 eliminated the frame and/or arg pointer and are using it
19018334Speter	 for pseudos.  */
19190075Sobrien      if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
19290075Sobrien	  /* The arg pointer varies if it is not a fixed register.  */
19390075Sobrien	  || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
19490075Sobrien	return 0;
19590075Sobrien      if (x == pic_offset_table_rtx
19690075Sobrien#ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
19790075Sobrien	  /* ??? When call-clobbered, the value is stable modulo the restore
19890075Sobrien	     that must happen after a call.  This currently screws up
19990075Sobrien	     local-alloc into believing that the restore is not needed, so we
20090075Sobrien	     must return 0 only if we are called from alias analysis.  */
20190075Sobrien	  && for_alias
20290075Sobrien#endif
20390075Sobrien	  )
20490075Sobrien	return 0;
20590075Sobrien      return 1;
20618334Speter
20718334Speter    case LO_SUM:
20818334Speter      /* The operand 0 of a LO_SUM is considered constant
20990075Sobrien	 (in fact it is related specifically to operand 1)
21090075Sobrien	 during alias analysis.  */
21190075Sobrien      return (! for_alias && rtx_varies_p (XEXP (x, 0), for_alias))
21290075Sobrien	     || rtx_varies_p (XEXP (x, 1), for_alias);
213117395Skan
21490075Sobrien    case ASM_OPERANDS:
21590075Sobrien      if (MEM_VOLATILE_P (x))
21690075Sobrien	return 1;
21790075Sobrien
218132718Skan      /* Fall through.  */
21990075Sobrien
22050397Sobrien    default:
22150397Sobrien      break;
22218334Speter    }
22318334Speter
22418334Speter  fmt = GET_RTX_FORMAT (code);
22518334Speter  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
22618334Speter    if (fmt[i] == 'e')
22790075Sobrien      {
22890075Sobrien	if (rtx_varies_p (XEXP (x, i), for_alias))
22990075Sobrien	  return 1;
23090075Sobrien      }
23190075Sobrien    else if (fmt[i] == 'E')
23290075Sobrien      {
23390075Sobrien	int j;
23490075Sobrien	for (j = 0; j < XVECLEN (x, i); j++)
23590075Sobrien	  if (rtx_varies_p (XVECEXP (x, i, j), for_alias))
23690075Sobrien	    return 1;
23790075Sobrien      }
23890075Sobrien
23918334Speter  return 0;
24018334Speter}
24118334Speter
242169689Skan/* Return nonzero if the use of X as an address in a MEM can cause a trap.
243169689Skan   MODE is the mode of the MEM (not that of X) and UNALIGNED_MEMS controls
244169689Skan   whether nonzero is returned for unaligned memory accesses on strict
245169689Skan   alignment machines.  */
24618334Speter
247169689Skanstatic int
248169689Skanrtx_addr_can_trap_p_1 (rtx x, enum machine_mode mode, bool unaligned_mems)
24918334Speter{
25090075Sobrien  enum rtx_code code = GET_CODE (x);
25118334Speter
25218334Speter  switch (code)
25318334Speter    {
25418334Speter    case SYMBOL_REF:
25590075Sobrien      return SYMBOL_REF_WEAK (x);
25690075Sobrien
25718334Speter    case LABEL_REF:
25818334Speter      return 0;
25918334Speter
26018334Speter    case REG:
26118334Speter      /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
26290075Sobrien      if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
26390075Sobrien	  || x == stack_pointer_rtx
26490075Sobrien	  /* The arg pointer varies if it is not a fixed register.  */
26590075Sobrien	  || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
26690075Sobrien	return 0;
26790075Sobrien      /* All of the virtual frame registers are stack references.  */
26890075Sobrien      if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
26990075Sobrien	  && REGNO (x) <= LAST_VIRTUAL_REGISTER)
27090075Sobrien	return 0;
27190075Sobrien      return 1;
27218334Speter
27318334Speter    case CONST:
274169689Skan      return rtx_addr_can_trap_p_1 (XEXP (x, 0), mode, unaligned_mems);
27518334Speter
27618334Speter    case PLUS:
277169689Skan      /* An address is assumed not to trap if:
278169689Skan	 - it is an address that can't trap plus a constant integer,
279169689Skan	   with the proper remainder modulo the mode size if we are
280169689Skan	   considering unaligned memory references.  */
281169689Skan      if (!rtx_addr_can_trap_p_1 (XEXP (x, 0), mode, unaligned_mems)
282169689Skan	  && GET_CODE (XEXP (x, 1)) == CONST_INT)
283169689Skan	{
284169689Skan	  HOST_WIDE_INT offset;
28518334Speter
286169689Skan	  if (!STRICT_ALIGNMENT
287169689Skan	      || !unaligned_mems
288169689Skan	      || GET_MODE_SIZE (mode) == 0)
289169689Skan	    return 0;
290169689Skan
291169689Skan	  offset = INTVAL (XEXP (x, 1));
292169689Skan
293169689Skan#ifdef SPARC_STACK_BOUNDARY_HACK
294169689Skan	  /* ??? The SPARC port may claim a STACK_BOUNDARY higher than
295169689Skan	     the real alignment of %sp.  However, when it does this, the
296169689Skan	     alignment of %sp+STACK_POINTER_OFFSET is STACK_BOUNDARY.  */
297169689Skan	  if (SPARC_STACK_BOUNDARY_HACK
298169689Skan	      && (XEXP (x, 0) == stack_pointer_rtx
299169689Skan		  || XEXP (x, 0) == hard_frame_pointer_rtx))
300169689Skan	    offset -= STACK_POINTER_OFFSET;
301169689Skan#endif
302169689Skan
303169689Skan	  return offset % GET_MODE_SIZE (mode) != 0;
304169689Skan	}
305169689Skan
306169689Skan      /* - or it is the pic register plus a constant.  */
307169689Skan      if (XEXP (x, 0) == pic_offset_table_rtx && CONSTANT_P (XEXP (x, 1)))
308169689Skan	return 0;
309169689Skan
310169689Skan      return 1;
311169689Skan
31218334Speter    case LO_SUM:
31390075Sobrien    case PRE_MODIFY:
314169689Skan      return rtx_addr_can_trap_p_1 (XEXP (x, 1), mode, unaligned_mems);
31590075Sobrien
31690075Sobrien    case PRE_DEC:
31790075Sobrien    case PRE_INC:
31890075Sobrien    case POST_DEC:
31990075Sobrien    case POST_INC:
32090075Sobrien    case POST_MODIFY:
321169689Skan      return rtx_addr_can_trap_p_1 (XEXP (x, 0), mode, unaligned_mems);
32290075Sobrien
32350397Sobrien    default:
32450397Sobrien      break;
32518334Speter    }
32618334Speter
32718334Speter  /* If it isn't one of the case above, it can cause a trap.  */
32818334Speter  return 1;
32918334Speter}
33018334Speter
331169689Skan/* Return nonzero if the use of X as an address in a MEM can cause a trap.  */
332169689Skan
333169689Skanint
334169689Skanrtx_addr_can_trap_p (rtx x)
335169689Skan{
336169689Skan  return rtx_addr_can_trap_p_1 (x, VOIDmode, false);
337169689Skan}
338169689Skan
339132718Skan/* Return true if X is an address that is known to not be zero.  */
340132718Skan
341132718Skanbool
342132718Skannonzero_address_p (rtx x)
343132718Skan{
344132718Skan  enum rtx_code code = GET_CODE (x);
345132718Skan
346132718Skan  switch (code)
347132718Skan    {
348132718Skan    case SYMBOL_REF:
349132718Skan      return !SYMBOL_REF_WEAK (x);
350132718Skan
351132718Skan    case LABEL_REF:
352132718Skan      return true;
353132718Skan
354132718Skan    case REG:
355132718Skan      /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
356132718Skan      if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
357132718Skan	  || x == stack_pointer_rtx
358132718Skan	  || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
359132718Skan	return true;
360132718Skan      /* All of the virtual frame registers are stack references.  */
361132718Skan      if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
362132718Skan	  && REGNO (x) <= LAST_VIRTUAL_REGISTER)
363132718Skan	return true;
364132718Skan      return false;
365132718Skan
366132718Skan    case CONST:
367132718Skan      return nonzero_address_p (XEXP (x, 0));
368132718Skan
369132718Skan    case PLUS:
370132718Skan      if (GET_CODE (XEXP (x, 1)) == CONST_INT)
371169689Skan        return nonzero_address_p (XEXP (x, 0));
372132718Skan      /* Handle PIC references.  */
373132718Skan      else if (XEXP (x, 0) == pic_offset_table_rtx
374132718Skan	       && CONSTANT_P (XEXP (x, 1)))
375132718Skan	return true;
376132718Skan      return false;
377132718Skan
378132718Skan    case PRE_MODIFY:
379132718Skan      /* Similar to the above; allow positive offsets.  Further, since
380132718Skan	 auto-inc is only allowed in memories, the register must be a
381132718Skan	 pointer.  */
382132718Skan      if (GET_CODE (XEXP (x, 1)) == CONST_INT
383132718Skan	  && INTVAL (XEXP (x, 1)) > 0)
384132718Skan	return true;
385132718Skan      return nonzero_address_p (XEXP (x, 0));
386132718Skan
387132718Skan    case PRE_INC:
388132718Skan      /* Similarly.  Further, the offset is always positive.  */
389132718Skan      return true;
390132718Skan
391132718Skan    case PRE_DEC:
392132718Skan    case POST_DEC:
393132718Skan    case POST_INC:
394132718Skan    case POST_MODIFY:
395132718Skan      return nonzero_address_p (XEXP (x, 0));
396132718Skan
397132718Skan    case LO_SUM:
398132718Skan      return nonzero_address_p (XEXP (x, 1));
399132718Skan
400132718Skan    default:
401132718Skan      break;
402132718Skan    }
403132718Skan
404132718Skan  /* If it isn't one of the case above, might be zero.  */
405132718Skan  return false;
406132718Skan}
407132718Skan
408117395Skan/* Return 1 if X refers to a memory location whose address
40918334Speter   cannot be compared reliably with constant addresses,
410117395Skan   or if X refers to a BLKmode memory object.
41190075Sobrien   FOR_ALIAS is nonzero if we are called from alias analysis; if it is
41290075Sobrien   zero, we are slightly more conservative.  */
41318334Speter
41418334Speterint
415132718Skanrtx_addr_varies_p (rtx x, int for_alias)
41618334Speter{
41790075Sobrien  enum rtx_code code;
41890075Sobrien  int i;
41990075Sobrien  const char *fmt;
42018334Speter
42118334Speter  if (x == 0)
42218334Speter    return 0;
42318334Speter
42418334Speter  code = GET_CODE (x);
42518334Speter  if (code == MEM)
42690075Sobrien    return GET_MODE (x) == BLKmode || rtx_varies_p (XEXP (x, 0), for_alias);
42718334Speter
42818334Speter  fmt = GET_RTX_FORMAT (code);
42918334Speter  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
43018334Speter    if (fmt[i] == 'e')
43150397Sobrien      {
43290075Sobrien	if (rtx_addr_varies_p (XEXP (x, i), for_alias))
43350397Sobrien	  return 1;
43450397Sobrien      }
43550397Sobrien    else if (fmt[i] == 'E')
43650397Sobrien      {
43750397Sobrien	int j;
43850397Sobrien	for (j = 0; j < XVECLEN (x, i); j++)
43990075Sobrien	  if (rtx_addr_varies_p (XVECEXP (x, i, j), for_alias))
44050397Sobrien	    return 1;
44150397Sobrien      }
44218334Speter  return 0;
44318334Speter}
44418334Speter
44518334Speter/* Return the value of the integer term in X, if one is apparent;
44618334Speter   otherwise return 0.
44718334Speter   Only obvious integer terms are detected.
44890075Sobrien   This is used in cse.c with the `related_value' field.  */
44918334Speter
45018334SpeterHOST_WIDE_INT
451132718Skanget_integer_term (rtx x)
45218334Speter{
45318334Speter  if (GET_CODE (x) == CONST)
45418334Speter    x = XEXP (x, 0);
45518334Speter
45618334Speter  if (GET_CODE (x) == MINUS
45718334Speter      && GET_CODE (XEXP (x, 1)) == CONST_INT)
45818334Speter    return - INTVAL (XEXP (x, 1));
45918334Speter  if (GET_CODE (x) == PLUS
46018334Speter      && GET_CODE (XEXP (x, 1)) == CONST_INT)
46118334Speter    return INTVAL (XEXP (x, 1));
46218334Speter  return 0;
46318334Speter}
46418334Speter
46518334Speter/* If X is a constant, return the value sans apparent integer term;
46618334Speter   otherwise return 0.
46718334Speter   Only obvious integer terms are detected.  */
46818334Speter
46918334Speterrtx
470132718Skanget_related_value (rtx x)
47118334Speter{
47218334Speter  if (GET_CODE (x) != CONST)
47318334Speter    return 0;
47418334Speter  x = XEXP (x, 0);
47518334Speter  if (GET_CODE (x) == PLUS
47618334Speter      && GET_CODE (XEXP (x, 1)) == CONST_INT)
47718334Speter    return XEXP (x, 0);
47818334Speter  else if (GET_CODE (x) == MINUS
47918334Speter	   && GET_CODE (XEXP (x, 1)) == CONST_INT)
48018334Speter    return XEXP (x, 0);
48118334Speter  return 0;
48218334Speter}
48318334Speter
48490075Sobrien/* Return the number of places FIND appears within X.  If COUNT_DEST is
48590075Sobrien   zero, we do not count occurrences inside the destination of a SET.  */
48690075Sobrien
48790075Sobrienint
488132718Skancount_occurrences (rtx x, rtx find, int count_dest)
48990075Sobrien{
49090075Sobrien  int i, j;
49190075Sobrien  enum rtx_code code;
49290075Sobrien  const char *format_ptr;
49390075Sobrien  int count;
49490075Sobrien
49590075Sobrien  if (x == find)
49690075Sobrien    return 1;
49790075Sobrien
49890075Sobrien  code = GET_CODE (x);
49990075Sobrien
50090075Sobrien  switch (code)
50190075Sobrien    {
50290075Sobrien    case REG:
50390075Sobrien    case CONST_INT:
50490075Sobrien    case CONST_DOUBLE:
50596263Sobrien    case CONST_VECTOR:
50690075Sobrien    case SYMBOL_REF:
50790075Sobrien    case CODE_LABEL:
50890075Sobrien    case PC:
50990075Sobrien    case CC0:
51090075Sobrien      return 0;
51190075Sobrien
51290075Sobrien    case MEM:
513169689Skan      if (MEM_P (find) && rtx_equal_p (x, find))
51490075Sobrien	return 1;
51590075Sobrien      break;
51690075Sobrien
51790075Sobrien    case SET:
51890075Sobrien      if (SET_DEST (x) == find && ! count_dest)
51990075Sobrien	return count_occurrences (SET_SRC (x), find, count_dest);
52090075Sobrien      break;
52190075Sobrien
52290075Sobrien    default:
52390075Sobrien      break;
52490075Sobrien    }
52590075Sobrien
52690075Sobrien  format_ptr = GET_RTX_FORMAT (code);
52790075Sobrien  count = 0;
52890075Sobrien
52990075Sobrien  for (i = 0; i < GET_RTX_LENGTH (code); i++)
53090075Sobrien    {
53190075Sobrien      switch (*format_ptr++)
53290075Sobrien	{
53390075Sobrien	case 'e':
53490075Sobrien	  count += count_occurrences (XEXP (x, i), find, count_dest);
53590075Sobrien	  break;
53690075Sobrien
53790075Sobrien	case 'E':
53890075Sobrien	  for (j = 0; j < XVECLEN (x, i); j++)
53990075Sobrien	    count += count_occurrences (XVECEXP (x, i, j), find, count_dest);
54090075Sobrien	  break;
54190075Sobrien	}
54290075Sobrien    }
54390075Sobrien  return count;
54490075Sobrien}
54590075Sobrien
54618334Speter/* Nonzero if register REG appears somewhere within IN.
54718334Speter   Also works if REG is not a register; in this case it checks
54818334Speter   for a subexpression of IN that is Lisp "equal" to REG.  */
54918334Speter
55018334Speterint
551132718Skanreg_mentioned_p (rtx reg, rtx in)
55218334Speter{
55390075Sobrien  const char *fmt;
55490075Sobrien  int i;
55590075Sobrien  enum rtx_code code;
55618334Speter
55718334Speter  if (in == 0)
55818334Speter    return 0;
55918334Speter
56018334Speter  if (reg == in)
56118334Speter    return 1;
56218334Speter
56318334Speter  if (GET_CODE (in) == LABEL_REF)
56418334Speter    return reg == XEXP (in, 0);
56518334Speter
56618334Speter  code = GET_CODE (in);
56718334Speter
56818334Speter  switch (code)
56918334Speter    {
57018334Speter      /* Compare registers by number.  */
57118334Speter    case REG:
572169689Skan      return REG_P (reg) && REGNO (in) == REGNO (reg);
57318334Speter
57418334Speter      /* These codes have no constituent expressions
57518334Speter	 and are unique.  */
57618334Speter    case SCRATCH:
57718334Speter    case CC0:
57818334Speter    case PC:
57918334Speter      return 0;
58018334Speter
58118334Speter    case CONST_INT:
58296263Sobrien    case CONST_VECTOR:
58318334Speter    case CONST_DOUBLE:
58418334Speter      /* These are kept unique for a given value.  */
58518334Speter      return 0;
586117395Skan
58750397Sobrien    default:
58850397Sobrien      break;
58918334Speter    }
59018334Speter
59118334Speter  if (GET_CODE (reg) == code && rtx_equal_p (reg, in))
59218334Speter    return 1;
59318334Speter
59418334Speter  fmt = GET_RTX_FORMAT (code);
59518334Speter
59618334Speter  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
59718334Speter    {
59818334Speter      if (fmt[i] == 'E')
59918334Speter	{
60090075Sobrien	  int j;
60118334Speter	  for (j = XVECLEN (in, i) - 1; j >= 0; j--)
60218334Speter	    if (reg_mentioned_p (reg, XVECEXP (in, i, j)))
60318334Speter	      return 1;
60418334Speter	}
60518334Speter      else if (fmt[i] == 'e'
60618334Speter	       && reg_mentioned_p (reg, XEXP (in, i)))
60718334Speter	return 1;
60818334Speter    }
60918334Speter  return 0;
61018334Speter}
61118334Speter
61218334Speter/* Return 1 if in between BEG and END, exclusive of BEG and END, there is
61318334Speter   no CODE_LABEL insn.  */
61418334Speter
61518334Speterint
616132718Skanno_labels_between_p (rtx beg, rtx end)
61718334Speter{
61890075Sobrien  rtx p;
61990075Sobrien  if (beg == end)
62090075Sobrien    return 0;
62118334Speter  for (p = NEXT_INSN (beg); p != end; p = NEXT_INSN (p))
622169689Skan    if (LABEL_P (p))
62318334Speter      return 0;
62418334Speter  return 1;
62518334Speter}
62618334Speter
62718334Speter/* Nonzero if register REG is used in an insn between
62818334Speter   FROM_INSN and TO_INSN (exclusive of those two).  */
62918334Speter
63018334Speterint
631132718Skanreg_used_between_p (rtx reg, rtx from_insn, rtx to_insn)
63218334Speter{
63390075Sobrien  rtx insn;
63418334Speter
63518334Speter  if (from_insn == to_insn)
63618334Speter    return 0;
63718334Speter
63818334Speter  for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
63990075Sobrien    if (INSN_P (insn)
64018334Speter	&& (reg_overlap_mentioned_p (reg, PATTERN (insn))
641169689Skan	   || (CALL_P (insn) && find_reg_fusage (insn, USE, reg))))
64218334Speter      return 1;
64318334Speter  return 0;
64418334Speter}
64518334Speter
64618334Speter/* Nonzero if the old value of X, a register, is referenced in BODY.  If X
64718334Speter   is entirely replaced by a new value and the only use is as a SET_DEST,
64818334Speter   we do not consider it a reference.  */
64918334Speter
65018334Speterint
651132718Skanreg_referenced_p (rtx x, rtx body)
65218334Speter{
65318334Speter  int i;
65418334Speter
65518334Speter  switch (GET_CODE (body))
65618334Speter    {
65718334Speter    case SET:
65818334Speter      if (reg_overlap_mentioned_p (x, SET_SRC (body)))
65918334Speter	return 1;
66018334Speter
66118334Speter      /* If the destination is anything other than CC0, PC, a REG or a SUBREG
66218334Speter	 of a REG that occupies all of the REG, the insn references X if
66318334Speter	 it is mentioned in the destination.  */
66418334Speter      if (GET_CODE (SET_DEST (body)) != CC0
66518334Speter	  && GET_CODE (SET_DEST (body)) != PC
666169689Skan	  && !REG_P (SET_DEST (body))
66718334Speter	  && ! (GET_CODE (SET_DEST (body)) == SUBREG
668169689Skan		&& REG_P (SUBREG_REG (SET_DEST (body)))
66918334Speter		&& (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (body))))
67018334Speter		      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
67118334Speter		    == ((GET_MODE_SIZE (GET_MODE (SET_DEST (body)))
67218334Speter			 + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
67318334Speter	  && reg_overlap_mentioned_p (x, SET_DEST (body)))
67418334Speter	return 1;
67550397Sobrien      return 0;
67618334Speter
67718334Speter    case ASM_OPERANDS:
67818334Speter      for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
67918334Speter	if (reg_overlap_mentioned_p (x, ASM_OPERANDS_INPUT (body, i)))
68018334Speter	  return 1;
68150397Sobrien      return 0;
68218334Speter
68318334Speter    case CALL:
68418334Speter    case USE:
68590075Sobrien    case IF_THEN_ELSE:
68618334Speter      return reg_overlap_mentioned_p (x, body);
68718334Speter
68818334Speter    case TRAP_IF:
68918334Speter      return reg_overlap_mentioned_p (x, TRAP_CONDITION (body));
69018334Speter
69190075Sobrien    case PREFETCH:
69290075Sobrien      return reg_overlap_mentioned_p (x, XEXP (body, 0));
69390075Sobrien
69418334Speter    case UNSPEC:
69518334Speter    case UNSPEC_VOLATILE:
69690075Sobrien      for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
69790075Sobrien	if (reg_overlap_mentioned_p (x, XVECEXP (body, 0, i)))
69890075Sobrien	  return 1;
69990075Sobrien      return 0;
70090075Sobrien
70118334Speter    case PARALLEL:
70218334Speter      for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
70318334Speter	if (reg_referenced_p (x, XVECEXP (body, 0, i)))
70418334Speter	  return 1;
70550397Sobrien      return 0;
706117395Skan
70790075Sobrien    case CLOBBER:
708169689Skan      if (MEM_P (XEXP (body, 0)))
70990075Sobrien	if (reg_overlap_mentioned_p (x, XEXP (XEXP (body, 0), 0)))
71090075Sobrien	  return 1;
71190075Sobrien      return 0;
71290075Sobrien
71390075Sobrien    case COND_EXEC:
71490075Sobrien      if (reg_overlap_mentioned_p (x, COND_EXEC_TEST (body)))
71590075Sobrien	return 1;
71690075Sobrien      return reg_referenced_p (x, COND_EXEC_CODE (body));
71790075Sobrien
71850397Sobrien    default:
71950397Sobrien      return 0;
72018334Speter    }
72118334Speter}
72218334Speter
72318334Speter/* Nonzero if register REG is set or clobbered in an insn between
72418334Speter   FROM_INSN and TO_INSN (exclusive of those two).  */
72518334Speter
72618334Speterint
727132718Skanreg_set_between_p (rtx reg, rtx from_insn, rtx to_insn)
72818334Speter{
72990075Sobrien  rtx insn;
73018334Speter
73118334Speter  if (from_insn == to_insn)
73218334Speter    return 0;
73318334Speter
73418334Speter  for (insn = NEXT_INSN (from_insn); insn != to_insn; insn = NEXT_INSN (insn))
73590075Sobrien    if (INSN_P (insn) && reg_set_p (reg, insn))
73618334Speter      return 1;
73718334Speter  return 0;
73818334Speter}
73918334Speter
74018334Speter/* Internals of reg_set_between_p.  */
74118334Speterint
742132718Skanreg_set_p (rtx reg, rtx insn)
74318334Speter{
74418334Speter  /* We can be passed an insn or part of one.  If we are passed an insn,
74518334Speter     check if a side-effect of the insn clobbers REG.  */
746132718Skan  if (INSN_P (insn)
747132718Skan      && (FIND_REG_INC_NOTE (insn, reg)
748169689Skan	  || (CALL_P (insn)
749169689Skan	      && ((REG_P (reg)
750169689Skan		   && REGNO (reg) < FIRST_PSEUDO_REGISTER
751259269Spfg		   && overlaps_hard_reg_set_p (regs_invalidated_by_call,
752259269Spfg					       GET_MODE (reg), REGNO (reg)))
753169689Skan		  || MEM_P (reg)
754132718Skan		  || find_reg_fusage (insn, CLOBBER, reg)))))
755132718Skan    return 1;
75618334Speter
75790075Sobrien  return set_of (reg, insn) != NULL_RTX;
75818334Speter}
75918334Speter
76018334Speter/* Similar to reg_set_between_p, but check all registers in X.  Return 0
76118334Speter   only if none of them are modified between START and END.  Return 1 if
762132718Skan   X contains a MEM; this routine does usememory aliasing.  */
76318334Speter
76418334Speterint
765132718Skanmodified_between_p (rtx x, rtx start, rtx end)
76618334Speter{
76718334Speter  enum rtx_code code = GET_CODE (x);
76890075Sobrien  const char *fmt;
76918334Speter  int i, j;
770132718Skan  rtx insn;
77118334Speter
772132718Skan  if (start == end)
773132718Skan    return 0;
774132718Skan
77518334Speter  switch (code)
77618334Speter    {
77718334Speter    case CONST_INT:
77818334Speter    case CONST_DOUBLE:
77996263Sobrien    case CONST_VECTOR:
78018334Speter    case CONST:
78118334Speter    case SYMBOL_REF:
78218334Speter    case LABEL_REF:
78318334Speter      return 0;
78418334Speter
78518334Speter    case PC:
78618334Speter    case CC0:
78718334Speter      return 1;
78818334Speter
78918334Speter    case MEM:
790132718Skan      if (modified_between_p (XEXP (x, 0), start, end))
79118334Speter	return 1;
792169689Skan      if (MEM_READONLY_P (x))
793169689Skan	return 0;
794132718Skan      for (insn = NEXT_INSN (start); insn != end; insn = NEXT_INSN (insn))
795132718Skan	if (memory_modified_in_insn_p (x, insn))
796132718Skan	  return 1;
797132718Skan      return 0;
79818334Speter      break;
79918334Speter
80018334Speter    case REG:
80118334Speter      return reg_set_between_p (x, start, end);
802117395Skan
80350397Sobrien    default:
80450397Sobrien      break;
80518334Speter    }
80618334Speter
80718334Speter  fmt = GET_RTX_FORMAT (code);
80818334Speter  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
80918334Speter    {
81018334Speter      if (fmt[i] == 'e' && modified_between_p (XEXP (x, i), start, end))
81118334Speter	return 1;
81218334Speter
81390075Sobrien      else if (fmt[i] == 'E')
81418334Speter	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
81518334Speter	  if (modified_between_p (XVECEXP (x, i, j), start, end))
81618334Speter	    return 1;
81718334Speter    }
81818334Speter
81918334Speter  return 0;
82018334Speter}
82118334Speter
82218334Speter/* Similar to reg_set_p, but check all registers in X.  Return 0 only if none
82318334Speter   of them are modified in INSN.  Return 1 if X contains a MEM; this routine
824132718Skan   does use memory aliasing.  */
82518334Speter
82618334Speterint
827132718Skanmodified_in_p (rtx x, rtx insn)
82818334Speter{
82918334Speter  enum rtx_code code = GET_CODE (x);
83090075Sobrien  const char *fmt;
83118334Speter  int i, j;
83218334Speter
83318334Speter  switch (code)
83418334Speter    {
83518334Speter    case CONST_INT:
83618334Speter    case CONST_DOUBLE:
83796263Sobrien    case CONST_VECTOR:
83818334Speter    case CONST:
83918334Speter    case SYMBOL_REF:
84018334Speter    case LABEL_REF:
84118334Speter      return 0;
84218334Speter
84318334Speter    case PC:
84418334Speter    case CC0:
84518334Speter      return 1;
84618334Speter
84718334Speter    case MEM:
848132718Skan      if (modified_in_p (XEXP (x, 0), insn))
84918334Speter	return 1;
850169689Skan      if (MEM_READONLY_P (x))
851169689Skan	return 0;
852132718Skan      if (memory_modified_in_insn_p (x, insn))
853132718Skan	return 1;
854132718Skan      return 0;
85518334Speter      break;
85618334Speter
85718334Speter    case REG:
85818334Speter      return reg_set_p (x, insn);
85950397Sobrien
86050397Sobrien    default:
86150397Sobrien      break;
86218334Speter    }
86318334Speter
86418334Speter  fmt = GET_RTX_FORMAT (code);
86518334Speter  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
86618334Speter    {
86718334Speter      if (fmt[i] == 'e' && modified_in_p (XEXP (x, i), insn))
86818334Speter	return 1;
86918334Speter
87090075Sobrien      else if (fmt[i] == 'E')
87118334Speter	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
87218334Speter	  if (modified_in_p (XVECEXP (x, i, j), insn))
87318334Speter	    return 1;
87418334Speter    }
87518334Speter
87618334Speter  return 0;
87718334Speter}
87818334Speter
87990075Sobrien/* Helper function for set_of.  */
88090075Sobrienstruct set_of_data
88190075Sobrien  {
88290075Sobrien    rtx found;
88390075Sobrien    rtx pat;
88490075Sobrien  };
88590075Sobrien
88690075Sobrienstatic void
887132718Skanset_of_1 (rtx x, rtx pat, void *data1)
88890075Sobrien{
88990075Sobrien   struct set_of_data *data = (struct set_of_data *) (data1);
89090075Sobrien   if (rtx_equal_p (x, data->pat)
891169689Skan       || (!MEM_P (x) && reg_overlap_mentioned_p (data->pat, x)))
89290075Sobrien     data->found = pat;
89390075Sobrien}
89490075Sobrien
89590075Sobrien/* Give an INSN, return a SET or CLOBBER expression that does modify PAT
89690075Sobrien   (either directly or via STRICT_LOW_PART and similar modifiers).  */
89790075Sobrienrtx
898132718Skanset_of (rtx pat, rtx insn)
89990075Sobrien{
90090075Sobrien  struct set_of_data data;
90190075Sobrien  data.found = NULL_RTX;
90290075Sobrien  data.pat = pat;
90390075Sobrien  note_stores (INSN_P (insn) ? PATTERN (insn) : insn, set_of_1, &data);
90490075Sobrien  return data.found;
90590075Sobrien}
90690075Sobrien
90718334Speter/* Given an INSN, return a SET expression if this insn has only a single SET.
90818334Speter   It may also have CLOBBERs, USEs, or SET whose output
90918334Speter   will not be used, which we ignore.  */
91018334Speter
91118334Speterrtx
912132718Skansingle_set_2 (rtx insn, rtx pat)
91318334Speter{
91490075Sobrien  rtx set = NULL;
91590075Sobrien  int set_verified = 1;
91618334Speter  int i;
91718334Speter
91890075Sobrien  if (GET_CODE (pat) == PARALLEL)
91918334Speter    {
92090075Sobrien      for (i = 0; i < XVECLEN (pat, 0); i++)
92190075Sobrien	{
92290075Sobrien	  rtx sub = XVECEXP (pat, 0, i);
92390075Sobrien	  switch (GET_CODE (sub))
92490075Sobrien	    {
92590075Sobrien	    case USE:
92690075Sobrien	    case CLOBBER:
92790075Sobrien	      break;
92890075Sobrien
92990075Sobrien	    case SET:
93090075Sobrien	      /* We can consider insns having multiple sets, where all
93190075Sobrien		 but one are dead as single set insns.  In common case
93290075Sobrien		 only single set is present in the pattern so we want
93390075Sobrien		 to avoid checking for REG_UNUSED notes unless necessary.
93490075Sobrien
93590075Sobrien		 When we reach set first time, we just expect this is
93690075Sobrien		 the single set we are looking for and only when more
93790075Sobrien		 sets are found in the insn, we check them.  */
93890075Sobrien	      if (!set_verified)
93990075Sobrien		{
94090075Sobrien		  if (find_reg_note (insn, REG_UNUSED, SET_DEST (set))
94190075Sobrien		      && !side_effects_p (set))
94290075Sobrien		    set = NULL;
94390075Sobrien		  else
94490075Sobrien		    set_verified = 1;
94590075Sobrien		}
94690075Sobrien	      if (!set)
94790075Sobrien		set = sub, set_verified = 0;
94890075Sobrien	      else if (!find_reg_note (insn, REG_UNUSED, SET_DEST (sub))
94990075Sobrien		       || side_effects_p (sub))
95090075Sobrien		return NULL_RTX;
95190075Sobrien	      break;
95290075Sobrien
95390075Sobrien	    default:
95490075Sobrien	      return NULL_RTX;
95590075Sobrien	    }
95690075Sobrien	}
95718334Speter    }
95890075Sobrien  return set;
95918334Speter}
96052284Sobrien
96152284Sobrien/* Given an INSN, return nonzero if it has more than one SET, else return
96252284Sobrien   zero.  */
96352284Sobrien
96452284Sobrienint
965132718Skanmultiple_sets (rtx insn)
96652284Sobrien{
96752284Sobrien  int found;
96852284Sobrien  int i;
969117395Skan
97052284Sobrien  /* INSN must be an insn.  */
97190075Sobrien  if (! INSN_P (insn))
97252284Sobrien    return 0;
97352284Sobrien
97452284Sobrien  /* Only a PARALLEL can have multiple SETs.  */
97552284Sobrien  if (GET_CODE (PATTERN (insn)) == PARALLEL)
97652284Sobrien    {
97752284Sobrien      for (i = 0, found = 0; i < XVECLEN (PATTERN (insn), 0); i++)
97852284Sobrien	if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
97952284Sobrien	  {
98052284Sobrien	    /* If we have already found a SET, then return now.  */
98152284Sobrien	    if (found)
98252284Sobrien	      return 1;
98352284Sobrien	    else
98452284Sobrien	      found = 1;
98552284Sobrien	  }
98652284Sobrien    }
987117395Skan
98852284Sobrien  /* Either zero or one SET.  */
98952284Sobrien  return 0;
99052284Sobrien}
99118334Speter
99290075Sobrien/* Return nonzero if the destination of SET equals the source
99390075Sobrien   and there are no side effects.  */
99418334Speter
99590075Sobrienint
996132718Skanset_noop_p (rtx set)
99790075Sobrien{
99890075Sobrien  rtx src = SET_SRC (set);
99990075Sobrien  rtx dst = SET_DEST (set);
100090075Sobrien
1001132718Skan  if (dst == pc_rtx && src == pc_rtx)
1002132718Skan    return 1;
100390075Sobrien
1004169689Skan  if (MEM_P (dst) && MEM_P (src))
1005132718Skan    return rtx_equal_p (dst, src) && !side_effects_p (dst);
100690075Sobrien
1007169689Skan  if (GET_CODE (dst) == ZERO_EXTRACT)
100890075Sobrien    return rtx_equal_p (XEXP (dst, 0), src)
1009132718Skan	   && ! BYTES_BIG_ENDIAN && XEXP (dst, 2) == const0_rtx
1010132718Skan	   && !side_effects_p (src);
101190075Sobrien
101290075Sobrien  if (GET_CODE (dst) == STRICT_LOW_PART)
101390075Sobrien    dst = XEXP (dst, 0);
101490075Sobrien
101590075Sobrien  if (GET_CODE (src) == SUBREG && GET_CODE (dst) == SUBREG)
101690075Sobrien    {
101790075Sobrien      if (SUBREG_BYTE (src) != SUBREG_BYTE (dst))
101890075Sobrien	return 0;
101990075Sobrien      src = SUBREG_REG (src);
102090075Sobrien      dst = SUBREG_REG (dst);
102190075Sobrien    }
102290075Sobrien
1023169689Skan  return (REG_P (src) && REG_P (dst)
102490075Sobrien	  && REGNO (src) == REGNO (dst));
102590075Sobrien}
102690075Sobrien
102790075Sobrien/* Return nonzero if an insn consists only of SETs, each of which only sets a
102890075Sobrien   value to itself.  */
102990075Sobrien
103090075Sobrienint
1031132718Skannoop_move_p (rtx insn)
103290075Sobrien{
103390075Sobrien  rtx pat = PATTERN (insn);
103490075Sobrien
103590075Sobrien  if (INSN_CODE (insn) == NOOP_MOVE_INSN_CODE)
103690075Sobrien    return 1;
103790075Sobrien
103890075Sobrien  /* Insns carrying these notes are useful later on.  */
103990075Sobrien  if (find_reg_note (insn, REG_EQUAL, NULL_RTX))
104090075Sobrien    return 0;
104190075Sobrien
104290075Sobrien  /* For now treat an insn with a REG_RETVAL note as a
104390075Sobrien     a special insn which should not be considered a no-op.  */
104490075Sobrien  if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
104590075Sobrien    return 0;
104690075Sobrien
104790075Sobrien  if (GET_CODE (pat) == SET && set_noop_p (pat))
104890075Sobrien    return 1;
104990075Sobrien
105090075Sobrien  if (GET_CODE (pat) == PARALLEL)
105190075Sobrien    {
105290075Sobrien      int i;
105390075Sobrien      /* If nothing but SETs of registers to themselves,
105490075Sobrien	 this insn can also be deleted.  */
105590075Sobrien      for (i = 0; i < XVECLEN (pat, 0); i++)
105690075Sobrien	{
105790075Sobrien	  rtx tem = XVECEXP (pat, 0, i);
105890075Sobrien
105990075Sobrien	  if (GET_CODE (tem) == USE
106090075Sobrien	      || GET_CODE (tem) == CLOBBER)
106190075Sobrien	    continue;
106290075Sobrien
106390075Sobrien	  if (GET_CODE (tem) != SET || ! set_noop_p (tem))
106490075Sobrien	    return 0;
106590075Sobrien	}
106690075Sobrien
106790075Sobrien      return 1;
106890075Sobrien    }
106990075Sobrien  return 0;
107090075Sobrien}
107190075Sobrien
107290075Sobrien
107390075Sobrien/* Return the last thing that X was assigned from before *PINSN.  If VALID_TO
107490075Sobrien   is not NULL_RTX then verify that the object is not modified up to VALID_TO.
107590075Sobrien   If the object was modified, if we hit a partial assignment to X, or hit a
107690075Sobrien   CODE_LABEL first, return X.  If we found an assignment, update *PINSN to
107790075Sobrien   point to it.  ALLOW_HWREG is set to 1 if hardware registers are allowed to
107890075Sobrien   be the src.  */
107990075Sobrien
108018334Speterrtx
1081132718Skanfind_last_value (rtx x, rtx *pinsn, rtx valid_to, int allow_hwreg)
108218334Speter{
108318334Speter  rtx p;
108418334Speter
1085169689Skan  for (p = PREV_INSN (*pinsn); p && !LABEL_P (p);
108618334Speter       p = PREV_INSN (p))
108790075Sobrien    if (INSN_P (p))
108818334Speter      {
108918334Speter	rtx set = single_set (p);
109018334Speter	rtx note = find_reg_note (p, REG_EQUAL, NULL_RTX);
109118334Speter
109218334Speter	if (set && rtx_equal_p (x, SET_DEST (set)))
109318334Speter	  {
109418334Speter	    rtx src = SET_SRC (set);
109518334Speter
109618334Speter	    if (note && GET_CODE (XEXP (note, 0)) != EXPR_LIST)
109718334Speter	      src = XEXP (note, 0);
109818334Speter
109990075Sobrien	    if ((valid_to == NULL_RTX
110090075Sobrien		 || ! modified_between_p (src, PREV_INSN (p), valid_to))
110118334Speter		/* Reject hard registers because we don't usually want
110218334Speter		   to use them; we'd rather use a pseudo.  */
1103169689Skan		&& (! (REG_P (src)
110452284Sobrien		      && REGNO (src) < FIRST_PSEUDO_REGISTER) || allow_hwreg))
110518334Speter	      {
110618334Speter		*pinsn = p;
110718334Speter		return src;
110818334Speter	      }
110918334Speter	  }
1110117395Skan
111118334Speter	/* If set in non-simple way, we don't have a value.  */
111218334Speter	if (reg_set_p (x, p))
111318334Speter	  break;
111418334Speter      }
111518334Speter
111618334Speter  return x;
1117117395Skan}
111818334Speter
111918334Speter/* Return nonzero if register in range [REGNO, ENDREGNO)
112018334Speter   appears either explicitly or implicitly in X
112118334Speter   other than being stored into.
112218334Speter
112318334Speter   References contained within the substructure at LOC do not count.
112418334Speter   LOC may be zero, meaning don't ignore anything.  */
112518334Speter
112618334Speterint
1127132718Skanrefers_to_regno_p (unsigned int regno, unsigned int endregno, rtx x,
1128132718Skan		   rtx *loc)
112918334Speter{
113090075Sobrien  int i;
113190075Sobrien  unsigned int x_regno;
113290075Sobrien  RTX_CODE code;
113390075Sobrien  const char *fmt;
113418334Speter
113518334Speter repeat:
113618334Speter  /* The contents of a REG_NONNEG note is always zero, so we must come here
113718334Speter     upon repeat in case the last REG_NOTE is a REG_NONNEG note.  */
113818334Speter  if (x == 0)
113918334Speter    return 0;
114018334Speter
114118334Speter  code = GET_CODE (x);
114218334Speter
114318334Speter  switch (code)
114418334Speter    {
114518334Speter    case REG:
114690075Sobrien      x_regno = REGNO (x);
114718334Speter
114818334Speter      /* If we modifying the stack, frame, or argument pointer, it will
114918334Speter	 clobber a virtual register.  In fact, we could be more precise,
115018334Speter	 but it isn't worth it.  */
115190075Sobrien      if ((x_regno == STACK_POINTER_REGNUM
115218334Speter#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
115390075Sobrien	   || x_regno == ARG_POINTER_REGNUM
115418334Speter#endif
115590075Sobrien	   || x_regno == FRAME_POINTER_REGNUM)
115618334Speter	  && regno >= FIRST_VIRTUAL_REGISTER && regno <= LAST_VIRTUAL_REGISTER)
115718334Speter	return 1;
115818334Speter
115990075Sobrien      return (endregno > x_regno
1160117395Skan	      && regno < x_regno + (x_regno < FIRST_PSEUDO_REGISTER
1161169689Skan				    ? hard_regno_nregs[x_regno][GET_MODE (x)]
116218334Speter			      : 1));
116318334Speter
116418334Speter    case SUBREG:
116518334Speter      /* If this is a SUBREG of a hard reg, we can see exactly which
116618334Speter	 registers are being modified.  Otherwise, handle normally.  */
1167169689Skan      if (REG_P (SUBREG_REG (x))
116818334Speter	  && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
116918334Speter	{
117090075Sobrien	  unsigned int inner_regno = subreg_regno (x);
117190075Sobrien	  unsigned int inner_endregno
117218334Speter	    = inner_regno + (inner_regno < FIRST_PSEUDO_REGISTER
1173169689Skan			     ? hard_regno_nregs[inner_regno][GET_MODE (x)] : 1);
117418334Speter
117518334Speter	  return endregno > inner_regno && regno < inner_endregno;
117618334Speter	}
117718334Speter      break;
117818334Speter
117918334Speter    case CLOBBER:
118018334Speter    case SET:
118118334Speter      if (&SET_DEST (x) != loc
118218334Speter	  /* Note setting a SUBREG counts as referring to the REG it is in for
118318334Speter	     a pseudo but not for hard registers since we can
118418334Speter	     treat each word individually.  */
118518334Speter	  && ((GET_CODE (SET_DEST (x)) == SUBREG
118618334Speter	       && loc != &SUBREG_REG (SET_DEST (x))
1187169689Skan	       && REG_P (SUBREG_REG (SET_DEST (x)))
118818334Speter	       && REGNO (SUBREG_REG (SET_DEST (x))) >= FIRST_PSEUDO_REGISTER
118918334Speter	       && refers_to_regno_p (regno, endregno,
119018334Speter				     SUBREG_REG (SET_DEST (x)), loc))
1191169689Skan	      || (!REG_P (SET_DEST (x))
119218334Speter		  && refers_to_regno_p (regno, endregno, SET_DEST (x), loc))))
119318334Speter	return 1;
119418334Speter
119518334Speter      if (code == CLOBBER || loc == &SET_SRC (x))
119618334Speter	return 0;
119718334Speter      x = SET_SRC (x);
119818334Speter      goto repeat;
119950397Sobrien
120050397Sobrien    default:
120150397Sobrien      break;
120218334Speter    }
120318334Speter
120418334Speter  /* X does not match, so try its subexpressions.  */
120518334Speter
120618334Speter  fmt = GET_RTX_FORMAT (code);
120718334Speter  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
120818334Speter    {
120918334Speter      if (fmt[i] == 'e' && loc != &XEXP (x, i))
121018334Speter	{
121118334Speter	  if (i == 0)
121218334Speter	    {
121318334Speter	      x = XEXP (x, 0);
121418334Speter	      goto repeat;
121518334Speter	    }
121618334Speter	  else
121718334Speter	    if (refers_to_regno_p (regno, endregno, XEXP (x, i), loc))
121818334Speter	      return 1;
121918334Speter	}
122018334Speter      else if (fmt[i] == 'E')
122118334Speter	{
122290075Sobrien	  int j;
1223132718Skan	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
122418334Speter	    if (loc != &XVECEXP (x, i, j)
122518334Speter		&& refers_to_regno_p (regno, endregno, XVECEXP (x, i, j), loc))
122618334Speter	      return 1;
122718334Speter	}
122818334Speter    }
122918334Speter  return 0;
123018334Speter}
123118334Speter
123218334Speter/* Nonzero if modifying X will affect IN.  If X is a register or a SUBREG,
123318334Speter   we check if any register number in X conflicts with the relevant register
123418334Speter   numbers.  If X is a constant, return 0.  If X is a MEM, return 1 iff IN
123518334Speter   contains a MEM (we don't bother checking for memory addresses that can't
123618334Speter   conflict because we expect this to be a rare case.  */
123718334Speter
123818334Speterint
1239132718Skanreg_overlap_mentioned_p (rtx x, rtx in)
124018334Speter{
124190075Sobrien  unsigned int regno, endregno;
124218334Speter
1243169689Skan  /* If either argument is a constant, then modifying X can not
1244169689Skan     affect IN.  Here we look at IN, we can profitably combine
1245169689Skan     CONSTANT_P (x) with the switch statement below.  */
1246169689Skan  if (CONSTANT_P (in))
124750397Sobrien    return 0;
124890075Sobrien
1249169689Skan recurse:
125090075Sobrien  switch (GET_CODE (x))
125118334Speter    {
1252169689Skan    case STRICT_LOW_PART:
1253169689Skan    case ZERO_EXTRACT:
1254169689Skan    case SIGN_EXTRACT:
1255169689Skan      /* Overly conservative.  */
1256169689Skan      x = XEXP (x, 0);
1257169689Skan      goto recurse;
1258169689Skan
125990075Sobrien    case SUBREG:
126018334Speter      regno = REGNO (SUBREG_REG (x));
126118334Speter      if (regno < FIRST_PSEUDO_REGISTER)
126290075Sobrien	regno = subreg_regno (x);
126390075Sobrien      goto do_reg;
126418334Speter
126590075Sobrien    case REG:
126690075Sobrien      regno = REGNO (x);
126790075Sobrien    do_reg:
126890075Sobrien      endregno = regno + (regno < FIRST_PSEUDO_REGISTER
1269169689Skan			  ? hard_regno_nregs[regno][GET_MODE (x)] : 1);
127090075Sobrien      return refers_to_regno_p (regno, endregno, in, (rtx*) 0);
127118334Speter
127290075Sobrien    case MEM:
127390075Sobrien      {
127490075Sobrien	const char *fmt;
127590075Sobrien	int i;
127618334Speter
1277169689Skan	if (MEM_P (in))
127818334Speter	  return 1;
127918334Speter
128090075Sobrien	fmt = GET_RTX_FORMAT (GET_CODE (in));
128190075Sobrien	for (i = GET_RTX_LENGTH (GET_CODE (in)) - 1; i >= 0; i--)
1282169689Skan	  if (fmt[i] == 'e')
1283169689Skan	    {
1284169689Skan	      if (reg_overlap_mentioned_p (x, XEXP (in, i)))
1285169689Skan		return 1;
1286169689Skan	    }
1287169689Skan	  else if (fmt[i] == 'E')
1288169689Skan	    {
1289169689Skan	      int j;
1290169689Skan	      for (j = XVECLEN (in, i) - 1; j >= 0; --j)
1291169689Skan		if (reg_overlap_mentioned_p (x, XVECEXP (in, i, j)))
1292169689Skan		  return 1;
1293169689Skan	    }
129452284Sobrien
129590075Sobrien	return 0;
129690075Sobrien      }
129718334Speter
129890075Sobrien    case SCRATCH:
129990075Sobrien    case PC:
130090075Sobrien    case CC0:
130190075Sobrien      return reg_mentioned_p (x, in);
130218334Speter
130390075Sobrien    case PARALLEL:
130490075Sobrien      {
130590075Sobrien	int i;
130618334Speter
130790075Sobrien	/* If any register in here refers to it we return true.  */
130890075Sobrien	for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
130990075Sobrien	  if (XEXP (XVECEXP (x, 0, i), 0) != 0
131090075Sobrien	      && reg_overlap_mentioned_p (XEXP (XVECEXP (x, 0, i), 0), in))
1311169689Skan	    return 1;
131290075Sobrien	return 0;
131390075Sobrien      }
131418334Speter
131590075Sobrien    default:
1316169689Skan      gcc_assert (CONSTANT_P (x));
1317169689Skan      return 0;
131890075Sobrien    }
131918334Speter}
132090075Sobrien
132118334Speter/* Call FUN on each register or MEM that is stored into or clobbered by X.
132218334Speter   (X would be the pattern of an insn).
132318334Speter   FUN receives two arguments:
132418334Speter     the REG, MEM, CC0 or PC being stored in or clobbered,
132518334Speter     the SET or CLOBBER rtx that does the store.
132618334Speter
132718334Speter  If the item being stored in or clobbered is a SUBREG of a hard register,
132818334Speter  the SUBREG will be passed.  */
1329117395Skan
133018334Spetervoid
1331132718Skannote_stores (rtx x, void (*fun) (rtx, rtx, void *), void *data)
133218334Speter{
133390075Sobrien  int i;
133490075Sobrien
133590075Sobrien  if (GET_CODE (x) == COND_EXEC)
133690075Sobrien    x = COND_EXEC_CODE (x);
133790075Sobrien
133890075Sobrien  if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER)
133918334Speter    {
134090075Sobrien      rtx dest = SET_DEST (x);
134190075Sobrien
134218334Speter      while ((GET_CODE (dest) == SUBREG
1343169689Skan	      && (!REG_P (SUBREG_REG (dest))
134418334Speter		  || REGNO (SUBREG_REG (dest)) >= FIRST_PSEUDO_REGISTER))
134518334Speter	     || GET_CODE (dest) == ZERO_EXTRACT
134618334Speter	     || GET_CODE (dest) == STRICT_LOW_PART)
134718334Speter	dest = XEXP (dest, 0);
134852284Sobrien
134990075Sobrien      /* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions,
135096263Sobrien	 each of whose first operand is a register.  */
135190075Sobrien      if (GET_CODE (dest) == PARALLEL)
135252284Sobrien	{
135352284Sobrien	  for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
135490075Sobrien	    if (XEXP (XVECEXP (dest, 0, i), 0) != 0)
135596263Sobrien	      (*fun) (XEXP (XVECEXP (dest, 0, i), 0), x, data);
135652284Sobrien	}
135752284Sobrien      else
135890075Sobrien	(*fun) (dest, x, data);
135918334Speter    }
136090075Sobrien
136118334Speter  else if (GET_CODE (x) == PARALLEL)
136290075Sobrien    for (i = XVECLEN (x, 0) - 1; i >= 0; i--)
136390075Sobrien      note_stores (XVECEXP (x, 0, i), fun, data);
136490075Sobrien}
136590075Sobrien
136690075Sobrien/* Like notes_stores, but call FUN for each expression that is being
136790075Sobrien   referenced in PBODY, a pointer to the PATTERN of an insn.  We only call
136890075Sobrien   FUN for each expression, not any interior subexpressions.  FUN receives a
136990075Sobrien   pointer to the expression and the DATA passed to this function.
137090075Sobrien
137190075Sobrien   Note that this is not quite the same test as that done in reg_referenced_p
137290075Sobrien   since that considers something as being referenced if it is being
137390075Sobrien   partially set, while we do not.  */
137490075Sobrien
137590075Sobrienvoid
1376132718Skannote_uses (rtx *pbody, void (*fun) (rtx *, void *), void *data)
137790075Sobrien{
137890075Sobrien  rtx body = *pbody;
137990075Sobrien  int i;
138090075Sobrien
138190075Sobrien  switch (GET_CODE (body))
138218334Speter    {
138390075Sobrien    case COND_EXEC:
138490075Sobrien      (*fun) (&COND_EXEC_TEST (body), data);
138590075Sobrien      note_uses (&COND_EXEC_CODE (body), fun, data);
138690075Sobrien      return;
138790075Sobrien
138890075Sobrien    case PARALLEL:
138990075Sobrien      for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
139090075Sobrien	note_uses (&XVECEXP (body, 0, i), fun, data);
139190075Sobrien      return;
139290075Sobrien
139390075Sobrien    case USE:
139490075Sobrien      (*fun) (&XEXP (body, 0), data);
139590075Sobrien      return;
139690075Sobrien
139790075Sobrien    case ASM_OPERANDS:
139890075Sobrien      for (i = ASM_OPERANDS_INPUT_LENGTH (body) - 1; i >= 0; i--)
139990075Sobrien	(*fun) (&ASM_OPERANDS_INPUT (body, i), data);
140090075Sobrien      return;
140190075Sobrien
140290075Sobrien    case TRAP_IF:
140390075Sobrien      (*fun) (&TRAP_CONDITION (body), data);
140490075Sobrien      return;
140590075Sobrien
140690075Sobrien    case PREFETCH:
140790075Sobrien      (*fun) (&XEXP (body, 0), data);
140890075Sobrien      return;
140990075Sobrien
141090075Sobrien    case UNSPEC:
141190075Sobrien    case UNSPEC_VOLATILE:
141290075Sobrien      for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
141390075Sobrien	(*fun) (&XVECEXP (body, 0, i), data);
141490075Sobrien      return;
141590075Sobrien
141690075Sobrien    case CLOBBER:
1417169689Skan      if (MEM_P (XEXP (body, 0)))
141890075Sobrien	(*fun) (&XEXP (XEXP (body, 0), 0), data);
141990075Sobrien      return;
142090075Sobrien
142190075Sobrien    case SET:
142290075Sobrien      {
142390075Sobrien	rtx dest = SET_DEST (body);
142490075Sobrien
142590075Sobrien	/* For sets we replace everything in source plus registers in memory
142690075Sobrien	   expression in store and operands of a ZERO_EXTRACT.  */
142790075Sobrien	(*fun) (&SET_SRC (body), data);
142890075Sobrien
142990075Sobrien	if (GET_CODE (dest) == ZERO_EXTRACT)
143090075Sobrien	  {
143190075Sobrien	    (*fun) (&XEXP (dest, 1), data);
143290075Sobrien	    (*fun) (&XEXP (dest, 2), data);
143390075Sobrien	  }
143490075Sobrien
143590075Sobrien	while (GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART)
143690075Sobrien	  dest = XEXP (dest, 0);
143790075Sobrien
1438169689Skan	if (MEM_P (dest))
143990075Sobrien	  (*fun) (&XEXP (dest, 0), data);
144090075Sobrien      }
144190075Sobrien      return;
144290075Sobrien
144390075Sobrien    default:
144490075Sobrien      /* All the other possibilities never store.  */
144590075Sobrien      (*fun) (pbody, data);
144690075Sobrien      return;
144718334Speter    }
144818334Speter}
144918334Speter
145018334Speter/* Return nonzero if X's old contents don't survive after INSN.
145118334Speter   This will be true if X is (cc0) or if X is a register and
145218334Speter   X dies in INSN or because INSN entirely sets X.
145318334Speter
1454169689Skan   "Entirely set" means set directly and not through a SUBREG, or
1455169689Skan   ZERO_EXTRACT, so no trace of the old contents remains.
145618334Speter   Likewise, REG_INC does not count.
145718334Speter
145818334Speter   REG may be a hard or pseudo reg.  Renumbering is not taken into account,
145918334Speter   but for this use that makes no difference, since regs don't overlap
146018334Speter   during their lifetimes.  Therefore, this function may be used
146118334Speter   at any time after deaths have been computed (in flow.c).
146218334Speter
146318334Speter   If REG is a hard reg that occupies multiple machine registers, this
146418334Speter   function will only return 1 if each of those registers will be replaced
146518334Speter   by INSN.  */
146618334Speter
146718334Speterint
1468132718Skandead_or_set_p (rtx insn, rtx x)
146918334Speter{
147090075Sobrien  unsigned int regno, last_regno;
147190075Sobrien  unsigned int i;
147218334Speter
147318334Speter  /* Can't use cc0_rtx below since this file is used by genattrtab.c.  */
147418334Speter  if (GET_CODE (x) == CC0)
147518334Speter    return 1;
147618334Speter
1477169689Skan  gcc_assert (REG_P (x));
147818334Speter
147918334Speter  regno = REGNO (x);
148018334Speter  last_regno = (regno >= FIRST_PSEUDO_REGISTER ? regno
1481169689Skan		: regno + hard_regno_nregs[regno][GET_MODE (x)] - 1);
148218334Speter
148318334Speter  for (i = regno; i <= last_regno; i++)
148418334Speter    if (! dead_or_set_regno_p (insn, i))
148518334Speter      return 0;
148618334Speter
148718334Speter  return 1;
148818334Speter}
148918334Speter
1490169689Skan/* Return TRUE iff DEST is a register or subreg of a register and
1491169689Skan   doesn't change the number of words of the inner register, and any
1492169689Skan   part of the register is TEST_REGNO.  */
1493169689Skan
1494169689Skanstatic bool
1495169689Skancovers_regno_no_parallel_p (rtx dest, unsigned int test_regno)
1496169689Skan{
1497169689Skan  unsigned int regno, endregno;
1498169689Skan
1499169689Skan  if (GET_CODE (dest) == SUBREG
1500169689Skan      && (((GET_MODE_SIZE (GET_MODE (dest))
1501169689Skan	    + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
1502169689Skan	  == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
1503169689Skan	       + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))
1504169689Skan    dest = SUBREG_REG (dest);
1505169689Skan
1506169689Skan  if (!REG_P (dest))
1507169689Skan    return false;
1508169689Skan
1509169689Skan  regno = REGNO (dest);
1510169689Skan  endregno = (regno >= FIRST_PSEUDO_REGISTER ? regno + 1
1511169689Skan	      : regno + hard_regno_nregs[regno][GET_MODE (dest)]);
1512169689Skan  return (test_regno >= regno && test_regno < endregno);
1513169689Skan}
1514169689Skan
1515169689Skan/* Like covers_regno_no_parallel_p, but also handles PARALLELs where
1516169689Skan   any member matches the covers_regno_no_parallel_p criteria.  */
1517169689Skan
1518169689Skanstatic bool
1519169689Skancovers_regno_p (rtx dest, unsigned int test_regno)
1520169689Skan{
1521169689Skan  if (GET_CODE (dest) == PARALLEL)
1522169689Skan    {
1523169689Skan      /* Some targets place small structures in registers for return
1524169689Skan	 values of functions, and those registers are wrapped in
1525169689Skan	 PARALLELs that we may see as the destination of a SET.  */
1526169689Skan      int i;
1527169689Skan
1528169689Skan      for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
1529169689Skan	{
1530169689Skan	  rtx inner = XEXP (XVECEXP (dest, 0, i), 0);
1531169689Skan	  if (inner != NULL_RTX
1532169689Skan	      && covers_regno_no_parallel_p (inner, test_regno))
1533169689Skan	    return true;
1534169689Skan	}
1535169689Skan
1536169689Skan      return false;
1537169689Skan    }
1538169689Skan  else
1539169689Skan    return covers_regno_no_parallel_p (dest, test_regno);
1540169689Skan}
1541169689Skan
154218334Speter/* Utility function for dead_or_set_p to check an individual register.  Also
154318334Speter   called from flow.c.  */
154418334Speter
154518334Speterint
1546132718Skandead_or_set_regno_p (rtx insn, unsigned int test_regno)
154718334Speter{
154890075Sobrien  rtx pattern;
154918334Speter
155090075Sobrien  /* See if there is a death note for something that includes TEST_REGNO.  */
155190075Sobrien  if (find_regno_note (insn, REG_DEAD, test_regno))
155290075Sobrien    return 1;
155318334Speter
1554169689Skan  if (CALL_P (insn)
155518334Speter      && find_regno_fusage (insn, CLOBBER, test_regno))
155618334Speter    return 1;
155718334Speter
155890075Sobrien  pattern = PATTERN (insn);
155990075Sobrien
156090075Sobrien  if (GET_CODE (pattern) == COND_EXEC)
156190075Sobrien    pattern = COND_EXEC_CODE (pattern);
156290075Sobrien
156390075Sobrien  if (GET_CODE (pattern) == SET)
1564169689Skan    return covers_regno_p (SET_DEST (pattern), test_regno);
156590075Sobrien  else if (GET_CODE (pattern) == PARALLEL)
156618334Speter    {
156790075Sobrien      int i;
156818334Speter
156990075Sobrien      for (i = XVECLEN (pattern, 0) - 1; i >= 0; i--)
157018334Speter	{
157190075Sobrien	  rtx body = XVECEXP (pattern, 0, i);
157218334Speter
157390075Sobrien	  if (GET_CODE (body) == COND_EXEC)
157490075Sobrien	    body = COND_EXEC_CODE (body);
157590075Sobrien
1576169689Skan	  if ((GET_CODE (body) == SET || GET_CODE (body) == CLOBBER)
1577169689Skan	      && covers_regno_p (SET_DEST (body), test_regno))
1578169689Skan	    return 1;
157918334Speter	}
158018334Speter    }
158118334Speter
158218334Speter  return 0;
158318334Speter}
158418334Speter
158518334Speter/* Return the reg-note of kind KIND in insn INSN, if there is one.
158618334Speter   If DATUM is nonzero, look for one whose datum is DATUM.  */
158718334Speter
158818334Speterrtx
1589132718Skanfind_reg_note (rtx insn, enum reg_note kind, rtx datum)
159018334Speter{
159190075Sobrien  rtx link;
159218334Speter
1593169689Skan  gcc_assert (insn);
1594169689Skan
159550397Sobrien  /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN.  */
159690075Sobrien  if (! INSN_P (insn))
159750397Sobrien    return 0;
1598169689Skan  if (datum == 0)
1599169689Skan    {
1600169689Skan      for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1601169689Skan	if (REG_NOTE_KIND (link) == kind)
1602169689Skan	  return link;
1603169689Skan      return 0;
1604169689Skan    }
160550397Sobrien
160618334Speter  for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1607169689Skan    if (REG_NOTE_KIND (link) == kind && datum == XEXP (link, 0))
160818334Speter      return link;
160918334Speter  return 0;
161018334Speter}
161118334Speter
161218334Speter/* Return the reg-note of kind KIND in insn INSN which applies to register
161318334Speter   number REGNO, if any.  Return 0 if there is no such reg-note.  Note that
161418334Speter   the REGNO of this NOTE need not be REGNO if REGNO is a hard register;
161518334Speter   it might be the case that the note overlaps REGNO.  */
161618334Speter
161718334Speterrtx
1618132718Skanfind_regno_note (rtx insn, enum reg_note kind, unsigned int regno)
161918334Speter{
162090075Sobrien  rtx link;
162118334Speter
162250397Sobrien  /* Ignore anything that is not an INSN, JUMP_INSN or CALL_INSN.  */
162390075Sobrien  if (! INSN_P (insn))
162450397Sobrien    return 0;
162550397Sobrien
162618334Speter  for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
162718334Speter    if (REG_NOTE_KIND (link) == kind
162818334Speter	/* Verify that it is a register, so that scratch and MEM won't cause a
162918334Speter	   problem here.  */
1630169689Skan	&& REG_P (XEXP (link, 0))
163118334Speter	&& REGNO (XEXP (link, 0)) <= regno
163218334Speter	&& ((REGNO (XEXP (link, 0))
163318334Speter	     + (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
1634169689Skan		: hard_regno_nregs[REGNO (XEXP (link, 0))]
1635169689Skan				  [GET_MODE (XEXP (link, 0))]))
163618334Speter	    > regno))
163718334Speter      return link;
163818334Speter  return 0;
163918334Speter}
164018334Speter
164190075Sobrien/* Return a REG_EQUIV or REG_EQUAL note if insn has only a single set and
164290075Sobrien   has such a note.  */
164390075Sobrien
164490075Sobrienrtx
1645132718Skanfind_reg_equal_equiv_note (rtx insn)
164690075Sobrien{
1647132718Skan  rtx link;
164890075Sobrien
1649132718Skan  if (!INSN_P (insn))
165090075Sobrien    return 0;
1651132718Skan  for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1652132718Skan    if (REG_NOTE_KIND (link) == REG_EQUAL
1653132718Skan	|| REG_NOTE_KIND (link) == REG_EQUIV)
1654132718Skan      {
1655132718Skan	if (single_set (insn) == 0)
1656132718Skan	  return 0;
1657132718Skan	return link;
1658132718Skan      }
1659132718Skan  return NULL;
166090075Sobrien}
166190075Sobrien
166218334Speter/* Return true if DATUM, or any overlap of DATUM, of kind CODE is found
166318334Speter   in the CALL_INSN_FUNCTION_USAGE information of INSN.  */
166418334Speter
166518334Speterint
1666132718Skanfind_reg_fusage (rtx insn, enum rtx_code code, rtx datum)
166718334Speter{
166818334Speter  /* If it's not a CALL_INSN, it can't possibly have a
166918334Speter     CALL_INSN_FUNCTION_USAGE field, so don't bother checking.  */
1670169689Skan  if (!CALL_P (insn))
167118334Speter    return 0;
167218334Speter
1673169689Skan  gcc_assert (datum);
167418334Speter
1675169689Skan  if (!REG_P (datum))
167618334Speter    {
167790075Sobrien      rtx link;
167818334Speter
167918334Speter      for (link = CALL_INSN_FUNCTION_USAGE (insn);
1680117395Skan	   link;
168118334Speter	   link = XEXP (link, 1))
1682117395Skan	if (GET_CODE (XEXP (link, 0)) == code
168390075Sobrien	    && rtx_equal_p (datum, XEXP (XEXP (link, 0), 0)))
1684117395Skan	  return 1;
168518334Speter    }
168618334Speter  else
168718334Speter    {
168890075Sobrien      unsigned int regno = REGNO (datum);
168918334Speter
169018334Speter      /* CALL_INSN_FUNCTION_USAGE information cannot contain references
169118334Speter	 to pseudo registers, so don't bother checking.  */
169218334Speter
169318334Speter      if (regno < FIRST_PSEUDO_REGISTER)
1694117395Skan	{
169590075Sobrien	  unsigned int end_regno
1696169689Skan	    = regno + hard_regno_nregs[regno][GET_MODE (datum)];
169790075Sobrien	  unsigned int i;
169818334Speter
169918334Speter	  for (i = regno; i < end_regno; i++)
170018334Speter	    if (find_regno_fusage (insn, code, i))
170118334Speter	      return 1;
1702117395Skan	}
170318334Speter    }
170418334Speter
170518334Speter  return 0;
170618334Speter}
170718334Speter
170818334Speter/* Return true if REGNO, or any overlap of REGNO, of kind CODE is found
170918334Speter   in the CALL_INSN_FUNCTION_USAGE information of INSN.  */
171018334Speter
171118334Speterint
1712132718Skanfind_regno_fusage (rtx insn, enum rtx_code code, unsigned int regno)
171318334Speter{
171490075Sobrien  rtx link;
171518334Speter
171618334Speter  /* CALL_INSN_FUNCTION_USAGE information cannot contain references
171718334Speter     to pseudo registers, so don't bother checking.  */
171818334Speter
171918334Speter  if (regno >= FIRST_PSEUDO_REGISTER
1720169689Skan      || !CALL_P (insn) )
172118334Speter    return 0;
172218334Speter
172318334Speter  for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
172490075Sobrien    {
172590075Sobrien      unsigned int regnote;
172690075Sobrien      rtx op, reg;
172718334Speter
172890075Sobrien      if (GET_CODE (op = XEXP (link, 0)) == code
1729169689Skan	  && REG_P (reg = XEXP (op, 0))
173090075Sobrien	  && (regnote = REGNO (reg)) <= regno
1731169689Skan	  && regnote + hard_regno_nregs[regnote][GET_MODE (reg)] > regno)
173290075Sobrien	return 1;
173390075Sobrien    }
173418334Speter
173518334Speter  return 0;
173618334Speter}
173796263Sobrien
173896263Sobrien/* Return true if INSN is a call to a pure function.  */
173996263Sobrien
174096263Sobrienint
1741132718Skanpure_call_p (rtx insn)
174296263Sobrien{
174396263Sobrien  rtx link;
174496263Sobrien
1745169689Skan  if (!CALL_P (insn) || ! CONST_OR_PURE_CALL_P (insn))
174696263Sobrien    return 0;
174796263Sobrien
174896263Sobrien  /* Look for the note that differentiates const and pure functions.  */
174996263Sobrien  for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
175096263Sobrien    {
175196263Sobrien      rtx u, m;
175296263Sobrien
175396263Sobrien      if (GET_CODE (u = XEXP (link, 0)) == USE
1754169689Skan	  && MEM_P (m = XEXP (u, 0)) && GET_MODE (m) == BLKmode
175596263Sobrien	  && GET_CODE (XEXP (m, 0)) == SCRATCH)
175696263Sobrien	return 1;
175796263Sobrien    }
175896263Sobrien
175996263Sobrien  return 0;
176096263Sobrien}
176118334Speter
176218334Speter/* Remove register note NOTE from the REG_NOTES of INSN.  */
176318334Speter
176418334Spetervoid
1765132718Skanremove_note (rtx insn, rtx note)
176618334Speter{
176790075Sobrien  rtx link;
176818334Speter
176990075Sobrien  if (note == NULL_RTX)
177090075Sobrien    return;
177190075Sobrien
177218334Speter  if (REG_NOTES (insn) == note)
177318334Speter    {
177418334Speter      REG_NOTES (insn) = XEXP (note, 1);
177518334Speter      return;
177618334Speter    }
177718334Speter
177818334Speter  for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
177918334Speter    if (XEXP (link, 1) == note)
178018334Speter      {
178118334Speter	XEXP (link, 1) = XEXP (note, 1);
178218334Speter	return;
178318334Speter      }
178418334Speter
1785169689Skan  gcc_unreachable ();
178618334Speter}
178752284Sobrien
178890075Sobrien/* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
178990075Sobrien   return 1 if it is found.  A simple equality test is used to determine if
179090075Sobrien   NODE matches.  */
179152284Sobrien
179290075Sobrienint
1793132718Skanin_expr_list_p (rtx listp, rtx node)
179490075Sobrien{
179590075Sobrien  rtx x;
179652284Sobrien
179790075Sobrien  for (x = listp; x; x = XEXP (x, 1))
179890075Sobrien    if (node == XEXP (x, 0))
179990075Sobrien      return 1;
180090075Sobrien
180190075Sobrien  return 0;
180290075Sobrien}
180390075Sobrien
180490075Sobrien/* Search LISTP (an EXPR_LIST) for an entry whose first operand is NODE and
180590075Sobrien   remove that entry from the list if it is found.
180690075Sobrien
180790075Sobrien   A simple equality test is used to determine if NODE matches.  */
180890075Sobrien
180952284Sobrienvoid
1810132718Skanremove_node_from_expr_list (rtx node, rtx *listp)
181152284Sobrien{
181252284Sobrien  rtx temp = *listp;
181352284Sobrien  rtx prev = NULL_RTX;
181452284Sobrien
181552284Sobrien  while (temp)
181652284Sobrien    {
181752284Sobrien      if (node == XEXP (temp, 0))
181852284Sobrien	{
181952284Sobrien	  /* Splice the node out of the list.  */
182052284Sobrien	  if (prev)
182152284Sobrien	    XEXP (prev, 1) = XEXP (temp, 1);
182252284Sobrien	  else
182352284Sobrien	    *listp = XEXP (temp, 1);
182452284Sobrien
182552284Sobrien	  return;
182652284Sobrien	}
182790075Sobrien
182890075Sobrien      prev = temp;
182952284Sobrien      temp = XEXP (temp, 1);
183052284Sobrien    }
183152284Sobrien}
183218334Speter
183318334Speter/* Nonzero if X contains any volatile instructions.  These are instructions
183418334Speter   which may cause unpredictable machine state instructions, and thus no
183518334Speter   instructions should be moved or combined across them.  This includes
183618334Speter   only volatile asms and UNSPEC_VOLATILE instructions.  */
183718334Speter
183818334Speterint
1839132718Skanvolatile_insn_p (rtx x)
184018334Speter{
184190075Sobrien  RTX_CODE code;
184218334Speter
184318334Speter  code = GET_CODE (x);
184418334Speter  switch (code)
184518334Speter    {
184618334Speter    case LABEL_REF:
184718334Speter    case SYMBOL_REF:
184818334Speter    case CONST_INT:
184918334Speter    case CONST:
185018334Speter    case CONST_DOUBLE:
185196263Sobrien    case CONST_VECTOR:
185218334Speter    case CC0:
185318334Speter    case PC:
185418334Speter    case REG:
185518334Speter    case SCRATCH:
185618334Speter    case CLOBBER:
185718334Speter    case ADDR_VEC:
185818334Speter    case ADDR_DIFF_VEC:
185918334Speter    case CALL:
186018334Speter    case MEM:
186118334Speter      return 0;
186218334Speter
186318334Speter    case UNSPEC_VOLATILE:
186418334Speter /* case TRAP_IF: This isn't clear yet.  */
186518334Speter      return 1;
186618334Speter
1867110611Skan    case ASM_INPUT:
186818334Speter    case ASM_OPERANDS:
186918334Speter      if (MEM_VOLATILE_P (x))
187018334Speter	return 1;
187150397Sobrien
187250397Sobrien    default:
187350397Sobrien      break;
187418334Speter    }
187518334Speter
187618334Speter  /* Recursively scan the operands of this expression.  */
187718334Speter
187818334Speter  {
187990075Sobrien    const char *fmt = GET_RTX_FORMAT (code);
188090075Sobrien    int i;
1881117395Skan
188218334Speter    for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
188318334Speter      {
188418334Speter	if (fmt[i] == 'e')
188518334Speter	  {
188618334Speter	    if (volatile_insn_p (XEXP (x, i)))
188718334Speter	      return 1;
188818334Speter	  }
188990075Sobrien	else if (fmt[i] == 'E')
189018334Speter	  {
189190075Sobrien	    int j;
189218334Speter	    for (j = 0; j < XVECLEN (x, i); j++)
189318334Speter	      if (volatile_insn_p (XVECEXP (x, i, j)))
189418334Speter		return 1;
189518334Speter	  }
189618334Speter      }
189718334Speter  }
189818334Speter  return 0;
189918334Speter}
190018334Speter
190118334Speter/* Nonzero if X contains any volatile memory references
190218334Speter   UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions.  */
190318334Speter
190418334Speterint
1905132718Skanvolatile_refs_p (rtx x)
190618334Speter{
190790075Sobrien  RTX_CODE code;
190818334Speter
190918334Speter  code = GET_CODE (x);
191018334Speter  switch (code)
191118334Speter    {
191218334Speter    case LABEL_REF:
191318334Speter    case SYMBOL_REF:
191418334Speter    case CONST_INT:
191518334Speter    case CONST:
191618334Speter    case CONST_DOUBLE:
191796263Sobrien    case CONST_VECTOR:
191818334Speter    case CC0:
191918334Speter    case PC:
192018334Speter    case REG:
192118334Speter    case SCRATCH:
192218334Speter    case CLOBBER:
192318334Speter    case ADDR_VEC:
192418334Speter    case ADDR_DIFF_VEC:
192518334Speter      return 0;
192618334Speter
192718334Speter    case UNSPEC_VOLATILE:
192818334Speter      return 1;
192918334Speter
193018334Speter    case MEM:
1931110611Skan    case ASM_INPUT:
193218334Speter    case ASM_OPERANDS:
193318334Speter      if (MEM_VOLATILE_P (x))
193418334Speter	return 1;
193550397Sobrien
193650397Sobrien    default:
193750397Sobrien      break;
193818334Speter    }
193918334Speter
194018334Speter  /* Recursively scan the operands of this expression.  */
194118334Speter
194218334Speter  {
194390075Sobrien    const char *fmt = GET_RTX_FORMAT (code);
194490075Sobrien    int i;
1945117395Skan
194618334Speter    for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
194718334Speter      {
194818334Speter	if (fmt[i] == 'e')
194918334Speter	  {
195018334Speter	    if (volatile_refs_p (XEXP (x, i)))
195118334Speter	      return 1;
195218334Speter	  }
195390075Sobrien	else if (fmt[i] == 'E')
195418334Speter	  {
195590075Sobrien	    int j;
195618334Speter	    for (j = 0; j < XVECLEN (x, i); j++)
195718334Speter	      if (volatile_refs_p (XVECEXP (x, i, j)))
195818334Speter		return 1;
195918334Speter	  }
196018334Speter      }
196118334Speter  }
196218334Speter  return 0;
196318334Speter}
196418334Speter
196518334Speter/* Similar to above, except that it also rejects register pre- and post-
196618334Speter   incrementing.  */
196718334Speter
196818334Speterint
1969132718Skanside_effects_p (rtx x)
197018334Speter{
197190075Sobrien  RTX_CODE code;
197218334Speter
197318334Speter  code = GET_CODE (x);
197418334Speter  switch (code)
197518334Speter    {
197618334Speter    case LABEL_REF:
197718334Speter    case SYMBOL_REF:
197818334Speter    case CONST_INT:
197918334Speter    case CONST:
198018334Speter    case CONST_DOUBLE:
198196263Sobrien    case CONST_VECTOR:
198218334Speter    case CC0:
198318334Speter    case PC:
198418334Speter    case REG:
198518334Speter    case SCRATCH:
198618334Speter    case ADDR_VEC:
198718334Speter    case ADDR_DIFF_VEC:
198818334Speter      return 0;
198918334Speter
199018334Speter    case CLOBBER:
199118334Speter      /* Reject CLOBBER with a non-VOID mode.  These are made by combine.c
199218334Speter	 when some combination can't be done.  If we see one, don't think
199318334Speter	 that we can simplify the expression.  */
199418334Speter      return (GET_MODE (x) != VOIDmode);
199518334Speter
199618334Speter    case PRE_INC:
199718334Speter    case PRE_DEC:
199818334Speter    case POST_INC:
199918334Speter    case POST_DEC:
200090075Sobrien    case PRE_MODIFY:
200190075Sobrien    case POST_MODIFY:
200218334Speter    case CALL:
200318334Speter    case UNSPEC_VOLATILE:
200418334Speter /* case TRAP_IF: This isn't clear yet.  */
200518334Speter      return 1;
200618334Speter
200718334Speter    case MEM:
2008110611Skan    case ASM_INPUT:
200918334Speter    case ASM_OPERANDS:
201018334Speter      if (MEM_VOLATILE_P (x))
201118334Speter	return 1;
201250397Sobrien
201350397Sobrien    default:
201450397Sobrien      break;
201518334Speter    }
201618334Speter
201718334Speter  /* Recursively scan the operands of this expression.  */
201818334Speter
201918334Speter  {
202090075Sobrien    const char *fmt = GET_RTX_FORMAT (code);
202190075Sobrien    int i;
2022117395Skan
202318334Speter    for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
202418334Speter      {
202518334Speter	if (fmt[i] == 'e')
202618334Speter	  {
202718334Speter	    if (side_effects_p (XEXP (x, i)))
202818334Speter	      return 1;
202918334Speter	  }
203090075Sobrien	else if (fmt[i] == 'E')
203118334Speter	  {
203290075Sobrien	    int j;
203318334Speter	    for (j = 0; j < XVECLEN (x, i); j++)
203418334Speter	      if (side_effects_p (XVECEXP (x, i, j)))
203518334Speter		return 1;
203618334Speter	  }
203718334Speter      }
203818334Speter  }
203918334Speter  return 0;
204018334Speter}
204118334Speter
2042169689Skanenum may_trap_p_flags
2043169689Skan{
2044169689Skan  MTP_UNALIGNED_MEMS = 1,
2045169689Skan  MTP_AFTER_MOVE = 2
2046169689Skan};
2047169689Skan/* Return nonzero if evaluating rtx X might cause a trap.
2048169689Skan   (FLAGS & MTP_UNALIGNED_MEMS) controls whether nonzero is returned for
2049169689Skan   unaligned memory accesses on strict alignment machines.  If
2050169689Skan   (FLAGS & AFTER_MOVE) is true, returns nonzero even in case the expression
2051169689Skan   cannot trap at its current location, but it might become trapping if moved
2052169689Skan   elsewhere.  */
205318334Speter
2054169689Skanstatic int
2055169689Skanmay_trap_p_1 (rtx x, unsigned flags)
205618334Speter{
205718334Speter  int i;
205818334Speter  enum rtx_code code;
205990075Sobrien  const char *fmt;
2060169689Skan  bool unaligned_mems = (flags & MTP_UNALIGNED_MEMS) != 0;
206118334Speter
206218334Speter  if (x == 0)
206318334Speter    return 0;
206418334Speter  code = GET_CODE (x);
206518334Speter  switch (code)
206618334Speter    {
206718334Speter      /* Handle these cases quickly.  */
206818334Speter    case CONST_INT:
206918334Speter    case CONST_DOUBLE:
207096263Sobrien    case CONST_VECTOR:
207118334Speter    case SYMBOL_REF:
207218334Speter    case LABEL_REF:
207318334Speter    case CONST:
207418334Speter    case PC:
207518334Speter    case CC0:
207618334Speter    case REG:
207718334Speter    case SCRATCH:
207818334Speter      return 0;
207918334Speter
208090075Sobrien    case ASM_INPUT:
208118334Speter    case UNSPEC_VOLATILE:
208218334Speter    case TRAP_IF:
208318334Speter      return 1;
208418334Speter
208590075Sobrien    case ASM_OPERANDS:
208690075Sobrien      return MEM_VOLATILE_P (x);
208790075Sobrien
208818334Speter      /* Memory ref can trap unless it's a static var or a stack slot.  */
208918334Speter    case MEM:
2090169689Skan      if (/* MEM_NOTRAP_P only relates to the actual position of the memory
2091169689Skan	     reference; moving it out of condition might cause its address
2092169689Skan	     become invalid.  */
2093169689Skan	  !(flags & MTP_AFTER_MOVE)
2094169689Skan	  && MEM_NOTRAP_P (x)
2095169689Skan	  && (!STRICT_ALIGNMENT || !unaligned_mems))
2096117395Skan	return 0;
2097169689Skan      return
2098169689Skan	rtx_addr_can_trap_p_1 (XEXP (x, 0), GET_MODE (x), unaligned_mems);
209918334Speter
210018334Speter      /* Division by a non-constant might trap.  */
210118334Speter    case DIV:
210218334Speter    case MOD:
210318334Speter    case UDIV:
210418334Speter    case UMOD:
2105117395Skan      if (HONOR_SNANS (GET_MODE (x)))
2106117395Skan	return 1;
2107169689Skan      if (SCALAR_FLOAT_MODE_P (GET_MODE (x)))
2108169689Skan	return flag_trapping_math;
2109169689Skan      if (!CONSTANT_P (XEXP (x, 1)) || (XEXP (x, 1) == const0_rtx))
211018334Speter	return 1;
211150397Sobrien      break;
211250397Sobrien
211318334Speter    case EXPR_LIST:
211418334Speter      /* An EXPR_LIST is used to represent a function call.  This
211518334Speter	 certainly may trap.  */
211618334Speter      return 1;
211750397Sobrien
211890075Sobrien    case GE:
211990075Sobrien    case GT:
212090075Sobrien    case LE:
212190075Sobrien    case LT:
2122169689Skan    case LTGT:
212390075Sobrien    case COMPARE:
212490075Sobrien      /* Some floating point comparisons may trap.  */
2125117395Skan      if (!flag_trapping_math)
2126117395Skan	break;
212790075Sobrien      /* ??? There is no machine independent way to check for tests that trap
212890075Sobrien	 when COMPARE is used, though many targets do make this distinction.
212990075Sobrien	 For instance, sparc uses CCFPE for compares which generate exceptions
213090075Sobrien	 and CCFP for compares which do not generate exceptions.  */
2131117395Skan      if (HONOR_NANS (GET_MODE (x)))
213290075Sobrien	return 1;
213390075Sobrien      /* But often the compare has some CC mode, so check operand
213490075Sobrien	 modes as well.  */
2135117395Skan      if (HONOR_NANS (GET_MODE (XEXP (x, 0)))
2136117395Skan	  || HONOR_NANS (GET_MODE (XEXP (x, 1))))
213790075Sobrien	return 1;
213890075Sobrien      break;
213990075Sobrien
2140117395Skan    case EQ:
2141117395Skan    case NE:
2142117395Skan      if (HONOR_SNANS (GET_MODE (x)))
2143117395Skan	return 1;
2144117395Skan      /* Often comparison is CC mode, so check operand modes.  */
2145117395Skan      if (HONOR_SNANS (GET_MODE (XEXP (x, 0)))
2146117395Skan	  || HONOR_SNANS (GET_MODE (XEXP (x, 1))))
2147117395Skan	return 1;
2148117395Skan      break;
2149117395Skan
2150117395Skan    case FIX:
2151117395Skan      /* Conversion of floating point might trap.  */
2152117395Skan      if (flag_trapping_math && HONOR_NANS (GET_MODE (XEXP (x, 0))))
2153117395Skan	return 1;
2154117395Skan      break;
2155117395Skan
215690075Sobrien    case NEG:
215790075Sobrien    case ABS:
2158169689Skan    case SUBREG:
215990075Sobrien      /* These operations don't trap even with floating point.  */
216090075Sobrien      break;
216190075Sobrien
216218334Speter    default:
216318334Speter      /* Any floating arithmetic may trap.  */
2164169689Skan      if (SCALAR_FLOAT_MODE_P (GET_MODE (x))
2165117395Skan	  && flag_trapping_math)
216618334Speter	return 1;
216718334Speter    }
216818334Speter
216918334Speter  fmt = GET_RTX_FORMAT (code);
217018334Speter  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
217118334Speter    {
217218334Speter      if (fmt[i] == 'e')
217318334Speter	{
2174169689Skan	  if (may_trap_p_1 (XEXP (x, i), flags))
217518334Speter	    return 1;
217618334Speter	}
217718334Speter      else if (fmt[i] == 'E')
217818334Speter	{
217990075Sobrien	  int j;
218018334Speter	  for (j = 0; j < XVECLEN (x, i); j++)
2181169689Skan	    if (may_trap_p_1 (XVECEXP (x, i, j), flags))
218218334Speter	      return 1;
218318334Speter	}
218418334Speter    }
218518334Speter  return 0;
218618334Speter}
2187169689Skan
2188169689Skan/* Return nonzero if evaluating rtx X might cause a trap.  */
2189169689Skan
2190169689Skanint
2191169689Skanmay_trap_p (rtx x)
2192169689Skan{
2193169689Skan  return may_trap_p_1 (x, 0);
2194169689Skan}
2195169689Skan
2196169689Skan/* Return nonzero if evaluating rtx X might cause a trap, when the expression
2197169689Skan   is moved from its current location by some optimization.  */
2198169689Skan
2199169689Skanint
2200169689Skanmay_trap_after_code_motion_p (rtx x)
2201169689Skan{
2202169689Skan  return may_trap_p_1 (x, MTP_AFTER_MOVE);
2203169689Skan}
2204169689Skan
2205169689Skan/* Same as above, but additionally return nonzero if evaluating rtx X might
2206169689Skan   cause a fault.  We define a fault for the purpose of this function as a
2207169689Skan   erroneous execution condition that cannot be encountered during the normal
2208169689Skan   execution of a valid program; the typical example is an unaligned memory
2209169689Skan   access on a strict alignment machine.  The compiler guarantees that it
2210169689Skan   doesn't generate code that will fault from a valid program, but this
2211169689Skan   guarantee doesn't mean anything for individual instructions.  Consider
2212169689Skan   the following example:
2213169689Skan
2214169689Skan      struct S { int d; union { char *cp; int *ip; }; };
2215169689Skan
2216169689Skan      int foo(struct S *s)
2217169689Skan      {
2218169689Skan	if (s->d == 1)
2219169689Skan	  return *s->ip;
2220169689Skan	else
2221169689Skan	  return *s->cp;
2222169689Skan      }
2223169689Skan
2224169689Skan   on a strict alignment machine.  In a valid program, foo will never be
2225169689Skan   invoked on a structure for which d is equal to 1 and the underlying
2226169689Skan   unique field of the union not aligned on a 4-byte boundary, but the
2227169689Skan   expression *s->ip might cause a fault if considered individually.
2228169689Skan
2229169689Skan   At the RTL level, potentially problematic expressions will almost always
2230169689Skan   verify may_trap_p; for example, the above dereference can be emitted as
2231169689Skan   (mem:SI (reg:P)) and this expression is may_trap_p for a generic register.
2232169689Skan   However, suppose that foo is inlined in a caller that causes s->cp to
2233169689Skan   point to a local character variable and guarantees that s->d is not set
2234169689Skan   to 1; foo may have been effectively translated into pseudo-RTL as:
2235169689Skan
2236169689Skan      if ((reg:SI) == 1)
2237169689Skan	(set (reg:SI) (mem:SI (%fp - 7)))
2238169689Skan      else
2239169689Skan	(set (reg:QI) (mem:QI (%fp - 7)))
2240169689Skan
2241169689Skan   Now (mem:SI (%fp - 7)) is considered as not may_trap_p since it is a
2242169689Skan   memory reference to a stack slot, but it will certainly cause a fault
2243169689Skan   on a strict alignment machine.  */
2244169689Skan
2245169689Skanint
2246169689Skanmay_trap_or_fault_p (rtx x)
2247169689Skan{
2248169689Skan  return may_trap_p_1 (x, MTP_UNALIGNED_MEMS);
2249169689Skan}
225018334Speter
225118334Speter/* Return nonzero if X contains a comparison that is not either EQ or NE,
225218334Speter   i.e., an inequality.  */
225318334Speter
225418334Speterint
2255132718Skaninequality_comparisons_p (rtx x)
225618334Speter{
225790075Sobrien  const char *fmt;
225890075Sobrien  int len, i;
225990075Sobrien  enum rtx_code code = GET_CODE (x);
226018334Speter
226118334Speter  switch (code)
226218334Speter    {
226318334Speter    case REG:
226418334Speter    case SCRATCH:
226518334Speter    case PC:
226618334Speter    case CC0:
226718334Speter    case CONST_INT:
226818334Speter    case CONST_DOUBLE:
226996263Sobrien    case CONST_VECTOR:
227018334Speter    case CONST:
227118334Speter    case LABEL_REF:
227218334Speter    case SYMBOL_REF:
227318334Speter      return 0;
227418334Speter
227518334Speter    case LT:
227618334Speter    case LTU:
227718334Speter    case GT:
227818334Speter    case GTU:
227918334Speter    case LE:
228018334Speter    case LEU:
228118334Speter    case GE:
228218334Speter    case GEU:
228318334Speter      return 1;
2284117395Skan
228550397Sobrien    default:
228650397Sobrien      break;
228718334Speter    }
228818334Speter
228918334Speter  len = GET_RTX_LENGTH (code);
229018334Speter  fmt = GET_RTX_FORMAT (code);
229118334Speter
229218334Speter  for (i = 0; i < len; i++)
229318334Speter    {
229418334Speter      if (fmt[i] == 'e')
229518334Speter	{
229618334Speter	  if (inequality_comparisons_p (XEXP (x, i)))
229718334Speter	    return 1;
229818334Speter	}
229918334Speter      else if (fmt[i] == 'E')
230018334Speter	{
230190075Sobrien	  int j;
230218334Speter	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
230318334Speter	    if (inequality_comparisons_p (XVECEXP (x, i, j)))
230418334Speter	      return 1;
230518334Speter	}
230618334Speter    }
2307117395Skan
230818334Speter  return 0;
230918334Speter}
231018334Speter
231150397Sobrien/* Replace any occurrence of FROM in X with TO.  The function does
231250397Sobrien   not enter into CONST_DOUBLE for the replace.
231318334Speter
231418334Speter   Note that copying is not done so X must not be shared unless all copies
231518334Speter   are to be modified.  */
231618334Speter
231718334Speterrtx
2318132718Skanreplace_rtx (rtx x, rtx from, rtx to)
231918334Speter{
232090075Sobrien  int i, j;
232190075Sobrien  const char *fmt;
232218334Speter
232350397Sobrien  /* The following prevents loops occurrence when we change MEM in
232490075Sobrien     CONST_DOUBLE onto the same CONST_DOUBLE.  */
232550397Sobrien  if (x != 0 && GET_CODE (x) == CONST_DOUBLE)
232650397Sobrien    return x;
232750397Sobrien
232818334Speter  if (x == from)
232918334Speter    return to;
233018334Speter
233118334Speter  /* Allow this function to make replacements in EXPR_LISTs.  */
233218334Speter  if (x == 0)
233318334Speter    return 0;
233418334Speter
233596263Sobrien  if (GET_CODE (x) == SUBREG)
233696263Sobrien    {
233796263Sobrien      rtx new = replace_rtx (SUBREG_REG (x), from, to);
233896263Sobrien
233996263Sobrien      if (GET_CODE (new) == CONST_INT)
234096263Sobrien	{
234196263Sobrien	  x = simplify_subreg (GET_MODE (x), new,
234296263Sobrien			       GET_MODE (SUBREG_REG (x)),
234396263Sobrien			       SUBREG_BYTE (x));
2344169689Skan	  gcc_assert (x);
234596263Sobrien	}
234696263Sobrien      else
234796263Sobrien	SUBREG_REG (x) = new;
234896263Sobrien
234996263Sobrien      return x;
235096263Sobrien    }
235196263Sobrien  else if (GET_CODE (x) == ZERO_EXTEND)
235296263Sobrien    {
235396263Sobrien      rtx new = replace_rtx (XEXP (x, 0), from, to);
235496263Sobrien
235596263Sobrien      if (GET_CODE (new) == CONST_INT)
235696263Sobrien	{
235796263Sobrien	  x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
235896263Sobrien					new, GET_MODE (XEXP (x, 0)));
2359169689Skan	  gcc_assert (x);
236096263Sobrien	}
236196263Sobrien      else
236296263Sobrien	XEXP (x, 0) = new;
236396263Sobrien
236496263Sobrien      return x;
236596263Sobrien    }
236696263Sobrien
236718334Speter  fmt = GET_RTX_FORMAT (GET_CODE (x));
236818334Speter  for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
236918334Speter    {
237018334Speter      if (fmt[i] == 'e')
237118334Speter	XEXP (x, i) = replace_rtx (XEXP (x, i), from, to);
237218334Speter      else if (fmt[i] == 'E')
237318334Speter	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
237418334Speter	  XVECEXP (x, i, j) = replace_rtx (XVECEXP (x, i, j), from, to);
237518334Speter    }
237618334Speter
237718334Speter  return x;
2378117395Skan}
237918334Speter
2380132718Skan/* Replace occurrences of the old label in *X with the new one.
2381132718Skan   DATA is a REPLACE_LABEL_DATA containing the old and new labels.  */
2382132718Skan
2383132718Skanint
2384132718Skanreplace_label (rtx *x, void *data)
2385132718Skan{
2386132718Skan  rtx l = *x;
2387132718Skan  rtx old_label = ((replace_label_data *) data)->r1;
2388132718Skan  rtx new_label = ((replace_label_data *) data)->r2;
2389132718Skan  bool update_label_nuses = ((replace_label_data *) data)->update_label_nuses;
2390132718Skan
2391132718Skan  if (l == NULL_RTX)
2392132718Skan    return 0;
2393132718Skan
2394132718Skan  if (GET_CODE (l) == SYMBOL_REF
2395132718Skan      && CONSTANT_POOL_ADDRESS_P (l))
2396132718Skan    {
2397132718Skan      rtx c = get_pool_constant (l);
2398132718Skan      if (rtx_referenced_p (old_label, c))
2399132718Skan	{
2400132718Skan	  rtx new_c, new_l;
2401132718Skan	  replace_label_data *d = (replace_label_data *) data;
2402132718Skan
2403132718Skan	  /* Create a copy of constant C; replace the label inside
2404132718Skan	     but do not update LABEL_NUSES because uses in constant pool
2405132718Skan	     are not counted.  */
2406132718Skan	  new_c = copy_rtx (c);
2407132718Skan	  d->update_label_nuses = false;
2408132718Skan	  for_each_rtx (&new_c, replace_label, data);
2409132718Skan	  d->update_label_nuses = update_label_nuses;
2410132718Skan
2411132718Skan	  /* Add the new constant NEW_C to constant pool and replace
2412132718Skan	     the old reference to constant by new reference.  */
2413132718Skan	  new_l = XEXP (force_const_mem (get_pool_mode (l), new_c), 0);
2414132718Skan	  *x = replace_rtx (l, l, new_l);
2415132718Skan	}
2416132718Skan      return 0;
2417132718Skan    }
2418132718Skan
2419132718Skan  /* If this is a JUMP_INSN, then we also need to fix the JUMP_LABEL
2420132718Skan     field.  This is not handled by for_each_rtx because it doesn't
2421132718Skan     handle unprinted ('0') fields.  */
2422169689Skan  if (JUMP_P (l) && JUMP_LABEL (l) == old_label)
2423132718Skan    JUMP_LABEL (l) = new_label;
2424132718Skan
2425132718Skan  if ((GET_CODE (l) == LABEL_REF
2426132718Skan       || GET_CODE (l) == INSN_LIST)
2427132718Skan      && XEXP (l, 0) == old_label)
2428132718Skan    {
2429132718Skan      XEXP (l, 0) = new_label;
2430132718Skan      if (update_label_nuses)
2431132718Skan	{
2432132718Skan	  ++LABEL_NUSES (new_label);
2433132718Skan	  --LABEL_NUSES (old_label);
2434132718Skan	}
2435132718Skan      return 0;
2436132718Skan    }
2437132718Skan
2438132718Skan  return 0;
2439132718Skan}
2440132718Skan
2441132718Skan/* When *BODY is equal to X or X is directly referenced by *BODY
2442132718Skan   return nonzero, thus FOR_EACH_RTX stops traversing and returns nonzero
2443132718Skan   too, otherwise FOR_EACH_RTX continues traversing *BODY.  */
2444132718Skan
2445132718Skanstatic int
2446132718Skanrtx_referenced_p_1 (rtx *body, void *x)
2447132718Skan{
2448132718Skan  rtx y = (rtx) x;
2449132718Skan
2450132718Skan  if (*body == NULL_RTX)
2451132718Skan    return y == NULL_RTX;
2452132718Skan
2453132718Skan  /* Return true if a label_ref *BODY refers to label Y.  */
2454169689Skan  if (GET_CODE (*body) == LABEL_REF && LABEL_P (y))
2455132718Skan    return XEXP (*body, 0) == y;
2456132718Skan
2457132718Skan  /* If *BODY is a reference to pool constant traverse the constant.  */
2458132718Skan  if (GET_CODE (*body) == SYMBOL_REF
2459132718Skan      && CONSTANT_POOL_ADDRESS_P (*body))
2460132718Skan    return rtx_referenced_p (y, get_pool_constant (*body));
2461132718Skan
2462132718Skan  /* By default, compare the RTL expressions.  */
2463132718Skan  return rtx_equal_p (*body, y);
2464132718Skan}
2465132718Skan
2466132718Skan/* Return true if X is referenced in BODY.  */
2467132718Skan
2468132718Skanint
2469132718Skanrtx_referenced_p (rtx x, rtx body)
2470132718Skan{
2471132718Skan  return for_each_rtx (&body, rtx_referenced_p_1, x);
2472132718Skan}
2473132718Skan
2474132718Skan/* If INSN is a tablejump return true and store the label (before jump table) to
2475132718Skan   *LABELP and the jump table to *TABLEP.  LABELP and TABLEP may be NULL.  */
2476132718Skan
2477132718Skanbool
2478132718Skantablejump_p (rtx insn, rtx *labelp, rtx *tablep)
2479132718Skan{
2480132718Skan  rtx label, table;
2481132718Skan
2482169689Skan  if (JUMP_P (insn)
2483132718Skan      && (label = JUMP_LABEL (insn)) != NULL_RTX
2484132718Skan      && (table = next_active_insn (label)) != NULL_RTX
2485169689Skan      && JUMP_P (table)
2486132718Skan      && (GET_CODE (PATTERN (table)) == ADDR_VEC
2487132718Skan	  || GET_CODE (PATTERN (table)) == ADDR_DIFF_VEC))
2488132718Skan    {
2489132718Skan      if (labelp)
2490132718Skan	*labelp = label;
2491132718Skan      if (tablep)
2492132718Skan	*tablep = table;
2493132718Skan      return true;
2494132718Skan    }
2495132718Skan  return false;
2496132718Skan}
2497132718Skan
249890075Sobrien/* A subroutine of computed_jump_p, return 1 if X contains a REG or MEM or
249990075Sobrien   constant that is not in the constant pool and not in the condition
250090075Sobrien   of an IF_THEN_ELSE.  */
250150397Sobrien
250250397Sobrienstatic int
2503132718Skancomputed_jump_p_1 (rtx x)
250450397Sobrien{
250550397Sobrien  enum rtx_code code = GET_CODE (x);
250650397Sobrien  int i, j;
250790075Sobrien  const char *fmt;
250850397Sobrien
250950397Sobrien  switch (code)
251050397Sobrien    {
251150397Sobrien    case LABEL_REF:
251250397Sobrien    case PC:
251350397Sobrien      return 0;
251450397Sobrien
251590075Sobrien    case CONST:
251690075Sobrien    case CONST_INT:
251790075Sobrien    case CONST_DOUBLE:
251896263Sobrien    case CONST_VECTOR:
251990075Sobrien    case SYMBOL_REF:
252050397Sobrien    case REG:
252150397Sobrien      return 1;
252250397Sobrien
252350397Sobrien    case MEM:
252450397Sobrien      return ! (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
252550397Sobrien		&& CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
252650397Sobrien
252750397Sobrien    case IF_THEN_ELSE:
252890075Sobrien      return (computed_jump_p_1 (XEXP (x, 1))
252990075Sobrien	      || computed_jump_p_1 (XEXP (x, 2)));
253050397Sobrien
253150397Sobrien    default:
253250397Sobrien      break;
253350397Sobrien    }
253450397Sobrien
253550397Sobrien  fmt = GET_RTX_FORMAT (code);
253650397Sobrien  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
253750397Sobrien    {
253850397Sobrien      if (fmt[i] == 'e'
253990075Sobrien	  && computed_jump_p_1 (XEXP (x, i)))
254050397Sobrien	return 1;
254150397Sobrien
254290075Sobrien      else if (fmt[i] == 'E')
254350397Sobrien	for (j = 0; j < XVECLEN (x, i); j++)
254490075Sobrien	  if (computed_jump_p_1 (XVECEXP (x, i, j)))
254550397Sobrien	    return 1;
254650397Sobrien    }
254750397Sobrien
254850397Sobrien  return 0;
254950397Sobrien}
255050397Sobrien
255150397Sobrien/* Return nonzero if INSN is an indirect jump (aka computed jump).
255250397Sobrien
255350397Sobrien   Tablejumps and casesi insns are not considered indirect jumps;
255490075Sobrien   we can recognize them by a (use (label_ref)).  */
255550397Sobrien
255650397Sobrienint
2557132718Skancomputed_jump_p (rtx insn)
255850397Sobrien{
255950397Sobrien  int i;
2560169689Skan  if (JUMP_P (insn))
256150397Sobrien    {
256250397Sobrien      rtx pat = PATTERN (insn);
256350397Sobrien
256490075Sobrien      if (find_reg_note (insn, REG_LABEL, NULL_RTX))
256590075Sobrien	return 0;
256690075Sobrien      else if (GET_CODE (pat) == PARALLEL)
256750397Sobrien	{
256850397Sobrien	  int len = XVECLEN (pat, 0);
256950397Sobrien	  int has_use_labelref = 0;
257050397Sobrien
257150397Sobrien	  for (i = len - 1; i >= 0; i--)
257250397Sobrien	    if (GET_CODE (XVECEXP (pat, 0, i)) == USE
257350397Sobrien		&& (GET_CODE (XEXP (XVECEXP (pat, 0, i), 0))
257450397Sobrien		    == LABEL_REF))
257550397Sobrien	      has_use_labelref = 1;
257650397Sobrien
257750397Sobrien	  if (! has_use_labelref)
257850397Sobrien	    for (i = len - 1; i >= 0; i--)
257950397Sobrien	      if (GET_CODE (XVECEXP (pat, 0, i)) == SET
258050397Sobrien		  && SET_DEST (XVECEXP (pat, 0, i)) == pc_rtx
258190075Sobrien		  && computed_jump_p_1 (SET_SRC (XVECEXP (pat, 0, i))))
258250397Sobrien		return 1;
258350397Sobrien	}
258450397Sobrien      else if (GET_CODE (pat) == SET
258550397Sobrien	       && SET_DEST (pat) == pc_rtx
258690075Sobrien	       && computed_jump_p_1 (SET_SRC (pat)))
258750397Sobrien	return 1;
258850397Sobrien    }
258950397Sobrien  return 0;
259050397Sobrien}
259152284Sobrien
2592169689Skan/* Optimized loop of for_each_rtx, trying to avoid useless recursive
2593169689Skan   calls.  Processes the subexpressions of EXP and passes them to F.  */
2594169689Skanstatic int
2595169689Skanfor_each_rtx_1 (rtx exp, int n, rtx_function f, void *data)
2596169689Skan{
2597169689Skan  int result, i, j;
2598169689Skan  const char *format = GET_RTX_FORMAT (GET_CODE (exp));
2599169689Skan  rtx *x;
2600169689Skan
2601169689Skan  for (; format[n] != '\0'; n++)
2602169689Skan    {
2603169689Skan      switch (format[n])
2604169689Skan	{
2605169689Skan	case 'e':
2606169689Skan	  /* Call F on X.  */
2607169689Skan	  x = &XEXP (exp, n);
2608169689Skan	  result = (*f) (x, data);
2609169689Skan	  if (result == -1)
2610169689Skan	    /* Do not traverse sub-expressions.  */
2611169689Skan	    continue;
2612169689Skan	  else if (result != 0)
2613169689Skan	    /* Stop the traversal.  */
2614169689Skan	    return result;
2615169689Skan
2616169689Skan	  if (*x == NULL_RTX)
2617169689Skan	    /* There are no sub-expressions.  */
2618169689Skan	    continue;
2619169689Skan
2620169689Skan	  i = non_rtx_starting_operands[GET_CODE (*x)];
2621169689Skan	  if (i >= 0)
2622169689Skan	    {
2623169689Skan	      result = for_each_rtx_1 (*x, i, f, data);
2624169689Skan	      if (result != 0)
2625169689Skan		return result;
2626169689Skan	    }
2627169689Skan	  break;
2628169689Skan
2629169689Skan	case 'V':
2630169689Skan	case 'E':
2631169689Skan	  if (XVEC (exp, n) == 0)
2632169689Skan	    continue;
2633169689Skan	  for (j = 0; j < XVECLEN (exp, n); ++j)
2634169689Skan	    {
2635169689Skan	      /* Call F on X.  */
2636169689Skan	      x = &XVECEXP (exp, n, j);
2637169689Skan	      result = (*f) (x, data);
2638169689Skan	      if (result == -1)
2639169689Skan		/* Do not traverse sub-expressions.  */
2640169689Skan		continue;
2641169689Skan	      else if (result != 0)
2642169689Skan		/* Stop the traversal.  */
2643169689Skan		return result;
2644169689Skan
2645169689Skan	      if (*x == NULL_RTX)
2646169689Skan		/* There are no sub-expressions.  */
2647169689Skan		continue;
2648169689Skan
2649169689Skan	      i = non_rtx_starting_operands[GET_CODE (*x)];
2650169689Skan	      if (i >= 0)
2651169689Skan		{
2652169689Skan		  result = for_each_rtx_1 (*x, i, f, data);
2653169689Skan		  if (result != 0)
2654169689Skan		    return result;
2655169689Skan	        }
2656169689Skan	    }
2657169689Skan	  break;
2658169689Skan
2659169689Skan	default:
2660169689Skan	  /* Nothing to do.  */
2661169689Skan	  break;
2662169689Skan	}
2663169689Skan    }
2664169689Skan
2665169689Skan  return 0;
2666169689Skan}
2667169689Skan
266852284Sobrien/* Traverse X via depth-first search, calling F for each
266952284Sobrien   sub-expression (including X itself).  F is also passed the DATA.
267052284Sobrien   If F returns -1, do not traverse sub-expressions, but continue
267152284Sobrien   traversing the rest of the tree.  If F ever returns any other
2672117395Skan   nonzero value, stop the traversal, and return the value returned
267352284Sobrien   by F.  Otherwise, return 0.  This function does not traverse inside
267452284Sobrien   tree structure that contains RTX_EXPRs, or into sub-expressions
267552284Sobrien   whose format code is `0' since it is not known whether or not those
267652284Sobrien   codes are actually RTL.
267752284Sobrien
267852284Sobrien   This routine is very general, and could (should?) be used to
267952284Sobrien   implement many of the other routines in this file.  */
268052284Sobrien
268152284Sobrienint
2682132718Skanfor_each_rtx (rtx *x, rtx_function f, void *data)
268352284Sobrien{
268452284Sobrien  int result;
268552284Sobrien  int i;
268652284Sobrien
268752284Sobrien  /* Call F on X.  */
268890075Sobrien  result = (*f) (x, data);
268952284Sobrien  if (result == -1)
269052284Sobrien    /* Do not traverse sub-expressions.  */
269152284Sobrien    return 0;
269252284Sobrien  else if (result != 0)
269352284Sobrien    /* Stop the traversal.  */
269452284Sobrien    return result;
269552284Sobrien
269652284Sobrien  if (*x == NULL_RTX)
269752284Sobrien    /* There are no sub-expressions.  */
269852284Sobrien    return 0;
269952284Sobrien
2700169689Skan  i = non_rtx_starting_operands[GET_CODE (*x)];
2701169689Skan  if (i < 0)
2702169689Skan    return 0;
270352284Sobrien
2704169689Skan  return for_each_rtx_1 (*x, i, f, data);
2705169689Skan}
270652284Sobrien
270752284Sobrien
270852284Sobrien/* Searches X for any reference to REGNO, returning the rtx of the
270952284Sobrien   reference found if any.  Otherwise, returns NULL_RTX.  */
271052284Sobrien
271152284Sobrienrtx
2712132718Skanregno_use_in (unsigned int regno, rtx x)
271352284Sobrien{
271490075Sobrien  const char *fmt;
271552284Sobrien  int i, j;
271652284Sobrien  rtx tem;
271752284Sobrien
2718169689Skan  if (REG_P (x) && REGNO (x) == regno)
271952284Sobrien    return x;
272052284Sobrien
272152284Sobrien  fmt = GET_RTX_FORMAT (GET_CODE (x));
272252284Sobrien  for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
272352284Sobrien    {
272452284Sobrien      if (fmt[i] == 'e')
272552284Sobrien	{
272652284Sobrien	  if ((tem = regno_use_in (regno, XEXP (x, i))))
272752284Sobrien	    return tem;
272852284Sobrien	}
272952284Sobrien      else if (fmt[i] == 'E')
273052284Sobrien	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
273152284Sobrien	  if ((tem = regno_use_in (regno , XVECEXP (x, i, j))))
273252284Sobrien	    return tem;
273352284Sobrien    }
273452284Sobrien
273552284Sobrien  return NULL_RTX;
273652284Sobrien}
273752284Sobrien
273890075Sobrien/* Return a value indicating whether OP, an operand of a commutative
273990075Sobrien   operation, is preferred as the first or second operand.  The higher
274090075Sobrien   the value, the stronger the preference for being the first operand.
274190075Sobrien   We use negative values to indicate a preference for the first operand
274290075Sobrien   and positive values for the second operand.  */
274352284Sobrien
274490075Sobrienint
2745132718Skancommutative_operand_precedence (rtx op)
274690075Sobrien{
2747169689Skan  enum rtx_code code = GET_CODE (op);
2748169689Skan
274990075Sobrien  /* Constants always come the second operand.  Prefer "nice" constants.  */
2750169689Skan  if (code == CONST_INT)
2751169689Skan    return -7;
2752169689Skan  if (code == CONST_DOUBLE)
2753169689Skan    return -6;
2754169689Skan  op = avoid_constant_pool_reference (op);
2755169689Skan  code = GET_CODE (op);
275690075Sobrien
2757169689Skan  switch (GET_RTX_CLASS (code))
2758169689Skan    {
2759169689Skan    case RTX_CONST_OBJ:
2760169689Skan      if (code == CONST_INT)
2761169689Skan        return -5;
2762169689Skan      if (code == CONST_DOUBLE)
2763169689Skan        return -4;
2764169689Skan      return -3;
276590075Sobrien
2766169689Skan    case RTX_EXTRA:
2767169689Skan      /* SUBREGs of objects should come second.  */
2768169689Skan      if (code == SUBREG && OBJECT_P (SUBREG_REG (op)))
2769169689Skan        return -2;
277090075Sobrien
2771169689Skan      if (!CONSTANT_P (op))
2772169689Skan        return 0;
2773169689Skan      else
2774169689Skan	/* As for RTX_CONST_OBJ.  */
2775169689Skan	return -3;
2776169689Skan
2777169689Skan    case RTX_OBJ:
2778169689Skan      /* Complex expressions should be the first, so decrease priority
2779169689Skan         of objects.  */
2780169689Skan      return -1;
2781169689Skan
2782169689Skan    case RTX_COMM_ARITH:
2783169689Skan      /* Prefer operands that are themselves commutative to be first.
2784169689Skan         This helps to make things linear.  In particular,
2785169689Skan         (and (and (reg) (reg)) (not (reg))) is canonical.  */
2786169689Skan      return 4;
2787169689Skan
2788169689Skan    case RTX_BIN_ARITH:
2789169689Skan      /* If only one operand is a binary expression, it will be the first
2790169689Skan         operand.  In particular,  (plus (minus (reg) (reg)) (neg (reg)))
2791169689Skan         is canonical, although it will usually be further simplified.  */
2792169689Skan      return 2;
2793169689Skan
2794169689Skan    case RTX_UNARY:
2795169689Skan      /* Then prefer NEG and NOT.  */
2796169689Skan      if (code == NEG || code == NOT)
2797169689Skan        return 1;
2798169689Skan
2799169689Skan    default:
2800169689Skan      return 0;
2801169689Skan    }
280290075Sobrien}
280390075Sobrien
280490075Sobrien/* Return 1 iff it is necessary to swap operands of commutative operation
280590075Sobrien   in order to canonicalize expression.  */
280690075Sobrien
280790075Sobrienint
2808132718Skanswap_commutative_operands_p (rtx x, rtx y)
280990075Sobrien{
281090075Sobrien  return (commutative_operand_precedence (x)
281190075Sobrien	  < commutative_operand_precedence (y));
281290075Sobrien}
281390075Sobrien
281452284Sobrien/* Return 1 if X is an autoincrement side effect and the register is
281552284Sobrien   not the stack pointer.  */
281652284Sobrienint
2817132718Skanauto_inc_p (rtx x)
281852284Sobrien{
281952284Sobrien  switch (GET_CODE (x))
282052284Sobrien    {
282152284Sobrien    case PRE_INC:
282252284Sobrien    case POST_INC:
282352284Sobrien    case PRE_DEC:
282452284Sobrien    case POST_DEC:
282552284Sobrien    case PRE_MODIFY:
282652284Sobrien    case POST_MODIFY:
282752284Sobrien      /* There are no REG_INC notes for SP.  */
282852284Sobrien      if (XEXP (x, 0) != stack_pointer_rtx)
282952284Sobrien	return 1;
283052284Sobrien    default:
283152284Sobrien      break;
283252284Sobrien    }
283352284Sobrien  return 0;
283452284Sobrien}
283570635Sobrien
2836132718Skan/* Return nonzero if IN contains a piece of rtl that has the address LOC.  */
283790075Sobrienint
2838132718Skanloc_mentioned_in_p (rtx *loc, rtx in)
283990075Sobrien{
284090075Sobrien  enum rtx_code code = GET_CODE (in);
284190075Sobrien  const char *fmt = GET_RTX_FORMAT (code);
284290075Sobrien  int i, j;
284390075Sobrien
284490075Sobrien  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
284590075Sobrien    {
2846169689Skan      if (loc == &in->u.fld[i].rt_rtx)
284790075Sobrien	return 1;
284890075Sobrien      if (fmt[i] == 'e')
284990075Sobrien	{
285090075Sobrien	  if (loc_mentioned_in_p (loc, XEXP (in, i)))
285190075Sobrien	    return 1;
285290075Sobrien	}
285390075Sobrien      else if (fmt[i] == 'E')
285490075Sobrien	for (j = XVECLEN (in, i) - 1; j >= 0; j--)
285590075Sobrien	  if (loc_mentioned_in_p (loc, XVECEXP (in, i, j)))
285690075Sobrien	    return 1;
285790075Sobrien    }
285890075Sobrien  return 0;
285990075Sobrien}
286090075Sobrien
2861169689Skan/* Helper function for subreg_lsb.  Given a subreg's OUTER_MODE, INNER_MODE,
2862169689Skan   and SUBREG_BYTE, return the bit offset where the subreg begins
2863169689Skan   (counting from the least significant bit of the operand).  */
286490075Sobrien
286590075Sobrienunsigned int
2866169689Skansubreg_lsb_1 (enum machine_mode outer_mode,
2867169689Skan	      enum machine_mode inner_mode,
2868169689Skan	      unsigned int subreg_byte)
286990075Sobrien{
287090075Sobrien  unsigned int bitpos;
287190075Sobrien  unsigned int byte;
287290075Sobrien  unsigned int word;
287390075Sobrien
287490075Sobrien  /* A paradoxical subreg begins at bit position 0.  */
2875169689Skan  if (GET_MODE_BITSIZE (outer_mode) > GET_MODE_BITSIZE (inner_mode))
287690075Sobrien    return 0;
287790075Sobrien
287890075Sobrien  if (WORDS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
287990075Sobrien    /* If the subreg crosses a word boundary ensure that
288090075Sobrien       it also begins and ends on a word boundary.  */
2881169689Skan    gcc_assert (!((subreg_byte % UNITS_PER_WORD
2882169689Skan		  + GET_MODE_SIZE (outer_mode)) > UNITS_PER_WORD
2883169689Skan		  && (subreg_byte % UNITS_PER_WORD
2884169689Skan		      || GET_MODE_SIZE (outer_mode) % UNITS_PER_WORD)));
288590075Sobrien
288690075Sobrien  if (WORDS_BIG_ENDIAN)
288790075Sobrien    word = (GET_MODE_SIZE (inner_mode)
2888169689Skan	    - (subreg_byte + GET_MODE_SIZE (outer_mode))) / UNITS_PER_WORD;
288990075Sobrien  else
2890169689Skan    word = subreg_byte / UNITS_PER_WORD;
289190075Sobrien  bitpos = word * BITS_PER_WORD;
289290075Sobrien
289390075Sobrien  if (BYTES_BIG_ENDIAN)
289490075Sobrien    byte = (GET_MODE_SIZE (inner_mode)
2895169689Skan	    - (subreg_byte + GET_MODE_SIZE (outer_mode))) % UNITS_PER_WORD;
289690075Sobrien  else
2897169689Skan    byte = subreg_byte % UNITS_PER_WORD;
289890075Sobrien  bitpos += byte * BITS_PER_UNIT;
289990075Sobrien
290090075Sobrien  return bitpos;
290190075Sobrien}
290290075Sobrien
2903169689Skan/* Given a subreg X, return the bit offset where the subreg begins
2904169689Skan   (counting from the least significant bit of the reg).  */
2905169689Skan
2906169689Skanunsigned int
2907169689Skansubreg_lsb (rtx x)
2908169689Skan{
2909169689Skan  return subreg_lsb_1 (GET_MODE (x), GET_MODE (SUBREG_REG (x)),
2910169689Skan		       SUBREG_BYTE (x));
2911169689Skan}
2912169689Skan
291390075Sobrien/* This function returns the regno offset of a subreg expression.
291490075Sobrien   xregno - A regno of an inner hard subreg_reg (or what will become one).
291590075Sobrien   xmode  - The mode of xregno.
291690075Sobrien   offset - The byte offset.
291790075Sobrien   ymode  - The mode of a top level SUBREG (or what may become one).
291890075Sobrien   RETURN - The regno offset which would be used.  */
291990075Sobrienunsigned int
2920132718Skansubreg_regno_offset (unsigned int xregno, enum machine_mode xmode,
2921132718Skan		     unsigned int offset, enum machine_mode ymode)
292290075Sobrien{
292390075Sobrien  int nregs_xmode, nregs_ymode;
292490075Sobrien  int mode_multiple, nregs_multiple;
292590075Sobrien  int y_offset;
292690075Sobrien
2927169689Skan  gcc_assert (xregno < FIRST_PSEUDO_REGISTER);
292890075Sobrien
2929169689Skan  /* Adjust nregs_xmode to allow for 'holes'.  */
2930169689Skan  if (HARD_REGNO_NREGS_HAS_PADDING (xregno, xmode))
2931169689Skan    nregs_xmode = HARD_REGNO_NREGS_WITH_PADDING (xregno, xmode);
2932169689Skan  else
2933169689Skan    nregs_xmode = hard_regno_nregs[xregno][xmode];
2934169689Skan
2935169689Skan  nregs_ymode = hard_regno_nregs[xregno][ymode];
2936117395Skan
2937117395Skan  /* If this is a big endian paradoxical subreg, which uses more actual
2938117395Skan     hard registers than the original register, we must return a negative
2939117395Skan     offset so that we find the proper highpart of the register.  */
2940117395Skan  if (offset == 0
2941117395Skan      && nregs_ymode > nregs_xmode
2942117395Skan      && (GET_MODE_SIZE (ymode) > UNITS_PER_WORD
2943117395Skan	  ? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN))
2944117395Skan    return nregs_xmode - nregs_ymode;
2945117395Skan
294690075Sobrien  if (offset == 0 || nregs_xmode == nregs_ymode)
294790075Sobrien    return 0;
2948117395Skan
2949169689Skan  /* Size of ymode must not be greater than the size of xmode.  */
295090075Sobrien  mode_multiple = GET_MODE_SIZE (xmode) / GET_MODE_SIZE (ymode);
2951169689Skan  gcc_assert (mode_multiple != 0);
295290075Sobrien
295390075Sobrien  y_offset = offset / GET_MODE_SIZE (ymode);
295490075Sobrien  nregs_multiple =  nregs_xmode / nregs_ymode;
295590075Sobrien  return (y_offset / (mode_multiple / nregs_multiple)) * nregs_ymode;
295690075Sobrien}
295790075Sobrien
2958117395Skan/* This function returns true when the offset is representable via
2959117395Skan   subreg_offset in the given regno.
2960117395Skan   xregno - A regno of an inner hard subreg_reg (or what will become one).
2961117395Skan   xmode  - The mode of xregno.
2962117395Skan   offset - The byte offset.
2963117395Skan   ymode  - The mode of a top level SUBREG (or what may become one).
2964169689Skan   RETURN - Whether the offset is representable.  */
2965117395Skanbool
2966132718Skansubreg_offset_representable_p (unsigned int xregno, enum machine_mode xmode,
2967132718Skan			       unsigned int offset, enum machine_mode ymode)
2968117395Skan{
2969117395Skan  int nregs_xmode, nregs_ymode;
2970117395Skan  int mode_multiple, nregs_multiple;
2971117395Skan  int y_offset;
2972169689Skan  int regsize_xmode, regsize_ymode;
2973117395Skan
2974169689Skan  gcc_assert (xregno < FIRST_PSEUDO_REGISTER);
2975117395Skan
2976169689Skan  /* If there are holes in a non-scalar mode in registers, we expect
2977169689Skan     that it is made up of its units concatenated together.  */
2978169689Skan  if (HARD_REGNO_NREGS_HAS_PADDING (xregno, xmode))
2979169689Skan    {
2980169689Skan      enum machine_mode xmode_unit;
2981117395Skan
2982169689Skan      nregs_xmode = HARD_REGNO_NREGS_WITH_PADDING (xregno, xmode);
2983169689Skan      if (GET_MODE_INNER (xmode) == VOIDmode)
2984169689Skan	xmode_unit = xmode;
2985169689Skan      else
2986169689Skan	xmode_unit = GET_MODE_INNER (xmode);
2987169689Skan      gcc_assert (HARD_REGNO_NREGS_HAS_PADDING (xregno, xmode_unit));
2988169689Skan      gcc_assert (nregs_xmode
2989169689Skan		  == (GET_MODE_NUNITS (xmode)
2990169689Skan		      * HARD_REGNO_NREGS_WITH_PADDING (xregno, xmode_unit)));
2991169689Skan      gcc_assert (hard_regno_nregs[xregno][xmode]
2992169689Skan		  == (hard_regno_nregs[xregno][xmode_unit]
2993169689Skan		      * GET_MODE_NUNITS (xmode)));
2994169689Skan
2995169689Skan      /* You can only ask for a SUBREG of a value with holes in the middle
2996169689Skan	 if you don't cross the holes.  (Such a SUBREG should be done by
2997169689Skan	 picking a different register class, or doing it in memory if
2998169689Skan	 necessary.)  An example of a value with holes is XCmode on 32-bit
2999169689Skan	 x86 with -m128bit-long-double; it's represented in 6 32-bit registers,
3000169689Skan	 3 for each part, but in memory it's two 128-bit parts.
3001169689Skan	 Padding is assumed to be at the end (not necessarily the 'high part')
3002169689Skan	 of each unit.  */
3003169689Skan      if ((offset / GET_MODE_SIZE (xmode_unit) + 1
3004169689Skan	   < GET_MODE_NUNITS (xmode))
3005169689Skan	  && (offset / GET_MODE_SIZE (xmode_unit)
3006169689Skan	      != ((offset + GET_MODE_SIZE (ymode) - 1)
3007169689Skan		  / GET_MODE_SIZE (xmode_unit))))
3008169689Skan	return false;
3009169689Skan    }
3010169689Skan  else
3011169689Skan    nregs_xmode = hard_regno_nregs[xregno][xmode];
3012169689Skan
3013169689Skan  nregs_ymode = hard_regno_nregs[xregno][ymode];
3014169689Skan
3015169689Skan  /* Paradoxical subregs are otherwise valid.  */
3016117395Skan  if (offset == 0
3017117395Skan      && nregs_ymode > nregs_xmode
3018117395Skan      && (GET_MODE_SIZE (ymode) > UNITS_PER_WORD
3019117395Skan	  ? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN))
3020117395Skan    return true;
3021117395Skan
3022169689Skan  /* If registers store different numbers of bits in the different
3023169689Skan     modes, we cannot generally form this subreg.  */
3024169689Skan  regsize_xmode = GET_MODE_SIZE (xmode) / nregs_xmode;
3025169689Skan  regsize_ymode = GET_MODE_SIZE (ymode) / nregs_ymode;
3026169689Skan  if (regsize_xmode > regsize_ymode && nregs_ymode > 1)
3027169689Skan    return false;
3028169689Skan  if (regsize_ymode > regsize_xmode && nregs_xmode > 1)
3029169689Skan    return false;
3030169689Skan
3031169689Skan  /* Lowpart subregs are otherwise valid.  */
3032117395Skan  if (offset == subreg_lowpart_offset (ymode, xmode))
3033117395Skan    return true;
3034117395Skan
3035169689Skan  /* This should always pass, otherwise we don't know how to verify
3036169689Skan     the constraint.  These conditions may be relaxed but
3037169689Skan     subreg_regno_offset would need to be redesigned.  */
3038169689Skan  gcc_assert ((GET_MODE_SIZE (xmode) % GET_MODE_SIZE (ymode)) == 0);
3039169689Skan  gcc_assert ((nregs_xmode % nregs_ymode) == 0);
3040117395Skan
3041132718Skan  /* The XMODE value can be seen as a vector of NREGS_XMODE
3042132718Skan     values.  The subreg must represent a lowpart of given field.
3043117395Skan     Compute what field it is.  */
3044132718Skan  offset -= subreg_lowpart_offset (ymode,
3045132718Skan				   mode_for_size (GET_MODE_BITSIZE (xmode)
3046132718Skan						  / nregs_xmode,
3047117395Skan						  MODE_INT, 0));
3048117395Skan
3049169689Skan  /* Size of ymode must not be greater than the size of xmode.  */
3050117395Skan  mode_multiple = GET_MODE_SIZE (xmode) / GET_MODE_SIZE (ymode);
3051169689Skan  gcc_assert (mode_multiple != 0);
3052117395Skan
3053117395Skan  y_offset = offset / GET_MODE_SIZE (ymode);
3054117395Skan  nregs_multiple =  nregs_xmode / nregs_ymode;
3055169689Skan
3056169689Skan  gcc_assert ((offset % GET_MODE_SIZE (ymode)) == 0);
3057169689Skan  gcc_assert ((mode_multiple % nregs_multiple) == 0);
3058169689Skan
3059117395Skan  return (!(y_offset % (mode_multiple / nregs_multiple)));
3060117395Skan}
3061117395Skan
306290075Sobrien/* Return the final regno that a subreg expression refers to.  */
3063117395Skanunsigned int
3064132718Skansubreg_regno (rtx x)
306590075Sobrien{
306690075Sobrien  unsigned int ret;
306790075Sobrien  rtx subreg = SUBREG_REG (x);
306890075Sobrien  int regno = REGNO (subreg);
306990075Sobrien
3070117395Skan  ret = regno + subreg_regno_offset (regno,
3071117395Skan				     GET_MODE (subreg),
307290075Sobrien				     SUBREG_BYTE (x),
307390075Sobrien				     GET_MODE (x));
307490075Sobrien  return ret;
307590075Sobrien
307690075Sobrien}
307790075Sobrienstruct parms_set_data
307890075Sobrien{
307990075Sobrien  int nregs;
308090075Sobrien  HARD_REG_SET regs;
308190075Sobrien};
308290075Sobrien
308390075Sobrien/* Helper function for noticing stores to parameter registers.  */
308490075Sobrienstatic void
3085132718Skanparms_set (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
308690075Sobrien{
308790075Sobrien  struct parms_set_data *d = data;
308890075Sobrien  if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER
308990075Sobrien      && TEST_HARD_REG_BIT (d->regs, REGNO (x)))
309090075Sobrien    {
309190075Sobrien      CLEAR_HARD_REG_BIT (d->regs, REGNO (x));
309290075Sobrien      d->nregs--;
309390075Sobrien    }
309490075Sobrien}
309590075Sobrien
3096117395Skan/* Look backward for first parameter to be loaded.
3097169689Skan   Note that loads of all parameters will not necessarily be
3098169689Skan   found if CSE has eliminated some of them (e.g., an argument
3099169689Skan   to the outer function is passed down as a parameter).
310090075Sobrien   Do not skip BOUNDARY.  */
310190075Sobrienrtx
3102132718Skanfind_first_parameter_load (rtx call_insn, rtx boundary)
310390075Sobrien{
310490075Sobrien  struct parms_set_data parm;
3105169689Skan  rtx p, before, first_set;
310690075Sobrien
310790075Sobrien  /* Since different machines initialize their parameter registers
310890075Sobrien     in different orders, assume nothing.  Collect the set of all
310990075Sobrien     parameter registers.  */
311090075Sobrien  CLEAR_HARD_REG_SET (parm.regs);
311190075Sobrien  parm.nregs = 0;
311290075Sobrien  for (p = CALL_INSN_FUNCTION_USAGE (call_insn); p; p = XEXP (p, 1))
311390075Sobrien    if (GET_CODE (XEXP (p, 0)) == USE
3114169689Skan	&& REG_P (XEXP (XEXP (p, 0), 0)))
311590075Sobrien      {
3116169689Skan	gcc_assert (REGNO (XEXP (XEXP (p, 0), 0)) < FIRST_PSEUDO_REGISTER);
311790075Sobrien
311890075Sobrien	/* We only care about registers which can hold function
311990075Sobrien	   arguments.  */
312090075Sobrien	if (!FUNCTION_ARG_REGNO_P (REGNO (XEXP (XEXP (p, 0), 0))))
312190075Sobrien	  continue;
312290075Sobrien
312390075Sobrien	SET_HARD_REG_BIT (parm.regs, REGNO (XEXP (XEXP (p, 0), 0)));
312490075Sobrien	parm.nregs++;
312590075Sobrien      }
312690075Sobrien  before = call_insn;
3127169689Skan  first_set = call_insn;
312890075Sobrien
312990075Sobrien  /* Search backward for the first set of a register in this set.  */
313090075Sobrien  while (parm.nregs && before != boundary)
313190075Sobrien    {
313290075Sobrien      before = PREV_INSN (before);
313390075Sobrien
313490075Sobrien      /* It is possible that some loads got CSEed from one call to
313590075Sobrien         another.  Stop in that case.  */
3136169689Skan      if (CALL_P (before))
313790075Sobrien	break;
313890075Sobrien
313990075Sobrien      /* Our caller needs either ensure that we will find all sets
314090075Sobrien         (in case code has not been optimized yet), or take care
314190075Sobrien         for possible labels in a way by setting boundary to preceding
314290075Sobrien         CODE_LABEL.  */
3143169689Skan      if (LABEL_P (before))
314490075Sobrien	{
3145169689Skan	  gcc_assert (before == boundary);
314690075Sobrien	  break;
314790075Sobrien	}
314890075Sobrien
314990075Sobrien      if (INSN_P (before))
3150169689Skan	{
3151169689Skan	  int nregs_old = parm.nregs;
3152169689Skan	  note_stores (PATTERN (before), parms_set, &parm);
3153169689Skan	  /* If we found something that did not set a parameter reg,
3154169689Skan	     we're done.  Do not keep going, as that might result
3155169689Skan	     in hoisting an insn before the setting of a pseudo
3156169689Skan	     that is used by the hoisted insn. */
3157169689Skan	  if (nregs_old != parm.nregs)
3158169689Skan	    first_set = before;
3159169689Skan	  else
3160169689Skan	    break;
3161169689Skan	}
316290075Sobrien    }
3163169689Skan  return first_set;
316490075Sobrien}
3165117395Skan
3166132718Skan/* Return true if we should avoid inserting code between INSN and preceding
3167117395Skan   call instruction.  */
3168117395Skan
3169117395Skanbool
3170132718Skankeep_with_call_p (rtx insn)
3171117395Skan{
3172117395Skan  rtx set;
3173117395Skan
3174117395Skan  if (INSN_P (insn) && (set = single_set (insn)) != NULL)
3175117395Skan    {
3176169689Skan      if (REG_P (SET_DEST (set))
3177117395Skan	  && REGNO (SET_DEST (set)) < FIRST_PSEUDO_REGISTER
3178117395Skan	  && fixed_regs[REGNO (SET_DEST (set))]
3179117395Skan	  && general_operand (SET_SRC (set), VOIDmode))
3180117395Skan	return true;
3181169689Skan      if (REG_P (SET_SRC (set))
3182117395Skan	  && FUNCTION_VALUE_REGNO_P (REGNO (SET_SRC (set)))
3183169689Skan	  && REG_P (SET_DEST (set))
3184117395Skan	  && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER)
3185117395Skan	return true;
3186117395Skan      /* There may be a stack pop just after the call and before the store
3187117395Skan	 of the return register.  Search for the actual store when deciding
3188117395Skan	 if we can break or not.  */
3189117395Skan      if (SET_DEST (set) == stack_pointer_rtx)
3190117395Skan	{
3191117395Skan	  rtx i2 = next_nonnote_insn (insn);
3192117395Skan	  if (i2 && keep_with_call_p (i2))
3193117395Skan	    return true;
3194117395Skan	}
3195117395Skan    }
3196117395Skan  return false;
3197117395Skan}
3198117395Skan
3199169689Skan/* Return true if LABEL is a target of JUMP_INSN.  This applies only
3200169689Skan   to non-complex jumps.  That is, direct unconditional, conditional,
3201169689Skan   and tablejumps, but not computed jumps or returns.  It also does
3202169689Skan   not apply to the fallthru case of a conditional jump.  */
3203117395Skan
3204169689Skanbool
3205169689Skanlabel_is_jump_target_p (rtx label, rtx jump_insn)
3206117395Skan{
3207169689Skan  rtx tmp = JUMP_LABEL (jump_insn);
3208117395Skan
3209169689Skan  if (label == tmp)
3210117395Skan    return true;
3211117395Skan
3212169689Skan  if (tablejump_p (jump_insn, NULL, &tmp))
3213169689Skan    {
3214169689Skan      rtvec vec = XVEC (PATTERN (tmp),
3215169689Skan			GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC);
3216169689Skan      int i, veclen = GET_NUM_ELEM (vec);
3217117395Skan
3218169689Skan      for (i = 0; i < veclen; ++i)
3219169689Skan	if (XEXP (RTVEC_ELT (vec, i), 0) == label)
3220169689Skan	  return true;
3221169689Skan    }
3222169689Skan
3223169689Skan  return false;
3224169689Skan}
3225169689Skan
3226169689Skan
3227169689Skan/* Return an estimate of the cost of computing rtx X.
3228169689Skan   One use is in cse, to decide which expression to keep in the hash table.
3229169689Skan   Another is in rtl generation, to pick the cheapest way to multiply.
3230169689Skan   Other uses like the latter are expected in the future.  */
3231169689Skan
3232169689Skanint
3233169689Skanrtx_cost (rtx x, enum rtx_code outer_code ATTRIBUTE_UNUSED)
3234169689Skan{
3235169689Skan  int i, j;
3236169689Skan  enum rtx_code code;
3237169689Skan  const char *fmt;
3238169689Skan  int total;
3239169689Skan
3240169689Skan  if (x == 0)
3241169689Skan    return 0;
3242169689Skan
3243169689Skan  /* Compute the default costs of certain things.
3244169689Skan     Note that targetm.rtx_costs can override the defaults.  */
3245169689Skan
3246169689Skan  code = GET_CODE (x);
3247169689Skan  switch (code)
3248117395Skan    {
3249169689Skan    case MULT:
3250169689Skan      total = COSTS_N_INSNS (5);
3251169689Skan      break;
3252169689Skan    case DIV:
3253169689Skan    case UDIV:
3254169689Skan    case MOD:
3255169689Skan    case UMOD:
3256169689Skan      total = COSTS_N_INSNS (7);
3257169689Skan      break;
3258169689Skan    case USE:
3259169689Skan      /* Used in combine.c as a marker.  */
3260169689Skan      total = 0;
3261169689Skan      break;
3262169689Skan    default:
3263169689Skan      total = COSTS_N_INSNS (1);
3264117395Skan    }
3265117395Skan
3266169689Skan  switch (code)
3267169689Skan    {
3268169689Skan    case REG:
3269169689Skan      return 0;
3270117395Skan
3271169689Skan    case SUBREG:
3272169689Skan      total = 0;
3273169689Skan      /* If we can't tie these modes, make this expensive.  The larger
3274169689Skan	 the mode, the more expensive it is.  */
3275169689Skan      if (! MODES_TIEABLE_P (GET_MODE (x), GET_MODE (SUBREG_REG (x))))
3276169689Skan	return COSTS_N_INSNS (2
3277169689Skan			      + GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD);
3278169689Skan      break;
3279117395Skan
3280169689Skan    default:
3281169689Skan      if (targetm.rtx_costs (x, code, outer_code, &total))
3282169689Skan	return total;
3283169689Skan      break;
3284169689Skan    }
3285117395Skan
3286169689Skan  /* Sum the costs of the sub-rtx's, plus cost of this operation,
3287169689Skan     which is already in total.  */
3288169689Skan
3289169689Skan  fmt = GET_RTX_FORMAT (code);
3290169689Skan  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3291169689Skan    if (fmt[i] == 'e')
3292169689Skan      total += rtx_cost (XEXP (x, i), code);
3293169689Skan    else if (fmt[i] == 'E')
3294169689Skan      for (j = 0; j < XVECLEN (x, i); j++)
3295169689Skan	total += rtx_cost (XVECEXP (x, i, j), code);
3296169689Skan
3297169689Skan  return total;
3298169689Skan}
3299169689Skan
3300169689Skan/* Return cost of address expression X.
3301169689Skan   Expect that X is properly formed address reference.  */
3302169689Skan
3303169689Skanint
3304169689Skanaddress_cost (rtx x, enum machine_mode mode)
3305169689Skan{
3306169689Skan  /* We may be asked for cost of various unusual addresses, such as operands
3307169689Skan     of push instruction.  It is not worthwhile to complicate writing
3308169689Skan     of the target hook by such cases.  */
3309169689Skan
3310169689Skan  if (!memory_address_p (mode, x))
3311169689Skan    return 1000;
3312169689Skan
3313169689Skan  return targetm.address_cost (x);
3314169689Skan}
3315169689Skan
3316169689Skan/* If the target doesn't override, compute the cost as with arithmetic.  */
3317169689Skan
3318169689Skanint
3319169689Skandefault_address_cost (rtx x)
3320169689Skan{
3321169689Skan  return rtx_cost (x, MEM);
3322169689Skan}
3323169689Skan
3324169689Skan
3325169689Skanunsigned HOST_WIDE_INT
3326169689Skannonzero_bits (rtx x, enum machine_mode mode)
3327169689Skan{
3328169689Skan  return cached_nonzero_bits (x, mode, NULL_RTX, VOIDmode, 0);
3329169689Skan}
3330169689Skan
3331169689Skanunsigned int
3332169689Skannum_sign_bit_copies (rtx x, enum machine_mode mode)
3333169689Skan{
3334169689Skan  return cached_num_sign_bit_copies (x, mode, NULL_RTX, VOIDmode, 0);
3335169689Skan}
3336169689Skan
3337169689Skan/* The function cached_nonzero_bits is a wrapper around nonzero_bits1.
3338169689Skan   It avoids exponential behavior in nonzero_bits1 when X has
3339169689Skan   identical subexpressions on the first or the second level.  */
3340169689Skan
3341169689Skanstatic unsigned HOST_WIDE_INT
3342169689Skancached_nonzero_bits (rtx x, enum machine_mode mode, rtx known_x,
3343169689Skan		     enum machine_mode known_mode,
3344169689Skan		     unsigned HOST_WIDE_INT known_ret)
3345169689Skan{
3346169689Skan  if (x == known_x && mode == known_mode)
3347169689Skan    return known_ret;
3348169689Skan
3349169689Skan  /* Try to find identical subexpressions.  If found call
3350169689Skan     nonzero_bits1 on X with the subexpressions as KNOWN_X and the
3351169689Skan     precomputed value for the subexpression as KNOWN_RET.  */
3352169689Skan
3353169689Skan  if (ARITHMETIC_P (x))
3354117395Skan    {
3355169689Skan      rtx x0 = XEXP (x, 0);
3356169689Skan      rtx x1 = XEXP (x, 1);
3357117395Skan
3358169689Skan      /* Check the first level.  */
3359169689Skan      if (x0 == x1)
3360169689Skan	return nonzero_bits1 (x, mode, x0, mode,
3361169689Skan			      cached_nonzero_bits (x0, mode, known_x,
3362169689Skan						   known_mode, known_ret));
3363169689Skan
3364169689Skan      /* Check the second level.  */
3365169689Skan      if (ARITHMETIC_P (x0)
3366169689Skan	  && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
3367169689Skan	return nonzero_bits1 (x, mode, x1, mode,
3368169689Skan			      cached_nonzero_bits (x1, mode, known_x,
3369169689Skan						   known_mode, known_ret));
3370169689Skan
3371169689Skan      if (ARITHMETIC_P (x1)
3372169689Skan	  && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
3373169689Skan	return nonzero_bits1 (x, mode, x0, mode,
3374169689Skan			      cached_nonzero_bits (x0, mode, known_x,
3375169689Skan						   known_mode, known_ret));
3376117395Skan    }
3377169689Skan
3378169689Skan  return nonzero_bits1 (x, mode, known_x, known_mode, known_ret);
3379117395Skan}
3380117395Skan
3381169689Skan/* We let num_sign_bit_copies recur into nonzero_bits as that is useful.
3382169689Skan   We don't let nonzero_bits recur into num_sign_bit_copies, because that
3383169689Skan   is less useful.  We can't allow both, because that results in exponential
3384169689Skan   run time recursion.  There is a nullstone testcase that triggered
3385169689Skan   this.  This macro avoids accidental uses of num_sign_bit_copies.  */
3386169689Skan#define cached_num_sign_bit_copies sorry_i_am_preventing_exponential_behavior
3387117395Skan
3388169689Skan/* Given an expression, X, compute which bits in X can be nonzero.
3389169689Skan   We don't care about bits outside of those defined in MODE.
3390117395Skan
3391169689Skan   For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
3392169689Skan   an arithmetic operation, we can do better.  */
3393169689Skan
3394169689Skanstatic unsigned HOST_WIDE_INT
3395169689Skannonzero_bits1 (rtx x, enum machine_mode mode, rtx known_x,
3396169689Skan	       enum machine_mode known_mode,
3397169689Skan	       unsigned HOST_WIDE_INT known_ret)
3398117395Skan{
3399169689Skan  unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode);
3400169689Skan  unsigned HOST_WIDE_INT inner_nz;
3401169689Skan  enum rtx_code code;
3402169689Skan  unsigned int mode_width = GET_MODE_BITSIZE (mode);
3403117395Skan
3404169689Skan  /* For floating-point values, assume all bits are needed.  */
3405169689Skan  if (FLOAT_MODE_P (GET_MODE (x)) || FLOAT_MODE_P (mode))
3406169689Skan    return nonzero;
3407169689Skan
3408169689Skan  /* If X is wider than MODE, use its mode instead.  */
3409169689Skan  if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width)
3410117395Skan    {
3411169689Skan      mode = GET_MODE (x);
3412169689Skan      nonzero = GET_MODE_MASK (mode);
3413169689Skan      mode_width = GET_MODE_BITSIZE (mode);
3414169689Skan    }
3415169689Skan
3416169689Skan  if (mode_width > HOST_BITS_PER_WIDE_INT)
3417169689Skan    /* Our only callers in this case look for single bit values.  So
3418169689Skan       just return the mode mask.  Those tests will then be false.  */
3419169689Skan    return nonzero;
3420169689Skan
3421169689Skan#ifndef WORD_REGISTER_OPERATIONS
3422169689Skan  /* If MODE is wider than X, but both are a single word for both the host
3423169689Skan     and target machines, we can compute this from which bits of the
3424169689Skan     object might be nonzero in its own mode, taking into account the fact
3425169689Skan     that on many CISC machines, accessing an object in a wider mode
3426169689Skan     causes the high-order bits to become undefined.  So they are
3427169689Skan     not known to be zero.  */
3428169689Skan
3429169689Skan  if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode
3430169689Skan      && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD
3431169689Skan      && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
3432169689Skan      && GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (GET_MODE (x)))
3433169689Skan    {
3434169689Skan      nonzero &= cached_nonzero_bits (x, GET_MODE (x),
3435169689Skan				      known_x, known_mode, known_ret);
3436169689Skan      nonzero |= GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x));
3437169689Skan      return nonzero;
3438169689Skan    }
3439169689Skan#endif
3440169689Skan
3441169689Skan  code = GET_CODE (x);
3442169689Skan  switch (code)
3443169689Skan    {
3444169689Skan    case REG:
3445169689Skan#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
3446169689Skan      /* If pointers extend unsigned and this is a pointer in Pmode, say that
3447169689Skan	 all the bits above ptr_mode are known to be zero.  */
3448169689Skan      if (POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
3449169689Skan	  && REG_POINTER (x))
3450169689Skan	nonzero &= GET_MODE_MASK (ptr_mode);
3451169689Skan#endif
3452169689Skan
3453169689Skan      /* Include declared information about alignment of pointers.  */
3454169689Skan      /* ??? We don't properly preserve REG_POINTER changes across
3455169689Skan	 pointer-to-integer casts, so we can't trust it except for
3456169689Skan	 things that we know must be pointers.  See execute/960116-1.c.  */
3457169689Skan      if ((x == stack_pointer_rtx
3458169689Skan	   || x == frame_pointer_rtx
3459169689Skan	   || x == arg_pointer_rtx)
3460169689Skan	  && REGNO_POINTER_ALIGN (REGNO (x)))
3461169689Skan	{
3462169689Skan	  unsigned HOST_WIDE_INT alignment
3463169689Skan	    = REGNO_POINTER_ALIGN (REGNO (x)) / BITS_PER_UNIT;
3464169689Skan
3465169689Skan#ifdef PUSH_ROUNDING
3466169689Skan	  /* If PUSH_ROUNDING is defined, it is possible for the
3467169689Skan	     stack to be momentarily aligned only to that amount,
3468169689Skan	     so we pick the least alignment.  */
3469169689Skan	  if (x == stack_pointer_rtx && PUSH_ARGS)
3470169689Skan	    alignment = MIN ((unsigned HOST_WIDE_INT) PUSH_ROUNDING (1),
3471169689Skan			     alignment);
3472169689Skan#endif
3473169689Skan
3474169689Skan	  nonzero &= ~(alignment - 1);
3475169689Skan	}
3476169689Skan
3477169689Skan      {
3478169689Skan	unsigned HOST_WIDE_INT nonzero_for_hook = nonzero;
3479169689Skan	rtx new = rtl_hooks.reg_nonzero_bits (x, mode, known_x,
3480169689Skan					      known_mode, known_ret,
3481169689Skan					      &nonzero_for_hook);
3482169689Skan
3483169689Skan	if (new)
3484169689Skan	  nonzero_for_hook &= cached_nonzero_bits (new, mode, known_x,
3485169689Skan						   known_mode, known_ret);
3486169689Skan
3487169689Skan	return nonzero_for_hook;
3488169689Skan      }
3489169689Skan
3490169689Skan    case CONST_INT:
3491169689Skan#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
3492169689Skan      /* If X is negative in MODE, sign-extend the value.  */
3493169689Skan      if (INTVAL (x) > 0 && mode_width < BITS_PER_WORD
3494169689Skan	  && 0 != (INTVAL (x) & ((HOST_WIDE_INT) 1 << (mode_width - 1))))
3495169689Skan	return (INTVAL (x) | ((HOST_WIDE_INT) (-1) << mode_width));
3496169689Skan#endif
3497169689Skan
3498169689Skan      return INTVAL (x);
3499169689Skan
3500169689Skan    case MEM:
3501169689Skan#ifdef LOAD_EXTEND_OP
3502169689Skan      /* In many, if not most, RISC machines, reading a byte from memory
3503169689Skan	 zeros the rest of the register.  Noticing that fact saves a lot
3504169689Skan	 of extra zero-extends.  */
3505169689Skan      if (LOAD_EXTEND_OP (GET_MODE (x)) == ZERO_EXTEND)
3506169689Skan	nonzero &= GET_MODE_MASK (GET_MODE (x));
3507169689Skan#endif
3508117395Skan      break;
3509169689Skan
3510169689Skan    case EQ:  case NE:
3511169689Skan    case UNEQ:  case LTGT:
3512169689Skan    case GT:  case GTU:  case UNGT:
3513169689Skan    case LT:  case LTU:  case UNLT:
3514169689Skan    case GE:  case GEU:  case UNGE:
3515169689Skan    case LE:  case LEU:  case UNLE:
3516169689Skan    case UNORDERED: case ORDERED:
3517169689Skan      /* If this produces an integer result, we know which bits are set.
3518169689Skan	 Code here used to clear bits outside the mode of X, but that is
3519169689Skan	 now done above.  */
3520169689Skan      /* Mind that MODE is the mode the caller wants to look at this
3521169689Skan	 operation in, and not the actual operation mode.  We can wind
3522169689Skan	 up with (subreg:DI (gt:V4HI x y)), and we don't have anything
3523169689Skan	 that describes the results of a vector compare.  */
3524169689Skan      if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
3525169689Skan	  && mode_width <= HOST_BITS_PER_WIDE_INT)
3526169689Skan	nonzero = STORE_FLAG_VALUE;
3527117395Skan      break;
3528169689Skan
3529169689Skan    case NEG:
3530169689Skan#if 0
3531169689Skan      /* Disabled to avoid exponential mutual recursion between nonzero_bits
3532169689Skan	 and num_sign_bit_copies.  */
3533169689Skan      if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
3534169689Skan	  == GET_MODE_BITSIZE (GET_MODE (x)))
3535169689Skan	nonzero = 1;
3536169689Skan#endif
3537169689Skan
3538169689Skan      if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
3539169689Skan	nonzero |= (GET_MODE_MASK (mode) & ~GET_MODE_MASK (GET_MODE (x)));
3540117395Skan      break;
3541169689Skan
3542169689Skan    case ABS:
3543169689Skan#if 0
3544169689Skan      /* Disabled to avoid exponential mutual recursion between nonzero_bits
3545169689Skan	 and num_sign_bit_copies.  */
3546169689Skan      if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
3547169689Skan	  == GET_MODE_BITSIZE (GET_MODE (x)))
3548169689Skan	nonzero = 1;
3549169689Skan#endif
3550169689Skan      break;
3551169689Skan
3552169689Skan    case TRUNCATE:
3553169689Skan      nonzero &= (cached_nonzero_bits (XEXP (x, 0), mode,
3554169689Skan				       known_x, known_mode, known_ret)
3555169689Skan		  & GET_MODE_MASK (mode));
3556169689Skan      break;
3557169689Skan
3558169689Skan    case ZERO_EXTEND:
3559169689Skan      nonzero &= cached_nonzero_bits (XEXP (x, 0), mode,
3560169689Skan				      known_x, known_mode, known_ret);
3561169689Skan      if (GET_MODE (XEXP (x, 0)) != VOIDmode)
3562169689Skan	nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
3563169689Skan      break;
3564169689Skan
3565169689Skan    case SIGN_EXTEND:
3566169689Skan      /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
3567169689Skan	 Otherwise, show all the bits in the outer mode but not the inner
3568169689Skan	 may be nonzero.  */
3569169689Skan      inner_nz = cached_nonzero_bits (XEXP (x, 0), mode,
3570169689Skan				      known_x, known_mode, known_ret);
3571169689Skan      if (GET_MODE (XEXP (x, 0)) != VOIDmode)
3572117395Skan	{
3573169689Skan	  inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
3574169689Skan	  if (inner_nz
3575169689Skan	      & (((HOST_WIDE_INT) 1
3576169689Skan		  << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))))
3577169689Skan	    inner_nz |= (GET_MODE_MASK (mode)
3578169689Skan			 & ~GET_MODE_MASK (GET_MODE (XEXP (x, 0))));
3579169689Skan	}
3580169689Skan
3581169689Skan      nonzero &= inner_nz;
3582169689Skan      break;
3583169689Skan
3584169689Skan    case AND:
3585169689Skan      nonzero &= cached_nonzero_bits (XEXP (x, 0), mode,
3586169689Skan				       known_x, known_mode, known_ret)
3587169689Skan      		 & cached_nonzero_bits (XEXP (x, 1), mode,
3588169689Skan					known_x, known_mode, known_ret);
3589169689Skan      break;
3590169689Skan
3591169689Skan    case XOR:   case IOR:
3592169689Skan    case UMIN:  case UMAX:  case SMIN:  case SMAX:
3593169689Skan      {
3594169689Skan	unsigned HOST_WIDE_INT nonzero0 =
3595169689Skan	  cached_nonzero_bits (XEXP (x, 0), mode,
3596169689Skan			       known_x, known_mode, known_ret);
3597169689Skan
3598169689Skan	/* Don't call nonzero_bits for the second time if it cannot change
3599169689Skan	   anything.  */
3600169689Skan	if ((nonzero & nonzero0) != nonzero)
3601169689Skan	  nonzero &= nonzero0
3602169689Skan      		     | cached_nonzero_bits (XEXP (x, 1), mode,
3603169689Skan					    known_x, known_mode, known_ret);
3604169689Skan      }
3605169689Skan      break;
3606169689Skan
3607169689Skan    case PLUS:  case MINUS:
3608169689Skan    case MULT:
3609169689Skan    case DIV:   case UDIV:
3610169689Skan    case MOD:   case UMOD:
3611169689Skan      /* We can apply the rules of arithmetic to compute the number of
3612169689Skan	 high- and low-order zero bits of these operations.  We start by
3613169689Skan	 computing the width (position of the highest-order nonzero bit)
3614169689Skan	 and the number of low-order zero bits for each value.  */
3615169689Skan      {
3616169689Skan	unsigned HOST_WIDE_INT nz0 =
3617169689Skan	  cached_nonzero_bits (XEXP (x, 0), mode,
3618169689Skan			       known_x, known_mode, known_ret);
3619169689Skan	unsigned HOST_WIDE_INT nz1 =
3620169689Skan	  cached_nonzero_bits (XEXP (x, 1), mode,
3621169689Skan			       known_x, known_mode, known_ret);
3622169689Skan	int sign_index = GET_MODE_BITSIZE (GET_MODE (x)) - 1;
3623169689Skan	int width0 = floor_log2 (nz0) + 1;
3624169689Skan	int width1 = floor_log2 (nz1) + 1;
3625169689Skan	int low0 = floor_log2 (nz0 & -nz0);
3626169689Skan	int low1 = floor_log2 (nz1 & -nz1);
3627169689Skan	HOST_WIDE_INT op0_maybe_minusp
3628169689Skan	  = (nz0 & ((HOST_WIDE_INT) 1 << sign_index));
3629169689Skan	HOST_WIDE_INT op1_maybe_minusp
3630169689Skan	  = (nz1 & ((HOST_WIDE_INT) 1 << sign_index));
3631169689Skan	unsigned int result_width = mode_width;
3632169689Skan	int result_low = 0;
3633169689Skan
3634169689Skan	switch (code)
3635169689Skan	  {
3636169689Skan	  case PLUS:
3637169689Skan	    result_width = MAX (width0, width1) + 1;
3638169689Skan	    result_low = MIN (low0, low1);
3639169689Skan	    break;
3640169689Skan	  case MINUS:
3641169689Skan	    result_low = MIN (low0, low1);
3642169689Skan	    break;
3643169689Skan	  case MULT:
3644169689Skan	    result_width = width0 + width1;
3645169689Skan	    result_low = low0 + low1;
3646169689Skan	    break;
3647169689Skan	  case DIV:
3648169689Skan	    if (width1 == 0)
3649117395Skan	      break;
3650169689Skan	    if (! op0_maybe_minusp && ! op1_maybe_minusp)
3651169689Skan	      result_width = width0;
3652169689Skan	    break;
3653169689Skan	  case UDIV:
3654169689Skan	    if (width1 == 0)
3655117395Skan	      break;
3656169689Skan	    result_width = width0;
3657169689Skan	    break;
3658169689Skan	  case MOD:
3659169689Skan	    if (width1 == 0)
3660117395Skan	      break;
3661169689Skan	    if (! op0_maybe_minusp && ! op1_maybe_minusp)
3662169689Skan	      result_width = MIN (width0, width1);
3663169689Skan	    result_low = MIN (low0, low1);
3664169689Skan	    break;
3665169689Skan	  case UMOD:
3666169689Skan	    if (width1 == 0)
3667117395Skan	      break;
3668169689Skan	    result_width = MIN (width0, width1);
3669169689Skan	    result_low = MIN (low0, low1);
3670169689Skan	    break;
3671169689Skan	  default:
3672169689Skan	    gcc_unreachable ();
3673169689Skan	  }
3674169689Skan
3675169689Skan	if (result_width < mode_width)
3676169689Skan	  nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1;
3677169689Skan
3678169689Skan	if (result_low > 0)
3679169689Skan	  nonzero &= ~(((HOST_WIDE_INT) 1 << result_low) - 1);
3680169689Skan
3681169689Skan#ifdef POINTERS_EXTEND_UNSIGNED
3682169689Skan	/* If pointers extend unsigned and this is an addition or subtraction
3683169689Skan	   to a pointer in Pmode, all the bits above ptr_mode are known to be
3684169689Skan	   zero.  */
3685169689Skan	if (POINTERS_EXTEND_UNSIGNED > 0 && GET_MODE (x) == Pmode
3686169689Skan	    && (code == PLUS || code == MINUS)
3687169689Skan	    && REG_P (XEXP (x, 0)) && REG_POINTER (XEXP (x, 0)))
3688169689Skan	  nonzero &= GET_MODE_MASK (ptr_mode);
3689169689Skan#endif
3690169689Skan      }
3691169689Skan      break;
3692169689Skan
3693169689Skan    case ZERO_EXTRACT:
3694169689Skan      if (GET_CODE (XEXP (x, 1)) == CONST_INT
3695169689Skan	  && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
3696169689Skan	nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1;
3697169689Skan      break;
3698169689Skan
3699169689Skan    case SUBREG:
3700169689Skan      /* If this is a SUBREG formed for a promoted variable that has
3701169689Skan	 been zero-extended, we know that at least the high-order bits
3702169689Skan	 are zero, though others might be too.  */
3703169689Skan
3704169689Skan      if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x) > 0)
3705169689Skan	nonzero = GET_MODE_MASK (GET_MODE (x))
3706169689Skan		  & cached_nonzero_bits (SUBREG_REG (x), GET_MODE (x),
3707169689Skan					 known_x, known_mode, known_ret);
3708169689Skan
3709169689Skan      /* If the inner mode is a single word for both the host and target
3710169689Skan	 machines, we can compute this from which bits of the inner
3711169689Skan	 object might be nonzero.  */
3712169689Skan      if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD
3713169689Skan	  && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
3714169689Skan	      <= HOST_BITS_PER_WIDE_INT))
3715169689Skan	{
3716169689Skan	  nonzero &= cached_nonzero_bits (SUBREG_REG (x), mode,
3717169689Skan					  known_x, known_mode, known_ret);
3718169689Skan
3719169689Skan#if defined (WORD_REGISTER_OPERATIONS) && defined (LOAD_EXTEND_OP)
3720169689Skan	  /* If this is a typical RISC machine, we only have to worry
3721169689Skan	     about the way loads are extended.  */
3722169689Skan	  if ((LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
3723169689Skan	       ? (((nonzero
3724169689Skan		    & (((unsigned HOST_WIDE_INT) 1
3725169689Skan			<< (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) - 1))))
3726169689Skan		   != 0))
3727169689Skan	       : LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) != ZERO_EXTEND)
3728169689Skan	      || !MEM_P (SUBREG_REG (x)))
3729169689Skan#endif
3730169689Skan	    {
3731169689Skan	      /* On many CISC machines, accessing an object in a wider mode
3732169689Skan		 causes the high-order bits to become undefined.  So they are
3733169689Skan		 not known to be zero.  */
3734169689Skan	      if (GET_MODE_SIZE (GET_MODE (x))
3735169689Skan		  > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
3736169689Skan		nonzero |= (GET_MODE_MASK (GET_MODE (x))
3737169689Skan			    & ~GET_MODE_MASK (GET_MODE (SUBREG_REG (x))));
3738117395Skan	    }
3739117395Skan	}
3740117395Skan      break;
3741169689Skan
3742169689Skan    case ASHIFTRT:
3743169689Skan    case LSHIFTRT:
3744169689Skan    case ASHIFT:
3745169689Skan    case ROTATE:
3746169689Skan      /* The nonzero bits are in two classes: any bits within MODE
3747169689Skan	 that aren't in GET_MODE (x) are always significant.  The rest of the
3748169689Skan	 nonzero bits are those that are significant in the operand of
3749169689Skan	 the shift when shifted the appropriate number of bits.  This
3750169689Skan	 shows that high-order bits are cleared by the right shift and
3751169689Skan	 low-order bits by left shifts.  */
3752169689Skan      if (GET_CODE (XEXP (x, 1)) == CONST_INT
3753169689Skan	  && INTVAL (XEXP (x, 1)) >= 0
3754169689Skan	  && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
3755169689Skan	{
3756169689Skan	  enum machine_mode inner_mode = GET_MODE (x);
3757169689Skan	  unsigned int width = GET_MODE_BITSIZE (inner_mode);
3758169689Skan	  int count = INTVAL (XEXP (x, 1));
3759169689Skan	  unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode);
3760169689Skan	  unsigned HOST_WIDE_INT op_nonzero =
3761169689Skan	    cached_nonzero_bits (XEXP (x, 0), mode,
3762169689Skan				 known_x, known_mode, known_ret);
3763169689Skan	  unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask;
3764169689Skan	  unsigned HOST_WIDE_INT outer = 0;
3765169689Skan
3766169689Skan	  if (mode_width > width)
3767169689Skan	    outer = (op_nonzero & nonzero & ~mode_mask);
3768169689Skan
3769169689Skan	  if (code == LSHIFTRT)
3770169689Skan	    inner >>= count;
3771169689Skan	  else if (code == ASHIFTRT)
3772169689Skan	    {
3773169689Skan	      inner >>= count;
3774169689Skan
3775169689Skan	      /* If the sign bit may have been nonzero before the shift, we
3776169689Skan		 need to mark all the places it could have been copied to
3777169689Skan		 by the shift as possibly nonzero.  */
3778169689Skan	      if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count)))
3779169689Skan		inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count);
3780169689Skan	    }
3781169689Skan	  else if (code == ASHIFT)
3782169689Skan	    inner <<= count;
3783169689Skan	  else
3784169689Skan	    inner = ((inner << (count % width)
3785169689Skan		      | (inner >> (width - (count % width)))) & mode_mask);
3786169689Skan
3787169689Skan	  nonzero &= (outer | inner);
3788169689Skan	}
3789169689Skan      break;
3790169689Skan
3791169689Skan    case FFS:
3792169689Skan    case POPCOUNT:
3793169689Skan      /* This is at most the number of bits in the mode.  */
3794169689Skan      nonzero = ((HOST_WIDE_INT) 2 << (floor_log2 (mode_width))) - 1;
3795169689Skan      break;
3796169689Skan
3797169689Skan    case CLZ:
3798169689Skan      /* If CLZ has a known value at zero, then the nonzero bits are
3799169689Skan	 that value, plus the number of bits in the mode minus one.  */
3800169689Skan      if (CLZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
3801169689Skan	nonzero |= ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width))) - 1;
3802169689Skan      else
3803169689Skan	nonzero = -1;
3804169689Skan      break;
3805169689Skan
3806169689Skan    case CTZ:
3807169689Skan      /* If CTZ has a known value at zero, then the nonzero bits are
3808169689Skan	 that value, plus the number of bits in the mode minus one.  */
3809169689Skan      if (CTZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
3810169689Skan	nonzero |= ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width))) - 1;
3811169689Skan      else
3812169689Skan	nonzero = -1;
3813169689Skan      break;
3814169689Skan
3815169689Skan    case PARITY:
3816169689Skan      nonzero = 1;
3817169689Skan      break;
3818169689Skan
3819169689Skan    case IF_THEN_ELSE:
3820169689Skan      {
3821169689Skan	unsigned HOST_WIDE_INT nonzero_true =
3822169689Skan	  cached_nonzero_bits (XEXP (x, 1), mode,
3823169689Skan			       known_x, known_mode, known_ret);
3824169689Skan
3825169689Skan	/* Don't call nonzero_bits for the second time if it cannot change
3826169689Skan	   anything.  */
3827169689Skan	if ((nonzero & nonzero_true) != nonzero)
3828169689Skan	  nonzero &= nonzero_true
3829169689Skan      		     | cached_nonzero_bits (XEXP (x, 2), mode,
3830169689Skan					    known_x, known_mode, known_ret);
3831169689Skan      }
3832169689Skan      break;
3833169689Skan
3834117395Skan    default:
3835169689Skan      break;
3836117395Skan    }
3837169689Skan
3838169689Skan  return nonzero;
3839117395Skan}
3840117395Skan
3841169689Skan/* See the macro definition above.  */
3842169689Skan#undef cached_num_sign_bit_copies
3843117395Skan
3844169689Skan
3845169689Skan/* The function cached_num_sign_bit_copies is a wrapper around
3846169689Skan   num_sign_bit_copies1.  It avoids exponential behavior in
3847169689Skan   num_sign_bit_copies1 when X has identical subexpressions on the
3848169689Skan   first or the second level.  */
3849169689Skan
3850169689Skanstatic unsigned int
3851169689Skancached_num_sign_bit_copies (rtx x, enum machine_mode mode, rtx known_x,
3852169689Skan			    enum machine_mode known_mode,
3853169689Skan			    unsigned int known_ret)
3854117395Skan{
3855169689Skan  if (x == known_x && mode == known_mode)
3856169689Skan    return known_ret;
3857117395Skan
3858169689Skan  /* Try to find identical subexpressions.  If found call
3859169689Skan     num_sign_bit_copies1 on X with the subexpressions as KNOWN_X and
3860169689Skan     the precomputed value for the subexpression as KNOWN_RET.  */
3861117395Skan
3862169689Skan  if (ARITHMETIC_P (x))
3863117395Skan    {
3864169689Skan      rtx x0 = XEXP (x, 0);
3865169689Skan      rtx x1 = XEXP (x, 1);
3866169689Skan
3867169689Skan      /* Check the first level.  */
3868169689Skan      if (x0 == x1)
3869169689Skan	return
3870169689Skan	  num_sign_bit_copies1 (x, mode, x0, mode,
3871169689Skan				cached_num_sign_bit_copies (x0, mode, known_x,
3872169689Skan							    known_mode,
3873169689Skan							    known_ret));
3874169689Skan
3875169689Skan      /* Check the second level.  */
3876169689Skan      if (ARITHMETIC_P (x0)
3877169689Skan	  && (x1 == XEXP (x0, 0) || x1 == XEXP (x0, 1)))
3878169689Skan	return
3879169689Skan	  num_sign_bit_copies1 (x, mode, x1, mode,
3880169689Skan				cached_num_sign_bit_copies (x1, mode, known_x,
3881169689Skan							    known_mode,
3882169689Skan							    known_ret));
3883169689Skan
3884169689Skan      if (ARITHMETIC_P (x1)
3885169689Skan	  && (x0 == XEXP (x1, 0) || x0 == XEXP (x1, 1)))
3886169689Skan	return
3887169689Skan	  num_sign_bit_copies1 (x, mode, x0, mode,
3888169689Skan				cached_num_sign_bit_copies (x0, mode, known_x,
3889169689Skan							    known_mode,
3890169689Skan							    known_ret));
3891117395Skan    }
3892117395Skan
3893169689Skan  return num_sign_bit_copies1 (x, mode, known_x, known_mode, known_ret);
3894117395Skan}
3895117395Skan
3896169689Skan/* Return the number of bits at the high-order end of X that are known to
3897169689Skan   be equal to the sign bit.  X will be used in mode MODE; if MODE is
3898169689Skan   VOIDmode, X will be used in its own mode.  The returned value  will always
3899169689Skan   be between 1 and the number of bits in MODE.  */
3900117395Skan
3901169689Skanstatic unsigned int
3902169689Skannum_sign_bit_copies1 (rtx x, enum machine_mode mode, rtx known_x,
3903169689Skan		      enum machine_mode known_mode,
3904169689Skan		      unsigned int known_ret)
3905117395Skan{
3906169689Skan  enum rtx_code code = GET_CODE (x);
3907169689Skan  unsigned int bitwidth = GET_MODE_BITSIZE (mode);
3908169689Skan  int num0, num1, result;
3909169689Skan  unsigned HOST_WIDE_INT nonzero;
3910117395Skan
3911169689Skan  /* If we weren't given a mode, use the mode of X.  If the mode is still
3912169689Skan     VOIDmode, we don't know anything.  Likewise if one of the modes is
3913169689Skan     floating-point.  */
3914117395Skan
3915169689Skan  if (mode == VOIDmode)
3916169689Skan    mode = GET_MODE (x);
3917117395Skan
3918169689Skan  if (mode == VOIDmode || FLOAT_MODE_P (mode) || FLOAT_MODE_P (GET_MODE (x)))
3919169689Skan    return 1;
3920117395Skan
3921169689Skan  /* For a smaller object, just ignore the high bits.  */
3922169689Skan  if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x)))
3923117395Skan    {
3924169689Skan      num0 = cached_num_sign_bit_copies (x, GET_MODE (x),
3925169689Skan					 known_x, known_mode, known_ret);
3926169689Skan      return MAX (1,
3927169689Skan		  num0 - (int) (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth));
3928169689Skan    }
3929169689Skan
3930169689Skan  if (GET_MODE (x) != VOIDmode && bitwidth > GET_MODE_BITSIZE (GET_MODE (x)))
3931169689Skan    {
3932169689Skan#ifndef WORD_REGISTER_OPERATIONS
3933169689Skan  /* If this machine does not do all register operations on the entire
3934169689Skan     register and MODE is wider than the mode of X, we can say nothing
3935169689Skan     at all about the high-order bits.  */
3936169689Skan      return 1;
3937169689Skan#else
3938169689Skan      /* Likewise on machines that do, if the mode of the object is smaller
3939169689Skan	 than a word and loads of that size don't sign extend, we can say
3940169689Skan	 nothing about the high order bits.  */
3941169689Skan      if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
3942169689Skan#ifdef LOAD_EXTEND_OP
3943169689Skan	  && LOAD_EXTEND_OP (GET_MODE (x)) != SIGN_EXTEND
3944169689Skan#endif
3945169689Skan	  )
3946169689Skan	return 1;
3947169689Skan#endif
3948169689Skan    }
3949169689Skan
3950169689Skan  switch (code)
3951169689Skan    {
3952169689Skan    case REG:
3953169689Skan
3954169689Skan#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
3955169689Skan      /* If pointers extend signed and this is a pointer in Pmode, say that
3956169689Skan	 all the bits above ptr_mode are known to be sign bit copies.  */
3957169689Skan      if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode && mode == Pmode
3958169689Skan	  && REG_POINTER (x))
3959169689Skan	return GET_MODE_BITSIZE (Pmode) - GET_MODE_BITSIZE (ptr_mode) + 1;
3960169689Skan#endif
3961169689Skan
3962169689Skan      {
3963169689Skan	unsigned int copies_for_hook = 1, copies = 1;
3964169689Skan	rtx new = rtl_hooks.reg_num_sign_bit_copies (x, mode, known_x,
3965169689Skan						     known_mode, known_ret,
3966169689Skan						     &copies_for_hook);
3967169689Skan
3968169689Skan	if (new)
3969169689Skan	  copies = cached_num_sign_bit_copies (new, mode, known_x,
3970169689Skan					       known_mode, known_ret);
3971169689Skan
3972169689Skan	if (copies > 1 || copies_for_hook > 1)
3973169689Skan	  return MAX (copies, copies_for_hook);
3974169689Skan
3975169689Skan	/* Else, use nonzero_bits to guess num_sign_bit_copies (see below).  */
3976169689Skan      }
3977117395Skan      break;
3978169689Skan
3979169689Skan    case MEM:
3980169689Skan#ifdef LOAD_EXTEND_OP
3981169689Skan      /* Some RISC machines sign-extend all loads of smaller than a word.  */
3982169689Skan      if (LOAD_EXTEND_OP (GET_MODE (x)) == SIGN_EXTEND)
3983169689Skan	return MAX (1, ((int) bitwidth
3984169689Skan			- (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1));
3985169689Skan#endif
3986117395Skan      break;
3987169689Skan
3988169689Skan    case CONST_INT:
3989169689Skan      /* If the constant is negative, take its 1's complement and remask.
3990169689Skan	 Then see how many zero bits we have.  */
3991169689Skan      nonzero = INTVAL (x) & GET_MODE_MASK (mode);
3992169689Skan      if (bitwidth <= HOST_BITS_PER_WIDE_INT
3993169689Skan	  && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
3994169689Skan	nonzero = (~nonzero) & GET_MODE_MASK (mode);
3995169689Skan
3996169689Skan      return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
3997169689Skan
3998169689Skan    case SUBREG:
3999169689Skan      /* If this is a SUBREG for a promoted object that is sign-extended
4000169689Skan	 and we are looking at it in a wider mode, we know that at least the
4001169689Skan	 high-order bits are known to be sign bit copies.  */
4002169689Skan
4003169689Skan      if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x))
4004169689Skan	{
4005169689Skan	  num0 = cached_num_sign_bit_copies (SUBREG_REG (x), mode,
4006169689Skan					     known_x, known_mode, known_ret);
4007169689Skan	  return MAX ((int) bitwidth
4008169689Skan		      - (int) GET_MODE_BITSIZE (GET_MODE (x)) + 1,
4009169689Skan		      num0);
4010169689Skan	}
4011169689Skan
4012169689Skan      /* For a smaller object, just ignore the high bits.  */
4013169689Skan      if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))))
4014169689Skan	{
4015169689Skan	  num0 = cached_num_sign_bit_copies (SUBREG_REG (x), VOIDmode,
4016169689Skan					     known_x, known_mode, known_ret);
4017169689Skan	  return MAX (1, (num0
4018169689Skan			  - (int) (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
4019169689Skan				   - bitwidth)));
4020169689Skan	}
4021169689Skan
4022169689Skan#ifdef WORD_REGISTER_OPERATIONS
4023169689Skan#ifdef LOAD_EXTEND_OP
4024169689Skan      /* For paradoxical SUBREGs on machines where all register operations
4025169689Skan	 affect the entire register, just look inside.  Note that we are
4026169689Skan	 passing MODE to the recursive call, so the number of sign bit copies
4027169689Skan	 will remain relative to that mode, not the inner mode.  */
4028169689Skan
4029169689Skan      /* This works only if loads sign extend.  Otherwise, if we get a
4030169689Skan	 reload for the inner part, it may be loaded from the stack, and
4031169689Skan	 then we lose all sign bit copies that existed before the store
4032169689Skan	 to the stack.  */
4033169689Skan
4034169689Skan      if ((GET_MODE_SIZE (GET_MODE (x))
4035169689Skan	   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
4036169689Skan	  && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
4037169689Skan	  && MEM_P (SUBREG_REG (x)))
4038169689Skan	return cached_num_sign_bit_copies (SUBREG_REG (x), mode,
4039169689Skan					   known_x, known_mode, known_ret);
4040169689Skan#endif
4041169689Skan#endif
4042117395Skan      break;
4043169689Skan
4044169689Skan    case SIGN_EXTRACT:
4045169689Skan      if (GET_CODE (XEXP (x, 1)) == CONST_INT)
4046169689Skan	return MAX (1, (int) bitwidth - INTVAL (XEXP (x, 1)));
4047169689Skan      break;
4048169689Skan
4049169689Skan    case SIGN_EXTEND:
4050169689Skan      return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4051169689Skan	      + cached_num_sign_bit_copies (XEXP (x, 0), VOIDmode,
4052169689Skan					    known_x, known_mode, known_ret));
4053169689Skan
4054169689Skan    case TRUNCATE:
4055169689Skan      /* For a smaller object, just ignore the high bits.  */
4056169689Skan      num0 = cached_num_sign_bit_copies (XEXP (x, 0), VOIDmode,
4057169689Skan					 known_x, known_mode, known_ret);
4058169689Skan      return MAX (1, (num0 - (int) (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4059169689Skan				    - bitwidth)));
4060169689Skan
4061169689Skan    case NOT:
4062169689Skan      return cached_num_sign_bit_copies (XEXP (x, 0), mode,
4063169689Skan					 known_x, known_mode, known_ret);
4064169689Skan
4065169689Skan    case ROTATE:       case ROTATERT:
4066169689Skan      /* If we are rotating left by a number of bits less than the number
4067169689Skan	 of sign bit copies, we can just subtract that amount from the
4068169689Skan	 number.  */
4069169689Skan      if (GET_CODE (XEXP (x, 1)) == CONST_INT
4070169689Skan	  && INTVAL (XEXP (x, 1)) >= 0
4071169689Skan	  && INTVAL (XEXP (x, 1)) < (int) bitwidth)
4072169689Skan	{
4073169689Skan	  num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4074169689Skan					     known_x, known_mode, known_ret);
4075169689Skan	  return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1))
4076169689Skan				 : (int) bitwidth - INTVAL (XEXP (x, 1))));
4077169689Skan	}
4078169689Skan      break;
4079169689Skan
4080169689Skan    case NEG:
4081169689Skan      /* In general, this subtracts one sign bit copy.  But if the value
4082169689Skan	 is known to be positive, the number of sign bit copies is the
4083169689Skan	 same as that of the input.  Finally, if the input has just one bit
4084169689Skan	 that might be nonzero, all the bits are copies of the sign bit.  */
4085169689Skan      num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4086169689Skan					 known_x, known_mode, known_ret);
4087169689Skan      if (bitwidth > HOST_BITS_PER_WIDE_INT)
4088169689Skan	return num0 > 1 ? num0 - 1 : 1;
4089169689Skan
4090169689Skan      nonzero = nonzero_bits (XEXP (x, 0), mode);
4091169689Skan      if (nonzero == 1)
4092169689Skan	return bitwidth;
4093169689Skan
4094169689Skan      if (num0 > 1
4095169689Skan	  && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero))
4096169689Skan	num0--;
4097169689Skan
4098169689Skan      return num0;
4099169689Skan
4100169689Skan    case IOR:   case AND:   case XOR:
4101169689Skan    case SMIN:  case SMAX:  case UMIN:  case UMAX:
4102169689Skan      /* Logical operations will preserve the number of sign-bit copies.
4103169689Skan	 MIN and MAX operations always return one of the operands.  */
4104169689Skan      num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4105169689Skan					 known_x, known_mode, known_ret);
4106169689Skan      num1 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4107169689Skan					 known_x, known_mode, known_ret);
4108169689Skan      return MIN (num0, num1);
4109169689Skan
4110169689Skan    case PLUS:  case MINUS:
4111169689Skan      /* For addition and subtraction, we can have a 1-bit carry.  However,
4112169689Skan	 if we are subtracting 1 from a positive number, there will not
4113169689Skan	 be such a carry.  Furthermore, if the positive number is known to
4114169689Skan	 be 0 or 1, we know the result is either -1 or 0.  */
4115169689Skan
4116169689Skan      if (code == PLUS && XEXP (x, 1) == constm1_rtx
4117169689Skan	  && bitwidth <= HOST_BITS_PER_WIDE_INT)
4118169689Skan	{
4119169689Skan	  nonzero = nonzero_bits (XEXP (x, 0), mode);
4120169689Skan	  if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0)
4121169689Skan	    return (nonzero == 1 || nonzero == 0 ? bitwidth
4122169689Skan		    : bitwidth - floor_log2 (nonzero) - 1);
4123169689Skan	}
4124169689Skan
4125169689Skan      num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4126169689Skan					 known_x, known_mode, known_ret);
4127169689Skan      num1 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4128169689Skan					 known_x, known_mode, known_ret);
4129169689Skan      result = MAX (1, MIN (num0, num1) - 1);
4130169689Skan
4131169689Skan#ifdef POINTERS_EXTEND_UNSIGNED
4132169689Skan      /* If pointers extend signed and this is an addition or subtraction
4133169689Skan	 to a pointer in Pmode, all the bits above ptr_mode are known to be
4134169689Skan	 sign bit copies.  */
4135169689Skan      if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
4136169689Skan	  && (code == PLUS || code == MINUS)
4137169689Skan	  && REG_P (XEXP (x, 0)) && REG_POINTER (XEXP (x, 0)))
4138169689Skan	result = MAX ((int) (GET_MODE_BITSIZE (Pmode)
4139169689Skan			     - GET_MODE_BITSIZE (ptr_mode) + 1),
4140169689Skan		      result);
4141169689Skan#endif
4142169689Skan      return result;
4143169689Skan
4144169689Skan    case MULT:
4145169689Skan      /* The number of bits of the product is the sum of the number of
4146169689Skan	 bits of both terms.  However, unless one of the terms if known
4147169689Skan	 to be positive, we must allow for an additional bit since negating
4148169689Skan	 a negative number can remove one sign bit copy.  */
4149169689Skan
4150169689Skan      num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4151169689Skan					 known_x, known_mode, known_ret);
4152169689Skan      num1 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4153169689Skan					 known_x, known_mode, known_ret);
4154169689Skan
4155169689Skan      result = bitwidth - (bitwidth - num0) - (bitwidth - num1);
4156169689Skan      if (result > 0
4157169689Skan	  && (bitwidth > HOST_BITS_PER_WIDE_INT
4158169689Skan	      || (((nonzero_bits (XEXP (x, 0), mode)
4159169689Skan		    & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
4160169689Skan		  && ((nonzero_bits (XEXP (x, 1), mode)
4161169689Skan		       & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))))
4162169689Skan	result--;
4163169689Skan
4164169689Skan      return MAX (1, result);
4165169689Skan
4166169689Skan    case UDIV:
4167169689Skan      /* The result must be <= the first operand.  If the first operand
4168169689Skan	 has the high bit set, we know nothing about the number of sign
4169169689Skan	 bit copies.  */
4170169689Skan      if (bitwidth > HOST_BITS_PER_WIDE_INT)
4171169689Skan	return 1;
4172169689Skan      else if ((nonzero_bits (XEXP (x, 0), mode)
4173169689Skan		& ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
4174169689Skan	return 1;
4175169689Skan      else
4176169689Skan	return cached_num_sign_bit_copies (XEXP (x, 0), mode,
4177169689Skan					   known_x, known_mode, known_ret);
4178169689Skan
4179169689Skan    case UMOD:
4180169689Skan      /* The result must be <= the second operand.  */
4181169689Skan      return cached_num_sign_bit_copies (XEXP (x, 1), mode,
4182169689Skan					   known_x, known_mode, known_ret);
4183169689Skan
4184169689Skan    case DIV:
4185169689Skan      /* Similar to unsigned division, except that we have to worry about
4186169689Skan	 the case where the divisor is negative, in which case we have
4187169689Skan	 to add 1.  */
4188169689Skan      result = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4189169689Skan					   known_x, known_mode, known_ret);
4190169689Skan      if (result > 1
4191169689Skan	  && (bitwidth > HOST_BITS_PER_WIDE_INT
4192169689Skan	      || (nonzero_bits (XEXP (x, 1), mode)
4193169689Skan		  & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
4194169689Skan	result--;
4195169689Skan
4196169689Skan      return result;
4197169689Skan
4198169689Skan    case MOD:
4199169689Skan      result = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4200169689Skan					   known_x, known_mode, known_ret);
4201169689Skan      if (result > 1
4202169689Skan	  && (bitwidth > HOST_BITS_PER_WIDE_INT
4203169689Skan	      || (nonzero_bits (XEXP (x, 1), mode)
4204169689Skan		  & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
4205169689Skan	result--;
4206169689Skan
4207169689Skan      return result;
4208169689Skan
4209169689Skan    case ASHIFTRT:
4210169689Skan      /* Shifts by a constant add to the number of bits equal to the
4211169689Skan	 sign bit.  */
4212169689Skan      num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4213169689Skan					 known_x, known_mode, known_ret);
4214169689Skan      if (GET_CODE (XEXP (x, 1)) == CONST_INT
4215169689Skan	  && INTVAL (XEXP (x, 1)) > 0)
4216169689Skan	num0 = MIN ((int) bitwidth, num0 + INTVAL (XEXP (x, 1)));
4217169689Skan
4218169689Skan      return num0;
4219169689Skan
4220169689Skan    case ASHIFT:
4221169689Skan      /* Left shifts destroy copies.  */
4222169689Skan      if (GET_CODE (XEXP (x, 1)) != CONST_INT
4223169689Skan	  || INTVAL (XEXP (x, 1)) < 0
4224169689Skan	  || INTVAL (XEXP (x, 1)) >= (int) bitwidth)
4225169689Skan	return 1;
4226169689Skan
4227169689Skan      num0 = cached_num_sign_bit_copies (XEXP (x, 0), mode,
4228169689Skan					 known_x, known_mode, known_ret);
4229169689Skan      return MAX (1, num0 - INTVAL (XEXP (x, 1)));
4230169689Skan
4231169689Skan    case IF_THEN_ELSE:
4232169689Skan      num0 = cached_num_sign_bit_copies (XEXP (x, 1), mode,
4233169689Skan					 known_x, known_mode, known_ret);
4234169689Skan      num1 = cached_num_sign_bit_copies (XEXP (x, 2), mode,
4235169689Skan					 known_x, known_mode, known_ret);
4236169689Skan      return MIN (num0, num1);
4237169689Skan
4238169689Skan    case EQ:  case NE:  case GE:  case GT:  case LE:  case LT:
4239169689Skan    case UNEQ:  case LTGT:  case UNGE:  case UNGT:  case UNLE:  case UNLT:
4240169689Skan    case GEU: case GTU: case LEU: case LTU:
4241169689Skan    case UNORDERED: case ORDERED:
4242169689Skan      /* If the constant is negative, take its 1's complement and remask.
4243169689Skan	 Then see how many zero bits we have.  */
4244169689Skan      nonzero = STORE_FLAG_VALUE;
4245169689Skan      if (bitwidth <= HOST_BITS_PER_WIDE_INT
4246169689Skan	  && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
4247169689Skan	nonzero = (~nonzero) & GET_MODE_MASK (mode);
4248169689Skan
4249169689Skan      return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
4250169689Skan
4251169689Skan    default:
4252169689Skan      break;
4253169689Skan    }
4254169689Skan
4255169689Skan  /* If we haven't been able to figure it out by one of the above rules,
4256169689Skan     see if some of the high-order bits are known to be zero.  If so,
4257169689Skan     count those bits and return one less than that amount.  If we can't
4258169689Skan     safely compute the mask for this mode, always return BITWIDTH.  */
4259169689Skan
4260169689Skan  bitwidth = GET_MODE_BITSIZE (mode);
4261169689Skan  if (bitwidth > HOST_BITS_PER_WIDE_INT)
4262169689Skan    return 1;
4263169689Skan
4264169689Skan  nonzero = nonzero_bits (x, mode);
4265169689Skan  return nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))
4266169689Skan	 ? 1 : bitwidth - floor_log2 (nonzero) - 1;
4267169689Skan}
4268169689Skan
4269169689Skan/* Calculate the rtx_cost of a single instruction.  A return value of
4270169689Skan   zero indicates an instruction pattern without a known cost.  */
4271169689Skan
4272169689Skanint
4273169689Skaninsn_rtx_cost (rtx pat)
4274169689Skan{
4275169689Skan  int i, cost;
4276169689Skan  rtx set;
4277169689Skan
4278169689Skan  /* Extract the single set rtx from the instruction pattern.
4279169689Skan     We can't use single_set since we only have the pattern.  */
4280169689Skan  if (GET_CODE (pat) == SET)
4281169689Skan    set = pat;
4282169689Skan  else if (GET_CODE (pat) == PARALLEL)
4283169689Skan    {
4284169689Skan      set = NULL_RTX;
4285117395Skan      for (i = 0; i < XVECLEN (pat, 0); i++)
4286117395Skan	{
4287117395Skan	  rtx x = XVECEXP (pat, 0, i);
4288169689Skan	  if (GET_CODE (x) == SET)
4289117395Skan	    {
4290169689Skan	      if (set)
4291169689Skan		return 0;
4292169689Skan	      set = x;
4293117395Skan	    }
4294117395Skan	}
4295169689Skan      if (!set)
4296169689Skan	return 0;
4297117395Skan    }
4298169689Skan  else
4299169689Skan    return 0;
4300117395Skan
4301169689Skan  cost = rtx_cost (SET_SRC (set), SET);
4302169689Skan  return cost > 0 ? cost : COSTS_N_INSNS (1);
4303117395Skan}
4304117395Skan
4305169689Skan/* Given an insn INSN and condition COND, return the condition in a
4306169689Skan   canonical form to simplify testing by callers.  Specifically:
4307169689Skan
4308169689Skan   (1) The code will always be a comparison operation (EQ, NE, GT, etc.).
4309169689Skan   (2) Both operands will be machine operands; (cc0) will have been replaced.
4310169689Skan   (3) If an operand is a constant, it will be the second operand.
4311169689Skan   (4) (LE x const) will be replaced with (LT x <const+1>) and similarly
4312169689Skan       for GE, GEU, and LEU.
4313169689Skan
4314169689Skan   If the condition cannot be understood, or is an inequality floating-point
4315169689Skan   comparison which needs to be reversed, 0 will be returned.
4316169689Skan
4317169689Skan   If REVERSE is nonzero, then reverse the condition prior to canonizing it.
4318169689Skan
4319169689Skan   If EARLIEST is nonzero, it is a pointer to a place where the earliest
4320169689Skan   insn used in locating the condition was found.  If a replacement test
4321169689Skan   of the condition is desired, it should be placed in front of that
4322169689Skan   insn and we will be sure that the inputs are still valid.
4323169689Skan
4324169689Skan   If WANT_REG is nonzero, we wish the condition to be relative to that
4325169689Skan   register, if possible.  Therefore, do not canonicalize the condition
4326169689Skan   further.  If ALLOW_CC_MODE is nonzero, allow the condition returned
4327169689Skan   to be a compare to a CC mode register.
4328169689Skan
4329169689Skan   If VALID_AT_INSN_P, the condition must be valid at both *EARLIEST
4330169689Skan   and at INSN.  */
4331169689Skan
4332117395Skanrtx
4333169689Skancanonicalize_condition (rtx insn, rtx cond, int reverse, rtx *earliest,
4334169689Skan			rtx want_reg, int allow_cc_mode, int valid_at_insn_p)
4335117395Skan{
4336169689Skan  enum rtx_code code;
4337169689Skan  rtx prev = insn;
4338169689Skan  rtx set;
4339169689Skan  rtx tem;
4340169689Skan  rtx op0, op1;
4341169689Skan  int reverse_code = 0;
4342169689Skan  enum machine_mode mode;
4343169689Skan  basic_block bb = BLOCK_FOR_INSN (insn);
4344117395Skan
4345169689Skan  code = GET_CODE (cond);
4346169689Skan  mode = GET_MODE (cond);
4347169689Skan  op0 = XEXP (cond, 0);
4348169689Skan  op1 = XEXP (cond, 1);
4349117395Skan
4350169689Skan  if (reverse)
4351169689Skan    code = reversed_comparison_code (cond, insn);
4352169689Skan  if (code == UNKNOWN)
4353169689Skan    return 0;
4354169689Skan
4355169689Skan  if (earliest)
4356169689Skan    *earliest = insn;
4357169689Skan
4358169689Skan  /* If we are comparing a register with zero, see if the register is set
4359169689Skan     in the previous insn to a COMPARE or a comparison operation.  Perform
4360169689Skan     the same tests as a function of STORE_FLAG_VALUE as find_comparison_args
4361169689Skan     in cse.c  */
4362169689Skan
4363169689Skan  while ((GET_RTX_CLASS (code) == RTX_COMPARE
4364169689Skan	  || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
4365169689Skan	 && op1 == CONST0_RTX (GET_MODE (op0))
4366169689Skan	 && op0 != want_reg)
4367117395Skan    {
4368169689Skan      /* Set nonzero when we find something of interest.  */
4369169689Skan      rtx x = 0;
4370169689Skan
4371169689Skan#ifdef HAVE_cc0
4372169689Skan      /* If comparison with cc0, import actual comparison from compare
4373169689Skan	 insn.  */
4374169689Skan      if (op0 == cc0_rtx)
4375169689Skan	{
4376169689Skan	  if ((prev = prev_nonnote_insn (prev)) == 0
4377169689Skan	      || !NONJUMP_INSN_P (prev)
4378169689Skan	      || (set = single_set (prev)) == 0
4379169689Skan	      || SET_DEST (set) != cc0_rtx)
4380169689Skan	    return 0;
4381169689Skan
4382169689Skan	  op0 = SET_SRC (set);
4383169689Skan	  op1 = CONST0_RTX (GET_MODE (op0));
4384169689Skan	  if (earliest)
4385169689Skan	    *earliest = prev;
4386169689Skan	}
4387169689Skan#endif
4388169689Skan
4389169689Skan      /* If this is a COMPARE, pick up the two things being compared.  */
4390169689Skan      if (GET_CODE (op0) == COMPARE)
4391169689Skan	{
4392169689Skan	  op1 = XEXP (op0, 1);
4393169689Skan	  op0 = XEXP (op0, 0);
4394169689Skan	  continue;
4395169689Skan	}
4396169689Skan      else if (!REG_P (op0))
4397169689Skan	break;
4398169689Skan
4399169689Skan      /* Go back to the previous insn.  Stop if it is not an INSN.  We also
4400169689Skan	 stop if it isn't a single set or if it has a REG_INC note because
4401169689Skan	 we don't want to bother dealing with it.  */
4402169689Skan
4403169689Skan      if ((prev = prev_nonnote_insn (prev)) == 0
4404169689Skan	  || !NONJUMP_INSN_P (prev)
4405169689Skan	  || FIND_REG_INC_NOTE (prev, NULL_RTX)
4406169689Skan	  /* In cfglayout mode, there do not have to be labels at the
4407169689Skan	     beginning of a block, or jumps at the end, so the previous
4408169689Skan	     conditions would not stop us when we reach bb boundary.  */
4409169689Skan	  || BLOCK_FOR_INSN (prev) != bb)
4410169689Skan	break;
4411169689Skan
4412169689Skan      set = set_of (op0, prev);
4413169689Skan
4414169689Skan      if (set
4415169689Skan	  && (GET_CODE (set) != SET
4416169689Skan	      || !rtx_equal_p (SET_DEST (set), op0)))
4417169689Skan	break;
4418169689Skan
4419169689Skan      /* If this is setting OP0, get what it sets it to if it looks
4420169689Skan	 relevant.  */
4421169689Skan      if (set)
4422169689Skan	{
4423169689Skan	  enum machine_mode inner_mode = GET_MODE (SET_DEST (set));
4424169689Skan#ifdef FLOAT_STORE_FLAG_VALUE
4425169689Skan	  REAL_VALUE_TYPE fsfv;
4426169689Skan#endif
4427169689Skan
4428169689Skan	  /* ??? We may not combine comparisons done in a CCmode with
4429169689Skan	     comparisons not done in a CCmode.  This is to aid targets
4430169689Skan	     like Alpha that have an IEEE compliant EQ instruction, and
4431169689Skan	     a non-IEEE compliant BEQ instruction.  The use of CCmode is
4432169689Skan	     actually artificial, simply to prevent the combination, but
4433169689Skan	     should not affect other platforms.
4434169689Skan
4435169689Skan	     However, we must allow VOIDmode comparisons to match either
4436169689Skan	     CCmode or non-CCmode comparison, because some ports have
4437169689Skan	     modeless comparisons inside branch patterns.
4438169689Skan
4439169689Skan	     ??? This mode check should perhaps look more like the mode check
4440169689Skan	     in simplify_comparison in combine.  */
4441169689Skan
4442169689Skan	  if ((GET_CODE (SET_SRC (set)) == COMPARE
4443169689Skan	       || (((code == NE
4444169689Skan		     || (code == LT
4445169689Skan			 && GET_MODE_CLASS (inner_mode) == MODE_INT
4446169689Skan			 && (GET_MODE_BITSIZE (inner_mode)
4447169689Skan			     <= HOST_BITS_PER_WIDE_INT)
4448169689Skan			 && (STORE_FLAG_VALUE
4449169689Skan			     & ((HOST_WIDE_INT) 1
4450169689Skan				<< (GET_MODE_BITSIZE (inner_mode) - 1))))
4451169689Skan#ifdef FLOAT_STORE_FLAG_VALUE
4452169689Skan		     || (code == LT
4453169689Skan			 && SCALAR_FLOAT_MODE_P (inner_mode)
4454169689Skan			 && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode),
4455169689Skan			     REAL_VALUE_NEGATIVE (fsfv)))
4456169689Skan#endif
4457169689Skan		     ))
4458169689Skan		   && COMPARISON_P (SET_SRC (set))))
4459169689Skan	      && (((GET_MODE_CLASS (mode) == MODE_CC)
4460169689Skan		   == (GET_MODE_CLASS (inner_mode) == MODE_CC))
4461169689Skan		  || mode == VOIDmode || inner_mode == VOIDmode))
4462169689Skan	    x = SET_SRC (set);
4463169689Skan	  else if (((code == EQ
4464169689Skan		     || (code == GE
4465169689Skan			 && (GET_MODE_BITSIZE (inner_mode)
4466169689Skan			     <= HOST_BITS_PER_WIDE_INT)
4467169689Skan			 && GET_MODE_CLASS (inner_mode) == MODE_INT
4468169689Skan			 && (STORE_FLAG_VALUE
4469169689Skan			     & ((HOST_WIDE_INT) 1
4470169689Skan				<< (GET_MODE_BITSIZE (inner_mode) - 1))))
4471169689Skan#ifdef FLOAT_STORE_FLAG_VALUE
4472169689Skan		     || (code == GE
4473169689Skan			 && SCALAR_FLOAT_MODE_P (inner_mode)
4474169689Skan			 && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode),
4475169689Skan			     REAL_VALUE_NEGATIVE (fsfv)))
4476169689Skan#endif
4477169689Skan		     ))
4478169689Skan		   && COMPARISON_P (SET_SRC (set))
4479169689Skan		   && (((GET_MODE_CLASS (mode) == MODE_CC)
4480169689Skan			== (GET_MODE_CLASS (inner_mode) == MODE_CC))
4481169689Skan		       || mode == VOIDmode || inner_mode == VOIDmode))
4482169689Skan
4483169689Skan	    {
4484169689Skan	      reverse_code = 1;
4485169689Skan	      x = SET_SRC (set);
4486169689Skan	    }
4487169689Skan	  else
4488169689Skan	    break;
4489169689Skan	}
4490169689Skan
4491169689Skan      else if (reg_set_p (op0, prev))
4492169689Skan	/* If this sets OP0, but not directly, we have to give up.  */
4493169689Skan	break;
4494169689Skan
4495169689Skan      if (x)
4496169689Skan	{
4497169689Skan	  /* If the caller is expecting the condition to be valid at INSN,
4498169689Skan	     make sure X doesn't change before INSN.  */
4499169689Skan	  if (valid_at_insn_p)
4500169689Skan	    if (modified_in_p (x, prev) || modified_between_p (x, prev, insn))
4501169689Skan	      break;
4502169689Skan	  if (COMPARISON_P (x))
4503169689Skan	    code = GET_CODE (x);
4504169689Skan	  if (reverse_code)
4505169689Skan	    {
4506169689Skan	      code = reversed_comparison_code (x, prev);
4507169689Skan	      if (code == UNKNOWN)
4508169689Skan		return 0;
4509169689Skan	      reverse_code = 0;
4510169689Skan	    }
4511169689Skan
4512169689Skan	  op0 = XEXP (x, 0), op1 = XEXP (x, 1);
4513169689Skan	  if (earliest)
4514169689Skan	    *earliest = prev;
4515169689Skan	}
4516117395Skan    }
4517117395Skan
4518169689Skan  /* If constant is first, put it last.  */
4519169689Skan  if (CONSTANT_P (op0))
4520169689Skan    code = swap_condition (code), tem = op0, op0 = op1, op1 = tem;
4521117395Skan
4522169689Skan  /* If OP0 is the result of a comparison, we weren't able to find what
4523169689Skan     was really being compared, so fail.  */
4524169689Skan  if (!allow_cc_mode
4525169689Skan      && GET_MODE_CLASS (GET_MODE (op0)) == MODE_CC)
4526169689Skan    return 0;
4527169689Skan
4528169689Skan  /* Canonicalize any ordered comparison with integers involving equality
4529169689Skan     if we can do computations in the relevant mode and we do not
4530169689Skan     overflow.  */
4531169689Skan
4532169689Skan  if (GET_MODE_CLASS (GET_MODE (op0)) != MODE_CC
4533169689Skan      && GET_CODE (op1) == CONST_INT
4534169689Skan      && GET_MODE (op0) != VOIDmode
4535169689Skan      && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT)
4536169689Skan    {
4537169689Skan      HOST_WIDE_INT const_val = INTVAL (op1);
4538169689Skan      unsigned HOST_WIDE_INT uconst_val = const_val;
4539169689Skan      unsigned HOST_WIDE_INT max_val
4540169689Skan	= (unsigned HOST_WIDE_INT) GET_MODE_MASK (GET_MODE (op0));
4541169689Skan
4542169689Skan      switch (code)
4543169689Skan	{
4544169689Skan	case LE:
4545169689Skan	  if ((unsigned HOST_WIDE_INT) const_val != max_val >> 1)
4546169689Skan	    code = LT, op1 = gen_int_mode (const_val + 1, GET_MODE (op0));
4547169689Skan	  break;
4548169689Skan
4549169689Skan	/* When cross-compiling, const_val might be sign-extended from
4550169689Skan	   BITS_PER_WORD to HOST_BITS_PER_WIDE_INT */
4551169689Skan	case GE:
4552169689Skan	  if ((HOST_WIDE_INT) (const_val & max_val)
4553169689Skan	      != (((HOST_WIDE_INT) 1
4554169689Skan		   << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
4555169689Skan	    code = GT, op1 = gen_int_mode (const_val - 1, GET_MODE (op0));
4556169689Skan	  break;
4557169689Skan
4558169689Skan	case LEU:
4559169689Skan	  if (uconst_val < max_val)
4560169689Skan	    code = LTU, op1 = gen_int_mode (uconst_val + 1, GET_MODE (op0));
4561169689Skan	  break;
4562169689Skan
4563169689Skan	case GEU:
4564169689Skan	  if (uconst_val != 0)
4565169689Skan	    code = GTU, op1 = gen_int_mode (uconst_val - 1, GET_MODE (op0));
4566169689Skan	  break;
4567169689Skan
4568169689Skan	default:
4569169689Skan	  break;
4570169689Skan	}
4571169689Skan    }
4572169689Skan
4573169689Skan  /* Never return CC0; return zero instead.  */
4574169689Skan  if (CC0_P (op0))
4575169689Skan    return 0;
4576169689Skan
4577169689Skan  return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
4578117395Skan}
4579132718Skan
4580169689Skan/* Given a jump insn JUMP, return the condition that will cause it to branch
4581169689Skan   to its JUMP_LABEL.  If the condition cannot be understood, or is an
4582169689Skan   inequality floating-point comparison which needs to be reversed, 0 will
4583169689Skan   be returned.
4584132718Skan
4585169689Skan   If EARLIEST is nonzero, it is a pointer to a place where the earliest
4586169689Skan   insn used in locating the condition was found.  If a replacement test
4587169689Skan   of the condition is desired, it should be placed in front of that
4588169689Skan   insn and we will be sure that the inputs are still valid.  If EARLIEST
4589169689Skan   is null, the returned condition will be valid at INSN.
4590169689Skan
4591169689Skan   If ALLOW_CC_MODE is nonzero, allow the condition returned to be a
4592169689Skan   compare CC mode register.
4593169689Skan
4594169689Skan   VALID_AT_INSN_P is the same as for canonicalize_condition.  */
4595169689Skan
4596169689Skanrtx
4597169689Skanget_condition (rtx jump, rtx *earliest, int allow_cc_mode, int valid_at_insn_p)
4598169689Skan{
4599169689Skan  rtx cond;
4600169689Skan  int reverse;
4601169689Skan  rtx set;
4602169689Skan
4603169689Skan  /* If this is not a standard conditional jump, we can't parse it.  */
4604169689Skan  if (!JUMP_P (jump)
4605169689Skan      || ! any_condjump_p (jump))
4606169689Skan    return 0;
4607169689Skan  set = pc_set (jump);
4608169689Skan
4609169689Skan  cond = XEXP (SET_SRC (set), 0);
4610169689Skan
4611169689Skan  /* If this branches to JUMP_LABEL when the condition is false, reverse
4612169689Skan     the condition.  */
4613169689Skan  reverse
4614169689Skan    = GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
4615169689Skan      && XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump);
4616169689Skan
4617169689Skan  return canonicalize_condition (jump, cond, reverse, earliest, NULL_RTX,
4618169689Skan				 allow_cc_mode, valid_at_insn_p);
4619169689Skan}
4620169689Skan
4621169689Skan/* Initialize the table NUM_SIGN_BIT_COPIES_IN_REP based on
4622169689Skan   TARGET_MODE_REP_EXTENDED.
4623169689Skan
4624169689Skan   Note that we assume that the property of
4625169689Skan   TARGET_MODE_REP_EXTENDED(B, C) is sticky to the integral modes
4626169689Skan   narrower than mode B.  I.e., if A is a mode narrower than B then in
4627169689Skan   order to be able to operate on it in mode B, mode A needs to
4628169689Skan   satisfy the requirements set by the representation of mode B.  */
4629169689Skan
4630169689Skanstatic void
4631169689Skaninit_num_sign_bit_copies_in_rep (void)
4632169689Skan{
4633169689Skan  enum machine_mode mode, in_mode;
4634169689Skan
4635169689Skan  for (in_mode = GET_CLASS_NARROWEST_MODE (MODE_INT); in_mode != VOIDmode;
4636169689Skan       in_mode = GET_MODE_WIDER_MODE (mode))
4637169689Skan    for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != in_mode;
4638169689Skan	 mode = GET_MODE_WIDER_MODE (mode))
4639169689Skan      {
4640169689Skan	enum machine_mode i;
4641169689Skan
4642169689Skan	/* Currently, it is assumed that TARGET_MODE_REP_EXTENDED
4643169689Skan	   extends to the next widest mode.  */
4644169689Skan	gcc_assert (targetm.mode_rep_extended (mode, in_mode) == UNKNOWN
4645169689Skan		    || GET_MODE_WIDER_MODE (mode) == in_mode);
4646169689Skan
4647169689Skan	/* We are in in_mode.  Count how many bits outside of mode
4648169689Skan	   have to be copies of the sign-bit.  */
4649169689Skan	for (i = mode; i != in_mode; i = GET_MODE_WIDER_MODE (i))
4650169689Skan	  {
4651169689Skan	    enum machine_mode wider = GET_MODE_WIDER_MODE (i);
4652169689Skan
4653169689Skan	    if (targetm.mode_rep_extended (i, wider) == SIGN_EXTEND
4654169689Skan		/* We can only check sign-bit copies starting from the
4655169689Skan		   top-bit.  In order to be able to check the bits we
4656169689Skan		   have already seen we pretend that subsequent bits
4657169689Skan		   have to be sign-bit copies too.  */
4658169689Skan		|| num_sign_bit_copies_in_rep [in_mode][mode])
4659169689Skan	      num_sign_bit_copies_in_rep [in_mode][mode]
4660169689Skan		+= GET_MODE_BITSIZE (wider) - GET_MODE_BITSIZE (i);
4661169689Skan	  }
4662169689Skan      }
4663169689Skan}
4664169689Skan
4665169689Skan/* Suppose that truncation from the machine mode of X to MODE is not a
4666169689Skan   no-op.  See if there is anything special about X so that we can
4667169689Skan   assume it already contains a truncated value of MODE.  */
4668169689Skan
4669132718Skanbool
4670169689Skantruncated_to_mode (enum machine_mode mode, rtx x)
4671132718Skan{
4672169689Skan  /* This register has already been used in MODE without explicit
4673169689Skan     truncation.  */
4674169689Skan  if (REG_P (x) && rtl_hooks.reg_truncated_to_mode (mode, x))
4675169689Skan    return true;
4676132718Skan
4677169689Skan  /* See if we already satisfy the requirements of MODE.  If yes we
4678169689Skan     can just switch to MODE.  */
4679169689Skan  if (num_sign_bit_copies_in_rep[GET_MODE (x)][mode]
4680169689Skan      && (num_sign_bit_copies (x, GET_MODE (x))
4681169689Skan	  >= num_sign_bit_copies_in_rep[GET_MODE (x)][mode] + 1))
4682132718Skan    return true;
4683132718Skan
4684169689Skan  return false;
4685169689Skan}
4686169689Skan
4687169689Skan/* Initialize non_rtx_starting_operands, which is used to speed up
4688169689Skan   for_each_rtx.  */
4689169689Skanvoid
4690169689Skaninit_rtlanal (void)
4691169689Skan{
4692169689Skan  int i;
4693169689Skan  for (i = 0; i < NUM_RTX_CODE; i++)
4694132718Skan    {
4695169689Skan      const char *format = GET_RTX_FORMAT (i);
4696169689Skan      const char *first = strpbrk (format, "eEV");
4697169689Skan      non_rtx_starting_operands[i] = first ? first - format : -1;
4698132718Skan    }
4699132718Skan
4700169689Skan  init_num_sign_bit_copies_in_rep ();
4701132718Skan}
4702169689Skan
4703169689Skan/* Check whether this is a constant pool constant.  */
4704169689Skanbool
4705169689Skanconstant_pool_constant_p (rtx x)
4706169689Skan{
4707169689Skan  x = avoid_constant_pool_reference (x);
4708169689Skan  return GET_CODE (x) == CONST_DOUBLE;
4709169689Skan}
4710132718Skan
4711