OSDN Git Service

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