OSDN Git Service

Emit DW_AT_ranges for inlined subroutines that contain disjoint blocks.
[pf3gnuchains/gcc-fork.git] / gcc / emit-rtl.c
1 /* Emit RTL for the GCC expander.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22
23 /* Middle-to-low level generation of rtx code and insns.
24
25    This file contains support functions for creating rtl expressions
26    and manipulating them in the doubly-linked chain of insns.
27
28    The patterns of the insns are created by machine-dependent
29    routines in insn-emit.c, which is generated automatically from
30    the machine description.  These routines make the individual rtx's
31    of the pattern with `gen_rtx_fmt_ee' and others in genrtl.[ch],
32    which are automatically generated from rtl.def; what is machine
33    dependent is the kind of rtx's they make and what arguments they
34    use.  */
35
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40 #include "toplev.h"
41 #include "rtl.h"
42 #include "tree.h"
43 #include "tm_p.h"
44 #include "flags.h"
45 #include "function.h"
46 #include "expr.h"
47 #include "regs.h"
48 #include "hard-reg-set.h"
49 #include "hashtab.h"
50 #include "insn-config.h"
51 #include "recog.h"
52 #include "real.h"
53 #include "bitmap.h"
54 #include "basic-block.h"
55 #include "ggc.h"
56 #include "debug.h"
57 #include "langhooks.h"
58
59 /* Commonly used modes.  */
60
61 enum machine_mode byte_mode;    /* Mode whose width is BITS_PER_UNIT.  */
62 enum machine_mode word_mode;    /* Mode whose width is BITS_PER_WORD.  */
63 enum machine_mode double_mode;  /* Mode whose width is DOUBLE_TYPE_SIZE.  */
64 enum machine_mode ptr_mode;     /* Mode whose width is POINTER_SIZE.  */
65
66
67 /* This is *not* reset after each function.  It gives each CODE_LABEL
68    in the entire compilation a unique label number.  */
69
70 static GTY(()) int label_num = 1;
71
72 /* Nonzero means do not generate NOTEs for source line numbers.  */
73
74 static int no_line_numbers;
75
76 /* Commonly used rtx's, so that we only need space for one copy.
77    These are initialized once for the entire compilation.
78    All of these are unique; no other rtx-object will be equal to any
79    of these.  */
80
81 rtx global_rtl[GR_MAX];
82
83 /* Commonly used RTL for hard registers.  These objects are not necessarily
84    unique, so we allocate them separately from global_rtl.  They are
85    initialized once per compilation unit, then copied into regno_reg_rtx
86    at the beginning of each function.  */
87 static GTY(()) rtx static_regno_reg_rtx[FIRST_PSEUDO_REGISTER];
88
89 /* We record floating-point CONST_DOUBLEs in each floating-point mode for
90    the values of 0, 1, and 2.  For the integer entries and VOIDmode, we
91    record a copy of const[012]_rtx.  */
92
93 rtx const_tiny_rtx[3][(int) MAX_MACHINE_MODE];
94
95 rtx const_true_rtx;
96
97 REAL_VALUE_TYPE dconst0;
98 REAL_VALUE_TYPE dconst1;
99 REAL_VALUE_TYPE dconst2;
100 REAL_VALUE_TYPE dconst3;
101 REAL_VALUE_TYPE dconst10;
102 REAL_VALUE_TYPE dconstm1;
103 REAL_VALUE_TYPE dconstm2;
104 REAL_VALUE_TYPE dconsthalf;
105 REAL_VALUE_TYPE dconstthird;
106 REAL_VALUE_TYPE dconstpi;
107 REAL_VALUE_TYPE dconste;
108
109 /* All references to the following fixed hard registers go through
110    these unique rtl objects.  On machines where the frame-pointer and
111    arg-pointer are the same register, they use the same unique object.
112
113    After register allocation, other rtl objects which used to be pseudo-regs
114    may be clobbered to refer to the frame-pointer register.
115    But references that were originally to the frame-pointer can be
116    distinguished from the others because they contain frame_pointer_rtx.
117
118    When to use frame_pointer_rtx and hard_frame_pointer_rtx is a little
119    tricky: until register elimination has taken place hard_frame_pointer_rtx
120    should be used if it is being set, and frame_pointer_rtx otherwise.  After
121    register elimination hard_frame_pointer_rtx should always be used.
122    On machines where the two registers are same (most) then these are the
123    same.
124
125    In an inline procedure, the stack and frame pointer rtxs may not be
126    used for anything else.  */
127 rtx static_chain_rtx;           /* (REG:Pmode STATIC_CHAIN_REGNUM) */
128 rtx static_chain_incoming_rtx;  /* (REG:Pmode STATIC_CHAIN_INCOMING_REGNUM) */
129 rtx pic_offset_table_rtx;       /* (REG:Pmode PIC_OFFSET_TABLE_REGNUM) */
130
131 /* This is used to implement __builtin_return_address for some machines.
132    See for instance the MIPS port.  */
133 rtx return_address_pointer_rtx; /* (REG:Pmode RETURN_ADDRESS_POINTER_REGNUM) */
134
135 /* We make one copy of (const_int C) where C is in
136    [- MAX_SAVED_CONST_INT, MAX_SAVED_CONST_INT]
137    to save space during the compilation and simplify comparisons of
138    integers.  */
139
140 rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
141
142 /* A hash table storing CONST_INTs whose absolute value is greater
143    than MAX_SAVED_CONST_INT.  */
144
145 static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
146      htab_t const_int_htab;
147
148 /* A hash table storing memory attribute structures.  */
149 static GTY ((if_marked ("ggc_marked_p"), param_is (struct mem_attrs)))
150      htab_t mem_attrs_htab;
151
152 /* A hash table storing register attribute structures.  */
153 static GTY ((if_marked ("ggc_marked_p"), param_is (struct reg_attrs)))
154      htab_t reg_attrs_htab;
155
156 /* A hash table storing all CONST_DOUBLEs.  */
157 static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
158      htab_t const_double_htab;
159
160 #define first_insn (cfun->emit->x_first_insn)
161 #define last_insn (cfun->emit->x_last_insn)
162 #define cur_insn_uid (cfun->emit->x_cur_insn_uid)
163 #define last_location (cfun->emit->x_last_location)
164 #define first_label_num (cfun->emit->x_first_label_num)
165
166 static rtx make_jump_insn_raw (rtx);
167 static rtx make_call_insn_raw (rtx);
168 static rtx find_line_note (rtx);
169 static rtx change_address_1 (rtx, enum machine_mode, rtx, int);
170 static void unshare_all_decls (tree);
171 static void reset_used_decls (tree);
172 static void mark_label_nuses (rtx);
173 static hashval_t const_int_htab_hash (const void *);
174 static int const_int_htab_eq (const void *, const void *);
175 static hashval_t const_double_htab_hash (const void *);
176 static int const_double_htab_eq (const void *, const void *);
177 static rtx lookup_const_double (rtx);
178 static hashval_t mem_attrs_htab_hash (const void *);
179 static int mem_attrs_htab_eq (const void *, const void *);
180 static mem_attrs *get_mem_attrs (HOST_WIDE_INT, tree, rtx, rtx, unsigned int,
181                                  enum machine_mode);
182 static hashval_t reg_attrs_htab_hash (const void *);
183 static int reg_attrs_htab_eq (const void *, const void *);
184 static reg_attrs *get_reg_attrs (tree, int);
185 static tree component_ref_for_mem_expr (tree);
186 static rtx gen_const_vector (enum machine_mode, int);
187 static void copy_rtx_if_shared_1 (rtx *orig);
188
189 /* Probability of the conditional branch currently proceeded by try_split.
190    Set to -1 otherwise.  */
191 int split_branch_probability = -1;
192 \f
193 /* Returns a hash code for X (which is a really a CONST_INT).  */
194
195 static hashval_t
196 const_int_htab_hash (const void *x)
197 {
198   return (hashval_t) INTVAL ((rtx) x);
199 }
200
201 /* Returns nonzero if the value represented by X (which is really a
202    CONST_INT) is the same as that given by Y (which is really a
203    HOST_WIDE_INT *).  */
204
205 static int
206 const_int_htab_eq (const void *x, const void *y)
207 {
208   return (INTVAL ((rtx) x) == *((const HOST_WIDE_INT *) y));
209 }
210
211 /* Returns a hash code for X (which is really a CONST_DOUBLE).  */
212 static hashval_t
213 const_double_htab_hash (const void *x)
214 {
215   rtx value = (rtx) x;
216   hashval_t h;
217
218   if (GET_MODE (value) == VOIDmode)
219     h = CONST_DOUBLE_LOW (value) ^ CONST_DOUBLE_HIGH (value);
220   else
221     {
222       h = real_hash (CONST_DOUBLE_REAL_VALUE (value));
223       /* MODE is used in the comparison, so it should be in the hash.  */
224       h ^= GET_MODE (value);
225     }
226   return h;
227 }
228
229 /* Returns nonzero if the value represented by X (really a ...)
230    is the same as that represented by Y (really a ...) */
231 static int
232 const_double_htab_eq (const void *x, const void *y)
233 {
234   rtx a = (rtx)x, b = (rtx)y;
235
236   if (GET_MODE (a) != GET_MODE (b))
237     return 0;
238   if (GET_MODE (a) == VOIDmode)
239     return (CONST_DOUBLE_LOW (a) == CONST_DOUBLE_LOW (b)
240             && CONST_DOUBLE_HIGH (a) == CONST_DOUBLE_HIGH (b));
241   else
242     return real_identical (CONST_DOUBLE_REAL_VALUE (a),
243                            CONST_DOUBLE_REAL_VALUE (b));
244 }
245
246 /* Returns a hash code for X (which is a really a mem_attrs *).  */
247
248 static hashval_t
249 mem_attrs_htab_hash (const void *x)
250 {
251   mem_attrs *p = (mem_attrs *) x;
252
253   return (p->alias ^ (p->align * 1000)
254           ^ ((p->offset ? INTVAL (p->offset) : 0) * 50000)
255           ^ ((p->size ? INTVAL (p->size) : 0) * 2500000)
256           ^ (size_t) p->expr);
257 }
258
259 /* Returns nonzero if the value represented by X (which is really a
260    mem_attrs *) is the same as that given by Y (which is also really a
261    mem_attrs *).  */
262
263 static int
264 mem_attrs_htab_eq (const void *x, const void *y)
265 {
266   mem_attrs *p = (mem_attrs *) x;
267   mem_attrs *q = (mem_attrs *) y;
268
269   return (p->alias == q->alias && p->expr == q->expr && p->offset == q->offset
270           && p->size == q->size && p->align == q->align);
271 }
272
273 /* Allocate a new mem_attrs structure and insert it into the hash table if
274    one identical to it is not already in the table.  We are doing this for
275    MEM of mode MODE.  */
276
277 static mem_attrs *
278 get_mem_attrs (HOST_WIDE_INT alias, tree expr, rtx offset, rtx size,
279                unsigned int align, enum machine_mode mode)
280 {
281   mem_attrs attrs;
282   void **slot;
283
284   /* If everything is the default, we can just return zero.
285      This must match what the corresponding MEM_* macros return when the
286      field is not present.  */
287   if (alias == 0 && expr == 0 && offset == 0
288       && (size == 0
289           || (mode != BLKmode && GET_MODE_SIZE (mode) == INTVAL (size)))
290       && (STRICT_ALIGNMENT && mode != BLKmode
291           ? align == GET_MODE_ALIGNMENT (mode) : align == BITS_PER_UNIT))
292     return 0;
293
294   attrs.alias = alias;
295   attrs.expr = expr;
296   attrs.offset = offset;
297   attrs.size = size;
298   attrs.align = align;
299
300   slot = htab_find_slot (mem_attrs_htab, &attrs, INSERT);
301   if (*slot == 0)
302     {
303       *slot = ggc_alloc (sizeof (mem_attrs));
304       memcpy (*slot, &attrs, sizeof (mem_attrs));
305     }
306
307   return *slot;
308 }
309
310 /* Returns a hash code for X (which is a really a reg_attrs *).  */
311
312 static hashval_t
313 reg_attrs_htab_hash (const void *x)
314 {
315   reg_attrs *p = (reg_attrs *) x;
316
317   return ((p->offset * 1000) ^ (long) p->decl);
318 }
319
320 /* Returns nonzero if the value represented by X (which is really a
321    reg_attrs *) is the same as that given by Y (which is also really a
322    reg_attrs *).  */
323
324 static int
325 reg_attrs_htab_eq (const void *x, const void *y)
326 {
327   reg_attrs *p = (reg_attrs *) x;
328   reg_attrs *q = (reg_attrs *) y;
329
330   return (p->decl == q->decl && p->offset == q->offset);
331 }
332 /* Allocate a new reg_attrs structure and insert it into the hash table if
333    one identical to it is not already in the table.  We are doing this for
334    MEM of mode MODE.  */
335
336 static reg_attrs *
337 get_reg_attrs (tree decl, int offset)
338 {
339   reg_attrs attrs;
340   void **slot;
341
342   /* If everything is the default, we can just return zero.  */
343   if (decl == 0 && offset == 0)
344     return 0;
345
346   attrs.decl = decl;
347   attrs.offset = offset;
348
349   slot = htab_find_slot (reg_attrs_htab, &attrs, INSERT);
350   if (*slot == 0)
351     {
352       *slot = ggc_alloc (sizeof (reg_attrs));
353       memcpy (*slot, &attrs, sizeof (reg_attrs));
354     }
355
356   return *slot;
357 }
358
359 /* Generate a new REG rtx.  Make sure ORIGINAL_REGNO is set properly, and
360    don't attempt to share with the various global pieces of rtl (such as
361    frame_pointer_rtx).  */
362
363 rtx
364 gen_raw_REG (enum machine_mode mode, int regno)
365 {
366   rtx x = gen_rtx_raw_REG (mode, regno);
367   ORIGINAL_REGNO (x) = regno;
368   return x;
369 }
370
371 /* There are some RTL codes that require special attention; the generation
372    functions do the raw handling.  If you add to this list, modify
373    special_rtx in gengenrtl.c as well.  */
374
375 rtx
376 gen_rtx_CONST_INT (enum machine_mode mode ATTRIBUTE_UNUSED, HOST_WIDE_INT arg)
377 {
378   void **slot;
379
380   if (arg >= - MAX_SAVED_CONST_INT && arg <= MAX_SAVED_CONST_INT)
381     return const_int_rtx[arg + MAX_SAVED_CONST_INT];
382
383 #if STORE_FLAG_VALUE != 1 && STORE_FLAG_VALUE != -1
384   if (const_true_rtx && arg == STORE_FLAG_VALUE)
385     return const_true_rtx;
386 #endif
387
388   /* Look up the CONST_INT in the hash table.  */
389   slot = htab_find_slot_with_hash (const_int_htab, &arg,
390                                    (hashval_t) arg, INSERT);
391   if (*slot == 0)
392     *slot = gen_rtx_raw_CONST_INT (VOIDmode, arg);
393
394   return (rtx) *slot;
395 }
396
397 rtx
398 gen_int_mode (HOST_WIDE_INT c, enum machine_mode mode)
399 {
400   return GEN_INT (trunc_int_for_mode (c, mode));
401 }
402
403 /* CONST_DOUBLEs might be created from pairs of integers, or from
404    REAL_VALUE_TYPEs.  Also, their length is known only at run time,
405    so we cannot use gen_rtx_raw_CONST_DOUBLE.  */
406
407 /* Determine whether REAL, a CONST_DOUBLE, already exists in the
408    hash table.  If so, return its counterpart; otherwise add it
409    to the hash table and return it.  */
410 static rtx
411 lookup_const_double (rtx real)
412 {
413   void **slot = htab_find_slot (const_double_htab, real, INSERT);
414   if (*slot == 0)
415     *slot = real;
416
417   return (rtx) *slot;
418 }
419
420 /* Return a CONST_DOUBLE rtx for a floating-point value specified by
421    VALUE in mode MODE.  */
422 rtx
423 const_double_from_real_value (REAL_VALUE_TYPE value, enum machine_mode mode)
424 {
425   rtx real = rtx_alloc (CONST_DOUBLE);
426   PUT_MODE (real, mode);
427
428   memcpy (&CONST_DOUBLE_LOW (real), &value, sizeof (REAL_VALUE_TYPE));
429
430   return lookup_const_double (real);
431 }
432
433 /* Return a CONST_DOUBLE or CONST_INT for a value specified as a pair
434    of ints: I0 is the low-order word and I1 is the high-order word.
435    Do not use this routine for non-integer modes; convert to
436    REAL_VALUE_TYPE and use CONST_DOUBLE_FROM_REAL_VALUE.  */
437
438 rtx
439 immed_double_const (HOST_WIDE_INT i0, HOST_WIDE_INT i1, enum machine_mode mode)
440 {
441   rtx value;
442   unsigned int i;
443
444   if (mode != VOIDmode)
445     {
446       int width;
447       
448       gcc_assert (GET_MODE_CLASS (mode) == MODE_INT
449                   || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT
450                   /* We can get a 0 for an error mark.  */
451                   || GET_MODE_CLASS (mode) == MODE_VECTOR_INT
452                   || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT);
453
454       /* We clear out all bits that don't belong in MODE, unless they and
455          our sign bit are all one.  So we get either a reasonable negative
456          value or a reasonable unsigned value for this mode.  */
457       width = GET_MODE_BITSIZE (mode);
458       if (width < HOST_BITS_PER_WIDE_INT
459           && ((i0 & ((HOST_WIDE_INT) (-1) << (width - 1)))
460               != ((HOST_WIDE_INT) (-1) << (width - 1))))
461         i0 &= ((HOST_WIDE_INT) 1 << width) - 1, i1 = 0;
462       else if (width == HOST_BITS_PER_WIDE_INT
463                && ! (i1 == ~0 && i0 < 0))
464         i1 = 0;
465       else
466         /* We should be able to represent this value as a constant.  */
467         gcc_assert (width <= 2 * HOST_BITS_PER_WIDE_INT);
468
469       /* If this would be an entire word for the target, but is not for
470          the host, then sign-extend on the host so that the number will
471          look the same way on the host that it would on the target.
472
473          For example, when building a 64 bit alpha hosted 32 bit sparc
474          targeted compiler, then we want the 32 bit unsigned value -1 to be
475          represented as a 64 bit value -1, and not as 0x00000000ffffffff.
476          The latter confuses the sparc backend.  */
477
478       if (width < HOST_BITS_PER_WIDE_INT
479           && (i0 & ((HOST_WIDE_INT) 1 << (width - 1))))
480         i0 |= ((HOST_WIDE_INT) (-1) << width);
481
482       /* If MODE fits within HOST_BITS_PER_WIDE_INT, always use a
483          CONST_INT.
484
485          ??? Strictly speaking, this is wrong if we create a CONST_INT for
486          a large unsigned constant with the size of MODE being
487          HOST_BITS_PER_WIDE_INT and later try to interpret that constant
488          in a wider mode.  In that case we will mis-interpret it as a
489          negative number.
490
491          Unfortunately, the only alternative is to make a CONST_DOUBLE for
492          any constant in any mode if it is an unsigned constant larger
493          than the maximum signed integer in an int on the host.  However,
494          doing this will break everyone that always expects to see a
495          CONST_INT for SImode and smaller.
496
497          We have always been making CONST_INTs in this case, so nothing
498          new is being broken.  */
499
500       if (width <= HOST_BITS_PER_WIDE_INT)
501         i1 = (i0 < 0) ? ~(HOST_WIDE_INT) 0 : 0;
502     }
503
504   /* If this integer fits in one word, return a CONST_INT.  */
505   if ((i1 == 0 && i0 >= 0) || (i1 == ~0 && i0 < 0))
506     return GEN_INT (i0);
507
508   /* We use VOIDmode for integers.  */
509   value = rtx_alloc (CONST_DOUBLE);
510   PUT_MODE (value, VOIDmode);
511
512   CONST_DOUBLE_LOW (value) = i0;
513   CONST_DOUBLE_HIGH (value) = i1;
514
515   for (i = 2; i < (sizeof CONST_DOUBLE_FORMAT - 1); i++)
516     XWINT (value, i) = 0;
517
518   return lookup_const_double (value);
519 }
520
521 rtx
522 gen_rtx_REG (enum machine_mode mode, unsigned int regno)
523 {
524   /* In case the MD file explicitly references the frame pointer, have
525      all such references point to the same frame pointer.  This is
526      used during frame pointer elimination to distinguish the explicit
527      references to these registers from pseudos that happened to be
528      assigned to them.
529
530      If we have eliminated the frame pointer or arg pointer, we will
531      be using it as a normal register, for example as a spill
532      register.  In such cases, we might be accessing it in a mode that
533      is not Pmode and therefore cannot use the pre-allocated rtx.
534
535      Also don't do this when we are making new REGs in reload, since
536      we don't want to get confused with the real pointers.  */
537
538   if (mode == Pmode && !reload_in_progress)
539     {
540       if (regno == FRAME_POINTER_REGNUM
541           && (!reload_completed || frame_pointer_needed))
542         return frame_pointer_rtx;
543 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
544       if (regno == HARD_FRAME_POINTER_REGNUM
545           && (!reload_completed || frame_pointer_needed))
546         return hard_frame_pointer_rtx;
547 #endif
548 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM && HARD_FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
549       if (regno == ARG_POINTER_REGNUM)
550         return arg_pointer_rtx;
551 #endif
552 #ifdef RETURN_ADDRESS_POINTER_REGNUM
553       if (regno == RETURN_ADDRESS_POINTER_REGNUM)
554         return return_address_pointer_rtx;
555 #endif
556       if (regno == (unsigned) PIC_OFFSET_TABLE_REGNUM
557           && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
558         return pic_offset_table_rtx;
559       if (regno == STACK_POINTER_REGNUM)
560         return stack_pointer_rtx;
561     }
562
563 #if 0
564   /* If the per-function register table has been set up, try to re-use
565      an existing entry in that table to avoid useless generation of RTL.
566
567      This code is disabled for now until we can fix the various backends
568      which depend on having non-shared hard registers in some cases.   Long
569      term we want to re-enable this code as it can significantly cut down
570      on the amount of useless RTL that gets generated.
571
572      We'll also need to fix some code that runs after reload that wants to
573      set ORIGINAL_REGNO.  */
574
575   if (cfun
576       && cfun->emit
577       && regno_reg_rtx
578       && regno < FIRST_PSEUDO_REGISTER
579       && reg_raw_mode[regno] == mode)
580     return regno_reg_rtx[regno];
581 #endif
582
583   return gen_raw_REG (mode, regno);
584 }
585
586 rtx
587 gen_rtx_MEM (enum machine_mode mode, rtx addr)
588 {
589   rtx rt = gen_rtx_raw_MEM (mode, addr);
590
591   /* This field is not cleared by the mere allocation of the rtx, so
592      we clear it here.  */
593   MEM_ATTRS (rt) = 0;
594
595   return rt;
596 }
597
598 /* Generate a memory referring to non-trapping constant memory.  */
599
600 rtx
601 gen_const_mem (enum machine_mode mode, rtx addr)
602 {
603   rtx mem = gen_rtx_MEM (mode, addr);
604   MEM_READONLY_P (mem) = 1;
605   MEM_NOTRAP_P (mem) = 1;
606   return mem;
607 }
608
609 /* We want to create (subreg:OMODE (obj:IMODE) OFFSET).  Return true if
610    this construct would be valid, and false otherwise.  */
611
612 bool
613 validate_subreg (enum machine_mode omode, enum machine_mode imode,
614                  rtx reg, unsigned int offset)
615 {
616   unsigned int isize = GET_MODE_SIZE (imode);
617   unsigned int osize = GET_MODE_SIZE (omode);
618
619   /* All subregs must be aligned.  */
620   if (offset % osize != 0)
621     return false;
622
623   /* The subreg offset cannot be outside the inner object.  */
624   if (offset >= isize)
625     return false;
626
627   /* ??? This should not be here.  Temporarily continue to allow word_mode
628      subregs of anything.  The most common offender is (subreg:SI (reg:DF)).
629      Generally, backends are doing something sketchy but it'll take time to
630      fix them all.  */
631   if (omode == word_mode)
632     ;
633   /* ??? Similarly, e.g. with (subreg:DF (reg:TI)).  Though store_bit_field
634      is the culprit here, and not the backends.  */
635   else if (osize >= UNITS_PER_WORD && isize >= osize)
636     ;
637   /* Allow component subregs of complex and vector.  Though given the below
638      extraction rules, it's not always clear what that means.  */
639   else if ((COMPLEX_MODE_P (imode) || VECTOR_MODE_P (imode))
640            && GET_MODE_INNER (imode) == omode)
641     ;
642   /* ??? x86 sse code makes heavy use of *paradoxical* vector subregs,
643      i.e. (subreg:V4SF (reg:SF) 0).  This surely isn't the cleanest way to
644      represent this.  It's questionable if this ought to be represented at
645      all -- why can't this all be hidden in post-reload splitters that make
646      arbitrarily mode changes to the registers themselves.  */
647   else if (VECTOR_MODE_P (omode) && GET_MODE_INNER (omode) == imode)
648     ;
649   /* Subregs involving floating point modes are not allowed to
650      change size.  Therefore (subreg:DI (reg:DF) 0) is fine, but
651      (subreg:SI (reg:DF) 0) isn't.  */
652   else if (FLOAT_MODE_P (imode) || FLOAT_MODE_P (omode))
653     {
654       if (isize != osize)
655         return false;
656     }
657
658   /* Paradoxical subregs must have offset zero.  */
659   if (osize > isize)
660     return offset == 0;
661
662   /* This is a normal subreg.  Verify that the offset is representable.  */
663
664   /* For hard registers, we already have most of these rules collected in
665      subreg_offset_representable_p.  */
666   if (reg && REG_P (reg) && HARD_REGISTER_P (reg))
667     {
668       unsigned int regno = REGNO (reg);
669
670 #ifdef CANNOT_CHANGE_MODE_CLASS
671       if ((COMPLEX_MODE_P (imode) || VECTOR_MODE_P (imode))
672           && GET_MODE_INNER (imode) == omode)
673         ;
674       else if (REG_CANNOT_CHANGE_MODE_P (regno, imode, omode))
675         return false;
676 #endif
677
678       return subreg_offset_representable_p (regno, imode, offset, omode);
679     }
680
681   /* For pseudo registers, we want most of the same checks.  Namely:
682      If the register no larger than a word, the subreg must be lowpart.
683      If the register is larger than a word, the subreg must be the lowpart
684      of a subword.  A subreg does *not* perform arbitrary bit extraction.
685      Given that we've already checked mode/offset alignment, we only have
686      to check subword subregs here.  */
687   if (osize < UNITS_PER_WORD)
688     {
689       enum machine_mode wmode = isize > UNITS_PER_WORD ? word_mode : imode;
690       unsigned int low_off = subreg_lowpart_offset (omode, wmode);
691       if (offset % UNITS_PER_WORD != low_off)
692         return false;
693     }
694   return true;
695 }
696
697 rtx
698 gen_rtx_SUBREG (enum machine_mode mode, rtx reg, int offset)
699 {
700   gcc_assert (validate_subreg (mode, GET_MODE (reg), reg, offset));
701   return gen_rtx_raw_SUBREG (mode, reg, offset);
702 }
703
704 /* Generate a SUBREG representing the least-significant part of REG if MODE
705    is smaller than mode of REG, otherwise paradoxical SUBREG.  */
706
707 rtx
708 gen_lowpart_SUBREG (enum machine_mode mode, rtx reg)
709 {
710   enum machine_mode inmode;
711
712   inmode = GET_MODE (reg);
713   if (inmode == VOIDmode)
714     inmode = mode;
715   return gen_rtx_SUBREG (mode, reg,
716                          subreg_lowpart_offset (mode, inmode));
717 }
718 \f
719 /* gen_rtvec (n, [rt1, ..., rtn])
720 **
721 **          This routine creates an rtvec and stores within it the
722 **      pointers to rtx's which are its arguments.
723 */
724
725 /*VARARGS1*/
726 rtvec
727 gen_rtvec (int n, ...)
728 {
729   int i, save_n;
730   rtx *vector;
731   va_list p;
732
733   va_start (p, n);
734
735   if (n == 0)
736     return NULL_RTVEC;          /* Don't allocate an empty rtvec...     */
737
738   vector = alloca (n * sizeof (rtx));
739
740   for (i = 0; i < n; i++)
741     vector[i] = va_arg (p, rtx);
742
743   /* The definition of VA_* in K&R C causes `n' to go out of scope.  */
744   save_n = n;
745   va_end (p);
746
747   return gen_rtvec_v (save_n, vector);
748 }
749
750 rtvec
751 gen_rtvec_v (int n, rtx *argp)
752 {
753   int i;
754   rtvec rt_val;
755
756   if (n == 0)
757     return NULL_RTVEC;          /* Don't allocate an empty rtvec...     */
758
759   rt_val = rtvec_alloc (n);     /* Allocate an rtvec...                 */
760
761   for (i = 0; i < n; i++)
762     rt_val->elem[i] = *argp++;
763
764   return rt_val;
765 }
766 \f
767 /* Generate a REG rtx for a new pseudo register of mode MODE.
768    This pseudo is assigned the next sequential register number.  */
769
770 rtx
771 gen_reg_rtx (enum machine_mode mode)
772 {
773   struct function *f = cfun;
774   rtx val;
775
776   /* Don't let anything called after initial flow analysis create new
777      registers.  */
778   gcc_assert (!no_new_pseudos);
779
780   if (generating_concat_p
781       && (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
782           || GET_MODE_CLASS (mode) == MODE_COMPLEX_INT))
783     {
784       /* For complex modes, don't make a single pseudo.
785          Instead, make a CONCAT of two pseudos.
786          This allows noncontiguous allocation of the real and imaginary parts,
787          which makes much better code.  Besides, allocating DCmode
788          pseudos overstrains reload on some machines like the 386.  */
789       rtx realpart, imagpart;
790       enum machine_mode partmode = GET_MODE_INNER (mode);
791
792       realpart = gen_reg_rtx (partmode);
793       imagpart = gen_reg_rtx (partmode);
794       return gen_rtx_CONCAT (mode, realpart, imagpart);
795     }
796
797   /* Make sure regno_pointer_align, and regno_reg_rtx are large
798      enough to have an element for this pseudo reg number.  */
799
800   if (reg_rtx_no == f->emit->regno_pointer_align_length)
801     {
802       int old_size = f->emit->regno_pointer_align_length;
803       char *new;
804       rtx *new1;
805
806       new = ggc_realloc (f->emit->regno_pointer_align, old_size * 2);
807       memset (new + old_size, 0, old_size);
808       f->emit->regno_pointer_align = (unsigned char *) new;
809
810       new1 = ggc_realloc (f->emit->x_regno_reg_rtx,
811                           old_size * 2 * sizeof (rtx));
812       memset (new1 + old_size, 0, old_size * sizeof (rtx));
813       regno_reg_rtx = new1;
814
815       f->emit->regno_pointer_align_length = old_size * 2;
816     }
817
818   val = gen_raw_REG (mode, reg_rtx_no);
819   regno_reg_rtx[reg_rtx_no++] = val;
820   return val;
821 }
822
823 /* Generate a register with same attributes as REG, but offsetted by OFFSET.
824    Do the big endian correction if needed.  */
825
826 rtx
827 gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno, int offset)
828 {
829   rtx new = gen_rtx_REG (mode, regno);
830   tree decl;
831   HOST_WIDE_INT var_size;
832
833   /* PR middle-end/14084
834      The problem appears when a variable is stored in a larger register
835      and later it is used in the original mode or some mode in between
836      or some part of variable is accessed.
837
838      On little endian machines there is no problem because
839      the REG_OFFSET of the start of the variable is the same when
840      accessed in any mode (it is 0).
841
842      However, this is not true on big endian machines.
843      The offset of the start of the variable is different when accessed
844      in different modes.
845      When we are taking a part of the REG we have to change the OFFSET
846      from offset WRT size of mode of REG to offset WRT size of variable.
847
848      If we would not do the big endian correction the resulting REG_OFFSET
849      would be larger than the size of the DECL.
850
851      Examples of correction, for BYTES_BIG_ENDIAN WORDS_BIG_ENDIAN machine:
852
853      REG.mode  MODE  DECL size  old offset  new offset  description
854      DI        SI    4          4           0           int32 in SImode
855      DI        SI    1          4           0           char in SImode
856      DI        QI    1          7           0           char in QImode
857      DI        QI    4          5           1           1st element in QImode
858                                                         of char[4]
859      DI        HI    4          6           2           1st element in HImode
860                                                         of int16[2]
861
862      If the size of DECL is equal or greater than the size of REG
863      we can't do this correction because the register holds the
864      whole variable or a part of the variable and thus the REG_OFFSET
865      is already correct.  */
866
867   decl = REG_EXPR (reg);
868   if ((BYTES_BIG_ENDIAN || WORDS_BIG_ENDIAN)
869       && decl != NULL
870       && offset > 0
871       && GET_MODE_SIZE (GET_MODE (reg)) > GET_MODE_SIZE (mode)
872       && ((var_size = int_size_in_bytes (TREE_TYPE (decl))) > 0
873           && var_size < GET_MODE_SIZE (GET_MODE (reg))))
874     {
875       int offset_le;
876
877       /* Convert machine endian to little endian WRT size of mode of REG.  */
878       if (WORDS_BIG_ENDIAN)
879         offset_le = ((GET_MODE_SIZE (GET_MODE (reg)) - 1 - offset)
880                      / UNITS_PER_WORD) * UNITS_PER_WORD;
881       else
882         offset_le = (offset / UNITS_PER_WORD) * UNITS_PER_WORD;
883
884       if (BYTES_BIG_ENDIAN)
885         offset_le += ((GET_MODE_SIZE (GET_MODE (reg)) - 1 - offset)
886                       % UNITS_PER_WORD);
887       else
888         offset_le += offset % UNITS_PER_WORD;
889
890       if (offset_le >= var_size)
891         {
892           /* MODE is wider than the variable so the new reg will cover
893              the whole variable so the resulting OFFSET should be 0.  */
894           offset = 0;
895         }
896       else
897         {
898           /* Convert little endian to machine endian WRT size of variable.  */
899           if (WORDS_BIG_ENDIAN)
900             offset = ((var_size - 1 - offset_le)
901                       / UNITS_PER_WORD) * UNITS_PER_WORD;
902           else
903             offset = (offset_le / UNITS_PER_WORD) * UNITS_PER_WORD;
904
905           if (BYTES_BIG_ENDIAN)
906             offset += ((var_size - 1 - offset_le)
907                        % UNITS_PER_WORD);
908           else
909             offset += offset_le % UNITS_PER_WORD;
910         }
911     }
912
913   REG_ATTRS (new) = get_reg_attrs (REG_EXPR (reg),
914                                    REG_OFFSET (reg) + offset);
915   return new;
916 }
917
918 /* Set the decl for MEM to DECL.  */
919
920 void
921 set_reg_attrs_from_mem (rtx reg, rtx mem)
922 {
923   if (MEM_OFFSET (mem) && GET_CODE (MEM_OFFSET (mem)) == CONST_INT)
924     REG_ATTRS (reg)
925       = get_reg_attrs (MEM_EXPR (mem), INTVAL (MEM_OFFSET (mem)));
926 }
927
928 /* Set the register attributes for registers contained in PARM_RTX.
929    Use needed values from memory attributes of MEM.  */
930
931 void
932 set_reg_attrs_for_parm (rtx parm_rtx, rtx mem)
933 {
934   if (REG_P (parm_rtx))
935     set_reg_attrs_from_mem (parm_rtx, mem);
936   else if (GET_CODE (parm_rtx) == PARALLEL)
937     {
938       /* Check for a NULL entry in the first slot, used to indicate that the
939          parameter goes both on the stack and in registers.  */
940       int i = XEXP (XVECEXP (parm_rtx, 0, 0), 0) ? 0 : 1;
941       for (; i < XVECLEN (parm_rtx, 0); i++)
942         {
943           rtx x = XVECEXP (parm_rtx, 0, i);
944           if (REG_P (XEXP (x, 0)))
945             REG_ATTRS (XEXP (x, 0))
946               = get_reg_attrs (MEM_EXPR (mem),
947                                INTVAL (XEXP (x, 1)));
948         }
949     }
950 }
951
952 /* Assign the RTX X to declaration T.  */
953 void
954 set_decl_rtl (tree t, rtx x)
955 {
956   DECL_CHECK (t)->decl.rtl = x;
957
958   if (!x)
959     return;
960   /* For register, we maintain the reverse information too.  */
961   if (REG_P (x))
962     REG_ATTRS (x) = get_reg_attrs (t, 0);
963   else if (GET_CODE (x) == SUBREG)
964     REG_ATTRS (SUBREG_REG (x))
965       = get_reg_attrs (t, -SUBREG_BYTE (x));
966   if (GET_CODE (x) == CONCAT)
967     {
968       if (REG_P (XEXP (x, 0)))
969         REG_ATTRS (XEXP (x, 0)) = get_reg_attrs (t, 0);
970       if (REG_P (XEXP (x, 1)))
971         REG_ATTRS (XEXP (x, 1))
972           = get_reg_attrs (t, GET_MODE_UNIT_SIZE (GET_MODE (XEXP (x, 0))));
973     }
974   if (GET_CODE (x) == PARALLEL)
975     {
976       int i;
977       for (i = 0; i < XVECLEN (x, 0); i++)
978         {
979           rtx y = XVECEXP (x, 0, i);
980           if (REG_P (XEXP (y, 0)))
981             REG_ATTRS (XEXP (y, 0)) = get_reg_attrs (t, INTVAL (XEXP (y, 1)));
982         }
983     }
984 }
985
986 /* Assign the RTX X to parameter declaration T.  */
987 void
988 set_decl_incoming_rtl (tree t, rtx x)
989 {
990   DECL_INCOMING_RTL (t) = x;
991
992   if (!x)
993     return;
994   /* For register, we maintain the reverse information too.  */
995   if (REG_P (x))
996     REG_ATTRS (x) = get_reg_attrs (t, 0);
997   else if (GET_CODE (x) == SUBREG)
998     REG_ATTRS (SUBREG_REG (x))
999       = get_reg_attrs (t, -SUBREG_BYTE (x));
1000   if (GET_CODE (x) == CONCAT)
1001     {
1002       if (REG_P (XEXP (x, 0)))
1003         REG_ATTRS (XEXP (x, 0)) = get_reg_attrs (t, 0);
1004       if (REG_P (XEXP (x, 1)))
1005         REG_ATTRS (XEXP (x, 1))
1006           = get_reg_attrs (t, GET_MODE_UNIT_SIZE (GET_MODE (XEXP (x, 0))));
1007     }
1008   if (GET_CODE (x) == PARALLEL)
1009     {
1010       int i, start;
1011
1012       /* Check for a NULL entry, used to indicate that the parameter goes
1013          both on the stack and in registers.  */
1014       if (XEXP (XVECEXP (x, 0, 0), 0))
1015         start = 0;
1016       else
1017         start = 1;
1018
1019       for (i = start; i < XVECLEN (x, 0); i++)
1020         {
1021           rtx y = XVECEXP (x, 0, i);
1022           if (REG_P (XEXP (y, 0)))
1023             REG_ATTRS (XEXP (y, 0)) = get_reg_attrs (t, INTVAL (XEXP (y, 1)));
1024         }
1025     }
1026 }
1027
1028 /* Identify REG (which may be a CONCAT) as a user register.  */
1029
1030 void
1031 mark_user_reg (rtx reg)
1032 {
1033   if (GET_CODE (reg) == CONCAT)
1034     {
1035       REG_USERVAR_P (XEXP (reg, 0)) = 1;
1036       REG_USERVAR_P (XEXP (reg, 1)) = 1;
1037     }
1038   else
1039     {
1040       gcc_assert (REG_P (reg));
1041       REG_USERVAR_P (reg) = 1;
1042     }
1043 }
1044
1045 /* Identify REG as a probable pointer register and show its alignment
1046    as ALIGN, if nonzero.  */
1047
1048 void
1049 mark_reg_pointer (rtx reg, int align)
1050 {
1051   if (! REG_POINTER (reg))
1052     {
1053       REG_POINTER (reg) = 1;
1054
1055       if (align)
1056         REGNO_POINTER_ALIGN (REGNO (reg)) = align;
1057     }
1058   else if (align && align < REGNO_POINTER_ALIGN (REGNO (reg)))
1059     /* We can no-longer be sure just how aligned this pointer is.  */
1060     REGNO_POINTER_ALIGN (REGNO (reg)) = align;
1061 }
1062
1063 /* Return 1 plus largest pseudo reg number used in the current function.  */
1064
1065 int
1066 max_reg_num (void)
1067 {
1068   return reg_rtx_no;
1069 }
1070
1071 /* Return 1 + the largest label number used so far in the current function.  */
1072
1073 int
1074 max_label_num (void)
1075 {
1076   return label_num;
1077 }
1078
1079 /* Return first label number used in this function (if any were used).  */
1080
1081 int
1082 get_first_label_num (void)
1083 {
1084   return first_label_num;
1085 }
1086
1087 /* If the rtx for label was created during the expansion of a nested
1088    function, then first_label_num won't include this label number.
1089    Fix this now so that array indicies work later.  */
1090
1091 void
1092 maybe_set_first_label_num (rtx x)
1093 {
1094   if (CODE_LABEL_NUMBER (x) < first_label_num)
1095     first_label_num = CODE_LABEL_NUMBER (x);
1096 }
1097 \f
1098 /* Return a value representing some low-order bits of X, where the number
1099    of low-order bits is given by MODE.  Note that no conversion is done
1100    between floating-point and fixed-point values, rather, the bit
1101    representation is returned.
1102
1103    This function handles the cases in common between gen_lowpart, below,
1104    and two variants in cse.c and combine.c.  These are the cases that can
1105    be safely handled at all points in the compilation.
1106
1107    If this is not a case we can handle, return 0.  */
1108
1109 rtx
1110 gen_lowpart_common (enum machine_mode mode, rtx x)
1111 {
1112   int msize = GET_MODE_SIZE (mode);
1113   int xsize;
1114   int offset = 0;
1115   enum machine_mode innermode;
1116
1117   /* Unfortunately, this routine doesn't take a parameter for the mode of X,
1118      so we have to make one up.  Yuk.  */
1119   innermode = GET_MODE (x);
1120   if (GET_CODE (x) == CONST_INT && msize <= HOST_BITS_PER_WIDE_INT)
1121     innermode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
1122   else if (innermode == VOIDmode)
1123     innermode = mode_for_size (HOST_BITS_PER_WIDE_INT * 2, MODE_INT, 0);
1124   
1125   xsize = GET_MODE_SIZE (innermode);
1126
1127   gcc_assert (innermode != VOIDmode && innermode != BLKmode);
1128
1129   if (innermode == mode)
1130     return x;
1131
1132   /* MODE must occupy no more words than the mode of X.  */
1133   if ((msize + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD
1134       > ((xsize + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
1135     return 0;
1136
1137   /* Don't allow generating paradoxical FLOAT_MODE subregs.  */
1138   if (GET_MODE_CLASS (mode) == MODE_FLOAT && msize > xsize)
1139     return 0;
1140
1141   offset = subreg_lowpart_offset (mode, innermode);
1142
1143   if ((GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND)
1144       && (GET_MODE_CLASS (mode) == MODE_INT
1145           || GET_MODE_CLASS (mode) == MODE_PARTIAL_INT))
1146     {
1147       /* If we are getting the low-order part of something that has been
1148          sign- or zero-extended, we can either just use the object being
1149          extended or make a narrower extension.  If we want an even smaller
1150          piece than the size of the object being extended, call ourselves
1151          recursively.
1152
1153          This case is used mostly by combine and cse.  */
1154
1155       if (GET_MODE (XEXP (x, 0)) == mode)
1156         return XEXP (x, 0);
1157       else if (msize < GET_MODE_SIZE (GET_MODE (XEXP (x, 0))))
1158         return gen_lowpart_common (mode, XEXP (x, 0));
1159       else if (msize < xsize)
1160         return gen_rtx_fmt_e (GET_CODE (x), mode, XEXP (x, 0));
1161     }
1162   else if (GET_CODE (x) == SUBREG || REG_P (x)
1163            || GET_CODE (x) == CONCAT || GET_CODE (x) == CONST_VECTOR
1164            || GET_CODE (x) == CONST_DOUBLE || GET_CODE (x) == CONST_INT)
1165     return simplify_gen_subreg (mode, x, innermode, offset);
1166
1167   /* Otherwise, we can't do this.  */
1168   return 0;
1169 }
1170 \f
1171 rtx
1172 gen_highpart (enum machine_mode mode, rtx x)
1173 {
1174   unsigned int msize = GET_MODE_SIZE (mode);
1175   rtx result;
1176
1177   /* This case loses if X is a subreg.  To catch bugs early,
1178      complain if an invalid MODE is used even in other cases.  */
1179   gcc_assert (msize <= UNITS_PER_WORD
1180               || msize == (unsigned int) GET_MODE_UNIT_SIZE (GET_MODE (x)));
1181
1182   result = simplify_gen_subreg (mode, x, GET_MODE (x),
1183                                 subreg_highpart_offset (mode, GET_MODE (x)));
1184   gcc_assert (result);
1185   
1186   /* simplify_gen_subreg is not guaranteed to return a valid operand for
1187      the target if we have a MEM.  gen_highpart must return a valid operand,
1188      emitting code if necessary to do so.  */
1189   if (MEM_P (result))
1190     {
1191       result = validize_mem (result);
1192       gcc_assert (result);
1193     }
1194   
1195   return result;
1196 }
1197
1198 /* Like gen_highpart, but accept mode of EXP operand in case EXP can
1199    be VOIDmode constant.  */
1200 rtx
1201 gen_highpart_mode (enum machine_mode outermode, enum machine_mode innermode, rtx exp)
1202 {
1203   if (GET_MODE (exp) != VOIDmode)
1204     {
1205       gcc_assert (GET_MODE (exp) == innermode);
1206       return gen_highpart (outermode, exp);
1207     }
1208   return simplify_gen_subreg (outermode, exp, innermode,
1209                               subreg_highpart_offset (outermode, innermode));
1210 }
1211
1212 /* Return offset in bytes to get OUTERMODE low part
1213    of the value in mode INNERMODE stored in memory in target format.  */
1214
1215 unsigned int
1216 subreg_lowpart_offset (enum machine_mode outermode, enum machine_mode innermode)
1217 {
1218   unsigned int offset = 0;
1219   int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
1220
1221   if (difference > 0)
1222     {
1223       if (WORDS_BIG_ENDIAN)
1224         offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
1225       if (BYTES_BIG_ENDIAN)
1226         offset += difference % UNITS_PER_WORD;
1227     }
1228
1229   return offset;
1230 }
1231
1232 /* Return offset in bytes to get OUTERMODE high part
1233    of the value in mode INNERMODE stored in memory in target format.  */
1234 unsigned int
1235 subreg_highpart_offset (enum machine_mode outermode, enum machine_mode innermode)
1236 {
1237   unsigned int offset = 0;
1238   int difference = (GET_MODE_SIZE (innermode) - GET_MODE_SIZE (outermode));
1239
1240   gcc_assert (GET_MODE_SIZE (innermode) >= GET_MODE_SIZE (outermode));
1241
1242   if (difference > 0)
1243     {
1244       if (! WORDS_BIG_ENDIAN)
1245         offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
1246       if (! BYTES_BIG_ENDIAN)
1247         offset += difference % UNITS_PER_WORD;
1248     }
1249
1250   return offset;
1251 }
1252
1253 /* Return 1 iff X, assumed to be a SUBREG,
1254    refers to the least significant part of its containing reg.
1255    If X is not a SUBREG, always return 1 (it is its own low part!).  */
1256
1257 int
1258 subreg_lowpart_p (rtx x)
1259 {
1260   if (GET_CODE (x) != SUBREG)
1261     return 1;
1262   else if (GET_MODE (SUBREG_REG (x)) == VOIDmode)
1263     return 0;
1264
1265   return (subreg_lowpart_offset (GET_MODE (x), GET_MODE (SUBREG_REG (x)))
1266           == SUBREG_BYTE (x));
1267 }
1268 \f
1269 /* Return subword OFFSET of operand OP.
1270    The word number, OFFSET, is interpreted as the word number starting
1271    at the low-order address.  OFFSET 0 is the low-order word if not
1272    WORDS_BIG_ENDIAN, otherwise it is the high-order word.
1273
1274    If we cannot extract the required word, we return zero.  Otherwise,
1275    an rtx corresponding to the requested word will be returned.
1276
1277    VALIDATE_ADDRESS is nonzero if the address should be validated.  Before
1278    reload has completed, a valid address will always be returned.  After
1279    reload, if a valid address cannot be returned, we return zero.
1280
1281    If VALIDATE_ADDRESS is zero, we simply form the required address; validating
1282    it is the responsibility of the caller.
1283
1284    MODE is the mode of OP in case it is a CONST_INT.
1285
1286    ??? This is still rather broken for some cases.  The problem for the
1287    moment is that all callers of this thing provide no 'goal mode' to
1288    tell us to work with.  This exists because all callers were written
1289    in a word based SUBREG world.
1290    Now use of this function can be deprecated by simplify_subreg in most
1291    cases.
1292  */
1293
1294 rtx
1295 operand_subword (rtx op, unsigned int offset, int validate_address, enum machine_mode mode)
1296 {
1297   if (mode == VOIDmode)
1298     mode = GET_MODE (op);
1299
1300   gcc_assert (mode != VOIDmode);
1301
1302   /* If OP is narrower than a word, fail.  */
1303   if (mode != BLKmode
1304       && (GET_MODE_SIZE (mode) < UNITS_PER_WORD))
1305     return 0;
1306
1307   /* If we want a word outside OP, return zero.  */
1308   if (mode != BLKmode
1309       && (offset + 1) * UNITS_PER_WORD > GET_MODE_SIZE (mode))
1310     return const0_rtx;
1311
1312   /* Form a new MEM at the requested address.  */
1313   if (MEM_P (op))
1314     {
1315       rtx new = adjust_address_nv (op, word_mode, offset * UNITS_PER_WORD);
1316
1317       if (! validate_address)
1318         return new;
1319
1320       else if (reload_completed)
1321         {
1322           if (! strict_memory_address_p (word_mode, XEXP (new, 0)))
1323             return 0;
1324         }
1325       else
1326         return replace_equiv_address (new, XEXP (new, 0));
1327     }
1328
1329   /* Rest can be handled by simplify_subreg.  */
1330   return simplify_gen_subreg (word_mode, op, mode, (offset * UNITS_PER_WORD));
1331 }
1332
1333 /* Similar to `operand_subword', but never return 0.  If we can't extract
1334    the required subword, put OP into a register and try again.  If that fails,
1335    abort.  We always validate the address in this case.
1336
1337    MODE is the mode of OP, in case it is CONST_INT.  */
1338
1339 rtx
1340 operand_subword_force (rtx op, unsigned int offset, enum machine_mode mode)
1341 {
1342   rtx result = operand_subword (op, offset, 1, mode);
1343
1344   if (result)
1345     return result;
1346
1347   if (mode != BLKmode && mode != VOIDmode)
1348     {
1349       /* If this is a register which can not be accessed by words, copy it
1350          to a pseudo register.  */
1351       if (REG_P (op))
1352         op = copy_to_reg (op);
1353       else
1354         op = force_reg (mode, op);
1355     }
1356
1357   result = operand_subword (op, offset, 1, mode);
1358   gcc_assert (result);
1359
1360   return result;
1361 }
1362 \f
1363 /* Within a MEM_EXPR, we care about either (1) a component ref of a decl,
1364    or (2) a component ref of something variable.  Represent the later with
1365    a NULL expression.  */
1366
1367 static tree
1368 component_ref_for_mem_expr (tree ref)
1369 {
1370   tree inner = TREE_OPERAND (ref, 0);
1371
1372   if (TREE_CODE (inner) == COMPONENT_REF)
1373     inner = component_ref_for_mem_expr (inner);
1374   else
1375     {
1376       /* Now remove any conversions: they don't change what the underlying
1377          object is.  Likewise for SAVE_EXPR.  */
1378       while (TREE_CODE (inner) == NOP_EXPR || TREE_CODE (inner) == CONVERT_EXPR
1379              || TREE_CODE (inner) == NON_LVALUE_EXPR
1380              || TREE_CODE (inner) == VIEW_CONVERT_EXPR
1381              || TREE_CODE (inner) == SAVE_EXPR)
1382         inner = TREE_OPERAND (inner, 0);
1383
1384       if (! DECL_P (inner))
1385         inner = NULL_TREE;
1386     }
1387
1388   if (inner == TREE_OPERAND (ref, 0))
1389     return ref;
1390   else
1391     return build3 (COMPONENT_REF, TREE_TYPE (ref), inner,
1392                    TREE_OPERAND (ref, 1), NULL_TREE);
1393 }
1394
1395 /* Returns 1 if both MEM_EXPR can be considered equal
1396    and 0 otherwise.  */
1397
1398 int
1399 mem_expr_equal_p (tree expr1, tree expr2)
1400 {
1401   if (expr1 == expr2)
1402     return 1;
1403
1404   if (! expr1 || ! expr2)
1405     return 0;
1406
1407   if (TREE_CODE (expr1) != TREE_CODE (expr2))
1408     return 0;
1409
1410   if (TREE_CODE (expr1) == COMPONENT_REF)
1411     return 
1412       mem_expr_equal_p (TREE_OPERAND (expr1, 0),
1413                         TREE_OPERAND (expr2, 0))
1414       && mem_expr_equal_p (TREE_OPERAND (expr1, 1), /* field decl */
1415                            TREE_OPERAND (expr2, 1));
1416   
1417   if (INDIRECT_REF_P (expr1))
1418     return mem_expr_equal_p (TREE_OPERAND (expr1, 0),
1419                              TREE_OPERAND (expr2, 0));
1420
1421   /* ARRAY_REFs, ARRAY_RANGE_REFs and BIT_FIELD_REFs should already
1422               have been resolved here.  */
1423   gcc_assert (DECL_P (expr1));
1424   
1425   /* Decls with different pointers can't be equal.  */
1426   return 0;
1427 }
1428
1429 /* Given REF, a MEM, and T, either the type of X or the expression
1430    corresponding to REF, set the memory attributes.  OBJECTP is nonzero
1431    if we are making a new object of this type.  BITPOS is nonzero if
1432    there is an offset outstanding on T that will be applied later.  */
1433
1434 void
1435 set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
1436                                  HOST_WIDE_INT bitpos)
1437 {
1438   HOST_WIDE_INT alias = MEM_ALIAS_SET (ref);
1439   tree expr = MEM_EXPR (ref);
1440   rtx offset = MEM_OFFSET (ref);
1441   rtx size = MEM_SIZE (ref);
1442   unsigned int align = MEM_ALIGN (ref);
1443   HOST_WIDE_INT apply_bitpos = 0;
1444   tree type;
1445
1446   /* It can happen that type_for_mode was given a mode for which there
1447      is no language-level type.  In which case it returns NULL, which
1448      we can see here.  */
1449   if (t == NULL_TREE)
1450     return;
1451
1452   type = TYPE_P (t) ? t : TREE_TYPE (t);
1453   if (type == error_mark_node)
1454     return;
1455
1456   /* If we have already set DECL_RTL = ref, get_alias_set will get the
1457      wrong answer, as it assumes that DECL_RTL already has the right alias
1458      info.  Callers should not set DECL_RTL until after the call to
1459      set_mem_attributes.  */
1460   gcc_assert (!DECL_P (t) || ref != DECL_RTL_IF_SET (t));
1461
1462   /* Get the alias set from the expression or type (perhaps using a
1463      front-end routine) and use it.  */
1464   alias = get_alias_set (t);
1465
1466   MEM_VOLATILE_P (ref) |= TYPE_VOLATILE (type);
1467   MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type);
1468   MEM_POINTER (ref) = POINTER_TYPE_P (type);
1469   MEM_NOTRAP_P (ref) = TREE_THIS_NOTRAP (t);
1470
1471   /* If we are making an object of this type, or if this is a DECL, we know
1472      that it is a scalar if the type is not an aggregate.  */
1473   if ((objectp || DECL_P (t)) && ! AGGREGATE_TYPE_P (type))
1474     MEM_SCALAR_P (ref) = 1;
1475
1476   /* We can set the alignment from the type if we are making an object,
1477      this is an INDIRECT_REF, or if TYPE_ALIGN_OK.  */
1478   if (objectp || TREE_CODE (t) == INDIRECT_REF 
1479       || TREE_CODE (t) == ALIGN_INDIRECT_REF 
1480       || TYPE_ALIGN_OK (type))
1481     align = MAX (align, TYPE_ALIGN (type));
1482   else 
1483     if (TREE_CODE (t) == MISALIGNED_INDIRECT_REF)
1484       {
1485         if (integer_zerop (TREE_OPERAND (t, 1)))
1486           /* We don't know anything about the alignment.  */
1487           align = BITS_PER_UNIT;
1488         else
1489           align = tree_low_cst (TREE_OPERAND (t, 1), 1);
1490       }
1491
1492   /* If the size is known, we can set that.  */
1493   if (TYPE_SIZE_UNIT (type) && host_integerp (TYPE_SIZE_UNIT (type), 1))
1494     size = GEN_INT (tree_low_cst (TYPE_SIZE_UNIT (type), 1));
1495
1496   /* If T is not a type, we may be able to deduce some more information about
1497      the expression.  */
1498   if (! TYPE_P (t))
1499     {
1500       tree base = get_base_address (t);
1501       if (base && DECL_P (base)
1502           && TREE_READONLY (base)
1503           && (TREE_STATIC (base) || DECL_EXTERNAL (base)))
1504         {
1505           tree base_type = TREE_TYPE (base);
1506           gcc_assert (!(base_type && TYPE_NEEDS_CONSTRUCTING (base_type))
1507                       || DECL_ARTIFICIAL (base));
1508           MEM_READONLY_P (ref) = 1;
1509         }
1510
1511       if (TREE_THIS_VOLATILE (t))
1512         MEM_VOLATILE_P (ref) = 1;
1513
1514       /* Now remove any conversions: they don't change what the underlying
1515          object is.  Likewise for SAVE_EXPR.  */
1516       while (TREE_CODE (t) == NOP_EXPR || TREE_CODE (t) == CONVERT_EXPR
1517              || TREE_CODE (t) == NON_LVALUE_EXPR
1518              || TREE_CODE (t) == VIEW_CONVERT_EXPR
1519              || TREE_CODE (t) == SAVE_EXPR)
1520         t = TREE_OPERAND (t, 0);
1521
1522       /* If this expression uses it's parent's alias set, mark it such
1523          that we won't change it.  */
1524       if (component_uses_parent_alias_set (t))
1525         MEM_KEEP_ALIAS_SET_P (ref) = 1;
1526
1527       /* If this is a decl, set the attributes of the MEM from it.  */
1528       if (DECL_P (t))
1529         {
1530           expr = t;
1531           offset = const0_rtx;
1532           apply_bitpos = bitpos;
1533           size = (DECL_SIZE_UNIT (t)
1534                   && host_integerp (DECL_SIZE_UNIT (t), 1)
1535                   ? GEN_INT (tree_low_cst (DECL_SIZE_UNIT (t), 1)) : 0);
1536           align = DECL_ALIGN (t);
1537         }
1538
1539       /* If this is a constant, we know the alignment.  */
1540       else if (CONSTANT_CLASS_P (t))
1541         {
1542           align = TYPE_ALIGN (type);
1543 #ifdef CONSTANT_ALIGNMENT
1544           align = CONSTANT_ALIGNMENT (t, align);
1545 #endif
1546         }
1547
1548       /* If this is a field reference and not a bit-field, record it.  */
1549       /* ??? There is some information that can be gleened from bit-fields,
1550          such as the word offset in the structure that might be modified.
1551          But skip it for now.  */
1552       else if (TREE_CODE (t) == COMPONENT_REF
1553                && ! DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
1554         {
1555           expr = component_ref_for_mem_expr (t);
1556           offset = const0_rtx;
1557           apply_bitpos = bitpos;
1558           /* ??? Any reason the field size would be different than
1559              the size we got from the type?  */
1560         }
1561
1562       /* If this is an array reference, look for an outer field reference.  */
1563       else if (TREE_CODE (t) == ARRAY_REF)
1564         {
1565           tree off_tree = size_zero_node;
1566           /* We can't modify t, because we use it at the end of the
1567              function.  */
1568           tree t2 = t;
1569
1570           do
1571             {
1572               tree index = TREE_OPERAND (t2, 1);
1573               tree low_bound = array_ref_low_bound (t2);
1574               tree unit_size = array_ref_element_size (t2);
1575
1576               /* We assume all arrays have sizes that are a multiple of a byte.
1577                  First subtract the lower bound, if any, in the type of the
1578                  index, then convert to sizetype and multiply by the size of
1579                  the array element.  */
1580               if (! integer_zerop (low_bound))
1581                 index = fold (build2 (MINUS_EXPR, TREE_TYPE (index),
1582                                       index, low_bound));
1583
1584               off_tree = size_binop (PLUS_EXPR,
1585                                      size_binop (MULT_EXPR, convert (sizetype,
1586                                                                      index),
1587                                                  unit_size),
1588                                      off_tree);
1589               t2 = TREE_OPERAND (t2, 0);
1590             }
1591           while (TREE_CODE (t2) == ARRAY_REF);
1592
1593           if (DECL_P (t2))
1594             {
1595               expr = t2;
1596               offset = NULL;
1597               if (host_integerp (off_tree, 1))
1598                 {
1599                   HOST_WIDE_INT ioff = tree_low_cst (off_tree, 1);
1600                   HOST_WIDE_INT aoff = (ioff & -ioff) * BITS_PER_UNIT;
1601                   align = DECL_ALIGN (t2);
1602                   if (aoff && (unsigned HOST_WIDE_INT) aoff < align)
1603                     align = aoff;
1604                   offset = GEN_INT (ioff);
1605                   apply_bitpos = bitpos;
1606                 }
1607             }
1608           else if (TREE_CODE (t2) == COMPONENT_REF)
1609             {
1610               expr = component_ref_for_mem_expr (t2);
1611               if (host_integerp (off_tree, 1))
1612                 {
1613                   offset = GEN_INT (tree_low_cst (off_tree, 1));
1614                   apply_bitpos = bitpos;
1615                 }
1616               /* ??? Any reason the field size would be different than
1617                  the size we got from the type?  */
1618             }
1619           else if (flag_argument_noalias > 1
1620                    && (INDIRECT_REF_P (t2))
1621                    && TREE_CODE (TREE_OPERAND (t2, 0)) == PARM_DECL)
1622             {
1623               expr = t2;
1624               offset = NULL;
1625             }
1626         }
1627
1628       /* If this is a Fortran indirect argument reference, record the
1629          parameter decl.  */
1630       else if (flag_argument_noalias > 1
1631                && (INDIRECT_REF_P (t))
1632                && TREE_CODE (TREE_OPERAND (t, 0)) == PARM_DECL)
1633         {
1634           expr = t;
1635           offset = NULL;
1636         }
1637     }
1638
1639   /* If we modified OFFSET based on T, then subtract the outstanding
1640      bit position offset.  Similarly, increase the size of the accessed
1641      object to contain the negative offset.  */
1642   if (apply_bitpos)
1643     {
1644       offset = plus_constant (offset, -(apply_bitpos / BITS_PER_UNIT));
1645       if (size)
1646         size = plus_constant (size, apply_bitpos / BITS_PER_UNIT);
1647     }
1648
1649   if (TREE_CODE (t) == ALIGN_INDIRECT_REF)
1650     {
1651       /* Force EXPR and OFFSE to NULL, since we don't know exactly what
1652          we're overlapping.  */
1653       offset = NULL;
1654       expr = NULL;
1655     }
1656
1657   /* Now set the attributes we computed above.  */
1658   MEM_ATTRS (ref)
1659     = get_mem_attrs (alias, expr, offset, size, align, GET_MODE (ref));
1660
1661   /* If this is already known to be a scalar or aggregate, we are done.  */
1662   if (MEM_IN_STRUCT_P (ref) || MEM_SCALAR_P (ref))
1663     return;
1664
1665   /* If it is a reference into an aggregate, this is part of an aggregate.
1666      Otherwise we don't know.  */
1667   else if (TREE_CODE (t) == COMPONENT_REF || TREE_CODE (t) == ARRAY_REF
1668            || TREE_CODE (t) == ARRAY_RANGE_REF
1669            || TREE_CODE (t) == BIT_FIELD_REF)
1670     MEM_IN_STRUCT_P (ref) = 1;
1671 }
1672
1673 void
1674 set_mem_attributes (rtx ref, tree t, int objectp)
1675 {
1676   set_mem_attributes_minus_bitpos (ref, t, objectp, 0);
1677 }
1678
1679 /* Set the decl for MEM to DECL.  */
1680
1681 void
1682 set_mem_attrs_from_reg (rtx mem, rtx reg)
1683 {
1684   MEM_ATTRS (mem)
1685     = get_mem_attrs (MEM_ALIAS_SET (mem), REG_EXPR (reg),
1686                      GEN_INT (REG_OFFSET (reg)),
1687                      MEM_SIZE (mem), MEM_ALIGN (mem), GET_MODE (mem));
1688 }
1689
1690 /* Set the alias set of MEM to SET.  */
1691
1692 void
1693 set_mem_alias_set (rtx mem, HOST_WIDE_INT set)
1694 {
1695 #ifdef ENABLE_CHECKING
1696   /* If the new and old alias sets don't conflict, something is wrong.  */
1697   gcc_assert (alias_sets_conflict_p (set, MEM_ALIAS_SET (mem)));
1698 #endif
1699
1700   MEM_ATTRS (mem) = get_mem_attrs (set, MEM_EXPR (mem), MEM_OFFSET (mem),
1701                                    MEM_SIZE (mem), MEM_ALIGN (mem),
1702                                    GET_MODE (mem));
1703 }
1704
1705 /* Set the alignment of MEM to ALIGN bits.  */
1706
1707 void
1708 set_mem_align (rtx mem, unsigned int align)
1709 {
1710   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1711                                    MEM_OFFSET (mem), MEM_SIZE (mem), align,
1712                                    GET_MODE (mem));
1713 }
1714
1715 /* Set the expr for MEM to EXPR.  */
1716
1717 void
1718 set_mem_expr (rtx mem, tree expr)
1719 {
1720   MEM_ATTRS (mem)
1721     = get_mem_attrs (MEM_ALIAS_SET (mem), expr, MEM_OFFSET (mem),
1722                      MEM_SIZE (mem), MEM_ALIGN (mem), GET_MODE (mem));
1723 }
1724
1725 /* Set the offset of MEM to OFFSET.  */
1726
1727 void
1728 set_mem_offset (rtx mem, rtx offset)
1729 {
1730   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1731                                    offset, MEM_SIZE (mem), MEM_ALIGN (mem),
1732                                    GET_MODE (mem));
1733 }
1734
1735 /* Set the size of MEM to SIZE.  */
1736
1737 void
1738 set_mem_size (rtx mem, rtx size)
1739 {
1740   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1741                                    MEM_OFFSET (mem), size, MEM_ALIGN (mem),
1742                                    GET_MODE (mem));
1743 }
1744 \f
1745 /* Return a memory reference like MEMREF, but with its mode changed to MODE
1746    and its address changed to ADDR.  (VOIDmode means don't change the mode.
1747    NULL for ADDR means don't change the address.)  VALIDATE is nonzero if the
1748    returned memory location is required to be valid.  The memory
1749    attributes are not changed.  */
1750
1751 static rtx
1752 change_address_1 (rtx memref, enum machine_mode mode, rtx addr, int validate)
1753 {
1754   rtx new;
1755
1756   gcc_assert (MEM_P (memref));
1757   if (mode == VOIDmode)
1758     mode = GET_MODE (memref);
1759   if (addr == 0)
1760     addr = XEXP (memref, 0);
1761   if (mode == GET_MODE (memref) && addr == XEXP (memref, 0)
1762       && (!validate || memory_address_p (mode, addr)))
1763     return memref;
1764
1765   if (validate)
1766     {
1767       if (reload_in_progress || reload_completed)
1768         gcc_assert (memory_address_p (mode, addr));
1769       else
1770         addr = memory_address (mode, addr);
1771     }
1772
1773   if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref))
1774     return memref;
1775
1776   new = gen_rtx_MEM (mode, addr);
1777   MEM_COPY_ATTRIBUTES (new, memref);
1778   return new;
1779 }
1780
1781 /* Like change_address_1 with VALIDATE nonzero, but we are not saying in what
1782    way we are changing MEMREF, so we only preserve the alias set.  */
1783
1784 rtx
1785 change_address (rtx memref, enum machine_mode mode, rtx addr)
1786 {
1787   rtx new = change_address_1 (memref, mode, addr, 1), size;
1788   enum machine_mode mmode = GET_MODE (new);
1789   unsigned int align;
1790
1791   size = mmode == BLKmode ? 0 : GEN_INT (GET_MODE_SIZE (mmode));
1792   align = mmode == BLKmode ? BITS_PER_UNIT : GET_MODE_ALIGNMENT (mmode);
1793
1794   /* If there are no changes, just return the original memory reference.  */
1795   if (new == memref)
1796     {
1797       if (MEM_ATTRS (memref) == 0
1798           || (MEM_EXPR (memref) == NULL
1799               && MEM_OFFSET (memref) == NULL
1800               && MEM_SIZE (memref) == size
1801               && MEM_ALIGN (memref) == align))
1802         return new;
1803
1804       new = gen_rtx_MEM (mmode, XEXP (memref, 0));
1805       MEM_COPY_ATTRIBUTES (new, memref);
1806     }
1807
1808   MEM_ATTRS (new)
1809     = get_mem_attrs (MEM_ALIAS_SET (memref), 0, 0, size, align, mmode);
1810
1811   return new;
1812 }
1813
1814 /* Return a memory reference like MEMREF, but with its mode changed
1815    to MODE and its address offset by OFFSET bytes.  If VALIDATE is
1816    nonzero, the memory address is forced to be valid.
1817    If ADJUST is zero, OFFSET is only used to update MEM_ATTRS
1818    and caller is responsible for adjusting MEMREF base register.  */
1819
1820 rtx
1821 adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
1822                   int validate, int adjust)
1823 {
1824   rtx addr = XEXP (memref, 0);
1825   rtx new;
1826   rtx memoffset = MEM_OFFSET (memref);
1827   rtx size = 0;
1828   unsigned int memalign = MEM_ALIGN (memref);
1829
1830   /* If there are no changes, just return the original memory reference.  */
1831   if (mode == GET_MODE (memref) && !offset
1832       && (!validate || memory_address_p (mode, addr)))
1833     return memref;
1834
1835   /* ??? Prefer to create garbage instead of creating shared rtl.
1836      This may happen even if offset is nonzero -- consider
1837      (plus (plus reg reg) const_int) -- so do this always.  */
1838   addr = copy_rtx (addr);
1839
1840   if (adjust)
1841     {
1842       /* If MEMREF is a LO_SUM and the offset is within the alignment of the
1843          object, we can merge it into the LO_SUM.  */
1844       if (GET_MODE (memref) != BLKmode && GET_CODE (addr) == LO_SUM
1845           && offset >= 0
1846           && (unsigned HOST_WIDE_INT) offset
1847               < GET_MODE_ALIGNMENT (GET_MODE (memref)) / BITS_PER_UNIT)
1848         addr = gen_rtx_LO_SUM (Pmode, XEXP (addr, 0),
1849                                plus_constant (XEXP (addr, 1), offset));
1850       else
1851         addr = plus_constant (addr, offset);
1852     }
1853
1854   new = change_address_1 (memref, mode, addr, validate);
1855
1856   /* Compute the new values of the memory attributes due to this adjustment.
1857      We add the offsets and update the alignment.  */
1858   if (memoffset)
1859     memoffset = GEN_INT (offset + INTVAL (memoffset));
1860
1861   /* Compute the new alignment by taking the MIN of the alignment and the
1862      lowest-order set bit in OFFSET, but don't change the alignment if OFFSET
1863      if zero.  */
1864   if (offset != 0)
1865     memalign
1866       = MIN (memalign,
1867              (unsigned HOST_WIDE_INT) (offset & -offset) * BITS_PER_UNIT);
1868
1869   /* We can compute the size in a number of ways.  */
1870   if (GET_MODE (new) != BLKmode)
1871     size = GEN_INT (GET_MODE_SIZE (GET_MODE (new)));
1872   else if (MEM_SIZE (memref))
1873     size = plus_constant (MEM_SIZE (memref), -offset);
1874
1875   MEM_ATTRS (new) = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref),
1876                                    memoffset, size, memalign, GET_MODE (new));
1877
1878   /* At some point, we should validate that this offset is within the object,
1879      if all the appropriate values are known.  */
1880   return new;
1881 }
1882
1883 /* Return a memory reference like MEMREF, but with its mode changed
1884    to MODE and its address changed to ADDR, which is assumed to be
1885    MEMREF offseted by OFFSET bytes.  If VALIDATE is
1886    nonzero, the memory address is forced to be valid.  */
1887
1888 rtx
1889 adjust_automodify_address_1 (rtx memref, enum machine_mode mode, rtx addr,
1890                              HOST_WIDE_INT offset, int validate)
1891 {
1892   memref = change_address_1 (memref, VOIDmode, addr, validate);
1893   return adjust_address_1 (memref, mode, offset, validate, 0);
1894 }
1895
1896 /* Return a memory reference like MEMREF, but whose address is changed by
1897    adding OFFSET, an RTX, to it.  POW2 is the highest power of two factor
1898    known to be in OFFSET (possibly 1).  */
1899
1900 rtx
1901 offset_address (rtx memref, rtx offset, unsigned HOST_WIDE_INT pow2)
1902 {
1903   rtx new, addr = XEXP (memref, 0);
1904
1905   new = simplify_gen_binary (PLUS, Pmode, addr, offset);
1906
1907   /* At this point we don't know _why_ the address is invalid.  It
1908      could have secondary memory references, multiplies or anything.
1909
1910      However, if we did go and rearrange things, we can wind up not
1911      being able to recognize the magic around pic_offset_table_rtx.
1912      This stuff is fragile, and is yet another example of why it is
1913      bad to expose PIC machinery too early.  */
1914   if (! memory_address_p (GET_MODE (memref), new)
1915       && GET_CODE (addr) == PLUS
1916       && XEXP (addr, 0) == pic_offset_table_rtx)
1917     {
1918       addr = force_reg (GET_MODE (addr), addr);
1919       new = simplify_gen_binary (PLUS, Pmode, addr, offset);
1920     }
1921
1922   update_temp_slot_address (XEXP (memref, 0), new);
1923   new = change_address_1 (memref, VOIDmode, new, 1);
1924
1925   /* If there are no changes, just return the original memory reference.  */
1926   if (new == memref)
1927     return new;
1928
1929   /* Update the alignment to reflect the offset.  Reset the offset, which
1930      we don't know.  */
1931   MEM_ATTRS (new)
1932     = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref), 0, 0,
1933                      MIN (MEM_ALIGN (memref), pow2 * BITS_PER_UNIT),
1934                      GET_MODE (new));
1935   return new;
1936 }
1937
1938 /* Return a memory reference like MEMREF, but with its address changed to
1939    ADDR.  The caller is asserting that the actual piece of memory pointed
1940    to is the same, just the form of the address is being changed, such as
1941    by putting something into a register.  */
1942
1943 rtx
1944 replace_equiv_address (rtx memref, rtx addr)
1945 {
1946   /* change_address_1 copies the memory attribute structure without change
1947      and that's exactly what we want here.  */
1948   update_temp_slot_address (XEXP (memref, 0), addr);
1949   return change_address_1 (memref, VOIDmode, addr, 1);
1950 }
1951
1952 /* Likewise, but the reference is not required to be valid.  */
1953
1954 rtx
1955 replace_equiv_address_nv (rtx memref, rtx addr)
1956 {
1957   return change_address_1 (memref, VOIDmode, addr, 0);
1958 }
1959
1960 /* Return a memory reference like MEMREF, but with its mode widened to
1961    MODE and offset by OFFSET.  This would be used by targets that e.g.
1962    cannot issue QImode memory operations and have to use SImode memory
1963    operations plus masking logic.  */
1964
1965 rtx
1966 widen_memory_access (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset)
1967 {
1968   rtx new = adjust_address_1 (memref, mode, offset, 1, 1);
1969   tree expr = MEM_EXPR (new);
1970   rtx memoffset = MEM_OFFSET (new);
1971   unsigned int size = GET_MODE_SIZE (mode);
1972
1973   /* If there are no changes, just return the original memory reference.  */
1974   if (new == memref)
1975     return new;
1976
1977   /* If we don't know what offset we were at within the expression, then
1978      we can't know if we've overstepped the bounds.  */
1979   if (! memoffset)
1980     expr = NULL_TREE;
1981
1982   while (expr)
1983     {
1984       if (TREE_CODE (expr) == COMPONENT_REF)
1985         {
1986           tree field = TREE_OPERAND (expr, 1);
1987           tree offset = component_ref_field_offset (expr);
1988
1989           if (! DECL_SIZE_UNIT (field))
1990             {
1991               expr = NULL_TREE;
1992               break;
1993             }
1994
1995           /* Is the field at least as large as the access?  If so, ok,
1996              otherwise strip back to the containing structure.  */
1997           if (TREE_CODE (DECL_SIZE_UNIT (field)) == INTEGER_CST
1998               && compare_tree_int (DECL_SIZE_UNIT (field), size) >= 0
1999               && INTVAL (memoffset) >= 0)
2000             break;
2001
2002           if (! host_integerp (offset, 1))
2003             {
2004               expr = NULL_TREE;
2005               break;
2006             }
2007
2008           expr = TREE_OPERAND (expr, 0);
2009           memoffset
2010             = (GEN_INT (INTVAL (memoffset)
2011                         + tree_low_cst (offset, 1)
2012                         + (tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
2013                            / BITS_PER_UNIT)));
2014         }
2015       /* Similarly for the decl.  */
2016       else if (DECL_P (expr)
2017                && DECL_SIZE_UNIT (expr)
2018                && TREE_CODE (DECL_SIZE_UNIT (expr)) == INTEGER_CST
2019                && compare_tree_int (DECL_SIZE_UNIT (expr), size) >= 0
2020                && (! memoffset || INTVAL (memoffset) >= 0))
2021         break;
2022       else
2023         {
2024           /* The widened memory access overflows the expression, which means
2025              that it could alias another expression.  Zap it.  */
2026           expr = NULL_TREE;
2027           break;
2028         }
2029     }
2030
2031   if (! expr)
2032     memoffset = NULL_RTX;
2033
2034   /* The widened memory may alias other stuff, so zap the alias set.  */
2035   /* ??? Maybe use get_alias_set on any remaining expression.  */
2036
2037   MEM_ATTRS (new) = get_mem_attrs (0, expr, memoffset, GEN_INT (size),
2038                                    MEM_ALIGN (new), mode);
2039
2040   return new;
2041 }
2042 \f
2043 /* Return a newly created CODE_LABEL rtx with a unique label number.  */
2044
2045 rtx
2046 gen_label_rtx (void)
2047 {
2048   return gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX, NULL_RTX,
2049                              NULL, label_num++, NULL);
2050 }
2051 \f
2052 /* For procedure integration.  */
2053
2054 /* Install new pointers to the first and last insns in the chain.
2055    Also, set cur_insn_uid to one higher than the last in use.
2056    Used for an inline-procedure after copying the insn chain.  */
2057
2058 void
2059 set_new_first_and_last_insn (rtx first, rtx last)
2060 {
2061   rtx insn;
2062
2063   first_insn = first;
2064   last_insn = last;
2065   cur_insn_uid = 0;
2066
2067   for (insn = first; insn; insn = NEXT_INSN (insn))
2068     cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
2069
2070   cur_insn_uid++;
2071 }
2072 \f
2073 /* Go through all the RTL insn bodies and copy any invalid shared
2074    structure.  This routine should only be called once.  */
2075
2076 static void
2077 unshare_all_rtl_1 (tree fndecl, rtx insn)
2078 {
2079   tree decl;
2080
2081   /* Make sure that virtual parameters are not shared.  */
2082   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
2083     SET_DECL_RTL (decl, copy_rtx_if_shared (DECL_RTL (decl)));
2084
2085   /* Make sure that virtual stack slots are not shared.  */
2086   unshare_all_decls (DECL_INITIAL (fndecl));
2087
2088   /* Unshare just about everything else.  */
2089   unshare_all_rtl_in_chain (insn);
2090
2091   /* Make sure the addresses of stack slots found outside the insn chain
2092      (such as, in DECL_RTL of a variable) are not shared
2093      with the insn chain.
2094
2095      This special care is necessary when the stack slot MEM does not
2096      actually appear in the insn chain.  If it does appear, its address
2097      is unshared from all else at that point.  */
2098   stack_slot_list = copy_rtx_if_shared (stack_slot_list);
2099 }
2100
2101 /* Go through all the RTL insn bodies and copy any invalid shared
2102    structure, again.  This is a fairly expensive thing to do so it
2103    should be done sparingly.  */
2104
2105 void
2106 unshare_all_rtl_again (rtx insn)
2107 {
2108   rtx p;
2109   tree decl;
2110
2111   for (p = insn; p; p = NEXT_INSN (p))
2112     if (INSN_P (p))
2113       {
2114         reset_used_flags (PATTERN (p));
2115         reset_used_flags (REG_NOTES (p));
2116         reset_used_flags (LOG_LINKS (p));
2117       }
2118
2119   /* Make sure that virtual stack slots are not shared.  */
2120   reset_used_decls (DECL_INITIAL (cfun->decl));
2121
2122   /* Make sure that virtual parameters are not shared.  */
2123   for (decl = DECL_ARGUMENTS (cfun->decl); decl; decl = TREE_CHAIN (decl))
2124     reset_used_flags (DECL_RTL (decl));
2125
2126   reset_used_flags (stack_slot_list);
2127
2128   unshare_all_rtl_1 (cfun->decl, insn);
2129 }
2130
2131 void
2132 unshare_all_rtl (void)
2133 {
2134   unshare_all_rtl_1 (current_function_decl, get_insns ());
2135 }
2136
2137 /* Check that ORIG is not marked when it should not be and mark ORIG as in use,
2138    Recursively does the same for subexpressions.  */
2139
2140 static void
2141 verify_rtx_sharing (rtx orig, rtx insn)
2142 {
2143   rtx x = orig;
2144   int i;
2145   enum rtx_code code;
2146   const char *format_ptr;
2147
2148   if (x == 0)
2149     return;
2150
2151   code = GET_CODE (x);
2152
2153   /* These types may be freely shared.  */
2154
2155   switch (code)
2156     {
2157     case REG:
2158     case CONST_INT:
2159     case CONST_DOUBLE:
2160     case CONST_VECTOR:
2161     case SYMBOL_REF:
2162     case LABEL_REF:
2163     case CODE_LABEL:
2164     case PC:
2165     case CC0:
2166     case SCRATCH:
2167       return;
2168       /* SCRATCH must be shared because they represent distinct values.  */
2169     case CLOBBER:
2170       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2171         return;
2172       break;
2173
2174     case CONST:
2175       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
2176          a LABEL_REF, it isn't sharable.  */
2177       if (GET_CODE (XEXP (x, 0)) == PLUS
2178           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
2179           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
2180         return;
2181       break;
2182
2183     case MEM:
2184       /* A MEM is allowed to be shared if its address is constant.  */
2185       if (CONSTANT_ADDRESS_P (XEXP (x, 0))
2186           || reload_completed || reload_in_progress)
2187         return;
2188
2189       break;
2190
2191     default:
2192       break;
2193     }
2194
2195   /* This rtx may not be shared.  If it has already been seen,
2196      replace it with a copy of itself.  */
2197 #ifdef ENABLE_CHECKING
2198   if (RTX_FLAG (x, used))
2199     {
2200       error ("Invalid rtl sharing found in the insn");
2201       debug_rtx (insn);
2202       error ("Shared rtx");
2203       debug_rtx (x);
2204       internal_error ("Internal consistency failure");
2205     }
2206 #endif
2207   gcc_assert (!RTX_FLAG (x, used));
2208   
2209   RTX_FLAG (x, used) = 1;
2210
2211   /* Now scan the subexpressions recursively.  */
2212
2213   format_ptr = GET_RTX_FORMAT (code);
2214
2215   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2216     {
2217       switch (*format_ptr++)
2218         {
2219         case 'e':
2220           verify_rtx_sharing (XEXP (x, i), insn);
2221           break;
2222
2223         case 'E':
2224           if (XVEC (x, i) != NULL)
2225             {
2226               int j;
2227               int len = XVECLEN (x, i);
2228
2229               for (j = 0; j < len; j++)
2230                 {
2231                   /* We allow sharing of ASM_OPERANDS inside single
2232                      instruction.  */
2233                   if (j && GET_CODE (XVECEXP (x, i, j)) == SET
2234                       && (GET_CODE (SET_SRC (XVECEXP (x, i, j)))
2235                           == ASM_OPERANDS))
2236                     verify_rtx_sharing (SET_DEST (XVECEXP (x, i, j)), insn);
2237                   else
2238                     verify_rtx_sharing (XVECEXP (x, i, j), insn);
2239                 }
2240             }
2241           break;
2242         }
2243     }
2244   return;
2245 }
2246
2247 /* Go through all the RTL insn bodies and check that there is no unexpected
2248    sharing in between the subexpressions.  */
2249
2250 void
2251 verify_rtl_sharing (void)
2252 {
2253   rtx p;
2254
2255   for (p = get_insns (); p; p = NEXT_INSN (p))
2256     if (INSN_P (p))
2257       {
2258         reset_used_flags (PATTERN (p));
2259         reset_used_flags (REG_NOTES (p));
2260         reset_used_flags (LOG_LINKS (p));
2261       }
2262
2263   for (p = get_insns (); p; p = NEXT_INSN (p))
2264     if (INSN_P (p))
2265       {
2266         verify_rtx_sharing (PATTERN (p), p);
2267         verify_rtx_sharing (REG_NOTES (p), p);
2268         verify_rtx_sharing (LOG_LINKS (p), p);
2269       }
2270 }
2271
2272 /* Go through all the RTL insn bodies and copy any invalid shared structure.
2273    Assumes the mark bits are cleared at entry.  */
2274
2275 void
2276 unshare_all_rtl_in_chain (rtx insn)
2277 {
2278   for (; insn; insn = NEXT_INSN (insn))
2279     if (INSN_P (insn))
2280       {
2281         PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn));
2282         REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn));
2283         LOG_LINKS (insn) = copy_rtx_if_shared (LOG_LINKS (insn));
2284       }
2285 }
2286
2287 /* Go through all virtual stack slots of a function and copy any
2288    shared structure.  */
2289 static void
2290 unshare_all_decls (tree blk)
2291 {
2292   tree t;
2293
2294   /* Copy shared decls.  */
2295   for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
2296     if (DECL_RTL_SET_P (t))
2297       SET_DECL_RTL (t, copy_rtx_if_shared (DECL_RTL (t)));
2298
2299   /* Now process sub-blocks.  */
2300   for (t = BLOCK_SUBBLOCKS (blk); t; t = TREE_CHAIN (t))
2301     unshare_all_decls (t);
2302 }
2303
2304 /* Go through all virtual stack slots of a function and mark them as
2305    not shared.  */
2306 static void
2307 reset_used_decls (tree blk)
2308 {
2309   tree t;
2310
2311   /* Mark decls.  */
2312   for (t = BLOCK_VARS (blk); t; t = TREE_CHAIN (t))
2313     if (DECL_RTL_SET_P (t))
2314       reset_used_flags (DECL_RTL (t));
2315
2316   /* Now process sub-blocks.  */
2317   for (t = BLOCK_SUBBLOCKS (blk); t; t = TREE_CHAIN (t))
2318     reset_used_decls (t);
2319 }
2320
2321 /* Mark ORIG as in use, and return a copy of it if it was already in use.
2322    Recursively does the same for subexpressions.  Uses
2323    copy_rtx_if_shared_1 to reduce stack space.  */
2324
2325 rtx
2326 copy_rtx_if_shared (rtx orig)
2327 {
2328   copy_rtx_if_shared_1 (&orig);
2329   return orig;
2330 }
2331
2332 /* Mark *ORIG1 as in use, and set it to a copy of it if it was already in
2333    use.  Recursively does the same for subexpressions.  */
2334
2335 static void
2336 copy_rtx_if_shared_1 (rtx *orig1)
2337 {
2338   rtx x;
2339   int i;
2340   enum rtx_code code;
2341   rtx *last_ptr;
2342   const char *format_ptr;
2343   int copied = 0;
2344   int length;
2345
2346   /* Repeat is used to turn tail-recursion into iteration.  */
2347 repeat:
2348   x = *orig1;
2349
2350   if (x == 0)
2351     return;
2352
2353   code = GET_CODE (x);
2354
2355   /* These types may be freely shared.  */
2356
2357   switch (code)
2358     {
2359     case REG:
2360     case CONST_INT:
2361     case CONST_DOUBLE:
2362     case CONST_VECTOR:
2363     case SYMBOL_REF:
2364     case LABEL_REF:
2365     case CODE_LABEL:
2366     case PC:
2367     case CC0:
2368     case SCRATCH:
2369       /* SCRATCH must be shared because they represent distinct values.  */
2370       return;
2371     case CLOBBER:
2372       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2373         return;
2374       break;
2375
2376     case CONST:
2377       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
2378          a LABEL_REF, it isn't sharable.  */
2379       if (GET_CODE (XEXP (x, 0)) == PLUS
2380           && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
2381           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT)
2382         return;
2383       break;
2384
2385     case INSN:
2386     case JUMP_INSN:
2387     case CALL_INSN:
2388     case NOTE:
2389     case BARRIER:
2390       /* The chain of insns is not being copied.  */
2391       return;
2392
2393     default:
2394       break;
2395     }
2396
2397   /* This rtx may not be shared.  If it has already been seen,
2398      replace it with a copy of itself.  */
2399
2400   if (RTX_FLAG (x, used))
2401     {
2402       rtx copy;
2403
2404       copy = rtx_alloc (code);
2405       memcpy (copy, x, RTX_SIZE (code));
2406       x = copy;
2407       copied = 1;
2408     }
2409   RTX_FLAG (x, used) = 1;
2410
2411   /* Now scan the subexpressions recursively.
2412      We can store any replaced subexpressions directly into X
2413      since we know X is not shared!  Any vectors in X
2414      must be copied if X was copied.  */
2415
2416   format_ptr = GET_RTX_FORMAT (code);
2417   length = GET_RTX_LENGTH (code);
2418   last_ptr = NULL;
2419   
2420   for (i = 0; i < length; i++)
2421     {
2422       switch (*format_ptr++)
2423         {
2424         case 'e':
2425           if (last_ptr)
2426             copy_rtx_if_shared_1 (last_ptr);
2427           last_ptr = &XEXP (x, i);
2428           break;
2429
2430         case 'E':
2431           if (XVEC (x, i) != NULL)
2432             {
2433               int j;
2434               int len = XVECLEN (x, i);
2435               
2436               /* Copy the vector iff I copied the rtx and the length
2437                  is nonzero.  */
2438               if (copied && len > 0)
2439                 XVEC (x, i) = gen_rtvec_v (len, XVEC (x, i)->elem);
2440               
2441               /* Call recursively on all inside the vector.  */
2442               for (j = 0; j < len; j++)
2443                 {
2444                   if (last_ptr)
2445                     copy_rtx_if_shared_1 (last_ptr);
2446                   last_ptr = &XVECEXP (x, i, j);
2447                 }
2448             }
2449           break;
2450         }
2451     }
2452   *orig1 = x;
2453   if (last_ptr)
2454     {
2455       orig1 = last_ptr;
2456       goto repeat;
2457     }
2458   return;
2459 }
2460
2461 /* Clear all the USED bits in X to allow copy_rtx_if_shared to be used
2462    to look for shared sub-parts.  */
2463
2464 void
2465 reset_used_flags (rtx x)
2466 {
2467   int i, j;
2468   enum rtx_code code;
2469   const char *format_ptr;
2470   int length;
2471
2472   /* Repeat is used to turn tail-recursion into iteration.  */
2473 repeat:
2474   if (x == 0)
2475     return;
2476
2477   code = GET_CODE (x);
2478
2479   /* These types may be freely shared so we needn't do any resetting
2480      for them.  */
2481
2482   switch (code)
2483     {
2484     case REG:
2485     case CONST_INT:
2486     case CONST_DOUBLE:
2487     case CONST_VECTOR:
2488     case SYMBOL_REF:
2489     case CODE_LABEL:
2490     case PC:
2491     case CC0:
2492       return;
2493
2494     case INSN:
2495     case JUMP_INSN:
2496     case CALL_INSN:
2497     case NOTE:
2498     case LABEL_REF:
2499     case BARRIER:
2500       /* The chain of insns is not being copied.  */
2501       return;
2502
2503     default:
2504       break;
2505     }
2506
2507   RTX_FLAG (x, used) = 0;
2508
2509   format_ptr = GET_RTX_FORMAT (code);
2510   length = GET_RTX_LENGTH (code);
2511   
2512   for (i = 0; i < length; i++)
2513     {
2514       switch (*format_ptr++)
2515         {
2516         case 'e':
2517           if (i == length-1)
2518             {
2519               x = XEXP (x, i);
2520               goto repeat;
2521             }
2522           reset_used_flags (XEXP (x, i));
2523           break;
2524
2525         case 'E':
2526           for (j = 0; j < XVECLEN (x, i); j++)
2527             reset_used_flags (XVECEXP (x, i, j));
2528           break;
2529         }
2530     }
2531 }
2532
2533 /* Set all the USED bits in X to allow copy_rtx_if_shared to be used
2534    to look for shared sub-parts.  */
2535
2536 void
2537 set_used_flags (rtx x)
2538 {
2539   int i, j;
2540   enum rtx_code code;
2541   const char *format_ptr;
2542
2543   if (x == 0)
2544     return;
2545
2546   code = GET_CODE (x);
2547
2548   /* These types may be freely shared so we needn't do any resetting
2549      for them.  */
2550
2551   switch (code)
2552     {
2553     case REG:
2554     case CONST_INT:
2555     case CONST_DOUBLE:
2556     case CONST_VECTOR:
2557     case SYMBOL_REF:
2558     case CODE_LABEL:
2559     case PC:
2560     case CC0:
2561       return;
2562
2563     case INSN:
2564     case JUMP_INSN:
2565     case CALL_INSN:
2566     case NOTE:
2567     case LABEL_REF:
2568     case BARRIER:
2569       /* The chain of insns is not being copied.  */
2570       return;
2571
2572     default:
2573       break;
2574     }
2575
2576   RTX_FLAG (x, used) = 1;
2577
2578   format_ptr = GET_RTX_FORMAT (code);
2579   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2580     {
2581       switch (*format_ptr++)
2582         {
2583         case 'e':
2584           set_used_flags (XEXP (x, i));
2585           break;
2586
2587         case 'E':
2588           for (j = 0; j < XVECLEN (x, i); j++)
2589             set_used_flags (XVECEXP (x, i, j));
2590           break;
2591         }
2592     }
2593 }
2594 \f
2595 /* Copy X if necessary so that it won't be altered by changes in OTHER.
2596    Return X or the rtx for the pseudo reg the value of X was copied into.
2597    OTHER must be valid as a SET_DEST.  */
2598
2599 rtx
2600 make_safe_from (rtx x, rtx other)
2601 {
2602   while (1)
2603     switch (GET_CODE (other))
2604       {
2605       case SUBREG:
2606         other = SUBREG_REG (other);
2607         break;
2608       case STRICT_LOW_PART:
2609       case SIGN_EXTEND:
2610       case ZERO_EXTEND:
2611         other = XEXP (other, 0);
2612         break;
2613       default:
2614         goto done;
2615       }
2616  done:
2617   if ((MEM_P (other)
2618        && ! CONSTANT_P (x)
2619        && !REG_P (x)
2620        && GET_CODE (x) != SUBREG)
2621       || (REG_P (other)
2622           && (REGNO (other) < FIRST_PSEUDO_REGISTER
2623               || reg_mentioned_p (other, x))))
2624     {
2625       rtx temp = gen_reg_rtx (GET_MODE (x));
2626       emit_move_insn (temp, x);
2627       return temp;
2628     }
2629   return x;
2630 }
2631 \f
2632 /* Emission of insns (adding them to the doubly-linked list).  */
2633
2634 /* Return the first insn of the current sequence or current function.  */
2635
2636 rtx
2637 get_insns (void)
2638 {
2639   return first_insn;
2640 }
2641
2642 /* Specify a new insn as the first in the chain.  */
2643
2644 void
2645 set_first_insn (rtx insn)
2646 {
2647   gcc_assert (!PREV_INSN (insn));
2648   first_insn = insn;
2649 }
2650
2651 /* Return the last insn emitted in current sequence or current function.  */
2652
2653 rtx
2654 get_last_insn (void)
2655 {
2656   return last_insn;
2657 }
2658
2659 /* Specify a new insn as the last in the chain.  */
2660
2661 void
2662 set_last_insn (rtx insn)
2663 {
2664   gcc_assert (!NEXT_INSN (insn));
2665   last_insn = insn;
2666 }
2667
2668 /* Return the last insn emitted, even if it is in a sequence now pushed.  */
2669
2670 rtx
2671 get_last_insn_anywhere (void)
2672 {
2673   struct sequence_stack *stack;
2674   if (last_insn)
2675     return last_insn;
2676   for (stack = seq_stack; stack; stack = stack->next)
2677     if (stack->last != 0)
2678       return stack->last;
2679   return 0;
2680 }
2681
2682 /* Return the first nonnote insn emitted in current sequence or current
2683    function.  This routine looks inside SEQUENCEs.  */
2684
2685 rtx
2686 get_first_nonnote_insn (void)
2687 {
2688   rtx insn = first_insn;
2689
2690   if (insn)
2691     {
2692       if (NOTE_P (insn))
2693         for (insn = next_insn (insn);
2694              insn && NOTE_P (insn);
2695              insn = next_insn (insn))
2696           continue;
2697       else
2698         {
2699           if (GET_CODE (insn) == INSN
2700               && GET_CODE (PATTERN (insn)) == SEQUENCE)
2701             insn = XVECEXP (PATTERN (insn), 0, 0);
2702         }
2703     }
2704
2705   return insn;
2706 }
2707
2708 /* Return the last nonnote insn emitted in current sequence or current
2709    function.  This routine looks inside SEQUENCEs.  */
2710
2711 rtx
2712 get_last_nonnote_insn (void)
2713 {
2714   rtx insn = last_insn;
2715
2716   if (insn)
2717     {
2718       if (NOTE_P (insn))
2719         for (insn = previous_insn (insn);
2720              insn && NOTE_P (insn);
2721              insn = previous_insn (insn))
2722           continue;
2723       else
2724         {
2725           if (GET_CODE (insn) == INSN
2726               && GET_CODE (PATTERN (insn)) == SEQUENCE)
2727             insn = XVECEXP (PATTERN (insn), 0,
2728                             XVECLEN (PATTERN (insn), 0) - 1);
2729         }
2730     }
2731
2732   return insn;
2733 }
2734
2735 /* Return a number larger than any instruction's uid in this function.  */
2736
2737 int
2738 get_max_uid (void)
2739 {
2740   return cur_insn_uid;
2741 }
2742
2743 /* Renumber instructions so that no instruction UIDs are wasted.  */
2744
2745 void
2746 renumber_insns (FILE *stream)
2747 {
2748   rtx insn;
2749
2750   /* If we're not supposed to renumber instructions, don't.  */
2751   if (!flag_renumber_insns)
2752     return;
2753
2754   /* If there aren't that many instructions, then it's not really
2755      worth renumbering them.  */
2756   if (flag_renumber_insns == 1 && get_max_uid () < 25000)
2757     return;
2758
2759   cur_insn_uid = 1;
2760
2761   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2762     {
2763       if (stream)
2764         fprintf (stream, "Renumbering insn %d to %d\n",
2765                  INSN_UID (insn), cur_insn_uid);
2766       INSN_UID (insn) = cur_insn_uid++;
2767     }
2768 }
2769 \f
2770 /* Return the next insn.  If it is a SEQUENCE, return the first insn
2771    of the sequence.  */
2772
2773 rtx
2774 next_insn (rtx insn)
2775 {
2776   if (insn)
2777     {
2778       insn = NEXT_INSN (insn);
2779       if (insn && NONJUMP_INSN_P (insn)
2780           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2781         insn = XVECEXP (PATTERN (insn), 0, 0);
2782     }
2783
2784   return insn;
2785 }
2786
2787 /* Return the previous insn.  If it is a SEQUENCE, return the last insn
2788    of the sequence.  */
2789
2790 rtx
2791 previous_insn (rtx insn)
2792 {
2793   if (insn)
2794     {
2795       insn = PREV_INSN (insn);
2796       if (insn && NONJUMP_INSN_P (insn)
2797           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2798         insn = XVECEXP (PATTERN (insn), 0, XVECLEN (PATTERN (insn), 0) - 1);
2799     }
2800
2801   return insn;
2802 }
2803
2804 /* Return the next insn after INSN that is not a NOTE.  This routine does not
2805    look inside SEQUENCEs.  */
2806
2807 rtx
2808 next_nonnote_insn (rtx insn)
2809 {
2810   while (insn)
2811     {
2812       insn = NEXT_INSN (insn);
2813       if (insn == 0 || !NOTE_P (insn))
2814         break;
2815     }
2816
2817   return insn;
2818 }
2819
2820 /* Return the previous insn before INSN that is not a NOTE.  This routine does
2821    not look inside SEQUENCEs.  */
2822
2823 rtx
2824 prev_nonnote_insn (rtx insn)
2825 {
2826   while (insn)
2827     {
2828       insn = PREV_INSN (insn);
2829       if (insn == 0 || !NOTE_P (insn))
2830         break;
2831     }
2832
2833   return insn;
2834 }
2835
2836 /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
2837    or 0, if there is none.  This routine does not look inside
2838    SEQUENCEs.  */
2839
2840 rtx
2841 next_real_insn (rtx insn)
2842 {
2843   while (insn)
2844     {
2845       insn = NEXT_INSN (insn);
2846       if (insn == 0 || INSN_P (insn))
2847         break;
2848     }
2849
2850   return insn;
2851 }
2852
2853 /* Return the last INSN, CALL_INSN or JUMP_INSN before INSN;
2854    or 0, if there is none.  This routine does not look inside
2855    SEQUENCEs.  */
2856
2857 rtx
2858 prev_real_insn (rtx insn)
2859 {
2860   while (insn)
2861     {
2862       insn = PREV_INSN (insn);
2863       if (insn == 0 || INSN_P (insn))
2864         break;
2865     }
2866
2867   return insn;
2868 }
2869
2870 /* Return the last CALL_INSN in the current list, or 0 if there is none.
2871    This routine does not look inside SEQUENCEs.  */
2872
2873 rtx
2874 last_call_insn (void)
2875 {
2876   rtx insn;
2877
2878   for (insn = get_last_insn ();
2879        insn && !CALL_P (insn);
2880        insn = PREV_INSN (insn))
2881     ;
2882
2883   return insn;
2884 }
2885
2886 /* Find the next insn after INSN that really does something.  This routine
2887    does not look inside SEQUENCEs.  Until reload has completed, this is the
2888    same as next_real_insn.  */
2889
2890 int
2891 active_insn_p (rtx insn)
2892 {
2893   return (CALL_P (insn) || JUMP_P (insn)
2894           || (NONJUMP_INSN_P (insn)
2895               && (! reload_completed
2896                   || (GET_CODE (PATTERN (insn)) != USE
2897                       && GET_CODE (PATTERN (insn)) != CLOBBER))));
2898 }
2899
2900 rtx
2901 next_active_insn (rtx insn)
2902 {
2903   while (insn)
2904     {
2905       insn = NEXT_INSN (insn);
2906       if (insn == 0 || active_insn_p (insn))
2907         break;
2908     }
2909
2910   return insn;
2911 }
2912
2913 /* Find the last insn before INSN that really does something.  This routine
2914    does not look inside SEQUENCEs.  Until reload has completed, this is the
2915    same as prev_real_insn.  */
2916
2917 rtx
2918 prev_active_insn (rtx insn)
2919 {
2920   while (insn)
2921     {
2922       insn = PREV_INSN (insn);
2923       if (insn == 0 || active_insn_p (insn))
2924         break;
2925     }
2926
2927   return insn;
2928 }
2929
2930 /* Return the next CODE_LABEL after the insn INSN, or 0 if there is none.  */
2931
2932 rtx
2933 next_label (rtx insn)
2934 {
2935   while (insn)
2936     {
2937       insn = NEXT_INSN (insn);
2938       if (insn == 0 || LABEL_P (insn))
2939         break;
2940     }
2941
2942   return insn;
2943 }
2944
2945 /* Return the last CODE_LABEL before the insn INSN, or 0 if there is none.  */
2946
2947 rtx
2948 prev_label (rtx insn)
2949 {
2950   while (insn)
2951     {
2952       insn = PREV_INSN (insn);
2953       if (insn == 0 || LABEL_P (insn))
2954         break;
2955     }
2956
2957   return insn;
2958 }
2959
2960 /* Return the last label to mark the same position as LABEL.  Return null
2961    if LABEL itself is null.  */
2962
2963 rtx
2964 skip_consecutive_labels (rtx label)
2965 {
2966   rtx insn;
2967
2968   for (insn = label; insn != 0 && !INSN_P (insn); insn = NEXT_INSN (insn))
2969     if (LABEL_P (insn))
2970       label = insn;
2971
2972   return label;
2973 }
2974 \f
2975 #ifdef HAVE_cc0
2976 /* INSN uses CC0 and is being moved into a delay slot.  Set up REG_CC_SETTER
2977    and REG_CC_USER notes so we can find it.  */
2978
2979 void
2980 link_cc0_insns (rtx insn)
2981 {
2982   rtx user = next_nonnote_insn (insn);
2983
2984   if (NONJUMP_INSN_P (user) && GET_CODE (PATTERN (user)) == SEQUENCE)
2985     user = XVECEXP (PATTERN (user), 0, 0);
2986
2987   REG_NOTES (user) = gen_rtx_INSN_LIST (REG_CC_SETTER, insn,
2988                                         REG_NOTES (user));
2989   REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_CC_USER, user, REG_NOTES (insn));
2990 }
2991
2992 /* Return the next insn that uses CC0 after INSN, which is assumed to
2993    set it.  This is the inverse of prev_cc0_setter (i.e., prev_cc0_setter
2994    applied to the result of this function should yield INSN).
2995
2996    Normally, this is simply the next insn.  However, if a REG_CC_USER note
2997    is present, it contains the insn that uses CC0.
2998
2999    Return 0 if we can't find the insn.  */
3000
3001 rtx
3002 next_cc0_user (rtx insn)
3003 {
3004   rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
3005
3006   if (note)
3007     return XEXP (note, 0);
3008
3009   insn = next_nonnote_insn (insn);
3010   if (insn && NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
3011     insn = XVECEXP (PATTERN (insn), 0, 0);
3012
3013   if (insn && INSN_P (insn) && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
3014     return insn;
3015
3016   return 0;
3017 }
3018
3019 /* Find the insn that set CC0 for INSN.  Unless INSN has a REG_CC_SETTER
3020    note, it is the previous insn.  */
3021
3022 rtx
3023 prev_cc0_setter (rtx insn)
3024 {
3025   rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
3026
3027   if (note)
3028     return XEXP (note, 0);
3029
3030   insn = prev_nonnote_insn (insn);
3031   gcc_assert (sets_cc0_p (PATTERN (insn)));
3032
3033   return insn;
3034 }
3035 #endif
3036
3037 /* Increment the label uses for all labels present in rtx.  */
3038
3039 static void
3040 mark_label_nuses (rtx x)
3041 {
3042   enum rtx_code code;
3043   int i, j;
3044   const char *fmt;
3045
3046   code = GET_CODE (x);
3047   if (code == LABEL_REF && LABEL_P (XEXP (x, 0)))
3048     LABEL_NUSES (XEXP (x, 0))++;
3049
3050   fmt = GET_RTX_FORMAT (code);
3051   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3052     {
3053       if (fmt[i] == 'e')
3054         mark_label_nuses (XEXP (x, i));
3055       else if (fmt[i] == 'E')
3056         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3057           mark_label_nuses (XVECEXP (x, i, j));
3058     }
3059 }
3060
3061 \f
3062 /* Try splitting insns that can be split for better scheduling.
3063    PAT is the pattern which might split.
3064    TRIAL is the insn providing PAT.
3065    LAST is nonzero if we should return the last insn of the sequence produced.
3066
3067    If this routine succeeds in splitting, it returns the first or last
3068    replacement insn depending on the value of LAST.  Otherwise, it
3069    returns TRIAL.  If the insn to be returned can be split, it will be.  */
3070
3071 rtx
3072 try_split (rtx pat, rtx trial, int last)
3073 {
3074   rtx before = PREV_INSN (trial);
3075   rtx after = NEXT_INSN (trial);
3076   int has_barrier = 0;
3077   rtx tem;
3078   rtx note, seq;
3079   int probability;
3080   rtx insn_last, insn;
3081   int njumps = 0;
3082
3083   if (any_condjump_p (trial)
3084       && (note = find_reg_note (trial, REG_BR_PROB, 0)))
3085     split_branch_probability = INTVAL (XEXP (note, 0));
3086   probability = split_branch_probability;
3087
3088   seq = split_insns (pat, trial);
3089
3090   split_branch_probability = -1;
3091
3092   /* If we are splitting a JUMP_INSN, it might be followed by a BARRIER.
3093      We may need to handle this specially.  */
3094   if (after && BARRIER_P (after))
3095     {
3096       has_barrier = 1;
3097       after = NEXT_INSN (after);
3098     }
3099
3100   if (!seq)
3101     return trial;
3102
3103   /* Avoid infinite loop if any insn of the result matches
3104      the original pattern.  */
3105   insn_last = seq;
3106   while (1)
3107     {
3108       if (INSN_P (insn_last)
3109           && rtx_equal_p (PATTERN (insn_last), pat))
3110         return trial;
3111       if (!NEXT_INSN (insn_last))
3112         break;
3113       insn_last = NEXT_INSN (insn_last);
3114     }
3115
3116   /* Mark labels.  */
3117   for (insn = insn_last; insn ; insn = PREV_INSN (insn))
3118     {
3119       if (JUMP_P (insn))
3120         {
3121           mark_jump_label (PATTERN (insn), insn, 0);
3122           njumps++;
3123           if (probability != -1
3124               && any_condjump_p (insn)
3125               && !find_reg_note (insn, REG_BR_PROB, 0))
3126             {
3127               /* We can preserve the REG_BR_PROB notes only if exactly
3128                  one jump is created, otherwise the machine description
3129                  is responsible for this step using
3130                  split_branch_probability variable.  */
3131               gcc_assert (njumps == 1);
3132               REG_NOTES (insn)
3133                 = gen_rtx_EXPR_LIST (REG_BR_PROB,
3134                                      GEN_INT (probability),
3135                                      REG_NOTES (insn));
3136             }
3137         }
3138     }
3139
3140   /* If we are splitting a CALL_INSN, look for the CALL_INSN
3141      in SEQ and copy our CALL_INSN_FUNCTION_USAGE to it.  */
3142   if (CALL_P (trial))
3143     {
3144       for (insn = insn_last; insn ; insn = PREV_INSN (insn))
3145         if (CALL_P (insn))
3146           {
3147             rtx *p = &CALL_INSN_FUNCTION_USAGE (insn);
3148             while (*p)
3149               p = &XEXP (*p, 1);
3150             *p = CALL_INSN_FUNCTION_USAGE (trial);
3151             SIBLING_CALL_P (insn) = SIBLING_CALL_P (trial);
3152           }
3153     }
3154
3155   /* Copy notes, particularly those related to the CFG.  */
3156   for (note = REG_NOTES (trial); note; note = XEXP (note, 1))
3157     {
3158       switch (REG_NOTE_KIND (note))
3159         {
3160         case REG_EH_REGION:
3161           insn = insn_last;
3162           while (insn != NULL_RTX)
3163             {
3164               if (CALL_P (insn)
3165                   || (flag_non_call_exceptions && INSN_P (insn)
3166                       && may_trap_p (PATTERN (insn))))
3167                 REG_NOTES (insn)
3168                   = gen_rtx_EXPR_LIST (REG_EH_REGION,
3169                                        XEXP (note, 0),
3170                                        REG_NOTES (insn));
3171               insn = PREV_INSN (insn);
3172             }
3173           break;
3174
3175         case REG_NORETURN:
3176         case REG_SETJMP:
3177           insn = insn_last;
3178           while (insn != NULL_RTX)
3179             {
3180               if (CALL_P (insn))
3181                 REG_NOTES (insn)
3182                   = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
3183                                        XEXP (note, 0),
3184                                        REG_NOTES (insn));
3185               insn = PREV_INSN (insn);
3186             }
3187           break;
3188
3189         case REG_NON_LOCAL_GOTO:
3190           insn = insn_last;
3191           while (insn != NULL_RTX)
3192             {
3193               if (JUMP_P (insn))
3194                 REG_NOTES (insn)
3195                   = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
3196                                        XEXP (note, 0),
3197                                        REG_NOTES (insn));
3198               insn = PREV_INSN (insn);
3199             }
3200           break;
3201
3202         default:
3203           break;
3204         }
3205     }
3206
3207   /* If there are LABELS inside the split insns increment the
3208      usage count so we don't delete the label.  */
3209   if (NONJUMP_INSN_P (trial))
3210     {
3211       insn = insn_last;
3212       while (insn != NULL_RTX)
3213         {
3214           if (NONJUMP_INSN_P (insn))
3215             mark_label_nuses (PATTERN (insn));
3216
3217           insn = PREV_INSN (insn);
3218         }
3219     }
3220
3221   tem = emit_insn_after_setloc (seq, trial, INSN_LOCATOR (trial));
3222
3223   delete_insn (trial);
3224   if (has_barrier)
3225     emit_barrier_after (tem);
3226
3227   /* Recursively call try_split for each new insn created; by the
3228      time control returns here that insn will be fully split, so
3229      set LAST and continue from the insn after the one returned.
3230      We can't use next_active_insn here since AFTER may be a note.
3231      Ignore deleted insns, which can be occur if not optimizing.  */
3232   for (tem = NEXT_INSN (before); tem != after; tem = NEXT_INSN (tem))
3233     if (! INSN_DELETED_P (tem) && INSN_P (tem))
3234       tem = try_split (PATTERN (tem), tem, 1);
3235
3236   /* Return either the first or the last insn, depending on which was
3237      requested.  */
3238   return last
3239     ? (after ? PREV_INSN (after) : last_insn)
3240     : NEXT_INSN (before);
3241 }
3242 \f
3243 /* Make and return an INSN rtx, initializing all its slots.
3244    Store PATTERN in the pattern slots.  */
3245
3246 rtx
3247 make_insn_raw (rtx pattern)
3248 {
3249   rtx insn;
3250
3251   insn = rtx_alloc (INSN);
3252
3253   INSN_UID (insn) = cur_insn_uid++;
3254   PATTERN (insn) = pattern;
3255   INSN_CODE (insn) = -1;
3256   LOG_LINKS (insn) = NULL;
3257   REG_NOTES (insn) = NULL;
3258   INSN_LOCATOR (insn) = 0;
3259   BLOCK_FOR_INSN (insn) = NULL;
3260
3261 #ifdef ENABLE_RTL_CHECKING
3262   if (insn
3263       && INSN_P (insn)
3264       && (returnjump_p (insn)
3265           || (GET_CODE (insn) == SET
3266               && SET_DEST (insn) == pc_rtx)))
3267     {
3268       warning ("ICE: emit_insn used where emit_jump_insn needed:\n");
3269       debug_rtx (insn);
3270     }
3271 #endif
3272
3273   return insn;
3274 }
3275
3276 /* Like `make_insn_raw' but make a JUMP_INSN instead of an insn.  */
3277
3278 static rtx
3279 make_jump_insn_raw (rtx pattern)
3280 {
3281   rtx insn;
3282
3283   insn = rtx_alloc (JUMP_INSN);
3284   INSN_UID (insn) = cur_insn_uid++;
3285
3286   PATTERN (insn) = pattern;
3287   INSN_CODE (insn) = -1;
3288   LOG_LINKS (insn) = NULL;
3289   REG_NOTES (insn) = NULL;
3290   JUMP_LABEL (insn) = NULL;
3291   INSN_LOCATOR (insn) = 0;
3292   BLOCK_FOR_INSN (insn) = NULL;
3293
3294   return insn;
3295 }
3296
3297 /* Like `make_insn_raw' but make a CALL_INSN instead of an insn.  */
3298
3299 static rtx
3300 make_call_insn_raw (rtx pattern)
3301 {
3302   rtx insn;
3303
3304   insn = rtx_alloc (CALL_INSN);
3305   INSN_UID (insn) = cur_insn_uid++;
3306
3307   PATTERN (insn) = pattern;
3308   INSN_CODE (insn) = -1;
3309   LOG_LINKS (insn) = NULL;
3310   REG_NOTES (insn) = NULL;
3311   CALL_INSN_FUNCTION_USAGE (insn) = NULL;
3312   INSN_LOCATOR (insn) = 0;
3313   BLOCK_FOR_INSN (insn) = NULL;
3314
3315   return insn;
3316 }
3317 \f
3318 /* Add INSN to the end of the doubly-linked list.
3319    INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE.  */
3320
3321 void
3322 add_insn (rtx insn)
3323 {
3324   PREV_INSN (insn) = last_insn;
3325   NEXT_INSN (insn) = 0;
3326
3327   if (NULL != last_insn)
3328     NEXT_INSN (last_insn) = insn;
3329
3330   if (NULL == first_insn)
3331     first_insn = insn;
3332
3333   last_insn = insn;
3334 }
3335
3336 /* Add INSN into the doubly-linked list after insn AFTER.  This and
3337    the next should be the only functions called to insert an insn once
3338    delay slots have been filled since only they know how to update a
3339    SEQUENCE.  */
3340
3341 void
3342 add_insn_after (rtx insn, rtx after)
3343 {
3344   rtx next = NEXT_INSN (after);
3345   basic_block bb;
3346
3347   gcc_assert (!optimize || !INSN_DELETED_P (after));
3348
3349   NEXT_INSN (insn) = next;
3350   PREV_INSN (insn) = after;
3351
3352   if (next)
3353     {
3354       PREV_INSN (next) = insn;
3355       if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
3356         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
3357     }
3358   else if (last_insn == after)
3359     last_insn = insn;
3360   else
3361     {
3362       struct sequence_stack *stack = seq_stack;
3363       /* Scan all pending sequences too.  */
3364       for (; stack; stack = stack->next)
3365         if (after == stack->last)
3366           {
3367             stack->last = insn;
3368             break;
3369           }
3370
3371       gcc_assert (stack);
3372     }
3373
3374   if (!BARRIER_P (after)
3375       && !BARRIER_P (insn)
3376       && (bb = BLOCK_FOR_INSN (after)))
3377     {
3378       set_block_for_insn (insn, bb);
3379       if (INSN_P (insn))
3380         bb->flags |= BB_DIRTY;
3381       /* Should not happen as first in the BB is always
3382          either NOTE or LABEL.  */
3383       if (BB_END (bb) == after
3384           /* Avoid clobbering of structure when creating new BB.  */
3385           && !BARRIER_P (insn)
3386           && (!NOTE_P (insn)
3387               || NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK))
3388         BB_END (bb) = insn;
3389     }
3390
3391   NEXT_INSN (after) = insn;
3392   if (NONJUMP_INSN_P (after) && GET_CODE (PATTERN (after)) == SEQUENCE)
3393     {
3394       rtx sequence = PATTERN (after);
3395       NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3396     }
3397 }
3398
3399 /* Add INSN into the doubly-linked list before insn BEFORE.  This and
3400    the previous should be the only functions called to insert an insn once
3401    delay slots have been filled since only they know how to update a
3402    SEQUENCE.  */
3403
3404 void
3405 add_insn_before (rtx insn, rtx before)
3406 {
3407   rtx prev = PREV_INSN (before);
3408   basic_block bb;
3409
3410   gcc_assert (!optimize || !INSN_DELETED_P (before));
3411
3412   PREV_INSN (insn) = prev;
3413   NEXT_INSN (insn) = before;
3414
3415   if (prev)
3416     {
3417       NEXT_INSN (prev) = insn;
3418       if (NONJUMP_INSN_P (prev) && GET_CODE (PATTERN (prev)) == SEQUENCE)
3419         {
3420           rtx sequence = PATTERN (prev);
3421           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3422         }
3423     }
3424   else if (first_insn == before)
3425     first_insn = insn;
3426   else
3427     {
3428       struct sequence_stack *stack = seq_stack;
3429       /* Scan all pending sequences too.  */
3430       for (; stack; stack = stack->next)
3431         if (before == stack->first)
3432           {
3433             stack->first = insn;
3434             break;
3435           }
3436
3437       gcc_assert (stack);
3438     }
3439
3440   if (!BARRIER_P (before)
3441       && !BARRIER_P (insn)
3442       && (bb = BLOCK_FOR_INSN (before)))
3443     {
3444       set_block_for_insn (insn, bb);
3445       if (INSN_P (insn))
3446         bb->flags |= BB_DIRTY;
3447       /* Should not happen as first in the BB is always either NOTE or
3448          LABEL.  */
3449       gcc_assert (BB_HEAD (bb) != insn
3450                   /* Avoid clobbering of structure when creating new BB.  */
3451                   || BARRIER_P (insn)
3452                   || (NOTE_P (insn)
3453                       && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK));
3454     }
3455
3456   PREV_INSN (before) = insn;
3457   if (NONJUMP_INSN_P (before) && GET_CODE (PATTERN (before)) == SEQUENCE)
3458     PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn;
3459 }
3460
3461 /* Remove an insn from its doubly-linked list.  This function knows how
3462    to handle sequences.  */
3463 void
3464 remove_insn (rtx insn)
3465 {
3466   rtx next = NEXT_INSN (insn);
3467   rtx prev = PREV_INSN (insn);
3468   basic_block bb;
3469
3470   if (prev)
3471     {
3472       NEXT_INSN (prev) = next;
3473       if (NONJUMP_INSN_P (prev) && GET_CODE (PATTERN (prev)) == SEQUENCE)
3474         {
3475           rtx sequence = PATTERN (prev);
3476           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = next;
3477         }
3478     }
3479   else if (first_insn == insn)
3480     first_insn = next;
3481   else
3482     {
3483       struct sequence_stack *stack = seq_stack;
3484       /* Scan all pending sequences too.  */
3485       for (; stack; stack = stack->next)
3486         if (insn == stack->first)
3487           {
3488             stack->first = next;
3489             break;
3490           }
3491
3492       gcc_assert (stack);
3493     }
3494
3495   if (next)
3496     {
3497       PREV_INSN (next) = prev;
3498       if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
3499         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = prev;
3500     }
3501   else if (last_insn == insn)
3502     last_insn = prev;
3503   else
3504     {
3505       struct sequence_stack *stack = seq_stack;
3506       /* Scan all pending sequences too.  */
3507       for (; stack; stack = stack->next)
3508         if (insn == stack->last)
3509           {
3510             stack->last = prev;
3511             break;
3512           }
3513
3514       gcc_assert (stack);
3515     }
3516   if (!BARRIER_P (insn)
3517       && (bb = BLOCK_FOR_INSN (insn)))
3518     {
3519       if (INSN_P (insn))
3520         bb->flags |= BB_DIRTY;
3521       if (BB_HEAD (bb) == insn)
3522         {
3523           /* Never ever delete the basic block note without deleting whole
3524              basic block.  */
3525           gcc_assert (!NOTE_P (insn));
3526           BB_HEAD (bb) = next;
3527         }
3528       if (BB_END (bb) == insn)
3529         BB_END (bb) = prev;
3530     }
3531 }
3532
3533 /* Append CALL_FUSAGE to the CALL_INSN_FUNCTION_USAGE for CALL_INSN.  */
3534
3535 void
3536 add_function_usage_to (rtx call_insn, rtx call_fusage)
3537 {
3538   gcc_assert (call_insn && CALL_P (call_insn));
3539
3540   /* Put the register usage information on the CALL.  If there is already
3541      some usage information, put ours at the end.  */
3542   if (CALL_INSN_FUNCTION_USAGE (call_insn))
3543     {
3544       rtx link;
3545
3546       for (link = CALL_INSN_FUNCTION_USAGE (call_insn); XEXP (link, 1) != 0;
3547            link = XEXP (link, 1))
3548         ;
3549
3550       XEXP (link, 1) = call_fusage;
3551     }
3552   else
3553     CALL_INSN_FUNCTION_USAGE (call_insn) = call_fusage;
3554 }
3555
3556 /* Delete all insns made since FROM.
3557    FROM becomes the new last instruction.  */
3558
3559 void
3560 delete_insns_since (rtx from)
3561 {
3562   if (from == 0)
3563     first_insn = 0;
3564   else
3565     NEXT_INSN (from) = 0;
3566   last_insn = from;
3567 }
3568
3569 /* This function is deprecated, please use sequences instead.
3570
3571    Move a consecutive bunch of insns to a different place in the chain.
3572    The insns to be moved are those between FROM and TO.
3573    They are moved to a new position after the insn AFTER.
3574    AFTER must not be FROM or TO or any insn in between.
3575
3576    This function does not know about SEQUENCEs and hence should not be
3577    called after delay-slot filling has been done.  */
3578
3579 void
3580 reorder_insns_nobb (rtx from, rtx to, rtx after)
3581 {
3582   /* Splice this bunch out of where it is now.  */
3583   if (PREV_INSN (from))
3584     NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to);
3585   if (NEXT_INSN (to))
3586     PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from);
3587   if (last_insn == to)
3588     last_insn = PREV_INSN (from);
3589   if (first_insn == from)
3590     first_insn = NEXT_INSN (to);
3591
3592   /* Make the new neighbors point to it and it to them.  */
3593   if (NEXT_INSN (after))
3594     PREV_INSN (NEXT_INSN (after)) = to;
3595
3596   NEXT_INSN (to) = NEXT_INSN (after);
3597   PREV_INSN (from) = after;
3598   NEXT_INSN (after) = from;
3599   if (after == last_insn)
3600     last_insn = to;
3601 }
3602
3603 /* Same as function above, but take care to update BB boundaries.  */
3604 void
3605 reorder_insns (rtx from, rtx to, rtx after)
3606 {
3607   rtx prev = PREV_INSN (from);
3608   basic_block bb, bb2;
3609
3610   reorder_insns_nobb (from, to, after);
3611
3612   if (!BARRIER_P (after)
3613       && (bb = BLOCK_FOR_INSN (after)))
3614     {
3615       rtx x;
3616       bb->flags |= BB_DIRTY;
3617
3618       if (!BARRIER_P (from)
3619           && (bb2 = BLOCK_FOR_INSN (from)))
3620         {
3621           if (BB_END (bb2) == to)
3622             BB_END (bb2) = prev;
3623           bb2->flags |= BB_DIRTY;
3624         }
3625
3626       if (BB_END (bb) == after)
3627         BB_END (bb) = to;
3628
3629       for (x = from; x != NEXT_INSN (to); x = NEXT_INSN (x))
3630         if (!BARRIER_P (x))
3631           set_block_for_insn (x, bb);
3632     }
3633 }
3634
3635 /* Return the line note insn preceding INSN.  */
3636
3637 static rtx
3638 find_line_note (rtx insn)
3639 {
3640   if (no_line_numbers)
3641     return 0;
3642
3643   for (; insn; insn = PREV_INSN (insn))
3644     if (NOTE_P (insn)
3645         && NOTE_LINE_NUMBER (insn) >= 0)
3646       break;
3647
3648   return insn;
3649 }
3650
3651 /* Remove unnecessary notes from the instruction stream.  */
3652
3653 void
3654 remove_unnecessary_notes (void)
3655 {
3656   rtx eh_stack = NULL_RTX;
3657   rtx insn;
3658   rtx next;
3659   rtx tmp;
3660
3661   /* We must not remove the first instruction in the function because
3662      the compiler depends on the first instruction being a note.  */
3663   for (insn = NEXT_INSN (get_insns ()); insn; insn = next)
3664     {
3665       /* Remember what's next.  */
3666       next = NEXT_INSN (insn);
3667
3668       /* We're only interested in notes.  */
3669       if (!NOTE_P (insn))
3670         continue;
3671
3672       switch (NOTE_LINE_NUMBER (insn))
3673         {
3674         case NOTE_INSN_DELETED:
3675           remove_insn (insn);
3676           break;
3677
3678         case NOTE_INSN_EH_REGION_BEG:
3679           eh_stack = alloc_INSN_LIST (insn, eh_stack);
3680           break;
3681
3682         case NOTE_INSN_EH_REGION_END:
3683           /* Too many end notes.  */
3684           gcc_assert (eh_stack);
3685           /* Mismatched nesting.  */
3686           gcc_assert (NOTE_EH_HANDLER (XEXP (eh_stack, 0))
3687                       == NOTE_EH_HANDLER (insn));
3688           tmp = eh_stack;
3689           eh_stack = XEXP (eh_stack, 1);
3690           free_INSN_LIST_node (tmp);
3691           break;
3692
3693         case NOTE_INSN_BLOCK_BEG:
3694         case NOTE_INSN_BLOCK_END:
3695           /* BLOCK_END and BLOCK_BEG notes only exist in the `final' pass.  */
3696           gcc_unreachable ();
3697
3698         default:
3699           break;
3700         }
3701     }
3702
3703   /* Too many EH_REGION_BEG notes.  */
3704   gcc_assert (!eh_stack);
3705 }
3706
3707 \f
3708 /* Emit insn(s) of given code and pattern
3709    at a specified place within the doubly-linked list.
3710
3711    All of the emit_foo global entry points accept an object
3712    X which is either an insn list or a PATTERN of a single
3713    instruction.
3714
3715    There are thus a few canonical ways to generate code and
3716    emit it at a specific place in the instruction stream.  For
3717    example, consider the instruction named SPOT and the fact that
3718    we would like to emit some instructions before SPOT.  We might
3719    do it like this:
3720
3721         start_sequence ();
3722         ... emit the new instructions ...
3723         insns_head = get_insns ();
3724         end_sequence ();
3725
3726         emit_insn_before (insns_head, SPOT);
3727
3728    It used to be common to generate SEQUENCE rtl instead, but that
3729    is a relic of the past which no longer occurs.  The reason is that
3730    SEQUENCE rtl results in much fragmented RTL memory since the SEQUENCE
3731    generated would almost certainly die right after it was created.  */
3732
3733 /* Make X be output before the instruction BEFORE.  */
3734
3735 rtx
3736 emit_insn_before_noloc (rtx x, rtx before)
3737 {
3738   rtx last = before;
3739   rtx insn;
3740
3741   gcc_assert (before);
3742
3743   if (x == NULL_RTX)
3744     return last;
3745
3746   switch (GET_CODE (x))
3747     {
3748     case INSN:
3749     case JUMP_INSN:
3750     case CALL_INSN:
3751     case CODE_LABEL:
3752     case BARRIER:
3753     case NOTE:
3754       insn = x;
3755       while (insn)
3756         {
3757           rtx next = NEXT_INSN (insn);
3758           add_insn_before (insn, before);
3759           last = insn;
3760           insn = next;
3761         }
3762       break;
3763
3764 #ifdef ENABLE_RTL_CHECKING
3765     case SEQUENCE:
3766       gcc_unreachable ();
3767       break;
3768 #endif
3769
3770     default:
3771       last = make_insn_raw (x);
3772       add_insn_before (last, before);
3773       break;
3774     }
3775
3776   return last;
3777 }
3778
3779 /* Make an instruction with body X and code JUMP_INSN
3780    and output it before the instruction BEFORE.  */
3781
3782 rtx
3783 emit_jump_insn_before_noloc (rtx x, rtx before)
3784 {
3785   rtx insn, last = NULL_RTX;
3786
3787   gcc_assert (before);
3788
3789   switch (GET_CODE (x))
3790     {
3791     case INSN:
3792     case JUMP_INSN:
3793     case CALL_INSN:
3794     case CODE_LABEL:
3795     case BARRIER:
3796     case NOTE:
3797       insn = x;
3798       while (insn)
3799         {
3800           rtx next = NEXT_INSN (insn);
3801           add_insn_before (insn, before);
3802           last = insn;
3803           insn = next;
3804         }
3805       break;
3806
3807 #ifdef ENABLE_RTL_CHECKING
3808     case SEQUENCE:
3809       gcc_unreachable ();
3810       break;
3811 #endif
3812
3813     default:
3814       last = make_jump_insn_raw (x);
3815       add_insn_before (last, before);
3816       break;
3817     }
3818
3819   return last;
3820 }
3821
3822 /* Make an instruction with body X and code CALL_INSN
3823    and output it before the instruction BEFORE.  */
3824
3825 rtx
3826 emit_call_insn_before_noloc (rtx x, rtx before)
3827 {
3828   rtx last = NULL_RTX, insn;
3829
3830   gcc_assert (before);
3831
3832   switch (GET_CODE (x))
3833     {
3834     case INSN:
3835     case JUMP_INSN:
3836     case CALL_INSN:
3837     case CODE_LABEL:
3838     case BARRIER:
3839     case NOTE:
3840       insn = x;
3841       while (insn)
3842         {
3843           rtx next = NEXT_INSN (insn);
3844           add_insn_before (insn, before);
3845           last = insn;
3846           insn = next;
3847         }
3848       break;
3849
3850 #ifdef ENABLE_RTL_CHECKING
3851     case SEQUENCE:
3852       gcc_unreachable ();
3853       break;
3854 #endif
3855
3856     default:
3857       last = make_call_insn_raw (x);
3858       add_insn_before (last, before);
3859       break;
3860     }
3861
3862   return last;
3863 }
3864
3865 /* Make an insn of code BARRIER
3866    and output it before the insn BEFORE.  */
3867
3868 rtx
3869 emit_barrier_before (rtx before)
3870 {
3871   rtx insn = rtx_alloc (BARRIER);
3872
3873   INSN_UID (insn) = cur_insn_uid++;
3874
3875   add_insn_before (insn, before);
3876   return insn;
3877 }
3878
3879 /* Emit the label LABEL before the insn BEFORE.  */
3880
3881 rtx
3882 emit_label_before (rtx label, rtx before)
3883 {
3884   /* This can be called twice for the same label as a result of the
3885      confusion that follows a syntax error!  So make it harmless.  */
3886   if (INSN_UID (label) == 0)
3887     {
3888       INSN_UID (label) = cur_insn_uid++;
3889       add_insn_before (label, before);
3890     }
3891
3892   return label;
3893 }
3894
3895 /* Emit a note of subtype SUBTYPE before the insn BEFORE.  */
3896
3897 rtx
3898 emit_note_before (int subtype, rtx before)
3899 {
3900   rtx note = rtx_alloc (NOTE);
3901   INSN_UID (note) = cur_insn_uid++;
3902 #ifndef USE_MAPPED_LOCATION
3903   NOTE_SOURCE_FILE (note) = 0;
3904 #endif
3905   NOTE_LINE_NUMBER (note) = subtype;
3906   BLOCK_FOR_INSN (note) = NULL;
3907
3908   add_insn_before (note, before);
3909   return note;
3910 }
3911 \f
3912 /* Helper for emit_insn_after, handles lists of instructions
3913    efficiently.  */
3914
3915 static rtx emit_insn_after_1 (rtx, rtx);
3916
3917 static rtx
3918 emit_insn_after_1 (rtx first, rtx after)
3919 {
3920   rtx last;
3921   rtx after_after;
3922   basic_block bb;
3923
3924   if (!BARRIER_P (after)
3925       && (bb = BLOCK_FOR_INSN (after)))
3926     {
3927       bb->flags |= BB_DIRTY;
3928       for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
3929         if (!BARRIER_P (last))
3930           set_block_for_insn (last, bb);
3931       if (!BARRIER_P (last))
3932         set_block_for_insn (last, bb);
3933       if (BB_END (bb) == after)
3934         BB_END (bb) = last;
3935     }
3936   else
3937     for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
3938       continue;
3939
3940   after_after = NEXT_INSN (after);
3941
3942   NEXT_INSN (after) = first;
3943   PREV_INSN (first) = after;
3944   NEXT_INSN (last) = after_after;
3945   if (after_after)
3946     PREV_INSN (after_after) = last;
3947
3948   if (after == last_insn)
3949     last_insn = last;
3950   return last;
3951 }
3952
3953 /* Make X be output after the insn AFTER.  */
3954
3955 rtx
3956 emit_insn_after_noloc (rtx x, rtx after)
3957 {
3958   rtx last = after;
3959
3960   gcc_assert (after);
3961
3962   if (x == NULL_RTX)
3963     return last;
3964
3965   switch (GET_CODE (x))
3966     {
3967     case INSN:
3968     case JUMP_INSN:
3969     case CALL_INSN:
3970     case CODE_LABEL:
3971     case BARRIER:
3972     case NOTE:
3973       last = emit_insn_after_1 (x, after);
3974       break;
3975
3976 #ifdef ENABLE_RTL_CHECKING
3977     case SEQUENCE:
3978       gcc_unreachable ();
3979       break;
3980 #endif
3981
3982     default:
3983       last = make_insn_raw (x);
3984       add_insn_after (last, after);
3985       break;
3986     }
3987
3988   return last;
3989 }
3990
3991 /* Similar to emit_insn_after, except that line notes are to be inserted so
3992    as to act as if this insn were at FROM.  */
3993
3994 void
3995 emit_insn_after_with_line_notes (rtx x, rtx after, rtx from)
3996 {
3997   rtx from_line = find_line_note (from);
3998   rtx after_line = find_line_note (after);
3999   rtx insn = emit_insn_after (x, after);
4000
4001   if (from_line)
4002     emit_note_copy_after (from_line, after);
4003
4004   if (after_line)
4005     emit_note_copy_after (after_line, insn);
4006 }
4007
4008 /* Make an insn of code JUMP_INSN with body X
4009    and output it after the insn AFTER.  */
4010
4011 rtx
4012 emit_jump_insn_after_noloc (rtx x, rtx after)
4013 {
4014   rtx last;
4015
4016   gcc_assert (after);
4017
4018   switch (GET_CODE (x))
4019     {
4020     case INSN:
4021     case JUMP_INSN:
4022     case CALL_INSN:
4023     case CODE_LABEL:
4024     case BARRIER:
4025     case NOTE:
4026       last = emit_insn_after_1 (x, after);
4027       break;
4028
4029 #ifdef ENABLE_RTL_CHECKING
4030     case SEQUENCE:
4031       gcc_unreachable ();
4032       break;
4033 #endif
4034
4035     default:
4036       last = make_jump_insn_raw (x);
4037       add_insn_after (last, after);
4038       break;
4039     }
4040
4041   return last;
4042 }
4043
4044 /* Make an instruction with body X and code CALL_INSN
4045    and output it after the instruction AFTER.  */
4046
4047 rtx
4048 emit_call_insn_after_noloc (rtx x, rtx after)
4049 {
4050   rtx last;
4051
4052   gcc_assert (after);
4053
4054   switch (GET_CODE (x))
4055     {
4056     case INSN:
4057     case JUMP_INSN:
4058     case CALL_INSN:
4059     case CODE_LABEL:
4060     case BARRIER:
4061     case NOTE:
4062       last = emit_insn_after_1 (x, after);
4063       break;
4064
4065 #ifdef ENABLE_RTL_CHECKING
4066     case SEQUENCE:
4067       gcc_unreachable ();
4068       break;
4069 #endif
4070
4071     default:
4072       last = make_call_insn_raw (x);
4073       add_insn_after (last, after);
4074       break;
4075     }
4076
4077   return last;
4078 }
4079
4080 /* Make an insn of code BARRIER
4081    and output it after the insn AFTER.  */
4082
4083 rtx
4084 emit_barrier_after (rtx after)
4085 {
4086   rtx insn = rtx_alloc (BARRIER);
4087
4088   INSN_UID (insn) = cur_insn_uid++;
4089
4090   add_insn_after (insn, after);
4091   return insn;
4092 }
4093
4094 /* Emit the label LABEL after the insn AFTER.  */
4095
4096 rtx
4097 emit_label_after (rtx label, rtx after)
4098 {
4099   /* This can be called twice for the same label
4100      as a result of the confusion that follows a syntax error!
4101      So make it harmless.  */
4102   if (INSN_UID (label) == 0)
4103     {
4104       INSN_UID (label) = cur_insn_uid++;
4105       add_insn_after (label, after);
4106     }
4107
4108   return label;
4109 }
4110
4111 /* Emit a note of subtype SUBTYPE after the insn AFTER.  */
4112
4113 rtx
4114 emit_note_after (int subtype, rtx after)
4115 {
4116   rtx note = rtx_alloc (NOTE);
4117   INSN_UID (note) = cur_insn_uid++;
4118 #ifndef USE_MAPPED_LOCATION
4119   NOTE_SOURCE_FILE (note) = 0;
4120 #endif
4121   NOTE_LINE_NUMBER (note) = subtype;
4122   BLOCK_FOR_INSN (note) = NULL;
4123   add_insn_after (note, after);
4124   return note;
4125 }
4126
4127 /* Emit a copy of note ORIG after the insn AFTER.  */
4128
4129 rtx
4130 emit_note_copy_after (rtx orig, rtx after)
4131 {
4132   rtx note;
4133
4134   if (NOTE_LINE_NUMBER (orig) >= 0 && no_line_numbers)
4135     {
4136       cur_insn_uid++;
4137       return 0;
4138     }
4139
4140   note = rtx_alloc (NOTE);
4141   INSN_UID (note) = cur_insn_uid++;
4142   NOTE_LINE_NUMBER (note) = NOTE_LINE_NUMBER (orig);
4143   NOTE_DATA (note) = NOTE_DATA (orig);
4144   BLOCK_FOR_INSN (note) = NULL;
4145   add_insn_after (note, after);
4146   return note;
4147 }
4148 \f
4149 /* Like emit_insn_after_noloc, but set INSN_LOCATOR according to SCOPE.  */
4150 rtx
4151 emit_insn_after_setloc (rtx pattern, rtx after, int loc)
4152 {
4153   rtx last = emit_insn_after_noloc (pattern, after);
4154
4155   if (pattern == NULL_RTX || !loc)
4156     return last;
4157
4158   after = NEXT_INSN (after);
4159   while (1)
4160     {
4161       if (active_insn_p (after) && !INSN_LOCATOR (after))
4162         INSN_LOCATOR (after) = loc;
4163       if (after == last)
4164         break;
4165       after = NEXT_INSN (after);
4166     }
4167   return last;
4168 }
4169
4170 /* Like emit_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4171 rtx
4172 emit_insn_after (rtx pattern, rtx after)
4173 {
4174   if (INSN_P (after))
4175     return emit_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
4176   else
4177     return emit_insn_after_noloc (pattern, after);
4178 }
4179
4180 /* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to SCOPE.  */
4181 rtx
4182 emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc)
4183 {
4184   rtx last = emit_jump_insn_after_noloc (pattern, after);
4185
4186   if (pattern == NULL_RTX || !loc)
4187     return last;
4188
4189   after = NEXT_INSN (after);
4190   while (1)
4191     {
4192       if (active_insn_p (after) && !INSN_LOCATOR (after))
4193         INSN_LOCATOR (after) = loc;
4194       if (after == last)
4195         break;
4196       after = NEXT_INSN (after);
4197     }
4198   return last;
4199 }
4200
4201 /* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4202 rtx
4203 emit_jump_insn_after (rtx pattern, rtx after)
4204 {
4205   if (INSN_P (after))
4206     return emit_jump_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
4207   else
4208     return emit_jump_insn_after_noloc (pattern, after);
4209 }
4210
4211 /* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to SCOPE.  */
4212 rtx
4213 emit_call_insn_after_setloc (rtx pattern, rtx after, int loc)
4214 {
4215   rtx last = emit_call_insn_after_noloc (pattern, after);
4216
4217   if (pattern == NULL_RTX || !loc)
4218     return last;
4219
4220   after = NEXT_INSN (after);
4221   while (1)
4222     {
4223       if (active_insn_p (after) && !INSN_LOCATOR (after))
4224         INSN_LOCATOR (after) = loc;
4225       if (after == last)
4226         break;
4227       after = NEXT_INSN (after);
4228     }
4229   return last;
4230 }
4231
4232 /* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4233 rtx
4234 emit_call_insn_after (rtx pattern, rtx after)
4235 {
4236   if (INSN_P (after))
4237     return emit_call_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
4238   else
4239     return emit_call_insn_after_noloc (pattern, after);
4240 }
4241
4242 /* Like emit_insn_before_noloc, but set INSN_LOCATOR according to SCOPE.  */
4243 rtx
4244 emit_insn_before_setloc (rtx pattern, rtx before, int loc)
4245 {
4246   rtx first = PREV_INSN (before);
4247   rtx last = emit_insn_before_noloc (pattern, before);
4248
4249   if (pattern == NULL_RTX || !loc)
4250     return last;
4251
4252   first = NEXT_INSN (first);
4253   while (1)
4254     {
4255       if (active_insn_p (first) && !INSN_LOCATOR (first))
4256         INSN_LOCATOR (first) = loc;
4257       if (first == last)
4258         break;
4259       first = NEXT_INSN (first);
4260     }
4261   return last;
4262 }
4263
4264 /* Like emit_insn_before_noloc, but set INSN_LOCATOR according to BEFORE.  */
4265 rtx
4266 emit_insn_before (rtx pattern, rtx before)
4267 {
4268   if (INSN_P (before))
4269     return emit_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
4270   else
4271     return emit_insn_before_noloc (pattern, before);
4272 }
4273
4274 /* like emit_insn_before_noloc, but set insn_locator according to scope.  */
4275 rtx
4276 emit_jump_insn_before_setloc (rtx pattern, rtx before, int loc)
4277 {
4278   rtx first = PREV_INSN (before);
4279   rtx last = emit_jump_insn_before_noloc (pattern, before);
4280
4281   if (pattern == NULL_RTX)
4282     return last;
4283
4284   first = NEXT_INSN (first);
4285   while (1)
4286     {
4287       if (active_insn_p (first) && !INSN_LOCATOR (first))
4288         INSN_LOCATOR (first) = loc;
4289       if (first == last)
4290         break;
4291       first = NEXT_INSN (first);
4292     }
4293   return last;
4294 }
4295
4296 /* Like emit_jump_insn_before_noloc, but set INSN_LOCATOR according to BEFORE.  */
4297 rtx
4298 emit_jump_insn_before (rtx pattern, rtx before)
4299 {
4300   if (INSN_P (before))
4301     return emit_jump_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
4302   else
4303     return emit_jump_insn_before_noloc (pattern, before);
4304 }
4305
4306 /* like emit_insn_before_noloc, but set insn_locator according to scope.  */
4307 rtx
4308 emit_call_insn_before_setloc (rtx pattern, rtx before, int loc)
4309 {
4310   rtx first = PREV_INSN (before);
4311   rtx last = emit_call_insn_before_noloc (pattern, before);
4312
4313   if (pattern == NULL_RTX)
4314     return last;
4315
4316   first = NEXT_INSN (first);
4317   while (1)
4318     {
4319       if (active_insn_p (first) && !INSN_LOCATOR (first))
4320         INSN_LOCATOR (first) = loc;
4321       if (first == last)
4322         break;
4323       first = NEXT_INSN (first);
4324     }
4325   return last;
4326 }
4327
4328 /* like emit_call_insn_before_noloc,
4329    but set insn_locator according to before.  */
4330 rtx
4331 emit_call_insn_before (rtx pattern, rtx before)
4332 {
4333   if (INSN_P (before))
4334     return emit_call_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
4335   else
4336     return emit_call_insn_before_noloc (pattern, before);
4337 }
4338 \f
4339 /* Take X and emit it at the end of the doubly-linked
4340    INSN list.
4341
4342    Returns the last insn emitted.  */
4343
4344 rtx
4345 emit_insn (rtx x)
4346 {
4347   rtx last = last_insn;
4348   rtx insn;
4349
4350   if (x == NULL_RTX)
4351     return last;
4352
4353   switch (GET_CODE (x))
4354     {
4355     case INSN:
4356     case JUMP_INSN:
4357     case CALL_INSN:
4358     case CODE_LABEL:
4359     case BARRIER:
4360     case NOTE:
4361       insn = x;
4362       while (insn)
4363         {
4364           rtx next = NEXT_INSN (insn);
4365           add_insn (insn);
4366           last = insn;
4367           insn = next;
4368         }
4369       break;
4370
4371 #ifdef ENABLE_RTL_CHECKING
4372     case SEQUENCE:
4373       gcc_unreachable ();
4374       break;
4375 #endif
4376
4377     default:
4378       last = make_insn_raw (x);
4379       add_insn (last);
4380       break;
4381     }
4382
4383   return last;
4384 }
4385
4386 /* Make an insn of code JUMP_INSN with pattern X
4387    and add it to the end of the doubly-linked list.  */
4388
4389 rtx
4390 emit_jump_insn (rtx x)
4391 {
4392   rtx last = NULL_RTX, insn;
4393
4394   switch (GET_CODE (x))
4395     {
4396     case INSN:
4397     case JUMP_INSN:
4398     case CALL_INSN:
4399     case CODE_LABEL:
4400     case BARRIER:
4401     case NOTE:
4402       insn = x;
4403       while (insn)
4404         {
4405           rtx next = NEXT_INSN (insn);
4406           add_insn (insn);
4407           last = insn;
4408           insn = next;
4409         }
4410       break;
4411
4412 #ifdef ENABLE_RTL_CHECKING
4413     case SEQUENCE:
4414       gcc_unreachable ();
4415       break;
4416 #endif
4417
4418     default:
4419       last = make_jump_insn_raw (x);
4420       add_insn (last);
4421       break;
4422     }
4423
4424   return last;
4425 }
4426
4427 /* Make an insn of code CALL_INSN with pattern X
4428    and add it to the end of the doubly-linked list.  */
4429
4430 rtx
4431 emit_call_insn (rtx x)
4432 {
4433   rtx insn;
4434
4435   switch (GET_CODE (x))
4436     {
4437     case INSN:
4438     case JUMP_INSN:
4439     case CALL_INSN:
4440     case CODE_LABEL:
4441     case BARRIER:
4442     case NOTE:
4443       insn = emit_insn (x);
4444       break;
4445
4446 #ifdef ENABLE_RTL_CHECKING
4447     case SEQUENCE:
4448       gcc_unreachable ();
4449       break;
4450 #endif
4451
4452     default:
4453       insn = make_call_insn_raw (x);
4454       add_insn (insn);
4455       break;
4456     }
4457
4458   return insn;
4459 }
4460
4461 /* Add the label LABEL to the end of the doubly-linked list.  */
4462
4463 rtx
4464 emit_label (rtx label)
4465 {
4466   /* This can be called twice for the same label
4467      as a result of the confusion that follows a syntax error!
4468      So make it harmless.  */
4469   if (INSN_UID (label) == 0)
4470     {
4471       INSN_UID (label) = cur_insn_uid++;
4472       add_insn (label);
4473     }
4474   return label;
4475 }
4476
4477 /* Make an insn of code BARRIER
4478    and add it to the end of the doubly-linked list.  */
4479
4480 rtx
4481 emit_barrier (void)
4482 {
4483   rtx barrier = rtx_alloc (BARRIER);
4484   INSN_UID (barrier) = cur_insn_uid++;
4485   add_insn (barrier);
4486   return barrier;
4487 }
4488
4489 /* Make line numbering NOTE insn for LOCATION add it to the end
4490    of the doubly-linked list, but only if line-numbers are desired for
4491    debugging info and it doesn't match the previous one.  */
4492
4493 rtx
4494 emit_line_note (location_t location)
4495 {
4496   rtx note;
4497   
4498 #ifdef USE_MAPPED_LOCATION
4499   if (location == last_location)
4500     return NULL_RTX;
4501 #else
4502   if (location.file && last_location.file
4503       && !strcmp (location.file, last_location.file)
4504       && location.line == last_location.line)
4505     return NULL_RTX;
4506 #endif
4507   last_location = location;
4508   
4509   if (no_line_numbers)
4510     {
4511       cur_insn_uid++;
4512       return NULL_RTX;
4513     }
4514
4515 #ifdef USE_MAPPED_LOCATION
4516   note = emit_note ((int) location);
4517 #else
4518   note = emit_note (location.line);
4519   NOTE_SOURCE_FILE (note) = location.file;
4520 #endif
4521   
4522   return note;
4523 }
4524
4525 /* Emit a copy of note ORIG.  */
4526
4527 rtx
4528 emit_note_copy (rtx orig)
4529 {
4530   rtx note;
4531   
4532   if (NOTE_LINE_NUMBER (orig) >= 0 && no_line_numbers)
4533     {
4534       cur_insn_uid++;
4535       return NULL_RTX;
4536     }
4537   
4538   note = rtx_alloc (NOTE);
4539   
4540   INSN_UID (note) = cur_insn_uid++;
4541   NOTE_DATA (note) = NOTE_DATA (orig);
4542   NOTE_LINE_NUMBER (note) = NOTE_LINE_NUMBER (orig);
4543   BLOCK_FOR_INSN (note) = NULL;
4544   add_insn (note);
4545   
4546   return note;
4547 }
4548
4549 /* Make an insn of code NOTE or type NOTE_NO
4550    and add it to the end of the doubly-linked list.  */
4551
4552 rtx
4553 emit_note (int note_no)
4554 {
4555   rtx note;
4556
4557   note = rtx_alloc (NOTE);
4558   INSN_UID (note) = cur_insn_uid++;
4559   NOTE_LINE_NUMBER (note) = note_no;
4560   memset (&NOTE_DATA (note), 0, sizeof (NOTE_DATA (note)));
4561   BLOCK_FOR_INSN (note) = NULL;
4562   add_insn (note);
4563   return note;
4564 }
4565
4566 /* Cause next statement to emit a line note even if the line number
4567    has not changed.  */
4568
4569 void
4570 force_next_line_note (void)
4571 {
4572 #ifdef USE_MAPPED_LOCATION
4573   last_location = -1;
4574 #else
4575   last_location.line = -1;
4576 #endif
4577 }
4578
4579 /* Place a note of KIND on insn INSN with DATUM as the datum. If a
4580    note of this type already exists, remove it first.  */
4581
4582 rtx
4583 set_unique_reg_note (rtx insn, enum reg_note kind, rtx datum)
4584 {
4585   rtx note = find_reg_note (insn, kind, NULL_RTX);
4586
4587   switch (kind)
4588     {
4589     case REG_EQUAL:
4590     case REG_EQUIV:
4591       /* Don't add REG_EQUAL/REG_EQUIV notes if the insn
4592          has multiple sets (some callers assume single_set
4593          means the insn only has one set, when in fact it
4594          means the insn only has one * useful * set).  */
4595       if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
4596         {
4597           gcc_assert (!note);
4598           return NULL_RTX;
4599         }
4600
4601       /* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
4602          It serves no useful purpose and breaks eliminate_regs.  */
4603       if (GET_CODE (datum) == ASM_OPERANDS)
4604         return NULL_RTX;
4605       break;
4606
4607     default:
4608       break;
4609     }
4610
4611   if (note)
4612     {
4613       XEXP (note, 0) = datum;
4614       return note;
4615     }
4616
4617   REG_NOTES (insn) = gen_rtx_EXPR_LIST (kind, datum, REG_NOTES (insn));
4618   return REG_NOTES (insn);
4619 }
4620 \f
4621 /* Return an indication of which type of insn should have X as a body.
4622    The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN.  */
4623
4624 static enum rtx_code
4625 classify_insn (rtx x)
4626 {
4627   if (LABEL_P (x))
4628     return CODE_LABEL;
4629   if (GET_CODE (x) == CALL)
4630     return CALL_INSN;
4631   if (GET_CODE (x) == RETURN)
4632     return JUMP_INSN;
4633   if (GET_CODE (x) == SET)
4634     {
4635       if (SET_DEST (x) == pc_rtx)
4636         return JUMP_INSN;
4637       else if (GET_CODE (SET_SRC (x)) == CALL)
4638         return CALL_INSN;
4639       else
4640         return INSN;
4641     }
4642   if (GET_CODE (x) == PARALLEL)
4643     {
4644       int j;
4645       for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
4646         if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
4647           return CALL_INSN;
4648         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4649                  && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx)
4650           return JUMP_INSN;
4651         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4652                  && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
4653           return CALL_INSN;
4654     }
4655   return INSN;
4656 }
4657
4658 /* Emit the rtl pattern X as an appropriate kind of insn.
4659    If X is a label, it is simply added into the insn chain.  */
4660
4661 rtx
4662 emit (rtx x)
4663 {
4664   enum rtx_code code = classify_insn (x);
4665
4666   switch (code)
4667     {
4668     case CODE_LABEL:
4669       return emit_label (x);
4670     case INSN:
4671       return emit_insn (x);
4672     case  JUMP_INSN:
4673       {
4674         rtx insn = emit_jump_insn (x);
4675         if (any_uncondjump_p (insn) || GET_CODE (x) == RETURN)
4676           return emit_barrier ();
4677         return insn;
4678       }
4679     case CALL_INSN:
4680       return emit_call_insn (x);
4681     default:
4682       gcc_unreachable ();
4683     }
4684 }
4685 \f
4686 /* Space for free sequence stack entries.  */
4687 static GTY ((deletable)) struct sequence_stack *free_sequence_stack;
4688
4689 /* Begin emitting insns to a sequence.  If this sequence will contain
4690    something that might cause the compiler to pop arguments to function
4691    calls (because those pops have previously been deferred; see
4692    INHIBIT_DEFER_POP for more details), use do_pending_stack_adjust
4693    before calling this function.  That will ensure that the deferred
4694    pops are not accidentally emitted in the middle of this sequence.  */
4695
4696 void
4697 start_sequence (void)
4698 {
4699   struct sequence_stack *tem;
4700
4701   if (free_sequence_stack != NULL)
4702     {
4703       tem = free_sequence_stack;
4704       free_sequence_stack = tem->next;
4705     }
4706   else
4707     tem = ggc_alloc (sizeof (struct sequence_stack));
4708
4709   tem->next = seq_stack;
4710   tem->first = first_insn;
4711   tem->last = last_insn;
4712
4713   seq_stack = tem;
4714
4715   first_insn = 0;
4716   last_insn = 0;
4717 }
4718
4719 /* Set up the insn chain starting with FIRST as the current sequence,
4720    saving the previously current one.  See the documentation for
4721    start_sequence for more information about how to use this function.  */
4722
4723 void
4724 push_to_sequence (rtx first)
4725 {
4726   rtx last;
4727
4728   start_sequence ();
4729
4730   for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last));
4731
4732   first_insn = first;
4733   last_insn = last;
4734 }
4735
4736 /* Set up the outer-level insn chain
4737    as the current sequence, saving the previously current one.  */
4738
4739 void
4740 push_topmost_sequence (void)
4741 {
4742   struct sequence_stack *stack, *top = NULL;
4743
4744   start_sequence ();
4745
4746   for (stack = seq_stack; stack; stack = stack->next)
4747     top = stack;
4748
4749   first_insn = top->first;
4750   last_insn = top->last;
4751 }
4752
4753 /* After emitting to the outer-level insn chain, update the outer-level
4754    insn chain, and restore the previous saved state.  */
4755
4756 void
4757 pop_topmost_sequence (void)
4758 {
4759   struct sequence_stack *stack, *top = NULL;
4760
4761   for (stack = seq_stack; stack; stack = stack->next)
4762     top = stack;
4763
4764   top->first = first_insn;
4765   top->last = last_insn;
4766
4767   end_sequence ();
4768 }
4769
4770 /* After emitting to a sequence, restore previous saved state.
4771
4772    To get the contents of the sequence just made, you must call
4773    `get_insns' *before* calling here.
4774
4775    If the compiler might have deferred popping arguments while
4776    generating this sequence, and this sequence will not be immediately
4777    inserted into the instruction stream, use do_pending_stack_adjust
4778    before calling get_insns.  That will ensure that the deferred
4779    pops are inserted into this sequence, and not into some random
4780    location in the instruction stream.  See INHIBIT_DEFER_POP for more
4781    information about deferred popping of arguments.  */
4782
4783 void
4784 end_sequence (void)
4785 {
4786   struct sequence_stack *tem = seq_stack;
4787
4788   first_insn = tem->first;
4789   last_insn = tem->last;
4790   seq_stack = tem->next;
4791
4792   memset (tem, 0, sizeof (*tem));
4793   tem->next = free_sequence_stack;
4794   free_sequence_stack = tem;
4795 }
4796
4797 /* Return 1 if currently emitting into a sequence.  */
4798
4799 int
4800 in_sequence_p (void)
4801 {
4802   return seq_stack != 0;
4803 }
4804 \f
4805 /* Put the various virtual registers into REGNO_REG_RTX.  */
4806
4807 void
4808 init_virtual_regs (struct emit_status *es)
4809 {
4810   rtx *ptr = es->x_regno_reg_rtx;
4811   ptr[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
4812   ptr[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
4813   ptr[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
4814   ptr[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
4815   ptr[VIRTUAL_CFA_REGNUM] = virtual_cfa_rtx;
4816 }
4817
4818 \f
4819 /* Used by copy_insn_1 to avoid copying SCRATCHes more than once.  */
4820 static rtx copy_insn_scratch_in[MAX_RECOG_OPERANDS];
4821 static rtx copy_insn_scratch_out[MAX_RECOG_OPERANDS];
4822 static int copy_insn_n_scratches;
4823
4824 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
4825    copied an ASM_OPERANDS.
4826    In that case, it is the original input-operand vector.  */
4827 static rtvec orig_asm_operands_vector;
4828
4829 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
4830    copied an ASM_OPERANDS.
4831    In that case, it is the copied input-operand vector.  */
4832 static rtvec copy_asm_operands_vector;
4833
4834 /* Likewise for the constraints vector.  */
4835 static rtvec orig_asm_constraints_vector;
4836 static rtvec copy_asm_constraints_vector;
4837
4838 /* Recursively create a new copy of an rtx for copy_insn.
4839    This function differs from copy_rtx in that it handles SCRATCHes and
4840    ASM_OPERANDs properly.
4841    Normally, this function is not used directly; use copy_insn as front end.
4842    However, you could first copy an insn pattern with copy_insn and then use
4843    this function afterwards to properly copy any REG_NOTEs containing
4844    SCRATCHes.  */
4845
4846 rtx
4847 copy_insn_1 (rtx orig)
4848 {
4849   rtx copy;
4850   int i, j;
4851   RTX_CODE code;
4852   const char *format_ptr;
4853
4854   code = GET_CODE (orig);
4855
4856   switch (code)
4857     {
4858     case REG:
4859     case CONST_INT:
4860     case CONST_DOUBLE:
4861     case CONST_VECTOR:
4862     case SYMBOL_REF:
4863     case CODE_LABEL:
4864     case PC:
4865     case CC0:
4866       return orig;
4867     case CLOBBER:
4868       if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
4869         return orig;
4870       break;
4871
4872     case SCRATCH:
4873       for (i = 0; i < copy_insn_n_scratches; i++)
4874         if (copy_insn_scratch_in[i] == orig)
4875           return copy_insn_scratch_out[i];
4876       break;
4877
4878     case CONST:
4879       /* CONST can be shared if it contains a SYMBOL_REF.  If it contains
4880          a LABEL_REF, it isn't sharable.  */
4881       if (GET_CODE (XEXP (orig, 0)) == PLUS
4882           && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
4883           && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
4884         return orig;
4885       break;
4886
4887       /* A MEM with a constant address is not sharable.  The problem is that
4888          the constant address may need to be reloaded.  If the mem is shared,
4889          then reloading one copy of this mem will cause all copies to appear
4890          to have been reloaded.  */
4891
4892     default:
4893       break;
4894     }
4895
4896   copy = rtx_alloc (code);
4897
4898   /* Copy the various flags, and other information.  We assume that
4899      all fields need copying, and then clear the fields that should
4900      not be copied.  That is the sensible default behavior, and forces
4901      us to explicitly document why we are *not* copying a flag.  */
4902   memcpy (copy, orig, RTX_HDR_SIZE);
4903
4904   /* We do not copy the USED flag, which is used as a mark bit during
4905      walks over the RTL.  */
4906   RTX_FLAG (copy, used) = 0;
4907
4908   /* We do not copy JUMP, CALL, or FRAME_RELATED for INSNs.  */
4909   if (INSN_P (orig))
4910     {
4911       RTX_FLAG (copy, jump) = 0;
4912       RTX_FLAG (copy, call) = 0;
4913       RTX_FLAG (copy, frame_related) = 0;
4914     }
4915
4916   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
4917
4918   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
4919     {
4920       copy->u.fld[i] = orig->u.fld[i];
4921       switch (*format_ptr++)
4922         {
4923         case 'e':
4924           if (XEXP (orig, i) != NULL)
4925             XEXP (copy, i) = copy_insn_1 (XEXP (orig, i));
4926           break;
4927
4928         case 'E':
4929         case 'V':
4930           if (XVEC (orig, i) == orig_asm_constraints_vector)
4931             XVEC (copy, i) = copy_asm_constraints_vector;
4932           else if (XVEC (orig, i) == orig_asm_operands_vector)
4933             XVEC (copy, i) = copy_asm_operands_vector;
4934           else if (XVEC (orig, i) != NULL)
4935             {
4936               XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
4937               for (j = 0; j < XVECLEN (copy, i); j++)
4938                 XVECEXP (copy, i, j) = copy_insn_1 (XVECEXP (orig, i, j));
4939             }
4940           break;
4941
4942         case 't':
4943         case 'w':
4944         case 'i':
4945         case 's':
4946         case 'S':
4947         case 'u':
4948         case '0':
4949           /* These are left unchanged.  */
4950           break;
4951
4952         default:
4953           gcc_unreachable ();
4954         }
4955     }
4956
4957   if (code == SCRATCH)
4958     {
4959       i = copy_insn_n_scratches++;
4960       gcc_assert (i < MAX_RECOG_OPERANDS);
4961       copy_insn_scratch_in[i] = orig;
4962       copy_insn_scratch_out[i] = copy;
4963     }
4964   else if (code == ASM_OPERANDS)
4965     {
4966       orig_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (orig);
4967       copy_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (copy);
4968       orig_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (orig);
4969       copy_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy);
4970     }
4971
4972   return copy;
4973 }
4974
4975 /* Create a new copy of an rtx.
4976    This function differs from copy_rtx in that it handles SCRATCHes and
4977    ASM_OPERANDs properly.
4978    INSN doesn't really have to be a full INSN; it could be just the
4979    pattern.  */
4980 rtx
4981 copy_insn (rtx insn)
4982 {
4983   copy_insn_n_scratches = 0;
4984   orig_asm_operands_vector = 0;
4985   orig_asm_constraints_vector = 0;
4986   copy_asm_operands_vector = 0;
4987   copy_asm_constraints_vector = 0;
4988   return copy_insn_1 (insn);
4989 }
4990
4991 /* Initialize data structures and variables in this file
4992    before generating rtl for each function.  */
4993
4994 void
4995 init_emit (void)
4996 {
4997   struct function *f = cfun;
4998
4999   f->emit = ggc_alloc (sizeof (struct emit_status));
5000   first_insn = NULL;
5001   last_insn = NULL;
5002   cur_insn_uid = 1;
5003   reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
5004   last_location = UNKNOWN_LOCATION;
5005   first_label_num = label_num;
5006   seq_stack = NULL;
5007
5008   /* Init the tables that describe all the pseudo regs.  */
5009
5010   f->emit->regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
5011
5012   f->emit->regno_pointer_align
5013     = ggc_alloc_cleared (f->emit->regno_pointer_align_length
5014                          * sizeof (unsigned char));
5015
5016   regno_reg_rtx
5017     = ggc_alloc (f->emit->regno_pointer_align_length * sizeof (rtx));
5018
5019   /* Put copies of all the hard registers into regno_reg_rtx.  */
5020   memcpy (regno_reg_rtx,
5021           static_regno_reg_rtx,
5022           FIRST_PSEUDO_REGISTER * sizeof (rtx));
5023
5024   /* Put copies of all the virtual register rtx into regno_reg_rtx.  */
5025   init_virtual_regs (f->emit);
5026
5027   /* Indicate that the virtual registers and stack locations are
5028      all pointers.  */
5029   REG_POINTER (stack_pointer_rtx) = 1;
5030   REG_POINTER (frame_pointer_rtx) = 1;
5031   REG_POINTER (hard_frame_pointer_rtx) = 1;
5032   REG_POINTER (arg_pointer_rtx) = 1;
5033
5034   REG_POINTER (virtual_incoming_args_rtx) = 1;
5035   REG_POINTER (virtual_stack_vars_rtx) = 1;
5036   REG_POINTER (virtual_stack_dynamic_rtx) = 1;
5037   REG_POINTER (virtual_outgoing_args_rtx) = 1;
5038   REG_POINTER (virtual_cfa_rtx) = 1;
5039
5040 #ifdef STACK_BOUNDARY
5041   REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY;
5042   REGNO_POINTER_ALIGN (FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
5043   REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
5044   REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = STACK_BOUNDARY;
5045
5046   REGNO_POINTER_ALIGN (VIRTUAL_INCOMING_ARGS_REGNUM) = STACK_BOUNDARY;
5047   REGNO_POINTER_ALIGN (VIRTUAL_STACK_VARS_REGNUM) = STACK_BOUNDARY;
5048   REGNO_POINTER_ALIGN (VIRTUAL_STACK_DYNAMIC_REGNUM) = STACK_BOUNDARY;
5049   REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM) = STACK_BOUNDARY;
5050   REGNO_POINTER_ALIGN (VIRTUAL_CFA_REGNUM) = BITS_PER_WORD;
5051 #endif
5052
5053 #ifdef INIT_EXPANDERS
5054   INIT_EXPANDERS;
5055 #endif
5056 }
5057
5058 /* Generate a vector constant for mode MODE and constant value CONSTANT.  */
5059
5060 static rtx
5061 gen_const_vector (enum machine_mode mode, int constant)
5062 {
5063   rtx tem;
5064   rtvec v;
5065   int units, i;
5066   enum machine_mode inner;
5067
5068   units = GET_MODE_NUNITS (mode);
5069   inner = GET_MODE_INNER (mode);
5070
5071   v = rtvec_alloc (units);
5072
5073   /* We need to call this function after we set the scalar const_tiny_rtx
5074      entries.  */
5075   gcc_assert (const_tiny_rtx[constant][(int) inner]);
5076
5077   for (i = 0; i < units; ++i)
5078     RTVEC_ELT (v, i) = const_tiny_rtx[constant][(int) inner];
5079
5080   tem = gen_rtx_raw_CONST_VECTOR (mode, v);
5081   return tem;
5082 }
5083
5084 /* Generate a vector like gen_rtx_raw_CONST_VEC, but use the zero vector when
5085    all elements are zero, and the one vector when all elements are one.  */
5086 rtx
5087 gen_rtx_CONST_VECTOR (enum machine_mode mode, rtvec v)
5088 {
5089   enum machine_mode inner = GET_MODE_INNER (mode);
5090   int nunits = GET_MODE_NUNITS (mode);
5091   rtx x;
5092   int i;
5093
5094   /* Check to see if all of the elements have the same value.  */
5095   x = RTVEC_ELT (v, nunits - 1);
5096   for (i = nunits - 2; i >= 0; i--)
5097     if (RTVEC_ELT (v, i) != x)
5098       break;
5099
5100   /* If the values are all the same, check to see if we can use one of the
5101      standard constant vectors.  */
5102   if (i == -1)
5103     {
5104       if (x == CONST0_RTX (inner))
5105         return CONST0_RTX (mode);
5106       else if (x == CONST1_RTX (inner))
5107         return CONST1_RTX (mode);
5108     }
5109
5110   return gen_rtx_raw_CONST_VECTOR (mode, v);
5111 }
5112
5113 /* Create some permanent unique rtl objects shared between all functions.
5114    LINE_NUMBERS is nonzero if line numbers are to be generated.  */
5115
5116 void
5117 init_emit_once (int line_numbers)
5118 {
5119   int i;
5120   enum machine_mode mode;
5121   enum machine_mode double_mode;
5122
5123   /* We need reg_raw_mode, so initialize the modes now.  */
5124   init_reg_modes_once ();
5125
5126   /* Initialize the CONST_INT, CONST_DOUBLE, and memory attribute hash
5127      tables.  */
5128   const_int_htab = htab_create_ggc (37, const_int_htab_hash,
5129                                     const_int_htab_eq, NULL);
5130
5131   const_double_htab = htab_create_ggc (37, const_double_htab_hash,
5132                                        const_double_htab_eq, NULL);
5133
5134   mem_attrs_htab = htab_create_ggc (37, mem_attrs_htab_hash,
5135                                     mem_attrs_htab_eq, NULL);
5136   reg_attrs_htab = htab_create_ggc (37, reg_attrs_htab_hash,
5137                                     reg_attrs_htab_eq, NULL);
5138
5139   no_line_numbers = ! line_numbers;
5140
5141   /* Compute the word and byte modes.  */
5142
5143   byte_mode = VOIDmode;
5144   word_mode = VOIDmode;
5145   double_mode = VOIDmode;
5146
5147   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
5148        mode = GET_MODE_WIDER_MODE (mode))
5149     {
5150       if (GET_MODE_BITSIZE (mode) == BITS_PER_UNIT
5151           && byte_mode == VOIDmode)
5152         byte_mode = mode;
5153
5154       if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD
5155           && word_mode == VOIDmode)
5156         word_mode = mode;
5157     }
5158
5159   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
5160        mode = GET_MODE_WIDER_MODE (mode))
5161     {
5162       if (GET_MODE_BITSIZE (mode) == DOUBLE_TYPE_SIZE
5163           && double_mode == VOIDmode)
5164         double_mode = mode;
5165     }
5166
5167   ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
5168
5169   /* Assign register numbers to the globally defined register rtx.
5170      This must be done at runtime because the register number field
5171      is in a union and some compilers can't initialize unions.  */
5172
5173   pc_rtx = gen_rtx_PC (VOIDmode);
5174   cc0_rtx = gen_rtx_CC0 (VOIDmode);
5175   stack_pointer_rtx = gen_raw_REG (Pmode, STACK_POINTER_REGNUM);
5176   frame_pointer_rtx = gen_raw_REG (Pmode, FRAME_POINTER_REGNUM);
5177   if (hard_frame_pointer_rtx == 0)
5178     hard_frame_pointer_rtx = gen_raw_REG (Pmode,
5179                                           HARD_FRAME_POINTER_REGNUM);
5180   if (arg_pointer_rtx == 0)
5181     arg_pointer_rtx = gen_raw_REG (Pmode, ARG_POINTER_REGNUM);
5182   virtual_incoming_args_rtx =
5183     gen_raw_REG (Pmode, VIRTUAL_INCOMING_ARGS_REGNUM);
5184   virtual_stack_vars_rtx =
5185     gen_raw_REG (Pmode, VIRTUAL_STACK_VARS_REGNUM);
5186   virtual_stack_dynamic_rtx =
5187     gen_raw_REG (Pmode, VIRTUAL_STACK_DYNAMIC_REGNUM);
5188   virtual_outgoing_args_rtx =
5189     gen_raw_REG (Pmode, VIRTUAL_OUTGOING_ARGS_REGNUM);
5190   virtual_cfa_rtx = gen_raw_REG (Pmode, VIRTUAL_CFA_REGNUM);
5191
5192   /* Initialize RTL for commonly used hard registers.  These are
5193      copied into regno_reg_rtx as we begin to compile each function.  */
5194   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5195     static_regno_reg_rtx[i] = gen_raw_REG (reg_raw_mode[i], i);
5196
5197 #ifdef INIT_EXPANDERS
5198   /* This is to initialize {init|mark|free}_machine_status before the first
5199      call to push_function_context_to.  This is needed by the Chill front
5200      end which calls push_function_context_to before the first call to
5201      init_function_start.  */
5202   INIT_EXPANDERS;
5203 #endif
5204
5205   /* Create the unique rtx's for certain rtx codes and operand values.  */
5206
5207   /* Don't use gen_rtx_CONST_INT here since gen_rtx_CONST_INT in this case
5208      tries to use these variables.  */
5209   for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
5210     const_int_rtx[i + MAX_SAVED_CONST_INT] =
5211       gen_rtx_raw_CONST_INT (VOIDmode, (HOST_WIDE_INT) i);
5212
5213   if (STORE_FLAG_VALUE >= - MAX_SAVED_CONST_INT
5214       && STORE_FLAG_VALUE <= MAX_SAVED_CONST_INT)
5215     const_true_rtx = const_int_rtx[STORE_FLAG_VALUE + MAX_SAVED_CONST_INT];
5216   else
5217     const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
5218
5219   REAL_VALUE_FROM_INT (dconst0,   0,  0, double_mode);
5220   REAL_VALUE_FROM_INT (dconst1,   1,  0, double_mode);
5221   REAL_VALUE_FROM_INT (dconst2,   2,  0, double_mode);
5222   REAL_VALUE_FROM_INT (dconst3,   3,  0, double_mode);
5223   REAL_VALUE_FROM_INT (dconst10, 10,  0, double_mode);
5224   REAL_VALUE_FROM_INT (dconstm1, -1, -1, double_mode);
5225   REAL_VALUE_FROM_INT (dconstm2, -2, -1, double_mode);
5226
5227   dconsthalf = dconst1;
5228   SET_REAL_EXP (&dconsthalf, REAL_EXP (&dconsthalf) - 1);
5229
5230   real_arithmetic (&dconstthird, RDIV_EXPR, &dconst1, &dconst3);
5231
5232   /* Initialize mathematical constants for constant folding builtins.
5233      These constants need to be given to at least 160 bits precision.  */
5234   real_from_string (&dconstpi,
5235     "3.1415926535897932384626433832795028841971693993751058209749445923078");
5236   real_from_string (&dconste,
5237     "2.7182818284590452353602874713526624977572470936999595749669676277241");
5238
5239   for (i = 0; i < (int) ARRAY_SIZE (const_tiny_rtx); i++)
5240     {
5241       REAL_VALUE_TYPE *r =
5242         (i == 0 ? &dconst0 : i == 1 ? &dconst1 : &dconst2);
5243
5244       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode;
5245            mode = GET_MODE_WIDER_MODE (mode))
5246         const_tiny_rtx[i][(int) mode] =
5247           CONST_DOUBLE_FROM_REAL_VALUE (*r, mode);
5248
5249       const_tiny_rtx[i][(int) VOIDmode] = GEN_INT (i);
5250
5251       for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); mode != VOIDmode;
5252            mode = GET_MODE_WIDER_MODE (mode))
5253         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
5254
5255       for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
5256            mode != VOIDmode;
5257            mode = GET_MODE_WIDER_MODE (mode))
5258         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
5259     }
5260
5261   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
5262        mode != VOIDmode;
5263        mode = GET_MODE_WIDER_MODE (mode))
5264     {
5265       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5266       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5267     }
5268
5269   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
5270        mode != VOIDmode;
5271        mode = GET_MODE_WIDER_MODE (mode))
5272     {
5273       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5274       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5275     }
5276
5277   for (i = (int) CCmode; i < (int) MAX_MACHINE_MODE; ++i)
5278     if (GET_MODE_CLASS ((enum machine_mode) i) == MODE_CC)
5279       const_tiny_rtx[0][i] = const0_rtx;
5280
5281   const_tiny_rtx[0][(int) BImode] = const0_rtx;
5282   if (STORE_FLAG_VALUE == 1)
5283     const_tiny_rtx[1][(int) BImode] = const1_rtx;
5284
5285 #ifdef RETURN_ADDRESS_POINTER_REGNUM
5286   return_address_pointer_rtx
5287     = gen_raw_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM);
5288 #endif
5289
5290 #ifdef STATIC_CHAIN_REGNUM
5291   static_chain_rtx = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
5292
5293 #ifdef STATIC_CHAIN_INCOMING_REGNUM
5294   if (STATIC_CHAIN_INCOMING_REGNUM != STATIC_CHAIN_REGNUM)
5295     static_chain_incoming_rtx
5296       = gen_rtx_REG (Pmode, STATIC_CHAIN_INCOMING_REGNUM);
5297   else
5298 #endif
5299     static_chain_incoming_rtx = static_chain_rtx;
5300 #endif
5301
5302 #ifdef STATIC_CHAIN
5303   static_chain_rtx = STATIC_CHAIN;
5304
5305 #ifdef STATIC_CHAIN_INCOMING
5306   static_chain_incoming_rtx = STATIC_CHAIN_INCOMING;
5307 #else
5308   static_chain_incoming_rtx = static_chain_rtx;
5309 #endif
5310 #endif
5311
5312   if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
5313     pic_offset_table_rtx = gen_raw_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
5314 }
5315 \f
5316 /* Produce exact duplicate of insn INSN after AFTER.
5317    Care updating of libcall regions if present.  */
5318
5319 rtx
5320 emit_copy_of_insn_after (rtx insn, rtx after)
5321 {
5322   rtx new;
5323   rtx note1, note2, link;
5324
5325   switch (GET_CODE (insn))
5326     {
5327     case INSN:
5328       new = emit_insn_after (copy_insn (PATTERN (insn)), after);
5329       break;
5330
5331     case JUMP_INSN:
5332       new = emit_jump_insn_after (copy_insn (PATTERN (insn)), after);
5333       break;
5334
5335     case CALL_INSN:
5336       new = emit_call_insn_after (copy_insn (PATTERN (insn)), after);
5337       if (CALL_INSN_FUNCTION_USAGE (insn))
5338         CALL_INSN_FUNCTION_USAGE (new)
5339           = copy_insn (CALL_INSN_FUNCTION_USAGE (insn));
5340       SIBLING_CALL_P (new) = SIBLING_CALL_P (insn);
5341       CONST_OR_PURE_CALL_P (new) = CONST_OR_PURE_CALL_P (insn);
5342       break;
5343
5344     default:
5345       gcc_unreachable ();
5346     }
5347
5348   /* Update LABEL_NUSES.  */
5349   mark_jump_label (PATTERN (new), new, 0);
5350
5351   INSN_LOCATOR (new) = INSN_LOCATOR (insn);
5352
5353   /* If the old insn is frame related, then so is the new one.  This is
5354      primarily needed for IA-64 unwind info which marks epilogue insns,
5355      which may be duplicated by the basic block reordering code.  */
5356   RTX_FRAME_RELATED_P (new) = RTX_FRAME_RELATED_P (insn);
5357
5358   /* Copy all REG_NOTES except REG_LABEL since mark_jump_label will
5359      make them.  */
5360   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
5361     if (REG_NOTE_KIND (link) != REG_LABEL)
5362       {
5363         if (GET_CODE (link) == EXPR_LIST)
5364           REG_NOTES (new)
5365             = copy_insn_1 (gen_rtx_EXPR_LIST (REG_NOTE_KIND (link),
5366                                               XEXP (link, 0),
5367                                               REG_NOTES (new)));
5368         else
5369           REG_NOTES (new)
5370             = copy_insn_1 (gen_rtx_INSN_LIST (REG_NOTE_KIND (link),
5371                                               XEXP (link, 0),
5372                                               REG_NOTES (new)));
5373       }
5374
5375   /* Fix the libcall sequences.  */
5376   if ((note1 = find_reg_note (new, REG_RETVAL, NULL_RTX)) != NULL)
5377     {
5378       rtx p = new;
5379       while ((note2 = find_reg_note (p, REG_LIBCALL, NULL_RTX)) == NULL)
5380         p = PREV_INSN (p);
5381       XEXP (note1, 0) = p;
5382       XEXP (note2, 0) = new;
5383     }
5384   INSN_CODE (new) = INSN_CODE (insn);
5385   return new;
5386 }
5387
5388 static GTY((deletable)) rtx hard_reg_clobbers [NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
5389 rtx
5390 gen_hard_reg_clobber (enum machine_mode mode, unsigned int regno)
5391 {
5392   if (hard_reg_clobbers[mode][regno])
5393     return hard_reg_clobbers[mode][regno];
5394   else
5395     return (hard_reg_clobbers[mode][regno] =
5396             gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (mode, regno)));
5397 }
5398
5399 #include "gt-emit-rtl.h"