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