OSDN Git Service

(expand_asm_operands): Properly ignore invalid reg in clobber.
[pf3gnuchains/gcc-fork.git] / gcc / stmt.c
1 /* Expands front end tree to back end RTL for GNU C-Compiler
2    Copyright (C) 1987, 88, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20
21 /* This file handles the generation of rtl code from tree structure
22    above the level of expressions, using subroutines in exp*.c and emit-rtl.c.
23    It also creates the rtl expressions for parameters and auto variables
24    and has full responsibility for allocating stack slots.
25
26    The functions whose names start with `expand_' are called by the
27    parser to generate RTL instructions for various kinds of constructs.
28
29    Some control and binding constructs require calling several such
30    functions at different times.  For example, a simple if-then
31    is expanded by calling `expand_start_cond' (with the condition-expression
32    as argument) before parsing the then-clause and calling `expand_end_cond'
33    after parsing the then-clause.  */
34
35 #include "config.h"
36
37 #include <stdio.h>
38 #include <ctype.h>
39
40 #include "rtl.h"
41 #include "tree.h"
42 #include "flags.h"
43 #include "function.h"
44 #include "insn-flags.h"
45 #include "insn-config.h"
46 #include "insn-codes.h"
47 #include "expr.h"
48 #include "hard-reg-set.h"
49 #include "obstack.h"
50 #include "loop.h"
51 #include "recog.h"
52 #include "machmode.h"
53
54 #include "bytecode.h"
55 #include "bc-typecd.h"
56 #include "bc-opcode.h"
57 #include "bc-optab.h"
58 #include "bc-emit.h"
59
60 #define obstack_chunk_alloc xmalloc
61 #define obstack_chunk_free free
62 struct obstack stmt_obstack;
63
64 /* Filename and line number of last line-number note,
65    whether we actually emitted it or not.  */
66 char *emit_filename;
67 int emit_lineno;
68
69 /* Nonzero if within a ({...}) grouping, in which case we must
70    always compute a value for each expr-stmt in case it is the last one.  */
71
72 int expr_stmts_for_value;
73
74 /* Each time we expand an expression-statement,
75    record the expr's type and its RTL value here.  */
76
77 static tree last_expr_type;
78 static rtx last_expr_value;
79
80 /* Each time we expand the end of a binding contour (in `expand_end_bindings')
81    and we emit a new NOTE_INSN_BLOCK_END note, we save a pointer to it here.
82    This is used by the `remember_end_note' function to record the endpoint
83    of each generated block in its associated BLOCK node.  */
84
85 static rtx last_block_end_note;
86
87 /* Number of binding contours started so far in this function.  */
88
89 int block_start_count;
90
91 /* Nonzero if function being compiled needs to
92    return the address of where it has put a structure value.  */
93
94 extern int current_function_returns_pcc_struct;
95
96 /* Label that will go on parm cleanup code, if any.
97    Jumping to this label runs cleanup code for parameters, if
98    such code must be run.  Following this code is the logical return label.  */
99
100 extern rtx cleanup_label;
101
102 /* Label that will go on function epilogue.
103    Jumping to this label serves as a "return" instruction
104    on machines which require execution of the epilogue on all returns.  */
105
106 extern rtx return_label;
107
108 /* List (chain of EXPR_LISTs) of pseudo-regs of SAVE_EXPRs.
109    So we can mark them all live at the end of the function, if nonopt.  */
110 extern rtx save_expr_regs;
111
112 /* Offset to end of allocated area of stack frame.
113    If stack grows down, this is the address of the last stack slot allocated.
114    If stack grows up, this is the address for the next slot.  */
115 extern int frame_offset;
116
117 /* Label to jump back to for tail recursion, or 0 if we have
118    not yet needed one for this function.  */
119 extern rtx tail_recursion_label;
120
121 /* Place after which to insert the tail_recursion_label if we need one.  */
122 extern rtx tail_recursion_reentry;
123
124 /* Location at which to save the argument pointer if it will need to be
125    referenced.  There are two cases where this is done: if nonlocal gotos
126    exist, or if vars whose is an offset from the argument pointer will be
127    needed by inner routines.  */
128
129 extern rtx arg_pointer_save_area;
130
131 /* Chain of all RTL_EXPRs that have insns in them.  */
132 extern tree rtl_expr_chain;
133
134 #if 0  /* Turned off because 0 seems to work just as well.  */
135 /* Cleanup lists are required for binding levels regardless of whether
136    that binding level has cleanups or not.  This node serves as the
137    cleanup list whenever an empty list is required.  */
138 static tree empty_cleanup_list;
139 #endif
140
141 extern void (*interim_eh_hook)  PROTO((tree));
142 \f
143 /* Functions and data structures for expanding case statements.  */
144
145 /* Case label structure, used to hold info on labels within case
146    statements.  We handle "range" labels; for a single-value label
147    as in C, the high and low limits are the same.
148
149    A chain of case nodes is initially maintained via the RIGHT fields
150    in the nodes.  Nodes with higher case values are later in the list.
151
152    Switch statements can be output in one of two forms.  A branch table
153    is used if there are more than a few labels and the labels are dense
154    within the range between the smallest and largest case value.  If a
155    branch table is used, no further manipulations are done with the case
156    node chain.
157
158    The alternative to the use of a branch table is to generate a series
159    of compare and jump insns.  When that is done, we use the LEFT, RIGHT,
160    and PARENT fields to hold a binary tree.  Initially the tree is
161    totally unbalanced, with everything on the right.  We balance the tree
162    with nodes on the left having lower case values than the parent
163    and nodes on the right having higher values.  We then output the tree
164    in order.  */
165
166 struct case_node
167 {
168   struct case_node      *left;  /* Left son in binary tree */
169   struct case_node      *right; /* Right son in binary tree; also node chain */
170   struct case_node      *parent; /* Parent of node in binary tree */
171   tree                  low;    /* Lowest index value for this label */
172   tree                  high;   /* Highest index value for this label */
173   tree                  code_label; /* Label to jump to when node matches */
174 };
175
176 typedef struct case_node case_node;
177 typedef struct case_node *case_node_ptr;
178
179 /* These are used by estimate_case_costs and balance_case_nodes.  */
180
181 /* This must be a signed type, and non-ANSI compilers lack signed char.  */
182 static short *cost_table;
183 static int use_cost_table;
184 \f
185 /* Stack of control and binding constructs we are currently inside.
186
187    These constructs begin when you call `expand_start_WHATEVER'
188    and end when you call `expand_end_WHATEVER'.  This stack records
189    info about how the construct began that tells the end-function
190    what to do.  It also may provide information about the construct
191    to alter the behavior of other constructs within the body.
192    For example, they may affect the behavior of C `break' and `continue'.
193
194    Each construct gets one `struct nesting' object.
195    All of these objects are chained through the `all' field.
196    `nesting_stack' points to the first object (innermost construct).
197    The position of an entry on `nesting_stack' is in its `depth' field.
198
199    Each type of construct has its own individual stack.
200    For example, loops have `loop_stack'.  Each object points to the
201    next object of the same type through the `next' field.
202
203    Some constructs are visible to `break' exit-statements and others
204    are not.  Which constructs are visible depends on the language.
205    Therefore, the data structure allows each construct to be visible
206    or not, according to the args given when the construct is started.
207    The construct is visible if the `exit_label' field is non-null.
208    In that case, the value should be a CODE_LABEL rtx.  */
209
210 struct nesting
211 {
212   struct nesting *all;
213   struct nesting *next;
214   int depth;
215   rtx exit_label;
216   union
217     {
218       /* For conds (if-then and if-then-else statements).  */
219       struct
220         {
221           /* Label for the end of the if construct.
222              There is none if EXITFLAG was not set
223              and no `else' has been seen yet.  */
224           rtx endif_label;
225           /* Label for the end of this alternative.
226              This may be the end of the if or the next else/elseif. */
227           rtx next_label;
228         } cond;
229       /* For loops.  */
230       struct
231         {
232           /* Label at the top of the loop; place to loop back to.  */
233           rtx start_label;
234           /* Label at the end of the whole construct.  */
235           rtx end_label;
236           /* Label before a jump that branches to the end of the whole
237              construct.  This is where destructors go if any.  */
238           rtx alt_end_label;
239           /* Label for `continue' statement to jump to;
240              this is in front of the stepper of the loop.  */
241           rtx continue_label;
242         } loop;
243       /* For variable binding contours.  */
244       struct
245         {
246           /* Sequence number of this binding contour within the function,
247              in order of entry.  */
248           int block_start_count;
249           /* Nonzero => value to restore stack to on exit.  Complemented by
250              bc_stack_level (see below) when generating bytecodes. */
251           rtx stack_level;
252           /* The NOTE that starts this contour.
253              Used by expand_goto to check whether the destination
254              is within each contour or not.  */
255           rtx first_insn;
256           /* Innermost containing binding contour that has a stack level.  */
257           struct nesting *innermost_stack_block;
258           /* List of cleanups to be run on exit from this contour.
259              This is a list of expressions to be evaluated.
260              The TREE_PURPOSE of each link is the ..._DECL node
261              which the cleanup pertains to.  */
262           tree cleanups;
263           /* List of cleanup-lists of blocks containing this block,
264              as they were at the locus where this block appears.
265              There is an element for each containing block,
266              ordered innermost containing block first.
267              The tail of this list can be 0 (was empty_cleanup_list),
268              if all remaining elements would be empty lists.
269              The element's TREE_VALUE is the cleanup-list of that block,
270              which may be null.  */
271           tree outer_cleanups;
272           /* Chain of labels defined inside this binding contour.
273              For contours that have stack levels or cleanups.  */
274           struct label_chain *label_chain;
275           /* Number of function calls seen, as of start of this block.  */
276           int function_call_count;
277           /* Bytecode specific: stack level to restore stack to on exit.  */
278           int bc_stack_level;
279         } block;
280       /* For switch (C) or case (Pascal) statements,
281          and also for dummies (see `expand_start_case_dummy').  */
282       struct
283         {
284           /* The insn after which the case dispatch should finally
285              be emitted.  Zero for a dummy.  */
286           rtx start;
287           /* For bytecodes, the case table is in-lined right in the code.
288              A label is needed for skipping over this block. It is only
289              used when generating bytecodes. */
290           rtx skip_label;
291           /* A list of case labels, kept in ascending order by value
292              as the list is built.
293              During expand_end_case, this list may be rearranged into a
294              nearly balanced binary tree.  */
295           struct case_node *case_list;
296           /* Label to jump to if no case matches.  */
297           tree default_label;
298           /* The expression to be dispatched on.  */
299           tree index_expr;
300           /* Type that INDEX_EXPR should be converted to.  */
301           tree nominal_type;
302           /* Number of range exprs in case statement.  */
303           int num_ranges;
304           /* Name of this kind of statement, for warnings.  */
305           char *printname;
306           /* Nonzero if a case label has been seen in this case stmt.  */
307           char seenlabel;
308         } case_stmt;
309     } data;
310 };
311
312 /* Chain of all pending binding contours.  */
313 struct nesting *block_stack;
314
315 /* If any new stacks are added here, add them to POPSTACKS too.  */
316
317 /* Chain of all pending binding contours that restore stack levels
318    or have cleanups.  */
319 struct nesting *stack_block_stack;
320
321 /* Chain of all pending conditional statements.  */
322 struct nesting *cond_stack;
323
324 /* Chain of all pending loops.  */
325 struct nesting *loop_stack;
326
327 /* Chain of all pending case or switch statements.  */
328 struct nesting *case_stack;
329
330 /* Separate chain including all of the above,
331    chained through the `all' field.  */
332 struct nesting *nesting_stack;
333
334 /* Number of entries on nesting_stack now.  */
335 int nesting_depth;
336
337 /* Allocate and return a new `struct nesting'.  */
338
339 #define ALLOC_NESTING() \
340  (struct nesting *) obstack_alloc (&stmt_obstack, sizeof (struct nesting))
341
342 /* Pop the nesting stack element by element until we pop off
343    the element which is at the top of STACK.
344    Update all the other stacks, popping off elements from them
345    as we pop them from nesting_stack.  */
346
347 #define POPSTACK(STACK)                                 \
348 do { struct nesting *target = STACK;                    \
349      struct nesting *this;                              \
350      do { this = nesting_stack;                         \
351           if (loop_stack == this)                       \
352             loop_stack = loop_stack->next;              \
353           if (cond_stack == this)                       \
354             cond_stack = cond_stack->next;              \
355           if (block_stack == this)                      \
356             block_stack = block_stack->next;            \
357           if (stack_block_stack == this)                \
358             stack_block_stack = stack_block_stack->next; \
359           if (case_stack == this)                       \
360             case_stack = case_stack->next;              \
361           nesting_depth = nesting_stack->depth - 1;     \
362           nesting_stack = this->all;                    \
363           obstack_free (&stmt_obstack, this); }         \
364      while (this != target); } while (0)
365 \f
366 /* In some cases it is impossible to generate code for a forward goto
367    until the label definition is seen.  This happens when it may be necessary
368    for the goto to reset the stack pointer: we don't yet know how to do that.
369    So expand_goto puts an entry on this fixup list.
370    Each time a binding contour that resets the stack is exited,
371    we check each fixup.
372    If the target label has now been defined, we can insert the proper code.  */
373
374 struct goto_fixup
375 {
376   /* Points to following fixup.  */
377   struct goto_fixup *next;
378   /* Points to the insn before the jump insn.
379      If more code must be inserted, it goes after this insn.  */
380   rtx before_jump;
381   /* The LABEL_DECL that this jump is jumping to, or 0
382      for break, continue or return.  */
383   tree target;
384   /* The BLOCK for the place where this goto was found.  */
385   tree context;
386   /* The CODE_LABEL rtx that this is jumping to.  */
387   rtx target_rtl;
388   /* Number of binding contours started in current function
389      before the label reference.  */
390   int block_start_count;
391   /* The outermost stack level that should be restored for this jump.
392      Each time a binding contour that resets the stack is exited,
393      if the target label is *not* yet defined, this slot is updated.  */
394   rtx stack_level;
395   /* List of lists of cleanup expressions to be run by this goto.
396      There is one element for each block that this goto is within.
397      The tail of this list can be 0 (was empty_cleanup_list),
398      if all remaining elements would be empty.
399      The TREE_VALUE contains the cleanup list of that block as of the
400      time this goto was seen.
401      The TREE_ADDRESSABLE flag is 1 for a block that has been exited.  */
402   tree cleanup_list_list;
403
404   /* Bytecode specific members follow */
405
406   /* The label that this jump is jumping to, or 0 for break, continue
407      or return.  */
408   struct bc_label *bc_target;
409
410   /* The label we use for the fixup patch */
411   struct bc_label *label;
412
413   /* True (non-0) if fixup has been handled */
414   int bc_handled:1;
415
416   /* Like stack_level above, except refers to the interpreter stack */
417   int bc_stack_level;
418 };
419
420 static struct goto_fixup *goto_fixup_chain;
421
422 /* Within any binding contour that must restore a stack level,
423    all labels are recorded with a chain of these structures.  */
424
425 struct label_chain
426 {
427   /* Points to following fixup.  */
428   struct label_chain *next;
429   tree label;
430 };
431 static void expand_goto_internal        PROTO((tree, rtx, rtx));
432 static void bc_expand_goto_internal     PROTO((enum bytecode_opcode,
433                                                struct bc_label *, tree));
434 static int expand_fixup                 PROTO((tree, rtx, rtx));
435 static void bc_expand_fixup             PROTO((enum bytecode_opcode,
436                                                struct bc_label *, int));
437 static void fixup_gotos                 PROTO((struct nesting *, rtx, tree,
438                                                rtx, int));
439 static void bc_fixup_gotos              PROTO((struct nesting *, int, tree,
440                                                rtx, int));
441 static void bc_expand_start_cond        PROTO((tree, int));
442 static void bc_expand_end_cond          PROTO((void));
443 static void bc_expand_start_else        PROTO((void));
444 static void bc_expand_end_loop          PROTO((void));
445 static void bc_expand_end_bindings      PROTO((tree, int, int));
446 static void bc_expand_decl              PROTO((tree, tree));
447 static void bc_expand_variable_local_init PROTO((tree));
448 static void bc_expand_decl_init         PROTO((tree));
449 static void expand_null_return_1        PROTO((rtx, int));
450 static void expand_value_return         PROTO((rtx));
451 static int tail_recursion_args          PROTO((tree, tree));
452 static void expand_cleanups             PROTO((tree, tree, int, int));
453 static void bc_expand_start_case        PROTO((struct nesting *, tree,
454                                                tree, char *));
455 static int bc_pushcase                  PROTO((tree, tree));
456 static void bc_check_for_full_enumeration_handling PROTO((tree));
457 static void bc_expand_end_case          PROTO((tree));
458 static void do_jump_if_equal            PROTO((rtx, rtx, rtx, int));
459 static int estimate_case_costs          PROTO((case_node_ptr));
460 static void group_case_nodes            PROTO((case_node_ptr));
461 static void balance_case_nodes          PROTO((case_node_ptr *,
462                                                case_node_ptr));
463 static int node_has_low_bound           PROTO((case_node_ptr, tree));
464 static int node_has_high_bound          PROTO((case_node_ptr, tree));
465 static int node_is_bounded              PROTO((case_node_ptr, tree));
466 static void emit_jump_if_reachable      PROTO((rtx));
467 static void emit_case_nodes             PROTO((rtx, case_node_ptr, rtx, tree));
468
469 int bc_expand_exit_loop_if_false ();
470 void bc_expand_start_cond ();
471 void bc_expand_end_cond ();
472 void bc_expand_start_else ();
473 void bc_expand_end_bindings ();
474 void bc_expand_start_case ();
475 void bc_check_for_full_enumeration_handling ();
476 void bc_expand_end_case ();
477 void bc_expand_decl ();
478
479 extern rtx bc_allocate_local ();
480 extern rtx bc_allocate_variable_array ();
481 \f
482 void
483 init_stmt ()
484 {
485   gcc_obstack_init (&stmt_obstack);
486 #if 0
487   empty_cleanup_list = build_tree_list (NULL_TREE, NULL_TREE);
488 #endif
489 }
490
491 void
492 init_stmt_for_function ()
493 {
494   /* We are not currently within any block, conditional, loop or case.  */
495   block_stack = 0;
496   stack_block_stack = 0;
497   loop_stack = 0;
498   case_stack = 0;
499   cond_stack = 0;
500   nesting_stack = 0;
501   nesting_depth = 0;
502
503   block_start_count = 0;
504
505   /* No gotos have been expanded yet.  */
506   goto_fixup_chain = 0;
507
508   /* We are not processing a ({...}) grouping.  */
509   expr_stmts_for_value = 0;
510   last_expr_type = 0;
511 }
512
513 void
514 save_stmt_status (p)
515      struct function *p;
516 {
517   p->block_stack = block_stack;
518   p->stack_block_stack = stack_block_stack;
519   p->cond_stack = cond_stack;
520   p->loop_stack = loop_stack;
521   p->case_stack = case_stack;
522   p->nesting_stack = nesting_stack;
523   p->nesting_depth = nesting_depth;
524   p->block_start_count = block_start_count;
525   p->last_expr_type = last_expr_type;
526   p->last_expr_value = last_expr_value;
527   p->expr_stmts_for_value = expr_stmts_for_value;
528   p->emit_filename = emit_filename;
529   p->emit_lineno = emit_lineno;
530   p->goto_fixup_chain = goto_fixup_chain;
531 }
532
533 void
534 restore_stmt_status (p)
535      struct function *p;
536 {
537   block_stack = p->block_stack;
538   stack_block_stack = p->stack_block_stack;
539   cond_stack = p->cond_stack;
540   loop_stack = p->loop_stack;
541   case_stack = p->case_stack;
542   nesting_stack = p->nesting_stack;
543   nesting_depth = p->nesting_depth;
544   block_start_count = p->block_start_count;
545   last_expr_type = p->last_expr_type;
546   last_expr_value = p->last_expr_value;
547   expr_stmts_for_value = p->expr_stmts_for_value;
548   emit_filename = p->emit_filename;
549   emit_lineno = p->emit_lineno;
550   goto_fixup_chain = p->goto_fixup_chain;
551 }
552 \f
553 /* Emit a no-op instruction.  */
554
555 void
556 emit_nop ()
557 {
558   rtx last_insn;
559
560   if (!output_bytecode)
561     {
562       last_insn = get_last_insn ();
563       if (!optimize
564           && (GET_CODE (last_insn) == CODE_LABEL
565               || prev_real_insn (last_insn) == 0))
566         emit_insn (gen_nop ());
567     }
568 }
569 \f
570 /* Return the rtx-label that corresponds to a LABEL_DECL,
571    creating it if necessary.  */
572
573 rtx
574 label_rtx (label)
575      tree label;
576 {
577   if (TREE_CODE (label) != LABEL_DECL)
578     abort ();
579
580   if (DECL_RTL (label))
581     return DECL_RTL (label);
582
583   return DECL_RTL (label) = gen_label_rtx ();
584 }
585
586 /* Add an unconditional jump to LABEL as the next sequential instruction.  */
587
588 void
589 emit_jump (label)
590      rtx label;
591 {
592   do_pending_stack_adjust ();
593   emit_jump_insn (gen_jump (label));
594   emit_barrier ();
595 }
596
597 /* Emit code to jump to the address
598    specified by the pointer expression EXP.  */
599
600 void
601 expand_computed_goto (exp)
602      tree exp;
603 {
604   if (output_bytecode)
605     {
606       bc_expand_expr (exp);
607       bc_emit_instruction (jumpP);
608     }
609   else
610     {
611       rtx x = expand_expr (exp, NULL_RTX, VOIDmode, 0);
612       emit_queue ();
613       emit_indirect_jump (x);
614     }
615 }
616 \f
617 /* Handle goto statements and the labels that they can go to.  */
618
619 /* Specify the location in the RTL code of a label LABEL,
620    which is a LABEL_DECL tree node.
621
622    This is used for the kind of label that the user can jump to with a
623    goto statement, and for alternatives of a switch or case statement.
624    RTL labels generated for loops and conditionals don't go through here;
625    they are generated directly at the RTL level, by other functions below.
626
627    Note that this has nothing to do with defining label *names*.
628    Languages vary in how they do that and what that even means.  */
629
630 void
631 expand_label (label)
632      tree label;
633 {
634   struct label_chain *p;
635
636   if (output_bytecode)
637     {
638       if (! DECL_RTL (label))
639         DECL_RTL (label) = bc_gen_rtx ((char *) 0, 0, bc_get_bytecode_label ());
640       if (! bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (DECL_RTL (label))))
641         error ("multiply defined label");
642       return;
643     }
644
645   do_pending_stack_adjust ();
646   emit_label (label_rtx (label));
647   if (DECL_NAME (label))
648     LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
649
650   if (stack_block_stack != 0)
651     {
652       p = (struct label_chain *) oballoc (sizeof (struct label_chain));
653       p->next = stack_block_stack->data.block.label_chain;
654       stack_block_stack->data.block.label_chain = p;
655       p->label = label;
656     }
657 }
658
659 /* Declare that LABEL (a LABEL_DECL) may be used for nonlocal gotos
660    from nested functions.  */
661
662 void
663 declare_nonlocal_label (label)
664      tree label;
665 {
666   nonlocal_labels = tree_cons (NULL_TREE, label, nonlocal_labels);
667   LABEL_PRESERVE_P (label_rtx (label)) = 1;
668   if (nonlocal_goto_handler_slot == 0)
669     {
670       nonlocal_goto_handler_slot
671         = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
672       emit_stack_save (SAVE_NONLOCAL,
673                        &nonlocal_goto_stack_level,
674                        PREV_INSN (tail_recursion_reentry));
675     }
676 }
677
678 /* Generate RTL code for a `goto' statement with target label LABEL.
679    LABEL should be a LABEL_DECL tree node that was or will later be
680    defined with `expand_label'.  */
681
682 void
683 expand_goto (label)
684      tree label;
685 {
686   tree context;
687
688   if (output_bytecode)
689     {
690       expand_goto_internal (label, label_rtx (label), NULL_RTX);
691       return;
692     }
693
694   /* Check for a nonlocal goto to a containing function.  */
695   context = decl_function_context (label);
696   if (context != 0 && context != current_function_decl)
697     {
698       struct function *p = find_function_data (context);
699       rtx label_ref = gen_rtx (LABEL_REF, Pmode, label_rtx (label));
700       rtx temp;
701
702       p->has_nonlocal_label = 1;
703       current_function_has_nonlocal_goto = 1;
704       LABEL_REF_NONLOCAL_P (label_ref) = 1;
705
706       /* Copy the rtl for the slots so that they won't be shared in
707          case the virtual stack vars register gets instantiated differently
708          in the parent than in the child.  */
709
710 #if HAVE_nonlocal_goto
711       if (HAVE_nonlocal_goto)
712         emit_insn (gen_nonlocal_goto (lookup_static_chain (label),
713                                       copy_rtx (p->nonlocal_goto_handler_slot),
714                                       copy_rtx (p->nonlocal_goto_stack_level),
715                                       label_ref));
716       else
717 #endif
718         {
719           rtx addr;
720
721           /* Restore frame pointer for containing function.
722              This sets the actual hard register used for the frame pointer
723              to the location of the function's incoming static chain info.
724              The non-local goto handler will then adjust it to contain the
725              proper value and reload the argument pointer, if needed.  */
726           emit_move_insn (hard_frame_pointer_rtx, lookup_static_chain (label));
727
728           /* We have now loaded the frame pointer hardware register with
729              the address of that corresponds to the start of the virtual
730              stack vars.  So replace virtual_stack_vars_rtx in all
731              addresses we use with stack_pointer_rtx.  */
732
733           /* Get addr of containing function's current nonlocal goto handler,
734              which will do any cleanups and then jump to the label.  */
735           addr = copy_rtx (p->nonlocal_goto_handler_slot);
736           temp = copy_to_reg (replace_rtx (addr, virtual_stack_vars_rtx,
737                                            hard_frame_pointer_rtx));
738           
739           /* Restore the stack pointer.  Note this uses fp just restored.  */
740           addr = p->nonlocal_goto_stack_level;
741           if (addr)
742             addr = replace_rtx (copy_rtx (addr),
743                                 virtual_stack_vars_rtx,
744                                 hard_frame_pointer_rtx);
745
746           emit_stack_restore (SAVE_NONLOCAL, addr, NULL_RTX);
747
748           /* Put in the static chain register the nonlocal label address.  */
749           emit_move_insn (static_chain_rtx, label_ref);
750           /* USE of hard_frame_pointer_rtx added for consistency; not clear if
751              really needed.  */
752           emit_insn (gen_rtx (USE, VOIDmode, hard_frame_pointer_rtx));
753           emit_insn (gen_rtx (USE, VOIDmode, stack_pointer_rtx));
754           emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx));
755           emit_indirect_jump (temp);
756         }
757      }
758   else
759     expand_goto_internal (label, label_rtx (label), NULL_RTX);
760 }
761
762 /* Generate RTL code for a `goto' statement with target label BODY.
763    LABEL should be a LABEL_REF.
764    LAST_INSN, if non-0, is the rtx we should consider as the last
765    insn emitted (for the purposes of cleaning up a return).  */
766
767 static void
768 expand_goto_internal (body, label, last_insn)
769      tree body;
770      rtx label;
771      rtx last_insn;
772 {
773   struct nesting *block;
774   rtx stack_level = 0;
775
776   /* NOTICE!  If a bytecode instruction other than `jump' is needed,
777      then the caller has to call bc_expand_goto_internal()
778      directly. This is rather an exceptional case, and there aren't
779      that many places where this is necessary. */
780   if (output_bytecode)
781     {
782       expand_goto_internal (body, label, last_insn);
783       return;
784     }
785
786   if (GET_CODE (label) != CODE_LABEL)
787     abort ();
788
789   /* If label has already been defined, we can tell now
790      whether and how we must alter the stack level.  */
791
792   if (PREV_INSN (label) != 0)
793     {
794       /* Find the innermost pending block that contains the label.
795          (Check containment by comparing insn-uids.)
796          Then restore the outermost stack level within that block,
797          and do cleanups of all blocks contained in it.  */
798       for (block = block_stack; block; block = block->next)
799         {
800           if (INSN_UID (block->data.block.first_insn) < INSN_UID (label))
801             break;
802           if (block->data.block.stack_level != 0)
803             stack_level = block->data.block.stack_level;
804           /* Execute the cleanups for blocks we are exiting.  */
805           if (block->data.block.cleanups != 0)
806             {
807               expand_cleanups (block->data.block.cleanups, NULL_TREE, 1, 1);
808               do_pending_stack_adjust ();
809             }
810         }
811
812       if (stack_level)
813         {
814           /* Ensure stack adjust isn't done by emit_jump, as this would clobber
815              the stack pointer.  This one should be deleted as dead by flow. */
816           clear_pending_stack_adjust ();
817           do_pending_stack_adjust ();
818           emit_stack_restore (SAVE_BLOCK, stack_level, NULL_RTX);
819         }
820
821       if (body != 0 && DECL_TOO_LATE (body))
822         error ("jump to `%s' invalidly jumps into binding contour",
823                IDENTIFIER_POINTER (DECL_NAME (body)));
824     }
825   /* Label not yet defined: may need to put this goto
826      on the fixup list.  */
827   else if (! expand_fixup (body, label, last_insn))
828     {
829       /* No fixup needed.  Record that the label is the target
830          of at least one goto that has no fixup.  */
831       if (body != 0)
832         TREE_ADDRESSABLE (body) = 1;
833     }
834
835   emit_jump (label);
836 }
837 \f
838 /* Generate a jump with OPCODE to the given bytecode LABEL which is
839    found within BODY. */
840
841 static void
842 bc_expand_goto_internal (opcode, label, body)
843      enum bytecode_opcode opcode;
844      struct bc_label *label;
845      tree body;
846 {
847   struct nesting *block;
848   int stack_level = -1;
849
850   /* If the label is defined, adjust the stack as necessary.
851      If it's not defined, we have to push the reference on the
852      fixup list. */
853
854   if (label->defined)
855     {
856
857       /* Find the innermost pending block that contains the label.
858          (Check containment by comparing bytecode uids.)  Then restore the
859          outermost stack level within that block.  */
860
861       for (block = block_stack; block; block = block->next)
862         {
863           if (BYTECODE_BC_LABEL (block->data.block.first_insn)->uid < label->uid)
864             break;
865           if (block->data.block.bc_stack_level)
866             stack_level = block->data.block.bc_stack_level;
867
868           /* Execute the cleanups for blocks we are exiting.  */
869           if (block->data.block.cleanups != 0)
870             {
871               expand_cleanups (block->data.block.cleanups, NULL_TREE, 1, 1);
872               do_pending_stack_adjust ();
873             }
874         }
875
876       /* Restore the stack level. If we need to adjust the stack, we
877          must do so after the jump, since the jump may depend on
878          what's on the stack.  Thus, any stack-modifying conditional
879          jumps (these are the only ones that rely on what's on the
880          stack) go into the fixup list. */
881
882       if (stack_level >= 0
883           && stack_depth != stack_level
884           && opcode != jump)
885
886         bc_expand_fixup (opcode, label, stack_level);
887       else
888         {
889           if (stack_level >= 0)
890             bc_adjust_stack (stack_depth - stack_level);
891
892           if (body && DECL_BIT_FIELD (body))
893             error ("jump to `%s' invalidly jumps into binding contour",
894                    IDENTIFIER_POINTER (DECL_NAME (body)));
895           
896           /* Emit immediate jump */
897           bc_emit_bytecode (opcode);
898           bc_emit_bytecode_labelref (label);
899           
900 #ifdef DEBUG_PRINT_CODE
901           fputc ('\n', stderr);
902 #endif
903         }
904     }
905   else
906     /* Put goto in the fixup list */
907     bc_expand_fixup (opcode, label, stack_level);
908 }
909 \f
910 /* Generate if necessary a fixup for a goto
911    whose target label in tree structure (if any) is TREE_LABEL
912    and whose target in rtl is RTL_LABEL.
913
914    If LAST_INSN is nonzero, we pretend that the jump appears
915    after insn LAST_INSN instead of at the current point in the insn stream.
916
917    The fixup will be used later to insert insns just before the goto.
918    Those insns will restore the stack level as appropriate for the
919    target label, and will (in the case of C++) also invoke any object
920    destructors which have to be invoked when we exit the scopes which
921    are exited by the goto.
922
923    Value is nonzero if a fixup is made.  */
924
925 static int
926 expand_fixup (tree_label, rtl_label, last_insn)
927      tree tree_label;
928      rtx rtl_label;
929      rtx last_insn;
930 {
931   struct nesting *block, *end_block;
932
933   /* See if we can recognize which block the label will be output in.
934      This is possible in some very common cases.
935      If we succeed, set END_BLOCK to that block.
936      Otherwise, set it to 0.  */
937
938   if (cond_stack
939       && (rtl_label == cond_stack->data.cond.endif_label
940           || rtl_label == cond_stack->data.cond.next_label))
941     end_block = cond_stack;
942   /* If we are in a loop, recognize certain labels which
943      are likely targets.  This reduces the number of fixups
944      we need to create.  */
945   else if (loop_stack
946       && (rtl_label == loop_stack->data.loop.start_label
947           || rtl_label == loop_stack->data.loop.end_label
948           || rtl_label == loop_stack->data.loop.continue_label))
949     end_block = loop_stack;
950   else
951     end_block = 0;
952
953   /* Now set END_BLOCK to the binding level to which we will return.  */
954
955   if (end_block)
956     {
957       struct nesting *next_block = end_block->all;
958       block = block_stack;
959
960       /* First see if the END_BLOCK is inside the innermost binding level.
961          If so, then no cleanups or stack levels are relevant.  */
962       while (next_block && next_block != block)
963         next_block = next_block->all;
964
965       if (next_block)
966         return 0;
967
968       /* Otherwise, set END_BLOCK to the innermost binding level
969          which is outside the relevant control-structure nesting.  */
970       next_block = block_stack->next;
971       for (block = block_stack; block != end_block; block = block->all)
972         if (block == next_block)
973           next_block = next_block->next;
974       end_block = next_block;
975     }
976
977   /* Does any containing block have a stack level or cleanups?
978      If not, no fixup is needed, and that is the normal case
979      (the only case, for standard C).  */
980   for (block = block_stack; block != end_block; block = block->next)
981     if (block->data.block.stack_level != 0
982         || block->data.block.cleanups != 0)
983       break;
984
985   if (block != end_block)
986     {
987       /* Ok, a fixup is needed.  Add a fixup to the list of such.  */
988       struct goto_fixup *fixup
989         = (struct goto_fixup *) oballoc (sizeof (struct goto_fixup));
990       /* In case an old stack level is restored, make sure that comes
991          after any pending stack adjust.  */
992       /* ?? If the fixup isn't to come at the present position,
993          doing the stack adjust here isn't useful.  Doing it with our
994          settings at that location isn't useful either.  Let's hope
995          someone does it!  */
996       if (last_insn == 0)
997         do_pending_stack_adjust ();
998       fixup->target = tree_label;
999       fixup->target_rtl = rtl_label;
1000
1001       /* Create a BLOCK node and a corresponding matched set of
1002          NOTE_INSN_BEGIN_BLOCK and NOTE_INSN_END_BLOCK notes at
1003          this point.  The notes will encapsulate any and all fixup
1004          code which we might later insert at this point in the insn
1005          stream.  Also, the BLOCK node will be the parent (i.e. the
1006          `SUPERBLOCK') of any other BLOCK nodes which we might create
1007          later on when we are expanding the fixup code.  */
1008
1009       {
1010         register rtx original_before_jump
1011           = last_insn ? last_insn : get_last_insn ();
1012
1013         start_sequence ();
1014         pushlevel (0);
1015         fixup->before_jump = emit_note (NULL_PTR, NOTE_INSN_BLOCK_BEG);
1016         last_block_end_note = emit_note (NULL_PTR, NOTE_INSN_BLOCK_END);
1017         fixup->context = poplevel (1, 0, 0);  /* Create the BLOCK node now! */
1018         end_sequence ();
1019         emit_insns_after (fixup->before_jump, original_before_jump);
1020       }
1021
1022       fixup->block_start_count = block_start_count;
1023       fixup->stack_level = 0;
1024       fixup->cleanup_list_list
1025         = (((block->data.block.outer_cleanups
1026 #if 0
1027              && block->data.block.outer_cleanups != empty_cleanup_list
1028 #endif
1029              )
1030             || block->data.block.cleanups)
1031            ? tree_cons (NULL_TREE, block->data.block.cleanups,
1032                         block->data.block.outer_cleanups)
1033            : 0);
1034       fixup->next = goto_fixup_chain;
1035       goto_fixup_chain = fixup;
1036     }
1037
1038   return block != 0;
1039 }
1040
1041
1042 /* Generate bytecode jump with OPCODE to a fixup routine that links to LABEL.
1043    Make the fixup restore the stack level to STACK_LEVEL.  */
1044
1045 static void
1046 bc_expand_fixup (opcode, label, stack_level)
1047      enum bytecode_opcode opcode;
1048      struct bc_label *label;
1049      int stack_level;
1050 {
1051   struct goto_fixup *fixup
1052     = (struct goto_fixup *) oballoc (sizeof (struct goto_fixup));
1053
1054   fixup->label  = bc_get_bytecode_label ();
1055   fixup->bc_target = label;
1056   fixup->bc_stack_level = stack_level;
1057   fixup->bc_handled = FALSE;
1058
1059   fixup->next = goto_fixup_chain;
1060   goto_fixup_chain = fixup;
1061
1062   /* Insert a jump to the fixup code */
1063   bc_emit_bytecode (opcode);
1064   bc_emit_bytecode_labelref (fixup->label);
1065
1066 #ifdef DEBUG_PRINT_CODE
1067   fputc ('\n', stderr);
1068 #endif
1069 }
1070 \f
1071 /* Expand any needed fixups in the outputmost binding level of the
1072    function.  FIRST_INSN is the first insn in the function.  */
1073
1074 void
1075 expand_fixups (first_insn)
1076      rtx first_insn;
1077 {
1078   fixup_gotos (NULL_PTR, NULL_RTX, NULL_TREE, first_insn, 0);
1079 }
1080
1081 /* When exiting a binding contour, process all pending gotos requiring fixups.
1082    THISBLOCK is the structure that describes the block being exited.
1083    STACK_LEVEL is the rtx for the stack level to restore exiting this contour.
1084    CLEANUP_LIST is a list of expressions to evaluate on exiting this contour.
1085    FIRST_INSN is the insn that began this contour.
1086
1087    Gotos that jump out of this contour must restore the
1088    stack level and do the cleanups before actually jumping.
1089
1090    DONT_JUMP_IN nonzero means report error there is a jump into this
1091    contour from before the beginning of the contour.
1092    This is also done if STACK_LEVEL is nonzero.  */
1093
1094 static void
1095 fixup_gotos (thisblock, stack_level, cleanup_list, first_insn, dont_jump_in)
1096      struct nesting *thisblock;
1097      rtx stack_level;
1098      tree cleanup_list;
1099      rtx first_insn;
1100      int dont_jump_in;
1101 {
1102   register struct goto_fixup *f, *prev;
1103
1104   if (output_bytecode)
1105     {
1106       /* ??? The second arg is the bc stack level, which is not the same
1107          as STACK_LEVEL.  I have no idea what should go here, so I'll
1108          just pass 0.  */
1109       bc_fixup_gotos (thisblock, 0, cleanup_list, first_insn, dont_jump_in);
1110       return;
1111     }
1112
1113   /* F is the fixup we are considering; PREV is the previous one.  */
1114   /* We run this loop in two passes so that cleanups of exited blocks
1115      are run first, and blocks that are exited are marked so
1116      afterwards.  */
1117
1118   for (prev = 0, f = goto_fixup_chain; f; prev = f, f = f->next)
1119     {
1120       /* Test for a fixup that is inactive because it is already handled.  */
1121       if (f->before_jump == 0)
1122         {
1123           /* Delete inactive fixup from the chain, if that is easy to do.  */
1124           if (prev != 0)
1125             prev->next = f->next;
1126         }
1127       /* Has this fixup's target label been defined?
1128          If so, we can finalize it.  */
1129       else if (PREV_INSN (f->target_rtl) != 0)
1130         {
1131           register rtx cleanup_insns;
1132
1133           /* Get the first non-label after the label
1134              this goto jumps to.  If that's before this scope begins,
1135              we don't have a jump into the scope.  */
1136           rtx after_label = f->target_rtl;
1137           while (after_label != 0 && GET_CODE (after_label) == CODE_LABEL)
1138             after_label = NEXT_INSN (after_label);
1139
1140           /* If this fixup jumped into this contour from before the beginning
1141              of this contour, report an error.  */
1142           /* ??? Bug: this does not detect jumping in through intermediate
1143              blocks that have stack levels or cleanups.
1144              It detects only a problem with the innermost block
1145              around the label.  */
1146           if (f->target != 0
1147               && (dont_jump_in || stack_level || cleanup_list)
1148               /* If AFTER_LABEL is 0, it means the jump goes to the end
1149                  of the rtl, which means it jumps into this scope.  */
1150               && (after_label == 0
1151                   || INSN_UID (first_insn) < INSN_UID (after_label))
1152               && INSN_UID (first_insn) > INSN_UID (f->before_jump)
1153               && ! DECL_REGISTER (f->target))
1154             {
1155               error_with_decl (f->target,
1156                                "label `%s' used before containing binding contour");
1157               /* Prevent multiple errors for one label.  */
1158               DECL_REGISTER (f->target) = 1;
1159             }
1160
1161           /* We will expand the cleanups into a sequence of their own and
1162              then later on we will attach this new sequence to the insn
1163              stream just ahead of the actual jump insn.  */
1164
1165           start_sequence ();
1166
1167           /* Temporarily restore the lexical context where we will
1168              logically be inserting the fixup code.  We do this for the
1169              sake of getting the debugging information right.  */
1170
1171           pushlevel (0);
1172           set_block (f->context);
1173
1174           /* Expand the cleanups for blocks this jump exits.  */
1175           if (f->cleanup_list_list)
1176             {
1177               tree lists;
1178               for (lists = f->cleanup_list_list; lists; lists = TREE_CHAIN (lists))
1179                 /* Marked elements correspond to blocks that have been closed.
1180                    Do their cleanups.  */
1181                 if (TREE_ADDRESSABLE (lists)
1182                     && TREE_VALUE (lists) != 0)
1183                   {
1184                     expand_cleanups (TREE_VALUE (lists), NULL_TREE, 1, 1);
1185                     /* Pop any pushes done in the cleanups,
1186                        in case function is about to return.  */
1187                     do_pending_stack_adjust ();
1188                   }
1189             }
1190
1191           /* Restore stack level for the biggest contour that this
1192              jump jumps out of.  */
1193           if (f->stack_level)
1194             emit_stack_restore (SAVE_BLOCK, f->stack_level, f->before_jump);
1195
1196           /* Finish up the sequence containing the insns which implement the
1197              necessary cleanups, and then attach that whole sequence to the
1198              insn stream just ahead of the actual jump insn.  Attaching it
1199              at that point insures that any cleanups which are in fact
1200              implicit C++ object destructions (which must be executed upon
1201              leaving the block) appear (to the debugger) to be taking place
1202              in an area of the generated code where the object(s) being
1203              destructed are still "in scope".  */
1204
1205           cleanup_insns = get_insns ();
1206           poplevel (1, 0, 0);
1207
1208           end_sequence ();
1209           emit_insns_after (cleanup_insns, f->before_jump);
1210
1211
1212           f->before_jump = 0;
1213         }
1214     }
1215
1216   /* For any still-undefined labels, do the cleanups for this block now.
1217      We must do this now since items in the cleanup list may go out
1218      of scope when the block ends. */
1219   for (prev = 0, f = goto_fixup_chain; f; prev = f, f = f->next)
1220     if (f->before_jump != 0
1221         && PREV_INSN (f->target_rtl) == 0
1222         /* Label has still not appeared.  If we are exiting a block with
1223            a stack level to restore, that started before the fixup,
1224            mark this stack level as needing restoration
1225            when the fixup is later finalized.   */
1226         && thisblock != 0
1227         /* Note: if THISBLOCK == 0 and we have a label that hasn't appeared, it
1228            means the label is undefined.  That's erroneous, but possible.  */
1229         && (thisblock->data.block.block_start_count
1230             <= f->block_start_count))
1231       {
1232         tree lists = f->cleanup_list_list;
1233         rtx cleanup_insns;
1234
1235         for (; lists; lists = TREE_CHAIN (lists))
1236           /* If the following elt. corresponds to our containing block
1237              then the elt. must be for this block.  */
1238           if (TREE_CHAIN (lists) == thisblock->data.block.outer_cleanups)
1239             {
1240               start_sequence ();
1241               pushlevel (0);
1242               set_block (f->context);
1243               expand_cleanups (TREE_VALUE (lists), NULL_TREE, 1, 1);
1244               do_pending_stack_adjust ();
1245               cleanup_insns = get_insns ();
1246               poplevel (1, 0, 0);
1247               end_sequence ();
1248               f->before_jump
1249                 = emit_insns_after (cleanup_insns, f->before_jump);
1250
1251               TREE_VALUE (lists) = 0;
1252             }
1253
1254         if (stack_level)
1255           f->stack_level = stack_level;
1256       }
1257 }
1258
1259
1260 /* When exiting a binding contour, process all pending gotos requiring fixups.
1261    Note: STACK_DEPTH is not altered.
1262
1263    The arguments are currently not used in the bytecode compiler, but we may
1264    need them one day for languages other than C.
1265
1266    THISBLOCK is the structure that describes the block being exited.
1267    STACK_LEVEL is the rtx for the stack level to restore exiting this contour.
1268    CLEANUP_LIST is a list of expressions to evaluate on exiting this contour.
1269    FIRST_INSN is the insn that began this contour.
1270
1271    Gotos that jump out of this contour must restore the
1272    stack level and do the cleanups before actually jumping.
1273
1274    DONT_JUMP_IN nonzero means report error there is a jump into this
1275    contour from before the beginning of the contour.
1276    This is also done if STACK_LEVEL is nonzero.  */
1277
1278 static void
1279 bc_fixup_gotos (thisblock, stack_level, cleanup_list, first_insn, dont_jump_in)
1280      struct nesting *thisblock;
1281      int stack_level;
1282      tree cleanup_list;
1283      rtx first_insn;
1284      int dont_jump_in;
1285 {
1286   register struct goto_fixup *f, *prev;
1287   int saved_stack_depth;
1288
1289   /* F is the fixup we are considering; PREV is the previous one.  */
1290
1291   for (prev = 0, f = goto_fixup_chain; f; prev = f, f = f->next)
1292     {
1293       /* Test for a fixup that is inactive because it is already handled.  */
1294       if (f->before_jump == 0)
1295         {
1296           /* Delete inactive fixup from the chain, if that is easy to do.  */
1297           if (prev)
1298             prev->next = f->next;
1299         }
1300
1301       /* Emit code to restore the stack and continue */
1302       bc_emit_bytecode_labeldef (f->label);
1303
1304       /* Save stack_depth across call, since bc_adjust_stack () will alter
1305          the perceived stack depth via the instructions generated. */
1306
1307       if (f->bc_stack_level >= 0)
1308         {
1309           saved_stack_depth = stack_depth;
1310           bc_adjust_stack (stack_depth - f->bc_stack_level);
1311           stack_depth = saved_stack_depth;
1312         }
1313
1314       bc_emit_bytecode (jump);
1315       bc_emit_bytecode_labelref (f->bc_target);
1316
1317 #ifdef DEBUG_PRINT_CODE
1318   fputc ('\n', stderr);
1319 #endif
1320     }
1321
1322   goto_fixup_chain = NULL;
1323 }
1324 \f
1325 /* Generate RTL for an asm statement (explicit assembler code).
1326    BODY is a STRING_CST node containing the assembler code text,
1327    or an ADDR_EXPR containing a STRING_CST.  */
1328
1329 void
1330 expand_asm (body)
1331      tree body;
1332 {
1333   if (output_bytecode)
1334     {
1335       error ("`asm' is invalid when generating bytecode");
1336       return;
1337     }
1338
1339   if (TREE_CODE (body) == ADDR_EXPR)
1340     body = TREE_OPERAND (body, 0);
1341
1342   emit_insn (gen_rtx (ASM_INPUT, VOIDmode,
1343                       TREE_STRING_POINTER (body)));
1344   last_expr_type = 0;
1345 }
1346
1347 /* Generate RTL for an asm statement with arguments.
1348    STRING is the instruction template.
1349    OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs.
1350    Each output or input has an expression in the TREE_VALUE and
1351    a constraint-string in the TREE_PURPOSE.
1352    CLOBBERS is a list of STRING_CST nodes each naming a hard register
1353    that is clobbered by this insn.
1354
1355    Not all kinds of lvalue that may appear in OUTPUTS can be stored directly.
1356    Some elements of OUTPUTS may be replaced with trees representing temporary
1357    values.  The caller should copy those temporary values to the originally
1358    specified lvalues.
1359
1360    VOL nonzero means the insn is volatile; don't optimize it.  */
1361
1362 void
1363 expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
1364      tree string, outputs, inputs, clobbers;
1365      int vol;
1366      char *filename;
1367      int line;
1368 {
1369   rtvec argvec, constraints;
1370   rtx body;
1371   int ninputs = list_length (inputs);
1372   int noutputs = list_length (outputs);
1373   int nclobbers;
1374   tree tail;
1375   register int i;
1376   /* Vector of RTX's of evaluated output operands.  */
1377   rtx *output_rtx = (rtx *) alloca (noutputs * sizeof (rtx));
1378   /* The insn we have emitted.  */
1379   rtx insn;
1380
1381   if (output_bytecode)
1382     {
1383       error ("`asm' is invalid when generating bytecode");
1384       return;
1385     }
1386
1387   /* Count the number of meaningful clobbered registers, ignoring what
1388      we would ignore later.  */
1389   nclobbers = 0;
1390   for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
1391     {
1392       char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
1393       i = decode_reg_name (regname);
1394       if (i >= 0 || i == -4)
1395         ++nclobbers;
1396       else if (i == -2)
1397         error ("unknown register name `%s' in `asm'", regname);
1398     }
1399
1400   last_expr_type = 0;
1401
1402   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1403     {
1404       tree val = TREE_VALUE (tail);
1405       tree type = TREE_TYPE (val);
1406       tree val1;
1407       int j;
1408       int found_equal;
1409
1410       /* If there's an erroneous arg, emit no insn.  */
1411       if (TREE_TYPE (val) == error_mark_node)
1412         return;
1413
1414       /* Make sure constraint has `=' and does not have `+'.  */
1415
1416       found_equal = 0;
1417       for (j = 0; j < TREE_STRING_LENGTH (TREE_PURPOSE (tail)); j++)
1418         {
1419           if (TREE_STRING_POINTER (TREE_PURPOSE (tail))[j] == '+')
1420             {
1421               error ("output operand constraint contains `+'");
1422               return;
1423             }
1424           if (TREE_STRING_POINTER (TREE_PURPOSE (tail))[j] == '=')
1425             found_equal = 1;
1426         }
1427       if (! found_equal)
1428         {
1429           error ("output operand constraint lacks `='");
1430           return;
1431         }
1432
1433       /* If an output operand is not a decl or indirect ref,
1434          make a temporary to act as an intermediate.   Make the asm insn
1435          write into that, then our caller will copy it to the real output
1436          operand.  Likewise for promoted variables.  */
1437
1438       if (TREE_CODE (val) == INDIRECT_REF
1439           || (TREE_CODE_CLASS (TREE_CODE (val)) == 'd'
1440               && ! (GET_CODE (DECL_RTL (val)) == REG
1441                     && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type))))
1442         output_rtx[i] = expand_expr (TREE_VALUE (tail), NULL_RTX, VOIDmode, 0);
1443       else
1444         {
1445           if (TYPE_MODE (type) == BLKmode)
1446             {
1447               output_rtx[i] = assign_stack_temp (BLKmode,
1448                                                  int_size_in_bytes (type), 0);
1449               MEM_IN_STRUCT_P (output_rtx[i]) = AGGREGATE_TYPE_P (type);
1450             }
1451           else
1452             output_rtx[i] = gen_reg_rtx (TYPE_MODE (type));
1453
1454           TREE_VALUE (tail) = make_tree (type, output_rtx[i]);
1455         }
1456     }
1457
1458   if (ninputs + noutputs > MAX_RECOG_OPERANDS)
1459     {
1460       error ("more than %d operands in `asm'", MAX_RECOG_OPERANDS);
1461       return;
1462     }
1463
1464   /* Make vectors for the expression-rtx and constraint strings.  */
1465
1466   argvec = rtvec_alloc (ninputs);
1467   constraints = rtvec_alloc (ninputs);
1468
1469   body = gen_rtx (ASM_OPERANDS, VOIDmode,
1470                   TREE_STRING_POINTER (string), "", 0, argvec, constraints,
1471                   filename, line);
1472   MEM_VOLATILE_P (body) = vol;
1473
1474   /* Eval the inputs and put them into ARGVEC.
1475      Put their constraints into ASM_INPUTs and store in CONSTRAINTS.  */
1476
1477   i = 0;
1478   for (tail = inputs; tail; tail = TREE_CHAIN (tail))
1479     {
1480       int j;
1481
1482       /* If there's an erroneous arg, emit no insn,
1483          because the ASM_INPUT would get VOIDmode
1484          and that could cause a crash in reload.  */
1485       if (TREE_TYPE (TREE_VALUE (tail)) == error_mark_node)
1486         return;
1487       if (TREE_PURPOSE (tail) == NULL_TREE)
1488         {
1489           error ("hard register `%s' listed as input operand to `asm'",
1490                  TREE_STRING_POINTER (TREE_VALUE (tail)) );
1491           return;
1492         }
1493
1494       /* Make sure constraint has neither `=' nor `+'.  */
1495
1496       for (j = 0; j < TREE_STRING_LENGTH (TREE_PURPOSE (tail)); j++)
1497         if (TREE_STRING_POINTER (TREE_PURPOSE (tail))[j] == '='
1498             || TREE_STRING_POINTER (TREE_PURPOSE (tail))[j] == '+')
1499           {
1500             error ("input operand constraint contains `%c'",
1501                    TREE_STRING_POINTER (TREE_PURPOSE (tail))[j]);
1502             return;
1503           }
1504
1505       XVECEXP (body, 3, i)      /* argvec */
1506         = expand_expr (TREE_VALUE (tail), NULL_RTX, VOIDmode, 0);
1507       if (CONSTANT_P (XVECEXP (body, 3, i))
1508           && ! general_operand (XVECEXP (body, 3, i),
1509                                 TYPE_MODE (TREE_TYPE (TREE_VALUE (tail)))))
1510         XVECEXP (body, 3, i)
1511           = force_reg (TYPE_MODE (TREE_TYPE (TREE_VALUE (tail))),
1512                        XVECEXP (body, 3, i));
1513       XVECEXP (body, 4, i)      /* constraints */
1514         = gen_rtx (ASM_INPUT, TYPE_MODE (TREE_TYPE (TREE_VALUE (tail))),
1515                    TREE_STRING_POINTER (TREE_PURPOSE (tail)));
1516       i++;
1517     }
1518
1519   /* Protect all the operands from the queue,
1520      now that they have all been evaluated.  */
1521
1522   for (i = 0; i < ninputs; i++)
1523     XVECEXP (body, 3, i) = protect_from_queue (XVECEXP (body, 3, i), 0);
1524
1525   for (i = 0; i < noutputs; i++)
1526     output_rtx[i] = protect_from_queue (output_rtx[i], 1);
1527
1528   /* Now, for each output, construct an rtx
1529      (set OUTPUT (asm_operands INSN OUTPUTNUMBER OUTPUTCONSTRAINT
1530                                ARGVEC CONSTRAINTS))
1531      If there is more than one, put them inside a PARALLEL.  */
1532
1533   if (noutputs == 1 && nclobbers == 0)
1534     {
1535       XSTR (body, 1) = TREE_STRING_POINTER (TREE_PURPOSE (outputs));
1536       insn = emit_insn (gen_rtx (SET, VOIDmode, output_rtx[0], body));
1537     }
1538   else if (noutputs == 0 && nclobbers == 0)
1539     {
1540       /* No output operands: put in a raw ASM_OPERANDS rtx.  */
1541       insn = emit_insn (body);
1542     }
1543   else
1544     {
1545       rtx obody = body;
1546       int num = noutputs;
1547       if (num == 0) num = 1;
1548       body = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (num + nclobbers));
1549
1550       /* For each output operand, store a SET.  */
1551
1552       for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1553         {
1554           XVECEXP (body, 0, i)
1555             = gen_rtx (SET, VOIDmode,
1556                        output_rtx[i],
1557                        gen_rtx (ASM_OPERANDS, VOIDmode,
1558                                 TREE_STRING_POINTER (string),
1559                                 TREE_STRING_POINTER (TREE_PURPOSE (tail)),
1560                                 i, argvec, constraints,
1561                                 filename, line));
1562           MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol;
1563         }
1564
1565       /* If there are no outputs (but there are some clobbers)
1566          store the bare ASM_OPERANDS into the PARALLEL.  */
1567
1568       if (i == 0)
1569         XVECEXP (body, 0, i++) = obody;
1570
1571       /* Store (clobber REG) for each clobbered register specified.  */
1572
1573       for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
1574         {
1575           char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
1576           int j = decode_reg_name (regname);
1577
1578           if (j < 0)
1579             {
1580               if (j == -3)      /* `cc', which is not a register */
1581                 continue;
1582
1583               if (j == -4)      /* `memory', don't cache memory across asm */
1584                 {
1585                   XVECEXP (body, 0, i++)
1586                     = gen_rtx (CLOBBER, VOIDmode,
1587                                gen_rtx (MEM, BLKmode,
1588                                         gen_rtx (SCRATCH, VOIDmode, 0)));
1589                   continue;
1590                 }
1591
1592               /* Ignore unknown register, error already signalled.  */
1593               continue;
1594             }
1595
1596           /* Use QImode since that's guaranteed to clobber just one reg.  */
1597           XVECEXP (body, 0, i++)
1598             = gen_rtx (CLOBBER, VOIDmode, gen_rtx (REG, QImode, j));
1599         }
1600
1601       insn = emit_insn (body);
1602     }
1603
1604   free_temp_slots ();
1605 }
1606 \f
1607 /* Generate RTL to evaluate the expression EXP
1608    and remember it in case this is the VALUE in a ({... VALUE; }) constr.  */
1609
1610 void
1611 expand_expr_stmt (exp)
1612      tree exp;
1613 {
1614   if (output_bytecode)
1615     {
1616       int org_stack_depth = stack_depth;
1617
1618       bc_expand_expr (exp);
1619
1620       /* Restore stack depth */
1621       if (stack_depth < org_stack_depth)
1622         abort ();
1623       
1624       bc_emit_instruction (drop);
1625
1626       last_expr_type = TREE_TYPE (exp);
1627       return;
1628     }
1629
1630   /* If -W, warn about statements with no side effects,
1631      except for an explicit cast to void (e.g. for assert()), and
1632      except inside a ({...}) where they may be useful.  */
1633   if (expr_stmts_for_value == 0 && exp != error_mark_node)
1634     {
1635       if (! TREE_SIDE_EFFECTS (exp) && (extra_warnings || warn_unused)
1636           && !(TREE_CODE (exp) == CONVERT_EXPR
1637                && TREE_TYPE (exp) == void_type_node))
1638         warning_with_file_and_line (emit_filename, emit_lineno,
1639                                     "statement with no effect");
1640       else if (warn_unused)
1641         warn_if_unused_value (exp);
1642     }
1643
1644   /* If EXP is of function type and we are expanding statements for
1645      value, convert it to pointer-to-function.  */
1646   if (expr_stmts_for_value && TREE_CODE (TREE_TYPE (exp)) == FUNCTION_TYPE)
1647     exp = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp);
1648
1649   last_expr_type = TREE_TYPE (exp);
1650   if (! flag_syntax_only)
1651     last_expr_value = expand_expr (exp,
1652                                    (expr_stmts_for_value
1653                                     ? NULL_RTX : const0_rtx),
1654                                    VOIDmode, 0);
1655
1656   /* If all we do is reference a volatile value in memory,
1657      copy it to a register to be sure it is actually touched.  */
1658   if (last_expr_value != 0 && GET_CODE (last_expr_value) == MEM
1659       && TREE_THIS_VOLATILE (exp))
1660     {
1661       if (TYPE_MODE (TREE_TYPE (exp)) == VOIDmode)
1662         ;
1663       else if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode)
1664         copy_to_reg (last_expr_value);
1665       else
1666         {
1667           rtx lab = gen_label_rtx ();
1668           
1669           /* Compare the value with itself to reference it.  */
1670           emit_cmp_insn (last_expr_value, last_expr_value, EQ,
1671                          expand_expr (TYPE_SIZE (last_expr_type),
1672                                       NULL_RTX, VOIDmode, 0),
1673                          BLKmode, 0,
1674                          TYPE_ALIGN (last_expr_type) / BITS_PER_UNIT);
1675           emit_jump_insn ((*bcc_gen_fctn[(int) EQ]) (lab));
1676           emit_label (lab);
1677         }
1678     }
1679
1680   /* If this expression is part of a ({...}) and is in memory, we may have
1681      to preserve temporaries.  */
1682   preserve_temp_slots (last_expr_value);
1683
1684   /* Free any temporaries used to evaluate this expression.  Any temporary
1685      used as a result of this expression will already have been preserved
1686      above.  */
1687   free_temp_slots ();
1688
1689   emit_queue ();
1690 }
1691
1692 /* Warn if EXP contains any computations whose results are not used.
1693    Return 1 if a warning is printed; 0 otherwise.  */
1694
1695 int
1696 warn_if_unused_value (exp)
1697      tree exp;
1698 {
1699   if (TREE_USED (exp))
1700     return 0;
1701
1702   switch (TREE_CODE (exp))
1703     {
1704     case PREINCREMENT_EXPR:
1705     case POSTINCREMENT_EXPR:
1706     case PREDECREMENT_EXPR:
1707     case POSTDECREMENT_EXPR:
1708     case MODIFY_EXPR:
1709     case INIT_EXPR:
1710     case TARGET_EXPR:
1711     case CALL_EXPR:
1712     case METHOD_CALL_EXPR:
1713     case RTL_EXPR:
1714     case WITH_CLEANUP_EXPR:
1715     case EXIT_EXPR:
1716       /* We don't warn about COND_EXPR because it may be a useful
1717          construct if either arm contains a side effect.  */
1718     case COND_EXPR:
1719       return 0;
1720
1721     case BIND_EXPR:
1722       /* For a binding, warn if no side effect within it.  */
1723       return warn_if_unused_value (TREE_OPERAND (exp, 1));
1724
1725     case SAVE_EXPR:
1726       return warn_if_unused_value (TREE_OPERAND (exp, 1));
1727
1728     case TRUTH_ORIF_EXPR:
1729     case TRUTH_ANDIF_EXPR:
1730       /* In && or ||, warn if 2nd operand has no side effect.  */
1731       return warn_if_unused_value (TREE_OPERAND (exp, 1));
1732
1733     case COMPOUND_EXPR:
1734       if (TREE_NO_UNUSED_WARNING (exp))
1735         return 0;
1736       if (warn_if_unused_value (TREE_OPERAND (exp, 0)))
1737         return 1;
1738       /* Let people do `(foo (), 0)' without a warning.  */
1739       if (TREE_CONSTANT (TREE_OPERAND (exp, 1)))
1740         return 0;
1741       return warn_if_unused_value (TREE_OPERAND (exp, 1));
1742
1743     case NOP_EXPR:
1744     case CONVERT_EXPR:
1745     case NON_LVALUE_EXPR:
1746       /* Don't warn about values cast to void.  */
1747       if (TREE_TYPE (exp) == void_type_node)
1748         return 0;
1749       /* Don't warn about conversions not explicit in the user's program.  */
1750       if (TREE_NO_UNUSED_WARNING (exp))
1751         return 0;
1752       /* Assignment to a cast usually results in a cast of a modify.
1753          Don't complain about that.  There can be an arbitrary number of
1754          casts before the modify, so we must loop until we find the first
1755          non-cast expression and then test to see if that is a modify.  */
1756       {
1757         tree tem = TREE_OPERAND (exp, 0);
1758
1759         while (TREE_CODE (tem) == CONVERT_EXPR || TREE_CODE (tem) == NOP_EXPR)
1760           tem = TREE_OPERAND (tem, 0);
1761
1762         if (TREE_CODE (tem) == MODIFY_EXPR || TREE_CODE (tem) == INIT_EXPR
1763             || TREE_CODE (tem) == CALL_EXPR)
1764           return 0;
1765       }
1766       goto warn;
1767
1768     case INDIRECT_REF:
1769       /* Don't warn about automatic dereferencing of references, since
1770          the user cannot control it.  */
1771       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE)
1772         return warn_if_unused_value (TREE_OPERAND (exp, 0));
1773       /* ... fall through ... */
1774       
1775     default:
1776       /* Referencing a volatile value is a side effect, so don't warn.  */
1777       if ((TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
1778            || TREE_CODE_CLASS (TREE_CODE (exp)) == 'r')
1779           && TREE_THIS_VOLATILE (exp))
1780         return 0;
1781     warn:
1782       warning_with_file_and_line (emit_filename, emit_lineno,
1783                                   "value computed is not used");
1784       return 1;
1785     }
1786 }
1787
1788 /* Clear out the memory of the last expression evaluated.  */
1789
1790 void
1791 clear_last_expr ()
1792 {
1793   last_expr_type = 0;
1794 }
1795
1796 /* Begin a statement which will return a value.
1797    Return the RTL_EXPR for this statement expr.
1798    The caller must save that value and pass it to expand_end_stmt_expr.  */
1799
1800 tree
1801 expand_start_stmt_expr ()
1802 {
1803   int momentary;
1804   tree t;
1805
1806   /* When generating bytecode just note down the stack depth */
1807   if (output_bytecode)
1808     return (build_int_2 (stack_depth, 0));
1809
1810   /* Make the RTL_EXPR node temporary, not momentary,
1811      so that rtl_expr_chain doesn't become garbage.  */
1812   momentary = suspend_momentary ();
1813   t = make_node (RTL_EXPR);
1814   resume_momentary (momentary);
1815   start_sequence_for_rtl_expr (t);
1816   NO_DEFER_POP;
1817   expr_stmts_for_value++;
1818   return t;
1819 }
1820
1821 /* Restore the previous state at the end of a statement that returns a value.
1822    Returns a tree node representing the statement's value and the
1823    insns to compute the value.
1824
1825    The nodes of that expression have been freed by now, so we cannot use them.
1826    But we don't want to do that anyway; the expression has already been
1827    evaluated and now we just want to use the value.  So generate a RTL_EXPR
1828    with the proper type and RTL value.
1829
1830    If the last substatement was not an expression,
1831    return something with type `void'.  */
1832
1833 tree
1834 expand_end_stmt_expr (t)
1835      tree t;
1836 {
1837   if (output_bytecode)
1838     {
1839       int i;
1840       tree t;
1841       
1842       
1843       /* At this point, all expressions have been evaluated in order.
1844          However, all expression values have been popped when evaluated,
1845          which means we have to recover the last expression value.  This is
1846          the last value removed by means of a `drop' instruction.  Instead
1847          of adding code to inhibit dropping the last expression value, it
1848          is here recovered by undoing the `drop'.  Since `drop' is
1849          equivalent to `adjustackSI [1]', it can be undone with `adjstackSI
1850          [-1]'. */
1851       
1852       bc_adjust_stack (-1);
1853       
1854       if (!last_expr_type)
1855         last_expr_type = void_type_node;
1856       
1857       t = make_node (RTL_EXPR);
1858       TREE_TYPE (t) = last_expr_type;
1859       RTL_EXPR_RTL (t) = NULL;
1860       RTL_EXPR_SEQUENCE (t) = NULL;
1861       
1862       /* Don't consider deleting this expr or containing exprs at tree level.  */
1863       TREE_THIS_VOLATILE (t) = 1;
1864       
1865       last_expr_type = 0;
1866       return t;
1867     }
1868
1869   OK_DEFER_POP;
1870
1871   if (last_expr_type == 0)
1872     {
1873       last_expr_type = void_type_node;
1874       last_expr_value = const0_rtx;
1875     }
1876   else if (last_expr_value == 0)
1877     /* There are some cases where this can happen, such as when the
1878        statement is void type.  */
1879     last_expr_value = const0_rtx;
1880   else if (GET_CODE (last_expr_value) != REG && ! CONSTANT_P (last_expr_value))
1881     /* Remove any possible QUEUED.  */
1882     last_expr_value = protect_from_queue (last_expr_value, 0);
1883
1884   emit_queue ();
1885
1886   TREE_TYPE (t) = last_expr_type;
1887   RTL_EXPR_RTL (t) = last_expr_value;
1888   RTL_EXPR_SEQUENCE (t) = get_insns ();
1889
1890   rtl_expr_chain = tree_cons (NULL_TREE, t, rtl_expr_chain);
1891
1892   end_sequence ();
1893
1894   /* Don't consider deleting this expr or containing exprs at tree level.  */
1895   TREE_SIDE_EFFECTS (t) = 1;
1896   /* Propagate volatility of the actual RTL expr.  */
1897   TREE_THIS_VOLATILE (t) = volatile_refs_p (last_expr_value);
1898
1899   last_expr_type = 0;
1900   expr_stmts_for_value--;
1901
1902   return t;
1903 }
1904 \f
1905 /* Generate RTL for the start of an if-then.  COND is the expression
1906    whose truth should be tested.
1907
1908    If EXITFLAG is nonzero, this conditional is visible to
1909    `exit_something'.  */
1910
1911 void
1912 expand_start_cond (cond, exitflag)
1913      tree cond;
1914      int exitflag;
1915 {
1916   struct nesting *thiscond = ALLOC_NESTING ();
1917
1918   /* Make an entry on cond_stack for the cond we are entering.  */
1919
1920   thiscond->next = cond_stack;
1921   thiscond->all = nesting_stack;
1922   thiscond->depth = ++nesting_depth;
1923   thiscond->data.cond.next_label = gen_label_rtx ();
1924   /* Before we encounter an `else', we don't need a separate exit label
1925      unless there are supposed to be exit statements
1926      to exit this conditional.  */
1927   thiscond->exit_label = exitflag ? gen_label_rtx () : 0;
1928   thiscond->data.cond.endif_label = thiscond->exit_label;
1929   cond_stack = thiscond;
1930   nesting_stack = thiscond;
1931
1932   if (output_bytecode)
1933     bc_expand_start_cond (cond, exitflag);
1934   else
1935     do_jump (cond, thiscond->data.cond.next_label, NULL_RTX);
1936 }
1937
1938 /* Generate RTL between then-clause and the elseif-clause
1939    of an if-then-elseif-....  */
1940
1941 void
1942 expand_start_elseif (cond)
1943      tree cond;
1944 {
1945   if (cond_stack->data.cond.endif_label == 0)
1946     cond_stack->data.cond.endif_label = gen_label_rtx ();
1947   emit_jump (cond_stack->data.cond.endif_label);
1948   emit_label (cond_stack->data.cond.next_label);
1949   cond_stack->data.cond.next_label = gen_label_rtx ();
1950   do_jump (cond, cond_stack->data.cond.next_label, NULL_RTX);
1951 }
1952
1953 /* Generate RTL between the then-clause and the else-clause
1954    of an if-then-else.  */
1955
1956 void
1957 expand_start_else ()
1958 {
1959   if (cond_stack->data.cond.endif_label == 0)
1960     cond_stack->data.cond.endif_label = gen_label_rtx ();
1961
1962   if (output_bytecode)
1963     {
1964       bc_expand_start_else ();
1965       return;
1966     }
1967
1968   emit_jump (cond_stack->data.cond.endif_label);
1969   emit_label (cond_stack->data.cond.next_label);
1970   cond_stack->data.cond.next_label = 0;  /* No more _else or _elseif calls. */
1971 }
1972
1973 /* After calling expand_start_else, turn this "else" into an "else if"
1974    by providing another condition.  */
1975
1976 void
1977 expand_elseif (cond)
1978      tree cond;
1979 {
1980   cond_stack->data.cond.next_label = gen_label_rtx ();
1981   do_jump (cond, cond_stack->data.cond.next_label, NULL_RTX);
1982 }
1983
1984 /* Generate RTL for the end of an if-then.
1985    Pop the record for it off of cond_stack.  */
1986
1987 void
1988 expand_end_cond ()
1989 {
1990   struct nesting *thiscond = cond_stack;
1991
1992   if (output_bytecode)
1993     bc_expand_end_cond ();
1994   else
1995     {
1996       do_pending_stack_adjust ();
1997       if (thiscond->data.cond.next_label)
1998         emit_label (thiscond->data.cond.next_label);
1999       if (thiscond->data.cond.endif_label)
2000         emit_label (thiscond->data.cond.endif_label);
2001     }
2002
2003   POPSTACK (cond_stack);
2004   last_expr_type = 0;
2005 }
2006
2007
2008 /* Generate code for the start of an if-then.  COND is the expression
2009    whose truth is to be tested; if EXITFLAG is nonzero this conditional
2010    is to be visible to exit_something.  It is assumed that the caller
2011    has pushed the previous context on the cond stack. */
2012
2013 static void
2014 bc_expand_start_cond (cond, exitflag)
2015      tree cond;
2016      int exitflag;
2017 {
2018   struct nesting *thiscond = cond_stack;
2019
2020   thiscond->data.case_stmt.nominal_type = cond;
2021   if (! exitflag)
2022     thiscond->exit_label = gen_label_rtx ();
2023   bc_expand_expr (cond);
2024   bc_emit_bytecode (xjumpifnot);
2025   bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (thiscond->exit_label));
2026
2027 #ifdef DEBUG_PRINT_CODE
2028   fputc ('\n', stderr);
2029 #endif
2030 }
2031
2032 /* Generate the label for the end of an if with
2033    no else- clause.  */
2034
2035 static void
2036 bc_expand_end_cond ()
2037 {
2038   struct nesting *thiscond = cond_stack;
2039
2040   bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (thiscond->exit_label));
2041 }
2042
2043 /* Generate code for the start of the else- clause of
2044    an if-then-else.  */
2045
2046 static void
2047 bc_expand_start_else ()
2048 {
2049   struct nesting *thiscond = cond_stack;
2050
2051   thiscond->data.cond.endif_label = thiscond->exit_label;
2052   thiscond->exit_label = gen_label_rtx ();
2053   bc_emit_bytecode (jump);
2054   bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (thiscond->exit_label));
2055
2056 #ifdef DEBUG_PRINT_CODE
2057   fputc ('\n', stderr);
2058 #endif
2059
2060   bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (thiscond->data.cond.endif_label));
2061 }
2062 \f
2063 /* Generate RTL for the start of a loop.  EXIT_FLAG is nonzero if this
2064    loop should be exited by `exit_something'.  This is a loop for which
2065    `expand_continue' will jump to the top of the loop.
2066
2067    Make an entry on loop_stack to record the labels associated with
2068    this loop.  */
2069
2070 struct nesting *
2071 expand_start_loop (exit_flag)
2072      int exit_flag;
2073 {
2074   register struct nesting *thisloop = ALLOC_NESTING ();
2075
2076   /* Make an entry on loop_stack for the loop we are entering.  */
2077
2078   thisloop->next = loop_stack;
2079   thisloop->all = nesting_stack;
2080   thisloop->depth = ++nesting_depth;
2081   thisloop->data.loop.start_label = gen_label_rtx ();
2082   thisloop->data.loop.end_label = gen_label_rtx ();
2083   thisloop->data.loop.alt_end_label = 0;
2084   thisloop->data.loop.continue_label = thisloop->data.loop.start_label;
2085   thisloop->exit_label = exit_flag ? thisloop->data.loop.end_label : 0;
2086   loop_stack = thisloop;
2087   nesting_stack = thisloop;
2088
2089   if (output_bytecode)
2090     {
2091       bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (thisloop->data.loop.start_label));
2092       return thisloop;
2093     }
2094
2095   do_pending_stack_adjust ();
2096   emit_queue ();
2097   emit_note (NULL_PTR, NOTE_INSN_LOOP_BEG);
2098   emit_label (thisloop->data.loop.start_label);
2099
2100   return thisloop;
2101 }
2102
2103 /* Like expand_start_loop but for a loop where the continuation point
2104    (for expand_continue_loop) will be specified explicitly.  */
2105
2106 struct nesting *
2107 expand_start_loop_continue_elsewhere (exit_flag)
2108      int exit_flag;
2109 {
2110   struct nesting *thisloop = expand_start_loop (exit_flag);
2111   loop_stack->data.loop.continue_label = gen_label_rtx ();
2112   return thisloop;
2113 }
2114
2115 /* Specify the continuation point for a loop started with
2116    expand_start_loop_continue_elsewhere.
2117    Use this at the point in the code to which a continue statement
2118    should jump.  */
2119
2120 void
2121 expand_loop_continue_here ()
2122 {
2123   if (output_bytecode)
2124     {
2125       bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (loop_stack->data.loop.continue_label));
2126       return;
2127     }
2128   do_pending_stack_adjust ();
2129   emit_note (NULL_PTR, NOTE_INSN_LOOP_CONT);
2130   emit_label (loop_stack->data.loop.continue_label);
2131 }
2132
2133 /* End a loop.  */
2134
2135 static void
2136 bc_expand_end_loop ()
2137 {
2138   struct nesting *thisloop = loop_stack;
2139
2140   bc_emit_bytecode (jump);
2141   bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (thisloop->data.loop.start_label));
2142
2143 #ifdef DEBUG_PRINT_CODE
2144   fputc ('\n', stderr);
2145 #endif
2146
2147   bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (thisloop->exit_label));
2148   POPSTACK (loop_stack);
2149   last_expr_type = 0;
2150 }
2151
2152
2153 /* Finish a loop.  Generate a jump back to the top and the loop-exit label.
2154    Pop the block off of loop_stack.  */
2155
2156 void
2157 expand_end_loop ()
2158 {
2159   register rtx insn;
2160   register rtx start_label;
2161   rtx last_test_insn = 0;
2162   int num_insns = 0;
2163     
2164   if (output_bytecode)
2165     {
2166       bc_expand_end_loop ();
2167       return;
2168     }
2169
2170   insn = get_last_insn ();
2171   start_label = loop_stack->data.loop.start_label;
2172
2173   /* Mark the continue-point at the top of the loop if none elsewhere.  */
2174   if (start_label == loop_stack->data.loop.continue_label)
2175     emit_note_before (NOTE_INSN_LOOP_CONT, start_label);
2176
2177   do_pending_stack_adjust ();
2178
2179   /* If optimizing, perhaps reorder the loop.  If the loop
2180      starts with a conditional exit, roll that to the end
2181      where it will optimize together with the jump back.
2182
2183      We look for the last conditional branch to the exit that we encounter
2184      before hitting 30 insns or a CALL_INSN.  If we see an unconditional
2185      branch to the exit first, use it.
2186
2187      We must also stop at NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes
2188      because moving them is not valid.  */
2189
2190   if (optimize
2191       &&
2192       ! (GET_CODE (insn) == JUMP_INSN
2193          && GET_CODE (PATTERN (insn)) == SET
2194          && SET_DEST (PATTERN (insn)) == pc_rtx
2195          && GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE))
2196     {
2197       /* Scan insns from the top of the loop looking for a qualified
2198          conditional exit.  */
2199       for (insn = NEXT_INSN (loop_stack->data.loop.start_label); insn;
2200            insn = NEXT_INSN (insn))
2201         {
2202           if (GET_CODE (insn) == CALL_INSN || GET_CODE (insn) == CODE_LABEL)
2203             break;
2204
2205           if (GET_CODE (insn) == NOTE
2206               && (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG
2207                   || NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END))
2208             break;
2209
2210           if (GET_CODE (insn) == JUMP_INSN || GET_CODE (insn) == INSN)
2211             num_insns++;
2212
2213           if (last_test_insn && num_insns > 30)
2214             break;
2215
2216           if (GET_CODE (insn) == JUMP_INSN && GET_CODE (PATTERN (insn)) == SET
2217               && SET_DEST (PATTERN (insn)) == pc_rtx
2218               && GET_CODE (SET_SRC (PATTERN (insn))) == IF_THEN_ELSE
2219               && ((GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 1)) == LABEL_REF
2220                    && ((XEXP (XEXP (SET_SRC (PATTERN (insn)), 1), 0)
2221                         == loop_stack->data.loop.end_label)
2222                        || (XEXP (XEXP (SET_SRC (PATTERN (insn)), 1), 0)
2223                            == loop_stack->data.loop.alt_end_label)))
2224                   || (GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 2)) == LABEL_REF
2225                       && ((XEXP (XEXP (SET_SRC (PATTERN (insn)), 2), 0)
2226                            == loop_stack->data.loop.end_label)
2227                           || (XEXP (XEXP (SET_SRC (PATTERN (insn)), 2), 0)
2228                               == loop_stack->data.loop.alt_end_label)))))
2229             last_test_insn = insn;
2230
2231           if (last_test_insn == 0 && GET_CODE (insn) == JUMP_INSN
2232               && GET_CODE (PATTERN (insn)) == SET
2233               && SET_DEST (PATTERN (insn)) == pc_rtx
2234               && GET_CODE (SET_SRC (PATTERN (insn))) == LABEL_REF
2235               && ((XEXP (SET_SRC (PATTERN (insn)), 0)
2236                    == loop_stack->data.loop.end_label)
2237                   || (XEXP (SET_SRC (PATTERN (insn)), 0)
2238                       == loop_stack->data.loop.alt_end_label)))
2239             /* Include BARRIER.  */
2240             last_test_insn = NEXT_INSN (insn);
2241         }
2242
2243       if (last_test_insn != 0 && last_test_insn != get_last_insn ())
2244         {
2245           /* We found one.  Move everything from there up
2246              to the end of the loop, and add a jump into the loop
2247              to jump to there.  */
2248           register rtx newstart_label = gen_label_rtx ();
2249           register rtx start_move = start_label;
2250
2251           /* If the start label is preceded by a NOTE_INSN_LOOP_CONT note,
2252              then we want to move this note also.  */
2253           if (GET_CODE (PREV_INSN (start_move)) == NOTE
2254               && (NOTE_LINE_NUMBER (PREV_INSN (start_move))
2255                   == NOTE_INSN_LOOP_CONT))
2256             start_move = PREV_INSN (start_move);
2257
2258           emit_label_after (newstart_label, PREV_INSN (start_move));
2259           reorder_insns (start_move, last_test_insn, get_last_insn ());
2260           emit_jump_insn_after (gen_jump (start_label),
2261                                 PREV_INSN (newstart_label));
2262           emit_barrier_after (PREV_INSN (newstart_label));
2263           start_label = newstart_label;
2264         }
2265     }
2266
2267   emit_jump (start_label);
2268   emit_note (NULL_PTR, NOTE_INSN_LOOP_END);
2269   emit_label (loop_stack->data.loop.end_label);
2270
2271   POPSTACK (loop_stack);
2272
2273   last_expr_type = 0;
2274 }
2275
2276 /* Generate a jump to the current loop's continue-point.
2277    This is usually the top of the loop, but may be specified
2278    explicitly elsewhere.  If not currently inside a loop,
2279    return 0 and do nothing; caller will print an error message.  */
2280
2281 int
2282 expand_continue_loop (whichloop)
2283      struct nesting *whichloop;
2284 {
2285   last_expr_type = 0;
2286   if (whichloop == 0)
2287     whichloop = loop_stack;
2288   if (whichloop == 0)
2289     return 0;
2290   expand_goto_internal (NULL_TREE, whichloop->data.loop.continue_label,
2291                         NULL_RTX);
2292   return 1;
2293 }
2294
2295 /* Generate a jump to exit the current loop.  If not currently inside a loop,
2296    return 0 and do nothing; caller will print an error message.  */
2297
2298 int
2299 expand_exit_loop (whichloop)
2300      struct nesting *whichloop;
2301 {
2302   last_expr_type = 0;
2303   if (whichloop == 0)
2304     whichloop = loop_stack;
2305   if (whichloop == 0)
2306     return 0;
2307   expand_goto_internal (NULL_TREE, whichloop->data.loop.end_label, NULL_RTX);
2308   return 1;
2309 }
2310
2311 /* Generate a conditional jump to exit the current loop if COND
2312    evaluates to zero.  If not currently inside a loop,
2313    return 0 and do nothing; caller will print an error message.  */
2314
2315 int
2316 expand_exit_loop_if_false (whichloop, cond)
2317      struct nesting *whichloop;
2318      tree cond;
2319 {
2320   last_expr_type = 0;
2321   if (whichloop == 0)
2322     whichloop = loop_stack;
2323   if (whichloop == 0)
2324     return 0;
2325   if (output_bytecode)
2326     {
2327       bc_expand_expr (cond);
2328       bc_expand_goto_internal (xjumpifnot,
2329                                BYTECODE_BC_LABEL (whichloop->exit_label),
2330                                NULL_TREE);
2331     }
2332   else
2333     {
2334       /* In order to handle fixups, we actually create a conditional jump
2335          around a unconditional branch to exit the loop.  If fixups are
2336          necessary, they go before the unconditional branch.  */
2337
2338       rtx label = gen_label_rtx ();
2339       rtx last_insn;
2340
2341       do_jump (cond, NULL_RTX, label);
2342       last_insn = get_last_insn ();
2343       if (GET_CODE (last_insn) == CODE_LABEL)
2344         whichloop->data.loop.alt_end_label = last_insn;
2345       expand_goto_internal (NULL_TREE, whichloop->data.loop.end_label,
2346                             NULL_RTX);
2347       emit_label (label);
2348     }
2349
2350   return 1;
2351 }
2352
2353 /* Return non-zero if we should preserve sub-expressions as separate
2354    pseudos.  We never do so if we aren't optimizing.  We always do so
2355    if -fexpensive-optimizations.
2356
2357    Otherwise, we only do so if we are in the "early" part of a loop.  I.e.,
2358    the loop may still be a small one.  */
2359
2360 int
2361 preserve_subexpressions_p ()
2362 {
2363   rtx insn;
2364
2365   if (flag_expensive_optimizations)
2366     return 1;
2367
2368   if (optimize == 0 || loop_stack == 0)
2369     return 0;
2370
2371   insn = get_last_insn_anywhere ();
2372
2373   return (insn
2374           && (INSN_UID (insn) - INSN_UID (loop_stack->data.loop.start_label)
2375               < n_non_fixed_regs * 3));
2376
2377 }
2378
2379 /* Generate a jump to exit the current loop, conditional, binding contour
2380    or case statement.  Not all such constructs are visible to this function,
2381    only those started with EXIT_FLAG nonzero.  Individual languages use
2382    the EXIT_FLAG parameter to control which kinds of constructs you can
2383    exit this way.
2384
2385    If not currently inside anything that can be exited,
2386    return 0 and do nothing; caller will print an error message.  */
2387
2388 int
2389 expand_exit_something ()
2390 {
2391   struct nesting *n;
2392   last_expr_type = 0;
2393   for (n = nesting_stack; n; n = n->all)
2394     if (n->exit_label != 0)
2395       {
2396         expand_goto_internal (NULL_TREE, n->exit_label, NULL_RTX);
2397         return 1;
2398       }
2399
2400   return 0;
2401 }
2402 \f
2403 /* Generate RTL to return from the current function, with no value.
2404    (That is, we do not do anything about returning any value.)  */
2405
2406 void
2407 expand_null_return ()
2408 {
2409   struct nesting *block = block_stack;
2410   rtx last_insn = 0;
2411
2412   if (output_bytecode)
2413     {
2414       bc_emit_instruction (ret);
2415       return;
2416     }
2417
2418   /* Does any pending block have cleanups?  */
2419
2420   while (block && block->data.block.cleanups == 0)
2421     block = block->next;
2422
2423   /* If yes, use a goto to return, since that runs cleanups.  */
2424
2425   expand_null_return_1 (last_insn, block != 0);
2426 }
2427
2428 /* Generate RTL to return from the current function, with value VAL.  */
2429
2430 static void
2431 expand_value_return (val)
2432      rtx val;
2433 {
2434   struct nesting *block = block_stack;
2435   rtx last_insn = get_last_insn ();
2436   rtx return_reg = DECL_RTL (DECL_RESULT (current_function_decl));
2437
2438   /* Copy the value to the return location
2439      unless it's already there.  */
2440
2441   if (return_reg != val)
2442     {
2443 #ifdef PROMOTE_FUNCTION_RETURN
2444       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
2445       int unsignedp = TREE_UNSIGNED (type);
2446       enum machine_mode mode
2447         = promote_mode (type, DECL_MODE (DECL_RESULT (current_function_decl)),
2448                         &unsignedp, 1);
2449
2450       if (GET_MODE (val) != VOIDmode && GET_MODE (val) != mode)
2451         convert_move (return_reg, val, unsignedp);
2452       else
2453 #endif
2454         emit_move_insn (return_reg, val);
2455     }
2456   if (GET_CODE (return_reg) == REG
2457       && REGNO (return_reg) < FIRST_PSEUDO_REGISTER)
2458     emit_insn (gen_rtx (USE, VOIDmode, return_reg));
2459
2460   /* Does any pending block have cleanups?  */
2461
2462   while (block && block->data.block.cleanups == 0)
2463     block = block->next;
2464
2465   /* If yes, use a goto to return, since that runs cleanups.
2466      Use LAST_INSN to put cleanups *before* the move insn emitted above.  */
2467
2468   expand_null_return_1 (last_insn, block != 0);
2469 }
2470
2471 /* Output a return with no value.  If LAST_INSN is nonzero,
2472    pretend that the return takes place after LAST_INSN.
2473    If USE_GOTO is nonzero then don't use a return instruction;
2474    go to the return label instead.  This causes any cleanups
2475    of pending blocks to be executed normally.  */
2476
2477 static void
2478 expand_null_return_1 (last_insn, use_goto)
2479      rtx last_insn;
2480      int use_goto;
2481 {
2482   rtx end_label = cleanup_label ? cleanup_label : return_label;
2483
2484   clear_pending_stack_adjust ();
2485   do_pending_stack_adjust ();
2486   last_expr_type = 0;
2487
2488   /* PCC-struct return always uses an epilogue.  */
2489   if (current_function_returns_pcc_struct || use_goto)
2490     {
2491       if (end_label == 0)
2492         end_label = return_label = gen_label_rtx ();
2493       expand_goto_internal (NULL_TREE, end_label, last_insn);
2494       return;
2495     }
2496
2497   /* Otherwise output a simple return-insn if one is available,
2498      unless it won't do the job.  */
2499 #ifdef HAVE_return
2500   if (HAVE_return && use_goto == 0 && cleanup_label == 0)
2501     {
2502       emit_jump_insn (gen_return ());
2503       emit_barrier ();
2504       return;
2505     }
2506 #endif
2507
2508   /* Otherwise jump to the epilogue.  */
2509   expand_goto_internal (NULL_TREE, end_label, last_insn);
2510 }
2511 \f
2512 /* Generate RTL to evaluate the expression RETVAL and return it
2513    from the current function.  */
2514
2515 void
2516 expand_return (retval)
2517      tree retval;
2518 {
2519   /* If there are any cleanups to be performed, then they will
2520      be inserted following LAST_INSN.  It is desirable
2521      that the last_insn, for such purposes, should be the
2522      last insn before computing the return value.  Otherwise, cleanups
2523      which call functions can clobber the return value.  */
2524   /* ??? rms: I think that is erroneous, because in C++ it would
2525      run destructors on variables that might be used in the subsequent
2526      computation of the return value.  */
2527   rtx last_insn = 0;
2528   register rtx val = 0;
2529   register rtx op0;
2530   tree retval_rhs;
2531   int cleanups;
2532   struct nesting *block;
2533
2534   /* Bytecode returns are quite simple, just leave the result on the
2535      arithmetic stack. */
2536   if (output_bytecode)
2537     {
2538       bc_expand_expr (retval);
2539       bc_emit_instruction (ret);
2540       return;
2541     }
2542   
2543   /* If function wants no value, give it none.  */
2544   if (TREE_CODE (TREE_TYPE (TREE_TYPE (current_function_decl))) == VOID_TYPE)
2545     {
2546       expand_expr (retval, NULL_RTX, VOIDmode, 0);
2547       emit_queue ();
2548       expand_null_return ();
2549       return;
2550     }
2551
2552   /* Are any cleanups needed?  E.g. C++ destructors to be run?  */
2553   /* This is not sufficient.  We also need to watch for cleanups of the
2554      expression we are about to expand.  Unfortunately, we cannot know
2555      if it has cleanups until we expand it, and we want to change how we
2556      expand it depending upon if we need cleanups.  We can't win.  */
2557 #if 0
2558   cleanups = any_pending_cleanups (1);
2559 #else
2560   cleanups = 1;
2561 #endif
2562
2563   if (TREE_CODE (retval) == RESULT_DECL)
2564     retval_rhs = retval;
2565   else if ((TREE_CODE (retval) == MODIFY_EXPR || TREE_CODE (retval) == INIT_EXPR)
2566            && TREE_CODE (TREE_OPERAND (retval, 0)) == RESULT_DECL)
2567     retval_rhs = TREE_OPERAND (retval, 1);
2568   else if (TREE_TYPE (retval) == void_type_node)
2569     /* Recognize tail-recursive call to void function.  */
2570     retval_rhs = retval;
2571   else
2572     retval_rhs = NULL_TREE;
2573
2574   /* Only use `last_insn' if there are cleanups which must be run.  */
2575   if (cleanups || cleanup_label != 0)
2576     last_insn = get_last_insn ();
2577
2578   /* Distribute return down conditional expr if either of the sides
2579      may involve tail recursion (see test below).  This enhances the number
2580      of tail recursions we see.  Don't do this always since it can produce
2581      sub-optimal code in some cases and we distribute assignments into
2582      conditional expressions when it would help.  */
2583
2584   if (optimize && retval_rhs != 0
2585       && frame_offset == 0
2586       && TREE_CODE (retval_rhs) == COND_EXPR
2587       && (TREE_CODE (TREE_OPERAND (retval_rhs, 1)) == CALL_EXPR
2588           || TREE_CODE (TREE_OPERAND (retval_rhs, 2)) == CALL_EXPR))
2589     {
2590       rtx label = gen_label_rtx ();
2591       tree expr;
2592
2593       do_jump (TREE_OPERAND (retval_rhs, 0), label, NULL_RTX);
2594       expr = build (MODIFY_EXPR, TREE_TYPE (current_function_decl),
2595                     DECL_RESULT (current_function_decl),
2596                     TREE_OPERAND (retval_rhs, 1));
2597       TREE_SIDE_EFFECTS (expr) = 1;
2598       expand_return (expr);
2599       emit_label (label);
2600
2601       expr = build (MODIFY_EXPR, TREE_TYPE (current_function_decl),
2602                     DECL_RESULT (current_function_decl),
2603                     TREE_OPERAND (retval_rhs, 2));
2604       TREE_SIDE_EFFECTS (expr) = 1;
2605       expand_return (expr);
2606       return;
2607     }
2608
2609   /* For tail-recursive call to current function,
2610      just jump back to the beginning.
2611      It's unsafe if any auto variable in this function
2612      has its address taken; for simplicity,
2613      require stack frame to be empty.  */
2614   if (optimize && retval_rhs != 0
2615       && frame_offset == 0
2616       && TREE_CODE (retval_rhs) == CALL_EXPR
2617       && TREE_CODE (TREE_OPERAND (retval_rhs, 0)) == ADDR_EXPR
2618       && TREE_OPERAND (TREE_OPERAND (retval_rhs, 0), 0) == current_function_decl
2619       /* Finish checking validity, and if valid emit code
2620          to set the argument variables for the new call.  */
2621       && tail_recursion_args (TREE_OPERAND (retval_rhs, 1),
2622                               DECL_ARGUMENTS (current_function_decl)))
2623     {
2624       if (tail_recursion_label == 0)
2625         {
2626           tail_recursion_label = gen_label_rtx ();
2627           emit_label_after (tail_recursion_label,
2628                             tail_recursion_reentry);
2629         }
2630       emit_queue ();
2631       expand_goto_internal (NULL_TREE, tail_recursion_label, last_insn);
2632       emit_barrier ();
2633       return;
2634     }
2635 #ifdef HAVE_return
2636   /* This optimization is safe if there are local cleanups
2637      because expand_null_return takes care of them.
2638      ??? I think it should also be safe when there is a cleanup label,
2639      because expand_null_return takes care of them, too.
2640      Any reason why not?  */
2641   if (HAVE_return && cleanup_label == 0
2642       && ! current_function_returns_pcc_struct
2643       && BRANCH_COST <= 1)
2644     {
2645       /* If this is  return x == y;  then generate
2646          if (x == y) return 1; else return 0;
2647          if we can do it with explicit return insns and
2648          branches are cheap.  */
2649       if (retval_rhs)
2650         switch (TREE_CODE (retval_rhs))
2651           {
2652           case EQ_EXPR:
2653           case NE_EXPR:
2654           case GT_EXPR:
2655           case GE_EXPR:
2656           case LT_EXPR:
2657           case LE_EXPR:
2658           case TRUTH_ANDIF_EXPR:
2659           case TRUTH_ORIF_EXPR:
2660           case TRUTH_AND_EXPR:
2661           case TRUTH_OR_EXPR:
2662           case TRUTH_NOT_EXPR:
2663           case TRUTH_XOR_EXPR:
2664             op0 = gen_label_rtx ();
2665             jumpifnot (retval_rhs, op0);
2666             expand_value_return (const1_rtx);
2667             emit_label (op0);
2668             expand_value_return (const0_rtx);
2669             return;
2670           }
2671     }
2672 #endif /* HAVE_return */
2673
2674   /* If the result is an aggregate that is being returned in one (or more)
2675      registers, load the registers here.  The compiler currently can't handle
2676      copying a BLKmode value into registers.  We could put this code in a
2677      more general area (for use by everyone instead of just function
2678      call/return), but until this feature is generally usable it is kept here
2679      (and in expand_call).  */
2680
2681   if (retval_rhs != 0
2682       && TYPE_MODE (TREE_TYPE (retval_rhs)) == BLKmode
2683       && GET_CODE (DECL_RTL (DECL_RESULT (current_function_decl))) == REG)
2684     {
2685       int i;
2686       int big_endian_correction = 0;
2687       int bytes = int_size_in_bytes (TREE_TYPE (retval_rhs));
2688       int n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2689       rtx *result_pseudos = (rtx *) alloca (sizeof (rtx) * n_regs);
2690       rtx result_reg = DECL_RTL (DECL_RESULT (current_function_decl));
2691       rtx result_val = expand_expr (retval_rhs, NULL_RTX, VOIDmode, 0);
2692       enum machine_mode tmpmode;
2693
2694       /* Structures smaller than a word are aligned to the least significant
2695          byte (to the right).  On a BYTES_BIG_ENDIAN machine, this means we
2696          must skip the empty high order bytes when calculating the bit
2697          offset.  */
2698       if (BYTES_BIG_ENDIAN && bytes < UNITS_PER_WORD)
2699         big_endian_correction = (BITS_PER_WORD - (bytes * BITS_PER_UNIT));
2700
2701       for (i = 0; i < n_regs; i++)
2702         {
2703           rtx reg = gen_reg_rtx (word_mode);
2704           rtx word = operand_subword_force (result_val, i, BLKmode);
2705           int bitsize = MIN (TYPE_ALIGN (TREE_TYPE (retval_rhs)),BITS_PER_WORD);
2706           int bitpos;
2707
2708           result_pseudos[i] = reg;
2709
2710           /* Clobber REG and move each partword into it.  Ensure we don't
2711              go past the end of the structure.  Note that the loop below
2712              works because we've already verified that padding and
2713              endianness are compatable.  */
2714           emit_insn (gen_rtx (CLOBBER, VOIDmode, reg));
2715
2716           for (bitpos = 0;
2717                bitpos < BITS_PER_WORD && bytes > 0;
2718                bitpos += bitsize, bytes -= bitsize / BITS_PER_UNIT)
2719             {
2720               int xbitpos = bitpos + big_endian_correction;
2721
2722               store_bit_field (reg, bitsize, xbitpos, word_mode,
2723                                extract_bit_field (word, bitsize, bitpos, 1,
2724                                                   NULL_RTX, word_mode,
2725                                                   word_mode,
2726                                                   bitsize / BITS_PER_UNIT,
2727                                                   BITS_PER_WORD),
2728                                bitsize / BITS_PER_UNIT, BITS_PER_WORD);
2729             }
2730         }
2731
2732       /* Now that the value is in pseudos, copy it to the result reg(s).  */
2733       emit_queue ();
2734       free_temp_slots ();
2735       for (i = 0; i < n_regs; i++)
2736         emit_move_insn (gen_rtx (REG, word_mode, REGNO (result_reg) + i),
2737                         result_pseudos[i]);
2738
2739       /* Find the smallest integer mode large enough to hold the
2740          entire structure and use that mode instead of BLKmode
2741          on the USE insn for the return register.   */
2742       bytes = int_size_in_bytes (TREE_TYPE (retval_rhs));
2743       for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
2744            tmpmode != MAX_MACHINE_MODE;
2745            tmpmode = GET_MODE_WIDER_MODE (tmpmode))
2746       {
2747         /* Have we found a large enough mode?  */
2748         if (GET_MODE_SIZE (tmpmode) >= bytes)
2749           break;
2750       }
2751
2752       /* No suitable mode found.  */
2753       if (tmpmode == MAX_MACHINE_MODE)
2754       abort ();
2755
2756       PUT_MODE (result_reg, tmpmode);
2757
2758       expand_value_return (result_reg);
2759     }
2760   else if (cleanups
2761       && retval_rhs != 0
2762       && TREE_TYPE (retval_rhs) != void_type_node
2763       && GET_CODE (DECL_RTL (DECL_RESULT (current_function_decl))) == REG)
2764     {
2765       /* Calculate the return value into a pseudo reg.  */
2766       val = expand_expr (retval_rhs, NULL_RTX, VOIDmode, 0);
2767       emit_queue ();
2768       /* All temporaries have now been used.  */
2769       free_temp_slots ();
2770       /* Return the calculated value, doing cleanups first.  */
2771       expand_value_return (val);
2772     }
2773   else
2774     {
2775       /* No cleanups or no hard reg used;
2776          calculate value into hard return reg.  */
2777       expand_expr (retval, const0_rtx, VOIDmode, 0);
2778       emit_queue ();
2779       free_temp_slots ();
2780       expand_value_return (DECL_RTL (DECL_RESULT (current_function_decl)));
2781     }
2782 }
2783
2784 /* Return 1 if the end of the generated RTX is not a barrier.
2785    This means code already compiled can drop through.  */
2786
2787 int
2788 drop_through_at_end_p ()
2789 {
2790   rtx insn = get_last_insn ();
2791   while (insn && GET_CODE (insn) == NOTE)
2792     insn = PREV_INSN (insn);
2793   return insn && GET_CODE (insn) != BARRIER;
2794 }
2795 \f
2796 /* Emit code to alter this function's formal parms for a tail-recursive call.
2797    ACTUALS is a list of actual parameter expressions (chain of TREE_LISTs).
2798    FORMALS is the chain of decls of formals.
2799    Return 1 if this can be done;
2800    otherwise return 0 and do not emit any code.  */
2801
2802 static int
2803 tail_recursion_args (actuals, formals)
2804      tree actuals, formals;
2805 {
2806   register tree a = actuals, f = formals;
2807   register int i;
2808   register rtx *argvec;
2809
2810   /* Check that number and types of actuals are compatible
2811      with the formals.  This is not always true in valid C code.
2812      Also check that no formal needs to be addressable
2813      and that all formals are scalars.  */
2814
2815   /* Also count the args.  */
2816
2817   for (a = actuals, f = formals, i = 0; a && f; a = TREE_CHAIN (a), f = TREE_CHAIN (f), i++)
2818     {
2819       if (TREE_TYPE (TREE_VALUE (a)) != TREE_TYPE (f))
2820         return 0;
2821       if (GET_CODE (DECL_RTL (f)) != REG || DECL_MODE (f) == BLKmode)
2822         return 0;
2823     }
2824   if (a != 0 || f != 0)
2825     return 0;
2826
2827   /* Compute all the actuals.  */
2828
2829   argvec = (rtx *) alloca (i * sizeof (rtx));
2830
2831   for (a = actuals, i = 0; a; a = TREE_CHAIN (a), i++)
2832     argvec[i] = expand_expr (TREE_VALUE (a), NULL_RTX, VOIDmode, 0);
2833
2834   /* Find which actual values refer to current values of previous formals.
2835      Copy each of them now, before any formal is changed.  */
2836
2837   for (a = actuals, i = 0; a; a = TREE_CHAIN (a), i++)
2838     {
2839       int copy = 0;
2840       register int j;
2841       for (f = formals, j = 0; j < i; f = TREE_CHAIN (f), j++)
2842         if (reg_mentioned_p (DECL_RTL (f), argvec[i]))
2843           { copy = 1; break; }
2844       if (copy)
2845         argvec[i] = copy_to_reg (argvec[i]);
2846     }
2847
2848   /* Store the values of the actuals into the formals.  */
2849
2850   for (f = formals, a = actuals, i = 0; f;
2851        f = TREE_CHAIN (f), a = TREE_CHAIN (a), i++)
2852     {
2853       if (GET_MODE (DECL_RTL (f)) == GET_MODE (argvec[i]))
2854         emit_move_insn (DECL_RTL (f), argvec[i]);
2855       else
2856         convert_move (DECL_RTL (f), argvec[i],
2857                       TREE_UNSIGNED (TREE_TYPE (TREE_VALUE (a))));
2858     }
2859
2860   free_temp_slots ();
2861   return 1;
2862 }
2863 \f
2864 /* Generate the RTL code for entering a binding contour.
2865    The variables are declared one by one, by calls to `expand_decl'.
2866
2867    EXIT_FLAG is nonzero if this construct should be visible to
2868    `exit_something'.  */
2869
2870 void
2871 expand_start_bindings (exit_flag)
2872      int exit_flag;
2873 {
2874   struct nesting *thisblock = ALLOC_NESTING ();
2875   rtx note = output_bytecode ? 0 : emit_note (NULL_PTR, NOTE_INSN_BLOCK_BEG);
2876
2877   /* Make an entry on block_stack for the block we are entering.  */
2878
2879   thisblock->next = block_stack;
2880   thisblock->all = nesting_stack;
2881   thisblock->depth = ++nesting_depth;
2882   thisblock->data.block.stack_level = 0;
2883   thisblock->data.block.cleanups = 0;
2884   thisblock->data.block.function_call_count = 0;
2885 #if 0
2886   if (block_stack)
2887     {
2888       if (block_stack->data.block.cleanups == NULL_TREE
2889           && (block_stack->data.block.outer_cleanups == NULL_TREE
2890               || block_stack->data.block.outer_cleanups == empty_cleanup_list))
2891         thisblock->data.block.outer_cleanups = empty_cleanup_list;
2892       else
2893         thisblock->data.block.outer_cleanups
2894           = tree_cons (NULL_TREE, block_stack->data.block.cleanups,
2895                        block_stack->data.block.outer_cleanups);
2896     }
2897   else
2898     thisblock->data.block.outer_cleanups = 0;
2899 #endif
2900 #if 1
2901   if (block_stack
2902       && !(block_stack->data.block.cleanups == NULL_TREE
2903            && block_stack->data.block.outer_cleanups == NULL_TREE))
2904     thisblock->data.block.outer_cleanups
2905       = tree_cons (NULL_TREE, block_stack->data.block.cleanups,
2906                    block_stack->data.block.outer_cleanups);
2907   else
2908     thisblock->data.block.outer_cleanups = 0;
2909 #endif
2910   thisblock->data.block.label_chain = 0;
2911   thisblock->data.block.innermost_stack_block = stack_block_stack;
2912   thisblock->data.block.first_insn = note;
2913   thisblock->data.block.block_start_count = ++block_start_count;
2914   thisblock->exit_label = exit_flag ? gen_label_rtx () : 0;
2915   block_stack = thisblock;
2916   nesting_stack = thisblock;
2917
2918   if (!output_bytecode)
2919     {
2920       /* Make a new level for allocating stack slots.  */
2921       push_temp_slots ();
2922     }
2923 }
2924
2925 /* Given a pointer to a BLOCK node, save a pointer to the most recently
2926    generated NOTE_INSN_BLOCK_END in the BLOCK_END_NOTE field of the given
2927    BLOCK node.  */
2928
2929 void
2930 remember_end_note (block)
2931      register tree block;
2932 {
2933   BLOCK_END_NOTE (block) = last_block_end_note;
2934   last_block_end_note = NULL_RTX;
2935 }
2936
2937 /* Generate RTL code to terminate a binding contour.
2938    VARS is the chain of VAR_DECL nodes
2939    for the variables bound in this contour.
2940    MARK_ENDS is nonzero if we should put a note at the beginning
2941    and end of this binding contour.
2942
2943    DONT_JUMP_IN is nonzero if it is not valid to jump into this contour.
2944    (That is true automatically if the contour has a saved stack level.)  */
2945
2946 void
2947 expand_end_bindings (vars, mark_ends, dont_jump_in)
2948      tree vars;
2949      int mark_ends;
2950      int dont_jump_in;
2951 {
2952   register struct nesting *thisblock = block_stack;
2953   register tree decl;
2954
2955   if (output_bytecode)
2956     {
2957       bc_expand_end_bindings (vars, mark_ends, dont_jump_in);
2958       return;
2959     }
2960
2961   if (warn_unused)
2962     for (decl = vars; decl; decl = TREE_CHAIN (decl))
2963       if (! TREE_USED (decl) && TREE_CODE (decl) == VAR_DECL
2964           && ! DECL_IN_SYSTEM_HEADER (decl))
2965         warning_with_decl (decl, "unused variable `%s'");
2966
2967   if (thisblock->exit_label)
2968     {
2969       do_pending_stack_adjust ();
2970       emit_label (thisblock->exit_label);
2971     }
2972
2973   /* If necessary, make a handler for nonlocal gotos taking
2974      place in the function calls in this block.  */
2975   if (function_call_count != thisblock->data.block.function_call_count
2976       && nonlocal_labels
2977       /* Make handler for outermost block
2978          if there were any nonlocal gotos to this function.  */
2979       && (thisblock->next == 0 ? current_function_has_nonlocal_label
2980           /* Make handler for inner block if it has something
2981              special to do when you jump out of it.  */
2982           : (thisblock->data.block.cleanups != 0
2983              || thisblock->data.block.stack_level != 0)))
2984     {
2985       tree link;
2986       rtx afterward = gen_label_rtx ();
2987       rtx handler_label = gen_label_rtx ();
2988       rtx save_receiver = gen_reg_rtx (Pmode);
2989       rtx insns;
2990
2991       /* Don't let jump_optimize delete the handler.  */
2992       LABEL_PRESERVE_P (handler_label) = 1;
2993
2994       /* Record the handler address in the stack slot for that purpose,
2995          during this block, saving and restoring the outer value.  */
2996       if (thisblock->next != 0)
2997         {
2998           emit_move_insn (nonlocal_goto_handler_slot, save_receiver);
2999
3000           start_sequence ();
3001           emit_move_insn (save_receiver, nonlocal_goto_handler_slot);
3002           insns = get_insns ();
3003           end_sequence ();
3004           emit_insns_before (insns, thisblock->data.block.first_insn);
3005         }
3006
3007       start_sequence ();
3008       emit_move_insn (nonlocal_goto_handler_slot,
3009                       gen_rtx (LABEL_REF, Pmode, handler_label));
3010       insns = get_insns ();
3011       end_sequence ();
3012       emit_insns_before (insns, thisblock->data.block.first_insn);
3013
3014       /* Jump around the handler; it runs only when specially invoked.  */
3015       emit_jump (afterward);
3016       emit_label (handler_label);
3017
3018 #ifdef HAVE_nonlocal_goto
3019       if (! HAVE_nonlocal_goto)
3020 #endif
3021         /* First adjust our frame pointer to its actual value.  It was
3022            previously set to the start of the virtual area corresponding to
3023            the stacked variables when we branched here and now needs to be
3024            adjusted to the actual hardware fp value.
3025
3026            Assignments are to virtual registers are converted by
3027            instantiate_virtual_regs into the corresponding assignment
3028            to the underlying register (fp in this case) that makes
3029            the original assignment true.
3030            So the following insn will actually be
3031            decrementing fp by STARTING_FRAME_OFFSET.  */
3032         emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
3033
3034 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
3035       if (fixed_regs[ARG_POINTER_REGNUM])
3036         {
3037 #ifdef ELIMINABLE_REGS
3038           /* If the argument pointer can be eliminated in favor of the
3039              frame pointer, we don't need to restore it.  We assume here
3040              that if such an elimination is present, it can always be used.
3041              This is the case on all known machines; if we don't make this
3042              assumption, we do unnecessary saving on many machines.  */
3043           static struct elims {int from, to;} elim_regs[] = ELIMINABLE_REGS;
3044           int i;
3045
3046           for (i = 0; i < sizeof elim_regs / sizeof elim_regs[0]; i++)
3047             if (elim_regs[i].from == ARG_POINTER_REGNUM
3048                 && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
3049               break;
3050
3051           if (i == sizeof elim_regs / sizeof elim_regs [0])
3052 #endif
3053             {
3054               /* Now restore our arg pointer from the address at which it
3055                  was saved in our stack frame.
3056                  If there hasn't be space allocated for it yet, make
3057                  some now.  */
3058               if (arg_pointer_save_area == 0)
3059                 arg_pointer_save_area
3060                   = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
3061               emit_move_insn (virtual_incoming_args_rtx,
3062                               /* We need a pseudo here, or else
3063                                  instantiate_virtual_regs_1 complains.  */
3064                               copy_to_reg (arg_pointer_save_area));
3065             }
3066         }
3067 #endif
3068
3069       /* The handler expects the desired label address in the static chain
3070          register.  It tests the address and does an appropriate jump
3071          to whatever label is desired.  */
3072       for (link = nonlocal_labels; link; link = TREE_CHAIN (link))
3073         /* Skip any labels we shouldn't be able to jump to from here.  */
3074         if (! DECL_TOO_LATE (TREE_VALUE (link)))
3075           {
3076             rtx not_this = gen_label_rtx ();
3077             rtx this = gen_label_rtx ();
3078             do_jump_if_equal (static_chain_rtx,
3079                               gen_rtx (LABEL_REF, Pmode, DECL_RTL (TREE_VALUE (link))),
3080                               this, 0);
3081             emit_jump (not_this);
3082             emit_label (this);
3083             expand_goto (TREE_VALUE (link));
3084             emit_label (not_this);
3085           }
3086       /* If label is not recognized, abort.  */
3087       emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "abort"), 0,
3088                          VOIDmode, 0);
3089       emit_label (afterward);
3090     }
3091
3092   /* Don't allow jumping into a block that has cleanups or a stack level.  */
3093   if (dont_jump_in
3094       || thisblock->data.block.stack_level != 0
3095       || thisblock->data.block.cleanups != 0)
3096     {
3097       struct label_chain *chain;
3098
3099       /* Any labels in this block are no longer valid to go to.
3100          Mark them to cause an error message.  */
3101       for (chain = thisblock->data.block.label_chain; chain; chain = chain->next)
3102         {
3103           DECL_TOO_LATE (chain->label) = 1;
3104           /* If any goto without a fixup came to this label,
3105              that must be an error, because gotos without fixups
3106              come from outside all saved stack-levels and all cleanups.  */
3107           if (TREE_ADDRESSABLE (chain->label))
3108             error_with_decl (chain->label,
3109                              "label `%s' used before containing binding contour");
3110         }
3111     }
3112
3113   /* Restore stack level in effect before the block
3114      (only if variable-size objects allocated).  */
3115   /* Perform any cleanups associated with the block.  */
3116
3117   if (thisblock->data.block.stack_level != 0
3118       || thisblock->data.block.cleanups != 0)
3119     {
3120       /* Only clean up here if this point can actually be reached.  */
3121       int reachable = GET_CODE (get_last_insn ()) != BARRIER;
3122
3123       /* Don't let cleanups affect ({...}) constructs.  */
3124       int old_expr_stmts_for_value = expr_stmts_for_value;
3125       rtx old_last_expr_value = last_expr_value;
3126       tree old_last_expr_type = last_expr_type;
3127       expr_stmts_for_value = 0;
3128
3129       /* Do the cleanups.  */
3130       expand_cleanups (thisblock->data.block.cleanups, NULL_TREE, 0, reachable);
3131       if (reachable)
3132         do_pending_stack_adjust ();
3133
3134       expr_stmts_for_value = old_expr_stmts_for_value;
3135       last_expr_value = old_last_expr_value;
3136       last_expr_type = old_last_expr_type;
3137
3138       /* Restore the stack level.  */
3139
3140       if (reachable && thisblock->data.block.stack_level != 0)
3141         {
3142           emit_stack_restore (thisblock->next ? SAVE_BLOCK : SAVE_FUNCTION,
3143                               thisblock->data.block.stack_level, NULL_RTX);
3144           if (nonlocal_goto_handler_slot != 0)
3145             emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level,
3146                              NULL_RTX);
3147         }
3148
3149       /* Any gotos out of this block must also do these things.
3150          Also report any gotos with fixups that came to labels in this
3151          level.  */
3152       fixup_gotos (thisblock,
3153                    thisblock->data.block.stack_level,
3154                    thisblock->data.block.cleanups,
3155                    thisblock->data.block.first_insn,
3156                    dont_jump_in);
3157     }
3158
3159   /* Mark the beginning and end of the scope if requested.
3160      We do this now, after running cleanups on the variables
3161      just going out of scope, so they are in scope for their cleanups.  */
3162
3163   if (mark_ends)
3164     last_block_end_note = emit_note (NULL_PTR, NOTE_INSN_BLOCK_END);
3165   else
3166     /* Get rid of the beginning-mark if we don't make an end-mark.  */
3167     NOTE_LINE_NUMBER (thisblock->data.block.first_insn) = NOTE_INSN_DELETED;
3168
3169   /* If doing stupid register allocation, make sure lives of all
3170      register variables declared here extend thru end of scope.  */
3171
3172   if (obey_regdecls)
3173     for (decl = vars; decl; decl = TREE_CHAIN (decl))
3174       {
3175         rtx rtl = DECL_RTL (decl);
3176         if (TREE_CODE (decl) == VAR_DECL && rtl != 0)
3177           use_variable (rtl);
3178       }
3179
3180   /* Restore block_stack level for containing block.  */
3181
3182   stack_block_stack = thisblock->data.block.innermost_stack_block;
3183   POPSTACK (block_stack);
3184
3185   /* Pop the stack slot nesting and free any slots at this level.  */
3186   pop_temp_slots ();
3187 }
3188
3189
3190 /* End a binding contour.
3191    VARS is the chain of VAR_DECL nodes for the variables bound
3192    in this contour.  MARK_ENDS is nonzer if we should put a note
3193    at the beginning and end of this binding contour.
3194    DONT_JUMP_IN is nonzero if it is not valid to jump into this
3195    contour.  */
3196
3197 static void
3198 bc_expand_end_bindings (vars, mark_ends, dont_jump_in)
3199      tree vars;
3200      int mark_ends;
3201      int dont_jump_in;
3202 {
3203   struct nesting *thisbind = nesting_stack;
3204   tree decl;
3205
3206   if (warn_unused)
3207     for (decl = vars; decl; decl = TREE_CHAIN (decl))
3208       if (! TREE_USED (TREE_VALUE (decl)) && TREE_CODE (TREE_VALUE (decl)) == VAR_DECL)
3209         warning_with_decl (decl, "unused variable `%s'");
3210
3211   if (thisbind->exit_label)
3212     bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (thisbind->exit_label));
3213
3214   /* Pop block/bindings off stack */
3215   POPSTACK (block_stack);
3216 }
3217 \f
3218 /* Generate RTL for the automatic variable declaration DECL.
3219    (Other kinds of declarations are simply ignored if seen here.)
3220    CLEANUP is an expression to be executed at exit from this binding contour;
3221    for example, in C++, it might call the destructor for this variable.
3222
3223    If CLEANUP contains any SAVE_EXPRs, then you must preevaluate them
3224    either before or after calling `expand_decl' but before compiling
3225    any subsequent expressions.  This is because CLEANUP may be expanded
3226    more than once, on different branches of execution.
3227    For the same reason, CLEANUP may not contain a CALL_EXPR
3228    except as its topmost node--else `preexpand_calls' would get confused.
3229
3230    If CLEANUP is nonzero and DECL is zero, we record a cleanup
3231    that is not associated with any particular variable.
3232
3233    There is no special support here for C++ constructors.
3234    They should be handled by the proper code in DECL_INITIAL.  */
3235
3236 void
3237 expand_decl (decl)
3238      register tree decl;
3239 {
3240   struct nesting *thisblock = block_stack;
3241   tree type;
3242
3243   if (output_bytecode)
3244     {
3245       bc_expand_decl (decl, 0);
3246       return;
3247     }
3248
3249   type = TREE_TYPE (decl);
3250
3251   /* Only automatic variables need any expansion done.
3252      Static and external variables, and external functions,
3253      will be handled by `assemble_variable' (called from finish_decl).
3254      TYPE_DECL and CONST_DECL require nothing.
3255      PARM_DECLs are handled in `assign_parms'.  */
3256
3257   if (TREE_CODE (decl) != VAR_DECL)
3258     return;
3259   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
3260     return;
3261
3262   /* Create the RTL representation for the variable.  */
3263
3264   if (type == error_mark_node)
3265     DECL_RTL (decl) = gen_rtx (MEM, BLKmode, const0_rtx);
3266   else if (DECL_SIZE (decl) == 0)
3267     /* Variable with incomplete type.  */
3268     {
3269       if (DECL_INITIAL (decl) == 0)
3270         /* Error message was already done; now avoid a crash.  */
3271         DECL_RTL (decl) = assign_stack_temp (DECL_MODE (decl), 0, 1);
3272       else
3273         /* An initializer is going to decide the size of this array.
3274            Until we know the size, represent its address with a reg.  */
3275         DECL_RTL (decl) = gen_rtx (MEM, BLKmode, gen_reg_rtx (Pmode));
3276       MEM_IN_STRUCT_P (DECL_RTL (decl)) = AGGREGATE_TYPE_P (type);
3277     }
3278   else if (DECL_MODE (decl) != BLKmode
3279            /* If -ffloat-store, don't put explicit float vars
3280               into regs.  */
3281            && !(flag_float_store
3282                 && TREE_CODE (type) == REAL_TYPE)
3283            && ! TREE_THIS_VOLATILE (decl)
3284            && ! TREE_ADDRESSABLE (decl)
3285            && (DECL_REGISTER (decl) || ! obey_regdecls))
3286     {
3287       /* Automatic variable that can go in a register.  */
3288       int unsignedp = TREE_UNSIGNED (type);
3289       enum machine_mode reg_mode
3290         = promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
3291
3292       if (TREE_CODE (type) == COMPLEX_TYPE)
3293         {
3294           rtx realpart, imagpart;
3295           enum machine_mode partmode = TYPE_MODE (TREE_TYPE (type));
3296
3297           /* For a complex type variable, make a CONCAT of two pseudos
3298              so that the real and imaginary parts
3299              can be allocated separately.  */
3300           realpart = gen_reg_rtx (partmode);
3301           REG_USERVAR_P (realpart) = 1;
3302           imagpart = gen_reg_rtx (partmode);
3303           REG_USERVAR_P (imagpart) = 1;
3304           DECL_RTL (decl) = gen_rtx (CONCAT, reg_mode, realpart, imagpart);
3305         }
3306       else
3307         {
3308           DECL_RTL (decl) = gen_reg_rtx (reg_mode);
3309           if (TREE_CODE (type) == POINTER_TYPE)
3310             mark_reg_pointer (DECL_RTL (decl));
3311           REG_USERVAR_P (DECL_RTL (decl)) = 1;
3312         }
3313     }
3314   else if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
3315     {
3316       /* Variable of fixed size that goes on the stack.  */
3317       rtx oldaddr = 0;
3318       rtx addr;
3319
3320       /* If we previously made RTL for this decl, it must be an array
3321          whose size was determined by the initializer.
3322          The old address was a register; set that register now
3323          to the proper address.  */
3324       if (DECL_RTL (decl) != 0)
3325         {
3326           if (GET_CODE (DECL_RTL (decl)) != MEM
3327               || GET_CODE (XEXP (DECL_RTL (decl), 0)) != REG)
3328             abort ();
3329           oldaddr = XEXP (DECL_RTL (decl), 0);
3330         }
3331
3332       DECL_RTL (decl)
3333         = assign_stack_temp (DECL_MODE (decl),
3334                              ((TREE_INT_CST_LOW (DECL_SIZE (decl))
3335                                + BITS_PER_UNIT - 1)
3336                               / BITS_PER_UNIT),
3337                              1);
3338       MEM_IN_STRUCT_P (DECL_RTL (decl)) = AGGREGATE_TYPE_P (TREE_TYPE (decl));
3339
3340       /* Set alignment we actually gave this decl.  */
3341       DECL_ALIGN (decl) = (DECL_MODE (decl) == BLKmode ? BIGGEST_ALIGNMENT
3342                            : GET_MODE_BITSIZE (DECL_MODE (decl)));
3343
3344       if (oldaddr)
3345         {
3346           addr = force_operand (XEXP (DECL_RTL (decl), 0), oldaddr);
3347           if (addr != oldaddr)
3348             emit_move_insn (oldaddr, addr);
3349         }
3350
3351       /* If this is a memory ref that contains aggregate components,
3352          mark it as such for cse and loop optimize.  */
3353       MEM_IN_STRUCT_P (DECL_RTL (decl)) = AGGREGATE_TYPE_P (TREE_TYPE (decl));
3354 #if 0
3355       /* If this is in memory because of -ffloat-store,
3356          set the volatile bit, to prevent optimizations from
3357          undoing the effects.  */
3358       if (flag_float_store && TREE_CODE (type) == REAL_TYPE)
3359         MEM_VOLATILE_P (DECL_RTL (decl)) = 1;
3360 #endif
3361     }
3362   else
3363     /* Dynamic-size object: must push space on the stack.  */
3364     {
3365       rtx address, size;
3366
3367       /* Record the stack pointer on entry to block, if have
3368          not already done so.  */
3369       if (thisblock->data.block.stack_level == 0)
3370         {
3371           do_pending_stack_adjust ();
3372           emit_stack_save (thisblock->next ? SAVE_BLOCK : SAVE_FUNCTION,
3373                            &thisblock->data.block.stack_level,
3374                            thisblock->data.block.first_insn);
3375           stack_block_stack = thisblock;
3376         }
3377
3378       /* Compute the variable's size, in bytes.  */
3379       size = expand_expr (size_binop (CEIL_DIV_EXPR,
3380                                       DECL_SIZE (decl),
3381                                       size_int (BITS_PER_UNIT)),
3382                           NULL_RTX, VOIDmode, 0);
3383       free_temp_slots ();
3384
3385       /* Allocate space on the stack for the variable.  */
3386       address = allocate_dynamic_stack_space (size, NULL_RTX,
3387                                               DECL_ALIGN (decl));
3388
3389       /* Reference the variable indirect through that rtx.  */
3390       DECL_RTL (decl) = gen_rtx (MEM, DECL_MODE (decl), address);
3391
3392       /* If this is a memory ref that contains aggregate components,
3393          mark it as such for cse and loop optimize.  */
3394       MEM_IN_STRUCT_P (DECL_RTL (decl)) = AGGREGATE_TYPE_P (TREE_TYPE (decl));
3395
3396       /* Indicate the alignment we actually gave this variable.  */
3397 #ifdef STACK_BOUNDARY
3398       DECL_ALIGN (decl) = STACK_BOUNDARY;
3399 #else
3400       DECL_ALIGN (decl) = BIGGEST_ALIGNMENT;
3401 #endif
3402     }
3403
3404   if (TREE_THIS_VOLATILE (decl))
3405     MEM_VOLATILE_P (DECL_RTL (decl)) = 1;
3406 #if 0 /* A variable is not necessarily unchanging
3407          just because it is const.  RTX_UNCHANGING_P
3408          means no change in the function,
3409          not merely no change in the variable's scope.
3410          It is correct to set RTX_UNCHANGING_P if the variable's scope
3411          is the whole function.  There's no convenient way to test that.  */
3412   if (TREE_READONLY (decl))
3413     RTX_UNCHANGING_P (DECL_RTL (decl)) = 1;
3414 #endif
3415
3416   /* If doing stupid register allocation, make sure life of any
3417      register variable starts here, at the start of its scope.  */
3418
3419   if (obey_regdecls)
3420     use_variable (DECL_RTL (decl));
3421 }
3422
3423
3424 /* Generate code for the automatic variable declaration DECL.  For
3425    most variables this just means we give it a stack offset.  The
3426    compiler sometimes emits cleanups without variables and we will
3427    have to deal with those too.  */
3428
3429 static void
3430 bc_expand_decl (decl, cleanup)
3431      tree decl;
3432      tree cleanup;
3433 {
3434   tree type;
3435
3436   if (!decl)
3437     {
3438       /* A cleanup with no variable.  */
3439       if (!cleanup)
3440         abort ();
3441
3442       return;
3443     }
3444
3445   /* Only auto variables need any work.  */
3446   if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl) || DECL_EXTERNAL (decl))
3447     return;
3448
3449   type = TREE_TYPE (decl);
3450
3451   if (type == error_mark_node)
3452     DECL_RTL (decl) = bc_gen_rtx ((char *) 0, 0, (struct bc_label *) 0);
3453
3454   else if (DECL_SIZE (decl) == 0)
3455
3456     /* Variable with incomplete type.  The stack offset herein will be
3457        fixed later in expand_decl_init ().  */
3458     DECL_RTL (decl) = bc_gen_rtx ((char *) 0, 0, (struct bc_label *) 0);
3459
3460   else if (TREE_CONSTANT (DECL_SIZE (decl)))
3461     {
3462       DECL_RTL (decl) = bc_allocate_local (TREE_INT_CST_LOW (DECL_SIZE (decl)) / BITS_PER_UNIT,
3463                                            DECL_ALIGN (decl));
3464     }
3465   else
3466     DECL_RTL (decl) = bc_allocate_variable_array (DECL_SIZE (decl));
3467 }
3468 \f
3469 /* Emit code to perform the initialization of a declaration DECL.  */
3470
3471 void
3472 expand_decl_init (decl)
3473      tree decl;
3474 {
3475   int was_used = TREE_USED (decl);
3476
3477   if (output_bytecode)
3478     {
3479       bc_expand_decl_init (decl);
3480       return;
3481     }
3482
3483   /* If this is a CONST_DECL, we don't have to generate any code, but
3484      if DECL_INITIAL is a constant, call expand_expr to force TREE_CST_RTL
3485      to be set while in the obstack containing the constant.  If we don't
3486      do this, we can lose if we have functions nested three deep and the middle
3487      function makes a CONST_DECL whose DECL_INITIAL is a STRING_CST while
3488      the innermost function is the first to expand that STRING_CST.  */
3489   if (TREE_CODE (decl) == CONST_DECL)
3490     {
3491       if (DECL_INITIAL (decl) && TREE_CONSTANT (DECL_INITIAL (decl)))
3492         expand_expr (DECL_INITIAL (decl), NULL_RTX, VOIDmode,
3493                      EXPAND_INITIALIZER);
3494       return;
3495     }
3496
3497   if (TREE_STATIC (decl))
3498     return;
3499
3500   /* Compute and store the initial value now.  */
3501
3502   if (DECL_INITIAL (decl) == error_mark_node)
3503     {
3504       enum tree_code code = TREE_CODE (TREE_TYPE (decl));
3505       if (code == INTEGER_TYPE || code == REAL_TYPE || code == ENUMERAL_TYPE
3506           || code == POINTER_TYPE)
3507         expand_assignment (decl, convert (TREE_TYPE (decl), integer_zero_node),
3508                            0, 0);
3509       emit_queue ();
3510     }
3511   else if (DECL_INITIAL (decl) && TREE_CODE (DECL_INITIAL (decl)) != TREE_LIST)
3512     {
3513       emit_line_note (DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
3514       expand_assignment (decl, DECL_INITIAL (decl), 0, 0);
3515       emit_queue ();
3516     }
3517
3518   /* Don't let the initialization count as "using" the variable.  */
3519   TREE_USED (decl) = was_used;
3520
3521   /* Free any temporaries we made while initializing the decl.  */
3522   free_temp_slots ();
3523 }
3524
3525 /* Expand initialization for variable-sized types. Allocate array
3526    using newlocalSI and set local variable, which is a pointer to the
3527    storage. */
3528
3529 static void
3530 bc_expand_variable_local_init (decl)
3531      tree decl;
3532 {
3533   /* Evaluate size expression and coerce to SI */
3534   bc_expand_expr (DECL_SIZE (decl));
3535
3536   /* Type sizes are always (?) of TREE_CODE INTEGER_CST, so
3537      no coercion is necessary (?) */
3538
3539 /*  emit_typecode_conversion (preferred_typecode (TYPE_MODE (DECL_SIZE (decl)),
3540                                                 TREE_UNSIGNED (DECL_SIZE (decl))), SIcode); */
3541
3542   /* Emit code to allocate array */
3543   bc_emit_instruction (newlocalSI);
3544
3545   /* Store array pointer in local variable. This is the only instance
3546      where we actually want the address of the pointer to the
3547      variable-size block, rather than the pointer itself.  We avoid
3548      using expand_address() since that would cause the pointer to be
3549      pushed rather than its address. Hence the hard-coded reference;
3550      notice also that the variable is always local (no global
3551      variable-size type variables). */
3552
3553   bc_load_localaddr (DECL_RTL (decl));
3554   bc_emit_instruction (storeP);
3555 }
3556
3557
3558 /* Emit code to initialize a declaration.  */
3559
3560 static void
3561 bc_expand_decl_init (decl)
3562      tree decl;
3563 {
3564   int org_stack_depth;
3565
3566   /* Statical initializers are handled elsewhere */
3567
3568   if (TREE_STATIC (decl))
3569     return;
3570
3571   /* Memory original stack depth */
3572   org_stack_depth = stack_depth;
3573
3574   /* If the type is variable-size, we first create its space (we ASSUME
3575      it CAN'T be static).  We do this regardless of whether there's an
3576      initializer assignment or not. */
3577
3578   if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
3579     bc_expand_variable_local_init (decl);
3580
3581   /* Expand initializer assignment */
3582   if (DECL_INITIAL (decl) == error_mark_node)
3583     {
3584       enum tree_code code = TREE_CODE (TREE_TYPE (decl));
3585
3586       if (code == INTEGER_TYPE || code == REAL_TYPE || code == ENUMERAL_TYPE
3587           || code == POINTER_TYPE)
3588
3589         expand_assignment (TREE_TYPE (decl), decl, 0, 0);
3590     }
3591   else if (DECL_INITIAL (decl))
3592     expand_assignment (TREE_TYPE (decl), decl, 0, 0);
3593
3594   /* Restore stack depth */
3595   if (org_stack_depth > stack_depth)
3596     abort ();
3597
3598   bc_adjust_stack (stack_depth - org_stack_depth);
3599 }
3600  
3601
3602 /* CLEANUP is an expression to be executed at exit from this binding contour;
3603    for example, in C++, it might call the destructor for this variable.
3604
3605    If CLEANUP contains any SAVE_EXPRs, then you must preevaluate them
3606    either before or after calling `expand_decl' but before compiling
3607    any subsequent expressions.  This is because CLEANUP may be expanded
3608    more than once, on different branches of execution.
3609    For the same reason, CLEANUP may not contain a CALL_EXPR
3610    except as its topmost node--else `preexpand_calls' would get confused.
3611
3612    If CLEANUP is nonzero and DECL is zero, we record a cleanup
3613    that is not associated with any particular variable.   */
3614
3615 int
3616 expand_decl_cleanup (decl, cleanup)
3617      tree decl, cleanup;
3618 {
3619   struct nesting *thisblock = block_stack;
3620
3621   /* Error if we are not in any block.  */
3622   if (thisblock == 0)
3623     return 0;
3624
3625   /* Record the cleanup if there is one.  */
3626
3627   if (cleanup != 0)
3628     {
3629       thisblock->data.block.cleanups
3630         = temp_tree_cons (decl, cleanup, thisblock->data.block.cleanups);
3631       /* If this block has a cleanup, it belongs in stack_block_stack.  */
3632       stack_block_stack = thisblock;
3633       (*interim_eh_hook) (NULL_TREE);
3634     }
3635   return 1;
3636 }
3637 \f
3638 /* DECL is an anonymous union.  CLEANUP is a cleanup for DECL.
3639    DECL_ELTS is the list of elements that belong to DECL's type.
3640    In each, the TREE_VALUE is a VAR_DECL, and the TREE_PURPOSE a cleanup.  */
3641
3642 void
3643 expand_anon_union_decl (decl, cleanup, decl_elts)
3644      tree decl, cleanup, decl_elts;
3645 {
3646   struct nesting *thisblock = block_stack;
3647   rtx x;
3648
3649   expand_decl (decl, cleanup);
3650   x = DECL_RTL (decl);
3651
3652   while (decl_elts)
3653     {
3654       tree decl_elt = TREE_VALUE (decl_elts);
3655       tree cleanup_elt = TREE_PURPOSE (decl_elts);
3656       enum machine_mode mode = TYPE_MODE (TREE_TYPE (decl_elt));
3657
3658       /* Propagate the union's alignment to the elements.  */
3659       DECL_ALIGN (decl_elt) = DECL_ALIGN (decl);
3660
3661       /* If the element has BLKmode and the union doesn't, the union is
3662          aligned such that the element doesn't need to have BLKmode, so
3663          change the element's mode to the appropriate one for its size.  */
3664       if (mode == BLKmode && DECL_MODE (decl) != BLKmode)
3665         DECL_MODE (decl_elt) = mode
3666           = mode_for_size (TREE_INT_CST_LOW (DECL_SIZE (decl_elt)),
3667                            MODE_INT, 1);
3668
3669       /* (SUBREG (MEM ...)) at RTL generation time is invalid, so we
3670          instead create a new MEM rtx with the proper mode.  */
3671       if (GET_CODE (x) == MEM)
3672         {
3673           if (mode == GET_MODE (x))
3674             DECL_RTL (decl_elt) = x;
3675           else
3676             {
3677               DECL_RTL (decl_elt) = gen_rtx (MEM, mode, copy_rtx (XEXP (x, 0)));
3678               MEM_IN_STRUCT_P (DECL_RTL (decl_elt)) = MEM_IN_STRUCT_P (x);
3679               RTX_UNCHANGING_P (DECL_RTL (decl_elt)) = RTX_UNCHANGING_P (x);
3680             }
3681         }
3682       else if (GET_CODE (x) == REG)
3683         {
3684           if (mode == GET_MODE (x))
3685             DECL_RTL (decl_elt) = x;
3686           else
3687             DECL_RTL (decl_elt) = gen_rtx (SUBREG, mode, x, 0);
3688         }
3689       else
3690         abort ();
3691
3692       /* Record the cleanup if there is one.  */
3693
3694       if (cleanup != 0)
3695         thisblock->data.block.cleanups
3696           = temp_tree_cons (decl_elt, cleanup_elt,
3697                             thisblock->data.block.cleanups);
3698
3699       decl_elts = TREE_CHAIN (decl_elts);
3700     }
3701 }
3702 \f
3703 /* Expand a list of cleanups LIST.
3704    Elements may be expressions or may be nested lists.
3705
3706    If DONT_DO is nonnull, then any list-element
3707    whose TREE_PURPOSE matches DONT_DO is omitted.
3708    This is sometimes used to avoid a cleanup associated with
3709    a value that is being returned out of the scope.
3710
3711    If IN_FIXUP is non-zero, we are generating this cleanup for a fixup
3712    goto and handle protection regions specially in that case.
3713
3714    If REACHABLE, we emit code, otherwise just inform the exception handling
3715    code about this finalization.  */
3716
3717 static void
3718 expand_cleanups (list, dont_do, in_fixup, reachable)
3719      tree list;
3720      tree dont_do;
3721      int in_fixup;
3722      int reachable;
3723 {
3724   tree tail;
3725   for (tail = list; tail; tail = TREE_CHAIN (tail))
3726     if (dont_do == 0 || TREE_PURPOSE (tail) != dont_do)
3727       {
3728         if (TREE_CODE (TREE_VALUE (tail)) == TREE_LIST)
3729           expand_cleanups (TREE_VALUE (tail), dont_do, in_fixup, reachable);
3730         else
3731           {
3732             if (! in_fixup)
3733               (*interim_eh_hook) (TREE_VALUE (tail));
3734
3735             if (reachable)
3736               {
3737                 /* Cleanups may be run multiple times.  For example,
3738                    when exiting a binding contour, we expand the
3739                    cleanups associated with that contour.  When a goto
3740                    within that binding contour has a target outside that
3741                    contour, it will expand all cleanups from its scope to
3742                    the target.  Though the cleanups are expanded multiple
3743                    times, the control paths are non-overlapping so the
3744                    cleanups will not be executed twice.  */
3745                 expand_expr (TREE_VALUE (tail), const0_rtx, VOIDmode, 0);
3746                 free_temp_slots ();
3747               }
3748           }
3749       }
3750 }
3751
3752 /* Move all cleanups from the current block_stack
3753    to the containing block_stack, where they are assumed to
3754    have been created.  If anything can cause a temporary to
3755    be created, but not expanded for more than one level of
3756    block_stacks, then this code will have to change.  */
3757
3758 void
3759 move_cleanups_up ()
3760 {
3761   struct nesting *block = block_stack;
3762   struct nesting *outer = block->next;
3763
3764   outer->data.block.cleanups
3765     = chainon (block->data.block.cleanups,
3766                outer->data.block.cleanups);
3767   block->data.block.cleanups = 0;
3768 }
3769
3770 tree
3771 last_cleanup_this_contour ()
3772 {
3773   if (block_stack == 0)
3774     return 0;
3775
3776   return block_stack->data.block.cleanups;
3777 }
3778
3779 /* Return 1 if there are any pending cleanups at this point.
3780    If THIS_CONTOUR is nonzero, check the current contour as well.
3781    Otherwise, look only at the contours that enclose this one.  */
3782
3783 int
3784 any_pending_cleanups (this_contour)
3785      int this_contour;
3786 {
3787   struct nesting *block;
3788
3789   if (block_stack == 0)
3790     return 0;
3791
3792   if (this_contour && block_stack->data.block.cleanups != NULL)
3793     return 1;
3794   if (block_stack->data.block.cleanups == 0
3795       && (block_stack->data.block.outer_cleanups == 0
3796 #if 0
3797           || block_stack->data.block.outer_cleanups == empty_cleanup_list
3798 #endif
3799           ))
3800     return 0;
3801
3802   for (block = block_stack->next; block; block = block->next)
3803     if (block->data.block.cleanups != 0)
3804       return 1;
3805
3806   return 0;
3807 }
3808 \f
3809 /* Enter a case (Pascal) or switch (C) statement.
3810    Push a block onto case_stack and nesting_stack
3811    to accumulate the case-labels that are seen
3812    and to record the labels generated for the statement.
3813
3814    EXIT_FLAG is nonzero if `exit_something' should exit this case stmt.
3815    Otherwise, this construct is transparent for `exit_something'.
3816
3817    EXPR is the index-expression to be dispatched on.
3818    TYPE is its nominal type.  We could simply convert EXPR to this type,
3819    but instead we take short cuts.  */
3820
3821 void
3822 expand_start_case (exit_flag, expr, type, printname)
3823      int exit_flag;
3824      tree expr;
3825      tree type;
3826      char *printname;
3827 {
3828   register struct nesting *thiscase = ALLOC_NESTING ();
3829
3830   /* Make an entry on case_stack for the case we are entering.  */
3831
3832   thiscase->next = case_stack;
3833   thiscase->all = nesting_stack;
3834   thiscase->depth = ++nesting_depth;
3835   thiscase->exit_label = exit_flag ? gen_label_rtx () : 0;
3836   thiscase->data.case_stmt.case_list = 0;
3837   thiscase->data.case_stmt.index_expr = expr;
3838   thiscase->data.case_stmt.nominal_type = type;
3839   thiscase->data.case_stmt.default_label = 0;
3840   thiscase->data.case_stmt.num_ranges = 0;
3841   thiscase->data.case_stmt.printname = printname;
3842   thiscase->data.case_stmt.seenlabel = 0;
3843   case_stack = thiscase;
3844   nesting_stack = thiscase;
3845
3846   if (output_bytecode)
3847     {
3848       bc_expand_start_case (thiscase, expr, type, printname);
3849       return;
3850     }
3851
3852   do_pending_stack_adjust ();
3853
3854   /* Make sure case_stmt.start points to something that won't
3855      need any transformation before expand_end_case.  */
3856   if (GET_CODE (get_last_insn ()) != NOTE)
3857     emit_note (NULL_PTR, NOTE_INSN_DELETED);
3858
3859   thiscase->data.case_stmt.start = get_last_insn ();
3860 }
3861
3862
3863 /* Enter a case statement. It is assumed that the caller has pushed
3864    the current context onto the case stack. */
3865
3866 static void
3867 bc_expand_start_case (thiscase, expr, type, printname)
3868      struct nesting *thiscase;
3869      tree expr;
3870      tree type;
3871      char *printname;
3872 {
3873   bc_expand_expr (expr);
3874   bc_expand_conversion (TREE_TYPE (expr), type);
3875
3876   /* For cases, the skip is a place we jump to that's emitted after
3877      the size of the jump table is known.  */
3878
3879   thiscase->data.case_stmt.skip_label = gen_label_rtx ();
3880   bc_emit_bytecode (jump);
3881   bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (thiscase->data.case_stmt.skip_label));
3882
3883 #ifdef DEBUG_PRINT_CODE
3884   fputc ('\n', stderr);
3885 #endif
3886 }
3887
3888
3889 /* Start a "dummy case statement" within which case labels are invalid
3890    and are not connected to any larger real case statement.
3891    This can be used if you don't want to let a case statement jump
3892    into the middle of certain kinds of constructs.  */
3893
3894 void
3895 expand_start_case_dummy ()
3896 {
3897   register struct nesting *thiscase = ALLOC_NESTING ();
3898
3899   /* Make an entry on case_stack for the dummy.  */
3900
3901   thiscase->next = case_stack;
3902   thiscase->all = nesting_stack;
3903   thiscase->depth = ++nesting_depth;
3904   thiscase->exit_label = 0;
3905   thiscase->data.case_stmt.case_list = 0;
3906   thiscase->data.case_stmt.start = 0;
3907   thiscase->data.case_stmt.nominal_type = 0;
3908   thiscase->data.case_stmt.default_label = 0;
3909   thiscase->data.case_stmt.num_ranges = 0;
3910   case_stack = thiscase;
3911   nesting_stack = thiscase;
3912 }
3913
3914 /* End a dummy case statement.  */
3915
3916 void
3917 expand_end_case_dummy ()
3918 {
3919   POPSTACK (case_stack);
3920 }
3921
3922 /* Return the data type of the index-expression
3923    of the innermost case statement, or null if none.  */
3924
3925 tree
3926 case_index_expr_type ()
3927 {
3928   if (case_stack)
3929     return TREE_TYPE (case_stack->data.case_stmt.index_expr);
3930   return 0;
3931 }
3932 \f
3933 /* Accumulate one case or default label inside a case or switch statement.
3934    VALUE is the value of the case (a null pointer, for a default label).
3935    The function CONVERTER, when applied to arguments T and V,
3936    converts the value V to the type T.
3937
3938    If not currently inside a case or switch statement, return 1 and do
3939    nothing.  The caller will print a language-specific error message.
3940    If VALUE is a duplicate or overlaps, return 2 and do nothing
3941    except store the (first) duplicate node in *DUPLICATE.
3942    If VALUE is out of range, return 3 and do nothing.
3943    If we are jumping into the scope of a cleaup or var-sized array, return 5.
3944    Return 0 on success.
3945
3946    Extended to handle range statements.  */
3947
3948 int
3949 pushcase (value, converter, label, duplicate)
3950      register tree value;
3951      tree (*converter) PROTO((tree, tree));
3952      register tree label;
3953      tree *duplicate;
3954 {
3955   register struct case_node **l;
3956   register struct case_node *n;
3957   tree index_type;
3958   tree nominal_type;
3959
3960   if (output_bytecode)
3961     return bc_pushcase (value, label);
3962
3963   /* Fail if not inside a real case statement.  */
3964   if (! (case_stack && case_stack->data.case_stmt.start))
3965     return 1;
3966
3967   if (stack_block_stack
3968       && stack_block_stack->depth > case_stack->depth)
3969     return 5;
3970
3971   index_type = TREE_TYPE (case_stack->data.case_stmt.index_expr);
3972   nominal_type = case_stack->data.case_stmt.nominal_type;
3973
3974   /* If the index is erroneous, avoid more problems: pretend to succeed.  */
3975   if (index_type == error_mark_node)
3976     return 0;
3977
3978   /* Convert VALUE to the type in which the comparisons are nominally done.  */
3979   if (value != 0)
3980     value = (*converter) (nominal_type, value);
3981
3982   /* If this is the first label, warn if any insns have been emitted.  */
3983   if (case_stack->data.case_stmt.seenlabel == 0)
3984     {
3985       rtx insn;
3986       for (insn = case_stack->data.case_stmt.start;
3987            insn;
3988            insn = NEXT_INSN (insn))
3989         {
3990           if (GET_CODE (insn) == CODE_LABEL)
3991             break;
3992           if (GET_CODE (insn) != NOTE
3993               && (GET_CODE (insn) != INSN || GET_CODE (PATTERN (insn)) != USE))
3994             {
3995               warning ("unreachable code at beginning of %s",
3996                        case_stack->data.case_stmt.printname);
3997               break;
3998             }
3999         }
4000     }
4001   case_stack->data.case_stmt.seenlabel = 1;
4002
4003   /* Fail if this value is out of range for the actual type of the index
4004      (which may be narrower than NOMINAL_TYPE).  */
4005   if (value != 0 && ! int_fits_type_p (value, index_type))
4006     return 3;
4007
4008   /* Fail if this is a duplicate or overlaps another entry.  */
4009   if (value == 0)
4010     {
4011       if (case_stack->data.case_stmt.default_label != 0)
4012         {
4013           *duplicate = case_stack->data.case_stmt.default_label;
4014           return 2;
4015         }
4016       case_stack->data.case_stmt.default_label = label;
4017     }
4018   else
4019     {
4020       /* Find the elt in the chain before which to insert the new value,
4021          to keep the chain sorted in increasing order.
4022          But report an error if this element is a duplicate.  */
4023       for (l = &case_stack->data.case_stmt.case_list;
4024            /* Keep going past elements distinctly less than VALUE.  */
4025            *l != 0 && tree_int_cst_lt ((*l)->high, value);
4026            l = &(*l)->right)
4027         ;
4028       if (*l)
4029         {
4030           /* Element we will insert before must be distinctly greater;
4031              overlap means error.  */
4032           if (! tree_int_cst_lt (value, (*l)->low))
4033             {
4034               *duplicate = (*l)->code_label;
4035               return 2;
4036             }
4037         }
4038
4039       /* Add this label to the chain, and succeed.
4040          Copy VALUE so it is on temporary rather than momentary
4041          obstack and will thus survive till the end of the case statement.  */
4042       n = (struct case_node *) oballoc (sizeof (struct case_node));
4043       n->left = 0;
4044       n->right = *l;
4045       n->high = n->low = copy_node (value);
4046       n->code_label = label;
4047       *l = n;
4048     }
4049
4050   expand_label (label);
4051   return 0;
4052 }
4053
4054 /* Like pushcase but this case applies to all values
4055    between VALUE1 and VALUE2 (inclusive).
4056    The return value is the same as that of pushcase
4057    but there is one additional error code:
4058    4 means the specified range was empty.  */
4059
4060 int
4061 pushcase_range (value1, value2, converter, label, duplicate)
4062      register tree value1, value2;
4063      tree (*converter) PROTO((tree, tree));
4064      register tree label;
4065      tree *duplicate;
4066 {
4067   register struct case_node **l;
4068   register struct case_node *n;
4069   tree index_type;
4070   tree nominal_type;
4071
4072   /* Fail if not inside a real case statement.  */
4073   if (! (case_stack && case_stack->data.case_stmt.start))
4074     return 1;
4075
4076   if (stack_block_stack
4077       && stack_block_stack->depth > case_stack->depth)
4078     return 5;
4079
4080   index_type = TREE_TYPE (case_stack->data.case_stmt.index_expr);
4081   nominal_type = case_stack->data.case_stmt.nominal_type;
4082
4083   /* If the index is erroneous, avoid more problems: pretend to succeed.  */
4084   if (index_type == error_mark_node)
4085     return 0;
4086
4087   /* If this is the first label, warn if any insns have been emitted.  */
4088   if (case_stack->data.case_stmt.seenlabel == 0)
4089     {
4090       rtx insn;
4091       for (insn = case_stack->data.case_stmt.start;
4092            insn;
4093            insn = NEXT_INSN (insn))
4094         {
4095           if (GET_CODE (insn) == CODE_LABEL)
4096             break;
4097           if (GET_CODE (insn) != NOTE
4098               && (GET_CODE (insn) != INSN || GET_CODE (PATTERN (insn)) != USE))
4099             {
4100               warning ("unreachable code at beginning of %s",
4101                        case_stack->data.case_stmt.printname);
4102               break;
4103             }
4104         }
4105     }
4106   case_stack->data.case_stmt.seenlabel = 1;
4107
4108   /* Convert VALUEs to type in which the comparisons are nominally done.  */
4109   if (value1 == 0)  /* Negative infinity. */
4110     value1 = TYPE_MIN_VALUE(index_type);
4111   value1 = (*converter) (nominal_type, value1);
4112
4113   if (value2 == 0)  /* Positive infinity. */
4114     value2 = TYPE_MAX_VALUE(index_type);
4115   value2 = (*converter) (nominal_type, value2);
4116
4117   /* Fail if these values are out of range.  */
4118   if (! int_fits_type_p (value1, index_type))
4119     return 3;
4120
4121   if (! int_fits_type_p (value2, index_type))
4122     return 3;
4123
4124   /* Fail if the range is empty.  */
4125   if (tree_int_cst_lt (value2, value1))
4126     return 4;
4127
4128   /* If the bounds are equal, turn this into the one-value case.  */
4129   if (tree_int_cst_equal (value1, value2))
4130     return pushcase (value1, converter, label, duplicate);
4131
4132   /* Find the elt in the chain before which to insert the new value,
4133      to keep the chain sorted in increasing order.
4134      But report an error if this element is a duplicate.  */
4135   for (l = &case_stack->data.case_stmt.case_list;
4136        /* Keep going past elements distinctly less than this range.  */
4137        *l != 0 && tree_int_cst_lt ((*l)->high, value1);
4138        l = &(*l)->right)
4139     ;
4140   if (*l)
4141     {
4142       /* Element we will insert before must be distinctly greater;
4143          overlap means error.  */
4144       if (! tree_int_cst_lt (value2, (*l)->low))
4145         {
4146           *duplicate = (*l)->code_label;
4147           return 2;
4148         }
4149     }
4150
4151   /* Add this label to the chain, and succeed.
4152      Copy VALUE1, VALUE2 so they are on temporary rather than momentary
4153      obstack and will thus survive till the end of the case statement.  */
4154
4155   n = (struct case_node *) oballoc (sizeof (struct case_node));
4156   n->left = 0;
4157   n->right = *l;
4158   n->low = copy_node (value1);
4159   n->high = copy_node (value2);
4160   n->code_label = label;
4161   *l = n;
4162
4163   expand_label (label);
4164
4165   case_stack->data.case_stmt.num_ranges++;
4166
4167   return 0;
4168 }
4169
4170
4171 /* Accumulate one case or default label; VALUE is the value of the
4172    case, or nil for a default label.  If not currently inside a case,
4173    return 1 and do nothing.  If VALUE is a duplicate or overlaps, return
4174    2 and do nothing.  If VALUE is out of range, return 3 and do nothing.
4175    Return 0 on success.  This function is a leftover from the earlier
4176    bytecode compiler, which was based on gcc 1.37.  It should be
4177    merged into pushcase. */
4178
4179 static int
4180 bc_pushcase (value, label)
4181      tree value;
4182      tree label;
4183 {
4184   struct nesting *thiscase = case_stack;
4185   struct case_node *case_label, *new_label;
4186
4187   if (! thiscase)
4188     return 1;
4189
4190   /* Fail if duplicate, overlap, or out of type range.  */
4191   if (value)
4192     {
4193       value = convert (thiscase->data.case_stmt.nominal_type, value);
4194       if (! int_fits_type_p (value, thiscase->data.case_stmt.nominal_type))
4195         return 3;
4196
4197       for (case_label = thiscase->data.case_stmt.case_list;
4198            case_label->left; case_label = case_label->left)
4199         if (! tree_int_cst_lt (case_label->left->high, value))
4200           break;
4201
4202       if (case_label != thiscase->data.case_stmt.case_list
4203           && ! tree_int_cst_lt (case_label->high, value)
4204           || case_label->left && ! tree_int_cst_lt (value, case_label->left->low))
4205         return 2;
4206
4207       new_label = (struct case_node *) oballoc (sizeof (struct case_node));
4208       new_label->low = new_label->high = copy_node (value);
4209       new_label->code_label = label;
4210       new_label->left = case_label->left;
4211
4212       case_label->left = new_label;
4213       thiscase->data.case_stmt.num_ranges++;
4214     }
4215   else
4216     {
4217       if (thiscase->data.case_stmt.default_label)
4218         return 2;
4219       thiscase->data.case_stmt.default_label = label;
4220     }
4221
4222   expand_label (label);
4223   return 0;
4224 }
4225 \f
4226 /* Returns the number of possible values of TYPE.
4227    Returns -1 if the number is unknown or variable.
4228    Returns -2 if the number does not fit in a HOST_WIDE_INT.
4229    Sets *SPARENESS to 2 if TYPE is an ENUMERAL_TYPE whose values
4230    do not increase monotonically (there may be duplicates);
4231    to 1 if the values increase monotonically, but not always by 1;
4232    otherwise sets it to 0.  */
4233
4234 HOST_WIDE_INT
4235 all_cases_count (type, spareness)
4236      tree type;
4237      int *spareness;
4238 {
4239   HOST_WIDE_INT count, count_high = 0;
4240   *spareness = 0;
4241
4242   switch (TREE_CODE (type))
4243     {
4244       tree t;
4245     case BOOLEAN_TYPE:
4246       count = 2;
4247       break;
4248     case CHAR_TYPE:
4249       count = 1 << BITS_PER_UNIT;
4250       break;
4251     default:
4252     case INTEGER_TYPE:
4253       if (TREE_CODE (TYPE_MIN_VALUE (type)) != INTEGER_CST
4254           || TREE_CODE (TYPE_MIN_VALUE (type)) != INTEGER_CST)
4255         return -1;
4256       else
4257         {
4258           /* count
4259              = TREE_INT_CST_LOW (TYPE_MAX_VALUE (type))
4260              - TREE_INT_CST_LOW (TYPE_MIN_VALUE (type)) + 1
4261              but with overflow checking. */
4262           tree mint = TYPE_MIN_VALUE (type);
4263           tree maxt = TYPE_MAX_VALUE (type);
4264           HOST_WIDE_INT lo, hi;
4265           neg_double(TREE_INT_CST_LOW (mint), TREE_INT_CST_HIGH (mint),
4266                      &lo, &hi);
4267           add_double(TREE_INT_CST_LOW (maxt), TREE_INT_CST_HIGH (maxt),
4268                      lo, hi, &lo, &hi);
4269           add_double (lo, hi, 1, 0, &lo, &hi);
4270           if (hi != 0 || lo < 0)
4271             return -2;
4272           count = lo;
4273         }
4274       break;
4275     case ENUMERAL_TYPE:
4276       count = 0;
4277       for (t = TYPE_VALUES (type); t != NULL_TREE; t = TREE_CHAIN (t))
4278         {
4279           if (TREE_CODE (TYPE_MIN_VALUE (type)) != INTEGER_CST
4280               || TREE_CODE (TREE_VALUE (t)) != INTEGER_CST
4281               || TREE_INT_CST_LOW (TYPE_MIN_VALUE (type)) + count
4282               != TREE_INT_CST_LOW (TREE_VALUE (t)))
4283             *spareness = 1;
4284           count++;
4285         }
4286       if (*spareness == 1)
4287         {
4288           tree prev = TREE_VALUE (TYPE_VALUES (type));
4289           for (t = TYPE_VALUES (type); t = TREE_CHAIN (t), t != NULL_TREE; )
4290             {
4291               if (! tree_int_cst_lt (prev, TREE_VALUE (t)))
4292                 {
4293                   *spareness = 2;
4294                   break;
4295                 }
4296               prev = TREE_VALUE (t);
4297             }
4298           
4299         }
4300     }
4301   return count;
4302 }
4303
4304
4305 #define BITARRAY_TEST(ARRAY, INDEX) \
4306   ((ARRAY)[(unsigned)(INDEX) / HOST_BITS_PER_CHAR]\
4307                           & (1 << ((unsigned)(INDEX) % HOST_BITS_PER_CHAR)))
4308 #define BITARRAY_SET(ARRAY, INDEX) \
4309   ((ARRAY)[(unsigned)(INDEX) / HOST_BITS_PER_CHAR]\
4310                           |= 1 << ((unsigned)(INDEX) % HOST_BITS_PER_CHAR))
4311
4312 /* Set the elements of the bitstring CASES_SEEN (which has length COUNT),
4313    with the case values we have seen, assuming the case expression
4314    has the given TYPE.
4315    SPARSENESS is as determined by all_cases_count.
4316
4317    The time needed is propotional to COUNT, unless
4318    SPARSENESS is 2, in which case quadratic time is needed.  */
4319
4320 void
4321 mark_seen_cases (type, cases_seen, count, sparseness)
4322      tree type;
4323      unsigned char *cases_seen;
4324      long count;
4325      int sparseness;
4326 {
4327   long i;
4328
4329   tree next_node_to_try = NULL_TREE;
4330   long next_node_offset = 0;
4331
4332   register struct case_node *n;
4333   tree val = make_node (INTEGER_CST);
4334   TREE_TYPE (val) = type;
4335   for (n = case_stack->data.case_stmt.case_list; n;
4336        n = n->right)
4337     {
4338       TREE_INT_CST_LOW (val) = TREE_INT_CST_LOW (n->low);
4339       TREE_INT_CST_HIGH (val) = TREE_INT_CST_HIGH (n->low);
4340       while ( ! tree_int_cst_lt (n->high, val))
4341         {
4342           /* Calculate (into xlo) the "offset" of the integer (val).
4343              The element with lowest value has offset 0, the next smallest
4344              element has offset 1, etc.  */
4345
4346           HOST_WIDE_INT xlo, xhi;
4347           tree t;
4348           if (sparseness == 2)
4349             {
4350               /* This less efficient loop is only needed to handle
4351                  duplicate case values (multiple enum constants
4352                  with the same value).  */
4353               for (t = TYPE_VALUES (type), xlo = 0;  t != NULL_TREE;
4354                    t = TREE_CHAIN (t), xlo++)
4355                 {
4356                   if (tree_int_cst_equal (val, TREE_VALUE (t)))
4357                     BITARRAY_SET (cases_seen, xlo);
4358                 }
4359             }
4360           else
4361             {
4362               if (sparseness && TYPE_VALUES (type) != NULL_TREE)
4363                 {
4364                   /* The TYPE_VALUES will be in increasing order, so
4365                      starting searching where we last ended.  */
4366                   t = next_node_to_try;
4367                   xlo = next_node_offset;
4368                   xhi = 0;
4369                   for (;;)
4370                     {
4371                       if (t == NULL_TREE)
4372                         {
4373                           t = TYPE_VALUES (type);
4374                           xlo = 0;
4375                         }
4376                       if (tree_int_cst_equal (val, TREE_VALUE (t)))
4377                         {
4378                           next_node_to_try = TREE_CHAIN (t);
4379                           next_node_offset = xlo + 1;
4380                           break;
4381                         }
4382                       xlo++;
4383                       t = TREE_CHAIN (t);
4384                       if (t == next_node_to_try)
4385                         break;
4386                     }
4387                 }
4388               else
4389                 {
4390                   t = TYPE_MIN_VALUE (type);
4391                   if (t)
4392                     neg_double (TREE_INT_CST_LOW (t), TREE_INT_CST_HIGH (t),
4393                                 &xlo, &xhi);
4394                   else
4395                     xlo = xhi = 0;
4396                   add_double (xlo, xhi,
4397                               TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val),
4398                               &xlo, &xhi);
4399                 }
4400               
4401               if (xhi == 0 && xlo >= 0 && xlo < count)
4402                 BITARRAY_SET (cases_seen, xlo);
4403             }
4404           add_double (TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val),
4405                       1, 0,
4406                       &TREE_INT_CST_LOW (val), &TREE_INT_CST_HIGH (val));
4407         }
4408     }
4409 }
4410
4411 /* Called when the index of a switch statement is an enumerated type
4412    and there is no default label.
4413
4414    Checks that all enumeration literals are covered by the case
4415    expressions of a switch.  Also, warn if there are any extra
4416    switch cases that are *not* elements of the enumerated type.
4417
4418    If all enumeration literals were covered by the case expressions,
4419    turn one of the expressions into the default expression since it should
4420    not be possible to fall through such a switch.  */
4421
4422 void
4423 check_for_full_enumeration_handling (type)
4424      tree type;
4425 {
4426   register struct case_node *n;
4427   register struct case_node **l;
4428   register tree chain;
4429   int all_values = 1;
4430
4431   /* True iff the selector type is a numbered set mode. */
4432   int sparseness = 0;
4433
4434   /* The number of possible selector values. */
4435   HOST_WIDE_INT size;
4436
4437   /* For each possible selector value. a one iff it has been matched
4438      by a case value alternative. */
4439   unsigned char *cases_seen;
4440
4441   /* The allocated size of cases_seen, in chars. */
4442   long bytes_needed;
4443   tree t;
4444
4445   if (output_bytecode)
4446     {
4447       bc_check_for_full_enumeration_handling (type);
4448       return;
4449     }
4450
4451   if (! warn_switch)
4452     return;
4453
4454   size = all_cases_count (type, &sparseness);
4455   bytes_needed = (size + HOST_BITS_PER_CHAR) / HOST_BITS_PER_CHAR;
4456
4457   if (size > 0 && size < 600000
4458       /* We deliberately use malloc here - not xmalloc. */
4459       && (cases_seen = (unsigned char *) malloc (bytes_needed)) != NULL)
4460     {
4461       long i;
4462       tree v = TYPE_VALUES (type);
4463       bzero (cases_seen, bytes_needed);
4464
4465       /* The time complexity of this code is normally O(N), where
4466          N being the number of members in the enumerated type.
4467          However, if type is a ENUMERAL_TYPE whose values do not
4468          increase monotonically, quadratic time may be needed. */
4469
4470       mark_seen_cases (type, cases_seen, size, sparseness);
4471
4472       for (i = 0;  v != NULL_TREE && i < size; i++, v = TREE_CHAIN (v))
4473         {
4474           if (BITARRAY_TEST(cases_seen, i) == 0)
4475             warning ("enumeration value `%s' not handled in switch",
4476                      IDENTIFIER_POINTER (TREE_PURPOSE (v)));
4477         }
4478
4479       free (cases_seen);
4480     }
4481
4482   /* Now we go the other way around; we warn if there are case
4483      expressions that don't correspond to enumerators.  This can
4484      occur since C and C++ don't enforce type-checking of
4485      assignments to enumeration variables. */
4486
4487   if (warn_switch)
4488     for (n = case_stack->data.case_stmt.case_list; n; n = n->right)
4489       {
4490         for (chain = TYPE_VALUES (type);
4491              chain && !tree_int_cst_equal (n->low, TREE_VALUE (chain));
4492              chain = TREE_CHAIN (chain))
4493           ;
4494
4495         if (!chain)
4496           {
4497             if (TYPE_NAME (type) == 0)
4498               warning ("case value `%d' not in enumerated type",
4499                        TREE_INT_CST_LOW (n->low));
4500             else
4501               warning ("case value `%d' not in enumerated type `%s'",
4502                        TREE_INT_CST_LOW (n->low),
4503                        IDENTIFIER_POINTER ((TREE_CODE (TYPE_NAME (type))
4504                                             == IDENTIFIER_NODE)
4505                                            ? TYPE_NAME (type)
4506                                            : DECL_NAME (TYPE_NAME (type))));
4507           }
4508         if (!tree_int_cst_equal (n->low, n->high))
4509           {
4510             for (chain = TYPE_VALUES (type);
4511                  chain && !tree_int_cst_equal (n->high, TREE_VALUE (chain));
4512                  chain = TREE_CHAIN (chain))
4513               ;
4514
4515             if (!chain)
4516               {
4517                 if (TYPE_NAME (type) == 0)
4518                   warning ("case value `%d' not in enumerated type",
4519                            TREE_INT_CST_LOW (n->high));
4520                 else
4521                   warning ("case value `%d' not in enumerated type `%s'",
4522                            TREE_INT_CST_LOW (n->high),
4523                            IDENTIFIER_POINTER ((TREE_CODE (TYPE_NAME (type))
4524                                                 == IDENTIFIER_NODE)
4525                                                ? TYPE_NAME (type)
4526                                                : DECL_NAME (TYPE_NAME (type))));
4527               }
4528           }
4529       }
4530
4531 #if 0
4532   /* ??? This optimization is disabled because it causes valid programs to
4533      fail.  ANSI C does not guarantee that an expression with enum type
4534      will have a value that is the same as one of the enumation literals.  */
4535
4536   /* If all values were found as case labels, make one of them the default
4537      label.  Thus, this switch will never fall through.  We arbitrarily pick
4538      the last one to make the default since this is likely the most
4539      efficient choice.  */
4540
4541   if (all_values)
4542     {
4543       for (l = &case_stack->data.case_stmt.case_list;
4544            (*l)->right != 0;
4545            l = &(*l)->right)
4546         ;
4547
4548       case_stack->data.case_stmt.default_label = (*l)->code_label;
4549       *l = 0;
4550     }
4551 #endif /* 0 */
4552 }
4553
4554
4555 /* Check that all enumeration literals are covered by the case
4556    expressions of a switch.  Also warn if there are any cases
4557    that are not elements of the enumerated type.  */
4558
4559 static void
4560 bc_check_for_full_enumeration_handling (type)
4561      tree type;
4562 {
4563   struct nesting *thiscase = case_stack;
4564   struct case_node *c;
4565   tree e;
4566
4567   /* Check for enums not handled.  */
4568   for (e = TYPE_VALUES (type); e; e = TREE_CHAIN (e))
4569     {
4570       for (c = thiscase->data.case_stmt.case_list->left;
4571            c && tree_int_cst_lt (c->high, TREE_VALUE (e));
4572            c = c->left)
4573         ;
4574       if (! (c && tree_int_cst_equal (c->low, TREE_VALUE (e))))
4575         warning ("enumerated value `%s' not handled in switch",
4576                  IDENTIFIER_POINTER (TREE_PURPOSE (e)));
4577     }
4578
4579   /* Check for cases not in the enumeration.  */
4580   for (c = thiscase->data.case_stmt.case_list->left; c; c = c->left)
4581     {
4582       for (e = TYPE_VALUES (type);
4583            e && !tree_int_cst_equal (c->low, TREE_VALUE (e));
4584            e = TREE_CHAIN (e))
4585         ;
4586       if (! e)
4587         warning ("case value `%d' not in enumerated type `%s'",
4588                  TREE_INT_CST_LOW (c->low),
4589                  IDENTIFIER_POINTER (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE
4590                                      ? TYPE_NAME (type)
4591                                      : DECL_NAME (TYPE_NAME (type))));
4592     }
4593 }
4594 \f
4595 /* Terminate a case (Pascal) or switch (C) statement
4596    in which ORIG_INDEX is the expression to be tested.
4597    Generate the code to test it and jump to the right place.  */
4598
4599 void
4600 expand_end_case (orig_index)
4601      tree orig_index;
4602 {
4603   tree minval, maxval, range, orig_minval;
4604   rtx default_label = 0;
4605   register struct case_node *n;
4606   int count;
4607   rtx index;
4608   rtx table_label;
4609   int ncases;
4610   rtx *labelvec;
4611   register int i;
4612   rtx before_case;
4613   register struct nesting *thiscase = case_stack;
4614   tree index_expr, index_type;
4615   int unsignedp;
4616
4617   if (output_bytecode)
4618     {
4619       bc_expand_end_case (orig_index);
4620       return;
4621     }
4622
4623   table_label = gen_label_rtx ();
4624   index_expr = thiscase->data.case_stmt.index_expr;
4625   index_type = TREE_TYPE (index_expr);
4626   unsignedp = TREE_UNSIGNED (index_type);
4627
4628   do_pending_stack_adjust ();
4629
4630   /* An ERROR_MARK occurs for various reasons including invalid data type.  */
4631   if (index_type != error_mark_node)
4632     {
4633       /* If switch expression was an enumerated type, check that all
4634          enumeration literals are covered by the cases.
4635          No sense trying this if there's a default case, however.  */
4636
4637       if (!thiscase->data.case_stmt.default_label
4638           && TREE_CODE (TREE_TYPE (orig_index)) == ENUMERAL_TYPE
4639           && TREE_CODE (index_expr) != INTEGER_CST)
4640         check_for_full_enumeration_handling (TREE_TYPE (orig_index));
4641
4642       /* If this is the first label, warn if any insns have been emitted.  */
4643       if (thiscase->data.case_stmt.seenlabel == 0)
4644         {
4645           rtx insn;
4646           for (insn = get_last_insn ();
4647                insn != case_stack->data.case_stmt.start;
4648                insn = PREV_INSN (insn))
4649             if (GET_CODE (insn) != NOTE
4650                 && (GET_CODE (insn) != INSN || GET_CODE (PATTERN (insn))!= USE))
4651               {
4652                 warning ("unreachable code at beginning of %s",
4653                          case_stack->data.case_stmt.printname);
4654                 break;
4655               }
4656         }
4657
4658       /* If we don't have a default-label, create one here,
4659          after the body of the switch.  */
4660       if (thiscase->data.case_stmt.default_label == 0)
4661         {
4662           thiscase->data.case_stmt.default_label
4663             = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
4664           expand_label (thiscase->data.case_stmt.default_label);
4665         }
4666       default_label = label_rtx (thiscase->data.case_stmt.default_label);
4667
4668       before_case = get_last_insn ();
4669
4670       /* Simplify the case-list before we count it.  */
4671       group_case_nodes (thiscase->data.case_stmt.case_list);
4672
4673       /* Get upper and lower bounds of case values.
4674          Also convert all the case values to the index expr's data type.  */
4675
4676       count = 0;
4677       for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
4678         {
4679           /* Check low and high label values are integers.  */
4680           if (TREE_CODE (n->low) != INTEGER_CST)
4681             abort ();
4682           if (TREE_CODE (n->high) != INTEGER_CST)
4683             abort ();
4684
4685           n->low = convert (index_type, n->low);
4686           n->high = convert (index_type, n->high);
4687
4688           /* Count the elements and track the largest and smallest
4689              of them (treating them as signed even if they are not).  */
4690           if (count++ == 0)
4691             {
4692               minval = n->low;
4693               maxval = n->high;
4694             }
4695           else
4696             {
4697               if (INT_CST_LT (n->low, minval))
4698                 minval = n->low;
4699               if (INT_CST_LT (maxval, n->high))
4700                 maxval = n->high;
4701             }
4702           /* A range counts double, since it requires two compares.  */
4703           if (! tree_int_cst_equal (n->low, n->high))
4704             count++;
4705         }
4706
4707       orig_minval = minval;
4708
4709       /* Compute span of values.  */
4710       if (count != 0)
4711         range = fold (build (MINUS_EXPR, index_type, maxval, minval));
4712
4713       if (count == 0)
4714         {
4715           expand_expr (index_expr, const0_rtx, VOIDmode, 0);
4716           emit_queue ();
4717           emit_jump (default_label);
4718         }
4719
4720       /* If range of values is much bigger than number of values,
4721          make a sequence of conditional branches instead of a dispatch.
4722          If the switch-index is a constant, do it this way
4723          because we can optimize it.  */
4724
4725 #ifndef CASE_VALUES_THRESHOLD
4726 #ifdef HAVE_casesi
4727 #define CASE_VALUES_THRESHOLD (HAVE_casesi ? 4 : 5)
4728 #else
4729       /* If machine does not have a case insn that compares the
4730          bounds, this means extra overhead for dispatch tables
4731          which raises the threshold for using them.  */
4732 #define CASE_VALUES_THRESHOLD 5
4733 #endif /* HAVE_casesi */
4734 #endif /* CASE_VALUES_THRESHOLD */
4735
4736       else if (TREE_INT_CST_HIGH (range) != 0
4737                || count < CASE_VALUES_THRESHOLD
4738                || ((unsigned HOST_WIDE_INT) (TREE_INT_CST_LOW (range))
4739                    > 10 * count)
4740                || TREE_CODE (index_expr) == INTEGER_CST
4741                /* These will reduce to a constant.  */
4742                || (TREE_CODE (index_expr) == CALL_EXPR
4743                    && TREE_CODE (TREE_OPERAND (index_expr, 0)) == ADDR_EXPR
4744                    && TREE_CODE (TREE_OPERAND (TREE_OPERAND (index_expr, 0), 0)) == FUNCTION_DECL
4745                    && DECL_FUNCTION_CODE (TREE_OPERAND (TREE_OPERAND (index_expr, 0), 0)) == BUILT_IN_CLASSIFY_TYPE)
4746                || (TREE_CODE (index_expr) == COMPOUND_EXPR
4747                    && TREE_CODE (TREE_OPERAND (index_expr, 1)) == INTEGER_CST))
4748         {
4749           index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
4750
4751           /* If the index is a short or char that we do not have
4752              an insn to handle comparisons directly, convert it to
4753              a full integer now, rather than letting each comparison
4754              generate the conversion.  */
4755
4756           if (GET_MODE_CLASS (GET_MODE (index)) == MODE_INT
4757               && (cmp_optab->handlers[(int) GET_MODE(index)].insn_code
4758                   == CODE_FOR_nothing))
4759             {
4760               enum machine_mode wider_mode;
4761               for (wider_mode = GET_MODE (index); wider_mode != VOIDmode;
4762                    wider_mode = GET_MODE_WIDER_MODE (wider_mode))
4763                 if (cmp_optab->handlers[(int) wider_mode].insn_code
4764                     != CODE_FOR_nothing)
4765                   {
4766                     index = convert_to_mode (wider_mode, index, unsignedp);
4767                     break;
4768                   }
4769             }
4770
4771           emit_queue ();
4772           do_pending_stack_adjust ();
4773
4774           index = protect_from_queue (index, 0);
4775           if (GET_CODE (index) == MEM)
4776             index = copy_to_reg (index);
4777           if (GET_CODE (index) == CONST_INT
4778               || TREE_CODE (index_expr) == INTEGER_CST)
4779             {
4780               /* Make a tree node with the proper constant value
4781                  if we don't already have one.  */
4782               if (TREE_CODE (index_expr) != INTEGER_CST)
4783                 {
4784                   index_expr
4785                     = build_int_2 (INTVAL (index),
4786                                    unsignedp || INTVAL (index) >= 0 ? 0 : -1);
4787                   index_expr = convert (index_type, index_expr);
4788                 }
4789
4790               /* For constant index expressions we need only
4791                  issue a unconditional branch to the appropriate
4792                  target code.  The job of removing any unreachable
4793                  code is left to the optimisation phase if the
4794                  "-O" option is specified.  */
4795               for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
4796                 if (! tree_int_cst_lt (index_expr, n->low)
4797                     && ! tree_int_cst_lt (n->high, index_expr))
4798                   break;
4799
4800               if (n)
4801                 emit_jump (label_rtx (n->code_label));
4802               else
4803                 emit_jump (default_label);
4804             }
4805           else
4806             {
4807               /* If the index expression is not constant we generate
4808                  a binary decision tree to select the appropriate
4809                  target code.  This is done as follows:
4810
4811                  The list of cases is rearranged into a binary tree,
4812                  nearly optimal assuming equal probability for each case.
4813
4814                  The tree is transformed into RTL, eliminating
4815                  redundant test conditions at the same time.
4816
4817                  If program flow could reach the end of the
4818                  decision tree an unconditional jump to the
4819                  default code is emitted.  */
4820
4821               use_cost_table
4822                 = (TREE_CODE (TREE_TYPE (orig_index)) != ENUMERAL_TYPE
4823                    && estimate_case_costs (thiscase->data.case_stmt.case_list));
4824               balance_case_nodes (&thiscase->data.case_stmt.case_list, 
4825                                   NULL_PTR);
4826               emit_case_nodes (index, thiscase->data.case_stmt.case_list,
4827                                default_label, index_type);
4828               emit_jump_if_reachable (default_label);
4829             }
4830         }
4831       else
4832         {
4833           int win = 0;
4834 #ifdef HAVE_casesi
4835           if (HAVE_casesi)
4836             {
4837               enum machine_mode index_mode = SImode;
4838               int index_bits = GET_MODE_BITSIZE (index_mode);
4839               rtx op1, op2;
4840               enum machine_mode op_mode;
4841
4842               /* Convert the index to SImode.  */
4843               if (GET_MODE_BITSIZE (TYPE_MODE (index_type))
4844                   > GET_MODE_BITSIZE (index_mode))
4845                 {
4846                   enum machine_mode omode = TYPE_MODE (index_type);
4847                   rtx rangertx = expand_expr (range, NULL_RTX, VOIDmode, 0);
4848
4849                   /* We must handle the endpoints in the original mode.  */
4850                   index_expr = build (MINUS_EXPR, index_type,
4851                                       index_expr, minval);
4852                   minval = integer_zero_node;
4853                   index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
4854                   emit_cmp_insn (rangertx, index, LTU, NULL_RTX, omode, 1, 0);
4855                   emit_jump_insn (gen_bltu (default_label));
4856                   /* Now we can safely truncate.  */
4857                   index = convert_to_mode (index_mode, index, 0);
4858                 }
4859               else
4860                 {
4861                   if (TYPE_MODE (index_type) != index_mode)
4862                     {
4863                       index_expr = convert (type_for_size (index_bits, 0),
4864                                             index_expr);
4865                       index_type = TREE_TYPE (index_expr);
4866                     }
4867
4868                   index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
4869                 }
4870               emit_queue ();
4871               index = protect_from_queue (index, 0);
4872               do_pending_stack_adjust ();
4873
4874               op_mode = insn_operand_mode[(int)CODE_FOR_casesi][0];
4875               if (! (*insn_operand_predicate[(int)CODE_FOR_casesi][0])
4876                   (index, op_mode))
4877                 index = copy_to_mode_reg (op_mode, index);
4878
4879               op1 = expand_expr (minval, NULL_RTX, VOIDmode, 0);
4880
4881               op_mode = insn_operand_mode[(int)CODE_FOR_casesi][1];
4882               if (! (*insn_operand_predicate[(int)CODE_FOR_casesi][1])
4883                   (op1, op_mode))
4884                 op1 = copy_to_mode_reg (op_mode, op1);
4885
4886               op2 = expand_expr (range, NULL_RTX, VOIDmode, 0);
4887
4888               op_mode = insn_operand_mode[(int)CODE_FOR_casesi][2];
4889               if (! (*insn_operand_predicate[(int)CODE_FOR_casesi][2])
4890                   (op2, op_mode))
4891                 op2 = copy_to_mode_reg (op_mode, op2);
4892
4893               emit_jump_insn (gen_casesi (index, op1, op2,
4894                                           table_label, default_label));
4895               win = 1;
4896             }
4897 #endif
4898 #ifdef HAVE_tablejump
4899           if (! win && HAVE_tablejump)
4900             {
4901               index_expr = convert (thiscase->data.case_stmt.nominal_type,
4902                                     fold (build (MINUS_EXPR, index_type,
4903                                                  index_expr, minval)));
4904               index_type = TREE_TYPE (index_expr);
4905               index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
4906               emit_queue ();
4907               index = protect_from_queue (index, 0);
4908               do_pending_stack_adjust ();
4909
4910               do_tablejump (index, TYPE_MODE (index_type),
4911                             expand_expr (range, NULL_RTX, VOIDmode, 0),
4912                             table_label, default_label);
4913               win = 1;
4914             }
4915 #endif
4916           if (! win)
4917             abort ();
4918
4919           /* Get table of labels to jump to, in order of case index.  */
4920
4921           ncases = TREE_INT_CST_LOW (range) + 1;
4922           labelvec = (rtx *) alloca (ncases * sizeof (rtx));
4923           bzero ((char *) labelvec, ncases * sizeof (rtx));
4924
4925           for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
4926             {
4927               register HOST_WIDE_INT i
4928                 = TREE_INT_CST_LOW (n->low) - TREE_INT_CST_LOW (orig_minval);
4929
4930               while (1)
4931                 {
4932                   labelvec[i]
4933                     = gen_rtx (LABEL_REF, Pmode, label_rtx (n->code_label));
4934                   if (i + TREE_INT_CST_LOW (orig_minval)
4935                       == TREE_INT_CST_LOW (n->high))
4936                     break;
4937                   i++;
4938                 }
4939             }
4940
4941           /* Fill in the gaps with the default.  */
4942           for (i = 0; i < ncases; i++)
4943             if (labelvec[i] == 0)
4944               labelvec[i] = gen_rtx (LABEL_REF, Pmode, default_label);
4945
4946           /* Output the table */
4947           emit_label (table_label);
4948
4949           /* This would be a lot nicer if CASE_VECTOR_PC_RELATIVE
4950              were an expression, instead of an #ifdef/#ifndef.  */
4951           if (
4952 #ifdef CASE_VECTOR_PC_RELATIVE
4953               1 ||
4954 #endif
4955               flag_pic)
4956             emit_jump_insn (gen_rtx (ADDR_DIFF_VEC, CASE_VECTOR_MODE,
4957                                      gen_rtx (LABEL_REF, Pmode, table_label),
4958                                      gen_rtvec_v (ncases, labelvec)));
4959           else
4960             emit_jump_insn (gen_rtx (ADDR_VEC, CASE_VECTOR_MODE,
4961                                      gen_rtvec_v (ncases, labelvec)));
4962
4963           /* If the case insn drops through the table,
4964              after the table we must jump to the default-label.
4965              Otherwise record no drop-through after the table.  */
4966 #ifdef CASE_DROPS_THROUGH
4967           emit_jump (default_label);
4968 #else
4969           emit_barrier ();
4970 #endif
4971         }
4972
4973       before_case = squeeze_notes (NEXT_INSN (before_case), get_last_insn ());
4974       reorder_insns (before_case, get_last_insn (),
4975                      thiscase->data.case_stmt.start);
4976     }
4977
4978   if (thiscase->exit_label)
4979     emit_label (thiscase->exit_label);
4980
4981   POPSTACK (case_stack);
4982
4983   free_temp_slots ();
4984 }
4985
4986
4987 /* Terminate a case statement.  EXPR is the original index
4988    expression.  */
4989
4990 static void
4991 bc_expand_end_case (expr)
4992      tree expr;
4993 {
4994   struct nesting *thiscase = case_stack;
4995   enum bytecode_opcode opcode;
4996   struct bc_label *jump_label;
4997   struct case_node *c;
4998
4999   bc_emit_bytecode (jump);
5000   bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (thiscase->exit_label));
5001
5002 #ifdef DEBUG_PRINT_CODE
5003   fputc ('\n', stderr);
5004 #endif
5005
5006   /* Now that the size of the jump table is known, emit the actual
5007      indexed jump instruction.  */
5008   bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (thiscase->data.case_stmt.skip_label));
5009
5010   opcode = TYPE_MODE (thiscase->data.case_stmt.nominal_type) == SImode
5011     ? TREE_UNSIGNED (thiscase->data.case_stmt.nominal_type) ? caseSU : caseSI
5012       : TREE_UNSIGNED (thiscase->data.case_stmt.nominal_type) ? caseDU : caseDI;
5013
5014   bc_emit_bytecode (opcode);
5015
5016   /* Now emit the case instructions literal arguments, in order.
5017      In addition to the value on the stack, it uses:
5018      1.  The address of the jump table.
5019      2.  The size of the jump table.
5020      3.  The default label.  */
5021
5022   jump_label = bc_get_bytecode_label ();
5023   bc_emit_bytecode_labelref (jump_label);
5024   bc_emit_bytecode_const ((char *) &thiscase->data.case_stmt.num_ranges,
5025                           sizeof thiscase->data.case_stmt.num_ranges);
5026
5027   if (thiscase->data.case_stmt.default_label)
5028     bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (DECL_RTL (thiscase->data.case_stmt.default_label)));
5029   else
5030     bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (thiscase->exit_label));
5031
5032   /* Output the jump table.  */
5033
5034   bc_align_bytecode (3 /* PTR_ALIGN */);
5035   bc_emit_bytecode_labeldef (jump_label);
5036
5037   if (TYPE_MODE (thiscase->data.case_stmt.nominal_type) == SImode)
5038     for (c = thiscase->data.case_stmt.case_list->left; c; c = c->left)
5039       {
5040         opcode = TREE_INT_CST_LOW (c->low);
5041         bc_emit_bytecode_const ((char *) &opcode, sizeof opcode);
5042
5043         opcode = TREE_INT_CST_LOW (c->high);
5044         bc_emit_bytecode_const ((char *) &opcode, sizeof opcode);
5045
5046         bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (DECL_RTL (c->code_label)));
5047       }
5048   else
5049     if (TYPE_MODE (thiscase->data.case_stmt.nominal_type) == DImode)
5050       for (c = thiscase->data.case_stmt.case_list->left; c; c = c->left)
5051         {
5052           bc_emit_bytecode_DI_const (c->low);
5053           bc_emit_bytecode_DI_const (c->high);
5054
5055           bc_emit_bytecode_labelref (BYTECODE_BC_LABEL (DECL_RTL (c->code_label)));
5056         }
5057     else
5058       /* Bad mode */
5059       abort ();
5060
5061     
5062   bc_emit_bytecode_labeldef (BYTECODE_BC_LABEL (thiscase->exit_label));
5063
5064   /* Possibly issue enumeration warnings.  */
5065
5066   if (!thiscase->data.case_stmt.default_label
5067       && TREE_CODE (TREE_TYPE (expr)) == ENUMERAL_TYPE
5068       && TREE_CODE (expr) != INTEGER_CST
5069       && warn_switch)
5070     check_for_full_enumeration_handling (TREE_TYPE (expr));
5071
5072
5073 #ifdef DEBUG_PRINT_CODE
5074   fputc ('\n', stderr);
5075 #endif
5076
5077   POPSTACK (case_stack);
5078 }
5079
5080
5081 /* Return unique bytecode ID. */
5082
5083 int 
5084 bc_new_uid ()
5085 {
5086   static int bc_uid = 0;
5087
5088   return (++bc_uid);
5089 }
5090
5091 /* Generate code to jump to LABEL if OP1 and OP2 are equal.  */
5092
5093 static void
5094 do_jump_if_equal (op1, op2, label, unsignedp)
5095      rtx op1, op2, label;
5096      int unsignedp;
5097 {
5098   if (GET_CODE (op1) == CONST_INT
5099       && GET_CODE (op2) == CONST_INT)
5100     {
5101       if (INTVAL (op1) == INTVAL (op2))
5102         emit_jump (label);
5103     }
5104   else
5105     {
5106       enum machine_mode mode = GET_MODE (op1);
5107       if (mode == VOIDmode)
5108         mode = GET_MODE (op2);
5109       emit_cmp_insn (op1, op2, EQ, NULL_RTX, mode, unsignedp, 0);
5110       emit_jump_insn (gen_beq (label));
5111     }
5112 }
5113 \f
5114 /* Not all case values are encountered equally.  This function
5115    uses a heuristic to weight case labels, in cases where that
5116    looks like a reasonable thing to do.
5117
5118    Right now, all we try to guess is text, and we establish the
5119    following weights:
5120
5121         chars above space:      16
5122         digits:                 16
5123         default:                12
5124         space, punct:           8
5125         tab:                    4
5126         newline:                2
5127         other "\" chars:        1
5128         remaining chars:        0
5129
5130    If we find any cases in the switch that are not either -1 or in the range
5131    of valid ASCII characters, or are control characters other than those
5132    commonly used with "\", don't treat this switch scanning text.
5133
5134    Return 1 if these nodes are suitable for cost estimation, otherwise
5135    return 0.  */
5136
5137 static int
5138 estimate_case_costs (node)
5139      case_node_ptr node;
5140 {
5141   tree min_ascii = build_int_2 (-1, -1);
5142   tree max_ascii = convert (TREE_TYPE (node->high), build_int_2 (127, 0));
5143   case_node_ptr n;
5144   int i;
5145
5146   /* If we haven't already made the cost table, make it now.  Note that the
5147      lower bound of the table is -1, not zero.  */
5148
5149   if (cost_table == NULL)
5150     {
5151       cost_table = ((short *) xmalloc (129 * sizeof (short))) + 1;
5152       bzero ((char *) (cost_table - 1), 129 * sizeof (short));
5153
5154       for (i = 0; i < 128; i++)
5155         {
5156           if (isalnum (i))
5157             cost_table[i] = 16;
5158           else if (ispunct (i))
5159             cost_table[i] = 8;
5160           else if (iscntrl (i))
5161             cost_table[i] = -1;
5162         }
5163
5164       cost_table[' '] = 8;
5165       cost_table['\t'] = 4;
5166       cost_table['\0'] = 4;
5167       cost_table['\n'] = 2;
5168       cost_table['\f'] = 1;
5169       cost_table['\v'] = 1;
5170       cost_table['\b'] = 1;
5171     }
5172
5173   /* See if all the case expressions look like text.  It is text if the
5174      constant is >= -1 and the highest constant is <= 127.  Do all comparisons
5175      as signed arithmetic since we don't want to ever access cost_table with a
5176      value less than -1.  Also check that none of the constants in a range
5177      are strange control characters.  */
5178
5179   for (n = node; n; n = n->right)
5180     {
5181       if ((INT_CST_LT (n->low, min_ascii)) || INT_CST_LT (max_ascii, n->high))
5182         return 0;
5183
5184       for (i = TREE_INT_CST_LOW (n->low); i <= TREE_INT_CST_LOW (n->high); i++)
5185         if (cost_table[i] < 0)
5186           return 0;
5187     }
5188
5189   /* All interesting values are within the range of interesting
5190      ASCII characters.  */
5191   return 1;
5192 }
5193
5194 /* Scan an ordered list of case nodes
5195    combining those with consecutive values or ranges.
5196
5197    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
5198
5199 static void
5200 group_case_nodes (head)
5201      case_node_ptr head;
5202 {
5203   case_node_ptr node = head;
5204
5205   while (node)
5206     {
5207       rtx lb = next_real_insn (label_rtx (node->code_label));
5208       case_node_ptr np = node;
5209
5210       /* Try to group the successors of NODE with NODE.  */
5211       while (((np = np->right) != 0)
5212              /* Do they jump to the same place?  */
5213              && next_real_insn (label_rtx (np->code_label)) == lb
5214              /* Are their ranges consecutive?  */
5215              && tree_int_cst_equal (np->low,
5216                                     fold (build (PLUS_EXPR,
5217                                                  TREE_TYPE (node->high),
5218                                                  node->high,
5219                                                  integer_one_node)))
5220              /* An overflow is not consecutive.  */
5221              && tree_int_cst_lt (node->high,
5222                                  fold (build (PLUS_EXPR,
5223                                               TREE_TYPE (node->high),
5224                                               node->high,
5225                                               integer_one_node))))
5226         {
5227           node->high = np->high;
5228         }
5229       /* NP is the first node after NODE which can't be grouped with it.
5230          Delete the nodes in between, and move on to that node.  */
5231       node->right = np;
5232       node = np;
5233     }
5234 }
5235
5236 /* Take an ordered list of case nodes
5237    and transform them into a near optimal binary tree,
5238    on the assumption that any target code selection value is as
5239    likely as any other.
5240
5241    The transformation is performed by splitting the ordered
5242    list into two equal sections plus a pivot.  The parts are
5243    then attached to the pivot as left and right branches.  Each
5244    branch is is then transformed recursively.  */
5245
5246 static void
5247 balance_case_nodes (head, parent)
5248      case_node_ptr *head;
5249      case_node_ptr parent;
5250 {
5251   register case_node_ptr np;
5252
5253   np = *head;
5254   if (np)
5255     {
5256       int cost = 0;
5257       int i = 0;
5258       int ranges = 0;
5259       register case_node_ptr *npp;
5260       case_node_ptr left;
5261
5262       /* Count the number of entries on branch.  Also count the ranges.  */
5263
5264       while (np)
5265         {
5266           if (!tree_int_cst_equal (np->low, np->high))
5267             {
5268               ranges++;
5269               if (use_cost_table)
5270                 cost += cost_table[TREE_INT_CST_LOW (np->high)];
5271             }
5272
5273           if (use_cost_table)
5274             cost += cost_table[TREE_INT_CST_LOW (np->low)];
5275
5276           i++;
5277           np = np->right;
5278         }
5279
5280       if (i > 2)
5281         {
5282           /* Split this list if it is long enough for that to help.  */
5283           npp = head;
5284           left = *npp;
5285           if (use_cost_table)
5286             {
5287               /* Find the place in the list that bisects the list's total cost,
5288                  Here I gets half the total cost.  */
5289               int n_moved = 0;
5290               i = (cost + 1) / 2;
5291               while (1)
5292                 {
5293                   /* Skip nodes while their cost does not reach that amount.  */
5294                   if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
5295                     i -= cost_table[TREE_INT_CST_LOW ((*npp)->high)];
5296                   i -= cost_table[TREE_INT_CST_LOW ((*npp)->low)];
5297                   if (i <= 0)
5298                     break;
5299                   npp = &(*npp)->right;
5300                   n_moved += 1;
5301                 }
5302               if (n_moved == 0)
5303                 {
5304                   /* Leave this branch lopsided, but optimize left-hand
5305                      side and fill in `parent' fields for right-hand side.  */
5306                   np = *head;
5307                   np->parent = parent;
5308                   balance_case_nodes (&np->left, np);
5309                   for (; np->right; np = np->right)
5310                     np->right->parent = np;
5311                   return;
5312                 }
5313             }
5314           /* If there are just three nodes, split at the middle one.  */
5315           else if (i == 3)
5316             npp = &(*npp)->right;
5317           else
5318             {
5319               /* Find the place in the list that bisects the list's total cost,
5320                  where ranges count as 2.
5321                  Here I gets half the total cost.  */
5322               i = (i + ranges + 1) / 2;
5323               while (1)
5324                 {
5325                   /* Skip nodes while their cost does not reach that amount.  */
5326                   if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
5327                     i--;
5328                   i--;
5329                   if (i <= 0)
5330                     break;
5331                   npp = &(*npp)->right;
5332                 }
5333             }
5334           *head = np = *npp;
5335           *npp = 0;
5336           np->parent = parent;
5337           np->left = left;
5338
5339           /* Optimize each of the two split parts.  */
5340           balance_case_nodes (&np->left, np);
5341           balance_case_nodes (&np->right, np);
5342         }
5343       else
5344         {
5345           /* Else leave this branch as one level,
5346              but fill in `parent' fields.  */
5347           np = *head;
5348           np->parent = parent;
5349           for (; np->right; np = np->right)
5350             np->right->parent = np;
5351         }
5352     }
5353 }
5354 \f
5355 /* Search the parent sections of the case node tree
5356    to see if a test for the lower bound of NODE would be redundant.
5357    INDEX_TYPE is the type of the index expression.
5358
5359    The instructions to generate the case decision tree are
5360    output in the same order as nodes are processed so it is
5361    known that if a parent node checks the range of the current
5362    node minus one that the current node is bounded at its lower
5363    span.  Thus the test would be redundant.  */
5364
5365 static int
5366 node_has_low_bound (node, index_type)
5367      case_node_ptr node;
5368      tree index_type;
5369 {
5370   tree low_minus_one;
5371   case_node_ptr pnode;
5372
5373   /* If the lower bound of this node is the lowest value in the index type,
5374      we need not test it.  */
5375
5376   if (tree_int_cst_equal (node->low, TYPE_MIN_VALUE (index_type)))
5377     return 1;
5378
5379   /* If this node has a left branch, the value at the left must be less
5380      than that at this node, so it cannot be bounded at the bottom and
5381      we need not bother testing any further.  */
5382
5383   if (node->left)
5384     return 0;
5385
5386   low_minus_one = fold (build (MINUS_EXPR, TREE_TYPE (node->low),
5387                                node->low, integer_one_node));
5388
5389   /* If the subtraction above overflowed, we can't verify anything.
5390      Otherwise, look for a parent that tests our value - 1.  */
5391
5392   if (! tree_int_cst_lt (low_minus_one, node->low))
5393     return 0;
5394
5395   for (pnode = node->parent; pnode; pnode = pnode->parent)
5396     if (tree_int_cst_equal (low_minus_one, pnode->high))
5397       return 1;
5398
5399   return 0;
5400 }
5401
5402 /* Search the parent sections of the case node tree
5403    to see if a test for the upper bound of NODE would be redundant.
5404    INDEX_TYPE is the type of the index expression.
5405
5406    The instructions to generate the case decision tree are
5407    output in the same order as nodes are processed so it is
5408    known that if a parent node checks the range of the current
5409    node plus one that the current node is bounded at its upper
5410    span.  Thus the test would be redundant.  */
5411
5412 static int
5413 node_has_high_bound (node, index_type)
5414      case_node_ptr node;
5415      tree index_type;
5416 {
5417   tree high_plus_one;
5418   case_node_ptr pnode;
5419
5420   /* If the upper bound of this node is the highest value in the type
5421      of the index expression, we need not test against it.  */
5422
5423   if (tree_int_cst_equal (node->high, TYPE_MAX_VALUE (index_type)))
5424     return 1;
5425
5426   /* If this node has a right branch, the value at the right must be greater
5427      than that at this node, so it cannot be bounded at the top and
5428      we need not bother testing any further.  */
5429
5430   if (node->right)
5431     return 0;
5432
5433   high_plus_one = fold (build (PLUS_EXPR, TREE_TYPE (node->high),
5434                                node->high, integer_one_node));
5435
5436   /* If the addition above overflowed, we can't verify anything.
5437      Otherwise, look for a parent that tests our value + 1.  */
5438
5439   if (! tree_int_cst_lt (node->high, high_plus_one))
5440     return 0;
5441
5442   for (pnode = node->parent; pnode; pnode = pnode->parent)
5443     if (tree_int_cst_equal (high_plus_one, pnode->low))
5444       return 1;
5445
5446   return 0;
5447 }
5448
5449 /* Search the parent sections of the
5450    case node tree to see if both tests for the upper and lower
5451    bounds of NODE would be redundant.  */
5452
5453 static int
5454 node_is_bounded (node, index_type)
5455      case_node_ptr node;
5456      tree index_type;
5457 {
5458   return (node_has_low_bound (node, index_type)
5459           && node_has_high_bound (node, index_type));
5460 }
5461
5462 /*  Emit an unconditional jump to LABEL unless it would be dead code.  */
5463
5464 static void
5465 emit_jump_if_reachable (label)
5466      rtx label;
5467 {
5468   if (GET_CODE (get_last_insn ()) != BARRIER)
5469     emit_jump (label);
5470 }
5471 \f
5472 /* Emit step-by-step code to select a case for the value of INDEX.
5473    The thus generated decision tree follows the form of the
5474    case-node binary tree NODE, whose nodes represent test conditions.
5475    INDEX_TYPE is the type of the index of the switch.
5476
5477    Care is taken to prune redundant tests from the decision tree
5478    by detecting any boundary conditions already checked by
5479    emitted rtx.  (See node_has_high_bound, node_has_low_bound
5480    and node_is_bounded, above.)
5481
5482    Where the test conditions can be shown to be redundant we emit
5483    an unconditional jump to the target code.  As a further
5484    optimization, the subordinates of a tree node are examined to
5485    check for bounded nodes.  In this case conditional and/or
5486    unconditional jumps as a result of the boundary check for the
5487    current node are arranged to target the subordinates associated
5488    code for out of bound conditions on the current node node.
5489
5490    We can assume that when control reaches the code generated here,
5491    the index value has already been compared with the parents
5492    of this node, and determined to be on the same side of each parent
5493    as this node is.  Thus, if this node tests for the value 51,
5494    and a parent tested for 52, we don't need to consider
5495    the possibility of a value greater than 51.  If another parent
5496    tests for the value 50, then this node need not test anything.  */
5497
5498 static void
5499 emit_case_nodes (index, node, default_label, index_type)
5500      rtx index;
5501      case_node_ptr node;
5502      rtx default_label;
5503      tree index_type;
5504 {
5505   /* If INDEX has an unsigned type, we must make unsigned branches.  */
5506   int unsignedp = TREE_UNSIGNED (index_type);
5507   typedef rtx rtx_function ();
5508   rtx_function *gen_bgt_pat = unsignedp ? gen_bgtu : gen_bgt;
5509   rtx_function *gen_bge_pat = unsignedp ? gen_bgeu : gen_bge;
5510   rtx_function *gen_blt_pat = unsignedp ? gen_bltu : gen_blt;
5511   rtx_function *gen_ble_pat = unsignedp ? gen_bleu : gen_ble;
5512   enum machine_mode mode = GET_MODE (index);
5513
5514   /* See if our parents have already tested everything for us.
5515      If they have, emit an unconditional jump for this node.  */
5516   if (node_is_bounded (node, index_type))
5517     emit_jump (label_rtx (node->code_label));
5518
5519   else if (tree_int_cst_equal (node->low, node->high))
5520     {
5521       /* Node is single valued.  First see if the index expression matches
5522          this node and then check our children, if any. */
5523
5524       do_jump_if_equal (index, expand_expr (node->low, NULL_RTX, VOIDmode, 0),
5525                         label_rtx (node->code_label), unsignedp);
5526
5527       if (node->right != 0 && node->left != 0)
5528         {
5529           /* This node has children on both sides.
5530              Dispatch to one side or the other
5531              by comparing the index value with this node's value.
5532              If one subtree is bounded, check that one first,
5533              so we can avoid real branches in the tree.  */
5534
5535           if (node_is_bounded (node->right, index_type))
5536             {
5537               emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5538                                                  VOIDmode, 0),
5539                              GT, NULL_RTX, mode, unsignedp, 0);
5540
5541               emit_jump_insn ((*gen_bgt_pat) (label_rtx (node->right->code_label)));
5542               emit_case_nodes (index, node->left, default_label, index_type);
5543             }
5544
5545           else if (node_is_bounded (node->left, index_type))
5546             {
5547               emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5548                                                  VOIDmode, 0),
5549                              LT, NULL_RTX, mode, unsignedp, 0);
5550               emit_jump_insn ((*gen_blt_pat) (label_rtx (node->left->code_label)));
5551               emit_case_nodes (index, node->right, default_label, index_type);
5552             }
5553
5554           else
5555             {
5556               /* Neither node is bounded.  First distinguish the two sides;
5557                  then emit the code for one side at a time.  */
5558
5559               tree test_label
5560                 = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
5561
5562               /* See if the value is on the right.  */
5563               emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5564                                                  VOIDmode, 0),
5565                              GT, NULL_RTX, mode, unsignedp, 0);
5566               emit_jump_insn ((*gen_bgt_pat) (label_rtx (test_label)));
5567
5568               /* Value must be on the left.
5569                  Handle the left-hand subtree.  */
5570               emit_case_nodes (index, node->left, default_label, index_type);
5571               /* If left-hand subtree does nothing,
5572                  go to default.  */
5573               emit_jump_if_reachable (default_label);
5574
5575               /* Code branches here for the right-hand subtree.  */
5576               expand_label (test_label);
5577               emit_case_nodes (index, node->right, default_label, index_type);
5578             }
5579         }
5580
5581       else if (node->right != 0 && node->left == 0)
5582         {
5583           /* Here we have a right child but no left so we issue conditional
5584              branch to default and process the right child.
5585
5586              Omit the conditional branch to default if we it avoid only one
5587              right child; it costs too much space to save so little time.  */
5588
5589           if (node->right->right || node->right->left
5590               || !tree_int_cst_equal (node->right->low, node->right->high))
5591             {
5592               if (!node_has_low_bound (node, index_type))
5593                 {
5594                   emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5595                                                      VOIDmode, 0),
5596                                  LT, NULL_RTX, mode, unsignedp, 0);
5597                   emit_jump_insn ((*gen_blt_pat) (default_label));
5598                 }
5599
5600               emit_case_nodes (index, node->right, default_label, index_type);
5601             }
5602           else
5603             /* We cannot process node->right normally
5604                since we haven't ruled out the numbers less than
5605                this node's value.  So handle node->right explicitly.  */
5606             do_jump_if_equal (index,
5607                               expand_expr (node->right->low, NULL_RTX,
5608                                            VOIDmode, 0),
5609                               label_rtx (node->right->code_label), unsignedp);
5610         }
5611
5612       else if (node->right == 0 && node->left != 0)
5613         {
5614           /* Just one subtree, on the left.  */
5615
5616 #if 0 /* The following code and comment were formerly part
5617          of the condition here, but they didn't work
5618          and I don't understand what the idea was.  -- rms.  */
5619           /* If our "most probable entry" is less probable
5620              than the default label, emit a jump to
5621              the default label using condition codes
5622              already lying around.  With no right branch,
5623              a branch-greater-than will get us to the default
5624              label correctly.  */
5625           if (use_cost_table
5626                && cost_table[TREE_INT_CST_LOW (node->high)] < 12)
5627             ;
5628 #endif /* 0 */
5629           if (node->left->left || node->left->right
5630               || !tree_int_cst_equal (node->left->low, node->left->high))
5631             {
5632               if (!node_has_high_bound (node, index_type))
5633                 {
5634                   emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5635                                                      VOIDmode, 0),
5636                                  GT, NULL_RTX, mode, unsignedp, 0);
5637                   emit_jump_insn ((*gen_bgt_pat) (default_label));
5638                 }
5639
5640               emit_case_nodes (index, node->left, default_label, index_type);
5641             }
5642           else
5643             /* We cannot process node->left normally
5644                since we haven't ruled out the numbers less than
5645                this node's value.  So handle node->left explicitly.  */
5646             do_jump_if_equal (index,
5647                               expand_expr (node->left->low, NULL_RTX,
5648                                            VOIDmode, 0),
5649                               label_rtx (node->left->code_label), unsignedp);
5650         }
5651     }
5652   else
5653     {
5654       /* Node is a range.  These cases are very similar to those for a single
5655          value, except that we do not start by testing whether this node
5656          is the one to branch to.  */
5657
5658       if (node->right != 0 && node->left != 0)
5659         {
5660           /* Node has subtrees on both sides.
5661              If the right-hand subtree is bounded,
5662              test for it first, since we can go straight there.
5663              Otherwise, we need to make a branch in the control structure,
5664              then handle the two subtrees.  */
5665           tree test_label = 0;
5666
5667           emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5668                                              VOIDmode, 0),
5669                          GT, NULL_RTX, mode, unsignedp, 0);
5670
5671           if (node_is_bounded (node->right, index_type))
5672             /* Right hand node is fully bounded so we can eliminate any
5673                testing and branch directly to the target code.  */
5674             emit_jump_insn ((*gen_bgt_pat) (label_rtx (node->right->code_label)));
5675           else
5676             {
5677               /* Right hand node requires testing.
5678                  Branch to a label where we will handle it later.  */
5679
5680               test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
5681               emit_jump_insn ((*gen_bgt_pat) (label_rtx (test_label)));
5682             }
5683
5684           /* Value belongs to this node or to the left-hand subtree.  */
5685
5686           emit_cmp_insn (index, expand_expr (node->low, NULL_RTX, VOIDmode, 0),
5687                          GE, NULL_RTX, mode, unsignedp, 0);
5688           emit_jump_insn ((*gen_bge_pat) (label_rtx (node->code_label)));
5689
5690           /* Handle the left-hand subtree.  */
5691           emit_case_nodes (index, node->left, default_label, index_type);
5692
5693           /* If right node had to be handled later, do that now.  */
5694
5695           if (test_label)
5696             {
5697               /* If the left-hand subtree fell through,
5698                  don't let it fall into the right-hand subtree.  */
5699               emit_jump_if_reachable (default_label);
5700
5701               expand_label (test_label);
5702               emit_case_nodes (index, node->right, default_label, index_type);
5703             }
5704         }
5705
5706       else if (node->right != 0 && node->left == 0)
5707         {
5708           /* Deal with values to the left of this node,
5709              if they are possible.  */
5710           if (!node_has_low_bound (node, index_type))
5711             {
5712               emit_cmp_insn (index, expand_expr (node->low, NULL_RTX,
5713                                                  VOIDmode, 0),
5714                              LT, NULL_RTX, mode, unsignedp, 0);
5715               emit_jump_insn ((*gen_blt_pat) (default_label));
5716             }
5717
5718           /* Value belongs to this node or to the right-hand subtree.  */
5719
5720           emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5721                                              VOIDmode, 0),
5722                          LE, NULL_RTX, mode, unsignedp, 0);
5723           emit_jump_insn ((*gen_ble_pat) (label_rtx (node->code_label)));
5724
5725           emit_case_nodes (index, node->right, default_label, index_type);
5726         }
5727
5728       else if (node->right == 0 && node->left != 0)
5729         {
5730           /* Deal with values to the right of this node,
5731              if they are possible.  */
5732           if (!node_has_high_bound (node, index_type))
5733             {
5734               emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5735                                                  VOIDmode, 0),
5736                              GT, NULL_RTX, mode, unsignedp, 0);
5737               emit_jump_insn ((*gen_bgt_pat) (default_label));
5738             }
5739
5740           /* Value belongs to this node or to the left-hand subtree.  */
5741
5742           emit_cmp_insn (index, expand_expr (node->low, NULL_RTX, VOIDmode, 0),
5743                          GE, NULL_RTX, mode, unsignedp, 0);
5744           emit_jump_insn ((*gen_bge_pat) (label_rtx (node->code_label)));
5745
5746           emit_case_nodes (index, node->left, default_label, index_type);
5747         }
5748
5749       else
5750         {
5751           /* Node has no children so we check low and high bounds to remove
5752              redundant tests.  Only one of the bounds can exist,
5753              since otherwise this node is bounded--a case tested already.  */
5754
5755           if (!node_has_high_bound (node, index_type))
5756             {
5757               emit_cmp_insn (index, expand_expr (node->high, NULL_RTX,
5758                                                  VOIDmode, 0),
5759                              GT, NULL_RTX, mode, unsignedp, 0);
5760               emit_jump_insn ((*gen_bgt_pat) (default_label));
5761             }
5762
5763           if (!node_has_low_bound (node, index_type))
5764             {
5765               emit_cmp_insn (index, expand_expr (node->low, NULL_RTX,
5766                                                  VOIDmode, 0),
5767                              LT, NULL_RTX, mode, unsignedp, 0);
5768               emit_jump_insn ((*gen_blt_pat) (default_label));
5769             }
5770
5771           emit_jump (label_rtx (node->code_label));
5772         }
5773     }
5774 }
5775 \f
5776 /* These routines are used by the loop unrolling code.  They copy BLOCK trees
5777    so that the debugging info will be correct for the unrolled loop.  */
5778
5779 /* Indexed by block number, contains a pointer to the N'th block node.  */
5780
5781 static tree *block_vector;
5782
5783 void
5784 find_loop_tree_blocks ()
5785 {
5786   tree block = DECL_INITIAL (current_function_decl);
5787
5788   /* There first block is for the function body, and does not have
5789      corresponding block notes.  Don't include it in the block vector.  */
5790   block = BLOCK_SUBBLOCKS (block);
5791
5792   block_vector = identify_blocks (block, get_insns ());
5793 }
5794
5795 void
5796 unroll_block_trees ()
5797 {
5798   tree block = DECL_INITIAL (current_function_decl);
5799
5800   reorder_blocks (block_vector, block, get_insns ());
5801 }
5802