OSDN Git Service

* lib/gcc-simulate-thread.exp (simulate-thread): Do not run on
[pf3gnuchains/gcc-fork.git] / gcc / final.c
1 /* Convert RTL to assembler code and output it, for GNU compiler.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4    2010, 2011
5    Free Software Foundation, Inc.
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 /* This is the final pass of the compiler.
24    It looks at the rtl code for a function and outputs assembler code.
25
26    Call `final_start_function' to output the assembler code for function entry,
27    `final' to output assembler code for some RTL code,
28    `final_end_function' to output assembler code for function exit.
29    If a function is compiled in several pieces, each piece is
30    output separately with `final'.
31
32    Some optimizations are also done at this level.
33    Move instructions that were made unnecessary by good register allocation
34    are detected and omitted from the output.  (Though most of these
35    are removed by the last jump pass.)
36
37    Instructions to set the condition codes are omitted when it can be
38    seen that the condition codes already had the desired values.
39
40    In some cases it is sufficient if the inherited condition codes
41    have related values, but this may require the following insn
42    (the one that tests the condition codes) to be modified.
43
44    The code for the function prologue and epilogue are generated
45    directly in assembler by the target functions function_prologue and
46    function_epilogue.  Those instructions never exist as rtl.  */
47
48 #include "config.h"
49 #include "system.h"
50 #include "coretypes.h"
51 #include "tm.h"
52
53 #include "tree.h"
54 #include "rtl.h"
55 #include "tm_p.h"
56 #include "regs.h"
57 #include "insn-config.h"
58 #include "insn-attr.h"
59 #include "recog.h"
60 #include "conditions.h"
61 #include "flags.h"
62 #include "hard-reg-set.h"
63 #include "output.h"
64 #include "except.h"
65 #include "function.h"
66 #include "rtl-error.h"
67 #include "toplev.h" /* exact_log2, floor_log2 */
68 #include "reload.h"
69 #include "intl.h"
70 #include "basic-block.h"
71 #include "target.h"
72 #include "targhooks.h"
73 #include "debug.h"
74 #include "expr.h"
75 #include "cfglayout.h"
76 #include "tree-pass.h"
77 #include "tree-flow.h"
78 #include "timevar.h"
79 #include "cgraph.h"
80 #include "coverage.h"
81 #include "df.h"
82 #include "vecprim.h"
83 #include "ggc.h"
84 #include "cfgloop.h"
85 #include "params.h"
86 #include "tree-pretty-print.h"
87
88 #ifdef XCOFF_DEBUGGING_INFO
89 #include "xcoffout.h"           /* Needed for external data
90                                    declarations for e.g. AIX 4.x.  */
91 #endif
92
93 #include "dwarf2out.h"
94
95 #ifdef DBX_DEBUGGING_INFO
96 #include "dbxout.h"
97 #endif
98
99 #ifdef SDB_DEBUGGING_INFO
100 #include "sdbout.h"
101 #endif
102
103 /* Most ports that aren't using cc0 don't need to define CC_STATUS_INIT.
104    So define a null default for it to save conditionalization later.  */
105 #ifndef CC_STATUS_INIT
106 #define CC_STATUS_INIT
107 #endif
108
109 /* Is the given character a logical line separator for the assembler?  */
110 #ifndef IS_ASM_LOGICAL_LINE_SEPARATOR
111 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) ((C) == ';')
112 #endif
113
114 #ifndef JUMP_TABLES_IN_TEXT_SECTION
115 #define JUMP_TABLES_IN_TEXT_SECTION 0
116 #endif
117
118 /* Bitflags used by final_scan_insn.  */
119 #define SEEN_BB         1
120 #define SEEN_NOTE       2
121 #define SEEN_EMITTED    4
122
123 /* Last insn processed by final_scan_insn.  */
124 static rtx debug_insn;
125 rtx current_output_insn;
126
127 /* Line number of last NOTE.  */
128 static int last_linenum;
129
130 /* Last discriminator written to assembly.  */
131 static int last_discriminator;
132
133 /* Discriminator of current block.  */
134 static int discriminator;
135
136 /* Highest line number in current block.  */
137 static int high_block_linenum;
138
139 /* Likewise for function.  */
140 static int high_function_linenum;
141
142 /* Filename of last NOTE.  */
143 static const char *last_filename;
144
145 /* Override filename and line number.  */
146 static const char *override_filename;
147 static int override_linenum;
148
149 /* Whether to force emission of a line note before the next insn.  */
150 static bool force_source_line = false;
151
152 extern const int length_unit_log; /* This is defined in insn-attrtab.c.  */
153
154 /* Nonzero while outputting an `asm' with operands.
155    This means that inconsistencies are the user's fault, so don't die.
156    The precise value is the insn being output, to pass to error_for_asm.  */
157 rtx this_is_asm_operands;
158
159 /* Number of operands of this insn, for an `asm' with operands.  */
160 static unsigned int insn_noperands;
161
162 /* Compare optimization flag.  */
163
164 static rtx last_ignored_compare = 0;
165
166 /* Assign a unique number to each insn that is output.
167    This can be used to generate unique local labels.  */
168
169 static int insn_counter = 0;
170
171 #ifdef HAVE_cc0
172 /* This variable contains machine-dependent flags (defined in tm.h)
173    set and examined by output routines
174    that describe how to interpret the condition codes properly.  */
175
176 CC_STATUS cc_status;
177
178 /* During output of an insn, this contains a copy of cc_status
179    from before the insn.  */
180
181 CC_STATUS cc_prev_status;
182 #endif
183
184 /* Number of unmatched NOTE_INSN_BLOCK_BEG notes we have seen.  */
185
186 static int block_depth;
187
188 /* Nonzero if have enabled APP processing of our assembler output.  */
189
190 static int app_on;
191
192 /* If we are outputting an insn sequence, this contains the sequence rtx.
193    Zero otherwise.  */
194
195 rtx final_sequence;
196
197 #ifdef ASSEMBLER_DIALECT
198
199 /* Number of the assembler dialect to use, starting at 0.  */
200 static int dialect_number;
201 #endif
202
203 /* Nonnull if the insn currently being emitted was a COND_EXEC pattern.  */
204 rtx current_insn_predicate;
205
206 /* True if printing into -fdump-final-insns= dump.  */   
207 bool final_insns_dump_p;
208
209 #ifdef HAVE_ATTR_length
210 static int asm_insn_count (rtx);
211 #endif
212 static void profile_function (FILE *);
213 static void profile_after_prologue (FILE *);
214 static bool notice_source_line (rtx, bool *);
215 static rtx walk_alter_subreg (rtx *, bool *);
216 static void output_asm_name (void);
217 static void output_alternate_entry_point (FILE *, rtx);
218 static tree get_mem_expr_from_op (rtx, int *);
219 static void output_asm_operand_names (rtx *, int *, int);
220 #ifdef LEAF_REGISTERS
221 static void leaf_renumber_regs (rtx);
222 #endif
223 #ifdef HAVE_cc0
224 static int alter_cond (rtx);
225 #endif
226 #ifndef ADDR_VEC_ALIGN
227 static int final_addr_vec_align (rtx);
228 #endif
229 #ifdef HAVE_ATTR_length
230 static int align_fuzz (rtx, rtx, int, unsigned);
231 #endif
232 \f
233 /* Initialize data in final at the beginning of a compilation.  */
234
235 void
236 init_final (const char *filename ATTRIBUTE_UNUSED)
237 {
238   app_on = 0;
239   final_sequence = 0;
240
241 #ifdef ASSEMBLER_DIALECT
242   dialect_number = ASSEMBLER_DIALECT;
243 #endif
244 }
245
246 /* Default target function prologue and epilogue assembler output.
247
248    If not overridden for epilogue code, then the function body itself
249    contains return instructions wherever needed.  */
250 void
251 default_function_pro_epilogue (FILE *file ATTRIBUTE_UNUSED,
252                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
253 {
254 }
255
256 void
257 default_function_switched_text_sections (FILE *file ATTRIBUTE_UNUSED,
258                                          tree decl ATTRIBUTE_UNUSED,
259                                          bool new_is_cold ATTRIBUTE_UNUSED)
260 {
261 }
262
263 /* Default target hook that outputs nothing to a stream.  */
264 void
265 no_asm_to_stream (FILE *file ATTRIBUTE_UNUSED)
266 {
267 }
268
269 /* Enable APP processing of subsequent output.
270    Used before the output from an `asm' statement.  */
271
272 void
273 app_enable (void)
274 {
275   if (! app_on)
276     {
277       fputs (ASM_APP_ON, asm_out_file);
278       app_on = 1;
279     }
280 }
281
282 /* Disable APP processing of subsequent output.
283    Called from varasm.c before most kinds of output.  */
284
285 void
286 app_disable (void)
287 {
288   if (app_on)
289     {
290       fputs (ASM_APP_OFF, asm_out_file);
291       app_on = 0;
292     }
293 }
294 \f
295 /* Return the number of slots filled in the current
296    delayed branch sequence (we don't count the insn needing the
297    delay slot).   Zero if not in a delayed branch sequence.  */
298
299 #ifdef DELAY_SLOTS
300 int
301 dbr_sequence_length (void)
302 {
303   if (final_sequence != 0)
304     return XVECLEN (final_sequence, 0) - 1;
305   else
306     return 0;
307 }
308 #endif
309 \f
310 /* The next two pages contain routines used to compute the length of an insn
311    and to shorten branches.  */
312
313 /* Arrays for insn lengths, and addresses.  The latter is referenced by
314    `insn_current_length'.  */
315
316 static int *insn_lengths;
317
318 VEC(int,heap) *insn_addresses_;
319
320 /* Max uid for which the above arrays are valid.  */
321 static int insn_lengths_max_uid;
322
323 /* Address of insn being processed.  Used by `insn_current_length'.  */
324 int insn_current_address;
325
326 /* Address of insn being processed in previous iteration.  */
327 int insn_last_address;
328
329 /* known invariant alignment of insn being processed.  */
330 int insn_current_align;
331
332 /* After shorten_branches, for any insn, uid_align[INSN_UID (insn)]
333    gives the next following alignment insn that increases the known
334    alignment, or NULL_RTX if there is no such insn.
335    For any alignment obtained this way, we can again index uid_align with
336    its uid to obtain the next following align that in turn increases the
337    alignment, till we reach NULL_RTX; the sequence obtained this way
338    for each insn we'll call the alignment chain of this insn in the following
339    comments.  */
340
341 struct label_alignment
342 {
343   short alignment;
344   short max_skip;
345 };
346
347 static rtx *uid_align;
348 static int *uid_shuid;
349 static struct label_alignment *label_align;
350
351 /* Indicate that branch shortening hasn't yet been done.  */
352
353 void
354 init_insn_lengths (void)
355 {
356   if (uid_shuid)
357     {
358       free (uid_shuid);
359       uid_shuid = 0;
360     }
361   if (insn_lengths)
362     {
363       free (insn_lengths);
364       insn_lengths = 0;
365       insn_lengths_max_uid = 0;
366     }
367 #ifdef HAVE_ATTR_length
368   INSN_ADDRESSES_FREE ();
369 #endif
370   if (uid_align)
371     {
372       free (uid_align);
373       uid_align = 0;
374     }
375 }
376
377 /* Obtain the current length of an insn.  If branch shortening has been done,
378    get its actual length.  Otherwise, use FALLBACK_FN to calculate the
379    length.  */
380 static inline int
381 get_attr_length_1 (rtx insn ATTRIBUTE_UNUSED,
382                    int (*fallback_fn) (rtx) ATTRIBUTE_UNUSED)
383 {
384 #ifdef HAVE_ATTR_length
385   rtx body;
386   int i;
387   int length = 0;
388
389   if (insn_lengths_max_uid > INSN_UID (insn))
390     return insn_lengths[INSN_UID (insn)];
391   else
392     switch (GET_CODE (insn))
393       {
394       case NOTE:
395       case BARRIER:
396       case CODE_LABEL:
397       case DEBUG_INSN:
398         return 0;
399
400       case CALL_INSN:
401         length = fallback_fn (insn);
402         break;
403
404       case JUMP_INSN:
405         body = PATTERN (insn);
406         if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC)
407           {
408             /* Alignment is machine-dependent and should be handled by
409                ADDR_VEC_ALIGN.  */
410           }
411         else
412           length = fallback_fn (insn);
413         break;
414
415       case INSN:
416         body = PATTERN (insn);
417         if (GET_CODE (body) == USE || GET_CODE (body) == CLOBBER)
418           return 0;
419
420         else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
421           length = asm_insn_count (body) * fallback_fn (insn);
422         else if (GET_CODE (body) == SEQUENCE)
423           for (i = 0; i < XVECLEN (body, 0); i++)
424             length += get_attr_length_1 (XVECEXP (body, 0, i), fallback_fn);
425         else
426           length = fallback_fn (insn);
427         break;
428
429       default:
430         break;
431       }
432
433 #ifdef ADJUST_INSN_LENGTH
434   ADJUST_INSN_LENGTH (insn, length);
435 #endif
436   return length;
437 #else /* not HAVE_ATTR_length */
438   return 0;
439 #define insn_default_length 0
440 #define insn_min_length 0
441 #endif /* not HAVE_ATTR_length */
442 }
443
444 /* Obtain the current length of an insn.  If branch shortening has been done,
445    get its actual length.  Otherwise, get its maximum length.  */
446 int
447 get_attr_length (rtx insn)
448 {
449   return get_attr_length_1 (insn, insn_default_length);
450 }
451
452 /* Obtain the current length of an insn.  If branch shortening has been done,
453    get its actual length.  Otherwise, get its minimum length.  */
454 int
455 get_attr_min_length (rtx insn)
456 {
457   return get_attr_length_1 (insn, insn_min_length);
458 }
459 \f
460 /* Code to handle alignment inside shorten_branches.  */
461
462 /* Here is an explanation how the algorithm in align_fuzz can give
463    proper results:
464
465    Call a sequence of instructions beginning with alignment point X
466    and continuing until the next alignment point `block X'.  When `X'
467    is used in an expression, it means the alignment value of the
468    alignment point.
469
470    Call the distance between the start of the first insn of block X, and
471    the end of the last insn of block X `IX', for the `inner size of X'.
472    This is clearly the sum of the instruction lengths.
473
474    Likewise with the next alignment-delimited block following X, which we
475    shall call block Y.
476
477    Call the distance between the start of the first insn of block X, and
478    the start of the first insn of block Y `OX', for the `outer size of X'.
479
480    The estimated padding is then OX - IX.
481
482    OX can be safely estimated as
483
484            if (X >= Y)
485                    OX = round_up(IX, Y)
486            else
487                    OX = round_up(IX, X) + Y - X
488
489    Clearly est(IX) >= real(IX), because that only depends on the
490    instruction lengths, and those being overestimated is a given.
491
492    Clearly round_up(foo, Z) >= round_up(bar, Z) if foo >= bar, so
493    we needn't worry about that when thinking about OX.
494
495    When X >= Y, the alignment provided by Y adds no uncertainty factor
496    for branch ranges starting before X, so we can just round what we have.
497    But when X < Y, we don't know anything about the, so to speak,
498    `middle bits', so we have to assume the worst when aligning up from an
499    address mod X to one mod Y, which is Y - X.  */
500
501 #ifndef LABEL_ALIGN
502 #define LABEL_ALIGN(LABEL) align_labels_log
503 #endif
504
505 #ifndef LOOP_ALIGN
506 #define LOOP_ALIGN(LABEL) align_loops_log
507 #endif
508
509 #ifndef LABEL_ALIGN_AFTER_BARRIER
510 #define LABEL_ALIGN_AFTER_BARRIER(LABEL) 0
511 #endif
512
513 #ifndef JUMP_ALIGN
514 #define JUMP_ALIGN(LABEL) align_jumps_log
515 #endif
516
517 int
518 default_label_align_after_barrier_max_skip (rtx insn ATTRIBUTE_UNUSED)
519 {
520   return 0;
521 }
522
523 int
524 default_loop_align_max_skip (rtx insn ATTRIBUTE_UNUSED)
525 {
526   return align_loops_max_skip;
527 }
528
529 int
530 default_label_align_max_skip (rtx insn ATTRIBUTE_UNUSED)
531 {
532   return align_labels_max_skip;
533 }
534
535 int
536 default_jump_align_max_skip (rtx insn ATTRIBUTE_UNUSED)
537 {
538   return align_jumps_max_skip;
539 }
540
541 #ifndef ADDR_VEC_ALIGN
542 static int
543 final_addr_vec_align (rtx addr_vec)
544 {
545   int align = GET_MODE_SIZE (GET_MODE (PATTERN (addr_vec)));
546
547   if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT)
548     align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
549   return exact_log2 (align);
550
551 }
552
553 #define ADDR_VEC_ALIGN(ADDR_VEC) final_addr_vec_align (ADDR_VEC)
554 #endif
555
556 #ifndef INSN_LENGTH_ALIGNMENT
557 #define INSN_LENGTH_ALIGNMENT(INSN) length_unit_log
558 #endif
559
560 #define INSN_SHUID(INSN) (uid_shuid[INSN_UID (INSN)])
561
562 static int min_labelno, max_labelno;
563
564 #define LABEL_TO_ALIGNMENT(LABEL) \
565   (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].alignment)
566
567 #define LABEL_TO_MAX_SKIP(LABEL) \
568   (label_align[CODE_LABEL_NUMBER (LABEL) - min_labelno].max_skip)
569
570 /* For the benefit of port specific code do this also as a function.  */
571
572 int
573 label_to_alignment (rtx label)
574 {
575   if (CODE_LABEL_NUMBER (label) <= max_labelno)
576     return LABEL_TO_ALIGNMENT (label);
577   return 0;
578 }
579
580 int
581 label_to_max_skip (rtx label)
582 {
583   if (CODE_LABEL_NUMBER (label) <= max_labelno)
584     return LABEL_TO_MAX_SKIP (label);
585   return 0;
586 }
587
588 #ifdef HAVE_ATTR_length
589 /* The differences in addresses
590    between a branch and its target might grow or shrink depending on
591    the alignment the start insn of the range (the branch for a forward
592    branch or the label for a backward branch) starts out on; if these
593    differences are used naively, they can even oscillate infinitely.
594    We therefore want to compute a 'worst case' address difference that
595    is independent of the alignment the start insn of the range end
596    up on, and that is at least as large as the actual difference.
597    The function align_fuzz calculates the amount we have to add to the
598    naively computed difference, by traversing the part of the alignment
599    chain of the start insn of the range that is in front of the end insn
600    of the range, and considering for each alignment the maximum amount
601    that it might contribute to a size increase.
602
603    For casesi tables, we also want to know worst case minimum amounts of
604    address difference, in case a machine description wants to introduce
605    some common offset that is added to all offsets in a table.
606    For this purpose, align_fuzz with a growth argument of 0 computes the
607    appropriate adjustment.  */
608
609 /* Compute the maximum delta by which the difference of the addresses of
610    START and END might grow / shrink due to a different address for start
611    which changes the size of alignment insns between START and END.
612    KNOWN_ALIGN_LOG is the alignment known for START.
613    GROWTH should be ~0 if the objective is to compute potential code size
614    increase, and 0 if the objective is to compute potential shrink.
615    The return value is undefined for any other value of GROWTH.  */
616
617 static int
618 align_fuzz (rtx start, rtx end, int known_align_log, unsigned int growth)
619 {
620   int uid = INSN_UID (start);
621   rtx align_label;
622   int known_align = 1 << known_align_log;
623   int end_shuid = INSN_SHUID (end);
624   int fuzz = 0;
625
626   for (align_label = uid_align[uid]; align_label; align_label = uid_align[uid])
627     {
628       int align_addr, new_align;
629
630       uid = INSN_UID (align_label);
631       align_addr = INSN_ADDRESSES (uid) - insn_lengths[uid];
632       if (uid_shuid[uid] > end_shuid)
633         break;
634       known_align_log = LABEL_TO_ALIGNMENT (align_label);
635       new_align = 1 << known_align_log;
636       if (new_align < known_align)
637         continue;
638       fuzz += (-align_addr ^ growth) & (new_align - known_align);
639       known_align = new_align;
640     }
641   return fuzz;
642 }
643
644 /* Compute a worst-case reference address of a branch so that it
645    can be safely used in the presence of aligned labels.  Since the
646    size of the branch itself is unknown, the size of the branch is
647    not included in the range.  I.e. for a forward branch, the reference
648    address is the end address of the branch as known from the previous
649    branch shortening pass, minus a value to account for possible size
650    increase due to alignment.  For a backward branch, it is the start
651    address of the branch as known from the current pass, plus a value
652    to account for possible size increase due to alignment.
653    NB.: Therefore, the maximum offset allowed for backward branches needs
654    to exclude the branch size.  */
655
656 int
657 insn_current_reference_address (rtx branch)
658 {
659   rtx dest, seq;
660   int seq_uid;
661
662   if (! INSN_ADDRESSES_SET_P ())
663     return 0;
664
665   seq = NEXT_INSN (PREV_INSN (branch));
666   seq_uid = INSN_UID (seq);
667   if (!JUMP_P (branch))
668     /* This can happen for example on the PA; the objective is to know the
669        offset to address something in front of the start of the function.
670        Thus, we can treat it like a backward branch.
671        We assume here that FUNCTION_BOUNDARY / BITS_PER_UNIT is larger than
672        any alignment we'd encounter, so we skip the call to align_fuzz.  */
673     return insn_current_address;
674   dest = JUMP_LABEL (branch);
675
676   /* BRANCH has no proper alignment chain set, so use SEQ.
677      BRANCH also has no INSN_SHUID.  */
678   if (INSN_SHUID (seq) < INSN_SHUID (dest))
679     {
680       /* Forward branch.  */
681       return (insn_last_address + insn_lengths[seq_uid]
682               - align_fuzz (seq, dest, length_unit_log, ~0));
683     }
684   else
685     {
686       /* Backward branch.  */
687       return (insn_current_address
688               + align_fuzz (dest, seq, length_unit_log, ~0));
689     }
690 }
691 #endif /* HAVE_ATTR_length */
692 \f
693 /* Compute branch alignments based on frequency information in the
694    CFG.  */
695
696 unsigned int
697 compute_alignments (void)
698 {
699   int log, max_skip, max_log;
700   basic_block bb;
701   int freq_max = 0;
702   int freq_threshold = 0;
703
704   if (label_align)
705     {
706       free (label_align);
707       label_align = 0;
708     }
709
710   max_labelno = max_label_num ();
711   min_labelno = get_first_label_num ();
712   label_align = XCNEWVEC (struct label_alignment, max_labelno - min_labelno + 1);
713
714   /* If not optimizing or optimizing for size, don't assign any alignments.  */
715   if (! optimize || optimize_function_for_size_p (cfun))
716     return 0;
717
718   if (dump_file)
719     {
720       dump_flow_info (dump_file, TDF_DETAILS);
721       flow_loops_dump (dump_file, NULL, 1);
722     }
723   loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
724   FOR_EACH_BB (bb)
725     if (bb->frequency > freq_max)
726       freq_max = bb->frequency;
727   freq_threshold = freq_max / PARAM_VALUE (PARAM_ALIGN_THRESHOLD);
728
729   if (dump_file)
730     fprintf(dump_file, "freq_max: %i\n",freq_max);
731   FOR_EACH_BB (bb)
732     {
733       rtx label = BB_HEAD (bb);
734       int fallthru_frequency = 0, branch_frequency = 0, has_fallthru = 0;
735       edge e;
736       edge_iterator ei;
737
738       if (!LABEL_P (label)
739           || optimize_bb_for_size_p (bb))
740         {
741           if (dump_file)
742             fprintf(dump_file, "BB %4i freq %4i loop %2i loop_depth %2i skipped.\n",
743                     bb->index, bb->frequency, bb->loop_father->num, bb->loop_depth);
744           continue;
745         }
746       max_log = LABEL_ALIGN (label);
747       max_skip = targetm.asm_out.label_align_max_skip (label);
748
749       FOR_EACH_EDGE (e, ei, bb->preds)
750         {
751           if (e->flags & EDGE_FALLTHRU)
752             has_fallthru = 1, fallthru_frequency += EDGE_FREQUENCY (e);
753           else
754             branch_frequency += EDGE_FREQUENCY (e);
755         }
756       if (dump_file)
757         {
758           fprintf(dump_file, "BB %4i freq %4i loop %2i loop_depth %2i fall %4i branch %4i",
759                   bb->index, bb->frequency, bb->loop_father->num,
760                   bb->loop_depth,
761                   fallthru_frequency, branch_frequency);
762           if (!bb->loop_father->inner && bb->loop_father->num)
763             fprintf (dump_file, " inner_loop");
764           if (bb->loop_father->header == bb)
765             fprintf (dump_file, " loop_header");
766           fprintf (dump_file, "\n");
767         }
768
769       /* There are two purposes to align block with no fallthru incoming edge:
770          1) to avoid fetch stalls when branch destination is near cache boundary
771          2) to improve cache efficiency in case the previous block is not executed
772             (so it does not need to be in the cache).
773
774          We to catch first case, we align frequently executed blocks.
775          To catch the second, we align blocks that are executed more frequently
776          than the predecessor and the predecessor is likely to not be executed
777          when function is called.  */
778
779       if (!has_fallthru
780           && (branch_frequency > freq_threshold
781               || (bb->frequency > bb->prev_bb->frequency * 10
782                   && (bb->prev_bb->frequency
783                       <= ENTRY_BLOCK_PTR->frequency / 2))))
784         {
785           log = JUMP_ALIGN (label);
786           if (dump_file)
787             fprintf(dump_file, "  jump alignment added.\n");
788           if (max_log < log)
789             {
790               max_log = log;
791               max_skip = targetm.asm_out.jump_align_max_skip (label);
792             }
793         }
794       /* In case block is frequent and reached mostly by non-fallthru edge,
795          align it.  It is most likely a first block of loop.  */
796       if (has_fallthru
797           && optimize_bb_for_speed_p (bb)
798           && branch_frequency + fallthru_frequency > freq_threshold
799           && (branch_frequency
800               > fallthru_frequency * PARAM_VALUE (PARAM_ALIGN_LOOP_ITERATIONS)))
801         {
802           log = LOOP_ALIGN (label);
803           if (dump_file)
804             fprintf(dump_file, "  internal loop alignment added.\n");
805           if (max_log < log)
806             {
807               max_log = log;
808               max_skip = targetm.asm_out.loop_align_max_skip (label);
809             }
810         }
811       LABEL_TO_ALIGNMENT (label) = max_log;
812       LABEL_TO_MAX_SKIP (label) = max_skip;
813     }
814
815   loop_optimizer_finalize ();
816   free_dominance_info (CDI_DOMINATORS);
817   return 0;
818 }
819
820 struct rtl_opt_pass pass_compute_alignments =
821 {
822  {
823   RTL_PASS,
824   "alignments",                         /* name */
825   NULL,                                 /* gate */
826   compute_alignments,                   /* execute */
827   NULL,                                 /* sub */
828   NULL,                                 /* next */
829   0,                                    /* static_pass_number */
830   TV_NONE,                              /* tv_id */
831   0,                                    /* properties_required */
832   0,                                    /* properties_provided */
833   0,                                    /* properties_destroyed */
834   0,                                    /* todo_flags_start */
835   TODO_verify_rtl_sharing
836   | TODO_ggc_collect                    /* todo_flags_finish */
837  }
838 };
839
840 \f
841 /* Make a pass over all insns and compute their actual lengths by shortening
842    any branches of variable length if possible.  */
843
844 /* shorten_branches might be called multiple times:  for example, the SH
845    port splits out-of-range conditional branches in MACHINE_DEPENDENT_REORG.
846    In order to do this, it needs proper length information, which it obtains
847    by calling shorten_branches.  This cannot be collapsed with
848    shorten_branches itself into a single pass unless we also want to integrate
849    reorg.c, since the branch splitting exposes new instructions with delay
850    slots.  */
851
852 void
853 shorten_branches (rtx first ATTRIBUTE_UNUSED)
854 {
855   rtx insn;
856   int max_uid;
857   int i;
858   int max_log;
859   int max_skip;
860 #ifdef HAVE_ATTR_length
861 #define MAX_CODE_ALIGN 16
862   rtx seq;
863   int something_changed = 1;
864   char *varying_length;
865   rtx body;
866   int uid;
867   rtx align_tab[MAX_CODE_ALIGN];
868
869 #endif
870
871   /* Compute maximum UID and allocate label_align / uid_shuid.  */
872   max_uid = get_max_uid ();
873
874   /* Free uid_shuid before reallocating it.  */
875   free (uid_shuid);
876
877   uid_shuid = XNEWVEC (int, max_uid);
878
879   if (max_labelno != max_label_num ())
880     {
881       int old = max_labelno;
882       int n_labels;
883       int n_old_labels;
884
885       max_labelno = max_label_num ();
886
887       n_labels = max_labelno - min_labelno + 1;
888       n_old_labels = old - min_labelno + 1;
889
890       label_align = XRESIZEVEC (struct label_alignment, label_align, n_labels);
891
892       /* Range of labels grows monotonically in the function.  Failing here
893          means that the initialization of array got lost.  */
894       gcc_assert (n_old_labels <= n_labels);
895
896       memset (label_align + n_old_labels, 0,
897               (n_labels - n_old_labels) * sizeof (struct label_alignment));
898     }
899
900   /* Initialize label_align and set up uid_shuid to be strictly
901      monotonically rising with insn order.  */
902   /* We use max_log here to keep track of the maximum alignment we want to
903      impose on the next CODE_LABEL (or the current one if we are processing
904      the CODE_LABEL itself).  */
905
906   max_log = 0;
907   max_skip = 0;
908
909   for (insn = get_insns (), i = 1; insn; insn = NEXT_INSN (insn))
910     {
911       int log;
912
913       INSN_SHUID (insn) = i++;
914       if (INSN_P (insn))
915         continue;
916
917       if (LABEL_P (insn))
918         {
919           rtx next;
920           bool next_is_jumptable;
921
922           /* Merge in alignments computed by compute_alignments.  */
923           log = LABEL_TO_ALIGNMENT (insn);
924           if (max_log < log)
925             {
926               max_log = log;
927               max_skip = LABEL_TO_MAX_SKIP (insn);
928             }
929
930           next = next_nonnote_insn (insn);
931           next_is_jumptable = next && JUMP_TABLE_DATA_P (next);
932           if (!next_is_jumptable)
933             {
934               log = LABEL_ALIGN (insn);
935               if (max_log < log)
936                 {
937                   max_log = log;
938                   max_skip = targetm.asm_out.label_align_max_skip (insn);
939                 }
940             }
941           /* ADDR_VECs only take room if read-only data goes into the text
942              section.  */
943           if ((JUMP_TABLES_IN_TEXT_SECTION
944                || readonly_data_section == text_section)
945               && next_is_jumptable)
946             {
947               log = ADDR_VEC_ALIGN (next);
948               if (max_log < log)
949                 {
950                   max_log = log;
951                   max_skip = targetm.asm_out.label_align_max_skip (insn);
952                 }
953             }
954           LABEL_TO_ALIGNMENT (insn) = max_log;
955           LABEL_TO_MAX_SKIP (insn) = max_skip;
956           max_log = 0;
957           max_skip = 0;
958         }
959       else if (BARRIER_P (insn))
960         {
961           rtx label;
962
963           for (label = insn; label && ! INSN_P (label);
964                label = NEXT_INSN (label))
965             if (LABEL_P (label))
966               {
967                 log = LABEL_ALIGN_AFTER_BARRIER (insn);
968                 if (max_log < log)
969                   {
970                     max_log = log;
971                     max_skip = targetm.asm_out.label_align_after_barrier_max_skip (label);
972                   }
973                 break;
974               }
975         }
976     }
977 #ifdef HAVE_ATTR_length
978
979   /* Allocate the rest of the arrays.  */
980   insn_lengths = XNEWVEC (int, max_uid);
981   insn_lengths_max_uid = max_uid;
982   /* Syntax errors can lead to labels being outside of the main insn stream.
983      Initialize insn_addresses, so that we get reproducible results.  */
984   INSN_ADDRESSES_ALLOC (max_uid);
985
986   varying_length = XCNEWVEC (char, max_uid);
987
988   /* Initialize uid_align.  We scan instructions
989      from end to start, and keep in align_tab[n] the last seen insn
990      that does an alignment of at least n+1, i.e. the successor
991      in the alignment chain for an insn that does / has a known
992      alignment of n.  */
993   uid_align = XCNEWVEC (rtx, max_uid);
994
995   for (i = MAX_CODE_ALIGN; --i >= 0;)
996     align_tab[i] = NULL_RTX;
997   seq = get_last_insn ();
998   for (; seq; seq = PREV_INSN (seq))
999     {
1000       int uid = INSN_UID (seq);
1001       int log;
1002       log = (LABEL_P (seq) ? LABEL_TO_ALIGNMENT (seq) : 0);
1003       uid_align[uid] = align_tab[0];
1004       if (log)
1005         {
1006           /* Found an alignment label.  */
1007           uid_align[uid] = align_tab[log];
1008           for (i = log - 1; i >= 0; i--)
1009             align_tab[i] = seq;
1010         }
1011     }
1012 #ifdef CASE_VECTOR_SHORTEN_MODE
1013   if (optimize)
1014     {
1015       /* Look for ADDR_DIFF_VECs, and initialize their minimum and maximum
1016          label fields.  */
1017
1018       int min_shuid = INSN_SHUID (get_insns ()) - 1;
1019       int max_shuid = INSN_SHUID (get_last_insn ()) + 1;
1020       int rel;
1021
1022       for (insn = first; insn != 0; insn = NEXT_INSN (insn))
1023         {
1024           rtx min_lab = NULL_RTX, max_lab = NULL_RTX, pat;
1025           int len, i, min, max, insn_shuid;
1026           int min_align;
1027           addr_diff_vec_flags flags;
1028
1029           if (!JUMP_P (insn)
1030               || GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
1031             continue;
1032           pat = PATTERN (insn);
1033           len = XVECLEN (pat, 1);
1034           gcc_assert (len > 0);
1035           min_align = MAX_CODE_ALIGN;
1036           for (min = max_shuid, max = min_shuid, i = len - 1; i >= 0; i--)
1037             {
1038               rtx lab = XEXP (XVECEXP (pat, 1, i), 0);
1039               int shuid = INSN_SHUID (lab);
1040               if (shuid < min)
1041                 {
1042                   min = shuid;
1043                   min_lab = lab;
1044                 }
1045               if (shuid > max)
1046                 {
1047                   max = shuid;
1048                   max_lab = lab;
1049                 }
1050               if (min_align > LABEL_TO_ALIGNMENT (lab))
1051                 min_align = LABEL_TO_ALIGNMENT (lab);
1052             }
1053           XEXP (pat, 2) = gen_rtx_LABEL_REF (Pmode, min_lab);
1054           XEXP (pat, 3) = gen_rtx_LABEL_REF (Pmode, max_lab);
1055           insn_shuid = INSN_SHUID (insn);
1056           rel = INSN_SHUID (XEXP (XEXP (pat, 0), 0));
1057           memset (&flags, 0, sizeof (flags));
1058           flags.min_align = min_align;
1059           flags.base_after_vec = rel > insn_shuid;
1060           flags.min_after_vec  = min > insn_shuid;
1061           flags.max_after_vec  = max > insn_shuid;
1062           flags.min_after_base = min > rel;
1063           flags.max_after_base = max > rel;
1064           ADDR_DIFF_VEC_FLAGS (pat) = flags;
1065         }
1066     }
1067 #endif /* CASE_VECTOR_SHORTEN_MODE */
1068
1069   /* Compute initial lengths, addresses, and varying flags for each insn.  */
1070   for (insn_current_address = 0, insn = first;
1071        insn != 0;
1072        insn_current_address += insn_lengths[uid], insn = NEXT_INSN (insn))
1073     {
1074       uid = INSN_UID (insn);
1075
1076       insn_lengths[uid] = 0;
1077
1078       if (LABEL_P (insn))
1079         {
1080           int log = LABEL_TO_ALIGNMENT (insn);
1081           if (log)
1082             {
1083               int align = 1 << log;
1084               int new_address = (insn_current_address + align - 1) & -align;
1085               insn_lengths[uid] = new_address - insn_current_address;
1086             }
1087         }
1088
1089       INSN_ADDRESSES (uid) = insn_current_address + insn_lengths[uid];
1090
1091       if (NOTE_P (insn) || BARRIER_P (insn)
1092           || LABEL_P (insn) || DEBUG_INSN_P(insn))
1093         continue;
1094       if (INSN_DELETED_P (insn))
1095         continue;
1096
1097       body = PATTERN (insn);
1098       if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC)
1099         {
1100           /* This only takes room if read-only data goes into the text
1101              section.  */
1102           if (JUMP_TABLES_IN_TEXT_SECTION
1103               || readonly_data_section == text_section)
1104             insn_lengths[uid] = (XVECLEN (body,
1105                                           GET_CODE (body) == ADDR_DIFF_VEC)
1106                                  * GET_MODE_SIZE (GET_MODE (body)));
1107           /* Alignment is handled by ADDR_VEC_ALIGN.  */
1108         }
1109       else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0)
1110         insn_lengths[uid] = asm_insn_count (body) * insn_default_length (insn);
1111       else if (GET_CODE (body) == SEQUENCE)
1112         {
1113           int i;
1114           int const_delay_slots;
1115 #ifdef DELAY_SLOTS
1116           const_delay_slots = const_num_delay_slots (XVECEXP (body, 0, 0));
1117 #else
1118           const_delay_slots = 0;
1119 #endif
1120           /* Inside a delay slot sequence, we do not do any branch shortening
1121              if the shortening could change the number of delay slots
1122              of the branch.  */
1123           for (i = 0; i < XVECLEN (body, 0); i++)
1124             {
1125               rtx inner_insn = XVECEXP (body, 0, i);
1126               int inner_uid = INSN_UID (inner_insn);
1127               int inner_length;
1128
1129               if (GET_CODE (body) == ASM_INPUT
1130                   || asm_noperands (PATTERN (XVECEXP (body, 0, i))) >= 0)
1131                 inner_length = (asm_insn_count (PATTERN (inner_insn))
1132                                 * insn_default_length (inner_insn));
1133               else
1134                 inner_length = insn_default_length (inner_insn);
1135
1136               insn_lengths[inner_uid] = inner_length;
1137               if (const_delay_slots)
1138                 {
1139                   if ((varying_length[inner_uid]
1140                        = insn_variable_length_p (inner_insn)) != 0)
1141                     varying_length[uid] = 1;
1142                   INSN_ADDRESSES (inner_uid) = (insn_current_address
1143                                                 + insn_lengths[uid]);
1144                 }
1145               else
1146                 varying_length[inner_uid] = 0;
1147               insn_lengths[uid] += inner_length;
1148             }
1149         }
1150       else if (GET_CODE (body) != USE && GET_CODE (body) != CLOBBER)
1151         {
1152           insn_lengths[uid] = insn_default_length (insn);
1153           varying_length[uid] = insn_variable_length_p (insn);
1154         }
1155
1156       /* If needed, do any adjustment.  */
1157 #ifdef ADJUST_INSN_LENGTH
1158       ADJUST_INSN_LENGTH (insn, insn_lengths[uid]);
1159       if (insn_lengths[uid] < 0)
1160         fatal_insn ("negative insn length", insn);
1161 #endif
1162     }
1163
1164   /* Now loop over all the insns finding varying length insns.  For each,
1165      get the current insn length.  If it has changed, reflect the change.
1166      When nothing changes for a full pass, we are done.  */
1167
1168   while (something_changed)
1169     {
1170       something_changed = 0;
1171       insn_current_align = MAX_CODE_ALIGN - 1;
1172       for (insn_current_address = 0, insn = first;
1173            insn != 0;
1174            insn = NEXT_INSN (insn))
1175         {
1176           int new_length;
1177 #ifdef ADJUST_INSN_LENGTH
1178           int tmp_length;
1179 #endif
1180           int length_align;
1181
1182           uid = INSN_UID (insn);
1183
1184           if (LABEL_P (insn))
1185             {
1186               int log = LABEL_TO_ALIGNMENT (insn);
1187               if (log > insn_current_align)
1188                 {
1189                   int align = 1 << log;
1190                   int new_address= (insn_current_address + align - 1) & -align;
1191                   insn_lengths[uid] = new_address - insn_current_address;
1192                   insn_current_align = log;
1193                   insn_current_address = new_address;
1194                 }
1195               else
1196                 insn_lengths[uid] = 0;
1197               INSN_ADDRESSES (uid) = insn_current_address;
1198               continue;
1199             }
1200
1201           length_align = INSN_LENGTH_ALIGNMENT (insn);
1202           if (length_align < insn_current_align)
1203             insn_current_align = length_align;
1204
1205           insn_last_address = INSN_ADDRESSES (uid);
1206           INSN_ADDRESSES (uid) = insn_current_address;
1207
1208 #ifdef CASE_VECTOR_SHORTEN_MODE
1209           if (optimize && JUMP_P (insn)
1210               && GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
1211             {
1212               rtx body = PATTERN (insn);
1213               int old_length = insn_lengths[uid];
1214               rtx rel_lab = XEXP (XEXP (body, 0), 0);
1215               rtx min_lab = XEXP (XEXP (body, 2), 0);
1216               rtx max_lab = XEXP (XEXP (body, 3), 0);
1217               int rel_addr = INSN_ADDRESSES (INSN_UID (rel_lab));
1218               int min_addr = INSN_ADDRESSES (INSN_UID (min_lab));
1219               int max_addr = INSN_ADDRESSES (INSN_UID (max_lab));
1220               rtx prev;
1221               int rel_align = 0;
1222               addr_diff_vec_flags flags;
1223
1224               /* Avoid automatic aggregate initialization.  */
1225               flags = ADDR_DIFF_VEC_FLAGS (body);
1226
1227               /* Try to find a known alignment for rel_lab.  */
1228               for (prev = rel_lab;
1229                    prev
1230                    && ! insn_lengths[INSN_UID (prev)]
1231                    && ! (varying_length[INSN_UID (prev)] & 1);
1232                    prev = PREV_INSN (prev))
1233                 if (varying_length[INSN_UID (prev)] & 2)
1234                   {
1235                     rel_align = LABEL_TO_ALIGNMENT (prev);
1236                     break;
1237                   }
1238
1239               /* See the comment on addr_diff_vec_flags in rtl.h for the
1240                  meaning of the flags values.  base: REL_LAB   vec: INSN  */
1241               /* Anything after INSN has still addresses from the last
1242                  pass; adjust these so that they reflect our current
1243                  estimate for this pass.  */
1244               if (flags.base_after_vec)
1245                 rel_addr += insn_current_address - insn_last_address;
1246               if (flags.min_after_vec)
1247                 min_addr += insn_current_address - insn_last_address;
1248               if (flags.max_after_vec)
1249                 max_addr += insn_current_address - insn_last_address;
1250               /* We want to know the worst case, i.e. lowest possible value
1251                  for the offset of MIN_LAB.  If MIN_LAB is after REL_LAB,
1252                  its offset is positive, and we have to be wary of code shrink;
1253                  otherwise, it is negative, and we have to be vary of code
1254                  size increase.  */
1255               if (flags.min_after_base)
1256                 {
1257                   /* If INSN is between REL_LAB and MIN_LAB, the size
1258                      changes we are about to make can change the alignment
1259                      within the observed offset, therefore we have to break
1260                      it up into two parts that are independent.  */
1261                   if (! flags.base_after_vec && flags.min_after_vec)
1262                     {
1263                       min_addr -= align_fuzz (rel_lab, insn, rel_align, 0);
1264                       min_addr -= align_fuzz (insn, min_lab, 0, 0);
1265                     }
1266                   else
1267                     min_addr -= align_fuzz (rel_lab, min_lab, rel_align, 0);
1268                 }
1269               else
1270                 {
1271                   if (flags.base_after_vec && ! flags.min_after_vec)
1272                     {
1273                       min_addr -= align_fuzz (min_lab, insn, 0, ~0);
1274                       min_addr -= align_fuzz (insn, rel_lab, 0, ~0);
1275                     }
1276                   else
1277                     min_addr -= align_fuzz (min_lab, rel_lab, 0, ~0);
1278                 }
1279               /* Likewise, determine the highest lowest possible value
1280                  for the offset of MAX_LAB.  */
1281               if (flags.max_after_base)
1282                 {
1283                   if (! flags.base_after_vec && flags.max_after_vec)
1284                     {
1285                       max_addr += align_fuzz (rel_lab, insn, rel_align, ~0);
1286                       max_addr += align_fuzz (insn, max_lab, 0, ~0);
1287                     }
1288                   else
1289                     max_addr += align_fuzz (rel_lab, max_lab, rel_align, ~0);
1290                 }
1291               else
1292                 {
1293                   if (flags.base_after_vec && ! flags.max_after_vec)
1294                     {
1295                       max_addr += align_fuzz (max_lab, insn, 0, 0);
1296                       max_addr += align_fuzz (insn, rel_lab, 0, 0);
1297                     }
1298                   else
1299                     max_addr += align_fuzz (max_lab, rel_lab, 0, 0);
1300                 }
1301               PUT_MODE (body, CASE_VECTOR_SHORTEN_MODE (min_addr - rel_addr,
1302                                                         max_addr - rel_addr,
1303                                                         body));
1304               if (JUMP_TABLES_IN_TEXT_SECTION
1305                   || readonly_data_section == text_section)
1306                 {
1307                   insn_lengths[uid]
1308                     = (XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body)));
1309                   insn_current_address += insn_lengths[uid];
1310                   if (insn_lengths[uid] != old_length)
1311                     something_changed = 1;
1312                 }
1313
1314               continue;
1315             }
1316 #endif /* CASE_VECTOR_SHORTEN_MODE */
1317
1318           if (! (varying_length[uid]))
1319             {
1320               if (NONJUMP_INSN_P (insn)
1321                   && GET_CODE (PATTERN (insn)) == SEQUENCE)
1322                 {
1323                   int i;
1324
1325                   body = PATTERN (insn);
1326                   for (i = 0; i < XVECLEN (body, 0); i++)
1327                     {
1328                       rtx inner_insn = XVECEXP (body, 0, i);
1329                       int inner_uid = INSN_UID (inner_insn);
1330
1331                       INSN_ADDRESSES (inner_uid) = insn_current_address;
1332
1333                       insn_current_address += insn_lengths[inner_uid];
1334                     }
1335                 }
1336               else
1337                 insn_current_address += insn_lengths[uid];
1338
1339               continue;
1340             }
1341
1342           if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
1343             {
1344               int i;
1345
1346               body = PATTERN (insn);
1347               new_length = 0;
1348               for (i = 0; i < XVECLEN (body, 0); i++)
1349                 {
1350                   rtx inner_insn = XVECEXP (body, 0, i);
1351                   int inner_uid = INSN_UID (inner_insn);
1352                   int inner_length;
1353
1354                   INSN_ADDRESSES (inner_uid) = insn_current_address;
1355
1356                   /* insn_current_length returns 0 for insns with a
1357                      non-varying length.  */
1358                   if (! varying_length[inner_uid])
1359                     inner_length = insn_lengths[inner_uid];
1360                   else
1361                     inner_length = insn_current_length (inner_insn);
1362
1363                   if (inner_length != insn_lengths[inner_uid])
1364                     {
1365                       insn_lengths[inner_uid] = inner_length;
1366                       something_changed = 1;
1367                     }
1368                   insn_current_address += insn_lengths[inner_uid];
1369                   new_length += inner_length;
1370                 }
1371             }
1372           else
1373             {
1374               new_length = insn_current_length (insn);
1375               insn_current_address += new_length;
1376             }
1377
1378 #ifdef ADJUST_INSN_LENGTH
1379           /* If needed, do any adjustment.  */
1380           tmp_length = new_length;
1381           ADJUST_INSN_LENGTH (insn, new_length);
1382           insn_current_address += (new_length - tmp_length);
1383 #endif
1384
1385           if (new_length != insn_lengths[uid])
1386             {
1387               insn_lengths[uid] = new_length;
1388               something_changed = 1;
1389             }
1390         }
1391       /* For a non-optimizing compile, do only a single pass.  */
1392       if (!optimize)
1393         break;
1394     }
1395
1396   free (varying_length);
1397
1398 #endif /* HAVE_ATTR_length */
1399 }
1400
1401 #ifdef HAVE_ATTR_length
1402 /* Given the body of an INSN known to be generated by an ASM statement, return
1403    the number of machine instructions likely to be generated for this insn.
1404    This is used to compute its length.  */
1405
1406 static int
1407 asm_insn_count (rtx body)
1408 {
1409   const char *templ;
1410
1411   if (GET_CODE (body) == ASM_INPUT)
1412     templ = XSTR (body, 0);
1413   else
1414     templ = decode_asm_operands (body, NULL, NULL, NULL, NULL, NULL);
1415
1416   return asm_str_count (templ);
1417 }
1418 #endif
1419
1420 /* Return the number of machine instructions likely to be generated for the
1421    inline-asm template. */
1422 int
1423 asm_str_count (const char *templ)
1424 {
1425   int count = 1;
1426
1427   if (!*templ)
1428     return 0;
1429
1430   for (; *templ; templ++)
1431     if (IS_ASM_LOGICAL_LINE_SEPARATOR (*templ, templ)
1432         || *templ == '\n')
1433       count++;
1434
1435   return count;
1436 }
1437 \f
1438 /* ??? This is probably the wrong place for these.  */
1439 /* Structure recording the mapping from source file and directory
1440    names at compile time to those to be embedded in debug
1441    information.  */
1442 typedef struct debug_prefix_map
1443 {
1444   const char *old_prefix;
1445   const char *new_prefix;
1446   size_t old_len;
1447   size_t new_len;
1448   struct debug_prefix_map *next;
1449 } debug_prefix_map;
1450
1451 /* Linked list of such structures.  */
1452 debug_prefix_map *debug_prefix_maps;
1453
1454
1455 /* Record a debug file prefix mapping.  ARG is the argument to
1456    -fdebug-prefix-map and must be of the form OLD=NEW.  */
1457
1458 void
1459 add_debug_prefix_map (const char *arg)
1460 {
1461   debug_prefix_map *map;
1462   const char *p;
1463
1464   p = strchr (arg, '=');
1465   if (!p)
1466     {
1467       error ("invalid argument %qs to -fdebug-prefix-map", arg);
1468       return;
1469     }
1470   map = XNEW (debug_prefix_map);
1471   map->old_prefix = xstrndup (arg, p - arg);
1472   map->old_len = p - arg;
1473   p++;
1474   map->new_prefix = xstrdup (p);
1475   map->new_len = strlen (p);
1476   map->next = debug_prefix_maps;
1477   debug_prefix_maps = map;
1478 }
1479
1480 /* Perform user-specified mapping of debug filename prefixes.  Return
1481    the new name corresponding to FILENAME.  */
1482
1483 const char *
1484 remap_debug_filename (const char *filename)
1485 {
1486   debug_prefix_map *map;
1487   char *s;
1488   const char *name;
1489   size_t name_len;
1490
1491   for (map = debug_prefix_maps; map; map = map->next)
1492     if (filename_ncmp (filename, map->old_prefix, map->old_len) == 0)
1493       break;
1494   if (!map)
1495     return filename;
1496   name = filename + map->old_len;
1497   name_len = strlen (name) + 1;
1498   s = (char *) alloca (name_len + map->new_len);
1499   memcpy (s, map->new_prefix, map->new_len);
1500   memcpy (s + map->new_len, name, name_len);
1501   return ggc_strdup (s);
1502 }
1503 \f
1504 /* Return true if DWARF2 debug info can be emitted for DECL.  */
1505
1506 static bool
1507 dwarf2_debug_info_emitted_p (tree decl)
1508 {
1509   if (write_symbols != DWARF2_DEBUG && write_symbols != VMS_AND_DWARF2_DEBUG)
1510     return false;
1511
1512   if (DECL_IGNORED_P (decl))
1513     return false;
1514
1515   return true;
1516 }
1517
1518 /* Output assembler code for the start of a function,
1519    and initialize some of the variables in this file
1520    for the new function.  The label for the function and associated
1521    assembler pseudo-ops have already been output in `assemble_start_function'.
1522
1523    FIRST is the first insn of the rtl for the function being compiled.
1524    FILE is the file to write assembler code to.
1525    OPTIMIZE_P is nonzero if we should eliminate redundant
1526      test and compare insns.  */
1527
1528 void
1529 final_start_function (rtx first ATTRIBUTE_UNUSED, FILE *file,
1530                       int optimize_p ATTRIBUTE_UNUSED)
1531 {
1532   block_depth = 0;
1533
1534   this_is_asm_operands = 0;
1535
1536   last_filename = locator_file (prologue_locator);
1537   last_linenum = locator_line (prologue_locator);
1538   last_discriminator = discriminator = 0;
1539
1540   high_block_linenum = high_function_linenum = last_linenum;
1541
1542   if (!DECL_IGNORED_P (current_function_decl))
1543     debug_hooks->begin_prologue (last_linenum, last_filename);
1544
1545   if (!dwarf2_debug_info_emitted_p (current_function_decl))
1546     dwarf2out_begin_prologue (0, NULL);
1547
1548 #ifdef LEAF_REG_REMAP
1549   if (current_function_uses_only_leaf_regs)
1550     leaf_renumber_regs (first);
1551 #endif
1552
1553   /* The Sun386i and perhaps other machines don't work right
1554      if the profiling code comes after the prologue.  */
1555   if (targetm.profile_before_prologue () && crtl->profile)
1556     profile_function (file);
1557
1558   /* If debugging, assign block numbers to all of the blocks in this
1559      function.  */
1560   if (write_symbols)
1561     {
1562       reemit_insn_block_notes ();
1563       number_blocks (current_function_decl);
1564       /* We never actually put out begin/end notes for the top-level
1565          block in the function.  But, conceptually, that block is
1566          always needed.  */
1567       TREE_ASM_WRITTEN (DECL_INITIAL (current_function_decl)) = 1;
1568     }
1569
1570   if (warn_frame_larger_than
1571     && get_frame_size () > frame_larger_than_size)
1572   {
1573       /* Issue a warning */
1574       warning (OPT_Wframe_larger_than_,
1575                "the frame size of %wd bytes is larger than %wd bytes",
1576                get_frame_size (), frame_larger_than_size);
1577   }
1578
1579   /* First output the function prologue: code to set up the stack frame.  */
1580   targetm.asm_out.function_prologue (file, get_frame_size ());
1581
1582   /* If the machine represents the prologue as RTL, the profiling code must
1583      be emitted when NOTE_INSN_PROLOGUE_END is scanned.  */
1584 #ifdef HAVE_prologue
1585   if (! HAVE_prologue)
1586 #endif
1587     profile_after_prologue (file);
1588 }
1589
1590 static void
1591 profile_after_prologue (FILE *file ATTRIBUTE_UNUSED)
1592 {
1593   if (!targetm.profile_before_prologue () && crtl->profile)
1594     profile_function (file);
1595 }
1596
1597 static void
1598 profile_function (FILE *file ATTRIBUTE_UNUSED)
1599 {
1600 #ifndef NO_PROFILE_COUNTERS
1601 # define NO_PROFILE_COUNTERS    0
1602 #endif
1603 #ifdef ASM_OUTPUT_REG_PUSH
1604   rtx sval = NULL, chain = NULL;
1605
1606   if (cfun->returns_struct)
1607     sval = targetm.calls.struct_value_rtx (TREE_TYPE (current_function_decl),
1608                                            true);
1609   if (cfun->static_chain_decl)
1610     chain = targetm.calls.static_chain (current_function_decl, true);
1611 #endif /* ASM_OUTPUT_REG_PUSH */
1612
1613   if (! NO_PROFILE_COUNTERS)
1614     {
1615       int align = MIN (BIGGEST_ALIGNMENT, LONG_TYPE_SIZE);
1616       switch_to_section (data_section);
1617       ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
1618       targetm.asm_out.internal_label (file, "LP", current_function_funcdef_no);
1619       assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
1620     }
1621
1622   switch_to_section (current_function_section ());
1623
1624 #ifdef ASM_OUTPUT_REG_PUSH
1625   if (sval && REG_P (sval))
1626     ASM_OUTPUT_REG_PUSH (file, REGNO (sval));
1627   if (chain && REG_P (chain))
1628     ASM_OUTPUT_REG_PUSH (file, REGNO (chain));
1629 #endif
1630
1631   FUNCTION_PROFILER (file, current_function_funcdef_no);
1632
1633 #ifdef ASM_OUTPUT_REG_PUSH
1634   if (chain && REG_P (chain))
1635     ASM_OUTPUT_REG_POP (file, REGNO (chain));
1636   if (sval && REG_P (sval))
1637     ASM_OUTPUT_REG_POP (file, REGNO (sval));
1638 #endif
1639 }
1640
1641 /* Output assembler code for the end of a function.
1642    For clarity, args are same as those of `final_start_function'
1643    even though not all of them are needed.  */
1644
1645 void
1646 final_end_function (void)
1647 {
1648   app_disable ();
1649
1650   if (!DECL_IGNORED_P (current_function_decl))
1651     debug_hooks->end_function (high_function_linenum);
1652
1653   /* Finally, output the function epilogue:
1654      code to restore the stack frame and return to the caller.  */
1655   targetm.asm_out.function_epilogue (asm_out_file, get_frame_size ());
1656
1657   /* And debug output.  */
1658   if (!DECL_IGNORED_P (current_function_decl))
1659     debug_hooks->end_epilogue (last_linenum, last_filename);
1660
1661   if (!dwarf2_debug_info_emitted_p (current_function_decl)
1662       && dwarf2out_do_frame ())
1663     dwarf2out_end_epilogue (last_linenum, last_filename);
1664 }
1665 \f
1666
1667 /* Dumper helper for basic block information. FILE is the assembly
1668    output file, and INSN is the instruction being emitted.  */
1669
1670 static void
1671 dump_basic_block_info (FILE *file, rtx insn, basic_block *start_to_bb,
1672                        basic_block *end_to_bb, int bb_map_size, int *bb_seqn)
1673 {
1674   basic_block bb;
1675
1676   if (!flag_debug_asm)
1677     return;
1678
1679   if (INSN_UID (insn) < bb_map_size
1680       && (bb = start_to_bb[INSN_UID (insn)]) != NULL)
1681     {
1682       edge e;
1683       edge_iterator ei;
1684
1685       fprintf (file, "%s BLOCK %d", ASM_COMMENT_START, bb->index);
1686       if (bb->frequency)
1687         fprintf (file, " freq:%d", bb->frequency);
1688       if (bb->count)
1689         fprintf (file, " count:" HOST_WIDEST_INT_PRINT_DEC,
1690                  bb->count);
1691       fprintf (file, " seq:%d", (*bb_seqn)++);
1692       fprintf (file, "\n%s PRED:", ASM_COMMENT_START);
1693       FOR_EACH_EDGE (e, ei, bb->preds)
1694         {
1695           dump_edge_info (file, e, 0);
1696         }
1697       fprintf (file, "\n");
1698     }
1699   if (INSN_UID (insn) < bb_map_size
1700       && (bb = end_to_bb[INSN_UID (insn)]) != NULL)
1701     {
1702       edge e;
1703       edge_iterator ei;
1704
1705       fprintf (asm_out_file, "%s SUCC:", ASM_COMMENT_START);
1706       FOR_EACH_EDGE (e, ei, bb->succs)
1707        {
1708          dump_edge_info (asm_out_file, e, 1);
1709        }
1710       fprintf (file, "\n");
1711     }
1712 }
1713
1714 /* Output assembler code for some insns: all or part of a function.
1715    For description of args, see `final_start_function', above.  */
1716
1717 void
1718 final (rtx first, FILE *file, int optimize_p)
1719 {
1720   rtx insn, next;
1721   int max_uid = 0;
1722   int seen = 0;
1723
1724   /* Used for -dA dump.  */
1725   basic_block *start_to_bb = NULL;
1726   basic_block *end_to_bb = NULL;
1727   int bb_map_size = 0;
1728   int bb_seqn = 0;
1729
1730   last_ignored_compare = 0;
1731
1732   for (insn = first; insn; insn = NEXT_INSN (insn))
1733     {
1734       if (INSN_UID (insn) > max_uid)       /* Find largest UID.  */
1735         max_uid = INSN_UID (insn);
1736 #ifdef HAVE_cc0
1737       /* If CC tracking across branches is enabled, record the insn which
1738          jumps to each branch only reached from one place.  */
1739       if (optimize_p && JUMP_P (insn))
1740         {
1741           rtx lab = JUMP_LABEL (insn);
1742           if (lab && LABEL_P (lab) && LABEL_NUSES (lab) == 1)
1743             {
1744               LABEL_REFS (lab) = insn;
1745             }
1746         }
1747 #endif
1748     }
1749
1750   init_recog ();
1751
1752   CC_STATUS_INIT;
1753
1754   if (flag_debug_asm)
1755     {
1756       basic_block bb;
1757
1758       bb_map_size = get_max_uid () + 1;
1759       start_to_bb = XCNEWVEC (basic_block, bb_map_size);
1760       end_to_bb = XCNEWVEC (basic_block, bb_map_size);
1761
1762       FOR_EACH_BB_REVERSE (bb)
1763         {
1764           start_to_bb[INSN_UID (BB_HEAD (bb))] = bb;
1765           end_to_bb[INSN_UID (BB_END (bb))] = bb;
1766         }
1767     }
1768
1769   /* Output the insns.  */
1770   for (insn = first; insn;)
1771     {
1772 #ifdef HAVE_ATTR_length
1773       if ((unsigned) INSN_UID (insn) >= INSN_ADDRESSES_SIZE ())
1774         {
1775           /* This can be triggered by bugs elsewhere in the compiler if
1776              new insns are created after init_insn_lengths is called.  */
1777           gcc_assert (NOTE_P (insn));
1778           insn_current_address = -1;
1779         }
1780       else
1781         insn_current_address = INSN_ADDRESSES (INSN_UID (insn));
1782 #endif /* HAVE_ATTR_length */
1783
1784       dump_basic_block_info (file, insn, start_to_bb, end_to_bb,
1785                              bb_map_size, &bb_seqn);
1786       insn = final_scan_insn (insn, file, optimize_p, 0, &seen);
1787     }
1788
1789   if (flag_debug_asm)
1790     {
1791       free (start_to_bb);
1792       free (end_to_bb);
1793     }
1794
1795   /* Remove CFI notes, to avoid compare-debug failures.  */
1796   for (insn = first; insn; insn = next)
1797     {
1798       next = NEXT_INSN (insn);
1799       if (NOTE_P (insn)
1800           && (NOTE_KIND (insn) == NOTE_INSN_CFI
1801               || NOTE_KIND (insn) == NOTE_INSN_CFI_LABEL))
1802         delete_insn (insn);
1803     }
1804 }
1805 \f
1806 const char *
1807 get_insn_template (int code, rtx insn)
1808 {
1809   switch (insn_data[code].output_format)
1810     {
1811     case INSN_OUTPUT_FORMAT_SINGLE:
1812       return insn_data[code].output.single;
1813     case INSN_OUTPUT_FORMAT_MULTI:
1814       return insn_data[code].output.multi[which_alternative];
1815     case INSN_OUTPUT_FORMAT_FUNCTION:
1816       gcc_assert (insn);
1817       return (*insn_data[code].output.function) (recog_data.operand, insn);
1818
1819     default:
1820       gcc_unreachable ();
1821     }
1822 }
1823
1824 /* Emit the appropriate declaration for an alternate-entry-point
1825    symbol represented by INSN, to FILE.  INSN is a CODE_LABEL with
1826    LABEL_KIND != LABEL_NORMAL.
1827
1828    The case fall-through in this function is intentional.  */
1829 static void
1830 output_alternate_entry_point (FILE *file, rtx insn)
1831 {
1832   const char *name = LABEL_NAME (insn);
1833
1834   switch (LABEL_KIND (insn))
1835     {
1836     case LABEL_WEAK_ENTRY:
1837 #ifdef ASM_WEAKEN_LABEL
1838       ASM_WEAKEN_LABEL (file, name);
1839 #endif
1840     case LABEL_GLOBAL_ENTRY:
1841       targetm.asm_out.globalize_label (file, name);
1842     case LABEL_STATIC_ENTRY:
1843 #ifdef ASM_OUTPUT_TYPE_DIRECTIVE
1844       ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
1845 #endif
1846       ASM_OUTPUT_LABEL (file, name);
1847       break;
1848
1849     case LABEL_NORMAL:
1850     default:
1851       gcc_unreachable ();
1852     }
1853 }
1854
1855 /* Given a CALL_INSN, find and return the nested CALL. */
1856 static rtx
1857 call_from_call_insn (rtx insn)
1858 {
1859   rtx x;
1860   gcc_assert (CALL_P (insn));
1861   x = PATTERN (insn);
1862
1863   while (GET_CODE (x) != CALL)
1864     {
1865       switch (GET_CODE (x))
1866         {
1867         default:
1868           gcc_unreachable ();
1869         case COND_EXEC:
1870           x = COND_EXEC_CODE (x);
1871           break;
1872         case PARALLEL:
1873           x = XVECEXP (x, 0, 0);
1874           break;
1875         case SET:
1876           x = XEXP (x, 1);
1877           break;
1878         }
1879     }
1880   return x;
1881 }
1882
1883 /* The final scan for one insn, INSN.
1884    Args are same as in `final', except that INSN
1885    is the insn being scanned.
1886    Value returned is the next insn to be scanned.
1887
1888    NOPEEPHOLES is the flag to disallow peephole processing (currently
1889    used for within delayed branch sequence output).
1890
1891    SEEN is used to track the end of the prologue, for emitting
1892    debug information.  We force the emission of a line note after
1893    both NOTE_INSN_PROLOGUE_END and NOTE_INSN_FUNCTION_BEG, or
1894    at the beginning of the second basic block, whichever comes
1895    first.  */
1896
1897 rtx
1898 final_scan_insn (rtx insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
1899                  int nopeepholes ATTRIBUTE_UNUSED, int *seen)
1900 {
1901 #ifdef HAVE_cc0
1902   rtx set;
1903 #endif
1904   rtx next;
1905
1906   insn_counter++;
1907
1908   /* Ignore deleted insns.  These can occur when we split insns (due to a
1909      template of "#") while not optimizing.  */
1910   if (INSN_DELETED_P (insn))
1911     return NEXT_INSN (insn);
1912
1913   switch (GET_CODE (insn))
1914     {
1915     case NOTE:
1916       switch (NOTE_KIND (insn))
1917         {
1918         case NOTE_INSN_DELETED:
1919           break;
1920
1921         case NOTE_INSN_SWITCH_TEXT_SECTIONS:
1922           in_cold_section_p = !in_cold_section_p;
1923
1924           if (dwarf2out_do_frame ())
1925             dwarf2out_switch_text_section ();
1926           else if (!DECL_IGNORED_P (current_function_decl))
1927             debug_hooks->switch_text_section ();
1928
1929           switch_to_section (current_function_section ());
1930           targetm.asm_out.function_switched_text_sections (asm_out_file,
1931                                                            current_function_decl,
1932                                                            in_cold_section_p);
1933           break;
1934
1935         case NOTE_INSN_BASIC_BLOCK:
1936           if (targetm.asm_out.unwind_emit)
1937             targetm.asm_out.unwind_emit (asm_out_file, insn);
1938
1939           if ((*seen & (SEEN_EMITTED | SEEN_BB)) == SEEN_BB)
1940             {
1941               *seen |= SEEN_EMITTED;
1942               force_source_line = true;
1943             }
1944           else
1945             *seen |= SEEN_BB;
1946
1947           discriminator = NOTE_BASIC_BLOCK (insn)->discriminator;
1948
1949           break;
1950
1951         case NOTE_INSN_EH_REGION_BEG:
1952           ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHB",
1953                                   NOTE_EH_HANDLER (insn));
1954           break;
1955
1956         case NOTE_INSN_EH_REGION_END:
1957           ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LEHE",
1958                                   NOTE_EH_HANDLER (insn));
1959           break;
1960
1961         case NOTE_INSN_PROLOGUE_END:
1962           targetm.asm_out.function_end_prologue (file);
1963           profile_after_prologue (file);
1964
1965           if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
1966             {
1967               *seen |= SEEN_EMITTED;
1968               force_source_line = true;
1969             }
1970           else
1971             *seen |= SEEN_NOTE;
1972
1973           break;
1974
1975         case NOTE_INSN_EPILOGUE_BEG:
1976           (*debug_hooks->begin_epilogue) (last_linenum, last_filename);
1977           targetm.asm_out.function_begin_epilogue (file);
1978           break;
1979
1980         case NOTE_INSN_CFI:
1981           dwarf2out_emit_cfi (NOTE_CFI (insn));
1982           break;
1983
1984         case NOTE_INSN_CFI_LABEL:
1985           ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LCFI",
1986                                   NOTE_LABEL_NUMBER (insn));
1987           break;
1988
1989         case NOTE_INSN_FUNCTION_BEG:
1990           app_disable ();
1991           if (!DECL_IGNORED_P (current_function_decl))
1992             debug_hooks->end_prologue (last_linenum, last_filename);
1993
1994           if ((*seen & (SEEN_EMITTED | SEEN_NOTE)) == SEEN_NOTE)
1995             {
1996               *seen |= SEEN_EMITTED;
1997               force_source_line = true;
1998             }
1999           else
2000             *seen |= SEEN_NOTE;
2001
2002           break;
2003
2004         case NOTE_INSN_BLOCK_BEG:
2005           if (debug_info_level == DINFO_LEVEL_NORMAL
2006               || debug_info_level == DINFO_LEVEL_VERBOSE
2007               || write_symbols == DWARF2_DEBUG
2008               || write_symbols == VMS_AND_DWARF2_DEBUG
2009               || write_symbols == VMS_DEBUG)
2010             {
2011               int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
2012
2013               app_disable ();
2014               ++block_depth;
2015               high_block_linenum = last_linenum;
2016
2017               /* Output debugging info about the symbol-block beginning.  */
2018               if (!DECL_IGNORED_P (current_function_decl))
2019                 debug_hooks->begin_block (last_linenum, n);
2020
2021               /* Mark this block as output.  */
2022               TREE_ASM_WRITTEN (NOTE_BLOCK (insn)) = 1;
2023             }
2024           if (write_symbols == DBX_DEBUG
2025               || write_symbols == SDB_DEBUG)
2026             {
2027               location_t *locus_ptr
2028                 = block_nonartificial_location (NOTE_BLOCK (insn));
2029
2030               if (locus_ptr != NULL)
2031                 {
2032                   override_filename = LOCATION_FILE (*locus_ptr);
2033                   override_linenum = LOCATION_LINE (*locus_ptr);
2034                 }
2035             }
2036           break;
2037
2038         case NOTE_INSN_BLOCK_END:
2039           if (debug_info_level == DINFO_LEVEL_NORMAL
2040               || debug_info_level == DINFO_LEVEL_VERBOSE
2041               || write_symbols == DWARF2_DEBUG
2042               || write_symbols == VMS_AND_DWARF2_DEBUG
2043               || write_symbols == VMS_DEBUG)
2044             {
2045               int n = BLOCK_NUMBER (NOTE_BLOCK (insn));
2046
2047               app_disable ();
2048
2049               /* End of a symbol-block.  */
2050               --block_depth;
2051               gcc_assert (block_depth >= 0);
2052
2053               if (!DECL_IGNORED_P (current_function_decl))
2054                 debug_hooks->end_block (high_block_linenum, n);
2055             }
2056           if (write_symbols == DBX_DEBUG
2057               || write_symbols == SDB_DEBUG)
2058             {
2059               tree outer_block = BLOCK_SUPERCONTEXT (NOTE_BLOCK (insn));
2060               location_t *locus_ptr
2061                 = block_nonartificial_location (outer_block);
2062
2063               if (locus_ptr != NULL)
2064                 {
2065                   override_filename = LOCATION_FILE (*locus_ptr);
2066                   override_linenum = LOCATION_LINE (*locus_ptr);
2067                 }
2068               else
2069                 {
2070                   override_filename = NULL;
2071                   override_linenum = 0;
2072                 }
2073             }
2074           break;
2075
2076         case NOTE_INSN_DELETED_LABEL:
2077           /* Emit the label.  We may have deleted the CODE_LABEL because
2078              the label could be proved to be unreachable, though still
2079              referenced (in the form of having its address taken.  */
2080           ASM_OUTPUT_DEBUG_LABEL (file, "L", CODE_LABEL_NUMBER (insn));
2081           break;
2082
2083         case NOTE_INSN_DELETED_DEBUG_LABEL:
2084           /* Similarly, but need to use different namespace for it.  */
2085           if (CODE_LABEL_NUMBER (insn) != -1)
2086             ASM_OUTPUT_DEBUG_LABEL (file, "LDL", CODE_LABEL_NUMBER (insn));
2087           break;
2088
2089         case NOTE_INSN_VAR_LOCATION:
2090         case NOTE_INSN_CALL_ARG_LOCATION:
2091           if (!DECL_IGNORED_P (current_function_decl))
2092             debug_hooks->var_location (insn);
2093           break;
2094
2095         default:
2096           gcc_unreachable ();
2097           break;
2098         }
2099       break;
2100
2101     case BARRIER:
2102       break;
2103
2104     case CODE_LABEL:
2105       /* The target port might emit labels in the output function for
2106          some insn, e.g. sh.c output_branchy_insn.  */
2107       if (CODE_LABEL_NUMBER (insn) <= max_labelno)
2108         {
2109           int align = LABEL_TO_ALIGNMENT (insn);
2110 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
2111           int max_skip = LABEL_TO_MAX_SKIP (insn);
2112 #endif
2113
2114           if (align && NEXT_INSN (insn))
2115             {
2116 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
2117               ASM_OUTPUT_MAX_SKIP_ALIGN (file, align, max_skip);
2118 #else
2119 #ifdef ASM_OUTPUT_ALIGN_WITH_NOP
2120               ASM_OUTPUT_ALIGN_WITH_NOP (file, align);
2121 #else
2122               ASM_OUTPUT_ALIGN (file, align);
2123 #endif
2124 #endif
2125             }
2126         }
2127       CC_STATUS_INIT;
2128
2129       if (!DECL_IGNORED_P (current_function_decl) && LABEL_NAME (insn))
2130         debug_hooks->label (insn);
2131
2132       app_disable ();
2133
2134       next = next_nonnote_insn (insn);
2135       /* If this label is followed by a jump-table, make sure we put
2136          the label in the read-only section.  Also possibly write the
2137          label and jump table together.  */
2138       if (next != 0 && JUMP_TABLE_DATA_P (next))
2139         {
2140 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
2141           /* In this case, the case vector is being moved by the
2142              target, so don't output the label at all.  Leave that
2143              to the back end macros.  */
2144 #else
2145           if (! JUMP_TABLES_IN_TEXT_SECTION)
2146             {
2147               int log_align;
2148
2149               switch_to_section (targetm.asm_out.function_rodata_section
2150                                  (current_function_decl));
2151
2152 #ifdef ADDR_VEC_ALIGN
2153               log_align = ADDR_VEC_ALIGN (next);
2154 #else
2155               log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT);
2156 #endif
2157               ASM_OUTPUT_ALIGN (file, log_align);
2158             }
2159           else
2160             switch_to_section (current_function_section ());
2161
2162 #ifdef ASM_OUTPUT_CASE_LABEL
2163           ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
2164                                  next);
2165 #else
2166           targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
2167 #endif
2168 #endif
2169           break;
2170         }
2171       if (LABEL_ALT_ENTRY_P (insn))
2172         output_alternate_entry_point (file, insn);
2173       else
2174         targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
2175       break;
2176
2177     default:
2178       {
2179         rtx body = PATTERN (insn);
2180         int insn_code_number;
2181         const char *templ;
2182         bool is_stmt;
2183
2184         /* Reset this early so it is correct for ASM statements.  */
2185         current_insn_predicate = NULL_RTX;
2186
2187         /* An INSN, JUMP_INSN or CALL_INSN.
2188            First check for special kinds that recog doesn't recognize.  */
2189
2190         if (GET_CODE (body) == USE /* These are just declarations.  */
2191             || GET_CODE (body) == CLOBBER)
2192           break;
2193
2194 #ifdef HAVE_cc0
2195         {
2196           /* If there is a REG_CC_SETTER note on this insn, it means that
2197              the setting of the condition code was done in the delay slot
2198              of the insn that branched here.  So recover the cc status
2199              from the insn that set it.  */
2200
2201           rtx note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2202           if (note)
2203             {
2204               NOTICE_UPDATE_CC (PATTERN (XEXP (note, 0)), XEXP (note, 0));
2205               cc_prev_status = cc_status;
2206             }
2207         }
2208 #endif
2209
2210         /* Detect insns that are really jump-tables
2211            and output them as such.  */
2212
2213         if (GET_CODE (body) == ADDR_VEC || GET_CODE (body) == ADDR_DIFF_VEC)
2214           {
2215 #if !(defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC))
2216             int vlen, idx;
2217 #endif
2218
2219             if (! JUMP_TABLES_IN_TEXT_SECTION)
2220               switch_to_section (targetm.asm_out.function_rodata_section
2221                                  (current_function_decl));
2222             else
2223               switch_to_section (current_function_section ());
2224
2225             app_disable ();
2226
2227 #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
2228             if (GET_CODE (body) == ADDR_VEC)
2229               {
2230 #ifdef ASM_OUTPUT_ADDR_VEC
2231                 ASM_OUTPUT_ADDR_VEC (PREV_INSN (insn), body);
2232 #else
2233                 gcc_unreachable ();
2234 #endif
2235               }
2236             else
2237               {
2238 #ifdef ASM_OUTPUT_ADDR_DIFF_VEC
2239                 ASM_OUTPUT_ADDR_DIFF_VEC (PREV_INSN (insn), body);
2240 #else
2241                 gcc_unreachable ();
2242 #endif
2243               }
2244 #else
2245             vlen = XVECLEN (body, GET_CODE (body) == ADDR_DIFF_VEC);
2246             for (idx = 0; idx < vlen; idx++)
2247               {
2248                 if (GET_CODE (body) == ADDR_VEC)
2249                   {
2250 #ifdef ASM_OUTPUT_ADDR_VEC_ELT
2251                     ASM_OUTPUT_ADDR_VEC_ELT
2252                       (file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
2253 #else
2254                     gcc_unreachable ();
2255 #endif
2256                   }
2257                 else
2258                   {
2259 #ifdef ASM_OUTPUT_ADDR_DIFF_ELT
2260                     ASM_OUTPUT_ADDR_DIFF_ELT
2261                       (file,
2262                        body,
2263                        CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
2264                        CODE_LABEL_NUMBER (XEXP (XEXP (body, 0), 0)));
2265 #else
2266                     gcc_unreachable ();
2267 #endif
2268                   }
2269               }
2270 #ifdef ASM_OUTPUT_CASE_END
2271             ASM_OUTPUT_CASE_END (file,
2272                                  CODE_LABEL_NUMBER (PREV_INSN (insn)),
2273                                  insn);
2274 #endif
2275 #endif
2276
2277             switch_to_section (current_function_section ());
2278
2279             break;
2280           }
2281         /* Output this line note if it is the first or the last line
2282            note in a row.  */
2283         if (!DECL_IGNORED_P (current_function_decl)
2284             && notice_source_line (insn, &is_stmt))
2285           (*debug_hooks->source_line) (last_linenum, last_filename,
2286                                        last_discriminator, is_stmt);
2287
2288         if (GET_CODE (body) == ASM_INPUT)
2289           {
2290             const char *string = XSTR (body, 0);
2291
2292             /* There's no telling what that did to the condition codes.  */
2293             CC_STATUS_INIT;
2294
2295             if (string[0])
2296               {
2297                 expanded_location loc;
2298
2299                 app_enable ();
2300                 loc = expand_location (ASM_INPUT_SOURCE_LOCATION (body));
2301                 if (*loc.file && loc.line)
2302                   fprintf (asm_out_file, "%s %i \"%s\" 1\n",
2303                            ASM_COMMENT_START, loc.line, loc.file);
2304                 fprintf (asm_out_file, "\t%s\n", string);
2305 #if HAVE_AS_LINE_ZERO
2306                 if (*loc.file && loc.line)
2307                   fprintf (asm_out_file, "%s 0 \"\" 2\n", ASM_COMMENT_START);
2308 #endif
2309               }
2310             break;
2311           }
2312
2313         /* Detect `asm' construct with operands.  */
2314         if (asm_noperands (body) >= 0)
2315           {
2316             unsigned int noperands = asm_noperands (body);
2317             rtx *ops = XALLOCAVEC (rtx, noperands);
2318             const char *string;
2319             location_t loc;
2320             expanded_location expanded;
2321
2322             /* There's no telling what that did to the condition codes.  */
2323             CC_STATUS_INIT;
2324
2325             /* Get out the operand values.  */
2326             string = decode_asm_operands (body, ops, NULL, NULL, NULL, &loc);
2327             /* Inhibit dying on what would otherwise be compiler bugs.  */
2328             insn_noperands = noperands;
2329             this_is_asm_operands = insn;
2330             expanded = expand_location (loc);
2331
2332 #ifdef FINAL_PRESCAN_INSN
2333             FINAL_PRESCAN_INSN (insn, ops, insn_noperands);
2334 #endif
2335
2336             /* Output the insn using them.  */
2337             if (string[0])
2338               {
2339                 app_enable ();
2340                 if (expanded.file && expanded.line)
2341                   fprintf (asm_out_file, "%s %i \"%s\" 1\n",
2342                            ASM_COMMENT_START, expanded.line, expanded.file);
2343                 output_asm_insn (string, ops);
2344 #if HAVE_AS_LINE_ZERO
2345                 if (expanded.file && expanded.line)
2346                   fprintf (asm_out_file, "%s 0 \"\" 2\n", ASM_COMMENT_START);
2347 #endif
2348               }
2349
2350             if (targetm.asm_out.final_postscan_insn)
2351               targetm.asm_out.final_postscan_insn (file, insn, ops,
2352                                                    insn_noperands);
2353
2354             this_is_asm_operands = 0;
2355             break;
2356           }
2357
2358         app_disable ();
2359
2360         if (GET_CODE (body) == SEQUENCE)
2361           {
2362             /* A delayed-branch sequence */
2363             int i;
2364
2365             final_sequence = body;
2366
2367             /* The first insn in this SEQUENCE might be a JUMP_INSN that will
2368                force the restoration of a comparison that was previously
2369                thought unnecessary.  If that happens, cancel this sequence
2370                and cause that insn to be restored.  */
2371
2372             next = final_scan_insn (XVECEXP (body, 0, 0), file, 0, 1, seen);
2373             if (next != XVECEXP (body, 0, 1))
2374               {
2375                 final_sequence = 0;
2376                 return next;
2377               }
2378
2379             for (i = 1; i < XVECLEN (body, 0); i++)
2380               {
2381                 rtx insn = XVECEXP (body, 0, i);
2382                 rtx next = NEXT_INSN (insn);
2383                 /* We loop in case any instruction in a delay slot gets
2384                    split.  */
2385                 do
2386                   insn = final_scan_insn (insn, file, 0, 1, seen);
2387                 while (insn != next);
2388               }
2389 #ifdef DBR_OUTPUT_SEQEND
2390             DBR_OUTPUT_SEQEND (file);
2391 #endif
2392             final_sequence = 0;
2393
2394             /* If the insn requiring the delay slot was a CALL_INSN, the
2395                insns in the delay slot are actually executed before the
2396                called function.  Hence we don't preserve any CC-setting
2397                actions in these insns and the CC must be marked as being
2398                clobbered by the function.  */
2399             if (CALL_P (XVECEXP (body, 0, 0)))
2400               {
2401                 CC_STATUS_INIT;
2402               }
2403             break;
2404           }
2405
2406         /* We have a real machine instruction as rtl.  */
2407
2408         body = PATTERN (insn);
2409
2410 #ifdef HAVE_cc0
2411         set = single_set (insn);
2412
2413         /* Check for redundant test and compare instructions
2414            (when the condition codes are already set up as desired).
2415            This is done only when optimizing; if not optimizing,
2416            it should be possible for the user to alter a variable
2417            with the debugger in between statements
2418            and the next statement should reexamine the variable
2419            to compute the condition codes.  */
2420
2421         if (optimize_p)
2422           {
2423             if (set
2424                 && GET_CODE (SET_DEST (set)) == CC0
2425                 && insn != last_ignored_compare)
2426               {
2427                 rtx src1, src2;
2428                 if (GET_CODE (SET_SRC (set)) == SUBREG)
2429                   SET_SRC (set) = alter_subreg (&SET_SRC (set));
2430
2431                 src1 = SET_SRC (set);
2432                 src2 = NULL_RTX;
2433                 if (GET_CODE (SET_SRC (set)) == COMPARE)
2434                   {
2435                     if (GET_CODE (XEXP (SET_SRC (set), 0)) == SUBREG)
2436                       XEXP (SET_SRC (set), 0)
2437                         = alter_subreg (&XEXP (SET_SRC (set), 0));
2438                     if (GET_CODE (XEXP (SET_SRC (set), 1)) == SUBREG)
2439                       XEXP (SET_SRC (set), 1)
2440                         = alter_subreg (&XEXP (SET_SRC (set), 1));
2441                     if (XEXP (SET_SRC (set), 1)
2442                         == CONST0_RTX (GET_MODE (XEXP (SET_SRC (set), 0))))
2443                       src2 = XEXP (SET_SRC (set), 0);
2444                   }
2445                 if ((cc_status.value1 != 0
2446                      && rtx_equal_p (src1, cc_status.value1))
2447                     || (cc_status.value2 != 0
2448                         && rtx_equal_p (src1, cc_status.value2))
2449                     || (src2 != 0 && cc_status.value1 != 0
2450                         && rtx_equal_p (src2, cc_status.value1))
2451                     || (src2 != 0 && cc_status.value2 != 0
2452                         && rtx_equal_p (src2, cc_status.value2)))
2453                   {
2454                     /* Don't delete insn if it has an addressing side-effect.  */
2455                     if (! FIND_REG_INC_NOTE (insn, NULL_RTX)
2456                         /* or if anything in it is volatile.  */
2457                         && ! volatile_refs_p (PATTERN (insn)))
2458                       {
2459                         /* We don't really delete the insn; just ignore it.  */
2460                         last_ignored_compare = insn;
2461                         break;
2462                       }
2463                   }
2464               }
2465           }
2466
2467         /* If this is a conditional branch, maybe modify it
2468            if the cc's are in a nonstandard state
2469            so that it accomplishes the same thing that it would
2470            do straightforwardly if the cc's were set up normally.  */
2471
2472         if (cc_status.flags != 0
2473             && JUMP_P (insn)
2474             && GET_CODE (body) == SET
2475             && SET_DEST (body) == pc_rtx
2476             && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE
2477             && COMPARISON_P (XEXP (SET_SRC (body), 0))
2478             && XEXP (XEXP (SET_SRC (body), 0), 0) == cc0_rtx)
2479           {
2480             /* This function may alter the contents of its argument
2481                and clear some of the cc_status.flags bits.
2482                It may also return 1 meaning condition now always true
2483                or -1 meaning condition now always false
2484                or 2 meaning condition nontrivial but altered.  */
2485             int result = alter_cond (XEXP (SET_SRC (body), 0));
2486             /* If condition now has fixed value, replace the IF_THEN_ELSE
2487                with its then-operand or its else-operand.  */
2488             if (result == 1)
2489               SET_SRC (body) = XEXP (SET_SRC (body), 1);
2490             if (result == -1)
2491               SET_SRC (body) = XEXP (SET_SRC (body), 2);
2492
2493             /* The jump is now either unconditional or a no-op.
2494                If it has become a no-op, don't try to output it.
2495                (It would not be recognized.)  */
2496             if (SET_SRC (body) == pc_rtx)
2497               {
2498                 delete_insn (insn);
2499                 break;
2500               }
2501             else if (ANY_RETURN_P (SET_SRC (body)))
2502               /* Replace (set (pc) (return)) with (return).  */
2503               PATTERN (insn) = body = SET_SRC (body);
2504
2505             /* Rerecognize the instruction if it has changed.  */
2506             if (result != 0)
2507               INSN_CODE (insn) = -1;
2508           }
2509
2510         /* If this is a conditional trap, maybe modify it if the cc's
2511            are in a nonstandard state so that it accomplishes the same
2512            thing that it would do straightforwardly if the cc's were
2513            set up normally.  */
2514         if (cc_status.flags != 0
2515             && NONJUMP_INSN_P (insn)
2516             && GET_CODE (body) == TRAP_IF
2517             && COMPARISON_P (TRAP_CONDITION (body))
2518             && XEXP (TRAP_CONDITION (body), 0) == cc0_rtx)
2519           {
2520             /* This function may alter the contents of its argument
2521                and clear some of the cc_status.flags bits.
2522                It may also return 1 meaning condition now always true
2523                or -1 meaning condition now always false
2524                or 2 meaning condition nontrivial but altered.  */
2525             int result = alter_cond (TRAP_CONDITION (body));
2526
2527             /* If TRAP_CONDITION has become always false, delete the
2528                instruction.  */
2529             if (result == -1)
2530               {
2531                 delete_insn (insn);
2532                 break;
2533               }
2534
2535             /* If TRAP_CONDITION has become always true, replace
2536                TRAP_CONDITION with const_true_rtx.  */
2537             if (result == 1)
2538               TRAP_CONDITION (body) = const_true_rtx;
2539
2540             /* Rerecognize the instruction if it has changed.  */
2541             if (result != 0)
2542               INSN_CODE (insn) = -1;
2543           }
2544
2545         /* Make same adjustments to instructions that examine the
2546            condition codes without jumping and instructions that
2547            handle conditional moves (if this machine has either one).  */
2548
2549         if (cc_status.flags != 0
2550             && set != 0)
2551           {
2552             rtx cond_rtx, then_rtx, else_rtx;
2553
2554             if (!JUMP_P (insn)
2555                 && GET_CODE (SET_SRC (set)) == IF_THEN_ELSE)
2556               {
2557                 cond_rtx = XEXP (SET_SRC (set), 0);
2558                 then_rtx = XEXP (SET_SRC (set), 1);
2559                 else_rtx = XEXP (SET_SRC (set), 2);
2560               }
2561             else
2562               {
2563                 cond_rtx = SET_SRC (set);
2564                 then_rtx = const_true_rtx;
2565                 else_rtx = const0_rtx;
2566               }
2567
2568             switch (GET_CODE (cond_rtx))
2569               {
2570               case GTU:
2571               case GT:
2572               case LTU:
2573               case LT:
2574               case GEU:
2575               case GE:
2576               case LEU:
2577               case LE:
2578               case EQ:
2579               case NE:
2580                 {
2581                   int result;
2582                   if (XEXP (cond_rtx, 0) != cc0_rtx)
2583                     break;
2584                   result = alter_cond (cond_rtx);
2585                   if (result == 1)
2586                     validate_change (insn, &SET_SRC (set), then_rtx, 0);
2587                   else if (result == -1)
2588                     validate_change (insn, &SET_SRC (set), else_rtx, 0);
2589                   else if (result == 2)
2590                     INSN_CODE (insn) = -1;
2591                   if (SET_DEST (set) == SET_SRC (set))
2592                     delete_insn (insn);
2593                 }
2594                 break;
2595
2596               default:
2597                 break;
2598               }
2599           }
2600
2601 #endif
2602
2603 #ifdef HAVE_peephole
2604         /* Do machine-specific peephole optimizations if desired.  */
2605
2606         if (optimize_p && !flag_no_peephole && !nopeepholes)
2607           {
2608             rtx next = peephole (insn);
2609             /* When peepholing, if there were notes within the peephole,
2610                emit them before the peephole.  */
2611             if (next != 0 && next != NEXT_INSN (insn))
2612               {
2613                 rtx note, prev = PREV_INSN (insn);
2614
2615                 for (note = NEXT_INSN (insn); note != next;
2616                      note = NEXT_INSN (note))
2617                   final_scan_insn (note, file, optimize_p, nopeepholes, seen);
2618
2619                 /* Put the notes in the proper position for a later
2620                    rescan.  For example, the SH target can do this
2621                    when generating a far jump in a delayed branch
2622                    sequence.  */
2623                 note = NEXT_INSN (insn);
2624                 PREV_INSN (note) = prev;
2625                 NEXT_INSN (prev) = note;
2626                 NEXT_INSN (PREV_INSN (next)) = insn;
2627                 PREV_INSN (insn) = PREV_INSN (next);
2628                 NEXT_INSN (insn) = next;
2629                 PREV_INSN (next) = insn;
2630               }
2631
2632             /* PEEPHOLE might have changed this.  */
2633             body = PATTERN (insn);
2634           }
2635 #endif
2636
2637         /* Try to recognize the instruction.
2638            If successful, verify that the operands satisfy the
2639            constraints for the instruction.  Crash if they don't,
2640            since `reload' should have changed them so that they do.  */
2641
2642         insn_code_number = recog_memoized (insn);
2643         cleanup_subreg_operands (insn);
2644
2645         /* Dump the insn in the assembly for debugging.  */
2646         if (flag_dump_rtl_in_asm)
2647           {
2648             print_rtx_head = ASM_COMMENT_START;
2649             print_rtl_single (asm_out_file, insn);
2650             print_rtx_head = "";
2651           }
2652
2653         if (! constrain_operands_cached (1))
2654           fatal_insn_not_found (insn);
2655
2656         /* Some target machines need to prescan each insn before
2657            it is output.  */
2658
2659 #ifdef FINAL_PRESCAN_INSN
2660         FINAL_PRESCAN_INSN (insn, recog_data.operand, recog_data.n_operands);
2661 #endif
2662
2663         if (targetm.have_conditional_execution ()
2664             && GET_CODE (PATTERN (insn)) == COND_EXEC)
2665           current_insn_predicate = COND_EXEC_TEST (PATTERN (insn));
2666
2667 #ifdef HAVE_cc0
2668         cc_prev_status = cc_status;
2669
2670         /* Update `cc_status' for this instruction.
2671            The instruction's output routine may change it further.
2672            If the output routine for a jump insn needs to depend
2673            on the cc status, it should look at cc_prev_status.  */
2674
2675         NOTICE_UPDATE_CC (body, insn);
2676 #endif
2677
2678         current_output_insn = debug_insn = insn;
2679
2680         /* Find the proper template for this insn.  */
2681         templ = get_insn_template (insn_code_number, insn);
2682
2683         /* If the C code returns 0, it means that it is a jump insn
2684            which follows a deleted test insn, and that test insn
2685            needs to be reinserted.  */
2686         if (templ == 0)
2687           {
2688             rtx prev;
2689
2690             gcc_assert (prev_nonnote_insn (insn) == last_ignored_compare);
2691
2692             /* We have already processed the notes between the setter and
2693                the user.  Make sure we don't process them again, this is
2694                particularly important if one of the notes is a block
2695                scope note or an EH note.  */
2696             for (prev = insn;
2697                  prev != last_ignored_compare;
2698                  prev = PREV_INSN (prev))
2699               {
2700                 if (NOTE_P (prev))
2701                   delete_insn (prev);   /* Use delete_note.  */
2702               }
2703
2704             return prev;
2705           }
2706
2707         /* If the template is the string "#", it means that this insn must
2708            be split.  */
2709         if (templ[0] == '#' && templ[1] == '\0')
2710           {
2711             rtx new_rtx = try_split (body, insn, 0);
2712
2713             /* If we didn't split the insn, go away.  */
2714             if (new_rtx == insn && PATTERN (new_rtx) == body)
2715               fatal_insn ("could not split insn", insn);
2716
2717 #ifdef HAVE_ATTR_length
2718             /* This instruction should have been split in shorten_branches,
2719                to ensure that we would have valid length info for the
2720                splitees.  */
2721             gcc_unreachable ();
2722 #endif
2723
2724             return new_rtx;
2725           }
2726
2727         /* ??? This will put the directives in the wrong place if
2728            get_insn_template outputs assembly directly.  However calling it
2729            before get_insn_template breaks if the insns is split.  */
2730         if (targetm.asm_out.unwind_emit_before_insn
2731             && targetm.asm_out.unwind_emit)
2732           targetm.asm_out.unwind_emit (asm_out_file, insn);
2733
2734         if (CALL_P (insn))
2735           {
2736             rtx x = call_from_call_insn (insn);
2737             x = XEXP (x, 0);
2738             if (x && MEM_P (x) && GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
2739               {
2740                 tree t;
2741                 x = XEXP (x, 0);
2742                 t = SYMBOL_REF_DECL (x);
2743                 if (t)
2744                   assemble_external (t);
2745               }
2746             if (!DECL_IGNORED_P (current_function_decl))
2747               debug_hooks->var_location (insn);
2748           }
2749
2750         /* Output assembler code from the template.  */
2751         output_asm_insn (templ, recog_data.operand);
2752
2753         /* Some target machines need to postscan each insn after
2754            it is output.  */
2755         if (targetm.asm_out.final_postscan_insn)
2756           targetm.asm_out.final_postscan_insn (file, insn, recog_data.operand,
2757                                                recog_data.n_operands);
2758
2759         if (!targetm.asm_out.unwind_emit_before_insn
2760             && targetm.asm_out.unwind_emit)
2761           targetm.asm_out.unwind_emit (asm_out_file, insn);
2762
2763         current_output_insn = debug_insn = 0;
2764       }
2765     }
2766   return NEXT_INSN (insn);
2767 }
2768 \f
2769 /* Return whether a source line note needs to be emitted before INSN.
2770    Sets IS_STMT to TRUE if the line should be marked as a possible
2771    breakpoint location.  */
2772
2773 static bool
2774 notice_source_line (rtx insn, bool *is_stmt)
2775 {
2776   const char *filename;
2777   int linenum;
2778
2779   if (override_filename)
2780     {
2781       filename = override_filename;
2782       linenum = override_linenum;
2783     }
2784   else
2785     {
2786       filename = insn_file (insn);
2787       linenum = insn_line (insn);
2788     }
2789
2790   if (filename == NULL)
2791     return false;
2792
2793   if (force_source_line
2794       || filename != last_filename
2795       || last_linenum != linenum)
2796     {
2797       force_source_line = false;
2798       last_filename = filename;
2799       last_linenum = linenum;
2800       last_discriminator = discriminator;
2801       *is_stmt = true;
2802       high_block_linenum = MAX (last_linenum, high_block_linenum);
2803       high_function_linenum = MAX (last_linenum, high_function_linenum);
2804       return true;
2805     }
2806
2807   if (SUPPORTS_DISCRIMINATOR && last_discriminator != discriminator)
2808     {
2809       /* If the discriminator changed, but the line number did not,
2810          output the line table entry with is_stmt false so the
2811          debugger does not treat this as a breakpoint location.  */
2812       last_discriminator = discriminator;
2813       *is_stmt = false;
2814       return true;
2815     }
2816
2817   return false;
2818 }
2819 \f
2820 /* For each operand in INSN, simplify (subreg (reg)) so that it refers
2821    directly to the desired hard register.  */
2822
2823 void
2824 cleanup_subreg_operands (rtx insn)
2825 {
2826   int i;
2827   bool changed = false;
2828   extract_insn_cached (insn);
2829   for (i = 0; i < recog_data.n_operands; i++)
2830     {
2831       /* The following test cannot use recog_data.operand when testing
2832          for a SUBREG: the underlying object might have been changed
2833          already if we are inside a match_operator expression that
2834          matches the else clause.  Instead we test the underlying
2835          expression directly.  */
2836       if (GET_CODE (*recog_data.operand_loc[i]) == SUBREG)
2837         {
2838           recog_data.operand[i] = alter_subreg (recog_data.operand_loc[i]);
2839           changed = true;
2840         }
2841       else if (GET_CODE (recog_data.operand[i]) == PLUS
2842                || GET_CODE (recog_data.operand[i]) == MULT
2843                || MEM_P (recog_data.operand[i]))
2844         recog_data.operand[i] = walk_alter_subreg (recog_data.operand_loc[i], &changed);
2845     }
2846
2847   for (i = 0; i < recog_data.n_dups; i++)
2848     {
2849       if (GET_CODE (*recog_data.dup_loc[i]) == SUBREG)
2850         {
2851           *recog_data.dup_loc[i] = alter_subreg (recog_data.dup_loc[i]);
2852           changed = true;
2853         }
2854       else if (GET_CODE (*recog_data.dup_loc[i]) == PLUS
2855                || GET_CODE (*recog_data.dup_loc[i]) == MULT
2856                || MEM_P (*recog_data.dup_loc[i]))
2857         *recog_data.dup_loc[i] = walk_alter_subreg (recog_data.dup_loc[i], &changed);
2858     }
2859   if (changed)
2860     df_insn_rescan (insn);
2861 }
2862
2863 /* If X is a SUBREG, replace it with a REG or a MEM,
2864    based on the thing it is a subreg of.  */
2865
2866 rtx
2867 alter_subreg (rtx *xp)
2868 {
2869   rtx x = *xp;
2870   rtx y = SUBREG_REG (x);
2871
2872   /* simplify_subreg does not remove subreg from volatile references.
2873      We are required to.  */
2874   if (MEM_P (y))
2875     {
2876       int offset = SUBREG_BYTE (x);
2877
2878       /* For paradoxical subregs on big-endian machines, SUBREG_BYTE
2879          contains 0 instead of the proper offset.  See simplify_subreg.  */
2880       if (offset == 0
2881           && GET_MODE_SIZE (GET_MODE (y)) < GET_MODE_SIZE (GET_MODE (x)))
2882         {
2883           int difference = GET_MODE_SIZE (GET_MODE (y))
2884                            - GET_MODE_SIZE (GET_MODE (x));
2885           if (WORDS_BIG_ENDIAN)
2886             offset += (difference / UNITS_PER_WORD) * UNITS_PER_WORD;
2887           if (BYTES_BIG_ENDIAN)
2888             offset += difference % UNITS_PER_WORD;
2889         }
2890
2891       *xp = adjust_address (y, GET_MODE (x), offset);
2892     }
2893   else
2894     {
2895       rtx new_rtx = simplify_subreg (GET_MODE (x), y, GET_MODE (y),
2896                                  SUBREG_BYTE (x));
2897
2898       if (new_rtx != 0)
2899         *xp = new_rtx;
2900       else if (REG_P (y))
2901         {
2902           /* Simplify_subreg can't handle some REG cases, but we have to.  */
2903           unsigned int regno;
2904           HOST_WIDE_INT offset;
2905
2906           regno = subreg_regno (x);
2907           if (subreg_lowpart_p (x))
2908             offset = byte_lowpart_offset (GET_MODE (x), GET_MODE (y));
2909           else
2910             offset = SUBREG_BYTE (x);
2911           *xp = gen_rtx_REG_offset (y, GET_MODE (x), regno, offset);
2912         }
2913     }
2914
2915   return *xp;
2916 }
2917
2918 /* Do alter_subreg on all the SUBREGs contained in X.  */
2919
2920 static rtx
2921 walk_alter_subreg (rtx *xp, bool *changed)
2922 {
2923   rtx x = *xp;
2924   switch (GET_CODE (x))
2925     {
2926     case PLUS:
2927     case MULT:
2928     case AND:
2929       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0), changed);
2930       XEXP (x, 1) = walk_alter_subreg (&XEXP (x, 1), changed);
2931       break;
2932
2933     case MEM:
2934     case ZERO_EXTEND:
2935       XEXP (x, 0) = walk_alter_subreg (&XEXP (x, 0), changed);
2936       break;
2937
2938     case SUBREG:
2939       *changed = true;
2940       return alter_subreg (xp);
2941
2942     default:
2943       break;
2944     }
2945
2946   return *xp;
2947 }
2948 \f
2949 #ifdef HAVE_cc0
2950
2951 /* Given BODY, the body of a jump instruction, alter the jump condition
2952    as required by the bits that are set in cc_status.flags.
2953    Not all of the bits there can be handled at this level in all cases.
2954
2955    The value is normally 0.
2956    1 means that the condition has become always true.
2957    -1 means that the condition has become always false.
2958    2 means that COND has been altered.  */
2959
2960 static int
2961 alter_cond (rtx cond)
2962 {
2963   int value = 0;
2964
2965   if (cc_status.flags & CC_REVERSED)
2966     {
2967       value = 2;
2968       PUT_CODE (cond, swap_condition (GET_CODE (cond)));
2969     }
2970
2971   if (cc_status.flags & CC_INVERTED)
2972     {
2973       value = 2;
2974       PUT_CODE (cond, reverse_condition (GET_CODE (cond)));
2975     }
2976
2977   if (cc_status.flags & CC_NOT_POSITIVE)
2978     switch (GET_CODE (cond))
2979       {
2980       case LE:
2981       case LEU:
2982       case GEU:
2983         /* Jump becomes unconditional.  */
2984         return 1;
2985
2986       case GT:
2987       case GTU:
2988       case LTU:
2989         /* Jump becomes no-op.  */
2990         return -1;
2991
2992       case GE:
2993         PUT_CODE (cond, EQ);
2994         value = 2;
2995         break;
2996
2997       case LT:
2998         PUT_CODE (cond, NE);
2999         value = 2;
3000         break;
3001
3002       default:
3003         break;
3004       }
3005
3006   if (cc_status.flags & CC_NOT_NEGATIVE)
3007     switch (GET_CODE (cond))
3008       {
3009       case GE:
3010       case GEU:
3011         /* Jump becomes unconditional.  */
3012         return 1;
3013
3014       case LT:
3015       case LTU:
3016         /* Jump becomes no-op.  */
3017         return -1;
3018
3019       case LE:
3020       case LEU:
3021         PUT_CODE (cond, EQ);
3022         value = 2;
3023         break;
3024
3025       case GT:
3026       case GTU:
3027         PUT_CODE (cond, NE);
3028         value = 2;
3029         break;
3030
3031       default:
3032         break;
3033       }
3034
3035   if (cc_status.flags & CC_NO_OVERFLOW)
3036     switch (GET_CODE (cond))
3037       {
3038       case GEU:
3039         /* Jump becomes unconditional.  */
3040         return 1;
3041
3042       case LEU:
3043         PUT_CODE (cond, EQ);
3044         value = 2;
3045         break;
3046
3047       case GTU:
3048         PUT_CODE (cond, NE);
3049         value = 2;
3050         break;
3051
3052       case LTU:
3053         /* Jump becomes no-op.  */
3054         return -1;
3055
3056       default:
3057         break;
3058       }
3059
3060   if (cc_status.flags & (CC_Z_IN_NOT_N | CC_Z_IN_N))
3061     switch (GET_CODE (cond))
3062       {
3063       default:
3064         gcc_unreachable ();
3065
3066       case NE:
3067         PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? GE : LT);
3068         value = 2;
3069         break;
3070
3071       case EQ:
3072         PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? LT : GE);
3073         value = 2;
3074         break;
3075       }
3076
3077   if (cc_status.flags & CC_NOT_SIGNED)
3078     /* The flags are valid if signed condition operators are converted
3079        to unsigned.  */
3080     switch (GET_CODE (cond))
3081       {
3082       case LE:
3083         PUT_CODE (cond, LEU);
3084         value = 2;
3085         break;
3086
3087       case LT:
3088         PUT_CODE (cond, LTU);
3089         value = 2;
3090         break;
3091
3092       case GT:
3093         PUT_CODE (cond, GTU);
3094         value = 2;
3095         break;
3096
3097       case GE:
3098         PUT_CODE (cond, GEU);
3099         value = 2;
3100         break;
3101
3102       default:
3103         break;
3104       }
3105
3106   return value;
3107 }
3108 #endif
3109 \f
3110 /* Report inconsistency between the assembler template and the operands.
3111    In an `asm', it's the user's fault; otherwise, the compiler's fault.  */
3112
3113 void
3114 output_operand_lossage (const char *cmsgid, ...)
3115 {
3116   char *fmt_string;
3117   char *new_message;
3118   const char *pfx_str;
3119   va_list ap;
3120
3121   va_start (ap, cmsgid);
3122
3123   pfx_str = this_is_asm_operands ? _("invalid 'asm': ") : "output_operand: ";
3124   asprintf (&fmt_string, "%s%s", pfx_str, _(cmsgid));
3125   vasprintf (&new_message, fmt_string, ap);
3126
3127   if (this_is_asm_operands)
3128     error_for_asm (this_is_asm_operands, "%s", new_message);
3129   else
3130     internal_error ("%s", new_message);
3131
3132   free (fmt_string);
3133   free (new_message);
3134   va_end (ap);
3135 }
3136 \f
3137 /* Output of assembler code from a template, and its subroutines.  */
3138
3139 /* Annotate the assembly with a comment describing the pattern and
3140    alternative used.  */
3141
3142 static void
3143 output_asm_name (void)
3144 {
3145   if (debug_insn)
3146     {
3147       int num = INSN_CODE (debug_insn);
3148       fprintf (asm_out_file, "\t%s %d\t%s",
3149                ASM_COMMENT_START, INSN_UID (debug_insn),
3150                insn_data[num].name);
3151       if (insn_data[num].n_alternatives > 1)
3152         fprintf (asm_out_file, "/%d", which_alternative + 1);
3153 #ifdef HAVE_ATTR_length
3154       fprintf (asm_out_file, "\t[length = %d]",
3155                get_attr_length (debug_insn));
3156 #endif
3157       /* Clear this so only the first assembler insn
3158          of any rtl insn will get the special comment for -dp.  */
3159       debug_insn = 0;
3160     }
3161 }
3162
3163 /* If OP is a REG or MEM and we can find a MEM_EXPR corresponding to it
3164    or its address, return that expr .  Set *PADDRESSP to 1 if the expr
3165    corresponds to the address of the object and 0 if to the object.  */
3166
3167 static tree
3168 get_mem_expr_from_op (rtx op, int *paddressp)
3169 {
3170   tree expr;
3171   int inner_addressp;
3172
3173   *paddressp = 0;
3174
3175   if (REG_P (op))
3176     return REG_EXPR (op);
3177   else if (!MEM_P (op))
3178     return 0;
3179
3180   if (MEM_EXPR (op) != 0)
3181     return MEM_EXPR (op);
3182
3183   /* Otherwise we have an address, so indicate it and look at the address.  */
3184   *paddressp = 1;
3185   op = XEXP (op, 0);
3186
3187   /* First check if we have a decl for the address, then look at the right side
3188      if it is a PLUS.  Otherwise, strip off arithmetic and keep looking.
3189      But don't allow the address to itself be indirect.  */
3190   if ((expr = get_mem_expr_from_op (op, &inner_addressp)) && ! inner_addressp)
3191     return expr;
3192   else if (GET_CODE (op) == PLUS
3193            && (expr = get_mem_expr_from_op (XEXP (op, 1), &inner_addressp)))
3194     return expr;
3195
3196   while (UNARY_P (op)
3197          || GET_RTX_CLASS (GET_CODE (op)) == RTX_BIN_ARITH)
3198     op = XEXP (op, 0);
3199
3200   expr = get_mem_expr_from_op (op, &inner_addressp);
3201   return inner_addressp ? 0 : expr;
3202 }
3203
3204 /* Output operand names for assembler instructions.  OPERANDS is the
3205    operand vector, OPORDER is the order to write the operands, and NOPS
3206    is the number of operands to write.  */
3207
3208 static void
3209 output_asm_operand_names (rtx *operands, int *oporder, int nops)
3210 {
3211   int wrote = 0;
3212   int i;
3213
3214   for (i = 0; i < nops; i++)
3215     {
3216       int addressp;
3217       rtx op = operands[oporder[i]];
3218       tree expr = get_mem_expr_from_op (op, &addressp);
3219
3220       fprintf (asm_out_file, "%c%s",
3221                wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START);
3222       wrote = 1;
3223       if (expr)
3224         {
3225           fprintf (asm_out_file, "%s",
3226                    addressp ? "*" : "");
3227           print_mem_expr (asm_out_file, expr);
3228           wrote = 1;
3229         }
3230       else if (REG_P (op) && ORIGINAL_REGNO (op)
3231                && ORIGINAL_REGNO (op) != REGNO (op))
3232         fprintf (asm_out_file, " tmp%i", ORIGINAL_REGNO (op));
3233     }
3234 }
3235
3236 /* Output text from TEMPLATE to the assembler output file,
3237    obeying %-directions to substitute operands taken from
3238    the vector OPERANDS.
3239
3240    %N (for N a digit) means print operand N in usual manner.
3241    %lN means require operand N to be a CODE_LABEL or LABEL_REF
3242       and print the label name with no punctuation.
3243    %cN means require operand N to be a constant
3244       and print the constant expression with no punctuation.
3245    %aN means expect operand N to be a memory address
3246       (not a memory reference!) and print a reference
3247       to that address.
3248    %nN means expect operand N to be a constant
3249       and print a constant expression for minus the value
3250       of the operand, with no other punctuation.  */
3251
3252 void
3253 output_asm_insn (const char *templ, rtx *operands)
3254 {
3255   const char *p;
3256   int c;
3257 #ifdef ASSEMBLER_DIALECT
3258   int dialect = 0;
3259 #endif
3260   int oporder[MAX_RECOG_OPERANDS];
3261   char opoutput[MAX_RECOG_OPERANDS];
3262   int ops = 0;
3263
3264   /* An insn may return a null string template
3265      in a case where no assembler code is needed.  */
3266   if (*templ == 0)
3267     return;
3268
3269   memset (opoutput, 0, sizeof opoutput);
3270   p = templ;
3271   putc ('\t', asm_out_file);
3272
3273 #ifdef ASM_OUTPUT_OPCODE
3274   ASM_OUTPUT_OPCODE (asm_out_file, p);
3275 #endif
3276
3277   while ((c = *p++))
3278     switch (c)
3279       {
3280       case '\n':
3281         if (flag_verbose_asm)
3282           output_asm_operand_names (operands, oporder, ops);
3283         if (flag_print_asm_name)
3284           output_asm_name ();
3285
3286         ops = 0;
3287         memset (opoutput, 0, sizeof opoutput);
3288
3289         putc (c, asm_out_file);
3290 #ifdef ASM_OUTPUT_OPCODE
3291         while ((c = *p) == '\t')
3292           {
3293             putc (c, asm_out_file);
3294             p++;
3295           }
3296         ASM_OUTPUT_OPCODE (asm_out_file, p);
3297 #endif
3298         break;
3299
3300 #ifdef ASSEMBLER_DIALECT
3301       case '{':
3302         {
3303           int i;
3304
3305           if (dialect)
3306             output_operand_lossage ("nested assembly dialect alternatives");
3307           else
3308             dialect = 1;
3309
3310           /* If we want the first dialect, do nothing.  Otherwise, skip
3311              DIALECT_NUMBER of strings ending with '|'.  */
3312           for (i = 0; i < dialect_number; i++)
3313             {
3314               while (*p && *p != '}' && *p++ != '|')
3315                 ;
3316               if (*p == '}')
3317                 break;
3318               if (*p == '|')
3319                 p++;
3320             }
3321
3322           if (*p == '\0')
3323             output_operand_lossage ("unterminated assembly dialect alternative");
3324         }
3325         break;
3326
3327       case '|':
3328         if (dialect)
3329           {
3330             /* Skip to close brace.  */
3331             do
3332               {
3333                 if (*p == '\0')
3334                   {
3335                     output_operand_lossage ("unterminated assembly dialect alternative");
3336                     break;
3337                   }
3338               }
3339             while (*p++ != '}');
3340             dialect = 0;
3341           }
3342         else
3343           putc (c, asm_out_file);
3344         break;
3345
3346       case '}':
3347         if (! dialect)
3348           putc (c, asm_out_file);
3349         dialect = 0;
3350         break;
3351 #endif
3352
3353       case '%':
3354         /* %% outputs a single %.  */
3355         if (*p == '%')
3356           {
3357             p++;
3358             putc (c, asm_out_file);
3359           }
3360         /* %= outputs a number which is unique to each insn in the entire
3361            compilation.  This is useful for making local labels that are
3362            referred to more than once in a given insn.  */
3363         else if (*p == '=')
3364           {
3365             p++;
3366             fprintf (asm_out_file, "%d", insn_counter);
3367           }
3368         /* % followed by a letter and some digits
3369            outputs an operand in a special way depending on the letter.
3370            Letters `acln' are implemented directly.
3371            Other letters are passed to `output_operand' so that
3372            the TARGET_PRINT_OPERAND hook can define them.  */
3373         else if (ISALPHA (*p))
3374           {
3375             int letter = *p++;
3376             unsigned long opnum;
3377             char *endptr;
3378
3379             opnum = strtoul (p, &endptr, 10);
3380
3381             if (endptr == p)
3382               output_operand_lossage ("operand number missing "
3383                                       "after %%-letter");
3384             else if (this_is_asm_operands && opnum >= insn_noperands)
3385               output_operand_lossage ("operand number out of range");
3386             else if (letter == 'l')
3387               output_asm_label (operands[opnum]);
3388             else if (letter == 'a')
3389               output_address (operands[opnum]);
3390             else if (letter == 'c')
3391               {
3392                 if (CONSTANT_ADDRESS_P (operands[opnum]))
3393                   output_addr_const (asm_out_file, operands[opnum]);
3394                 else
3395                   output_operand (operands[opnum], 'c');
3396               }
3397             else if (letter == 'n')
3398               {
3399                 if (CONST_INT_P (operands[opnum]))
3400                   fprintf (asm_out_file, HOST_WIDE_INT_PRINT_DEC,
3401                            - INTVAL (operands[opnum]));
3402                 else
3403                   {
3404                     putc ('-', asm_out_file);
3405                     output_addr_const (asm_out_file, operands[opnum]);
3406                   }
3407               }
3408             else
3409               output_operand (operands[opnum], letter);
3410
3411             if (!opoutput[opnum])
3412               oporder[ops++] = opnum;
3413             opoutput[opnum] = 1;
3414
3415             p = endptr;
3416             c = *p;
3417           }
3418         /* % followed by a digit outputs an operand the default way.  */
3419         else if (ISDIGIT (*p))
3420           {
3421             unsigned long opnum;
3422             char *endptr;
3423
3424             opnum = strtoul (p, &endptr, 10);
3425             if (this_is_asm_operands && opnum >= insn_noperands)
3426               output_operand_lossage ("operand number out of range");
3427             else
3428               output_operand (operands[opnum], 0);
3429
3430             if (!opoutput[opnum])
3431               oporder[ops++] = opnum;
3432             opoutput[opnum] = 1;
3433
3434             p = endptr;
3435             c = *p;
3436           }
3437         /* % followed by punctuation: output something for that
3438            punctuation character alone, with no operand.  The
3439            TARGET_PRINT_OPERAND hook decides what is actually done.  */
3440         else if (targetm.asm_out.print_operand_punct_valid_p ((unsigned char) *p))
3441           output_operand (NULL_RTX, *p++);
3442         else
3443           output_operand_lossage ("invalid %%-code");
3444         break;
3445
3446       default:
3447         putc (c, asm_out_file);
3448       }
3449
3450   /* Write out the variable names for operands, if we know them.  */
3451   if (flag_verbose_asm)
3452     output_asm_operand_names (operands, oporder, ops);
3453   if (flag_print_asm_name)
3454     output_asm_name ();
3455
3456   putc ('\n', asm_out_file);
3457 }
3458 \f
3459 /* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol.  */
3460
3461 void
3462 output_asm_label (rtx x)
3463 {
3464   char buf[256];
3465
3466   if (GET_CODE (x) == LABEL_REF)
3467     x = XEXP (x, 0);
3468   if (LABEL_P (x)
3469       || (NOTE_P (x)
3470           && NOTE_KIND (x) == NOTE_INSN_DELETED_LABEL))
3471     ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3472   else
3473     output_operand_lossage ("'%%l' operand isn't a label");
3474
3475   assemble_name (asm_out_file, buf);
3476 }
3477
3478 /* Helper rtx-iteration-function for mark_symbol_refs_as_used and
3479    output_operand.  Marks SYMBOL_REFs as referenced through use of
3480    assemble_external.  */
3481
3482 static int
3483 mark_symbol_ref_as_used (rtx *xp, void *dummy ATTRIBUTE_UNUSED)
3484 {
3485   rtx x = *xp;
3486
3487   /* If we have a used symbol, we may have to emit assembly
3488      annotations corresponding to whether the symbol is external, weak
3489      or has non-default visibility.  */
3490   if (GET_CODE (x) == SYMBOL_REF)
3491     {
3492       tree t;
3493
3494       t = SYMBOL_REF_DECL (x);
3495       if (t)
3496         assemble_external (t);
3497
3498       return -1;
3499     }
3500
3501   return 0;
3502 }
3503
3504 /* Marks SYMBOL_REFs in x as referenced through use of assemble_external.  */
3505
3506 void
3507 mark_symbol_refs_as_used (rtx x)
3508 {
3509   for_each_rtx (&x, mark_symbol_ref_as_used, NULL);
3510 }
3511
3512 /* Print operand X using machine-dependent assembler syntax.
3513    CODE is a non-digit that preceded the operand-number in the % spec,
3514    such as 'z' if the spec was `%z3'.  CODE is 0 if there was no char
3515    between the % and the digits.
3516    When CODE is a non-letter, X is 0.
3517
3518    The meanings of the letters are machine-dependent and controlled
3519    by TARGET_PRINT_OPERAND.  */
3520
3521 void
3522 output_operand (rtx x, int code ATTRIBUTE_UNUSED)
3523 {
3524   if (x && GET_CODE (x) == SUBREG)
3525     x = alter_subreg (&x);
3526
3527   /* X must not be a pseudo reg.  */
3528   gcc_assert (!x || !REG_P (x) || REGNO (x) < FIRST_PSEUDO_REGISTER);
3529
3530   targetm.asm_out.print_operand (asm_out_file, x, code);
3531
3532   if (x == NULL_RTX)
3533     return;
3534
3535   for_each_rtx (&x, mark_symbol_ref_as_used, NULL);
3536 }
3537
3538 /* Print a memory reference operand for address X using
3539    machine-dependent assembler syntax.  */
3540
3541 void
3542 output_address (rtx x)
3543 {
3544   bool changed = false;
3545   walk_alter_subreg (&x, &changed);
3546   targetm.asm_out.print_operand_address (asm_out_file, x);
3547 }
3548 \f
3549 /* Print an integer constant expression in assembler syntax.
3550    Addition and subtraction are the only arithmetic
3551    that may appear in these expressions.  */
3552
3553 void
3554 output_addr_const (FILE *file, rtx x)
3555 {
3556   char buf[256];
3557
3558  restart:
3559   switch (GET_CODE (x))
3560     {
3561     case PC:
3562       putc ('.', file);
3563       break;
3564
3565     case SYMBOL_REF:
3566       if (SYMBOL_REF_DECL (x))
3567         assemble_external (SYMBOL_REF_DECL (x));
3568 #ifdef ASM_OUTPUT_SYMBOL_REF
3569       ASM_OUTPUT_SYMBOL_REF (file, x);
3570 #else
3571       assemble_name (file, XSTR (x, 0));
3572 #endif
3573       break;
3574
3575     case LABEL_REF:
3576       x = XEXP (x, 0);
3577       /* Fall through.  */
3578     case CODE_LABEL:
3579       ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x));
3580 #ifdef ASM_OUTPUT_LABEL_REF
3581       ASM_OUTPUT_LABEL_REF (file, buf);
3582 #else
3583       assemble_name (file, buf);
3584 #endif
3585       break;
3586
3587     case CONST_INT:
3588       fprint_w (file, INTVAL (x));
3589       break;
3590
3591     case CONST:
3592       /* This used to output parentheses around the expression,
3593          but that does not work on the 386 (either ATT or BSD assembler).  */
3594       output_addr_const (file, XEXP (x, 0));
3595       break;
3596
3597     case CONST_DOUBLE:
3598       if (GET_MODE (x) == VOIDmode)
3599         {
3600           /* We can use %d if the number is one word and positive.  */
3601           if (CONST_DOUBLE_HIGH (x))
3602             fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
3603                      (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (x),
3604                      (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x));
3605           else if (CONST_DOUBLE_LOW (x) < 0)
3606             fprintf (file, HOST_WIDE_INT_PRINT_HEX,
3607                      (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x));
3608           else
3609             fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_DOUBLE_LOW (x));
3610         }
3611       else
3612         /* We can't handle floating point constants;
3613            PRINT_OPERAND must handle them.  */
3614         output_operand_lossage ("floating constant misused");
3615       break;
3616
3617     case CONST_FIXED:
3618       fprintf (file, HOST_WIDE_INT_PRINT_DEC, CONST_FIXED_VALUE_LOW (x));
3619       break;
3620
3621     case PLUS:
3622       /* Some assemblers need integer constants to appear last (eg masm).  */
3623       if (CONST_INT_P (XEXP (x, 0)))
3624         {
3625           output_addr_const (file, XEXP (x, 1));
3626           if (INTVAL (XEXP (x, 0)) >= 0)
3627             fprintf (file, "+");
3628           output_addr_const (file, XEXP (x, 0));
3629         }
3630       else
3631         {
3632           output_addr_const (file, XEXP (x, 0));
3633           if (!CONST_INT_P (XEXP (x, 1))
3634               || INTVAL (XEXP (x, 1)) >= 0)
3635             fprintf (file, "+");
3636           output_addr_const (file, XEXP (x, 1));
3637         }
3638       break;
3639
3640     case MINUS:
3641       /* Avoid outputting things like x-x or x+5-x,
3642          since some assemblers can't handle that.  */
3643       x = simplify_subtraction (x);
3644       if (GET_CODE (x) != MINUS)
3645         goto restart;
3646
3647       output_addr_const (file, XEXP (x, 0));
3648       fprintf (file, "-");
3649       if ((CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) >= 0)
3650           || GET_CODE (XEXP (x, 1)) == PC
3651           || GET_CODE (XEXP (x, 1)) == SYMBOL_REF)
3652         output_addr_const (file, XEXP (x, 1));
3653       else
3654         {
3655           fputs (targetm.asm_out.open_paren, file);
3656           output_addr_const (file, XEXP (x, 1));
3657           fputs (targetm.asm_out.close_paren, file);
3658         }
3659       break;
3660
3661     case ZERO_EXTEND:
3662     case SIGN_EXTEND:
3663     case SUBREG:
3664     case TRUNCATE:
3665       output_addr_const (file, XEXP (x, 0));
3666       break;
3667
3668     default:
3669       if (targetm.asm_out.output_addr_const_extra (file, x))
3670         break;
3671
3672       output_operand_lossage ("invalid expression as operand");
3673     }
3674 }
3675 \f
3676 /* Output a quoted string.  */
3677
3678 void
3679 output_quoted_string (FILE *asm_file, const char *string)
3680 {
3681 #ifdef OUTPUT_QUOTED_STRING
3682   OUTPUT_QUOTED_STRING (asm_file, string);
3683 #else
3684   char c;
3685
3686   putc ('\"', asm_file);
3687   while ((c = *string++) != 0)
3688     {
3689       if (ISPRINT (c))
3690         {
3691           if (c == '\"' || c == '\\')
3692             putc ('\\', asm_file);
3693           putc (c, asm_file);
3694         }
3695       else
3696         fprintf (asm_file, "\\%03o", (unsigned char) c);
3697     }
3698   putc ('\"', asm_file);
3699 #endif
3700 }
3701 \f
3702 /* Write a HOST_WIDE_INT number in hex form 0x1234, fast. */
3703
3704 void
3705 fprint_whex (FILE *f, unsigned HOST_WIDE_INT value)
3706 {
3707   char buf[2 + CHAR_BIT * sizeof (value) / 4];
3708   if (value == 0)
3709     putc ('0', f);
3710   else
3711     {
3712       char *p = buf + sizeof (buf);
3713       do
3714         *--p = "0123456789abcdef"[value % 16];
3715       while ((value /= 16) != 0);
3716       *--p = 'x';
3717       *--p = '0';
3718       fwrite (p, 1, buf + sizeof (buf) - p, f);
3719     }
3720 }
3721
3722 /* Internal function that prints an unsigned long in decimal in reverse.
3723    The output string IS NOT null-terminated. */
3724
3725 static int
3726 sprint_ul_rev (char *s, unsigned long value)
3727 {
3728   int i = 0;
3729   do
3730     {
3731       s[i] = "0123456789"[value % 10];
3732       value /= 10;
3733       i++;
3734       /* alternate version, without modulo */
3735       /* oldval = value; */
3736       /* value /= 10; */
3737       /* s[i] = "0123456789" [oldval - 10*value]; */
3738       /* i++ */
3739     }
3740   while (value != 0);
3741   return i;
3742 }
3743
3744 /* Write a signed HOST_WIDE_INT as decimal to a file, fast. */
3745
3746 void
3747 fprint_w (FILE *f, HOST_WIDE_INT value)
3748 {
3749   /* python says: len(str(2**64)) == 20 */
3750   char s[20];
3751   int i;
3752
3753   if (value >= 0)
3754     i = sprint_ul_rev (s, (unsigned long) value);
3755   else
3756     {
3757       /* Cast to long long to output max negative correctly! */
3758       i = sprint_ul_rev (s, ((unsigned long long) value) * -1);
3759       putc('-', f);
3760     }
3761
3762   /* It's probably too small to bother with string reversal and fputs. */
3763   do
3764     {
3765       i--;
3766       putc (s[i], f);
3767     }
3768   while (i != 0);
3769 }
3770
3771 /* Write an unsigned long as decimal to a file, fast. */
3772
3773 void
3774 fprint_ul (FILE *f, unsigned long value)
3775 {
3776   /* python says: len(str(2**64)) == 20 */
3777   char s[20];
3778   int i;
3779
3780   i = sprint_ul_rev (s, value);
3781
3782   /* It's probably too small to bother with string reversal and fputs. */
3783   do
3784     {
3785       i--;
3786       putc (s[i], f);
3787     }
3788   while (i != 0);
3789 }
3790
3791 /* Write an unsigned long as decimal to a string, fast.
3792    s must be wide enough to not overflow, at least 21 chars.
3793    Returns the length of the string (without terminating '\0'). */
3794
3795 int
3796 sprint_ul (char *s, unsigned long value)
3797 {
3798   int len;
3799   char tmp_c;
3800   int i;
3801   int j;
3802
3803   len = sprint_ul_rev (s, value);
3804   s[len] = '\0';
3805
3806   /* Reverse the string. */
3807   i = 0;
3808   j = len - 1;
3809   while (i < j)
3810     {
3811       tmp_c = s[i];
3812       s[i] = s[j];
3813       s[j] = tmp_c;
3814       i++; j--;
3815     }
3816
3817   return len;
3818 }
3819
3820 /* A poor man's fprintf, with the added features of %I, %R, %L, and %U.
3821    %R prints the value of REGISTER_PREFIX.
3822    %L prints the value of LOCAL_LABEL_PREFIX.
3823    %U prints the value of USER_LABEL_PREFIX.
3824    %I prints the value of IMMEDIATE_PREFIX.
3825    %O runs ASM_OUTPUT_OPCODE to transform what follows in the string.
3826    Also supported are %d, %i, %u, %x, %X, %o, %c, %s and %%.
3827
3828    We handle alternate assembler dialects here, just like output_asm_insn.  */
3829
3830 void
3831 asm_fprintf (FILE *file, const char *p, ...)
3832 {
3833   char buf[10];
3834   char *q, c;
3835   va_list argptr;
3836
3837   va_start (argptr, p);
3838
3839   buf[0] = '%';
3840
3841   while ((c = *p++))
3842     switch (c)
3843       {
3844 #ifdef ASSEMBLER_DIALECT
3845       case '{':
3846         {
3847           int i;
3848
3849           /* If we want the first dialect, do nothing.  Otherwise, skip
3850              DIALECT_NUMBER of strings ending with '|'.  */
3851           for (i = 0; i < dialect_number; i++)
3852             {
3853               while (*p && *p++ != '|')
3854                 ;
3855
3856               if (*p == '|')
3857                 p++;
3858             }
3859         }
3860         break;
3861
3862       case '|':
3863         /* Skip to close brace.  */
3864         while (*p && *p++ != '}')
3865           ;
3866         break;
3867
3868       case '}':
3869         break;
3870 #endif
3871
3872       case '%':
3873         c = *p++;
3874         q = &buf[1];
3875         while (strchr ("-+ #0", c))
3876           {
3877             *q++ = c;
3878             c = *p++;
3879           }
3880         while (ISDIGIT (c) || c == '.')
3881           {
3882             *q++ = c;
3883             c = *p++;
3884           }
3885         switch (c)
3886           {
3887           case '%':
3888             putc ('%', file);
3889             break;
3890
3891           case 'd':  case 'i':  case 'u':
3892           case 'x':  case 'X':  case 'o':
3893           case 'c':
3894             *q++ = c;
3895             *q = 0;
3896             fprintf (file, buf, va_arg (argptr, int));
3897             break;
3898
3899           case 'w':
3900             /* This is a prefix to the 'd', 'i', 'u', 'x', 'X', and
3901                'o' cases, but we do not check for those cases.  It
3902                means that the value is a HOST_WIDE_INT, which may be
3903                either `long' or `long long'.  */
3904             memcpy (q, HOST_WIDE_INT_PRINT, strlen (HOST_WIDE_INT_PRINT));
3905             q += strlen (HOST_WIDE_INT_PRINT);
3906             *q++ = *p++;
3907             *q = 0;
3908             fprintf (file, buf, va_arg (argptr, HOST_WIDE_INT));
3909             break;
3910
3911           case 'l':
3912             *q++ = c;
3913 #ifdef HAVE_LONG_LONG
3914             if (*p == 'l')
3915               {
3916                 *q++ = *p++;
3917                 *q++ = *p++;
3918                 *q = 0;
3919                 fprintf (file, buf, va_arg (argptr, long long));
3920               }
3921             else
3922 #endif
3923               {
3924                 *q++ = *p++;
3925                 *q = 0;
3926                 fprintf (file, buf, va_arg (argptr, long));
3927               }
3928
3929             break;
3930
3931           case 's':
3932             *q++ = c;
3933             *q = 0;
3934             fprintf (file, buf, va_arg (argptr, char *));
3935             break;
3936
3937           case 'O':
3938 #ifdef ASM_OUTPUT_OPCODE
3939             ASM_OUTPUT_OPCODE (asm_out_file, p);
3940 #endif
3941             break;
3942
3943           case 'R':
3944 #ifdef REGISTER_PREFIX
3945             fprintf (file, "%s", REGISTER_PREFIX);
3946 #endif
3947             break;
3948
3949           case 'I':
3950 #ifdef IMMEDIATE_PREFIX
3951             fprintf (file, "%s", IMMEDIATE_PREFIX);
3952 #endif
3953             break;
3954
3955           case 'L':
3956 #ifdef LOCAL_LABEL_PREFIX
3957             fprintf (file, "%s", LOCAL_LABEL_PREFIX);
3958 #endif
3959             break;
3960
3961           case 'U':
3962             fputs (user_label_prefix, file);
3963             break;
3964
3965 #ifdef ASM_FPRINTF_EXTENSIONS
3966             /* Uppercase letters are reserved for general use by asm_fprintf
3967                and so are not available to target specific code.  In order to
3968                prevent the ASM_FPRINTF_EXTENSIONS macro from using them then,
3969                they are defined here.  As they get turned into real extensions
3970                to asm_fprintf they should be removed from this list.  */
3971           case 'A': case 'B': case 'C': case 'D': case 'E':
3972           case 'F': case 'G': case 'H': case 'J': case 'K':
3973           case 'M': case 'N': case 'P': case 'Q': case 'S':
3974           case 'T': case 'V': case 'W': case 'Y': case 'Z':
3975             break;
3976
3977           ASM_FPRINTF_EXTENSIONS (file, argptr, p)
3978 #endif
3979           default:
3980             gcc_unreachable ();
3981           }
3982         break;
3983
3984       default:
3985         putc (c, file);
3986       }
3987   va_end (argptr);
3988 }
3989 \f
3990 /* Split up a CONST_DOUBLE or integer constant rtx
3991    into two rtx's for single words,
3992    storing in *FIRST the word that comes first in memory in the target
3993    and in *SECOND the other.  */
3994
3995 void
3996 split_double (rtx value, rtx *first, rtx *second)
3997 {
3998   if (CONST_INT_P (value))
3999     {
4000       if (HOST_BITS_PER_WIDE_INT >= (2 * BITS_PER_WORD))
4001         {
4002           /* In this case the CONST_INT holds both target words.
4003              Extract the bits from it into two word-sized pieces.
4004              Sign extend each half to HOST_WIDE_INT.  */
4005           unsigned HOST_WIDE_INT low, high;
4006           unsigned HOST_WIDE_INT mask, sign_bit, sign_extend;
4007           unsigned bits_per_word = BITS_PER_WORD;
4008
4009           /* Set sign_bit to the most significant bit of a word.  */
4010           sign_bit = 1;
4011           sign_bit <<= bits_per_word - 1;
4012
4013           /* Set mask so that all bits of the word are set.  We could
4014              have used 1 << BITS_PER_WORD instead of basing the
4015              calculation on sign_bit.  However, on machines where
4016              HOST_BITS_PER_WIDE_INT == BITS_PER_WORD, it could cause a
4017              compiler warning, even though the code would never be
4018              executed.  */
4019           mask = sign_bit << 1;
4020           mask--;
4021
4022           /* Set sign_extend as any remaining bits.  */
4023           sign_extend = ~mask;
4024
4025           /* Pick the lower word and sign-extend it.  */
4026           low = INTVAL (value);
4027           low &= mask;
4028           if (low & sign_bit)
4029             low |= sign_extend;
4030
4031           /* Pick the higher word, shifted to the least significant
4032              bits, and sign-extend it.  */
4033           high = INTVAL (value);
4034           high >>= bits_per_word - 1;
4035           high >>= 1;
4036           high &= mask;
4037           if (high & sign_bit)
4038             high |= sign_extend;
4039
4040           /* Store the words in the target machine order.  */
4041           if (WORDS_BIG_ENDIAN)
4042             {
4043               *first = GEN_INT (high);
4044               *second = GEN_INT (low);
4045             }
4046           else
4047             {
4048               *first = GEN_INT (low);
4049               *second = GEN_INT (high);
4050             }
4051         }
4052       else
4053         {
4054           /* The rule for using CONST_INT for a wider mode
4055              is that we regard the value as signed.
4056              So sign-extend it.  */
4057           rtx high = (INTVAL (value) < 0 ? constm1_rtx : const0_rtx);
4058           if (WORDS_BIG_ENDIAN)
4059             {
4060               *first = high;
4061               *second = value;
4062             }
4063           else
4064             {
4065               *first = value;
4066               *second = high;
4067             }
4068         }
4069     }
4070   else if (GET_CODE (value) != CONST_DOUBLE)
4071     {
4072       if (WORDS_BIG_ENDIAN)
4073         {
4074           *first = const0_rtx;
4075           *second = value;
4076         }
4077       else
4078         {
4079           *first = value;
4080           *second = const0_rtx;
4081         }
4082     }
4083   else if (GET_MODE (value) == VOIDmode
4084            /* This is the old way we did CONST_DOUBLE integers.  */
4085            || GET_MODE_CLASS (GET_MODE (value)) == MODE_INT)
4086     {
4087       /* In an integer, the words are defined as most and least significant.
4088          So order them by the target's convention.  */
4089       if (WORDS_BIG_ENDIAN)
4090         {
4091           *first = GEN_INT (CONST_DOUBLE_HIGH (value));
4092           *second = GEN_INT (CONST_DOUBLE_LOW (value));
4093         }
4094       else
4095         {
4096           *first = GEN_INT (CONST_DOUBLE_LOW (value));
4097           *second = GEN_INT (CONST_DOUBLE_HIGH (value));
4098         }
4099     }
4100   else
4101     {
4102       REAL_VALUE_TYPE r;
4103       long l[2];
4104       REAL_VALUE_FROM_CONST_DOUBLE (r, value);
4105
4106       /* Note, this converts the REAL_VALUE_TYPE to the target's
4107          format, splits up the floating point double and outputs
4108          exactly 32 bits of it into each of l[0] and l[1] --
4109          not necessarily BITS_PER_WORD bits.  */
4110       REAL_VALUE_TO_TARGET_DOUBLE (r, l);
4111
4112       /* If 32 bits is an entire word for the target, but not for the host,
4113          then sign-extend on the host so that the number will look the same
4114          way on the host that it would on the target.  See for instance
4115          simplify_unary_operation.  The #if is needed to avoid compiler
4116          warnings.  */
4117
4118 #if HOST_BITS_PER_LONG > 32
4119       if (BITS_PER_WORD < HOST_BITS_PER_LONG && BITS_PER_WORD == 32)
4120         {
4121           if (l[0] & ((long) 1 << 31))
4122             l[0] |= ((long) (-1) << 32);
4123           if (l[1] & ((long) 1 << 31))
4124             l[1] |= ((long) (-1) << 32);
4125         }
4126 #endif
4127
4128       *first = GEN_INT (l[0]);
4129       *second = GEN_INT (l[1]);
4130     }
4131 }
4132 \f
4133 /* Return nonzero if this function has no function calls.  */
4134
4135 int
4136 leaf_function_p (void)
4137 {
4138   rtx insn;
4139   rtx link;
4140
4141   if (crtl->profile || profile_arc_flag)
4142     return 0;
4143
4144   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4145     {
4146       if (CALL_P (insn)
4147           && ! SIBLING_CALL_P (insn))
4148         return 0;
4149       if (NONJUMP_INSN_P (insn)
4150           && GET_CODE (PATTERN (insn)) == SEQUENCE
4151           && CALL_P (XVECEXP (PATTERN (insn), 0, 0))
4152           && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
4153         return 0;
4154     }
4155   for (link = crtl->epilogue_delay_list;
4156        link;
4157        link = XEXP (link, 1))
4158     {
4159       insn = XEXP (link, 0);
4160
4161       if (CALL_P (insn)
4162           && ! SIBLING_CALL_P (insn))
4163         return 0;
4164       if (NONJUMP_INSN_P (insn)
4165           && GET_CODE (PATTERN (insn)) == SEQUENCE
4166           && CALL_P (XVECEXP (PATTERN (insn), 0, 0))
4167           && ! SIBLING_CALL_P (XVECEXP (PATTERN (insn), 0, 0)))
4168         return 0;
4169     }
4170
4171   return 1;
4172 }
4173
4174 /* Return 1 if branch is a forward branch.
4175    Uses insn_shuid array, so it works only in the final pass.  May be used by
4176    output templates to customary add branch prediction hints.
4177  */
4178 int
4179 final_forward_branch_p (rtx insn)
4180 {
4181   int insn_id, label_id;
4182
4183   gcc_assert (uid_shuid);
4184   insn_id = INSN_SHUID (insn);
4185   label_id = INSN_SHUID (JUMP_LABEL (insn));
4186   /* We've hit some insns that does not have id information available.  */
4187   gcc_assert (insn_id && label_id);
4188   return insn_id < label_id;
4189 }
4190
4191 /* On some machines, a function with no call insns
4192    can run faster if it doesn't create its own register window.
4193    When output, the leaf function should use only the "output"
4194    registers.  Ordinarily, the function would be compiled to use
4195    the "input" registers to find its arguments; it is a candidate
4196    for leaf treatment if it uses only the "input" registers.
4197    Leaf function treatment means renumbering so the function
4198    uses the "output" registers instead.  */
4199
4200 #ifdef LEAF_REGISTERS
4201
4202 /* Return 1 if this function uses only the registers that can be
4203    safely renumbered.  */
4204
4205 int
4206 only_leaf_regs_used (void)
4207 {
4208   int i;
4209   const char *const permitted_reg_in_leaf_functions = LEAF_REGISTERS;
4210
4211   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4212     if ((df_regs_ever_live_p (i) || global_regs[i])
4213         && ! permitted_reg_in_leaf_functions[i])
4214       return 0;
4215
4216   if (crtl->uses_pic_offset_table
4217       && pic_offset_table_rtx != 0
4218       && REG_P (pic_offset_table_rtx)
4219       && ! permitted_reg_in_leaf_functions[REGNO (pic_offset_table_rtx)])
4220     return 0;
4221
4222   return 1;
4223 }
4224
4225 /* Scan all instructions and renumber all registers into those
4226    available in leaf functions.  */
4227
4228 static void
4229 leaf_renumber_regs (rtx first)
4230 {
4231   rtx insn;
4232
4233   /* Renumber only the actual patterns.
4234      The reg-notes can contain frame pointer refs,
4235      and renumbering them could crash, and should not be needed.  */
4236   for (insn = first; insn; insn = NEXT_INSN (insn))
4237     if (INSN_P (insn))
4238       leaf_renumber_regs_insn (PATTERN (insn));
4239   for (insn = crtl->epilogue_delay_list;
4240        insn;
4241        insn = XEXP (insn, 1))
4242     if (INSN_P (XEXP (insn, 0)))
4243       leaf_renumber_regs_insn (PATTERN (XEXP (insn, 0)));
4244 }
4245
4246 /* Scan IN_RTX and its subexpressions, and renumber all regs into those
4247    available in leaf functions.  */
4248
4249 void
4250 leaf_renumber_regs_insn (rtx in_rtx)
4251 {
4252   int i, j;
4253   const char *format_ptr;
4254
4255   if (in_rtx == 0)
4256     return;
4257
4258   /* Renumber all input-registers into output-registers.
4259      renumbered_regs would be 1 for an output-register;
4260      they  */
4261
4262   if (REG_P (in_rtx))
4263     {
4264       int newreg;
4265
4266       /* Don't renumber the same reg twice.  */
4267       if (in_rtx->used)
4268         return;
4269
4270       newreg = REGNO (in_rtx);
4271       /* Don't try to renumber pseudo regs.  It is possible for a pseudo reg
4272          to reach here as part of a REG_NOTE.  */
4273       if (newreg >= FIRST_PSEUDO_REGISTER)
4274         {
4275           in_rtx->used = 1;
4276           return;
4277         }
4278       newreg = LEAF_REG_REMAP (newreg);
4279       gcc_assert (newreg >= 0);
4280       df_set_regs_ever_live (REGNO (in_rtx), false);
4281       df_set_regs_ever_live (newreg, true);
4282       SET_REGNO (in_rtx, newreg);
4283       in_rtx->used = 1;
4284     }
4285
4286   if (INSN_P (in_rtx))
4287     {
4288       /* Inside a SEQUENCE, we find insns.
4289          Renumber just the patterns of these insns,
4290          just as we do for the top-level insns.  */
4291       leaf_renumber_regs_insn (PATTERN (in_rtx));
4292       return;
4293     }
4294
4295   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
4296
4297   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
4298     switch (*format_ptr++)
4299       {
4300       case 'e':
4301         leaf_renumber_regs_insn (XEXP (in_rtx, i));
4302         break;
4303
4304       case 'E':
4305         if (NULL != XVEC (in_rtx, i))
4306           {
4307             for (j = 0; j < XVECLEN (in_rtx, i); j++)
4308               leaf_renumber_regs_insn (XVECEXP (in_rtx, i, j));
4309           }
4310         break;
4311
4312       case 'S':
4313       case 's':
4314       case '0':
4315       case 'i':
4316       case 'w':
4317       case 'n':
4318       case 'u':
4319         break;
4320
4321       default:
4322         gcc_unreachable ();
4323       }
4324 }
4325 #endif
4326 \f
4327 /* Turn the RTL into assembly.  */
4328 static unsigned int
4329 rest_of_handle_final (void)
4330 {
4331   rtx x;
4332   const char *fnname;
4333
4334   /* Get the function's name, as described by its RTL.  This may be
4335      different from the DECL_NAME name used in the source file.  */
4336
4337   x = DECL_RTL (current_function_decl);
4338   gcc_assert (MEM_P (x));
4339   x = XEXP (x, 0);
4340   gcc_assert (GET_CODE (x) == SYMBOL_REF);
4341   fnname = XSTR (x, 0);
4342
4343   assemble_start_function (current_function_decl, fnname);
4344   final_start_function (get_insns (), asm_out_file, optimize);
4345   final (get_insns (), asm_out_file, optimize);
4346   final_end_function ();
4347
4348   /* The IA-64 ".handlerdata" directive must be issued before the ".endp"
4349      directive that closes the procedure descriptor.  Similarly, for x64 SEH.
4350      Otherwise it's not strictly necessary, but it doesn't hurt either.  */
4351   output_function_exception_table (fnname);
4352
4353   assemble_end_function (current_function_decl, fnname);
4354
4355   user_defined_section_attribute = false;
4356
4357   /* Free up reg info memory.  */
4358   free_reg_info ();
4359
4360   if (! quiet_flag)
4361     fflush (asm_out_file);
4362
4363   /* Write DBX symbols if requested.  */
4364
4365   /* Note that for those inline functions where we don't initially
4366      know for certain that we will be generating an out-of-line copy,
4367      the first invocation of this routine (rest_of_compilation) will
4368      skip over this code by doing a `goto exit_rest_of_compilation;'.
4369      Later on, wrapup_global_declarations will (indirectly) call
4370      rest_of_compilation again for those inline functions that need
4371      to have out-of-line copies generated.  During that call, we
4372      *will* be routed past here.  */
4373
4374   timevar_push (TV_SYMOUT);
4375   if (!DECL_IGNORED_P (current_function_decl))
4376     debug_hooks->function_decl (current_function_decl);
4377   timevar_pop (TV_SYMOUT);
4378
4379   /* Release the blocks that are linked to DECL_INITIAL() to free the memory.  */
4380   DECL_INITIAL (current_function_decl) = error_mark_node;
4381
4382   if (DECL_STATIC_CONSTRUCTOR (current_function_decl)
4383       && targetm.have_ctors_dtors)
4384     targetm.asm_out.constructor (XEXP (DECL_RTL (current_function_decl), 0),
4385                                  decl_init_priority_lookup
4386                                    (current_function_decl));
4387   if (DECL_STATIC_DESTRUCTOR (current_function_decl)
4388       && targetm.have_ctors_dtors)
4389     targetm.asm_out.destructor (XEXP (DECL_RTL (current_function_decl), 0),
4390                                 decl_fini_priority_lookup
4391                                   (current_function_decl));
4392   return 0;
4393 }
4394
4395 struct rtl_opt_pass pass_final =
4396 {
4397  {
4398   RTL_PASS,
4399   "final",                              /* name */
4400   NULL,                                 /* gate */
4401   rest_of_handle_final,                 /* execute */
4402   NULL,                                 /* sub */
4403   NULL,                                 /* next */
4404   0,                                    /* static_pass_number */
4405   TV_FINAL,                             /* tv_id */
4406   0,                                    /* properties_required */
4407   0,                                    /* properties_provided */
4408   0,                                    /* properties_destroyed */
4409   0,                                    /* todo_flags_start */
4410   TODO_ggc_collect                      /* todo_flags_finish */
4411  }
4412 };
4413
4414
4415 static unsigned int
4416 rest_of_handle_shorten_branches (void)
4417 {
4418   /* Shorten branches.  */
4419   shorten_branches (get_insns ());
4420   return 0;
4421 }
4422
4423 struct rtl_opt_pass pass_shorten_branches =
4424 {
4425  {
4426   RTL_PASS,
4427   "shorten",                            /* name */
4428   NULL,                                 /* gate */
4429   rest_of_handle_shorten_branches,      /* execute */
4430   NULL,                                 /* sub */
4431   NULL,                                 /* next */
4432   0,                                    /* static_pass_number */
4433   TV_FINAL,                             /* tv_id */
4434   0,                                    /* properties_required */
4435   0,                                    /* properties_provided */
4436   0,                                    /* properties_destroyed */
4437   0,                                    /* todo_flags_start */
4438   0                                     /* todo_flags_finish */
4439  }
4440 };
4441
4442
4443 static unsigned int
4444 rest_of_clean_state (void)
4445 {
4446   rtx insn, next;
4447   FILE *final_output = NULL;
4448   int save_unnumbered = flag_dump_unnumbered;
4449   int save_noaddr = flag_dump_noaddr;
4450
4451   if (flag_dump_final_insns)
4452     {
4453       final_output = fopen (flag_dump_final_insns, "a");
4454       if (!final_output)
4455         {
4456           error ("could not open final insn dump file %qs: %m",
4457                  flag_dump_final_insns);
4458           flag_dump_final_insns = NULL;
4459         }
4460       else
4461         {
4462           flag_dump_noaddr = flag_dump_unnumbered = 1;
4463           if (flag_compare_debug_opt || flag_compare_debug)
4464             dump_flags |= TDF_NOUID;
4465           dump_function_header (final_output, current_function_decl,
4466                                 dump_flags);
4467           final_insns_dump_p = true;
4468
4469           for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4470             if (LABEL_P (insn))
4471               INSN_UID (insn) = CODE_LABEL_NUMBER (insn);
4472             else
4473               {
4474                 if (NOTE_P (insn))
4475                   set_block_for_insn (insn, NULL);
4476                 INSN_UID (insn) = 0;
4477               }
4478         }
4479     }
4480
4481   /* It is very important to decompose the RTL instruction chain here:
4482      debug information keeps pointing into CODE_LABEL insns inside the function
4483      body.  If these remain pointing to the other insns, we end up preserving
4484      whole RTL chain and attached detailed debug info in memory.  */
4485   for (insn = get_insns (); insn; insn = next)
4486     {
4487       next = NEXT_INSN (insn);
4488       NEXT_INSN (insn) = NULL;
4489       PREV_INSN (insn) = NULL;
4490
4491       if (final_output
4492           && (!NOTE_P (insn) ||
4493               (NOTE_KIND (insn) != NOTE_INSN_VAR_LOCATION
4494                && NOTE_KIND (insn) != NOTE_INSN_CALL_ARG_LOCATION
4495                && NOTE_KIND (insn) != NOTE_INSN_BLOCK_BEG
4496                && NOTE_KIND (insn) != NOTE_INSN_BLOCK_END
4497                && NOTE_KIND (insn) != NOTE_INSN_DELETED_DEBUG_LABEL)))
4498         print_rtl_single (final_output, insn);
4499     }
4500
4501   if (final_output)
4502     {
4503       flag_dump_noaddr = save_noaddr;
4504       flag_dump_unnumbered = save_unnumbered;
4505       final_insns_dump_p = false;
4506
4507       if (fclose (final_output))
4508         {
4509           error ("could not close final insn dump file %qs: %m",
4510                  flag_dump_final_insns);
4511           flag_dump_final_insns = NULL;
4512         }
4513     }
4514
4515   /* In case the function was not output,
4516      don't leave any temporary anonymous types
4517      queued up for sdb output.  */
4518 #ifdef SDB_DEBUGGING_INFO
4519   if (write_symbols == SDB_DEBUG)
4520     sdbout_types (NULL_TREE);
4521 #endif
4522
4523   flag_rerun_cse_after_global_opts = 0;
4524   reload_completed = 0;
4525   epilogue_completed = 0;
4526 #ifdef STACK_REGS
4527   regstack_completed = 0;
4528 #endif
4529
4530   /* Clear out the insn_length contents now that they are no
4531      longer valid.  */
4532   init_insn_lengths ();
4533
4534   /* Show no temporary slots allocated.  */
4535   init_temp_slots ();
4536
4537   free_bb_for_insn ();
4538
4539   delete_tree_ssa ();
4540
4541   /* We can reduce stack alignment on call site only when we are sure that
4542      the function body just produced will be actually used in the final
4543      executable.  */
4544   if (decl_binds_to_current_def_p (current_function_decl))
4545     {
4546       unsigned int pref = crtl->preferred_stack_boundary;
4547       if (crtl->stack_alignment_needed > crtl->preferred_stack_boundary)
4548         pref = crtl->stack_alignment_needed;
4549       cgraph_rtl_info (current_function_decl)->preferred_incoming_stack_boundary
4550         = pref;
4551     }
4552
4553   /* Make sure volatile mem refs aren't considered valid operands for
4554      arithmetic insns.  We must call this here if this is a nested inline
4555      function, since the above code leaves us in the init_recog state,
4556      and the function context push/pop code does not save/restore volatile_ok.
4557
4558      ??? Maybe it isn't necessary for expand_start_function to call this
4559      anymore if we do it here?  */
4560
4561   init_recog_no_volatile ();
4562
4563   /* We're done with this function.  Free up memory if we can.  */
4564   free_after_parsing (cfun);
4565   free_after_compilation (cfun);
4566   return 0;
4567 }
4568
4569 struct rtl_opt_pass pass_clean_state =
4570 {
4571  {
4572   RTL_PASS,
4573   "*clean_state",                       /* name */
4574   NULL,                                 /* gate */
4575   rest_of_clean_state,                  /* execute */
4576   NULL,                                 /* sub */
4577   NULL,                                 /* next */
4578   0,                                    /* static_pass_number */
4579   TV_FINAL,                             /* tv_id */
4580   0,                                    /* properties_required */
4581   0,                                    /* properties_provided */
4582   PROP_rtl,                             /* properties_destroyed */
4583   0,                                    /* todo_flags_start */
4584   0                                     /* todo_flags_finish */
4585  }
4586 };