OSDN Git Service

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