OSDN Git Service

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