OSDN Git Service

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