OSDN Git Service

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