OSDN Git Service

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