OSDN Git Service

e4049b99184c9bdbd62432ed8eb709de2eb32504
[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
1338 /* Return true if X is a paradoxical subreg, false otherwise.  */
1339 bool
1340 paradoxical_subreg_p (const_rtx x)
1341 {
1342   if (GET_CODE (x) != SUBREG)
1343     return false;
1344   return (GET_MODE_PRECISION (GET_MODE (x))
1345           > GET_MODE_PRECISION (GET_MODE (SUBREG_REG (x))));
1346 }
1347 \f
1348 /* Return subword OFFSET of operand OP.
1349    The word number, OFFSET, is interpreted as the word number starting
1350    at the low-order address.  OFFSET 0 is the low-order word if not
1351    WORDS_BIG_ENDIAN, otherwise it is the high-order word.
1352
1353    If we cannot extract the required word, we return zero.  Otherwise,
1354    an rtx corresponding to the requested word will be returned.
1355
1356    VALIDATE_ADDRESS is nonzero if the address should be validated.  Before
1357    reload has completed, a valid address will always be returned.  After
1358    reload, if a valid address cannot be returned, we return zero.
1359
1360    If VALIDATE_ADDRESS is zero, we simply form the required address; validating
1361    it is the responsibility of the caller.
1362
1363    MODE is the mode of OP in case it is a CONST_INT.
1364
1365    ??? This is still rather broken for some cases.  The problem for the
1366    moment is that all callers of this thing provide no 'goal mode' to
1367    tell us to work with.  This exists because all callers were written
1368    in a word based SUBREG world.
1369    Now use of this function can be deprecated by simplify_subreg in most
1370    cases.
1371  */
1372
1373 rtx
1374 operand_subword (rtx op, unsigned int offset, int validate_address, enum machine_mode mode)
1375 {
1376   if (mode == VOIDmode)
1377     mode = GET_MODE (op);
1378
1379   gcc_assert (mode != VOIDmode);
1380
1381   /* If OP is narrower than a word, fail.  */
1382   if (mode != BLKmode
1383       && (GET_MODE_SIZE (mode) < UNITS_PER_WORD))
1384     return 0;
1385
1386   /* If we want a word outside OP, return zero.  */
1387   if (mode != BLKmode
1388       && (offset + 1) * UNITS_PER_WORD > GET_MODE_SIZE (mode))
1389     return const0_rtx;
1390
1391   /* Form a new MEM at the requested address.  */
1392   if (MEM_P (op))
1393     {
1394       rtx new_rtx = adjust_address_nv (op, word_mode, offset * UNITS_PER_WORD);
1395
1396       if (! validate_address)
1397         return new_rtx;
1398
1399       else if (reload_completed)
1400         {
1401           if (! strict_memory_address_addr_space_p (word_mode,
1402                                                     XEXP (new_rtx, 0),
1403                                                     MEM_ADDR_SPACE (op)))
1404             return 0;
1405         }
1406       else
1407         return replace_equiv_address (new_rtx, XEXP (new_rtx, 0));
1408     }
1409
1410   /* Rest can be handled by simplify_subreg.  */
1411   return simplify_gen_subreg (word_mode, op, mode, (offset * UNITS_PER_WORD));
1412 }
1413
1414 /* Similar to `operand_subword', but never return 0.  If we can't
1415    extract the required subword, put OP into a register and try again.
1416    The second attempt must succeed.  We always validate the address in
1417    this case.
1418
1419    MODE is the mode of OP, in case it is CONST_INT.  */
1420
1421 rtx
1422 operand_subword_force (rtx op, unsigned int offset, enum machine_mode mode)
1423 {
1424   rtx result = operand_subword (op, offset, 1, mode);
1425
1426   if (result)
1427     return result;
1428
1429   if (mode != BLKmode && mode != VOIDmode)
1430     {
1431       /* If this is a register which can not be accessed by words, copy it
1432          to a pseudo register.  */
1433       if (REG_P (op))
1434         op = copy_to_reg (op);
1435       else
1436         op = force_reg (mode, op);
1437     }
1438
1439   result = operand_subword (op, offset, 1, mode);
1440   gcc_assert (result);
1441
1442   return result;
1443 }
1444 \f
1445 /* Returns 1 if both MEM_EXPR can be considered equal
1446    and 0 otherwise.  */
1447
1448 int
1449 mem_expr_equal_p (const_tree expr1, const_tree expr2)
1450 {
1451   if (expr1 == expr2)
1452     return 1;
1453
1454   if (! expr1 || ! expr2)
1455     return 0;
1456
1457   if (TREE_CODE (expr1) != TREE_CODE (expr2))
1458     return 0;
1459
1460   return operand_equal_p (expr1, expr2, 0);
1461 }
1462
1463 /* Return OFFSET if XEXP (MEM, 0) - OFFSET is known to be ALIGN
1464    bits aligned for 0 <= OFFSET < ALIGN / BITS_PER_UNIT, or
1465    -1 if not known.  */
1466
1467 int
1468 get_mem_align_offset (rtx mem, unsigned int align)
1469 {
1470   tree expr;
1471   unsigned HOST_WIDE_INT offset;
1472
1473   /* This function can't use
1474      if (!MEM_EXPR (mem) || !MEM_OFFSET (mem)
1475          || !CONST_INT_P (MEM_OFFSET (mem))
1476          || (MAX (MEM_ALIGN (mem),
1477                   get_object_alignment (MEM_EXPR (mem), align))
1478              < align))
1479        return -1;
1480      else
1481        return (- INTVAL (MEM_OFFSET (mem))) & (align / BITS_PER_UNIT - 1);
1482      for two reasons:
1483      - COMPONENT_REFs in MEM_EXPR can have NULL first operand,
1484        for <variable>.  get_inner_reference doesn't handle it and
1485        even if it did, the alignment in that case needs to be determined
1486        from DECL_FIELD_CONTEXT's TYPE_ALIGN.
1487      - it would do suboptimal job for COMPONENT_REFs, even if MEM_EXPR
1488        isn't sufficiently aligned, the object it is in might be.  */
1489   gcc_assert (MEM_P (mem));
1490   expr = MEM_EXPR (mem);
1491   if (expr == NULL_TREE
1492       || MEM_OFFSET (mem) == NULL_RTX
1493       || !CONST_INT_P (MEM_OFFSET (mem)))
1494     return -1;
1495
1496   offset = INTVAL (MEM_OFFSET (mem));
1497   if (DECL_P (expr))
1498     {
1499       if (DECL_ALIGN (expr) < align)
1500         return -1;
1501     }
1502   else if (INDIRECT_REF_P (expr))
1503     {
1504       if (TYPE_ALIGN (TREE_TYPE (expr)) < (unsigned int) align)
1505         return -1;
1506     }
1507   else if (TREE_CODE (expr) == COMPONENT_REF)
1508     {
1509       while (1)
1510         {
1511           tree inner = TREE_OPERAND (expr, 0);
1512           tree field = TREE_OPERAND (expr, 1);
1513           tree byte_offset = component_ref_field_offset (expr);
1514           tree bit_offset = DECL_FIELD_BIT_OFFSET (field);
1515
1516           if (!byte_offset
1517               || !host_integerp (byte_offset, 1)
1518               || !host_integerp (bit_offset, 1))
1519             return -1;
1520
1521           offset += tree_low_cst (byte_offset, 1);
1522           offset += tree_low_cst (bit_offset, 1) / BITS_PER_UNIT;
1523
1524           if (inner == NULL_TREE)
1525             {
1526               if (TYPE_ALIGN (DECL_FIELD_CONTEXT (field))
1527                   < (unsigned int) align)
1528                 return -1;
1529               break;
1530             }
1531           else if (DECL_P (inner))
1532             {
1533               if (DECL_ALIGN (inner) < align)
1534                 return -1;
1535               break;
1536             }
1537           else if (TREE_CODE (inner) != COMPONENT_REF)
1538             return -1;
1539           expr = inner;
1540         }
1541     }
1542   else
1543     return -1;
1544
1545   return offset & ((align / BITS_PER_UNIT) - 1);
1546 }
1547
1548 /* Given REF (a MEM) and T, either the type of X or the expression
1549    corresponding to REF, set the memory attributes.  OBJECTP is nonzero
1550    if we are making a new object of this type.  BITPOS is nonzero if
1551    there is an offset outstanding on T that will be applied later.  */
1552
1553 void
1554 set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
1555                                  HOST_WIDE_INT bitpos)
1556 {
1557   alias_set_type alias;
1558   tree expr = NULL;
1559   rtx offset = NULL_RTX;
1560   rtx size = NULL_RTX;
1561   unsigned int align = BITS_PER_UNIT;
1562   HOST_WIDE_INT apply_bitpos = 0;
1563   tree type;
1564
1565   /* It can happen that type_for_mode was given a mode for which there
1566      is no language-level type.  In which case it returns NULL, which
1567      we can see here.  */
1568   if (t == NULL_TREE)
1569     return;
1570
1571   type = TYPE_P (t) ? t : TREE_TYPE (t);
1572   if (type == error_mark_node)
1573     return;
1574
1575   /* If we have already set DECL_RTL = ref, get_alias_set will get the
1576      wrong answer, as it assumes that DECL_RTL already has the right alias
1577      info.  Callers should not set DECL_RTL until after the call to
1578      set_mem_attributes.  */
1579   gcc_assert (!DECL_P (t) || ref != DECL_RTL_IF_SET (t));
1580
1581   /* Get the alias set from the expression or type (perhaps using a
1582      front-end routine) and use it.  */
1583   alias = get_alias_set (t);
1584
1585   MEM_VOLATILE_P (ref) |= TYPE_VOLATILE (type);
1586   MEM_IN_STRUCT_P (ref)
1587     = AGGREGATE_TYPE_P (type) || TREE_CODE (type) == COMPLEX_TYPE;
1588   MEM_POINTER (ref) = POINTER_TYPE_P (type);
1589
1590   /* If we are making an object of this type, or if this is a DECL, we know
1591      that it is a scalar if the type is not an aggregate.  */
1592   if ((objectp || DECL_P (t))
1593       && ! AGGREGATE_TYPE_P (type)
1594       && TREE_CODE (type) != COMPLEX_TYPE)
1595     MEM_SCALAR_P (ref) = 1;
1596
1597   /* Default values from pre-existing memory attributes if present.  */
1598   if (MEM_ATTRS (ref))
1599     {
1600       /* ??? Can this ever happen?  Calling this routine on a MEM that
1601          already carries memory attributes should probably be invalid.  */
1602       expr = MEM_EXPR (ref);
1603       offset = MEM_OFFSET (ref);
1604       size = MEM_SIZE (ref);
1605       align = MEM_ALIGN (ref);
1606     }
1607
1608   /* Otherwise, default values from the mode of the MEM reference.  */
1609   else if (GET_MODE (ref) != BLKmode)
1610     {
1611       /* Respect mode size.  */
1612       size = GEN_INT (GET_MODE_SIZE (GET_MODE (ref)));
1613       /* ??? Is this really necessary?  We probably should always get
1614          the size from the type below.  */
1615
1616       /* Respect mode alignment for STRICT_ALIGNMENT targets if T is a type;
1617          if T is an object, always compute the object alignment below.  */
1618       if (STRICT_ALIGNMENT && TYPE_P (t))
1619         align = GET_MODE_ALIGNMENT (GET_MODE (ref));
1620       /* ??? If T is a type, respecting mode alignment may *also* be wrong
1621          e.g. if the type carries an alignment attribute.  Should we be
1622          able to simply always use TYPE_ALIGN?  */
1623     }
1624
1625   /* We can set the alignment from the type if we are making an object,
1626      this is an INDIRECT_REF, or if TYPE_ALIGN_OK.  */
1627   if (objectp || TREE_CODE (t) == INDIRECT_REF || TYPE_ALIGN_OK (type))
1628     align = MAX (align, TYPE_ALIGN (type));
1629
1630   else if (TREE_CODE (t) == MEM_REF)
1631     {
1632       tree op0 = TREE_OPERAND (t, 0);
1633       if (TREE_CODE (op0) == ADDR_EXPR
1634           && (DECL_P (TREE_OPERAND (op0, 0))
1635               || CONSTANT_CLASS_P (TREE_OPERAND (op0, 0))))
1636         {
1637           if (DECL_P (TREE_OPERAND (op0, 0)))
1638             align = DECL_ALIGN (TREE_OPERAND (op0, 0));
1639           else if (CONSTANT_CLASS_P (TREE_OPERAND (op0, 0)))
1640             {
1641               align = TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (op0, 0)));
1642 #ifdef CONSTANT_ALIGNMENT
1643               align = CONSTANT_ALIGNMENT (TREE_OPERAND (op0, 0), align);
1644 #endif
1645             }
1646           if (TREE_INT_CST_LOW (TREE_OPERAND (t, 1)) != 0)
1647             {
1648               unsigned HOST_WIDE_INT ioff
1649                 = TREE_INT_CST_LOW (TREE_OPERAND (t, 1));
1650               unsigned HOST_WIDE_INT aoff = (ioff & -ioff) * BITS_PER_UNIT;
1651               align = MIN (aoff, align);
1652             }
1653         }
1654       else
1655         /* ??? This isn't fully correct, we can't set the alignment from the
1656            type in all cases.  */
1657         align = MAX (align, TYPE_ALIGN (type));
1658     }
1659
1660   else if (TREE_CODE (t) == TARGET_MEM_REF)
1661     /* ??? This isn't fully correct, we can't set the alignment from the
1662        type in all cases.  */
1663     align = MAX (align, TYPE_ALIGN (type));
1664
1665   /* If the size is known, we can set that.  */
1666   if (TYPE_SIZE_UNIT (type) && host_integerp (TYPE_SIZE_UNIT (type), 1))
1667     size = GEN_INT (tree_low_cst (TYPE_SIZE_UNIT (type), 1));
1668
1669   /* If T is not a type, we may be able to deduce some more information about
1670      the expression.  */
1671   if (! TYPE_P (t))
1672     {
1673       tree base;
1674       bool align_computed = false;
1675
1676       if (TREE_THIS_VOLATILE (t))
1677         MEM_VOLATILE_P (ref) = 1;
1678
1679       /* Now remove any conversions: they don't change what the underlying
1680          object is.  Likewise for SAVE_EXPR.  */
1681       while (CONVERT_EXPR_P (t)
1682              || TREE_CODE (t) == VIEW_CONVERT_EXPR
1683              || TREE_CODE (t) == SAVE_EXPR)
1684         t = TREE_OPERAND (t, 0);
1685
1686       /* Note whether this expression can trap.  */
1687       MEM_NOTRAP_P (ref) = !tree_could_trap_p (t);
1688
1689       base = get_base_address (t);
1690       if (base && DECL_P (base)
1691           && TREE_READONLY (base)
1692           && (TREE_STATIC (base) || DECL_EXTERNAL (base))
1693           && !TREE_THIS_VOLATILE (base))
1694         MEM_READONLY_P (ref) = 1;
1695
1696       /* If this expression uses it's parent's alias set, mark it such
1697          that we won't change it.  */
1698       if (component_uses_parent_alias_set (t))
1699         MEM_KEEP_ALIAS_SET_P (ref) = 1;
1700
1701       /* If this is a decl, set the attributes of the MEM from it.  */
1702       if (DECL_P (t))
1703         {
1704           expr = t;
1705           offset = const0_rtx;
1706           apply_bitpos = bitpos;
1707           size = (DECL_SIZE_UNIT (t)
1708                   && host_integerp (DECL_SIZE_UNIT (t), 1)
1709                   ? GEN_INT (tree_low_cst (DECL_SIZE_UNIT (t), 1)) : 0);
1710           align = DECL_ALIGN (t);
1711           align_computed = true;
1712         }
1713
1714       /* If this is a constant, we know the alignment.  */
1715       else if (CONSTANT_CLASS_P (t))
1716         {
1717           align = TYPE_ALIGN (type);
1718 #ifdef CONSTANT_ALIGNMENT
1719           align = CONSTANT_ALIGNMENT (t, align);
1720 #endif
1721           align_computed = true;
1722         }
1723
1724       /* If this is a field reference and not a bit-field, record it.  */
1725       /* ??? There is some information that can be gleaned from bit-fields,
1726          such as the word offset in the structure that might be modified.
1727          But skip it for now.  */
1728       else if (TREE_CODE (t) == COMPONENT_REF
1729                && ! DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
1730         {
1731           expr = t;
1732           offset = const0_rtx;
1733           apply_bitpos = bitpos;
1734           /* ??? Any reason the field size would be different than
1735              the size we got from the type?  */
1736         }
1737
1738       /* If this is an array reference, look for an outer field reference.  */
1739       else if (TREE_CODE (t) == ARRAY_REF)
1740         {
1741           tree off_tree = size_zero_node;
1742           /* We can't modify t, because we use it at the end of the
1743              function.  */
1744           tree t2 = t;
1745
1746           do
1747             {
1748               tree index = TREE_OPERAND (t2, 1);
1749               tree low_bound = array_ref_low_bound (t2);
1750               tree unit_size = array_ref_element_size (t2);
1751
1752               /* We assume all arrays have sizes that are a multiple of a byte.
1753                  First subtract the lower bound, if any, in the type of the
1754                  index, then convert to sizetype and multiply by the size of
1755                  the array element.  */
1756               if (! integer_zerop (low_bound))
1757                 index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
1758                                      index, low_bound);
1759
1760               off_tree = size_binop (PLUS_EXPR,
1761                                      size_binop (MULT_EXPR,
1762                                                  fold_convert (sizetype,
1763                                                                index),
1764                                                  unit_size),
1765                                      off_tree);
1766               t2 = TREE_OPERAND (t2, 0);
1767             }
1768           while (TREE_CODE (t2) == ARRAY_REF);
1769
1770           if (DECL_P (t2))
1771             {
1772               expr = t2;
1773               offset = NULL;
1774               if (host_integerp (off_tree, 1))
1775                 {
1776                   HOST_WIDE_INT ioff = tree_low_cst (off_tree, 1);
1777                   HOST_WIDE_INT aoff = (ioff & -ioff) * BITS_PER_UNIT;
1778                   align = DECL_ALIGN (t2);
1779                   if (aoff && (unsigned HOST_WIDE_INT) aoff < align)
1780                     align = aoff;
1781                   align_computed = true;
1782                   offset = GEN_INT (ioff);
1783                   apply_bitpos = bitpos;
1784                 }
1785             }
1786           else if (TREE_CODE (t2) == COMPONENT_REF)
1787             {
1788               expr = t2;
1789               offset = NULL;
1790               if (host_integerp (off_tree, 1))
1791                 {
1792                   offset = GEN_INT (tree_low_cst (off_tree, 1));
1793                   apply_bitpos = bitpos;
1794                 }
1795               /* ??? Any reason the field size would be different than
1796                  the size we got from the type?  */
1797             }
1798
1799           /* If this is an indirect reference, record it.  */
1800           else if (TREE_CODE (t) == MEM_REF)
1801             {
1802               expr = t;
1803               offset = const0_rtx;
1804               apply_bitpos = bitpos;
1805             }
1806         }
1807
1808       /* If this is an indirect reference, record it.  */
1809       else if (TREE_CODE (t) == MEM_REF 
1810                || TREE_CODE (t) == TARGET_MEM_REF)
1811         {
1812           expr = t;
1813           offset = const0_rtx;
1814           apply_bitpos = bitpos;
1815         }
1816
1817       if (!align_computed && !INDIRECT_REF_P (t))
1818         {
1819           unsigned int obj_align = get_object_alignment (t, BIGGEST_ALIGNMENT);
1820           align = MAX (align, obj_align);
1821         }
1822     }
1823
1824   /* If we modified OFFSET based on T, then subtract the outstanding
1825      bit position offset.  Similarly, increase the size of the accessed
1826      object to contain the negative offset.  */
1827   if (apply_bitpos)
1828     {
1829       offset = plus_constant (offset, -(apply_bitpos / BITS_PER_UNIT));
1830       if (size)
1831         size = plus_constant (size, apply_bitpos / BITS_PER_UNIT);
1832     }
1833
1834   /* Now set the attributes we computed above.  */
1835   MEM_ATTRS (ref)
1836     = get_mem_attrs (alias, expr, offset, size, align,
1837                      TYPE_ADDR_SPACE (type), GET_MODE (ref));
1838
1839   /* If this is already known to be a scalar or aggregate, we are done.  */
1840   if (MEM_IN_STRUCT_P (ref) || MEM_SCALAR_P (ref))
1841     return;
1842
1843   /* If it is a reference into an aggregate, this is part of an aggregate.
1844      Otherwise we don't know.  */
1845   else if (TREE_CODE (t) == COMPONENT_REF || TREE_CODE (t) == ARRAY_REF
1846            || TREE_CODE (t) == ARRAY_RANGE_REF
1847            || TREE_CODE (t) == BIT_FIELD_REF)
1848     MEM_IN_STRUCT_P (ref) = 1;
1849 }
1850
1851 void
1852 set_mem_attributes (rtx ref, tree t, int objectp)
1853 {
1854   set_mem_attributes_minus_bitpos (ref, t, objectp, 0);
1855 }
1856
1857 /* Set the alias set of MEM to SET.  */
1858
1859 void
1860 set_mem_alias_set (rtx mem, alias_set_type set)
1861 {
1862   /* If the new and old alias sets don't conflict, something is wrong.  */
1863   gcc_checking_assert (alias_sets_conflict_p (set, MEM_ALIAS_SET (mem)));
1864
1865   MEM_ATTRS (mem) = get_mem_attrs (set, MEM_EXPR (mem), MEM_OFFSET (mem),
1866                                    MEM_SIZE (mem), MEM_ALIGN (mem),
1867                                    MEM_ADDR_SPACE (mem), GET_MODE (mem));
1868 }
1869
1870 /* Set the address space of MEM to ADDRSPACE (target-defined).  */
1871
1872 void
1873 set_mem_addr_space (rtx mem, addr_space_t addrspace)
1874 {
1875   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1876                                    MEM_OFFSET (mem), MEM_SIZE (mem),
1877                                    MEM_ALIGN (mem), addrspace, GET_MODE (mem));
1878 }
1879
1880 /* Set the alignment of MEM to ALIGN bits.  */
1881
1882 void
1883 set_mem_align (rtx mem, unsigned int align)
1884 {
1885   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1886                                    MEM_OFFSET (mem), MEM_SIZE (mem), align,
1887                                    MEM_ADDR_SPACE (mem), GET_MODE (mem));
1888 }
1889
1890 /* Set the expr for MEM to EXPR.  */
1891
1892 void
1893 set_mem_expr (rtx mem, tree expr)
1894 {
1895   MEM_ATTRS (mem)
1896     = get_mem_attrs (MEM_ALIAS_SET (mem), expr, MEM_OFFSET (mem),
1897                      MEM_SIZE (mem), MEM_ALIGN (mem),
1898                      MEM_ADDR_SPACE (mem), GET_MODE (mem));
1899 }
1900
1901 /* Set the offset of MEM to OFFSET.  */
1902
1903 void
1904 set_mem_offset (rtx mem, rtx offset)
1905 {
1906   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1907                                    offset, MEM_SIZE (mem), MEM_ALIGN (mem),
1908                                    MEM_ADDR_SPACE (mem), GET_MODE (mem));
1909 }
1910
1911 /* Set the size of MEM to SIZE.  */
1912
1913 void
1914 set_mem_size (rtx mem, rtx size)
1915 {
1916   MEM_ATTRS (mem) = get_mem_attrs (MEM_ALIAS_SET (mem), MEM_EXPR (mem),
1917                                    MEM_OFFSET (mem), size, MEM_ALIGN (mem),
1918                                    MEM_ADDR_SPACE (mem), GET_MODE (mem));
1919 }
1920 \f
1921 /* Return a memory reference like MEMREF, but with its mode changed to MODE
1922    and its address changed to ADDR.  (VOIDmode means don't change the mode.
1923    NULL for ADDR means don't change the address.)  VALIDATE is nonzero if the
1924    returned memory location is required to be valid.  The memory
1925    attributes are not changed.  */
1926
1927 static rtx
1928 change_address_1 (rtx memref, enum machine_mode mode, rtx addr, int validate)
1929 {
1930   addr_space_t as;
1931   rtx new_rtx;
1932
1933   gcc_assert (MEM_P (memref));
1934   as = MEM_ADDR_SPACE (memref);
1935   if (mode == VOIDmode)
1936     mode = GET_MODE (memref);
1937   if (addr == 0)
1938     addr = XEXP (memref, 0);
1939   if (mode == GET_MODE (memref) && addr == XEXP (memref, 0)
1940       && (!validate || memory_address_addr_space_p (mode, addr, as)))
1941     return memref;
1942
1943   if (validate)
1944     {
1945       if (reload_in_progress || reload_completed)
1946         gcc_assert (memory_address_addr_space_p (mode, addr, as));
1947       else
1948         addr = memory_address_addr_space (mode, addr, as);
1949     }
1950
1951   if (rtx_equal_p (addr, XEXP (memref, 0)) && mode == GET_MODE (memref))
1952     return memref;
1953
1954   new_rtx = gen_rtx_MEM (mode, addr);
1955   MEM_COPY_ATTRIBUTES (new_rtx, memref);
1956   return new_rtx;
1957 }
1958
1959 /* Like change_address_1 with VALIDATE nonzero, but we are not saying in what
1960    way we are changing MEMREF, so we only preserve the alias set.  */
1961
1962 rtx
1963 change_address (rtx memref, enum machine_mode mode, rtx addr)
1964 {
1965   rtx new_rtx = change_address_1 (memref, mode, addr, 1), size;
1966   enum machine_mode mmode = GET_MODE (new_rtx);
1967   unsigned int align;
1968
1969   size = mmode == BLKmode ? 0 : GEN_INT (GET_MODE_SIZE (mmode));
1970   align = mmode == BLKmode ? BITS_PER_UNIT : GET_MODE_ALIGNMENT (mmode);
1971
1972   /* If there are no changes, just return the original memory reference.  */
1973   if (new_rtx == memref)
1974     {
1975       if (MEM_ATTRS (memref) == 0
1976           || (MEM_EXPR (memref) == NULL
1977               && MEM_OFFSET (memref) == NULL
1978               && MEM_SIZE (memref) == size
1979               && MEM_ALIGN (memref) == align))
1980         return new_rtx;
1981
1982       new_rtx = gen_rtx_MEM (mmode, XEXP (memref, 0));
1983       MEM_COPY_ATTRIBUTES (new_rtx, memref);
1984     }
1985
1986   MEM_ATTRS (new_rtx)
1987     = get_mem_attrs (MEM_ALIAS_SET (memref), 0, 0, size, align,
1988                      MEM_ADDR_SPACE (memref), mmode);
1989
1990   return new_rtx;
1991 }
1992
1993 /* Return a memory reference like MEMREF, but with its mode changed
1994    to MODE and its address offset by OFFSET bytes.  If VALIDATE is
1995    nonzero, the memory address is forced to be valid.
1996    If ADJUST is zero, OFFSET is only used to update MEM_ATTRS
1997    and caller is responsible for adjusting MEMREF base register.  */
1998
1999 rtx
2000 adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
2001                   int validate, int adjust)
2002 {
2003   rtx addr = XEXP (memref, 0);
2004   rtx new_rtx;
2005   rtx memoffset = MEM_OFFSET (memref);
2006   rtx size = 0;
2007   unsigned int memalign = MEM_ALIGN (memref);
2008   addr_space_t as = MEM_ADDR_SPACE (memref);
2009   enum machine_mode address_mode = targetm.addr_space.address_mode (as);
2010   int pbits;
2011
2012   /* If there are no changes, just return the original memory reference.  */
2013   if (mode == GET_MODE (memref) && !offset
2014       && (!validate || memory_address_addr_space_p (mode, addr, as)))
2015     return memref;
2016
2017   /* ??? Prefer to create garbage instead of creating shared rtl.
2018      This may happen even if offset is nonzero -- consider
2019      (plus (plus reg reg) const_int) -- so do this always.  */
2020   addr = copy_rtx (addr);
2021
2022   /* Convert a possibly large offset to a signed value within the
2023      range of the target address space.  */
2024   pbits = GET_MODE_BITSIZE (address_mode);
2025   if (HOST_BITS_PER_WIDE_INT > pbits)
2026     {
2027       int shift = HOST_BITS_PER_WIDE_INT - pbits;
2028       offset = (((HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) offset << shift))
2029                 >> shift);
2030     }
2031
2032   if (adjust)
2033     {
2034       /* If MEMREF is a LO_SUM and the offset is within the alignment of the
2035          object, we can merge it into the LO_SUM.  */
2036       if (GET_MODE (memref) != BLKmode && GET_CODE (addr) == LO_SUM
2037           && offset >= 0
2038           && (unsigned HOST_WIDE_INT) offset
2039               < GET_MODE_ALIGNMENT (GET_MODE (memref)) / BITS_PER_UNIT)
2040         addr = gen_rtx_LO_SUM (address_mode, XEXP (addr, 0),
2041                                plus_constant (XEXP (addr, 1), offset));
2042       else
2043         addr = plus_constant (addr, offset);
2044     }
2045
2046   new_rtx = change_address_1 (memref, mode, addr, validate);
2047
2048   /* If the address is a REG, change_address_1 rightfully returns memref,
2049      but this would destroy memref's MEM_ATTRS.  */
2050   if (new_rtx == memref && offset != 0)
2051     new_rtx = copy_rtx (new_rtx);
2052
2053   /* Compute the new values of the memory attributes due to this adjustment.
2054      We add the offsets and update the alignment.  */
2055   if (memoffset)
2056     memoffset = GEN_INT (offset + INTVAL (memoffset));
2057
2058   /* Compute the new alignment by taking the MIN of the alignment and the
2059      lowest-order set bit in OFFSET, but don't change the alignment if OFFSET
2060      if zero.  */
2061   if (offset != 0)
2062     memalign
2063       = MIN (memalign,
2064              (unsigned HOST_WIDE_INT) (offset & -offset) * BITS_PER_UNIT);
2065
2066   /* We can compute the size in a number of ways.  */
2067   if (GET_MODE (new_rtx) != BLKmode)
2068     size = GEN_INT (GET_MODE_SIZE (GET_MODE (new_rtx)));
2069   else if (MEM_SIZE (memref))
2070     size = plus_constant (MEM_SIZE (memref), -offset);
2071
2072   MEM_ATTRS (new_rtx) = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref),
2073                                        memoffset, size, memalign, as,
2074                                        GET_MODE (new_rtx));
2075
2076   /* At some point, we should validate that this offset is within the object,
2077      if all the appropriate values are known.  */
2078   return new_rtx;
2079 }
2080
2081 /* Return a memory reference like MEMREF, but with its mode changed
2082    to MODE and its address changed to ADDR, which is assumed to be
2083    MEMREF offset by OFFSET bytes.  If VALIDATE is
2084    nonzero, the memory address is forced to be valid.  */
2085
2086 rtx
2087 adjust_automodify_address_1 (rtx memref, enum machine_mode mode, rtx addr,
2088                              HOST_WIDE_INT offset, int validate)
2089 {
2090   memref = change_address_1 (memref, VOIDmode, addr, validate);
2091   return adjust_address_1 (memref, mode, offset, validate, 0);
2092 }
2093
2094 /* Return a memory reference like MEMREF, but whose address is changed by
2095    adding OFFSET, an RTX, to it.  POW2 is the highest power of two factor
2096    known to be in OFFSET (possibly 1).  */
2097
2098 rtx
2099 offset_address (rtx memref, rtx offset, unsigned HOST_WIDE_INT pow2)
2100 {
2101   rtx new_rtx, addr = XEXP (memref, 0);
2102   addr_space_t as = MEM_ADDR_SPACE (memref);
2103   enum machine_mode address_mode = targetm.addr_space.address_mode (as);
2104
2105   new_rtx = simplify_gen_binary (PLUS, address_mode, addr, offset);
2106
2107   /* At this point we don't know _why_ the address is invalid.  It
2108      could have secondary memory references, multiplies or anything.
2109
2110      However, if we did go and rearrange things, we can wind up not
2111      being able to recognize the magic around pic_offset_table_rtx.
2112      This stuff is fragile, and is yet another example of why it is
2113      bad to expose PIC machinery too early.  */
2114   if (! memory_address_addr_space_p (GET_MODE (memref), new_rtx, as)
2115       && GET_CODE (addr) == PLUS
2116       && XEXP (addr, 0) == pic_offset_table_rtx)
2117     {
2118       addr = force_reg (GET_MODE (addr), addr);
2119       new_rtx = simplify_gen_binary (PLUS, address_mode, addr, offset);
2120     }
2121
2122   update_temp_slot_address (XEXP (memref, 0), new_rtx);
2123   new_rtx = change_address_1 (memref, VOIDmode, new_rtx, 1);
2124
2125   /* If there are no changes, just return the original memory reference.  */
2126   if (new_rtx == memref)
2127     return new_rtx;
2128
2129   /* Update the alignment to reflect the offset.  Reset the offset, which
2130      we don't know.  */
2131   MEM_ATTRS (new_rtx)
2132     = get_mem_attrs (MEM_ALIAS_SET (memref), MEM_EXPR (memref), 0, 0,
2133                      MIN (MEM_ALIGN (memref), pow2 * BITS_PER_UNIT),
2134                      as, GET_MODE (new_rtx));
2135   return new_rtx;
2136 }
2137
2138 /* Return a memory reference like MEMREF, but with its address changed to
2139    ADDR.  The caller is asserting that the actual piece of memory pointed
2140    to is the same, just the form of the address is being changed, such as
2141    by putting something into a register.  */
2142
2143 rtx
2144 replace_equiv_address (rtx memref, rtx addr)
2145 {
2146   /* change_address_1 copies the memory attribute structure without change
2147      and that's exactly what we want here.  */
2148   update_temp_slot_address (XEXP (memref, 0), addr);
2149   return change_address_1 (memref, VOIDmode, addr, 1);
2150 }
2151
2152 /* Likewise, but the reference is not required to be valid.  */
2153
2154 rtx
2155 replace_equiv_address_nv (rtx memref, rtx addr)
2156 {
2157   return change_address_1 (memref, VOIDmode, addr, 0);
2158 }
2159
2160 /* Return a memory reference like MEMREF, but with its mode widened to
2161    MODE and offset by OFFSET.  This would be used by targets that e.g.
2162    cannot issue QImode memory operations and have to use SImode memory
2163    operations plus masking logic.  */
2164
2165 rtx
2166 widen_memory_access (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset)
2167 {
2168   rtx new_rtx = adjust_address_1 (memref, mode, offset, 1, 1);
2169   tree expr = MEM_EXPR (new_rtx);
2170   rtx memoffset = MEM_OFFSET (new_rtx);
2171   unsigned int size = GET_MODE_SIZE (mode);
2172
2173   /* If there are no changes, just return the original memory reference.  */
2174   if (new_rtx == memref)
2175     return new_rtx;
2176
2177   /* If we don't know what offset we were at within the expression, then
2178      we can't know if we've overstepped the bounds.  */
2179   if (! memoffset)
2180     expr = NULL_TREE;
2181
2182   while (expr)
2183     {
2184       if (TREE_CODE (expr) == COMPONENT_REF)
2185         {
2186           tree field = TREE_OPERAND (expr, 1);
2187           tree offset = component_ref_field_offset (expr);
2188
2189           if (! DECL_SIZE_UNIT (field))
2190             {
2191               expr = NULL_TREE;
2192               break;
2193             }
2194
2195           /* Is the field at least as large as the access?  If so, ok,
2196              otherwise strip back to the containing structure.  */
2197           if (TREE_CODE (DECL_SIZE_UNIT (field)) == INTEGER_CST
2198               && compare_tree_int (DECL_SIZE_UNIT (field), size) >= 0
2199               && INTVAL (memoffset) >= 0)
2200             break;
2201
2202           if (! host_integerp (offset, 1))
2203             {
2204               expr = NULL_TREE;
2205               break;
2206             }
2207
2208           expr = TREE_OPERAND (expr, 0);
2209           memoffset
2210             = (GEN_INT (INTVAL (memoffset)
2211                         + tree_low_cst (offset, 1)
2212                         + (tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
2213                            / BITS_PER_UNIT)));
2214         }
2215       /* Similarly for the decl.  */
2216       else if (DECL_P (expr)
2217                && DECL_SIZE_UNIT (expr)
2218                && TREE_CODE (DECL_SIZE_UNIT (expr)) == INTEGER_CST
2219                && compare_tree_int (DECL_SIZE_UNIT (expr), size) >= 0
2220                && (! memoffset || INTVAL (memoffset) >= 0))
2221         break;
2222       else
2223         {
2224           /* The widened memory access overflows the expression, which means
2225              that it could alias another expression.  Zap it.  */
2226           expr = NULL_TREE;
2227           break;
2228         }
2229     }
2230
2231   if (! expr)
2232     memoffset = NULL_RTX;
2233
2234   /* The widened memory may alias other stuff, so zap the alias set.  */
2235   /* ??? Maybe use get_alias_set on any remaining expression.  */
2236
2237   MEM_ATTRS (new_rtx) = get_mem_attrs (0, expr, memoffset, GEN_INT (size),
2238                                        MEM_ALIGN (new_rtx),
2239                                        MEM_ADDR_SPACE (new_rtx), mode);
2240
2241   return new_rtx;
2242 }
2243 \f
2244 /* A fake decl that is used as the MEM_EXPR of spill slots.  */
2245 static GTY(()) tree spill_slot_decl;
2246
2247 tree
2248 get_spill_slot_decl (bool force_build_p)
2249 {
2250   tree d = spill_slot_decl;
2251   rtx rd;
2252
2253   if (d || !force_build_p)
2254     return d;
2255
2256   d = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
2257                   VAR_DECL, get_identifier ("%sfp"), void_type_node);
2258   DECL_ARTIFICIAL (d) = 1;
2259   DECL_IGNORED_P (d) = 1;
2260   TREE_USED (d) = 1;
2261   spill_slot_decl = d;
2262
2263   rd = gen_rtx_MEM (BLKmode, frame_pointer_rtx);
2264   MEM_NOTRAP_P (rd) = 1;
2265   MEM_ATTRS (rd) = get_mem_attrs (new_alias_set (), d, const0_rtx,
2266                                   NULL_RTX, 0, ADDR_SPACE_GENERIC, BLKmode);
2267   SET_DECL_RTL (d, rd);
2268
2269   return d;
2270 }
2271
2272 /* Given MEM, a result from assign_stack_local, fill in the memory
2273    attributes as appropriate for a register allocator spill slot.
2274    These slots are not aliasable by other memory.  We arrange for
2275    them all to use a single MEM_EXPR, so that the aliasing code can
2276    work properly in the case of shared spill slots.  */
2277
2278 void
2279 set_mem_attrs_for_spill (rtx mem)
2280 {
2281   alias_set_type alias;
2282   rtx addr, offset;
2283   tree expr;
2284
2285   expr = get_spill_slot_decl (true);
2286   alias = MEM_ALIAS_SET (DECL_RTL (expr));
2287
2288   /* We expect the incoming memory to be of the form:
2289         (mem:MODE (plus (reg sfp) (const_int offset)))
2290      with perhaps the plus missing for offset = 0.  */
2291   addr = XEXP (mem, 0);
2292   offset = const0_rtx;
2293   if (GET_CODE (addr) == PLUS
2294       && CONST_INT_P (XEXP (addr, 1)))
2295     offset = XEXP (addr, 1);
2296
2297   MEM_ATTRS (mem) = get_mem_attrs (alias, expr, offset,
2298                                    MEM_SIZE (mem), MEM_ALIGN (mem),
2299                                    ADDR_SPACE_GENERIC, GET_MODE (mem));
2300   MEM_NOTRAP_P (mem) = 1;
2301 }
2302 \f
2303 /* Return a newly created CODE_LABEL rtx with a unique label number.  */
2304
2305 rtx
2306 gen_label_rtx (void)
2307 {
2308   return gen_rtx_CODE_LABEL (VOIDmode, 0, NULL_RTX, NULL_RTX,
2309                              NULL, label_num++, NULL);
2310 }
2311 \f
2312 /* For procedure integration.  */
2313
2314 /* Install new pointers to the first and last insns in the chain.
2315    Also, set cur_insn_uid to one higher than the last in use.
2316    Used for an inline-procedure after copying the insn chain.  */
2317
2318 void
2319 set_new_first_and_last_insn (rtx first, rtx last)
2320 {
2321   rtx insn;
2322
2323   set_first_insn (first);
2324   set_last_insn (last);
2325   cur_insn_uid = 0;
2326
2327   if (MIN_NONDEBUG_INSN_UID || MAY_HAVE_DEBUG_INSNS)
2328     {
2329       int debug_count = 0;
2330
2331       cur_insn_uid = MIN_NONDEBUG_INSN_UID - 1;
2332       cur_debug_insn_uid = 0;
2333
2334       for (insn = first; insn; insn = NEXT_INSN (insn))
2335         if (INSN_UID (insn) < MIN_NONDEBUG_INSN_UID)
2336           cur_debug_insn_uid = MAX (cur_debug_insn_uid, INSN_UID (insn));
2337         else
2338           {
2339             cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
2340             if (DEBUG_INSN_P (insn))
2341               debug_count++;
2342           }
2343
2344       if (debug_count)
2345         cur_debug_insn_uid = MIN_NONDEBUG_INSN_UID + debug_count;
2346       else
2347         cur_debug_insn_uid++;
2348     }
2349   else
2350     for (insn = first; insn; insn = NEXT_INSN (insn))
2351       cur_insn_uid = MAX (cur_insn_uid, INSN_UID (insn));
2352
2353   cur_insn_uid++;
2354 }
2355 \f
2356 /* Go through all the RTL insn bodies and copy any invalid shared
2357    structure.  This routine should only be called once.  */
2358
2359 static void
2360 unshare_all_rtl_1 (rtx insn)
2361 {
2362   /* Unshare just about everything else.  */
2363   unshare_all_rtl_in_chain (insn);
2364
2365   /* Make sure the addresses of stack slots found outside the insn chain
2366      (such as, in DECL_RTL of a variable) are not shared
2367      with the insn chain.
2368
2369      This special care is necessary when the stack slot MEM does not
2370      actually appear in the insn chain.  If it does appear, its address
2371      is unshared from all else at that point.  */
2372   stack_slot_list = copy_rtx_if_shared (stack_slot_list);
2373 }
2374
2375 /* Go through all the RTL insn bodies and copy any invalid shared
2376    structure, again.  This is a fairly expensive thing to do so it
2377    should be done sparingly.  */
2378
2379 void
2380 unshare_all_rtl_again (rtx insn)
2381 {
2382   rtx p;
2383   tree decl;
2384
2385   for (p = insn; p; p = NEXT_INSN (p))
2386     if (INSN_P (p))
2387       {
2388         reset_used_flags (PATTERN (p));
2389         reset_used_flags (REG_NOTES (p));
2390       }
2391
2392   /* Make sure that virtual stack slots are not shared.  */
2393   set_used_decls (DECL_INITIAL (cfun->decl));
2394
2395   /* Make sure that virtual parameters are not shared.  */
2396   for (decl = DECL_ARGUMENTS (cfun->decl); decl; decl = DECL_CHAIN (decl))
2397     set_used_flags (DECL_RTL (decl));
2398
2399   reset_used_flags (stack_slot_list);
2400
2401   unshare_all_rtl_1 (insn);
2402 }
2403
2404 unsigned int
2405 unshare_all_rtl (void)
2406 {
2407   unshare_all_rtl_1 (get_insns ());
2408   return 0;
2409 }
2410
2411 struct rtl_opt_pass pass_unshare_all_rtl =
2412 {
2413  {
2414   RTL_PASS,
2415   "unshare",                            /* name */
2416   NULL,                                 /* gate */
2417   unshare_all_rtl,                      /* execute */
2418   NULL,                                 /* sub */
2419   NULL,                                 /* next */
2420   0,                                    /* static_pass_number */
2421   TV_NONE,                              /* tv_id */
2422   0,                                    /* properties_required */
2423   0,                                    /* properties_provided */
2424   0,                                    /* properties_destroyed */
2425   0,                                    /* todo_flags_start */
2426   TODO_verify_rtl_sharing               /* todo_flags_finish */
2427  }
2428 };
2429
2430
2431 /* Check that ORIG is not marked when it should not be and mark ORIG as in use,
2432    Recursively does the same for subexpressions.  */
2433
2434 static void
2435 verify_rtx_sharing (rtx orig, rtx insn)
2436 {
2437   rtx x = orig;
2438   int i;
2439   enum rtx_code code;
2440   const char *format_ptr;
2441
2442   if (x == 0)
2443     return;
2444
2445   code = GET_CODE (x);
2446
2447   /* These types may be freely shared.  */
2448
2449   switch (code)
2450     {
2451     case REG:
2452     case DEBUG_EXPR:
2453     case VALUE:
2454     case CONST_INT:
2455     case CONST_DOUBLE:
2456     case CONST_FIXED:
2457     case CONST_VECTOR:
2458     case SYMBOL_REF:
2459     case LABEL_REF:
2460     case CODE_LABEL:
2461     case PC:
2462     case CC0:
2463     case RETURN:
2464     case SCRATCH:
2465       return;
2466       /* SCRATCH must be shared because they represent distinct values.  */
2467     case CLOBBER:
2468       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2469         return;
2470       break;
2471
2472     case CONST:
2473       if (shared_const_p (orig))
2474         return;
2475       break;
2476
2477     case MEM:
2478       /* A MEM is allowed to be shared if its address is constant.  */
2479       if (CONSTANT_ADDRESS_P (XEXP (x, 0))
2480           || reload_completed || reload_in_progress)
2481         return;
2482
2483       break;
2484
2485     default:
2486       break;
2487     }
2488
2489   /* This rtx may not be shared.  If it has already been seen,
2490      replace it with a copy of itself.  */
2491 #ifdef ENABLE_CHECKING
2492   if (RTX_FLAG (x, used))
2493     {
2494       error ("invalid rtl sharing found in the insn");
2495       debug_rtx (insn);
2496       error ("shared rtx");
2497       debug_rtx (x);
2498       internal_error ("internal consistency failure");
2499     }
2500 #endif
2501   gcc_assert (!RTX_FLAG (x, used));
2502
2503   RTX_FLAG (x, used) = 1;
2504
2505   /* Now scan the subexpressions recursively.  */
2506
2507   format_ptr = GET_RTX_FORMAT (code);
2508
2509   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2510     {
2511       switch (*format_ptr++)
2512         {
2513         case 'e':
2514           verify_rtx_sharing (XEXP (x, i), insn);
2515           break;
2516
2517         case 'E':
2518           if (XVEC (x, i) != NULL)
2519             {
2520               int j;
2521               int len = XVECLEN (x, i);
2522
2523               for (j = 0; j < len; j++)
2524                 {
2525                   /* We allow sharing of ASM_OPERANDS inside single
2526                      instruction.  */
2527                   if (j && GET_CODE (XVECEXP (x, i, j)) == SET
2528                       && (GET_CODE (SET_SRC (XVECEXP (x, i, j)))
2529                           == ASM_OPERANDS))
2530                     verify_rtx_sharing (SET_DEST (XVECEXP (x, i, j)), insn);
2531                   else
2532                     verify_rtx_sharing (XVECEXP (x, i, j), insn);
2533                 }
2534             }
2535           break;
2536         }
2537     }
2538   return;
2539 }
2540
2541 /* Go through all the RTL insn bodies and check that there is no unexpected
2542    sharing in between the subexpressions.  */
2543
2544 DEBUG_FUNCTION void
2545 verify_rtl_sharing (void)
2546 {
2547   rtx p;
2548
2549   timevar_push (TV_VERIFY_RTL_SHARING);
2550
2551   for (p = get_insns (); p; p = NEXT_INSN (p))
2552     if (INSN_P (p))
2553       {
2554         reset_used_flags (PATTERN (p));
2555         reset_used_flags (REG_NOTES (p));
2556         if (GET_CODE (PATTERN (p)) == SEQUENCE)
2557           {
2558             int i;
2559             rtx q, sequence = PATTERN (p);
2560
2561             for (i = 0; i < XVECLEN (sequence, 0); i++)
2562               {
2563                 q = XVECEXP (sequence, 0, i);
2564                 gcc_assert (INSN_P (q));
2565                 reset_used_flags (PATTERN (q));
2566                 reset_used_flags (REG_NOTES (q));
2567               }
2568           }
2569       }
2570
2571   for (p = get_insns (); p; p = NEXT_INSN (p))
2572     if (INSN_P (p))
2573       {
2574         verify_rtx_sharing (PATTERN (p), p);
2575         verify_rtx_sharing (REG_NOTES (p), p);
2576       }
2577
2578   timevar_pop (TV_VERIFY_RTL_SHARING);
2579 }
2580
2581 /* Go through all the RTL insn bodies and copy any invalid shared structure.
2582    Assumes the mark bits are cleared at entry.  */
2583
2584 void
2585 unshare_all_rtl_in_chain (rtx insn)
2586 {
2587   for (; insn; insn = NEXT_INSN (insn))
2588     if (INSN_P (insn))
2589       {
2590         PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn));
2591         REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn));
2592       }
2593 }
2594
2595 /* Go through all virtual stack slots of a function and mark them as
2596    shared.  We never replace the DECL_RTLs themselves with a copy,
2597    but expressions mentioned into a DECL_RTL cannot be shared with
2598    expressions in the instruction stream.
2599
2600    Note that reload may convert pseudo registers into memories in-place.
2601    Pseudo registers are always shared, but MEMs never are.  Thus if we
2602    reset the used flags on MEMs in the instruction stream, we must set
2603    them again on MEMs that appear in DECL_RTLs.  */
2604
2605 static void
2606 set_used_decls (tree blk)
2607 {
2608   tree t;
2609
2610   /* Mark decls.  */
2611   for (t = BLOCK_VARS (blk); t; t = DECL_CHAIN (t))
2612     if (DECL_RTL_SET_P (t))
2613       set_used_flags (DECL_RTL (t));
2614
2615   /* Now process sub-blocks.  */
2616   for (t = BLOCK_SUBBLOCKS (blk); t; t = BLOCK_CHAIN (t))
2617     set_used_decls (t);
2618 }
2619
2620 /* Mark ORIG as in use, and return a copy of it if it was already in use.
2621    Recursively does the same for subexpressions.  Uses
2622    copy_rtx_if_shared_1 to reduce stack space.  */
2623
2624 rtx
2625 copy_rtx_if_shared (rtx orig)
2626 {
2627   copy_rtx_if_shared_1 (&orig);
2628   return orig;
2629 }
2630
2631 /* Mark *ORIG1 as in use, and set it to a copy of it if it was already in
2632    use.  Recursively does the same for subexpressions.  */
2633
2634 static void
2635 copy_rtx_if_shared_1 (rtx *orig1)
2636 {
2637   rtx x;
2638   int i;
2639   enum rtx_code code;
2640   rtx *last_ptr;
2641   const char *format_ptr;
2642   int copied = 0;
2643   int length;
2644
2645   /* Repeat is used to turn tail-recursion into iteration.  */
2646 repeat:
2647   x = *orig1;
2648
2649   if (x == 0)
2650     return;
2651
2652   code = GET_CODE (x);
2653
2654   /* These types may be freely shared.  */
2655
2656   switch (code)
2657     {
2658     case REG:
2659     case DEBUG_EXPR:
2660     case VALUE:
2661     case CONST_INT:
2662     case CONST_DOUBLE:
2663     case CONST_FIXED:
2664     case CONST_VECTOR:
2665     case SYMBOL_REF:
2666     case LABEL_REF:
2667     case CODE_LABEL:
2668     case PC:
2669     case CC0:
2670     case SCRATCH:
2671       /* SCRATCH must be shared because they represent distinct values.  */
2672       return;
2673     case CLOBBER:
2674       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
2675         return;
2676       break;
2677
2678     case CONST:
2679       if (shared_const_p (x))
2680         return;
2681       break;
2682
2683     case DEBUG_INSN:
2684     case INSN:
2685     case JUMP_INSN:
2686     case CALL_INSN:
2687     case NOTE:
2688     case BARRIER:
2689       /* The chain of insns is not being copied.  */
2690       return;
2691
2692     default:
2693       break;
2694     }
2695
2696   /* This rtx may not be shared.  If it has already been seen,
2697      replace it with a copy of itself.  */
2698
2699   if (RTX_FLAG (x, used))
2700     {
2701       x = shallow_copy_rtx (x);
2702       copied = 1;
2703     }
2704   RTX_FLAG (x, used) = 1;
2705
2706   /* Now scan the subexpressions recursively.
2707      We can store any replaced subexpressions directly into X
2708      since we know X is not shared!  Any vectors in X
2709      must be copied if X was copied.  */
2710
2711   format_ptr = GET_RTX_FORMAT (code);
2712   length = GET_RTX_LENGTH (code);
2713   last_ptr = NULL;
2714
2715   for (i = 0; i < length; i++)
2716     {
2717       switch (*format_ptr++)
2718         {
2719         case 'e':
2720           if (last_ptr)
2721             copy_rtx_if_shared_1 (last_ptr);
2722           last_ptr = &XEXP (x, i);
2723           break;
2724
2725         case 'E':
2726           if (XVEC (x, i) != NULL)
2727             {
2728               int j;
2729               int len = XVECLEN (x, i);
2730
2731               /* Copy the vector iff I copied the rtx and the length
2732                  is nonzero.  */
2733               if (copied && len > 0)
2734                 XVEC (x, i) = gen_rtvec_v (len, XVEC (x, i)->elem);
2735
2736               /* Call recursively on all inside the vector.  */
2737               for (j = 0; j < len; j++)
2738                 {
2739                   if (last_ptr)
2740                     copy_rtx_if_shared_1 (last_ptr);
2741                   last_ptr = &XVECEXP (x, i, j);
2742                 }
2743             }
2744           break;
2745         }
2746     }
2747   *orig1 = x;
2748   if (last_ptr)
2749     {
2750       orig1 = last_ptr;
2751       goto repeat;
2752     }
2753   return;
2754 }
2755
2756 /* Set the USED bit in X and its non-shareable subparts to FLAG.  */
2757
2758 static void
2759 mark_used_flags (rtx x, int flag)
2760 {
2761   int i, j;
2762   enum rtx_code code;
2763   const char *format_ptr;
2764   int length;
2765
2766   /* Repeat is used to turn tail-recursion into iteration.  */
2767 repeat:
2768   if (x == 0)
2769     return;
2770
2771   code = GET_CODE (x);
2772
2773   /* These types may be freely shared so we needn't do any resetting
2774      for them.  */
2775
2776   switch (code)
2777     {
2778     case REG:
2779     case DEBUG_EXPR:
2780     case VALUE:
2781     case CONST_INT:
2782     case CONST_DOUBLE:
2783     case CONST_FIXED:
2784     case CONST_VECTOR:
2785     case SYMBOL_REF:
2786     case CODE_LABEL:
2787     case PC:
2788     case CC0:
2789       return;
2790
2791     case DEBUG_INSN:
2792     case INSN:
2793     case JUMP_INSN:
2794     case CALL_INSN:
2795     case NOTE:
2796     case LABEL_REF:
2797     case BARRIER:
2798       /* The chain of insns is not being copied.  */
2799       return;
2800
2801     default:
2802       break;
2803     }
2804
2805   RTX_FLAG (x, used) = flag;
2806
2807   format_ptr = GET_RTX_FORMAT (code);
2808   length = GET_RTX_LENGTH (code);
2809
2810   for (i = 0; i < length; i++)
2811     {
2812       switch (*format_ptr++)
2813         {
2814         case 'e':
2815           if (i == length-1)
2816             {
2817               x = XEXP (x, i);
2818               goto repeat;
2819             }
2820           mark_used_flags (XEXP (x, i), flag);
2821           break;
2822
2823         case 'E':
2824           for (j = 0; j < XVECLEN (x, i); j++)
2825             mark_used_flags (XVECEXP (x, i, j), flag);
2826           break;
2827         }
2828     }
2829 }
2830
2831 /* Clear all the USED bits in X to allow copy_rtx_if_shared to be used
2832    to look for shared sub-parts.  */
2833
2834 void
2835 reset_used_flags (rtx x)
2836 {
2837   mark_used_flags (x, 0);
2838 }
2839
2840 /* Set all the USED bits in X to allow copy_rtx_if_shared to be used
2841    to look for shared sub-parts.  */
2842
2843 void
2844 set_used_flags (rtx x)
2845 {
2846   mark_used_flags (x, 1);
2847 }
2848 \f
2849 /* Copy X if necessary so that it won't be altered by changes in OTHER.
2850    Return X or the rtx for the pseudo reg the value of X was copied into.
2851    OTHER must be valid as a SET_DEST.  */
2852
2853 rtx
2854 make_safe_from (rtx x, rtx other)
2855 {
2856   while (1)
2857     switch (GET_CODE (other))
2858       {
2859       case SUBREG:
2860         other = SUBREG_REG (other);
2861         break;
2862       case STRICT_LOW_PART:
2863       case SIGN_EXTEND:
2864       case ZERO_EXTEND:
2865         other = XEXP (other, 0);
2866         break;
2867       default:
2868         goto done;
2869       }
2870  done:
2871   if ((MEM_P (other)
2872        && ! CONSTANT_P (x)
2873        && !REG_P (x)
2874        && GET_CODE (x) != SUBREG)
2875       || (REG_P (other)
2876           && (REGNO (other) < FIRST_PSEUDO_REGISTER
2877               || reg_mentioned_p (other, x))))
2878     {
2879       rtx temp = gen_reg_rtx (GET_MODE (x));
2880       emit_move_insn (temp, x);
2881       return temp;
2882     }
2883   return x;
2884 }
2885 \f
2886 /* Emission of insns (adding them to the doubly-linked list).  */
2887
2888 /* Return the last insn emitted, even if it is in a sequence now pushed.  */
2889
2890 rtx
2891 get_last_insn_anywhere (void)
2892 {
2893   struct sequence_stack *stack;
2894   if (get_last_insn ())
2895     return get_last_insn ();
2896   for (stack = seq_stack; stack; stack = stack->next)
2897     if (stack->last != 0)
2898       return stack->last;
2899   return 0;
2900 }
2901
2902 /* Return the first nonnote insn emitted in current sequence or current
2903    function.  This routine looks inside SEQUENCEs.  */
2904
2905 rtx
2906 get_first_nonnote_insn (void)
2907 {
2908   rtx insn = get_insns ();
2909
2910   if (insn)
2911     {
2912       if (NOTE_P (insn))
2913         for (insn = next_insn (insn);
2914              insn && NOTE_P (insn);
2915              insn = next_insn (insn))
2916           continue;
2917       else
2918         {
2919           if (NONJUMP_INSN_P (insn)
2920               && GET_CODE (PATTERN (insn)) == SEQUENCE)
2921             insn = XVECEXP (PATTERN (insn), 0, 0);
2922         }
2923     }
2924
2925   return insn;
2926 }
2927
2928 /* Return the last nonnote insn emitted in current sequence or current
2929    function.  This routine looks inside SEQUENCEs.  */
2930
2931 rtx
2932 get_last_nonnote_insn (void)
2933 {
2934   rtx insn = get_last_insn ();
2935
2936   if (insn)
2937     {
2938       if (NOTE_P (insn))
2939         for (insn = previous_insn (insn);
2940              insn && NOTE_P (insn);
2941              insn = previous_insn (insn))
2942           continue;
2943       else
2944         {
2945           if (NONJUMP_INSN_P (insn)
2946               && GET_CODE (PATTERN (insn)) == SEQUENCE)
2947             insn = XVECEXP (PATTERN (insn), 0,
2948                             XVECLEN (PATTERN (insn), 0) - 1);
2949         }
2950     }
2951
2952   return insn;
2953 }
2954
2955 /* Return the number of actual (non-debug) insns emitted in this
2956    function.  */
2957
2958 int
2959 get_max_insn_count (void)
2960 {
2961   int n = cur_insn_uid;
2962
2963   /* The table size must be stable across -g, to avoid codegen
2964      differences due to debug insns, and not be affected by
2965      -fmin-insn-uid, to avoid excessive table size and to simplify
2966      debugging of -fcompare-debug failures.  */
2967   if (cur_debug_insn_uid > MIN_NONDEBUG_INSN_UID)
2968     n -= cur_debug_insn_uid;
2969   else
2970     n -= MIN_NONDEBUG_INSN_UID;
2971
2972   return n;
2973 }
2974
2975 \f
2976 /* Return the next insn.  If it is a SEQUENCE, return the first insn
2977    of the sequence.  */
2978
2979 rtx
2980 next_insn (rtx insn)
2981 {
2982   if (insn)
2983     {
2984       insn = NEXT_INSN (insn);
2985       if (insn && NONJUMP_INSN_P (insn)
2986           && GET_CODE (PATTERN (insn)) == SEQUENCE)
2987         insn = XVECEXP (PATTERN (insn), 0, 0);
2988     }
2989
2990   return insn;
2991 }
2992
2993 /* Return the previous insn.  If it is a SEQUENCE, return the last insn
2994    of the sequence.  */
2995
2996 rtx
2997 previous_insn (rtx insn)
2998 {
2999   if (insn)
3000     {
3001       insn = PREV_INSN (insn);
3002       if (insn && NONJUMP_INSN_P (insn)
3003           && GET_CODE (PATTERN (insn)) == SEQUENCE)
3004         insn = XVECEXP (PATTERN (insn), 0, XVECLEN (PATTERN (insn), 0) - 1);
3005     }
3006
3007   return insn;
3008 }
3009
3010 /* Return the next insn after INSN that is not a NOTE.  This routine does not
3011    look inside SEQUENCEs.  */
3012
3013 rtx
3014 next_nonnote_insn (rtx insn)
3015 {
3016   while (insn)
3017     {
3018       insn = NEXT_INSN (insn);
3019       if (insn == 0 || !NOTE_P (insn))
3020         break;
3021     }
3022
3023   return insn;
3024 }
3025
3026 /* Return the next insn after INSN that is not a NOTE, but stop the
3027    search before we enter another basic block.  This routine does not
3028    look inside SEQUENCEs.  */
3029
3030 rtx
3031 next_nonnote_insn_bb (rtx insn)
3032 {
3033   while (insn)
3034     {
3035       insn = NEXT_INSN (insn);
3036       if (insn == 0 || !NOTE_P (insn))
3037         break;
3038       if (NOTE_INSN_BASIC_BLOCK_P (insn))
3039         return NULL_RTX;
3040     }
3041
3042   return insn;
3043 }
3044
3045 /* Return the previous insn before INSN that is not a NOTE.  This routine does
3046    not look inside SEQUENCEs.  */
3047
3048 rtx
3049 prev_nonnote_insn (rtx insn)
3050 {
3051   while (insn)
3052     {
3053       insn = PREV_INSN (insn);
3054       if (insn == 0 || !NOTE_P (insn))
3055         break;
3056     }
3057
3058   return insn;
3059 }
3060
3061 /* Return the previous insn before INSN that is not a NOTE, but stop
3062    the search before we enter another basic block.  This routine does
3063    not look inside SEQUENCEs.  */
3064
3065 rtx
3066 prev_nonnote_insn_bb (rtx insn)
3067 {
3068   while (insn)
3069     {
3070       insn = PREV_INSN (insn);
3071       if (insn == 0 || !NOTE_P (insn))
3072         break;
3073       if (NOTE_INSN_BASIC_BLOCK_P (insn))
3074         return NULL_RTX;
3075     }
3076
3077   return insn;
3078 }
3079
3080 /* Return the next insn after INSN that is not a DEBUG_INSN.  This
3081    routine does not look inside SEQUENCEs.  */
3082
3083 rtx
3084 next_nondebug_insn (rtx insn)
3085 {
3086   while (insn)
3087     {
3088       insn = NEXT_INSN (insn);
3089       if (insn == 0 || !DEBUG_INSN_P (insn))
3090         break;
3091     }
3092
3093   return insn;
3094 }
3095
3096 /* Return the previous insn before INSN that is not a DEBUG_INSN.
3097    This routine does not look inside SEQUENCEs.  */
3098
3099 rtx
3100 prev_nondebug_insn (rtx insn)
3101 {
3102   while (insn)
3103     {
3104       insn = PREV_INSN (insn);
3105       if (insn == 0 || !DEBUG_INSN_P (insn))
3106         break;
3107     }
3108
3109   return insn;
3110 }
3111
3112 /* Return the next insn after INSN that is not a NOTE nor DEBUG_INSN.
3113    This routine does not look inside SEQUENCEs.  */
3114
3115 rtx
3116 next_nonnote_nondebug_insn (rtx insn)
3117 {
3118   while (insn)
3119     {
3120       insn = NEXT_INSN (insn);
3121       if (insn == 0 || (!NOTE_P (insn) && !DEBUG_INSN_P (insn)))
3122         break;
3123     }
3124
3125   return insn;
3126 }
3127
3128 /* Return the previous insn before INSN that is not a NOTE nor DEBUG_INSN.
3129    This routine does not look inside SEQUENCEs.  */
3130
3131 rtx
3132 prev_nonnote_nondebug_insn (rtx insn)
3133 {
3134   while (insn)
3135     {
3136       insn = PREV_INSN (insn);
3137       if (insn == 0 || (!NOTE_P (insn) && !DEBUG_INSN_P (insn)))
3138         break;
3139     }
3140
3141   return insn;
3142 }
3143
3144 /* Return the next INSN, CALL_INSN or JUMP_INSN after INSN;
3145    or 0, if there is none.  This routine does not look inside
3146    SEQUENCEs.  */
3147
3148 rtx
3149 next_real_insn (rtx insn)
3150 {
3151   while (insn)
3152     {
3153       insn = NEXT_INSN (insn);
3154       if (insn == 0 || INSN_P (insn))
3155         break;
3156     }
3157
3158   return insn;
3159 }
3160
3161 /* Return the last INSN, CALL_INSN or JUMP_INSN before INSN;
3162    or 0, if there is none.  This routine does not look inside
3163    SEQUENCEs.  */
3164
3165 rtx
3166 prev_real_insn (rtx insn)
3167 {
3168   while (insn)
3169     {
3170       insn = PREV_INSN (insn);
3171       if (insn == 0 || INSN_P (insn))
3172         break;
3173     }
3174
3175   return insn;
3176 }
3177
3178 /* Return the last CALL_INSN in the current list, or 0 if there is none.
3179    This routine does not look inside SEQUENCEs.  */
3180
3181 rtx
3182 last_call_insn (void)
3183 {
3184   rtx insn;
3185
3186   for (insn = get_last_insn ();
3187        insn && !CALL_P (insn);
3188        insn = PREV_INSN (insn))
3189     ;
3190
3191   return insn;
3192 }
3193
3194 /* Find the next insn after INSN that really does something.  This routine
3195    does not look inside SEQUENCEs.  After reload this also skips over
3196    standalone USE and CLOBBER insn.  */
3197
3198 int
3199 active_insn_p (const_rtx insn)
3200 {
3201   return (CALL_P (insn) || JUMP_P (insn)
3202           || (NONJUMP_INSN_P (insn)
3203               && (! reload_completed
3204                   || (GET_CODE (PATTERN (insn)) != USE
3205                       && GET_CODE (PATTERN (insn)) != CLOBBER))));
3206 }
3207
3208 rtx
3209 next_active_insn (rtx insn)
3210 {
3211   while (insn)
3212     {
3213       insn = NEXT_INSN (insn);
3214       if (insn == 0 || active_insn_p (insn))
3215         break;
3216     }
3217
3218   return insn;
3219 }
3220
3221 /* Find the last insn before INSN that really does something.  This routine
3222    does not look inside SEQUENCEs.  After reload this also skips over
3223    standalone USE and CLOBBER insn.  */
3224
3225 rtx
3226 prev_active_insn (rtx insn)
3227 {
3228   while (insn)
3229     {
3230       insn = PREV_INSN (insn);
3231       if (insn == 0 || active_insn_p (insn))
3232         break;
3233     }
3234
3235   return insn;
3236 }
3237
3238 /* Return the next CODE_LABEL after the insn INSN, or 0 if there is none.  */
3239
3240 rtx
3241 next_label (rtx insn)
3242 {
3243   while (insn)
3244     {
3245       insn = NEXT_INSN (insn);
3246       if (insn == 0 || LABEL_P (insn))
3247         break;
3248     }
3249
3250   return insn;
3251 }
3252
3253 /* Return the last CODE_LABEL before the insn INSN, or 0 if there is none.  */
3254
3255 rtx
3256 prev_label (rtx insn)
3257 {
3258   while (insn)
3259     {
3260       insn = PREV_INSN (insn);
3261       if (insn == 0 || LABEL_P (insn))
3262         break;
3263     }
3264
3265   return insn;
3266 }
3267
3268 /* Return the last label to mark the same position as LABEL.  Return null
3269    if LABEL itself is null.  */
3270
3271 rtx
3272 skip_consecutive_labels (rtx label)
3273 {
3274   rtx insn;
3275
3276   for (insn = label; insn != 0 && !INSN_P (insn); insn = NEXT_INSN (insn))
3277     if (LABEL_P (insn))
3278       label = insn;
3279
3280   return label;
3281 }
3282 \f
3283 #ifdef HAVE_cc0
3284 /* INSN uses CC0 and is being moved into a delay slot.  Set up REG_CC_SETTER
3285    and REG_CC_USER notes so we can find it.  */
3286
3287 void
3288 link_cc0_insns (rtx insn)
3289 {
3290   rtx user = next_nonnote_insn (insn);
3291
3292   if (NONJUMP_INSN_P (user) && GET_CODE (PATTERN (user)) == SEQUENCE)
3293     user = XVECEXP (PATTERN (user), 0, 0);
3294
3295   add_reg_note (user, REG_CC_SETTER, insn);
3296   add_reg_note (insn, REG_CC_USER, user);
3297 }
3298
3299 /* Return the next insn that uses CC0 after INSN, which is assumed to
3300    set it.  This is the inverse of prev_cc0_setter (i.e., prev_cc0_setter
3301    applied to the result of this function should yield INSN).
3302
3303    Normally, this is simply the next insn.  However, if a REG_CC_USER note
3304    is present, it contains the insn that uses CC0.
3305
3306    Return 0 if we can't find the insn.  */
3307
3308 rtx
3309 next_cc0_user (rtx insn)
3310 {
3311   rtx note = find_reg_note (insn, REG_CC_USER, NULL_RTX);
3312
3313   if (note)
3314     return XEXP (note, 0);
3315
3316   insn = next_nonnote_insn (insn);
3317   if (insn && NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
3318     insn = XVECEXP (PATTERN (insn), 0, 0);
3319
3320   if (insn && INSN_P (insn) && reg_mentioned_p (cc0_rtx, PATTERN (insn)))
3321     return insn;
3322
3323   return 0;
3324 }
3325
3326 /* Find the insn that set CC0 for INSN.  Unless INSN has a REG_CC_SETTER
3327    note, it is the previous insn.  */
3328
3329 rtx
3330 prev_cc0_setter (rtx insn)
3331 {
3332   rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
3333
3334   if (note)
3335     return XEXP (note, 0);
3336
3337   insn = prev_nonnote_insn (insn);
3338   gcc_assert (sets_cc0_p (PATTERN (insn)));
3339
3340   return insn;
3341 }
3342 #endif
3343
3344 #ifdef AUTO_INC_DEC
3345 /* Find a RTX_AUTOINC class rtx which matches DATA.  */
3346
3347 static int
3348 find_auto_inc (rtx *xp, void *data)
3349 {
3350   rtx x = *xp;
3351   rtx reg = (rtx) data;
3352
3353   if (GET_RTX_CLASS (GET_CODE (x)) != RTX_AUTOINC)
3354     return 0;
3355
3356   switch (GET_CODE (x))
3357     {
3358       case PRE_DEC:
3359       case PRE_INC:
3360       case POST_DEC:
3361       case POST_INC:
3362       case PRE_MODIFY:
3363       case POST_MODIFY:
3364         if (rtx_equal_p (reg, XEXP (x, 0)))
3365           return 1;
3366         break;
3367
3368       default:
3369         gcc_unreachable ();
3370     }
3371   return -1;
3372 }
3373 #endif
3374
3375 /* Increment the label uses for all labels present in rtx.  */
3376
3377 static void
3378 mark_label_nuses (rtx x)
3379 {
3380   enum rtx_code code;
3381   int i, j;
3382   const char *fmt;
3383
3384   code = GET_CODE (x);
3385   if (code == LABEL_REF && LABEL_P (XEXP (x, 0)))
3386     LABEL_NUSES (XEXP (x, 0))++;
3387
3388   fmt = GET_RTX_FORMAT (code);
3389   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3390     {
3391       if (fmt[i] == 'e')
3392         mark_label_nuses (XEXP (x, i));
3393       else if (fmt[i] == 'E')
3394         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3395           mark_label_nuses (XVECEXP (x, i, j));
3396     }
3397 }
3398
3399 \f
3400 /* Try splitting insns that can be split for better scheduling.
3401    PAT is the pattern which might split.
3402    TRIAL is the insn providing PAT.
3403    LAST is nonzero if we should return the last insn of the sequence produced.
3404
3405    If this routine succeeds in splitting, it returns the first or last
3406    replacement insn depending on the value of LAST.  Otherwise, it
3407    returns TRIAL.  If the insn to be returned can be split, it will be.  */
3408
3409 rtx
3410 try_split (rtx pat, rtx trial, int last)
3411 {
3412   rtx before = PREV_INSN (trial);
3413   rtx after = NEXT_INSN (trial);
3414   int has_barrier = 0;
3415   rtx note, seq, tem;
3416   int probability;
3417   rtx insn_last, insn;
3418   int njumps = 0;
3419
3420   /* We're not good at redistributing frame information.  */
3421   if (RTX_FRAME_RELATED_P (trial))
3422     return trial;
3423
3424   if (any_condjump_p (trial)
3425       && (note = find_reg_note (trial, REG_BR_PROB, 0)))
3426     split_branch_probability = INTVAL (XEXP (note, 0));
3427   probability = split_branch_probability;
3428
3429   seq = split_insns (pat, trial);
3430
3431   split_branch_probability = -1;
3432
3433   /* If we are splitting a JUMP_INSN, it might be followed by a BARRIER.
3434      We may need to handle this specially.  */
3435   if (after && BARRIER_P (after))
3436     {
3437       has_barrier = 1;
3438       after = NEXT_INSN (after);
3439     }
3440
3441   if (!seq)
3442     return trial;
3443
3444   /* Avoid infinite loop if any insn of the result matches
3445      the original pattern.  */
3446   insn_last = seq;
3447   while (1)
3448     {
3449       if (INSN_P (insn_last)
3450           && rtx_equal_p (PATTERN (insn_last), pat))
3451         return trial;
3452       if (!NEXT_INSN (insn_last))
3453         break;
3454       insn_last = NEXT_INSN (insn_last);
3455     }
3456
3457   /* We will be adding the new sequence to the function.  The splitters
3458      may have introduced invalid RTL sharing, so unshare the sequence now.  */
3459   unshare_all_rtl_in_chain (seq);
3460
3461   /* Mark labels.  */
3462   for (insn = insn_last; insn ; insn = PREV_INSN (insn))
3463     {
3464       if (JUMP_P (insn))
3465         {
3466           mark_jump_label (PATTERN (insn), insn, 0);
3467           njumps++;
3468           if (probability != -1
3469               && any_condjump_p (insn)
3470               && !find_reg_note (insn, REG_BR_PROB, 0))
3471             {
3472               /* We can preserve the REG_BR_PROB notes only if exactly
3473                  one jump is created, otherwise the machine description
3474                  is responsible for this step using
3475                  split_branch_probability variable.  */
3476               gcc_assert (njumps == 1);
3477               add_reg_note (insn, REG_BR_PROB, GEN_INT (probability));
3478             }
3479         }
3480     }
3481
3482   /* If we are splitting a CALL_INSN, look for the CALL_INSN
3483      in SEQ and copy any additional information across.  */
3484   if (CALL_P (trial))
3485     {
3486       for (insn = insn_last; insn ; insn = PREV_INSN (insn))
3487         if (CALL_P (insn))
3488           {
3489             rtx next, *p;
3490
3491             /* Add the old CALL_INSN_FUNCTION_USAGE to whatever the
3492                target may have explicitly specified.  */
3493             p = &CALL_INSN_FUNCTION_USAGE (insn);
3494             while (*p)
3495               p = &XEXP (*p, 1);
3496             *p = CALL_INSN_FUNCTION_USAGE (trial);
3497
3498             /* If the old call was a sibling call, the new one must
3499                be too.  */
3500             SIBLING_CALL_P (insn) = SIBLING_CALL_P (trial);
3501
3502             /* If the new call is the last instruction in the sequence,
3503                it will effectively replace the old call in-situ.  Otherwise
3504                we must move any following NOTE_INSN_CALL_ARG_LOCATION note
3505                so that it comes immediately after the new call.  */
3506             if (NEXT_INSN (insn))
3507               for (next = NEXT_INSN (trial);
3508                    next && NOTE_P (next);
3509                    next = NEXT_INSN (next))
3510                 if (NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
3511                   {
3512                     remove_insn (next);
3513                     add_insn_after (next, insn, NULL);
3514                     break;
3515                   }
3516           }
3517     }
3518
3519   /* Copy notes, particularly those related to the CFG.  */
3520   for (note = REG_NOTES (trial); note; note = XEXP (note, 1))
3521     {
3522       switch (REG_NOTE_KIND (note))
3523         {
3524         case REG_EH_REGION:
3525           copy_reg_eh_region_note_backward (note, insn_last, NULL);
3526           break;
3527
3528         case REG_NORETURN:
3529         case REG_SETJMP:
3530           for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
3531             {
3532               if (CALL_P (insn))
3533                 add_reg_note (insn, REG_NOTE_KIND (note), XEXP (note, 0));
3534             }
3535           break;
3536
3537         case REG_NON_LOCAL_GOTO:
3538           for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
3539             {
3540               if (JUMP_P (insn))
3541                 add_reg_note (insn, REG_NOTE_KIND (note), XEXP (note, 0));
3542             }
3543           break;
3544
3545 #ifdef AUTO_INC_DEC
3546         case REG_INC:
3547           for (insn = insn_last; insn != NULL_RTX; insn = PREV_INSN (insn))
3548             {
3549               rtx reg = XEXP (note, 0);
3550               if (!FIND_REG_INC_NOTE (insn, reg)
3551                   && for_each_rtx (&PATTERN (insn), find_auto_inc, reg) > 0)
3552                 add_reg_note (insn, REG_INC, reg);
3553             }
3554           break;
3555 #endif
3556
3557         default:
3558           break;
3559         }
3560     }
3561
3562   /* If there are LABELS inside the split insns increment the
3563      usage count so we don't delete the label.  */
3564   if (INSN_P (trial))
3565     {
3566       insn = insn_last;
3567       while (insn != NULL_RTX)
3568         {
3569           /* JUMP_P insns have already been "marked" above.  */
3570           if (NONJUMP_INSN_P (insn))
3571             mark_label_nuses (PATTERN (insn));
3572
3573           insn = PREV_INSN (insn);
3574         }
3575     }
3576
3577   tem = emit_insn_after_setloc (seq, trial, INSN_LOCATOR (trial));
3578
3579   delete_insn (trial);
3580   if (has_barrier)
3581     emit_barrier_after (tem);
3582
3583   /* Recursively call try_split for each new insn created; by the
3584      time control returns here that insn will be fully split, so
3585      set LAST and continue from the insn after the one returned.
3586      We can't use next_active_insn here since AFTER may be a note.
3587      Ignore deleted insns, which can be occur if not optimizing.  */
3588   for (tem = NEXT_INSN (before); tem != after; tem = NEXT_INSN (tem))
3589     if (! INSN_DELETED_P (tem) && INSN_P (tem))
3590       tem = try_split (PATTERN (tem), tem, 1);
3591
3592   /* Return either the first or the last insn, depending on which was
3593      requested.  */
3594   return last
3595     ? (after ? PREV_INSN (after) : get_last_insn ())
3596     : NEXT_INSN (before);
3597 }
3598 \f
3599 /* Make and return an INSN rtx, initializing all its slots.
3600    Store PATTERN in the pattern slots.  */
3601
3602 rtx
3603 make_insn_raw (rtx pattern)
3604 {
3605   rtx insn;
3606
3607   insn = rtx_alloc (INSN);
3608
3609   INSN_UID (insn) = cur_insn_uid++;
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 #ifdef ENABLE_RTL_CHECKING
3617   if (insn
3618       && INSN_P (insn)
3619       && (returnjump_p (insn)
3620           || (GET_CODE (insn) == SET
3621               && SET_DEST (insn) == pc_rtx)))
3622     {
3623       warning (0, "ICE: emit_insn used where emit_jump_insn needed:\n");
3624       debug_rtx (insn);
3625     }
3626 #endif
3627
3628   return insn;
3629 }
3630
3631 /* Like `make_insn_raw' but make a DEBUG_INSN instead of an insn.  */
3632
3633 rtx
3634 make_debug_insn_raw (rtx pattern)
3635 {
3636   rtx insn;
3637
3638   insn = rtx_alloc (DEBUG_INSN);
3639   INSN_UID (insn) = cur_debug_insn_uid++;
3640   if (cur_debug_insn_uid > MIN_NONDEBUG_INSN_UID)
3641     INSN_UID (insn) = cur_insn_uid++;
3642
3643   PATTERN (insn) = pattern;
3644   INSN_CODE (insn) = -1;
3645   REG_NOTES (insn) = NULL;
3646   INSN_LOCATOR (insn) = curr_insn_locator ();
3647   BLOCK_FOR_INSN (insn) = NULL;
3648
3649   return insn;
3650 }
3651
3652 /* Like `make_insn_raw' but make a JUMP_INSN instead of an insn.  */
3653
3654 rtx
3655 make_jump_insn_raw (rtx pattern)
3656 {
3657   rtx insn;
3658
3659   insn = rtx_alloc (JUMP_INSN);
3660   INSN_UID (insn) = cur_insn_uid++;
3661
3662   PATTERN (insn) = pattern;
3663   INSN_CODE (insn) = -1;
3664   REG_NOTES (insn) = NULL;
3665   JUMP_LABEL (insn) = NULL;
3666   INSN_LOCATOR (insn) = curr_insn_locator ();
3667   BLOCK_FOR_INSN (insn) = NULL;
3668
3669   return insn;
3670 }
3671
3672 /* Like `make_insn_raw' but make a CALL_INSN instead of an insn.  */
3673
3674 static rtx
3675 make_call_insn_raw (rtx pattern)
3676 {
3677   rtx insn;
3678
3679   insn = rtx_alloc (CALL_INSN);
3680   INSN_UID (insn) = cur_insn_uid++;
3681
3682   PATTERN (insn) = pattern;
3683   INSN_CODE (insn) = -1;
3684   REG_NOTES (insn) = NULL;
3685   CALL_INSN_FUNCTION_USAGE (insn) = NULL;
3686   INSN_LOCATOR (insn) = curr_insn_locator ();
3687   BLOCK_FOR_INSN (insn) = NULL;
3688
3689   return insn;
3690 }
3691 \f
3692 /* Add INSN to the end of the doubly-linked list.
3693    INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE.  */
3694
3695 void
3696 add_insn (rtx insn)
3697 {
3698   PREV_INSN (insn) = get_last_insn();
3699   NEXT_INSN (insn) = 0;
3700
3701   if (NULL != get_last_insn())
3702     NEXT_INSN (get_last_insn ()) = insn;
3703
3704   if (NULL == get_insns ())
3705     set_first_insn (insn);
3706
3707   set_last_insn (insn);
3708 }
3709
3710 /* Add INSN into the doubly-linked list after insn AFTER.  This and
3711    the next should be the only functions called to insert an insn once
3712    delay slots have been filled since only they know how to update a
3713    SEQUENCE.  */
3714
3715 void
3716 add_insn_after (rtx insn, rtx after, basic_block bb)
3717 {
3718   rtx next = NEXT_INSN (after);
3719
3720   gcc_assert (!optimize || !INSN_DELETED_P (after));
3721
3722   NEXT_INSN (insn) = next;
3723   PREV_INSN (insn) = after;
3724
3725   if (next)
3726     {
3727       PREV_INSN (next) = insn;
3728       if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
3729         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = insn;
3730     }
3731   else if (get_last_insn () == after)
3732     set_last_insn (insn);
3733   else
3734     {
3735       struct sequence_stack *stack = seq_stack;
3736       /* Scan all pending sequences too.  */
3737       for (; stack; stack = stack->next)
3738         if (after == stack->last)
3739           {
3740             stack->last = insn;
3741             break;
3742           }
3743
3744       gcc_assert (stack);
3745     }
3746
3747   if (!BARRIER_P (after)
3748       && !BARRIER_P (insn)
3749       && (bb = BLOCK_FOR_INSN (after)))
3750     {
3751       set_block_for_insn (insn, bb);
3752       if (INSN_P (insn))
3753         df_insn_rescan (insn);
3754       /* Should not happen as first in the BB is always
3755          either NOTE or LABEL.  */
3756       if (BB_END (bb) == after
3757           /* Avoid clobbering of structure when creating new BB.  */
3758           && !BARRIER_P (insn)
3759           && !NOTE_INSN_BASIC_BLOCK_P (insn))
3760         BB_END (bb) = insn;
3761     }
3762
3763   NEXT_INSN (after) = insn;
3764   if (NONJUMP_INSN_P (after) && GET_CODE (PATTERN (after)) == SEQUENCE)
3765     {
3766       rtx sequence = PATTERN (after);
3767       NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3768     }
3769 }
3770
3771 /* Add INSN into the doubly-linked list before insn BEFORE.  This and
3772    the previous should be the only functions called to insert an insn
3773    once delay slots have been filled since only they know how to
3774    update a SEQUENCE.  If BB is NULL, an attempt is made to infer the
3775    bb from before.  */
3776
3777 void
3778 add_insn_before (rtx insn, rtx before, basic_block bb)
3779 {
3780   rtx prev = PREV_INSN (before);
3781
3782   gcc_assert (!optimize || !INSN_DELETED_P (before));
3783
3784   PREV_INSN (insn) = prev;
3785   NEXT_INSN (insn) = before;
3786
3787   if (prev)
3788     {
3789       NEXT_INSN (prev) = insn;
3790       if (NONJUMP_INSN_P (prev) && GET_CODE (PATTERN (prev)) == SEQUENCE)
3791         {
3792           rtx sequence = PATTERN (prev);
3793           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = insn;
3794         }
3795     }
3796   else if (get_insns () == before)
3797     set_first_insn (insn);
3798   else
3799     {
3800       struct sequence_stack *stack = seq_stack;
3801       /* Scan all pending sequences too.  */
3802       for (; stack; stack = stack->next)
3803         if (before == stack->first)
3804           {
3805             stack->first = insn;
3806             break;
3807           }
3808
3809       gcc_assert (stack);
3810     }
3811
3812   if (!bb
3813       && !BARRIER_P (before)
3814       && !BARRIER_P (insn))
3815     bb = BLOCK_FOR_INSN (before);
3816
3817   if (bb)
3818     {
3819       set_block_for_insn (insn, bb);
3820       if (INSN_P (insn))
3821         df_insn_rescan (insn);
3822       /* Should not happen as first in the BB is always either NOTE or
3823          LABEL.  */
3824       gcc_assert (BB_HEAD (bb) != insn
3825                   /* Avoid clobbering of structure when creating new BB.  */
3826                   || BARRIER_P (insn)
3827                   || NOTE_INSN_BASIC_BLOCK_P (insn));
3828     }
3829
3830   PREV_INSN (before) = insn;
3831   if (NONJUMP_INSN_P (before) && GET_CODE (PATTERN (before)) == SEQUENCE)
3832     PREV_INSN (XVECEXP (PATTERN (before), 0, 0)) = insn;
3833 }
3834
3835
3836 /* Replace insn with an deleted instruction note.  */
3837
3838 void
3839 set_insn_deleted (rtx insn)
3840 {
3841   df_insn_delete (BLOCK_FOR_INSN (insn), INSN_UID (insn));
3842   PUT_CODE (insn, NOTE);
3843   NOTE_KIND (insn) = NOTE_INSN_DELETED;
3844 }
3845
3846
3847 /* Remove an insn from its doubly-linked list.  This function knows how
3848    to handle sequences.  */
3849 void
3850 remove_insn (rtx insn)
3851 {
3852   rtx next = NEXT_INSN (insn);
3853   rtx prev = PREV_INSN (insn);
3854   basic_block bb;
3855
3856   /* Later in the code, the block will be marked dirty.  */
3857   df_insn_delete (NULL, INSN_UID (insn));
3858
3859   if (prev)
3860     {
3861       NEXT_INSN (prev) = next;
3862       if (NONJUMP_INSN_P (prev) && GET_CODE (PATTERN (prev)) == SEQUENCE)
3863         {
3864           rtx sequence = PATTERN (prev);
3865           NEXT_INSN (XVECEXP (sequence, 0, XVECLEN (sequence, 0) - 1)) = next;
3866         }
3867     }
3868   else if (get_insns () == insn)
3869     {
3870       if (next)
3871         PREV_INSN (next) = NULL;
3872       set_first_insn (next);
3873     }
3874   else
3875     {
3876       struct sequence_stack *stack = seq_stack;
3877       /* Scan all pending sequences too.  */
3878       for (; stack; stack = stack->next)
3879         if (insn == stack->first)
3880           {
3881             stack->first = next;
3882             break;
3883           }
3884
3885       gcc_assert (stack);
3886     }
3887
3888   if (next)
3889     {
3890       PREV_INSN (next) = prev;
3891       if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
3892         PREV_INSN (XVECEXP (PATTERN (next), 0, 0)) = prev;
3893     }
3894   else if (get_last_insn () == insn)
3895     set_last_insn (prev);
3896   else
3897     {
3898       struct sequence_stack *stack = seq_stack;
3899       /* Scan all pending sequences too.  */
3900       for (; stack; stack = stack->next)
3901         if (insn == stack->last)
3902           {
3903             stack->last = prev;
3904             break;
3905           }
3906
3907       gcc_assert (stack);
3908     }
3909   if (!BARRIER_P (insn)
3910       && (bb = BLOCK_FOR_INSN (insn)))
3911     {
3912       if (NONDEBUG_INSN_P (insn))
3913         df_set_bb_dirty (bb);
3914       if (BB_HEAD (bb) == insn)
3915         {
3916           /* Never ever delete the basic block note without deleting whole
3917              basic block.  */
3918           gcc_assert (!NOTE_P (insn));
3919           BB_HEAD (bb) = next;
3920         }
3921       if (BB_END (bb) == insn)
3922         BB_END (bb) = prev;
3923     }
3924 }
3925
3926 /* Append CALL_FUSAGE to the CALL_INSN_FUNCTION_USAGE for CALL_INSN.  */
3927
3928 void
3929 add_function_usage_to (rtx call_insn, rtx call_fusage)
3930 {
3931   gcc_assert (call_insn && CALL_P (call_insn));
3932
3933   /* Put the register usage information on the CALL.  If there is already
3934      some usage information, put ours at the end.  */
3935   if (CALL_INSN_FUNCTION_USAGE (call_insn))
3936     {
3937       rtx link;
3938
3939       for (link = CALL_INSN_FUNCTION_USAGE (call_insn); XEXP (link, 1) != 0;
3940            link = XEXP (link, 1))
3941         ;
3942
3943       XEXP (link, 1) = call_fusage;
3944     }
3945   else
3946     CALL_INSN_FUNCTION_USAGE (call_insn) = call_fusage;
3947 }
3948
3949 /* Delete all insns made since FROM.
3950    FROM becomes the new last instruction.  */
3951
3952 void
3953 delete_insns_since (rtx from)
3954 {
3955   if (from == 0)
3956     set_first_insn (0);
3957   else
3958     NEXT_INSN (from) = 0;
3959   set_last_insn (from);
3960 }
3961
3962 /* This function is deprecated, please use sequences instead.
3963
3964    Move a consecutive bunch of insns to a different place in the chain.
3965    The insns to be moved are those between FROM and TO.
3966    They are moved to a new position after the insn AFTER.
3967    AFTER must not be FROM or TO or any insn in between.
3968
3969    This function does not know about SEQUENCEs and hence should not be
3970    called after delay-slot filling has been done.  */
3971
3972 void
3973 reorder_insns_nobb (rtx from, rtx to, rtx after)
3974 {
3975 #ifdef ENABLE_CHECKING
3976   rtx x;
3977   for (x = from; x != to; x = NEXT_INSN (x))
3978     gcc_assert (after != x);
3979   gcc_assert (after != to);
3980 #endif
3981
3982   /* Splice this bunch out of where it is now.  */
3983   if (PREV_INSN (from))
3984     NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to);
3985   if (NEXT_INSN (to))
3986     PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from);
3987   if (get_last_insn () == to)
3988     set_last_insn (PREV_INSN (from));
3989   if (get_insns () == from)
3990     set_first_insn (NEXT_INSN (to));
3991
3992   /* Make the new neighbors point to it and it to them.  */
3993   if (NEXT_INSN (after))
3994     PREV_INSN (NEXT_INSN (after)) = to;
3995
3996   NEXT_INSN (to) = NEXT_INSN (after);
3997   PREV_INSN (from) = after;
3998   NEXT_INSN (after) = from;
3999   if (after == get_last_insn())
4000     set_last_insn (to);
4001 }
4002
4003 /* Same as function above, but take care to update BB boundaries.  */
4004 void
4005 reorder_insns (rtx from, rtx to, rtx after)
4006 {
4007   rtx prev = PREV_INSN (from);
4008   basic_block bb, bb2;
4009
4010   reorder_insns_nobb (from, to, after);
4011
4012   if (!BARRIER_P (after)
4013       && (bb = BLOCK_FOR_INSN (after)))
4014     {
4015       rtx x;
4016       df_set_bb_dirty (bb);
4017
4018       if (!BARRIER_P (from)
4019           && (bb2 = BLOCK_FOR_INSN (from)))
4020         {
4021           if (BB_END (bb2) == to)
4022             BB_END (bb2) = prev;
4023           df_set_bb_dirty (bb2);
4024         }
4025
4026       if (BB_END (bb) == after)
4027         BB_END (bb) = to;
4028
4029       for (x = from; x != NEXT_INSN (to); x = NEXT_INSN (x))
4030         if (!BARRIER_P (x))
4031           df_insn_change_bb (x, bb);
4032     }
4033 }
4034
4035 \f
4036 /* Emit insn(s) of given code and pattern
4037    at a specified place within the doubly-linked list.
4038
4039    All of the emit_foo global entry points accept an object
4040    X which is either an insn list or a PATTERN of a single
4041    instruction.
4042
4043    There are thus a few canonical ways to generate code and
4044    emit it at a specific place in the instruction stream.  For
4045    example, consider the instruction named SPOT and the fact that
4046    we would like to emit some instructions before SPOT.  We might
4047    do it like this:
4048
4049         start_sequence ();
4050         ... emit the new instructions ...
4051         insns_head = get_insns ();
4052         end_sequence ();
4053
4054         emit_insn_before (insns_head, SPOT);
4055
4056    It used to be common to generate SEQUENCE rtl instead, but that
4057    is a relic of the past which no longer occurs.  The reason is that
4058    SEQUENCE rtl results in much fragmented RTL memory since the SEQUENCE
4059    generated would almost certainly die right after it was created.  */
4060
4061 static rtx
4062 emit_pattern_before_noloc (rtx x, rtx before, rtx last, basic_block bb,
4063                            rtx (*make_raw) (rtx))
4064 {
4065   rtx insn;
4066
4067   gcc_assert (before);
4068
4069   if (x == NULL_RTX)
4070     return last;
4071
4072   switch (GET_CODE (x))
4073     {
4074     case DEBUG_INSN:
4075     case INSN:
4076     case JUMP_INSN:
4077     case CALL_INSN:
4078     case CODE_LABEL:
4079     case BARRIER:
4080     case NOTE:
4081       insn = x;
4082       while (insn)
4083         {
4084           rtx next = NEXT_INSN (insn);
4085           add_insn_before (insn, before, bb);
4086           last = insn;
4087           insn = next;
4088         }
4089       break;
4090
4091 #ifdef ENABLE_RTL_CHECKING
4092     case SEQUENCE:
4093       gcc_unreachable ();
4094       break;
4095 #endif
4096
4097     default:
4098       last = (*make_raw) (x);
4099       add_insn_before (last, before, bb);
4100       break;
4101     }
4102
4103   return last;
4104 }
4105
4106 /* Make X be output before the instruction BEFORE.  */
4107
4108 rtx
4109 emit_insn_before_noloc (rtx x, rtx before, basic_block bb)
4110 {
4111   return emit_pattern_before_noloc (x, before, before, bb, make_insn_raw);
4112 }
4113
4114 /* Make an instruction with body X and code JUMP_INSN
4115    and output it before the instruction BEFORE.  */
4116
4117 rtx
4118 emit_jump_insn_before_noloc (rtx x, rtx before)
4119 {
4120   return emit_pattern_before_noloc (x, before, NULL_RTX, NULL,
4121                                     make_jump_insn_raw);
4122 }
4123
4124 /* Make an instruction with body X and code CALL_INSN
4125    and output it before the instruction BEFORE.  */
4126
4127 rtx
4128 emit_call_insn_before_noloc (rtx x, rtx before)
4129 {
4130   return emit_pattern_before_noloc (x, before, NULL_RTX, NULL,
4131                                     make_call_insn_raw);
4132 }
4133
4134 /* Make an instruction with body X and code DEBUG_INSN
4135    and output it before the instruction BEFORE.  */
4136
4137 rtx
4138 emit_debug_insn_before_noloc (rtx x, rtx before)
4139 {
4140   return emit_pattern_before_noloc (x, before, NULL_RTX, NULL,
4141                                     make_debug_insn_raw);
4142 }
4143
4144 /* Make an insn of code BARRIER
4145    and output it before the insn BEFORE.  */
4146
4147 rtx
4148 emit_barrier_before (rtx before)
4149 {
4150   rtx insn = rtx_alloc (BARRIER);
4151
4152   INSN_UID (insn) = cur_insn_uid++;
4153
4154   add_insn_before (insn, before, NULL);
4155   return insn;
4156 }
4157
4158 /* Emit the label LABEL before the insn BEFORE.  */
4159
4160 rtx
4161 emit_label_before (rtx label, rtx before)
4162 {
4163   /* This can be called twice for the same label as a result of the
4164      confusion that follows a syntax error!  So make it harmless.  */
4165   if (INSN_UID (label) == 0)
4166     {
4167       INSN_UID (label) = cur_insn_uid++;
4168       add_insn_before (label, before, NULL);
4169     }
4170
4171   return label;
4172 }
4173
4174 /* Emit a note of subtype SUBTYPE before the insn BEFORE.  */
4175
4176 rtx
4177 emit_note_before (enum insn_note subtype, rtx before)
4178 {
4179   rtx note = rtx_alloc (NOTE);
4180   INSN_UID (note) = cur_insn_uid++;
4181   NOTE_KIND (note) = subtype;
4182   BLOCK_FOR_INSN (note) = NULL;
4183   memset (&NOTE_DATA (note), 0, sizeof (NOTE_DATA (note)));
4184
4185   add_insn_before (note, before, NULL);
4186   return note;
4187 }
4188 \f
4189 /* Helper for emit_insn_after, handles lists of instructions
4190    efficiently.  */
4191
4192 static rtx
4193 emit_insn_after_1 (rtx first, rtx after, basic_block bb)
4194 {
4195   rtx last;
4196   rtx after_after;
4197   if (!bb && !BARRIER_P (after))
4198     bb = BLOCK_FOR_INSN (after);
4199
4200   if (bb)
4201     {
4202       df_set_bb_dirty (bb);
4203       for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
4204         if (!BARRIER_P (last))
4205           {
4206             set_block_for_insn (last, bb);
4207             df_insn_rescan (last);
4208           }
4209       if (!BARRIER_P (last))
4210         {
4211           set_block_for_insn (last, bb);
4212           df_insn_rescan (last);
4213         }
4214       if (BB_END (bb) == after)
4215         BB_END (bb) = last;
4216     }
4217   else
4218     for (last = first; NEXT_INSN (last); last = NEXT_INSN (last))
4219       continue;
4220
4221   after_after = NEXT_INSN (after);
4222
4223   NEXT_INSN (after) = first;
4224   PREV_INSN (first) = after;
4225   NEXT_INSN (last) = after_after;
4226   if (after_after)
4227     PREV_INSN (after_after) = last;
4228
4229   if (after == get_last_insn())
4230     set_last_insn (last);
4231
4232   return last;
4233 }
4234
4235 static rtx
4236 emit_pattern_after_noloc (rtx x, rtx after, basic_block bb,
4237                           rtx (*make_raw)(rtx))
4238 {
4239   rtx last = after;
4240
4241   gcc_assert (after);
4242
4243   if (x == NULL_RTX)
4244     return last;
4245
4246   switch (GET_CODE (x))
4247     {
4248     case DEBUG_INSN:
4249     case INSN:
4250     case JUMP_INSN:
4251     case CALL_INSN:
4252     case CODE_LABEL:
4253     case BARRIER:
4254     case NOTE:
4255       last = emit_insn_after_1 (x, after, bb);
4256       break;
4257
4258 #ifdef ENABLE_RTL_CHECKING
4259     case SEQUENCE:
4260       gcc_unreachable ();
4261       break;
4262 #endif
4263
4264     default:
4265       last = (*make_raw) (x);
4266       add_insn_after (last, after, bb);
4267       break;
4268     }
4269
4270   return last;
4271 }
4272
4273 /* Make X be output after the insn AFTER and set the BB of insn.  If
4274    BB is NULL, an attempt is made to infer the BB from AFTER.  */
4275
4276 rtx
4277 emit_insn_after_noloc (rtx x, rtx after, basic_block bb)
4278 {
4279   return emit_pattern_after_noloc (x, after, bb, make_insn_raw);
4280 }
4281
4282
4283 /* Make an insn of code JUMP_INSN with body X
4284    and output it after the insn AFTER.  */
4285
4286 rtx
4287 emit_jump_insn_after_noloc (rtx x, rtx after)
4288 {
4289   return emit_pattern_after_noloc (x, after, NULL, make_jump_insn_raw);
4290 }
4291
4292 /* Make an instruction with body X and code CALL_INSN
4293    and output it after the instruction AFTER.  */
4294
4295 rtx
4296 emit_call_insn_after_noloc (rtx x, rtx after)
4297 {
4298   return emit_pattern_after_noloc (x, after, NULL, make_call_insn_raw);
4299 }
4300
4301 /* Make an instruction with body X and code CALL_INSN
4302    and output it after the instruction AFTER.  */
4303
4304 rtx
4305 emit_debug_insn_after_noloc (rtx x, rtx after)
4306 {
4307   return emit_pattern_after_noloc (x, after, NULL, make_debug_insn_raw);
4308 }
4309
4310 /* Make an insn of code BARRIER
4311    and output it after the insn AFTER.  */
4312
4313 rtx
4314 emit_barrier_after (rtx after)
4315 {
4316   rtx insn = rtx_alloc (BARRIER);
4317
4318   INSN_UID (insn) = cur_insn_uid++;
4319
4320   add_insn_after (insn, after, NULL);
4321   return insn;
4322 }
4323
4324 /* Emit the label LABEL after the insn AFTER.  */
4325
4326 rtx
4327 emit_label_after (rtx label, rtx after)
4328 {
4329   /* This can be called twice for the same label
4330      as a result of the confusion that follows a syntax error!
4331      So make it harmless.  */
4332   if (INSN_UID (label) == 0)
4333     {
4334       INSN_UID (label) = cur_insn_uid++;
4335       add_insn_after (label, after, NULL);
4336     }
4337
4338   return label;
4339 }
4340
4341 /* Emit a note of subtype SUBTYPE after the insn AFTER.  */
4342
4343 rtx
4344 emit_note_after (enum insn_note subtype, rtx after)
4345 {
4346   rtx note = rtx_alloc (NOTE);
4347   INSN_UID (note) = cur_insn_uid++;
4348   NOTE_KIND (note) = subtype;
4349   BLOCK_FOR_INSN (note) = NULL;
4350   memset (&NOTE_DATA (note), 0, sizeof (NOTE_DATA (note)));
4351   add_insn_after (note, after, NULL);
4352   return note;
4353 }
4354 \f
4355 /* Insert PATTERN after AFTER, setting its INSN_LOCATION to LOC.
4356    MAKE_RAW indicates how to turn PATTERN into a real insn.  */
4357
4358 static rtx
4359 emit_pattern_after_setloc (rtx pattern, rtx after, int loc,
4360                            rtx (*make_raw) (rtx))
4361 {
4362   rtx last = emit_pattern_after_noloc (pattern, after, NULL, make_raw);
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 /* Insert PATTERN after AFTER.  MAKE_RAW indicates how to turn PATTERN
4380    into a real insn.  SKIP_DEBUG_INSNS indicates whether to insert after
4381    any DEBUG_INSNs.  */
4382
4383 static rtx
4384 emit_pattern_after (rtx pattern, rtx after, bool skip_debug_insns,
4385                     rtx (*make_raw) (rtx))
4386 {
4387   rtx prev = after;
4388
4389   if (skip_debug_insns)
4390     while (DEBUG_INSN_P (prev))
4391       prev = PREV_INSN (prev);
4392
4393   if (INSN_P (prev))
4394     return emit_pattern_after_setloc (pattern, after, INSN_LOCATOR (prev),
4395                                       make_raw);
4396   else
4397     return emit_pattern_after_noloc (pattern, after, NULL, make_raw);
4398 }
4399
4400 /* Like emit_insn_after_noloc, but set INSN_LOCATOR according to LOC.  */
4401 rtx
4402 emit_insn_after_setloc (rtx pattern, rtx after, int loc)
4403 {
4404   return emit_pattern_after_setloc (pattern, after, loc, make_insn_raw);
4405 }
4406
4407 /* Like emit_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4408 rtx
4409 emit_insn_after (rtx pattern, rtx after)
4410 {
4411   return emit_pattern_after (pattern, after, true, make_insn_raw);
4412 }
4413
4414 /* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to LOC.  */
4415 rtx
4416 emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc)
4417 {
4418   return emit_pattern_after_setloc (pattern, after, loc, make_jump_insn_raw);
4419 }
4420
4421 /* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4422 rtx
4423 emit_jump_insn_after (rtx pattern, rtx after)
4424 {
4425   return emit_pattern_after (pattern, after, true, make_jump_insn_raw);
4426 }
4427
4428 /* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to LOC.  */
4429 rtx
4430 emit_call_insn_after_setloc (rtx pattern, rtx after, int loc)
4431 {
4432   return emit_pattern_after_setloc (pattern, after, loc, make_call_insn_raw);
4433 }
4434
4435 /* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4436 rtx
4437 emit_call_insn_after (rtx pattern, rtx after)
4438 {
4439   return emit_pattern_after (pattern, after, true, make_call_insn_raw);
4440 }
4441
4442 /* Like emit_debug_insn_after_noloc, but set INSN_LOCATOR according to LOC.  */
4443 rtx
4444 emit_debug_insn_after_setloc (rtx pattern, rtx after, int loc)
4445 {
4446   return emit_pattern_after_setloc (pattern, after, loc, make_debug_insn_raw);
4447 }
4448
4449 /* Like emit_debug_insn_after_noloc, but set INSN_LOCATOR according to AFTER.  */
4450 rtx
4451 emit_debug_insn_after (rtx pattern, rtx after)
4452 {
4453   return emit_pattern_after (pattern, after, false, make_debug_insn_raw);
4454 }
4455
4456 /* Insert PATTERN before BEFORE, setting its INSN_LOCATION to LOC.
4457    MAKE_RAW indicates how to turn PATTERN into a real insn.  INSNP
4458    indicates if PATTERN is meant for an INSN as opposed to a JUMP_INSN,
4459    CALL_INSN, etc.  */
4460
4461 static rtx
4462 emit_pattern_before_setloc (rtx pattern, rtx before, int loc, bool insnp,
4463                             rtx (*make_raw) (rtx))
4464 {
4465   rtx first = PREV_INSN (before);
4466   rtx last = emit_pattern_before_noloc (pattern, before,
4467                                         insnp ? before : NULL_RTX,
4468                                         NULL, make_raw);
4469
4470   if (pattern == NULL_RTX || !loc)
4471     return last;
4472
4473   if (!first)
4474     first = get_insns ();
4475   else
4476     first = NEXT_INSN (first);
4477   while (1)
4478     {
4479       if (active_insn_p (first) && !INSN_LOCATOR (first))
4480         INSN_LOCATOR (first) = loc;
4481       if (first == last)
4482         break;
4483       first = NEXT_INSN (first);
4484     }
4485   return last;
4486 }
4487
4488 /* Insert PATTERN before BEFORE.  MAKE_RAW indicates how to turn PATTERN
4489    into a real insn.  SKIP_DEBUG_INSNS indicates whether to insert
4490    before any DEBUG_INSNs.  INSNP indicates if PATTERN is meant for an
4491    INSN as opposed to a JUMP_INSN, CALL_INSN, etc.  */
4492
4493 static rtx
4494 emit_pattern_before (rtx pattern, rtx before, bool skip_debug_insns,
4495                      bool insnp, rtx (*make_raw) (rtx))
4496 {
4497   rtx next = before;
4498
4499   if (skip_debug_insns)
4500     while (DEBUG_INSN_P (next))
4501       next = PREV_INSN (next);
4502
4503   if (INSN_P (next))
4504     return emit_pattern_before_setloc (pattern, before, INSN_LOCATOR (next),
4505                                        insnp, make_raw);
4506   else
4507     return emit_pattern_before_noloc (pattern, before,
4508                                       insnp ? before : NULL_RTX,
4509                                       NULL, make_raw);
4510 }
4511
4512 /* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC.  */
4513 rtx
4514 emit_insn_before_setloc (rtx pattern, rtx before, int loc)
4515 {
4516   return emit_pattern_before_setloc (pattern, before, loc, true,
4517                                      make_insn_raw);
4518 }
4519
4520 /* Like emit_insn_before_noloc, but set INSN_LOCATOR according to BEFORE.  */
4521 rtx
4522 emit_insn_before (rtx pattern, rtx before)
4523 {
4524   return emit_pattern_before (pattern, before, true, true, make_insn_raw);
4525 }
4526
4527 /* like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC.  */
4528 rtx
4529 emit_jump_insn_before_setloc (rtx pattern, rtx before, int loc)
4530 {
4531   return emit_pattern_before_setloc (pattern, before, loc, false,
4532                                      make_jump_insn_raw);
4533 }
4534
4535 /* Like emit_jump_insn_before_noloc, but set INSN_LOCATOR according to BEFORE.  */
4536 rtx
4537 emit_jump_insn_before (rtx pattern, rtx before)
4538 {
4539   return emit_pattern_before (pattern, before, true, false,
4540                               make_jump_insn_raw);
4541 }
4542
4543 /* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC.  */
4544 rtx
4545 emit_call_insn_before_setloc (rtx pattern, rtx before, int loc)
4546 {
4547   return emit_pattern_before_setloc (pattern, before, loc, false,
4548                                      make_call_insn_raw);
4549 }
4550
4551 /* Like emit_call_insn_before_noloc,
4552    but set insn_locator according to BEFORE.  */
4553 rtx
4554 emit_call_insn_before (rtx pattern, rtx before)
4555 {
4556   return emit_pattern_before (pattern, before, true, false,
4557                               make_call_insn_raw);
4558 }
4559
4560 /* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC.  */
4561 rtx
4562 emit_debug_insn_before_setloc (rtx pattern, rtx before, int loc)
4563 {
4564   return emit_pattern_before_setloc (pattern, before, loc, false,
4565                                      make_debug_insn_raw);
4566 }
4567
4568 /* Like emit_debug_insn_before_noloc,
4569    but set insn_locator according to BEFORE.  */
4570 rtx
4571 emit_debug_insn_before (rtx pattern, rtx before)
4572 {
4573   return emit_pattern_before (pattern, before, false, false,
4574                               make_debug_insn_raw);
4575 }
4576 \f
4577 /* Take X and emit it at the end of the doubly-linked
4578    INSN list.
4579
4580    Returns the last insn emitted.  */
4581
4582 rtx
4583 emit_insn (rtx x)
4584 {
4585   rtx last = get_last_insn();
4586   rtx insn;
4587
4588   if (x == NULL_RTX)
4589     return last;
4590
4591   switch (GET_CODE (x))
4592     {
4593     case DEBUG_INSN:
4594     case INSN:
4595     case JUMP_INSN:
4596     case CALL_INSN:
4597     case CODE_LABEL:
4598     case BARRIER:
4599     case NOTE:
4600       insn = x;
4601       while (insn)
4602         {
4603           rtx next = NEXT_INSN (insn);
4604           add_insn (insn);
4605           last = insn;
4606           insn = next;
4607         }
4608       break;
4609
4610 #ifdef ENABLE_RTL_CHECKING
4611     case SEQUENCE:
4612       gcc_unreachable ();
4613       break;
4614 #endif
4615
4616     default:
4617       last = make_insn_raw (x);
4618       add_insn (last);
4619       break;
4620     }
4621
4622   return last;
4623 }
4624
4625 /* Make an insn of code DEBUG_INSN with pattern X
4626    and add it to the end of the doubly-linked list.  */
4627
4628 rtx
4629 emit_debug_insn (rtx x)
4630 {
4631   rtx last = get_last_insn();
4632   rtx insn;
4633
4634   if (x == NULL_RTX)
4635     return last;
4636
4637   switch (GET_CODE (x))
4638     {
4639     case DEBUG_INSN:
4640     case INSN:
4641     case JUMP_INSN:
4642     case CALL_INSN:
4643     case CODE_LABEL:
4644     case BARRIER:
4645     case NOTE:
4646       insn = x;
4647       while (insn)
4648         {
4649           rtx next = NEXT_INSN (insn);
4650           add_insn (insn);
4651           last = insn;
4652           insn = next;
4653         }
4654       break;
4655
4656 #ifdef ENABLE_RTL_CHECKING
4657     case SEQUENCE:
4658       gcc_unreachable ();
4659       break;
4660 #endif
4661
4662     default:
4663       last = make_debug_insn_raw (x);
4664       add_insn (last);
4665       break;
4666     }
4667
4668   return last;
4669 }
4670
4671 /* Make an insn of code JUMP_INSN with pattern X
4672    and add it to the end of the doubly-linked list.  */
4673
4674 rtx
4675 emit_jump_insn (rtx x)
4676 {
4677   rtx last = NULL_RTX, insn;
4678
4679   switch (GET_CODE (x))
4680     {
4681     case DEBUG_INSN:
4682     case INSN:
4683     case JUMP_INSN:
4684     case CALL_INSN:
4685     case CODE_LABEL:
4686     case BARRIER:
4687     case NOTE:
4688       insn = x;
4689       while (insn)
4690         {
4691           rtx next = NEXT_INSN (insn);
4692           add_insn (insn);
4693           last = insn;
4694           insn = next;
4695         }
4696       break;
4697
4698 #ifdef ENABLE_RTL_CHECKING
4699     case SEQUENCE:
4700       gcc_unreachable ();
4701       break;
4702 #endif
4703
4704     default:
4705       last = make_jump_insn_raw (x);
4706       add_insn (last);
4707       break;
4708     }
4709
4710   return last;
4711 }
4712
4713 /* Make an insn of code CALL_INSN with pattern X
4714    and add it to the end of the doubly-linked list.  */
4715
4716 rtx
4717 emit_call_insn (rtx x)
4718 {
4719   rtx insn;
4720
4721   switch (GET_CODE (x))
4722     {
4723     case DEBUG_INSN:
4724     case INSN:
4725     case JUMP_INSN:
4726     case CALL_INSN:
4727     case CODE_LABEL:
4728     case BARRIER:
4729     case NOTE:
4730       insn = emit_insn (x);
4731       break;
4732
4733 #ifdef ENABLE_RTL_CHECKING
4734     case SEQUENCE:
4735       gcc_unreachable ();
4736       break;
4737 #endif
4738
4739     default:
4740       insn = make_call_insn_raw (x);
4741       add_insn (insn);
4742       break;
4743     }
4744
4745   return insn;
4746 }
4747
4748 /* Add the label LABEL to the end of the doubly-linked list.  */
4749
4750 rtx
4751 emit_label (rtx label)
4752 {
4753   /* This can be called twice for the same label
4754      as a result of the confusion that follows a syntax error!
4755      So make it harmless.  */
4756   if (INSN_UID (label) == 0)
4757     {
4758       INSN_UID (label) = cur_insn_uid++;
4759       add_insn (label);
4760     }
4761   return label;
4762 }
4763
4764 /* Make an insn of code BARRIER
4765    and add it to the end of the doubly-linked list.  */
4766
4767 rtx
4768 emit_barrier (void)
4769 {
4770   rtx barrier = rtx_alloc (BARRIER);
4771   INSN_UID (barrier) = cur_insn_uid++;
4772   add_insn (barrier);
4773   return barrier;
4774 }
4775
4776 /* Emit a copy of note ORIG.  */
4777
4778 rtx
4779 emit_note_copy (rtx orig)
4780 {
4781   rtx note;
4782
4783   note = rtx_alloc (NOTE);
4784
4785   INSN_UID (note) = cur_insn_uid++;
4786   NOTE_DATA (note) = NOTE_DATA (orig);
4787   NOTE_KIND (note) = NOTE_KIND (orig);
4788   BLOCK_FOR_INSN (note) = NULL;
4789   add_insn (note);
4790
4791   return note;
4792 }
4793
4794 /* Make an insn of code NOTE or type NOTE_NO
4795    and add it to the end of the doubly-linked list.  */
4796
4797 rtx
4798 emit_note (enum insn_note kind)
4799 {
4800   rtx note;
4801
4802   note = rtx_alloc (NOTE);
4803   INSN_UID (note) = cur_insn_uid++;
4804   NOTE_KIND (note) = kind;
4805   memset (&NOTE_DATA (note), 0, sizeof (NOTE_DATA (note)));
4806   BLOCK_FOR_INSN (note) = NULL;
4807   add_insn (note);
4808   return note;
4809 }
4810
4811 /* Emit a clobber of lvalue X.  */
4812
4813 rtx
4814 emit_clobber (rtx x)
4815 {
4816   /* CONCATs should not appear in the insn stream.  */
4817   if (GET_CODE (x) == CONCAT)
4818     {
4819       emit_clobber (XEXP (x, 0));
4820       return emit_clobber (XEXP (x, 1));
4821     }
4822   return emit_insn (gen_rtx_CLOBBER (VOIDmode, x));
4823 }
4824
4825 /* Return a sequence of insns to clobber lvalue X.  */
4826
4827 rtx
4828 gen_clobber (rtx x)
4829 {
4830   rtx seq;
4831
4832   start_sequence ();
4833   emit_clobber (x);
4834   seq = get_insns ();
4835   end_sequence ();
4836   return seq;
4837 }
4838
4839 /* Emit a use of rvalue X.  */
4840
4841 rtx
4842 emit_use (rtx x)
4843 {
4844   /* CONCATs should not appear in the insn stream.  */
4845   if (GET_CODE (x) == CONCAT)
4846     {
4847       emit_use (XEXP (x, 0));
4848       return emit_use (XEXP (x, 1));
4849     }
4850   return emit_insn (gen_rtx_USE (VOIDmode, x));
4851 }
4852
4853 /* Return a sequence of insns to use rvalue X.  */
4854
4855 rtx
4856 gen_use (rtx x)
4857 {
4858   rtx seq;
4859
4860   start_sequence ();
4861   emit_use (x);
4862   seq = get_insns ();
4863   end_sequence ();
4864   return seq;
4865 }
4866
4867 /* Cause next statement to emit a line note even if the line number
4868    has not changed.  */
4869
4870 void
4871 force_next_line_note (void)
4872 {
4873   last_location = -1;
4874 }
4875
4876 /* Place a note of KIND on insn INSN with DATUM as the datum. If a
4877    note of this type already exists, remove it first.  */
4878
4879 rtx
4880 set_unique_reg_note (rtx insn, enum reg_note kind, rtx datum)
4881 {
4882   rtx note = find_reg_note (insn, kind, NULL_RTX);
4883
4884   switch (kind)
4885     {
4886     case REG_EQUAL:
4887     case REG_EQUIV:
4888       /* Don't add REG_EQUAL/REG_EQUIV notes if the insn
4889          has multiple sets (some callers assume single_set
4890          means the insn only has one set, when in fact it
4891          means the insn only has one * useful * set).  */
4892       if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
4893         {
4894           gcc_assert (!note);
4895           return NULL_RTX;
4896         }
4897
4898       /* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
4899          It serves no useful purpose and breaks eliminate_regs.  */
4900       if (GET_CODE (datum) == ASM_OPERANDS)
4901         return NULL_RTX;
4902
4903       if (note)
4904         {
4905           XEXP (note, 0) = datum;
4906           df_notes_rescan (insn);
4907           return note;
4908         }
4909       break;
4910
4911     default:
4912       if (note)
4913         {
4914           XEXP (note, 0) = datum;
4915           return note;
4916         }
4917       break;
4918     }
4919
4920   add_reg_note (insn, kind, datum);
4921
4922   switch (kind)
4923     {
4924     case REG_EQUAL:
4925     case REG_EQUIV:
4926       df_notes_rescan (insn);
4927       break;
4928     default:
4929       break;
4930     }
4931
4932   return REG_NOTES (insn);
4933 }
4934 \f
4935 /* Return an indication of which type of insn should have X as a body.
4936    The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN.  */
4937
4938 static enum rtx_code
4939 classify_insn (rtx x)
4940 {
4941   if (LABEL_P (x))
4942     return CODE_LABEL;
4943   if (GET_CODE (x) == CALL)
4944     return CALL_INSN;
4945   if (GET_CODE (x) == RETURN)
4946     return JUMP_INSN;
4947   if (GET_CODE (x) == SET)
4948     {
4949       if (SET_DEST (x) == pc_rtx)
4950         return JUMP_INSN;
4951       else if (GET_CODE (SET_SRC (x)) == CALL)
4952         return CALL_INSN;
4953       else
4954         return INSN;
4955     }
4956   if (GET_CODE (x) == PARALLEL)
4957     {
4958       int j;
4959       for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
4960         if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
4961           return CALL_INSN;
4962         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4963                  && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx)
4964           return JUMP_INSN;
4965         else if (GET_CODE (XVECEXP (x, 0, j)) == SET
4966                  && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
4967           return CALL_INSN;
4968     }
4969   return INSN;
4970 }
4971
4972 /* Emit the rtl pattern X as an appropriate kind of insn.
4973    If X is a label, it is simply added into the insn chain.  */
4974
4975 rtx
4976 emit (rtx x)
4977 {
4978   enum rtx_code code = classify_insn (x);
4979
4980   switch (code)
4981     {
4982     case CODE_LABEL:
4983       return emit_label (x);
4984     case INSN:
4985       return emit_insn (x);
4986     case  JUMP_INSN:
4987       {
4988         rtx insn = emit_jump_insn (x);
4989         if (any_uncondjump_p (insn) || GET_CODE (x) == RETURN)
4990           return emit_barrier ();
4991         return insn;
4992       }
4993     case CALL_INSN:
4994       return emit_call_insn (x);
4995     case DEBUG_INSN:
4996       return emit_debug_insn (x);
4997     default:
4998       gcc_unreachable ();
4999     }
5000 }
5001 \f
5002 /* Space for free sequence stack entries.  */
5003 static GTY ((deletable)) struct sequence_stack *free_sequence_stack;
5004
5005 /* Begin emitting insns to a sequence.  If this sequence will contain
5006    something that might cause the compiler to pop arguments to function
5007    calls (because those pops have previously been deferred; see
5008    INHIBIT_DEFER_POP for more details), use do_pending_stack_adjust
5009    before calling this function.  That will ensure that the deferred
5010    pops are not accidentally emitted in the middle of this sequence.  */
5011
5012 void
5013 start_sequence (void)
5014 {
5015   struct sequence_stack *tem;
5016
5017   if (free_sequence_stack != NULL)
5018     {
5019       tem = free_sequence_stack;
5020       free_sequence_stack = tem->next;
5021     }
5022   else
5023     tem = ggc_alloc_sequence_stack ();
5024
5025   tem->next = seq_stack;
5026   tem->first = get_insns ();
5027   tem->last = get_last_insn ();
5028
5029   seq_stack = tem;
5030
5031   set_first_insn (0);
5032   set_last_insn (0);
5033 }
5034
5035 /* Set up the insn chain starting with FIRST as the current sequence,
5036    saving the previously current one.  See the documentation for
5037    start_sequence for more information about how to use this function.  */
5038
5039 void
5040 push_to_sequence (rtx first)
5041 {
5042   rtx last;
5043
5044   start_sequence ();
5045
5046   for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last))
5047     ;
5048
5049   set_first_insn (first);
5050   set_last_insn (last);
5051 }
5052
5053 /* Like push_to_sequence, but take the last insn as an argument to avoid
5054    looping through the list.  */
5055
5056 void
5057 push_to_sequence2 (rtx first, rtx last)
5058 {
5059   start_sequence ();
5060
5061   set_first_insn (first);
5062   set_last_insn (last);
5063 }
5064
5065 /* Set up the outer-level insn chain
5066    as the current sequence, saving the previously current one.  */
5067
5068 void
5069 push_topmost_sequence (void)
5070 {
5071   struct sequence_stack *stack, *top = NULL;
5072
5073   start_sequence ();
5074
5075   for (stack = seq_stack; stack; stack = stack->next)
5076     top = stack;
5077
5078   set_first_insn (top->first);
5079   set_last_insn (top->last);
5080 }
5081
5082 /* After emitting to the outer-level insn chain, update the outer-level
5083    insn chain, and restore the previous saved state.  */
5084
5085 void
5086 pop_topmost_sequence (void)
5087 {
5088   struct sequence_stack *stack, *top = NULL;
5089
5090   for (stack = seq_stack; stack; stack = stack->next)
5091     top = stack;
5092
5093   top->first = get_insns ();
5094   top->last = get_last_insn ();
5095
5096   end_sequence ();
5097 }
5098
5099 /* After emitting to a sequence, restore previous saved state.
5100
5101    To get the contents of the sequence just made, you must call
5102    `get_insns' *before* calling here.
5103
5104    If the compiler might have deferred popping arguments while
5105    generating this sequence, and this sequence will not be immediately
5106    inserted into the instruction stream, use do_pending_stack_adjust
5107    before calling get_insns.  That will ensure that the deferred
5108    pops are inserted into this sequence, and not into some random
5109    location in the instruction stream.  See INHIBIT_DEFER_POP for more
5110    information about deferred popping of arguments.  */
5111
5112 void
5113 end_sequence (void)
5114 {
5115   struct sequence_stack *tem = seq_stack;
5116
5117   set_first_insn (tem->first);
5118   set_last_insn (tem->last);
5119   seq_stack = tem->next;
5120
5121   memset (tem, 0, sizeof (*tem));
5122   tem->next = free_sequence_stack;
5123   free_sequence_stack = tem;
5124 }
5125
5126 /* Return 1 if currently emitting into a sequence.  */
5127
5128 int
5129 in_sequence_p (void)
5130 {
5131   return seq_stack != 0;
5132 }
5133 \f
5134 /* Put the various virtual registers into REGNO_REG_RTX.  */
5135
5136 static void
5137 init_virtual_regs (void)
5138 {
5139   regno_reg_rtx[VIRTUAL_INCOMING_ARGS_REGNUM] = virtual_incoming_args_rtx;
5140   regno_reg_rtx[VIRTUAL_STACK_VARS_REGNUM] = virtual_stack_vars_rtx;
5141   regno_reg_rtx[VIRTUAL_STACK_DYNAMIC_REGNUM] = virtual_stack_dynamic_rtx;
5142   regno_reg_rtx[VIRTUAL_OUTGOING_ARGS_REGNUM] = virtual_outgoing_args_rtx;
5143   regno_reg_rtx[VIRTUAL_CFA_REGNUM] = virtual_cfa_rtx;
5144   regno_reg_rtx[VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM]
5145     = virtual_preferred_stack_boundary_rtx;
5146 }
5147
5148 \f
5149 /* Used by copy_insn_1 to avoid copying SCRATCHes more than once.  */
5150 static rtx copy_insn_scratch_in[MAX_RECOG_OPERANDS];
5151 static rtx copy_insn_scratch_out[MAX_RECOG_OPERANDS];
5152 static int copy_insn_n_scratches;
5153
5154 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
5155    copied an ASM_OPERANDS.
5156    In that case, it is the original input-operand vector.  */
5157 static rtvec orig_asm_operands_vector;
5158
5159 /* When an insn is being copied by copy_insn_1, this is nonzero if we have
5160    copied an ASM_OPERANDS.
5161    In that case, it is the copied input-operand vector.  */
5162 static rtvec copy_asm_operands_vector;
5163
5164 /* Likewise for the constraints vector.  */
5165 static rtvec orig_asm_constraints_vector;
5166 static rtvec copy_asm_constraints_vector;
5167
5168 /* Recursively create a new copy of an rtx for copy_insn.
5169    This function differs from copy_rtx in that it handles SCRATCHes and
5170    ASM_OPERANDs properly.
5171    Normally, this function is not used directly; use copy_insn as front end.
5172    However, you could first copy an insn pattern with copy_insn and then use
5173    this function afterwards to properly copy any REG_NOTEs containing
5174    SCRATCHes.  */
5175
5176 rtx
5177 copy_insn_1 (rtx orig)
5178 {
5179   rtx copy;
5180   int i, j;
5181   RTX_CODE code;
5182   const char *format_ptr;
5183
5184   if (orig == NULL)
5185     return NULL;
5186
5187   code = GET_CODE (orig);
5188
5189   switch (code)
5190     {
5191     case REG:
5192     case CONST_INT:
5193     case CONST_DOUBLE:
5194     case CONST_FIXED:
5195     case CONST_VECTOR:
5196     case SYMBOL_REF:
5197     case CODE_LABEL:
5198     case PC:
5199     case CC0:
5200       return orig;
5201     case CLOBBER:
5202       if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER)
5203         return orig;
5204       break;
5205
5206     case SCRATCH:
5207       for (i = 0; i < copy_insn_n_scratches; i++)
5208         if (copy_insn_scratch_in[i] == orig)
5209           return copy_insn_scratch_out[i];
5210       break;
5211
5212     case CONST:
5213       if (shared_const_p (orig))
5214         return orig;
5215       break;
5216
5217       /* A MEM with a constant address is not sharable.  The problem is that
5218          the constant address may need to be reloaded.  If the mem is shared,
5219          then reloading one copy of this mem will cause all copies to appear
5220          to have been reloaded.  */
5221
5222     default:
5223       break;
5224     }
5225
5226   /* Copy the various flags, fields, and other information.  We assume
5227      that all fields need copying, and then clear the fields that should
5228      not be copied.  That is the sensible default behavior, and forces
5229      us to explicitly document why we are *not* copying a flag.  */
5230   copy = shallow_copy_rtx (orig);
5231
5232   /* We do not copy the USED flag, which is used as a mark bit during
5233      walks over the RTL.  */
5234   RTX_FLAG (copy, used) = 0;
5235
5236   /* We do not copy JUMP, CALL, or FRAME_RELATED for INSNs.  */
5237   if (INSN_P (orig))
5238     {
5239       RTX_FLAG (copy, jump) = 0;
5240       RTX_FLAG (copy, call) = 0;
5241       RTX_FLAG (copy, frame_related) = 0;
5242     }
5243
5244   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
5245
5246   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
5247     switch (*format_ptr++)
5248       {
5249       case 'e':
5250         if (XEXP (orig, i) != NULL)
5251           XEXP (copy, i) = copy_insn_1 (XEXP (orig, i));
5252         break;
5253
5254       case 'E':
5255       case 'V':
5256         if (XVEC (orig, i) == orig_asm_constraints_vector)
5257           XVEC (copy, i) = copy_asm_constraints_vector;
5258         else if (XVEC (orig, i) == orig_asm_operands_vector)
5259           XVEC (copy, i) = copy_asm_operands_vector;
5260         else if (XVEC (orig, i) != NULL)
5261           {
5262             XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
5263             for (j = 0; j < XVECLEN (copy, i); j++)
5264               XVECEXP (copy, i, j) = copy_insn_1 (XVECEXP (orig, i, j));
5265           }
5266         break;
5267
5268       case 't':
5269       case 'w':
5270       case 'i':
5271       case 's':
5272       case 'S':
5273       case 'u':
5274       case '0':
5275         /* These are left unchanged.  */
5276         break;
5277
5278       default:
5279         gcc_unreachable ();
5280       }
5281
5282   if (code == SCRATCH)
5283     {
5284       i = copy_insn_n_scratches++;
5285       gcc_assert (i < MAX_RECOG_OPERANDS);
5286       copy_insn_scratch_in[i] = orig;
5287       copy_insn_scratch_out[i] = copy;
5288     }
5289   else if (code == ASM_OPERANDS)
5290     {
5291       orig_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (orig);
5292       copy_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (copy);
5293       orig_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (orig);
5294       copy_asm_constraints_vector = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy);
5295     }
5296
5297   return copy;
5298 }
5299
5300 /* Create a new copy of an rtx.
5301    This function differs from copy_rtx in that it handles SCRATCHes and
5302    ASM_OPERANDs properly.
5303    INSN doesn't really have to be a full INSN; it could be just the
5304    pattern.  */
5305 rtx
5306 copy_insn (rtx insn)
5307 {
5308   copy_insn_n_scratches = 0;
5309   orig_asm_operands_vector = 0;
5310   orig_asm_constraints_vector = 0;
5311   copy_asm_operands_vector = 0;
5312   copy_asm_constraints_vector = 0;
5313   return copy_insn_1 (insn);
5314 }
5315
5316 /* Initialize data structures and variables in this file
5317    before generating rtl for each function.  */
5318
5319 void
5320 init_emit (void)
5321 {
5322   set_first_insn (NULL);
5323   set_last_insn (NULL);
5324   if (MIN_NONDEBUG_INSN_UID)
5325     cur_insn_uid = MIN_NONDEBUG_INSN_UID;
5326   else
5327     cur_insn_uid = 1;
5328   cur_debug_insn_uid = 1;
5329   reg_rtx_no = LAST_VIRTUAL_REGISTER + 1;
5330   last_location = UNKNOWN_LOCATION;
5331   first_label_num = label_num;
5332   seq_stack = NULL;
5333
5334   /* Init the tables that describe all the pseudo regs.  */
5335
5336   crtl->emit.regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101;
5337
5338   crtl->emit.regno_pointer_align
5339     = XCNEWVEC (unsigned char, crtl->emit.regno_pointer_align_length);
5340
5341   regno_reg_rtx = ggc_alloc_vec_rtx (crtl->emit.regno_pointer_align_length);
5342
5343   /* Put copies of all the hard registers into regno_reg_rtx.  */
5344   memcpy (regno_reg_rtx,
5345           initial_regno_reg_rtx,
5346           FIRST_PSEUDO_REGISTER * sizeof (rtx));
5347
5348   /* Put copies of all the virtual register rtx into regno_reg_rtx.  */
5349   init_virtual_regs ();
5350
5351   /* Indicate that the virtual registers and stack locations are
5352      all pointers.  */
5353   REG_POINTER (stack_pointer_rtx) = 1;
5354   REG_POINTER (frame_pointer_rtx) = 1;
5355   REG_POINTER (hard_frame_pointer_rtx) = 1;
5356   REG_POINTER (arg_pointer_rtx) = 1;
5357
5358   REG_POINTER (virtual_incoming_args_rtx) = 1;
5359   REG_POINTER (virtual_stack_vars_rtx) = 1;
5360   REG_POINTER (virtual_stack_dynamic_rtx) = 1;
5361   REG_POINTER (virtual_outgoing_args_rtx) = 1;
5362   REG_POINTER (virtual_cfa_rtx) = 1;
5363
5364 #ifdef STACK_BOUNDARY
5365   REGNO_POINTER_ALIGN (STACK_POINTER_REGNUM) = STACK_BOUNDARY;
5366   REGNO_POINTER_ALIGN (FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
5367   REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = STACK_BOUNDARY;
5368   REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = STACK_BOUNDARY;
5369
5370   REGNO_POINTER_ALIGN (VIRTUAL_INCOMING_ARGS_REGNUM) = STACK_BOUNDARY;
5371   REGNO_POINTER_ALIGN (VIRTUAL_STACK_VARS_REGNUM) = STACK_BOUNDARY;
5372   REGNO_POINTER_ALIGN (VIRTUAL_STACK_DYNAMIC_REGNUM) = STACK_BOUNDARY;
5373   REGNO_POINTER_ALIGN (VIRTUAL_OUTGOING_ARGS_REGNUM) = STACK_BOUNDARY;
5374   REGNO_POINTER_ALIGN (VIRTUAL_CFA_REGNUM) = BITS_PER_WORD;
5375 #endif
5376
5377 #ifdef INIT_EXPANDERS
5378   INIT_EXPANDERS;
5379 #endif
5380 }
5381
5382 /* Generate a vector constant for mode MODE and constant value CONSTANT.  */
5383
5384 static rtx
5385 gen_const_vector (enum machine_mode mode, int constant)
5386 {
5387   rtx tem;
5388   rtvec v;
5389   int units, i;
5390   enum machine_mode inner;
5391
5392   units = GET_MODE_NUNITS (mode);
5393   inner = GET_MODE_INNER (mode);
5394
5395   gcc_assert (!DECIMAL_FLOAT_MODE_P (inner));
5396
5397   v = rtvec_alloc (units);
5398
5399   /* We need to call this function after we set the scalar const_tiny_rtx
5400      entries.  */
5401   gcc_assert (const_tiny_rtx[constant][(int) inner]);
5402
5403   for (i = 0; i < units; ++i)
5404     RTVEC_ELT (v, i) = const_tiny_rtx[constant][(int) inner];
5405
5406   tem = gen_rtx_raw_CONST_VECTOR (mode, v);
5407   return tem;
5408 }
5409
5410 /* Generate a vector like gen_rtx_raw_CONST_VEC, but use the zero vector when
5411    all elements are zero, and the one vector when all elements are one.  */
5412 rtx
5413 gen_rtx_CONST_VECTOR (enum machine_mode mode, rtvec v)
5414 {
5415   enum machine_mode inner = GET_MODE_INNER (mode);
5416   int nunits = GET_MODE_NUNITS (mode);
5417   rtx x;
5418   int i;
5419
5420   /* Check to see if all of the elements have the same value.  */
5421   x = RTVEC_ELT (v, nunits - 1);
5422   for (i = nunits - 2; i >= 0; i--)
5423     if (RTVEC_ELT (v, i) != x)
5424       break;
5425
5426   /* If the values are all the same, check to see if we can use one of the
5427      standard constant vectors.  */
5428   if (i == -1)
5429     {
5430       if (x == CONST0_RTX (inner))
5431         return CONST0_RTX (mode);
5432       else if (x == CONST1_RTX (inner))
5433         return CONST1_RTX (mode);
5434     }
5435
5436   return gen_rtx_raw_CONST_VECTOR (mode, v);
5437 }
5438
5439 /* Initialise global register information required by all functions.  */
5440
5441 void
5442 init_emit_regs (void)
5443 {
5444   int i;
5445
5446   /* Reset register attributes */
5447   htab_empty (reg_attrs_htab);
5448
5449   /* We need reg_raw_mode, so initialize the modes now.  */
5450   init_reg_modes_target ();
5451
5452   /* Assign register numbers to the globally defined register rtx.  */
5453   pc_rtx = gen_rtx_fmt_ (PC, VOIDmode);
5454   ret_rtx = gen_rtx_fmt_ (RETURN, VOIDmode);
5455   cc0_rtx = gen_rtx_fmt_ (CC0, VOIDmode);
5456   stack_pointer_rtx = gen_raw_REG (Pmode, STACK_POINTER_REGNUM);
5457   frame_pointer_rtx = gen_raw_REG (Pmode, FRAME_POINTER_REGNUM);
5458   hard_frame_pointer_rtx = gen_raw_REG (Pmode, HARD_FRAME_POINTER_REGNUM);
5459   arg_pointer_rtx = gen_raw_REG (Pmode, ARG_POINTER_REGNUM);
5460   virtual_incoming_args_rtx =
5461     gen_raw_REG (Pmode, VIRTUAL_INCOMING_ARGS_REGNUM);
5462   virtual_stack_vars_rtx =
5463     gen_raw_REG (Pmode, VIRTUAL_STACK_VARS_REGNUM);
5464   virtual_stack_dynamic_rtx =
5465     gen_raw_REG (Pmode, VIRTUAL_STACK_DYNAMIC_REGNUM);
5466   virtual_outgoing_args_rtx =
5467     gen_raw_REG (Pmode, VIRTUAL_OUTGOING_ARGS_REGNUM);
5468   virtual_cfa_rtx = gen_raw_REG (Pmode, VIRTUAL_CFA_REGNUM);
5469   virtual_preferred_stack_boundary_rtx =
5470     gen_raw_REG (Pmode, VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM);
5471
5472   /* Initialize RTL for commonly used hard registers.  These are
5473      copied into regno_reg_rtx as we begin to compile each function.  */
5474   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
5475     initial_regno_reg_rtx[i] = gen_raw_REG (reg_raw_mode[i], i);
5476
5477 #ifdef RETURN_ADDRESS_POINTER_REGNUM
5478   return_address_pointer_rtx
5479     = gen_raw_REG (Pmode, RETURN_ADDRESS_POINTER_REGNUM);
5480 #endif
5481
5482   if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
5483     pic_offset_table_rtx = gen_raw_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);
5484   else
5485     pic_offset_table_rtx = NULL_RTX;
5486 }
5487
5488 /* Create some permanent unique rtl objects shared between all functions.  */
5489
5490 void
5491 init_emit_once (void)
5492 {
5493   int i;
5494   enum machine_mode mode;
5495   enum machine_mode double_mode;
5496
5497   /* Initialize the CONST_INT, CONST_DOUBLE, CONST_FIXED, and memory attribute
5498      hash tables.  */
5499   const_int_htab = htab_create_ggc (37, const_int_htab_hash,
5500                                     const_int_htab_eq, NULL);
5501
5502   const_double_htab = htab_create_ggc (37, const_double_htab_hash,
5503                                        const_double_htab_eq, NULL);
5504
5505   const_fixed_htab = htab_create_ggc (37, const_fixed_htab_hash,
5506                                       const_fixed_htab_eq, NULL);
5507
5508   mem_attrs_htab = htab_create_ggc (37, mem_attrs_htab_hash,
5509                                     mem_attrs_htab_eq, NULL);
5510   reg_attrs_htab = htab_create_ggc (37, reg_attrs_htab_hash,
5511                                     reg_attrs_htab_eq, NULL);
5512
5513   /* Compute the word and byte modes.  */
5514
5515   byte_mode = VOIDmode;
5516   word_mode = VOIDmode;
5517   double_mode = VOIDmode;
5518
5519   for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
5520        mode != VOIDmode;
5521        mode = GET_MODE_WIDER_MODE (mode))
5522     {
5523       if (GET_MODE_BITSIZE (mode) == BITS_PER_UNIT
5524           && byte_mode == VOIDmode)
5525         byte_mode = mode;
5526
5527       if (GET_MODE_BITSIZE (mode) == BITS_PER_WORD
5528           && word_mode == VOIDmode)
5529         word_mode = mode;
5530     }
5531
5532   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
5533        mode != VOIDmode;
5534        mode = GET_MODE_WIDER_MODE (mode))
5535     {
5536       if (GET_MODE_BITSIZE (mode) == DOUBLE_TYPE_SIZE
5537           && double_mode == VOIDmode)
5538         double_mode = mode;
5539     }
5540
5541   ptr_mode = mode_for_size (POINTER_SIZE, GET_MODE_CLASS (Pmode), 0);
5542
5543 #ifdef INIT_EXPANDERS
5544   /* This is to initialize {init|mark|free}_machine_status before the first
5545      call to push_function_context_to.  This is needed by the Chill front
5546      end which calls push_function_context_to before the first call to
5547      init_function_start.  */
5548   INIT_EXPANDERS;
5549 #endif
5550
5551   /* Create the unique rtx's for certain rtx codes and operand values.  */
5552
5553   /* Don't use gen_rtx_CONST_INT here since gen_rtx_CONST_INT in this case
5554      tries to use these variables.  */
5555   for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
5556     const_int_rtx[i + MAX_SAVED_CONST_INT] =
5557       gen_rtx_raw_CONST_INT (VOIDmode, (HOST_WIDE_INT) i);
5558
5559   if (STORE_FLAG_VALUE >= - MAX_SAVED_CONST_INT
5560       && STORE_FLAG_VALUE <= MAX_SAVED_CONST_INT)
5561     const_true_rtx = const_int_rtx[STORE_FLAG_VALUE + MAX_SAVED_CONST_INT];
5562   else
5563     const_true_rtx = gen_rtx_CONST_INT (VOIDmode, STORE_FLAG_VALUE);
5564
5565   REAL_VALUE_FROM_INT (dconst0,   0,  0, double_mode);
5566   REAL_VALUE_FROM_INT (dconst1,   1,  0, double_mode);
5567   REAL_VALUE_FROM_INT (dconst2,   2,  0, double_mode);
5568
5569   dconstm1 = dconst1;
5570   dconstm1.sign = 1;
5571
5572   dconsthalf = dconst1;
5573   SET_REAL_EXP (&dconsthalf, REAL_EXP (&dconsthalf) - 1);
5574
5575   for (i = 0; i < (int) ARRAY_SIZE (const_tiny_rtx); i++)
5576     {
5577       const REAL_VALUE_TYPE *const r =
5578         (i == 0 ? &dconst0 : i == 1 ? &dconst1 : &dconst2);
5579
5580       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
5581            mode != VOIDmode;
5582            mode = GET_MODE_WIDER_MODE (mode))
5583         const_tiny_rtx[i][(int) mode] =
5584           CONST_DOUBLE_FROM_REAL_VALUE (*r, mode);
5585
5586       for (mode = GET_CLASS_NARROWEST_MODE (MODE_DECIMAL_FLOAT);
5587            mode != VOIDmode;
5588            mode = GET_MODE_WIDER_MODE (mode))
5589         const_tiny_rtx[i][(int) mode] =
5590           CONST_DOUBLE_FROM_REAL_VALUE (*r, mode);
5591
5592       const_tiny_rtx[i][(int) VOIDmode] = GEN_INT (i);
5593
5594       for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
5595            mode != VOIDmode;
5596            mode = GET_MODE_WIDER_MODE (mode))
5597         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
5598
5599       for (mode = GET_CLASS_NARROWEST_MODE (MODE_PARTIAL_INT);
5600            mode != VOIDmode;
5601            mode = GET_MODE_WIDER_MODE (mode))
5602         const_tiny_rtx[i][(int) mode] = GEN_INT (i);
5603     }
5604
5605   for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_INT);
5606        mode != VOIDmode;
5607        mode = GET_MODE_WIDER_MODE (mode))
5608     {
5609       rtx inner = const_tiny_rtx[0][(int)GET_MODE_INNER (mode)];
5610       const_tiny_rtx[0][(int) mode] = gen_rtx_CONCAT (mode, inner, inner);
5611     }
5612
5613   for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_FLOAT);
5614        mode != VOIDmode;
5615        mode = GET_MODE_WIDER_MODE (mode))
5616     {
5617       rtx inner = const_tiny_rtx[0][(int)GET_MODE_INNER (mode)];
5618       const_tiny_rtx[0][(int) mode] = gen_rtx_CONCAT (mode, inner, inner);
5619     }
5620
5621   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
5622        mode != VOIDmode;
5623        mode = GET_MODE_WIDER_MODE (mode))
5624     {
5625       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5626       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5627     }
5628
5629   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
5630        mode != VOIDmode;
5631        mode = GET_MODE_WIDER_MODE (mode))
5632     {
5633       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5634       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5635     }
5636
5637   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FRACT);
5638        mode != VOIDmode;
5639        mode = GET_MODE_WIDER_MODE (mode))
5640     {
5641       FCONST0(mode).data.high = 0;
5642       FCONST0(mode).data.low = 0;
5643       FCONST0(mode).mode = mode;
5644       const_tiny_rtx[0][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5645                                       FCONST0 (mode), mode);
5646     }
5647
5648   for (mode = GET_CLASS_NARROWEST_MODE (MODE_UFRACT);
5649        mode != VOIDmode;
5650        mode = GET_MODE_WIDER_MODE (mode))
5651     {
5652       FCONST0(mode).data.high = 0;
5653       FCONST0(mode).data.low = 0;
5654       FCONST0(mode).mode = mode;
5655       const_tiny_rtx[0][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5656                                       FCONST0 (mode), mode);
5657     }
5658
5659   for (mode = GET_CLASS_NARROWEST_MODE (MODE_ACCUM);
5660        mode != VOIDmode;
5661        mode = GET_MODE_WIDER_MODE (mode))
5662     {
5663       FCONST0(mode).data.high = 0;
5664       FCONST0(mode).data.low = 0;
5665       FCONST0(mode).mode = mode;
5666       const_tiny_rtx[0][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5667                                       FCONST0 (mode), mode);
5668
5669       /* We store the value 1.  */
5670       FCONST1(mode).data.high = 0;
5671       FCONST1(mode).data.low = 0;
5672       FCONST1(mode).mode = mode;
5673       lshift_double (1, 0, GET_MODE_FBIT (mode),
5674                      2 * HOST_BITS_PER_WIDE_INT,
5675                      &FCONST1(mode).data.low,
5676                      &FCONST1(mode).data.high,
5677                      SIGNED_FIXED_POINT_MODE_P (mode));
5678       const_tiny_rtx[1][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5679                                       FCONST1 (mode), mode);
5680     }
5681
5682   for (mode = GET_CLASS_NARROWEST_MODE (MODE_UACCUM);
5683        mode != VOIDmode;
5684        mode = GET_MODE_WIDER_MODE (mode))
5685     {
5686       FCONST0(mode).data.high = 0;
5687       FCONST0(mode).data.low = 0;
5688       FCONST0(mode).mode = mode;
5689       const_tiny_rtx[0][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5690                                       FCONST0 (mode), mode);
5691
5692       /* We store the value 1.  */
5693       FCONST1(mode).data.high = 0;
5694       FCONST1(mode).data.low = 0;
5695       FCONST1(mode).mode = mode;
5696       lshift_double (1, 0, GET_MODE_FBIT (mode),
5697                      2 * HOST_BITS_PER_WIDE_INT,
5698                      &FCONST1(mode).data.low,
5699                      &FCONST1(mode).data.high,
5700                      SIGNED_FIXED_POINT_MODE_P (mode));
5701       const_tiny_rtx[1][(int) mode] = CONST_FIXED_FROM_FIXED_VALUE (
5702                                       FCONST1 (mode), mode);
5703     }
5704
5705   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FRACT);
5706        mode != VOIDmode;
5707        mode = GET_MODE_WIDER_MODE (mode))
5708     {
5709       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5710     }
5711
5712   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_UFRACT);
5713        mode != VOIDmode;
5714        mode = GET_MODE_WIDER_MODE (mode))
5715     {
5716       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5717     }
5718
5719   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_ACCUM);
5720        mode != VOIDmode;
5721        mode = GET_MODE_WIDER_MODE (mode))
5722     {
5723       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5724       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5725     }
5726
5727   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_UACCUM);
5728        mode != VOIDmode;
5729        mode = GET_MODE_WIDER_MODE (mode))
5730     {
5731       const_tiny_rtx[0][(int) mode] = gen_const_vector (mode, 0);
5732       const_tiny_rtx[1][(int) mode] = gen_const_vector (mode, 1);
5733     }
5734
5735   for (i = (int) CCmode; i < (int) MAX_MACHINE_MODE; ++i)
5736     if (GET_MODE_CLASS ((enum machine_mode) i) == MODE_CC)
5737       const_tiny_rtx[0][i] = const0_rtx;
5738
5739   const_tiny_rtx[0][(int) BImode] = const0_rtx;
5740   if (STORE_FLAG_VALUE == 1)
5741     const_tiny_rtx[1][(int) BImode] = const1_rtx;
5742 }
5743 \f
5744 /* Produce exact duplicate of insn INSN after AFTER.
5745    Care updating of libcall regions if present.  */
5746
5747 rtx
5748 emit_copy_of_insn_after (rtx insn, rtx after)
5749 {
5750   rtx new_rtx, link;
5751
5752   switch (GET_CODE (insn))
5753     {
5754     case INSN:
5755       new_rtx = emit_insn_after (copy_insn (PATTERN (insn)), after);
5756       break;
5757
5758     case JUMP_INSN:
5759       new_rtx = emit_jump_insn_after (copy_insn (PATTERN (insn)), after);
5760       break;
5761
5762     case DEBUG_INSN:
5763       new_rtx = emit_debug_insn_after (copy_insn (PATTERN (insn)), after);
5764       break;
5765
5766     case CALL_INSN:
5767       new_rtx = emit_call_insn_after (copy_insn (PATTERN (insn)), after);
5768       if (CALL_INSN_FUNCTION_USAGE (insn))
5769         CALL_INSN_FUNCTION_USAGE (new_rtx)
5770           = copy_insn (CALL_INSN_FUNCTION_USAGE (insn));
5771       SIBLING_CALL_P (new_rtx) = SIBLING_CALL_P (insn);
5772       RTL_CONST_CALL_P (new_rtx) = RTL_CONST_CALL_P (insn);
5773       RTL_PURE_CALL_P (new_rtx) = RTL_PURE_CALL_P (insn);
5774       RTL_LOOPING_CONST_OR_PURE_CALL_P (new_rtx)
5775         = RTL_LOOPING_CONST_OR_PURE_CALL_P (insn);
5776       break;
5777
5778     default:
5779       gcc_unreachable ();
5780     }
5781
5782   /* Update LABEL_NUSES.  */
5783   mark_jump_label (PATTERN (new_rtx), new_rtx, 0);
5784
5785   INSN_LOCATOR (new_rtx) = INSN_LOCATOR (insn);
5786
5787   /* If the old insn is frame related, then so is the new one.  This is
5788      primarily needed for IA-64 unwind info which marks epilogue insns,
5789      which may be duplicated by the basic block reordering code.  */
5790   RTX_FRAME_RELATED_P (new_rtx) = RTX_FRAME_RELATED_P (insn);
5791
5792   /* Copy all REG_NOTES except REG_LABEL_OPERAND since mark_jump_label
5793      will make them.  REG_LABEL_TARGETs are created there too, but are
5794      supposed to be sticky, so we copy them.  */
5795   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
5796     if (REG_NOTE_KIND (link) != REG_LABEL_OPERAND)
5797       {
5798         if (GET_CODE (link) == EXPR_LIST)
5799           add_reg_note (new_rtx, REG_NOTE_KIND (link),
5800                         copy_insn_1 (XEXP (link, 0)));
5801         else
5802           add_reg_note (new_rtx, REG_NOTE_KIND (link), XEXP (link, 0));
5803       }
5804
5805   INSN_CODE (new_rtx) = INSN_CODE (insn);
5806   return new_rtx;
5807 }
5808
5809 static GTY((deletable)) rtx hard_reg_clobbers [NUM_MACHINE_MODES][FIRST_PSEUDO_REGISTER];
5810 rtx
5811 gen_hard_reg_clobber (enum machine_mode mode, unsigned int regno)
5812 {
5813   if (hard_reg_clobbers[mode][regno])
5814     return hard_reg_clobbers[mode][regno];
5815   else
5816     return (hard_reg_clobbers[mode][regno] =
5817             gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (mode, regno)));
5818 }
5819
5820 #include "gt-emit-rtl.h"