OSDN Git Service

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