OSDN Git Service

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