OSDN Git Service

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