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