OSDN Git Service

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