OSDN Git Service

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