OSDN Git Service

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