OSDN Git Service

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