OSDN Git Service

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