OSDN Git Service

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