OSDN Git Service

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