OSDN Git Service

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