OSDN Git Service

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