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