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