OSDN Git Service

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