OSDN Git Service

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