OSDN Git Service

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