OSDN Git Service

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