OSDN Git Service

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