OSDN Git Service

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