OSDN Git Service

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