OSDN Git Service

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