OSDN Git Service

8970734f375fd37f8ba36b059c400ae795d7da16
[pf3gnuchains/gcc-fork.git] / gcc / stmt.c
1 /* Expands front end tree to back end RTL for GCC
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 /* This file handles the generation of rtl code from tree structure
23    above the level of expressions, using subroutines in exp*.c and emit-rtl.c.
24    It also creates the rtl expressions for parameters and auto variables
25    and has full responsibility for allocating stack slots.
26
27    The functions whose names start with `expand_' are called by the
28    parser to generate RTL instructions for various kinds of constructs.
29
30    Some control and binding constructs require calling several such
31    functions at different times.  For example, a simple if-then
32    is expanded by calling `expand_start_cond' (with the condition-expression
33    as argument) before parsing the then-clause and calling `expand_end_cond'
34    after parsing the then-clause.  */
35
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40
41 #include "rtl.h"
42 #include "tree.h"
43 #include "tm_p.h"
44 #include "flags.h"
45 #include "except.h"
46 #include "function.h"
47 #include "insn-config.h"
48 #include "expr.h"
49 #include "libfuncs.h"
50 #include "hard-reg-set.h"
51 #include "loop.h"
52 #include "recog.h"
53 #include "machmode.h"
54 #include "toplev.h"
55 #include "output.h"
56 #include "ggc.h"
57 #include "langhooks.h"
58 #include "predict.h"
59 #include "optabs.h"
60 #include "target.h"
61 #include "regs.h"
62 \f
63 /* Functions and data structures for expanding case statements.  */
64
65 /* Case label structure, used to hold info on labels within case
66    statements.  We handle "range" labels; for a single-value label
67    as in C, the high and low limits are the same.
68
69    An AVL tree of case nodes is initially created, and later transformed
70    to a list linked via the RIGHT fields in the nodes.  Nodes with
71    higher case values are later in the list.
72
73    Switch statements can be output in one of two forms.  A branch table
74    is used if there are more than a few labels and the labels are dense
75    within the range between the smallest and largest case value.  If a
76    branch table is used, no further manipulations are done with the case
77    node chain.
78
79    The alternative to the use of a branch table is to generate a series
80    of compare and jump insns.  When that is done, we use the LEFT, RIGHT,
81    and PARENT fields to hold a binary tree.  Initially the tree is
82    totally unbalanced, with everything on the right.  We balance the tree
83    with nodes on the left having lower case values than the parent
84    and nodes on the right having higher values.  We then output the tree
85    in order.  */
86
87 struct case_node GTY(())
88 {
89   struct case_node      *left;  /* Left son in binary tree */
90   struct case_node      *right; /* Right son in binary tree; also node chain */
91   struct case_node      *parent; /* Parent of node in binary tree */
92   tree                  low;    /* Lowest index value for this label */
93   tree                  high;   /* Highest index value for this label */
94   tree                  code_label; /* Label to jump to when node matches */
95   int                   balance;
96 };
97
98 typedef struct case_node case_node;
99 typedef struct case_node *case_node_ptr;
100
101 /* These are used by estimate_case_costs and balance_case_nodes.  */
102
103 /* This must be a signed type, and non-ANSI compilers lack signed char.  */
104 static short cost_table_[129];
105 static int use_cost_table;
106 static int cost_table_initialized;
107
108 /* Special care is needed because we allow -1, but TREE_INT_CST_LOW
109    is unsigned.  */
110 #define COST_TABLE(I)  cost_table_[(unsigned HOST_WIDE_INT) ((I) + 1)]
111 \f
112 /* Stack of control and binding constructs we are currently inside.
113
114    These constructs begin when you call `expand_start_WHATEVER'
115    and end when you call `expand_end_WHATEVER'.  This stack records
116    info about how the construct began that tells the end-function
117    what to do.  It also may provide information about the construct
118    to alter the behavior of other constructs within the body.
119    For example, they may affect the behavior of C `break' and `continue'.
120
121    Each construct gets one `struct nesting' object.
122    All of these objects are chained through the `all' field.
123    `nesting_stack' points to the first object (innermost construct).
124    The position of an entry on `nesting_stack' is in its `depth' field.
125
126    Each type of construct has its own individual stack.
127    For example, loops have `cond_stack'.  Each object points to the
128    next object of the same type through the `next' field.
129
130    Some constructs are visible to `break' exit-statements and others
131    are not.  Which constructs are visible depends on the language.
132    Therefore, the data structure allows each construct to be visible
133    or not, according to the args given when the construct is started.
134    The construct is visible if the `exit_label' field is non-null.
135    In that case, the value should be a CODE_LABEL rtx.  */
136
137 struct nesting GTY(())
138 {
139   struct nesting *all;
140   struct nesting *next;
141   int depth;
142   rtx exit_label;
143   enum nesting_desc {
144     COND_NESTING,
145     BLOCK_NESTING,
146     CASE_NESTING
147   } desc;
148   union nesting_u
149     {
150       /* For conds (if-then and if-then-else statements).  */
151       struct nesting_cond
152         {
153           /* Label for the end of the if construct.
154              There is none if EXITFLAG was not set
155              and no `else' has been seen yet.  */
156           rtx endif_label;
157           /* Label for the end of this alternative.
158              This may be the end of the if or the next else/elseif.  */
159           rtx next_label;
160         } GTY ((tag ("COND_NESTING"))) cond;
161       /* For variable binding contours.  */
162       struct nesting_block
163         {
164           /* Sequence number of this binding contour within the function,
165              in order of entry.  */
166           int block_start_count;
167           /* The NOTE that starts this contour.
168              Used by expand_goto to check whether the destination
169              is within each contour or not.  */
170           rtx first_insn;
171           /* The saved target_temp_slot_level from our outer block.
172              We may reset target_temp_slot_level to be the level of
173              this block, if that is done, target_temp_slot_level
174              reverts to the saved target_temp_slot_level at the very
175              end of the block.  */
176           int block_target_temp_slot_level;
177           /* True if we are currently emitting insns in an area of
178              output code that is controlled by a conditional
179              expression.  This is used by the cleanup handling code to
180              generate conditional cleanup actions.  */
181           int conditional_code;
182           /* A place to move the start of the exception region for any
183              of the conditional cleanups, must be at the end or after
184              the start of the last unconditional cleanup, and before any
185              conditional branch points.  */
186           rtx last_unconditional_cleanup;
187         } GTY ((tag ("BLOCK_NESTING"))) block;
188       /* For switch (C) or case (Pascal) statements.  */
189       struct nesting_case
190         {
191           /* The insn after which the case dispatch should finally
192              be emitted.  Zero for a dummy.  */
193           rtx start;
194           /* A list of case labels; it is first built as an AVL tree.
195              During expand_end_case, this is converted to a list, and may be
196              rearranged into a nearly balanced binary tree.  */
197           struct case_node *case_list;
198           /* Label to jump to if no case matches.  */
199           tree default_label;
200           /* The expression to be dispatched on.  */
201           tree index_expr;
202           /* Type that INDEX_EXPR should be converted to.  */
203           tree nominal_type;
204           /* Name of this kind of statement, for warnings.  */
205           const char *printname;
206           /* Used to save no_line_numbers till we see the first case label.
207              We set this to -1 when we see the first case label in this
208              case statement.  */
209           int line_number_status;
210         } GTY ((tag ("CASE_NESTING"))) case_stmt;
211     } GTY ((desc ("%1.desc"))) data;
212 };
213
214 /* Allocate and return a new `struct nesting'.  */
215
216 #define ALLOC_NESTING() ggc_alloc (sizeof (struct nesting))
217
218 /* Pop the nesting stack element by element until we pop off
219    the element which is at the top of STACK.
220    Update all the other stacks, popping off elements from them
221    as we pop them from nesting_stack.  */
222
223 #define POPSTACK(STACK)                                 \
224 do { struct nesting *target = STACK;                    \
225      struct nesting *this;                              \
226      do { this = nesting_stack;                         \
227           if (cond_stack == this)                       \
228             cond_stack = cond_stack->next;              \
229           if (block_stack == this)                      \
230             block_stack = block_stack->next;            \
231           if (case_stack == this)                       \
232             case_stack = case_stack->next;              \
233           nesting_depth = nesting_stack->depth - 1;     \
234           nesting_stack = this->all; }                  \
235      while (this != target); } while (0)
236 \f
237 /* In some cases it is impossible to generate code for a forward goto
238    until the label definition is seen.  This happens when it may be necessary
239    for the goto to reset the stack pointer: we don't yet know how to do that.
240    So expand_goto puts an entry on this fixup list.
241    Each time a binding contour that resets the stack is exited,
242    we check each fixup.
243    If the target label has now been defined, we can insert the proper code.  */
244
245 struct goto_fixup GTY(())
246 {
247   /* Points to following fixup.  */
248   struct goto_fixup *next;
249   /* Points to the insn before the jump insn.
250      If more code must be inserted, it goes after this insn.  */
251   rtx before_jump;
252   /* The LABEL_DECL that this jump is jumping to, or 0
253      for break, continue or return.  */
254   tree target;
255   /* The BLOCK for the place where this goto was found.  */
256   tree context;
257   /* The CODE_LABEL rtx that this is jumping to.  */
258   rtx target_rtl;
259   /* Number of binding contours started in current function
260      before the label reference.  */
261   int block_start_count;
262 };
263
264 struct stmt_status GTY(())
265 {
266   /* Chain of all pending binding contours.  */
267   struct nesting * x_block_stack;
268
269   /* If any new stacks are added here, add them to POPSTACKS too.  */
270
271   /* Chain of all pending conditional statements.  */
272   struct nesting * x_cond_stack;
273
274   /* Chain of all pending case or switch statements.  */
275   struct nesting * x_case_stack;
276
277   /* Separate chain including all of the above,
278      chained through the `all' field.  */
279   struct nesting * x_nesting_stack;
280
281   /* Number of entries on nesting_stack now.  */
282   int x_nesting_depth;
283
284   /* Number of binding contours started so far in this function.  */
285   int x_block_start_count;
286
287   /* Location of last line-number note, whether we actually
288      emitted it or not.  */
289   location_t x_emit_locus;
290
291   struct goto_fixup *x_goto_fixup_chain;
292 };
293
294 #define block_stack (cfun->stmt->x_block_stack)
295 #define cond_stack (cfun->stmt->x_cond_stack)
296 #define case_stack (cfun->stmt->x_case_stack)
297 #define nesting_stack (cfun->stmt->x_nesting_stack)
298 #define nesting_depth (cfun->stmt->x_nesting_depth)
299 #define current_block_start_count (cfun->stmt->x_block_start_count)
300 #define emit_locus (cfun->stmt->x_emit_locus)
301 #define goto_fixup_chain (cfun->stmt->x_goto_fixup_chain)
302
303 /* Nonzero if we are using EH to handle cleanups.  */
304 int using_eh_for_cleanups_p = 0;
305
306 static int n_occurrences (int, const char *);
307 static bool decl_conflicts_with_clobbers_p (tree, const HARD_REG_SET);
308 static void expand_nl_goto_receiver (void);
309 static bool check_operand_nalternatives (tree, tree);
310 static bool check_unique_operand_names (tree, tree);
311 static char *resolve_operand_name_1 (char *, tree, tree);
312 static void expand_null_return_1 (void);
313 static enum br_predictor return_prediction (rtx);
314 static rtx shift_return_value (rtx);
315 static void expand_value_return (rtx);
316 static void do_jump_if_equal (rtx, rtx, rtx, int);
317 static int estimate_case_costs (case_node_ptr);
318 static bool same_case_target_p (rtx, rtx);
319 static void strip_default_case_nodes (case_node_ptr *, rtx);
320 static bool lshift_cheap_p (void);
321 static int case_bit_test_cmp (const void *, const void *);
322 static void emit_case_bit_tests (tree, tree, tree, tree, case_node_ptr, rtx);
323 static void group_case_nodes (case_node_ptr);
324 static void balance_case_nodes (case_node_ptr *, case_node_ptr);
325 static int node_has_low_bound (case_node_ptr, tree);
326 static int node_has_high_bound (case_node_ptr, tree);
327 static int node_is_bounded (case_node_ptr, tree);
328 static void emit_jump_if_reachable (rtx);
329 static void emit_case_nodes (rtx, case_node_ptr, rtx, tree);
330 static struct case_node *case_tree2list (case_node *, case_node *);
331 \f
332 void
333 using_eh_for_cleanups (void)
334 {
335   using_eh_for_cleanups_p = 1;
336 }
337
338 void
339 init_stmt_for_function (void)
340 {
341   cfun->stmt = ggc_alloc_cleared (sizeof (struct stmt_status));
342 }
343 \f
344 /* Record the current file and line.  Called from emit_line_note.  */
345
346 void
347 set_file_and_line_for_stmt (location_t location)
348 {
349   /* If we're outputting an inline function, and we add a line note,
350      there may be no CFUN->STMT information.  So, there's no need to
351      update it.  */
352   if (cfun->stmt)
353     emit_locus = location;
354 }
355
356 /* Emit a no-op instruction.  */
357
358 void
359 emit_nop (void)
360 {
361   rtx last_insn;
362
363   last_insn = get_last_insn ();
364   if (!optimize
365       && (GET_CODE (last_insn) == CODE_LABEL
366           || (GET_CODE (last_insn) == NOTE
367               && prev_real_insn (last_insn) == 0)))
368     emit_insn (gen_nop ());
369 }
370 \f
371 /* Return the rtx-label that corresponds to a LABEL_DECL,
372    creating it if necessary.  */
373
374 rtx
375 label_rtx (tree label)
376 {
377   if (TREE_CODE (label) != LABEL_DECL)
378     abort ();
379
380   if (!DECL_RTL_SET_P (label))
381     {
382       rtx r = gen_label_rtx ();
383       SET_DECL_RTL (label, r);
384       if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
385         LABEL_PRESERVE_P (r) = 1;
386     }
387
388   return DECL_RTL (label);
389 }
390
391 /* As above, but also put it on the forced-reference list of the
392    function that contains it.  */
393 rtx
394 force_label_rtx (tree label)
395 {
396   rtx ref = label_rtx (label);
397   tree function = decl_function_context (label);
398   struct function *p;
399
400   if (!function)
401     abort ();
402
403   if (function != current_function_decl)
404     p = find_function_data (function);
405   else
406     p = cfun;
407
408   p->expr->x_forced_labels = gen_rtx_EXPR_LIST (VOIDmode, ref,
409                                                 p->expr->x_forced_labels);
410   return ref;
411 }
412
413 /* Add an unconditional jump to LABEL as the next sequential instruction.  */
414
415 void
416 emit_jump (rtx label)
417 {
418   do_pending_stack_adjust ();
419   emit_jump_insn (gen_jump (label));
420   emit_barrier ();
421 }
422
423 /* Emit code to jump to the address
424    specified by the pointer expression EXP.  */
425
426 void
427 expand_computed_goto (tree exp)
428 {
429   rtx x = expand_expr (exp, NULL_RTX, VOIDmode, 0);
430
431   x = convert_memory_address (Pmode, x);
432
433   emit_queue ();
434   do_pending_stack_adjust ();
435   emit_indirect_jump (x);
436 }
437 \f
438 /* Handle goto statements and the labels that they can go to.  */
439
440 /* Specify the location in the RTL code of a label LABEL,
441    which is a LABEL_DECL tree node.
442
443    This is used for the kind of label that the user can jump to with a
444    goto statement, and for alternatives of a switch or case statement.
445    RTL labels generated for loops and conditionals don't go through here;
446    they are generated directly at the RTL level, by other functions below.
447
448    Note that this has nothing to do with defining label *names*.
449    Languages vary in how they do that and what that even means.  */
450
451 void
452 expand_label (tree label)
453 {
454   rtx label_r = label_rtx (label);
455
456   do_pending_stack_adjust ();
457   emit_label (label_r);
458   if (DECL_NAME (label))
459     LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
460
461   if (DECL_NONLOCAL (label))
462     {
463       expand_nl_goto_receiver ();
464       nonlocal_goto_handler_labels
465         = gen_rtx_EXPR_LIST (VOIDmode, label_r,
466                              nonlocal_goto_handler_labels);
467     }
468
469   if (FORCED_LABEL (label))
470     forced_labels = gen_rtx_EXPR_LIST (VOIDmode, label_r, forced_labels);
471       
472   if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
473     maybe_set_first_label_num (label_r);
474 }
475
476 /* Generate RTL code for a `goto' statement with target label LABEL.
477    LABEL should be a LABEL_DECL tree node that was or will later be
478    defined with `expand_label'.  */
479
480 void
481 expand_goto (tree label)
482 {
483 #ifdef ENABLE_CHECKING
484   /* Check for a nonlocal goto to a containing function.  Should have
485      gotten translated to __builtin_nonlocal_goto.  */
486   tree context = decl_function_context (label);
487   if (context != 0 && context != current_function_decl)
488     abort ();
489 #endif
490
491   emit_jump (label_rtx (label));
492 }
493 \f
494 /* Return the number of times character C occurs in string S.  */
495 static int
496 n_occurrences (int c, const char *s)
497 {
498   int n = 0;
499   while (*s)
500     n += (*s++ == c);
501   return n;
502 }
503 \f
504 /* Generate RTL for an asm statement (explicit assembler code).
505    STRING is a STRING_CST node containing the assembler code text,
506    or an ADDR_EXPR containing a STRING_CST.  VOL nonzero means the
507    insn is volatile; don't optimize it.  */
508
509 void
510 expand_asm (tree string, int vol)
511 {
512   rtx body;
513
514   if (TREE_CODE (string) == ADDR_EXPR)
515     string = TREE_OPERAND (string, 0);
516
517   body = gen_rtx_ASM_INPUT (VOIDmode, TREE_STRING_POINTER (string));
518
519   MEM_VOLATILE_P (body) = vol;
520
521   emit_insn (body);
522 }
523
524 /* Parse the output constraint pointed to by *CONSTRAINT_P.  It is the
525    OPERAND_NUMth output operand, indexed from zero.  There are NINPUTS
526    inputs and NOUTPUTS outputs to this extended-asm.  Upon return,
527    *ALLOWS_MEM will be TRUE iff the constraint allows the use of a
528    memory operand.  Similarly, *ALLOWS_REG will be TRUE iff the
529    constraint allows the use of a register operand.  And, *IS_INOUT
530    will be true if the operand is read-write, i.e., if it is used as
531    an input as well as an output.  If *CONSTRAINT_P is not in
532    canonical form, it will be made canonical.  (Note that `+' will be
533    replaced with `=' as part of this process.)
534
535    Returns TRUE if all went well; FALSE if an error occurred.  */
536
537 bool
538 parse_output_constraint (const char **constraint_p, int operand_num,
539                          int ninputs, int noutputs, bool *allows_mem,
540                          bool *allows_reg, bool *is_inout)
541 {
542   const char *constraint = *constraint_p;
543   const char *p;
544
545   /* Assume the constraint doesn't allow the use of either a register
546      or memory.  */
547   *allows_mem = false;
548   *allows_reg = false;
549
550   /* Allow the `=' or `+' to not be at the beginning of the string,
551      since it wasn't explicitly documented that way, and there is a
552      large body of code that puts it last.  Swap the character to
553      the front, so as not to uglify any place else.  */
554   p = strchr (constraint, '=');
555   if (!p)
556     p = strchr (constraint, '+');
557
558   /* If the string doesn't contain an `=', issue an error
559      message.  */
560   if (!p)
561     {
562       error ("output operand constraint lacks `='");
563       return false;
564     }
565
566   /* If the constraint begins with `+', then the operand is both read
567      from and written to.  */
568   *is_inout = (*p == '+');
569
570   /* Canonicalize the output constraint so that it begins with `='.  */
571   if (p != constraint || is_inout)
572     {
573       char *buf;
574       size_t c_len = strlen (constraint);
575
576       if (p != constraint)
577         warning ("output constraint `%c' for operand %d is not at the beginning",
578                  *p, operand_num);
579
580       /* Make a copy of the constraint.  */
581       buf = alloca (c_len + 1);
582       strcpy (buf, constraint);
583       /* Swap the first character and the `=' or `+'.  */
584       buf[p - constraint] = buf[0];
585       /* Make sure the first character is an `='.  (Until we do this,
586          it might be a `+'.)  */
587       buf[0] = '=';
588       /* Replace the constraint with the canonicalized string.  */
589       *constraint_p = ggc_alloc_string (buf, c_len);
590       constraint = *constraint_p;
591     }
592
593   /* Loop through the constraint string.  */
594   for (p = constraint + 1; *p; p += CONSTRAINT_LEN (*p, p))
595     switch (*p)
596       {
597       case '+':
598       case '=':
599         error ("operand constraint contains incorrectly positioned '+' or '='");
600         return false;
601
602       case '%':
603         if (operand_num + 1 == ninputs + noutputs)
604           {
605             error ("`%%' constraint used with last operand");
606             return false;
607           }
608         break;
609
610       case 'V':  case 'm':  case 'o':
611         *allows_mem = true;
612         break;
613
614       case '?':  case '!':  case '*':  case '&':  case '#':
615       case 'E':  case 'F':  case 'G':  case 'H':
616       case 's':  case 'i':  case 'n':
617       case 'I':  case 'J':  case 'K':  case 'L':  case 'M':
618       case 'N':  case 'O':  case 'P':  case ',':
619         break;
620
621       case '0':  case '1':  case '2':  case '3':  case '4':
622       case '5':  case '6':  case '7':  case '8':  case '9':
623       case '[':
624         error ("matching constraint not valid in output operand");
625         return false;
626
627       case '<':  case '>':
628         /* ??? Before flow, auto inc/dec insns are not supposed to exist,
629            excepting those that expand_call created.  So match memory
630            and hope.  */
631         *allows_mem = true;
632         break;
633
634       case 'g':  case 'X':
635         *allows_reg = true;
636         *allows_mem = true;
637         break;
638
639       case 'p': case 'r':
640         *allows_reg = true;
641         break;
642
643       default:
644         if (!ISALPHA (*p))
645           break;
646         if (REG_CLASS_FROM_CONSTRAINT (*p, p) != NO_REGS)
647           *allows_reg = true;
648 #ifdef EXTRA_CONSTRAINT_STR
649         else if (EXTRA_ADDRESS_CONSTRAINT (*p, p))
650           *allows_reg = true;
651         else if (EXTRA_MEMORY_CONSTRAINT (*p, p))
652           *allows_mem = true;
653         else
654           {
655             /* Otherwise we can't assume anything about the nature of
656                the constraint except that it isn't purely registers.
657                Treat it like "g" and hope for the best.  */
658             *allows_reg = true;
659             *allows_mem = true;
660           }
661 #endif
662         break;
663       }
664
665   return true;
666 }
667
668 /* Similar, but for input constraints.  */
669
670 bool
671 parse_input_constraint (const char **constraint_p, int input_num,
672                         int ninputs, int noutputs, int ninout,
673                         const char * const * constraints,
674                         bool *allows_mem, bool *allows_reg)
675 {
676   const char *constraint = *constraint_p;
677   const char *orig_constraint = constraint;
678   size_t c_len = strlen (constraint);
679   size_t j;
680   bool saw_match = false;
681
682   /* Assume the constraint doesn't allow the use of either
683      a register or memory.  */
684   *allows_mem = false;
685   *allows_reg = false;
686
687   /* Make sure constraint has neither `=', `+', nor '&'.  */
688
689   for (j = 0; j < c_len; j += CONSTRAINT_LEN (constraint[j], constraint+j))
690     switch (constraint[j])
691       {
692       case '+':  case '=':  case '&':
693         if (constraint == orig_constraint)
694           {
695             error ("input operand constraint contains `%c'", constraint[j]);
696             return false;
697           }
698         break;
699
700       case '%':
701         if (constraint == orig_constraint
702             && input_num + 1 == ninputs - ninout)
703           {
704             error ("`%%' constraint used with last operand");
705             return false;
706           }
707         break;
708
709       case 'V':  case 'm':  case 'o':
710         *allows_mem = true;
711         break;
712
713       case '<':  case '>':
714       case '?':  case '!':  case '*':  case '#':
715       case 'E':  case 'F':  case 'G':  case 'H':
716       case 's':  case 'i':  case 'n':
717       case 'I':  case 'J':  case 'K':  case 'L':  case 'M':
718       case 'N':  case 'O':  case 'P':  case ',':
719         break;
720
721         /* Whether or not a numeric constraint allows a register is
722            decided by the matching constraint, and so there is no need
723            to do anything special with them.  We must handle them in
724            the default case, so that we don't unnecessarily force
725            operands to memory.  */
726       case '0':  case '1':  case '2':  case '3':  case '4':
727       case '5':  case '6':  case '7':  case '8':  case '9':
728         {
729           char *end;
730           unsigned long match;
731
732           saw_match = true;
733
734           match = strtoul (constraint + j, &end, 10);
735           if (match >= (unsigned long) noutputs)
736             {
737               error ("matching constraint references invalid operand number");
738               return false;
739             }
740
741           /* Try and find the real constraint for this dup.  Only do this
742              if the matching constraint is the only alternative.  */
743           if (*end == '\0'
744               && (j == 0 || (j == 1 && constraint[0] == '%')))
745             {
746               constraint = constraints[match];
747               *constraint_p = constraint;
748               c_len = strlen (constraint);
749               j = 0;
750               /* ??? At the end of the loop, we will skip the first part of
751                  the matched constraint.  This assumes not only that the
752                  other constraint is an output constraint, but also that
753                  the '=' or '+' come first.  */
754               break;
755             }
756           else
757             j = end - constraint;
758           /* Anticipate increment at end of loop.  */
759           j--;
760         }
761         /* Fall through.  */
762
763       case 'p':  case 'r':
764         *allows_reg = true;
765         break;
766
767       case 'g':  case 'X':
768         *allows_reg = true;
769         *allows_mem = true;
770         break;
771
772       default:
773         if (! ISALPHA (constraint[j]))
774           {
775             error ("invalid punctuation `%c' in constraint", constraint[j]);
776             return false;
777           }
778         if (REG_CLASS_FROM_CONSTRAINT (constraint[j], constraint + j)
779             != NO_REGS)
780           *allows_reg = true;
781 #ifdef EXTRA_CONSTRAINT_STR
782         else if (EXTRA_ADDRESS_CONSTRAINT (constraint[j], constraint + j))
783           *allows_reg = true;
784         else if (EXTRA_MEMORY_CONSTRAINT (constraint[j], constraint + j))
785           *allows_mem = true;
786         else
787           {
788             /* Otherwise we can't assume anything about the nature of
789                the constraint except that it isn't purely registers.
790                Treat it like "g" and hope for the best.  */
791             *allows_reg = true;
792             *allows_mem = true;
793           }
794 #endif
795         break;
796       }
797
798   if (saw_match && !*allows_reg)
799     warning ("matching constraint does not allow a register");
800
801   return true;
802 }
803
804 /* INPUT is one of the input operands from EXPR, an ASM_EXPR.  Returns true
805    if it is an operand which must be passed in memory (i.e. an "m"
806    constraint), false otherwise.  */
807
808 bool
809 asm_op_is_mem_input (tree input, tree expr)
810 {
811   const char *constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (input)));
812   tree outputs = ASM_OUTPUTS (expr);
813   int noutputs = list_length (outputs);
814   const char **constraints
815     = (const char **) alloca ((noutputs) * sizeof (const char *));
816   int i = 0;
817   bool allows_mem, allows_reg;
818   tree t;
819
820   /* Collect output constraints.  */
821   for (t = outputs; t ; t = TREE_CHAIN (t), i++)
822     constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
823
824   /* We pass 0 for input_num, ninputs and ninout; they are only used for
825      error checking which will be done at expand time.  */
826   parse_input_constraint (&constraint, 0, 0, noutputs, 0, constraints,
827                           &allows_mem, &allows_reg);
828   return (!allows_reg && allows_mem);
829 }
830
831 /* Check for overlap between registers marked in CLOBBERED_REGS and
832    anything inappropriate in DECL.  Emit error and return TRUE for error,
833    FALSE for ok.  */
834
835 static bool
836 decl_conflicts_with_clobbers_p (tree decl, const HARD_REG_SET clobbered_regs)
837 {
838   /* Conflicts between asm-declared register variables and the clobber
839      list are not allowed.  */
840   if ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
841       && DECL_REGISTER (decl)
842       && REG_P (DECL_RTL (decl))
843       && REGNO (DECL_RTL (decl)) < FIRST_PSEUDO_REGISTER)
844     {
845       rtx reg = DECL_RTL (decl);
846       unsigned int regno;
847
848       for (regno = REGNO (reg);
849            regno < (REGNO (reg)
850                     + hard_regno_nregs[REGNO (reg)][GET_MODE (reg)]);
851            regno++)
852         if (TEST_HARD_REG_BIT (clobbered_regs, regno))
853           {
854             error ("asm-specifier for variable `%s' conflicts with asm clobber list",
855                    IDENTIFIER_POINTER (DECL_NAME (decl)));
856
857             /* Reset registerness to stop multiple errors emitted for a
858                single variable.  */
859             DECL_REGISTER (decl) = 0;
860             return true;
861           }
862     }
863   return false;
864 }
865
866 /* Generate RTL for an asm statement with arguments.
867    STRING is the instruction template.
868    OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs.
869    Each output or input has an expression in the TREE_VALUE and
870    and a tree list in TREE_PURPOSE which in turn contains a constraint
871    name in TREE_VALUE (or NULL_TREE) and a constraint string
872    in TREE_PURPOSE.
873    CLOBBERS is a list of STRING_CST nodes each naming a hard register
874    that is clobbered by this insn.
875
876    Not all kinds of lvalue that may appear in OUTPUTS can be stored directly.
877    Some elements of OUTPUTS may be replaced with trees representing temporary
878    values.  The caller should copy those temporary values to the originally
879    specified lvalues.
880
881    VOL nonzero means the insn is volatile; don't optimize it.  */
882
883 void
884 expand_asm_operands (tree string, tree outputs, tree inputs,
885                      tree clobbers, int vol, location_t locus)
886 {
887   rtvec argvec, constraintvec;
888   rtx body;
889   int ninputs = list_length (inputs);
890   int noutputs = list_length (outputs);
891   int ninout;
892   int nclobbers;
893   HARD_REG_SET clobbered_regs;
894   int clobber_conflict_found = 0;
895   tree tail;
896   tree t;
897   int i;
898   /* Vector of RTX's of evaluated output operands.  */
899   rtx *output_rtx = alloca (noutputs * sizeof (rtx));
900   int *inout_opnum = alloca (noutputs * sizeof (int));
901   rtx *real_output_rtx = alloca (noutputs * sizeof (rtx));
902   enum machine_mode *inout_mode
903     = alloca (noutputs * sizeof (enum machine_mode));
904   const char **constraints
905     = alloca ((noutputs + ninputs) * sizeof (const char *));
906   int old_generating_concat_p = generating_concat_p;
907
908   /* An ASM with no outputs needs to be treated as volatile, for now.  */
909   if (noutputs == 0)
910     vol = 1;
911
912   if (! check_operand_nalternatives (outputs, inputs))
913     return;
914
915   string = resolve_asm_operand_names (string, outputs, inputs);
916
917   /* Collect constraints.  */
918   i = 0;
919   for (t = outputs; t ; t = TREE_CHAIN (t), i++)
920     constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
921   for (t = inputs; t ; t = TREE_CHAIN (t), i++)
922     constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
923
924   /* Sometimes we wish to automatically clobber registers across an asm.
925      Case in point is when the i386 backend moved from cc0 to a hard reg --
926      maintaining source-level compatibility means automatically clobbering
927      the flags register.  */
928   clobbers = targetm.md_asm_clobbers (clobbers);
929
930   /* Count the number of meaningful clobbered registers, ignoring what
931      we would ignore later.  */
932   nclobbers = 0;
933   CLEAR_HARD_REG_SET (clobbered_regs);
934   for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
935     {
936       const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
937
938       i = decode_reg_name (regname);
939       if (i >= 0 || i == -4)
940         ++nclobbers;
941       else if (i == -2)
942         error ("unknown register name `%s' in `asm'", regname);
943
944       /* Mark clobbered registers.  */
945       if (i >= 0)
946         {
947           /* Clobbering the PIC register is an error */
948           if (i == (int) PIC_OFFSET_TABLE_REGNUM)
949             {
950               error ("PIC register `%s' clobbered in `asm'", regname);
951               return;
952             }
953
954           SET_HARD_REG_BIT (clobbered_regs, i);
955         }
956     }
957
958   /* First pass over inputs and outputs checks validity and sets
959      mark_addressable if needed.  */
960
961   ninout = 0;
962   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
963     {
964       tree val = TREE_VALUE (tail);
965       tree type = TREE_TYPE (val);
966       const char *constraint;
967       bool is_inout;
968       bool allows_reg;
969       bool allows_mem;
970
971       /* If there's an erroneous arg, emit no insn.  */
972       if (type == error_mark_node)
973         return;
974
975       /* Try to parse the output constraint.  If that fails, there's
976          no point in going further.  */
977       constraint = constraints[i];
978       if (!parse_output_constraint (&constraint, i, ninputs, noutputs,
979                                     &allows_mem, &allows_reg, &is_inout))
980         return;
981
982       if (! allows_reg
983           && (allows_mem
984               || is_inout
985               || (DECL_P (val)
986                   && REG_P (DECL_RTL (val))
987                   && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type))))
988         lang_hooks.mark_addressable (val);
989
990       if (is_inout)
991         ninout++;
992     }
993
994   ninputs += ninout;
995   if (ninputs + noutputs > MAX_RECOG_OPERANDS)
996     {
997       error ("more than %d operands in `asm'", MAX_RECOG_OPERANDS);
998       return;
999     }
1000
1001   for (i = 0, tail = inputs; tail; i++, tail = TREE_CHAIN (tail))
1002     {
1003       bool allows_reg, allows_mem;
1004       const char *constraint;
1005
1006       /* If there's an erroneous arg, emit no insn, because the ASM_INPUT
1007          would get VOIDmode and that could cause a crash in reload.  */
1008       if (TREE_TYPE (TREE_VALUE (tail)) == error_mark_node)
1009         return;
1010
1011       constraint = constraints[i + noutputs];
1012       if (! parse_input_constraint (&constraint, i, ninputs, noutputs, ninout,
1013                                     constraints, &allows_mem, &allows_reg))
1014         return;
1015
1016       if (! allows_reg && allows_mem)
1017         lang_hooks.mark_addressable (TREE_VALUE (tail));
1018     }
1019
1020   /* Second pass evaluates arguments.  */
1021
1022   ninout = 0;
1023   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1024     {
1025       tree val = TREE_VALUE (tail);
1026       tree type = TREE_TYPE (val);
1027       bool is_inout;
1028       bool allows_reg;
1029       bool allows_mem;
1030       rtx op;
1031
1032       if (!parse_output_constraint (&constraints[i], i, ninputs,
1033                                     noutputs, &allows_mem, &allows_reg,
1034                                     &is_inout))
1035         abort ();
1036
1037       /* If an output operand is not a decl or indirect ref and our constraint
1038          allows a register, make a temporary to act as an intermediate.
1039          Make the asm insn write into that, then our caller will copy it to
1040          the real output operand.  Likewise for promoted variables.  */
1041
1042       generating_concat_p = 0;
1043
1044       real_output_rtx[i] = NULL_RTX;
1045       if ((TREE_CODE (val) == INDIRECT_REF
1046            && allows_mem)
1047           || (DECL_P (val)
1048               && (allows_mem || REG_P (DECL_RTL (val)))
1049               && ! (REG_P (DECL_RTL (val))
1050                     && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
1051           || ! allows_reg
1052           || is_inout)
1053         {
1054           op = expand_expr (val, NULL_RTX, VOIDmode, EXPAND_WRITE);
1055           if (MEM_P (op))
1056             op = validize_mem (op);
1057
1058           if (! allows_reg && !MEM_P (op))
1059             error ("output number %d not directly addressable", i);
1060           if ((! allows_mem && MEM_P (op))
1061               || GET_CODE (op) == CONCAT)
1062             {
1063               real_output_rtx[i] = protect_from_queue (op, 1);
1064               op = gen_reg_rtx (GET_MODE (op));
1065               if (is_inout)
1066                 emit_move_insn (op, real_output_rtx[i]);
1067             }
1068         }
1069       else
1070         {
1071           op = assign_temp (type, 0, 0, 1);
1072           op = validize_mem (op);
1073           TREE_VALUE (tail) = make_tree (type, op);
1074         }
1075       output_rtx[i] = op;
1076
1077       generating_concat_p = old_generating_concat_p;
1078
1079       if (is_inout)
1080         {
1081           inout_mode[ninout] = TYPE_MODE (type);
1082           inout_opnum[ninout++] = i;
1083         }
1084
1085       if (decl_conflicts_with_clobbers_p (val, clobbered_regs))
1086         clobber_conflict_found = 1;
1087     }
1088
1089   /* Make vectors for the expression-rtx, constraint strings,
1090      and named operands.  */
1091
1092   argvec = rtvec_alloc (ninputs);
1093   constraintvec = rtvec_alloc (ninputs);
1094
1095   body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode
1096                                 : GET_MODE (output_rtx[0])),
1097                                TREE_STRING_POINTER (string),
1098                                empty_string, 0, argvec, constraintvec,
1099                                locus);
1100
1101   MEM_VOLATILE_P (body) = vol;
1102
1103   /* Eval the inputs and put them into ARGVEC.
1104      Put their constraints into ASM_INPUTs and store in CONSTRAINTS.  */
1105
1106   for (i = 0, tail = inputs; tail; tail = TREE_CHAIN (tail), ++i)
1107     {
1108       bool allows_reg, allows_mem;
1109       const char *constraint;
1110       tree val, type;
1111       rtx op;
1112
1113       constraint = constraints[i + noutputs];
1114       if (! parse_input_constraint (&constraint, i, ninputs, noutputs, ninout,
1115                                     constraints, &allows_mem, &allows_reg))
1116         abort ();
1117
1118       generating_concat_p = 0;
1119
1120       val = TREE_VALUE (tail);
1121       type = TREE_TYPE (val);
1122       op = expand_expr (val, NULL_RTX, VOIDmode,
1123                         (allows_mem && !allows_reg
1124                          ? EXPAND_MEMORY : EXPAND_NORMAL));
1125
1126       /* Never pass a CONCAT to an ASM.  */
1127       if (GET_CODE (op) == CONCAT)
1128         op = force_reg (GET_MODE (op), op);
1129       else if (MEM_P (op))
1130         op = validize_mem (op);
1131
1132       if (asm_operand_ok (op, constraint) <= 0)
1133         {
1134           if (allows_reg)
1135             op = force_reg (TYPE_MODE (type), op);
1136           else if (!allows_mem)
1137             warning ("asm operand %d probably doesn't match constraints",
1138                      i + noutputs);
1139           else if (MEM_P (op))
1140             {
1141               /* We won't recognize either volatile memory or memory
1142                  with a queued address as available a memory_operand
1143                  at this point.  Ignore it: clearly this *is* a memory.  */
1144             }
1145           else
1146             {
1147               warning ("use of memory input without lvalue in "
1148                        "asm operand %d is deprecated", i + noutputs);
1149
1150               if (CONSTANT_P (op))
1151                 {
1152                   rtx mem = force_const_mem (TYPE_MODE (type), op);
1153                   if (mem)
1154                     op = validize_mem (mem);
1155                   else
1156                     op = force_reg (TYPE_MODE (type), op);
1157                 }
1158               if (REG_P (op)
1159                   || GET_CODE (op) == SUBREG
1160                   || GET_CODE (op) == CONCAT)
1161                 {
1162                   tree qual_type = build_qualified_type (type,
1163                                                          (TYPE_QUALS (type)
1164                                                           | TYPE_QUAL_CONST));
1165                   rtx memloc = assign_temp (qual_type, 1, 1, 1);
1166                   memloc = validize_mem (memloc);
1167                   emit_move_insn (memloc, op);
1168                   op = memloc;
1169                 }
1170             }
1171         }
1172
1173       generating_concat_p = old_generating_concat_p;
1174       ASM_OPERANDS_INPUT (body, i) = op;
1175
1176       ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i)
1177         = gen_rtx_ASM_INPUT (TYPE_MODE (type), constraints[i + noutputs]);
1178
1179       if (decl_conflicts_with_clobbers_p (val, clobbered_regs))
1180         clobber_conflict_found = 1;
1181     }
1182
1183   /* Protect all the operands from the queue now that they have all been
1184      evaluated.  */
1185
1186   generating_concat_p = 0;
1187
1188   for (i = 0; i < ninputs - ninout; i++)
1189     ASM_OPERANDS_INPUT (body, i)
1190       = protect_from_queue (ASM_OPERANDS_INPUT (body, i), 0);
1191
1192   for (i = 0; i < noutputs; i++)
1193     output_rtx[i] = protect_from_queue (output_rtx[i], 1);
1194
1195   /* For in-out operands, copy output rtx to input rtx.  */
1196   for (i = 0; i < ninout; i++)
1197     {
1198       int j = inout_opnum[i];
1199       char buffer[16];
1200
1201       ASM_OPERANDS_INPUT (body, ninputs - ninout + i)
1202         = output_rtx[j];
1203
1204       sprintf (buffer, "%d", j);
1205       ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, ninputs - ninout + i)
1206         = gen_rtx_ASM_INPUT (inout_mode[i], ggc_strdup (buffer));
1207     }
1208
1209   generating_concat_p = old_generating_concat_p;
1210
1211   /* Now, for each output, construct an rtx
1212      (set OUTPUT (asm_operands INSN OUTPUTCONSTRAINT OUTPUTNUMBER
1213                                ARGVEC CONSTRAINTS OPNAMES))
1214      If there is more than one, put them inside a PARALLEL.  */
1215
1216   if (noutputs == 1 && nclobbers == 0)
1217     {
1218       ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = constraints[0];
1219       emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
1220     }
1221
1222   else if (noutputs == 0 && nclobbers == 0)
1223     {
1224       /* No output operands: put in a raw ASM_OPERANDS rtx.  */
1225       emit_insn (body);
1226     }
1227
1228   else
1229     {
1230       rtx obody = body;
1231       int num = noutputs;
1232
1233       if (num == 0)
1234         num = 1;
1235
1236       body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num + nclobbers));
1237
1238       /* For each output operand, store a SET.  */
1239       for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1240         {
1241           XVECEXP (body, 0, i)
1242             = gen_rtx_SET (VOIDmode,
1243                            output_rtx[i],
1244                            gen_rtx_ASM_OPERANDS
1245                            (GET_MODE (output_rtx[i]),
1246                             TREE_STRING_POINTER (string),
1247                             constraints[i], i, argvec, constraintvec,
1248                             locus));
1249
1250           MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol;
1251         }
1252
1253       /* If there are no outputs (but there are some clobbers)
1254          store the bare ASM_OPERANDS into the PARALLEL.  */
1255
1256       if (i == 0)
1257         XVECEXP (body, 0, i++) = obody;
1258
1259       /* Store (clobber REG) for each clobbered register specified.  */
1260
1261       for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
1262         {
1263           const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
1264           int j = decode_reg_name (regname);
1265           rtx clobbered_reg;
1266
1267           if (j < 0)
1268             {
1269               if (j == -3)      /* `cc', which is not a register */
1270                 continue;
1271
1272               if (j == -4)      /* `memory', don't cache memory across asm */
1273                 {
1274                   XVECEXP (body, 0, i++)
1275                     = gen_rtx_CLOBBER (VOIDmode,
1276                                        gen_rtx_MEM
1277                                        (BLKmode,
1278                                         gen_rtx_SCRATCH (VOIDmode)));
1279                   continue;
1280                 }
1281
1282               /* Ignore unknown register, error already signaled.  */
1283               continue;
1284             }
1285
1286           /* Use QImode since that's guaranteed to clobber just one reg.  */
1287           clobbered_reg = gen_rtx_REG (QImode, j);
1288
1289           /* Do sanity check for overlap between clobbers and respectively
1290              input and outputs that hasn't been handled.  Such overlap
1291              should have been detected and reported above.  */
1292           if (!clobber_conflict_found)
1293             {
1294               int opno;
1295
1296               /* We test the old body (obody) contents to avoid tripping
1297                  over the under-construction body.  */
1298               for (opno = 0; opno < noutputs; opno++)
1299                 if (reg_overlap_mentioned_p (clobbered_reg, output_rtx[opno]))
1300                   internal_error ("asm clobber conflict with output operand");
1301
1302               for (opno = 0; opno < ninputs - ninout; opno++)
1303                 if (reg_overlap_mentioned_p (clobbered_reg,
1304                                              ASM_OPERANDS_INPUT (obody, opno)))
1305                   internal_error ("asm clobber conflict with input operand");
1306             }
1307
1308           XVECEXP (body, 0, i++)
1309             = gen_rtx_CLOBBER (VOIDmode, clobbered_reg);
1310         }
1311
1312       emit_insn (body);
1313     }
1314
1315   /* For any outputs that needed reloading into registers, spill them
1316      back to where they belong.  */
1317   for (i = 0; i < noutputs; ++i)
1318     if (real_output_rtx[i])
1319       emit_move_insn (real_output_rtx[i], output_rtx[i]);
1320
1321   free_temp_slots ();
1322 }
1323
1324 void
1325 expand_asm_expr (tree exp)
1326 {
1327   int noutputs, i;
1328   tree outputs, tail;
1329   tree *o;
1330
1331   if (ASM_INPUT_P (exp))
1332     {
1333       expand_asm (ASM_STRING (exp), ASM_VOLATILE_P (exp));
1334       return;
1335     }
1336
1337   outputs = ASM_OUTPUTS (exp);
1338   noutputs = list_length (outputs);
1339   /* o[I] is the place that output number I should be written.  */
1340   o = (tree *) alloca (noutputs * sizeof (tree));
1341
1342   /* Record the contents of OUTPUTS before it is modified.  */
1343   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1344     o[i] = TREE_VALUE (tail);
1345
1346   /* Generate the ASM_OPERANDS insn; store into the TREE_VALUEs of
1347      OUTPUTS some trees for where the values were actually stored.  */
1348   expand_asm_operands (ASM_STRING (exp), outputs, ASM_INPUTS (exp),
1349                        ASM_CLOBBERS (exp), ASM_VOLATILE_P (exp),
1350                        input_location);
1351
1352   /* Copy all the intermediate outputs into the specified outputs.  */
1353   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1354     {
1355       if (o[i] != TREE_VALUE (tail))
1356         {
1357           expand_assignment (o[i], TREE_VALUE (tail), 0);
1358           free_temp_slots ();
1359
1360           /* Restore the original value so that it's correct the next
1361              time we expand this function.  */
1362           TREE_VALUE (tail) = o[i];
1363         }
1364     }
1365
1366   /* Those MODIFY_EXPRs could do autoincrements.  */
1367   emit_queue ();
1368 }
1369
1370 /* A subroutine of expand_asm_operands.  Check that all operands have
1371    the same number of alternatives.  Return true if so.  */
1372
1373 static bool
1374 check_operand_nalternatives (tree outputs, tree inputs)
1375 {
1376   if (outputs || inputs)
1377     {
1378       tree tmp = TREE_PURPOSE (outputs ? outputs : inputs);
1379       int nalternatives
1380         = n_occurrences (',', TREE_STRING_POINTER (TREE_VALUE (tmp)));
1381       tree next = inputs;
1382
1383       if (nalternatives + 1 > MAX_RECOG_ALTERNATIVES)
1384         {
1385           error ("too many alternatives in `asm'");
1386           return false;
1387         }
1388
1389       tmp = outputs;
1390       while (tmp)
1391         {
1392           const char *constraint
1393             = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tmp)));
1394
1395           if (n_occurrences (',', constraint) != nalternatives)
1396             {
1397               error ("operand constraints for `asm' differ in number of alternatives");
1398               return false;
1399             }
1400
1401           if (TREE_CHAIN (tmp))
1402             tmp = TREE_CHAIN (tmp);
1403           else
1404             tmp = next, next = 0;
1405         }
1406     }
1407
1408   return true;
1409 }
1410
1411 /* A subroutine of expand_asm_operands.  Check that all operand names
1412    are unique.  Return true if so.  We rely on the fact that these names
1413    are identifiers, and so have been canonicalized by get_identifier,
1414    so all we need are pointer comparisons.  */
1415
1416 static bool
1417 check_unique_operand_names (tree outputs, tree inputs)
1418 {
1419   tree i, j;
1420
1421   for (i = outputs; i ; i = TREE_CHAIN (i))
1422     {
1423       tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
1424       if (! i_name)
1425         continue;
1426
1427       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
1428         if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1429           goto failure;
1430     }
1431
1432   for (i = inputs; i ; i = TREE_CHAIN (i))
1433     {
1434       tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
1435       if (! i_name)
1436         continue;
1437
1438       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
1439         if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1440           goto failure;
1441       for (j = outputs; j ; j = TREE_CHAIN (j))
1442         if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1443           goto failure;
1444     }
1445
1446   return true;
1447
1448  failure:
1449   error ("duplicate asm operand name '%s'",
1450          TREE_STRING_POINTER (TREE_PURPOSE (TREE_PURPOSE (i))));
1451   return false;
1452 }
1453
1454 /* A subroutine of expand_asm_operands.  Resolve the names of the operands
1455    in *POUTPUTS and *PINPUTS to numbers, and replace the name expansions in
1456    STRING and in the constraints to those numbers.  */
1457
1458 tree
1459 resolve_asm_operand_names (tree string, tree outputs, tree inputs)
1460 {
1461   char *buffer;
1462   char *p;
1463   const char *c;
1464   tree t;
1465
1466   check_unique_operand_names (outputs, inputs);
1467
1468   /* Substitute [<name>] in input constraint strings.  There should be no
1469      named operands in output constraints.  */
1470   for (t = inputs; t ; t = TREE_CHAIN (t))
1471     {
1472       c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
1473       if (strchr (c, '[') != NULL)
1474         {
1475           p = buffer = xstrdup (c);
1476           while ((p = strchr (p, '[')) != NULL)
1477             p = resolve_operand_name_1 (p, outputs, inputs);
1478           TREE_VALUE (TREE_PURPOSE (t))
1479             = build_string (strlen (buffer), buffer);
1480           free (buffer);
1481         }
1482     }
1483
1484   /* Now check for any needed substitutions in the template.  */
1485   c = TREE_STRING_POINTER (string);
1486   while ((c = strchr (c, '%')) != NULL)
1487     {
1488       if (c[1] == '[')
1489         break;
1490       else if (ISALPHA (c[1]) && c[2] == '[')
1491         break;
1492       else
1493         {
1494           c += 1;
1495           continue;
1496         }
1497     }
1498
1499   if (c)
1500     {
1501       /* OK, we need to make a copy so we can perform the substitutions.
1502          Assume that we will not need extra space--we get to remove '['
1503          and ']', which means we cannot have a problem until we have more
1504          than 999 operands.  */
1505       buffer = xstrdup (TREE_STRING_POINTER (string));
1506       p = buffer + (c - TREE_STRING_POINTER (string));
1507       
1508       while ((p = strchr (p, '%')) != NULL)
1509         {
1510           if (p[1] == '[')
1511             p += 1;
1512           else if (ISALPHA (p[1]) && p[2] == '[')
1513             p += 2;
1514           else
1515             {
1516               p += 1;
1517               continue;
1518             }
1519
1520           p = resolve_operand_name_1 (p, outputs, inputs);
1521         }
1522
1523       string = build_string (strlen (buffer), buffer);
1524       free (buffer);
1525     }
1526
1527   return string;
1528 }
1529
1530 /* A subroutine of resolve_operand_names.  P points to the '[' for a
1531    potential named operand of the form [<name>].  In place, replace
1532    the name and brackets with a number.  Return a pointer to the
1533    balance of the string after substitution.  */
1534
1535 static char *
1536 resolve_operand_name_1 (char *p, tree outputs, tree inputs)
1537 {
1538   char *q;
1539   int op;
1540   tree t;
1541   size_t len;
1542
1543   /* Collect the operand name.  */
1544   q = strchr (p, ']');
1545   if (!q)
1546     {
1547       error ("missing close brace for named operand");
1548       return strchr (p, '\0');
1549     }
1550   len = q - p - 1;
1551
1552   /* Resolve the name to a number.  */
1553   for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++)
1554     {
1555       tree name = TREE_PURPOSE (TREE_PURPOSE (t));
1556       if (name)
1557         {
1558           const char *c = TREE_STRING_POINTER (name);
1559           if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
1560             goto found;
1561         }
1562     }
1563   for (t = inputs; t ; t = TREE_CHAIN (t), op++)
1564     {
1565       tree name = TREE_PURPOSE (TREE_PURPOSE (t));
1566       if (name)
1567         {
1568           const char *c = TREE_STRING_POINTER (name);
1569           if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
1570             goto found;
1571         }
1572     }
1573
1574   *q = '\0';
1575   error ("undefined named operand '%s'", p + 1);
1576   op = 0;
1577  found:
1578
1579   /* Replace the name with the number.  Unfortunately, not all libraries
1580      get the return value of sprintf correct, so search for the end of the
1581      generated string by hand.  */
1582   sprintf (p, "%d", op);
1583   p = strchr (p, '\0');
1584
1585   /* Verify the no extra buffer space assumption.  */
1586   if (p > q)
1587     abort ();
1588
1589   /* Shift the rest of the buffer down to fill the gap.  */
1590   memmove (p, q + 1, strlen (q + 1) + 1);
1591
1592   return p;
1593 }
1594 \f
1595 /* Generate RTL to evaluate the expression EXP.  */
1596
1597 void
1598 expand_expr_stmt (tree exp)
1599 {
1600   rtx value;
1601   tree type;
1602
1603   value = expand_expr (exp, const0_rtx, VOIDmode, 0);
1604   type = TREE_TYPE (exp);
1605
1606   /* If all we do is reference a volatile value in memory,
1607      copy it to a register to be sure it is actually touched.  */
1608   if (value && MEM_P (value) && TREE_THIS_VOLATILE (exp))
1609     {
1610       if (TYPE_MODE (type) == VOIDmode)
1611         ;
1612       else if (TYPE_MODE (type) != BLKmode)
1613         value = copy_to_reg (value);
1614       else
1615         {
1616           rtx lab = gen_label_rtx ();
1617
1618           /* Compare the value with itself to reference it.  */
1619           emit_cmp_and_jump_insns (value, value, EQ,
1620                                    expand_expr (TYPE_SIZE (type),
1621                                                 NULL_RTX, VOIDmode, 0),
1622                                    BLKmode, 0, lab);
1623           emit_label (lab);
1624         }
1625     }
1626
1627   /* Free any temporaries used to evaluate this expression.  */
1628   free_temp_slots ();
1629
1630   emit_queue ();
1631 }
1632
1633 /* Warn if EXP contains any computations whose results are not used.
1634    Return 1 if a warning is printed; 0 otherwise.  LOCUS is the 
1635    (potential) location of the expression.  */
1636
1637 int
1638 warn_if_unused_value (tree exp, location_t locus)
1639 {
1640  restart:
1641   if (TREE_USED (exp))
1642     return 0;
1643
1644   /* Don't warn about void constructs.  This includes casting to void,
1645      void function calls, and statement expressions with a final cast
1646      to void.  */
1647   if (VOID_TYPE_P (TREE_TYPE (exp)))
1648     return 0;
1649
1650   if (EXPR_LOCUS (exp))
1651     locus = *EXPR_LOCUS (exp);
1652
1653   switch (TREE_CODE (exp))
1654     {
1655     case PREINCREMENT_EXPR:
1656     case POSTINCREMENT_EXPR:
1657     case PREDECREMENT_EXPR:
1658     case POSTDECREMENT_EXPR:
1659     case MODIFY_EXPR:
1660     case INIT_EXPR:
1661     case TARGET_EXPR:
1662     case CALL_EXPR:
1663     case TRY_CATCH_EXPR:
1664     case WITH_CLEANUP_EXPR:
1665     case EXIT_EXPR:
1666       return 0;
1667
1668     case BIND_EXPR:
1669       /* For a binding, warn if no side effect within it.  */
1670       exp = BIND_EXPR_BODY (exp);
1671       goto restart;
1672
1673     case SAVE_EXPR:
1674       exp = TREE_OPERAND (exp, 0);
1675       goto restart;
1676
1677     case TRUTH_ORIF_EXPR:
1678     case TRUTH_ANDIF_EXPR:
1679       /* In && or ||, warn if 2nd operand has no side effect.  */
1680       exp = TREE_OPERAND (exp, 1);
1681       goto restart;
1682
1683     case COMPOUND_EXPR:
1684       if (TREE_NO_WARNING (exp))
1685         return 0;
1686       if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus))
1687         return 1;
1688       /* Let people do `(foo (), 0)' without a warning.  */
1689       if (TREE_CONSTANT (TREE_OPERAND (exp, 1)))
1690         return 0;
1691       exp = TREE_OPERAND (exp, 1);
1692       goto restart;
1693
1694     case NOP_EXPR:
1695     case CONVERT_EXPR:
1696     case NON_LVALUE_EXPR:
1697       /* Don't warn about conversions not explicit in the user's program.  */
1698       if (TREE_NO_WARNING (exp))
1699         return 0;
1700       /* Assignment to a cast usually results in a cast of a modify.
1701          Don't complain about that.  There can be an arbitrary number of
1702          casts before the modify, so we must loop until we find the first
1703          non-cast expression and then test to see if that is a modify.  */
1704       {
1705         tree tem = TREE_OPERAND (exp, 0);
1706
1707         while (TREE_CODE (tem) == CONVERT_EXPR || TREE_CODE (tem) == NOP_EXPR)
1708           tem = TREE_OPERAND (tem, 0);
1709
1710         if (TREE_CODE (tem) == MODIFY_EXPR || TREE_CODE (tem) == INIT_EXPR
1711             || TREE_CODE (tem) == CALL_EXPR)
1712           return 0;
1713       }
1714       goto maybe_warn;
1715
1716     case INDIRECT_REF:
1717       /* Don't warn about automatic dereferencing of references, since
1718          the user cannot control it.  */
1719       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE)
1720         {
1721           exp = TREE_OPERAND (exp, 0);
1722           goto restart;
1723         }
1724       /* Fall through.  */
1725
1726     default:
1727       /* Referencing a volatile value is a side effect, so don't warn.  */
1728       if ((DECL_P (exp)
1729            || TREE_CODE_CLASS (TREE_CODE (exp)) == 'r')
1730           && TREE_THIS_VOLATILE (exp))
1731         return 0;
1732
1733       /* If this is an expression which has no operands, there is no value
1734          to be unused.  There are no such language-independent codes,
1735          but front ends may define such.  */
1736       if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'e'
1737           && TREE_CODE_LENGTH (TREE_CODE (exp)) == 0)
1738         return 0;
1739
1740     maybe_warn:
1741       /* If this is an expression with side effects, don't warn.  */
1742       if (TREE_SIDE_EFFECTS (exp))
1743         return 0;
1744
1745       warning ("%Hvalue computed is not used", &locus);
1746       return 1;
1747     }
1748 }
1749 \f
1750 /* Generate RTL for the start of an if-then.  COND is the expression
1751    whose truth should be tested.
1752
1753    If EXITFLAG is nonzero, this conditional is visible to
1754    `exit_something'.  */
1755
1756 void
1757 expand_start_cond (tree cond, int exitflag)
1758 {
1759   struct nesting *thiscond = ALLOC_NESTING ();
1760
1761   /* Make an entry on cond_stack for the cond we are entering.  */
1762
1763   thiscond->desc = COND_NESTING;
1764   thiscond->next = cond_stack;
1765   thiscond->all = nesting_stack;
1766   thiscond->depth = ++nesting_depth;
1767   thiscond->data.cond.next_label = gen_label_rtx ();
1768   /* Before we encounter an `else', we don't need a separate exit label
1769      unless there are supposed to be exit statements
1770      to exit this conditional.  */
1771   thiscond->exit_label = exitflag ? gen_label_rtx () : 0;
1772   thiscond->data.cond.endif_label = thiscond->exit_label;
1773   cond_stack = thiscond;
1774   nesting_stack = thiscond;
1775
1776   do_jump (cond, thiscond->data.cond.next_label, NULL_RTX);
1777 }
1778
1779 /* Generate RTL between then-clause and the elseif-clause
1780    of an if-then-elseif-....  */
1781
1782 void
1783 expand_start_elseif (tree cond)
1784 {
1785   if (cond_stack->data.cond.endif_label == 0)
1786     cond_stack->data.cond.endif_label = gen_label_rtx ();
1787   emit_jump (cond_stack->data.cond.endif_label);
1788   emit_label (cond_stack->data.cond.next_label);
1789   cond_stack->data.cond.next_label = gen_label_rtx ();
1790   do_jump (cond, cond_stack->data.cond.next_label, NULL_RTX);
1791 }
1792
1793 /* Generate RTL between the then-clause and the else-clause
1794    of an if-then-else.  */
1795
1796 void
1797 expand_start_else (void)
1798 {
1799   if (cond_stack->data.cond.endif_label == 0)
1800     cond_stack->data.cond.endif_label = gen_label_rtx ();
1801
1802   emit_jump (cond_stack->data.cond.endif_label);
1803   emit_label (cond_stack->data.cond.next_label);
1804   cond_stack->data.cond.next_label = 0;  /* No more _else or _elseif calls.  */
1805 }
1806
1807 /* After calling expand_start_else, turn this "else" into an "else if"
1808    by providing another condition.  */
1809
1810 void
1811 expand_elseif (tree cond)
1812 {
1813   cond_stack->data.cond.next_label = gen_label_rtx ();
1814   do_jump (cond, cond_stack->data.cond.next_label, NULL_RTX);
1815 }
1816
1817 /* Generate RTL for the end of an if-then.
1818    Pop the record for it off of cond_stack.  */
1819
1820 void
1821 expand_end_cond (void)
1822 {
1823   struct nesting *thiscond = cond_stack;
1824
1825   do_pending_stack_adjust ();
1826   if (thiscond->data.cond.next_label)
1827     emit_label (thiscond->data.cond.next_label);
1828   if (thiscond->data.cond.endif_label)
1829     emit_label (thiscond->data.cond.endif_label);
1830
1831   POPSTACK (cond_stack);
1832 }
1833 \f
1834 /* Return nonzero if we should preserve sub-expressions as separate
1835    pseudos.  We never do so if we aren't optimizing.  We always do so
1836    if -fexpensive-optimizations.  */
1837
1838 int
1839 preserve_subexpressions_p (void)
1840 {
1841   if (flag_expensive_optimizations)
1842     return 1;
1843
1844   if (optimize == 0 || cfun == 0 || cfun->stmt == 0)
1845     return 0;
1846
1847   return 1;
1848 }
1849
1850 \f
1851 /* Generate RTL to return from the current function, with no value.
1852    (That is, we do not do anything about returning any value.)  */
1853
1854 void
1855 expand_null_return (void)
1856 {
1857   /* If this function was declared to return a value, but we
1858      didn't, clobber the return registers so that they are not
1859      propagated live to the rest of the function.  */
1860   clobber_return_register ();
1861
1862   expand_null_return_1 ();
1863 }
1864
1865 /* Generate RTL to return directly from the current function.
1866    (That is, we bypass any return value.)  */
1867
1868 void
1869 expand_naked_return (void)
1870 {
1871   rtx end_label;
1872
1873   clear_pending_stack_adjust ();
1874   do_pending_stack_adjust ();
1875
1876   end_label = naked_return_label;
1877   if (end_label == 0)
1878     end_label = naked_return_label = gen_label_rtx ();
1879
1880   emit_jump (end_label);
1881 }
1882
1883 /* Try to guess whether the value of return means error code.  */
1884 static enum br_predictor
1885 return_prediction (rtx val)
1886 {
1887   /* Different heuristics for pointers and scalars.  */
1888   if (POINTER_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl))))
1889     {
1890       /* NULL is usually not returned.  */
1891       if (val == const0_rtx)
1892         return PRED_NULL_RETURN;
1893     }
1894   else
1895     {
1896       /* Negative return values are often used to indicate
1897          errors.  */
1898       if (GET_CODE (val) == CONST_INT
1899           && INTVAL (val) < 0)
1900         return PRED_NEGATIVE_RETURN;
1901       /* Constant return values are also usually erors,
1902          zero/one often mean booleans so exclude them from the
1903          heuristics.  */
1904       if (CONSTANT_P (val)
1905           && (val != const0_rtx && val != const1_rtx))
1906         return PRED_CONST_RETURN;
1907     }
1908   return PRED_NO_PREDICTION;
1909 }
1910
1911
1912 /* If the current function returns values in the most significant part
1913    of a register, shift return value VAL appropriately.  The mode of
1914    the function's return type is known not to be BLKmode.  */
1915
1916 static rtx
1917 shift_return_value (rtx val)
1918 {
1919   tree type;
1920
1921   type = TREE_TYPE (DECL_RESULT (current_function_decl));
1922   if (targetm.calls.return_in_msb (type))
1923     {
1924       rtx target;
1925       HOST_WIDE_INT shift;
1926
1927       target = DECL_RTL (DECL_RESULT (current_function_decl));
1928       shift = (GET_MODE_BITSIZE (GET_MODE (target))
1929                - BITS_PER_UNIT * int_size_in_bytes (type));
1930       if (shift > 0)
1931         val = expand_shift (LSHIFT_EXPR, GET_MODE (target),
1932                             gen_lowpart (GET_MODE (target), val),
1933                             build_int_2 (shift, 0), target, 1);
1934     }
1935   return val;
1936 }
1937
1938
1939 /* Generate RTL to return from the current function, with value VAL.  */
1940
1941 static void
1942 expand_value_return (rtx val)
1943 {
1944   rtx return_reg;
1945   enum br_predictor pred;
1946
1947   if (flag_guess_branch_prob
1948       && (pred = return_prediction (val)) != PRED_NO_PREDICTION)
1949     {
1950       /* Emit information for branch prediction.  */
1951       rtx note;
1952
1953       note = emit_note (NOTE_INSN_PREDICTION);
1954
1955       NOTE_PREDICTION (note) = NOTE_PREDICT (pred, NOT_TAKEN);
1956
1957     }
1958
1959   return_reg = DECL_RTL (DECL_RESULT (current_function_decl));
1960
1961   /* Copy the value to the return location
1962      unless it's already there.  */
1963
1964   if (return_reg != val)
1965     {
1966       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
1967       if (targetm.calls.promote_function_return (TREE_TYPE (current_function_decl)))
1968       {
1969         int unsignedp = TYPE_UNSIGNED (type);
1970         enum machine_mode old_mode
1971           = DECL_MODE (DECL_RESULT (current_function_decl));
1972         enum machine_mode mode
1973           = promote_mode (type, old_mode, &unsignedp, 1);
1974
1975         if (mode != old_mode)
1976           val = convert_modes (mode, old_mode, val, unsignedp);
1977       }
1978       if (GET_CODE (return_reg) == PARALLEL)
1979         emit_group_load (return_reg, val, type, int_size_in_bytes (type));
1980       else
1981         emit_move_insn (return_reg, val);
1982     }
1983
1984   expand_null_return_1 ();
1985 }
1986
1987 /* Output a return with no value.  */
1988
1989 static void
1990 expand_null_return_1 (void)
1991 {
1992   rtx end_label;
1993
1994   clear_pending_stack_adjust ();
1995   do_pending_stack_adjust ();
1996
1997   end_label = return_label;
1998   if (end_label == 0)
1999      end_label = return_label = gen_label_rtx ();
2000   emit_jump (end_label);
2001 }
2002 \f
2003 /* Generate RTL to evaluate the expression RETVAL and return it
2004    from the current function.  */
2005
2006 void
2007 expand_return (tree retval)
2008 {
2009   rtx result_rtl;
2010   rtx val = 0;
2011   tree retval_rhs;
2012
2013   /* If function wants no value, give it none.  */
2014   if (TREE_CODE (TREE_TYPE (TREE_TYPE (current_function_decl))) == VOID_TYPE)
2015     {
2016       expand_expr (retval, NULL_RTX, VOIDmode, 0);
2017       emit_queue ();
2018       expand_null_return ();
2019       return;
2020     }
2021
2022   if (retval == error_mark_node)
2023     {
2024       /* Treat this like a return of no value from a function that
2025          returns a value.  */
2026       expand_null_return ();
2027       return;
2028     }
2029   else if (TREE_CODE (retval) == RESULT_DECL)
2030     retval_rhs = retval;
2031   else if ((TREE_CODE (retval) == MODIFY_EXPR
2032             || TREE_CODE (retval) == INIT_EXPR)
2033            && TREE_CODE (TREE_OPERAND (retval, 0)) == RESULT_DECL)
2034     retval_rhs = TREE_OPERAND (retval, 1);
2035   else
2036     retval_rhs = retval;
2037
2038   result_rtl = DECL_RTL (DECL_RESULT (current_function_decl));
2039
2040   /* If the result is an aggregate that is being returned in one (or more)
2041      registers, load the registers here.  The compiler currently can't handle
2042      copying a BLKmode value into registers.  We could put this code in a
2043      more general area (for use by everyone instead of just function
2044      call/return), but until this feature is generally usable it is kept here
2045      (and in expand_call).  */
2046
2047   if (retval_rhs != 0
2048       && TYPE_MODE (TREE_TYPE (retval_rhs)) == BLKmode
2049       && REG_P (result_rtl))
2050     {
2051       int i;
2052       unsigned HOST_WIDE_INT bitpos, xbitpos;
2053       unsigned HOST_WIDE_INT padding_correction = 0;
2054       unsigned HOST_WIDE_INT bytes
2055         = int_size_in_bytes (TREE_TYPE (retval_rhs));
2056       int n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2057       unsigned int bitsize
2058         = MIN (TYPE_ALIGN (TREE_TYPE (retval_rhs)), BITS_PER_WORD);
2059       rtx *result_pseudos = alloca (sizeof (rtx) * n_regs);
2060       rtx result_reg, src = NULL_RTX, dst = NULL_RTX;
2061       rtx result_val = expand_expr (retval_rhs, NULL_RTX, VOIDmode, 0);
2062       enum machine_mode tmpmode, result_reg_mode;
2063
2064       if (bytes == 0)
2065         {
2066           expand_null_return ();
2067           return;
2068         }
2069
2070       /* If the structure doesn't take up a whole number of words, see
2071          whether the register value should be padded on the left or on
2072          the right.  Set PADDING_CORRECTION to the number of padding
2073          bits needed on the left side.
2074
2075          In most ABIs, the structure will be returned at the least end of
2076          the register, which translates to right padding on little-endian
2077          targets and left padding on big-endian targets.  The opposite
2078          holds if the structure is returned at the most significant
2079          end of the register.  */
2080       if (bytes % UNITS_PER_WORD != 0
2081           && (targetm.calls.return_in_msb (TREE_TYPE (retval_rhs))
2082               ? !BYTES_BIG_ENDIAN
2083               : BYTES_BIG_ENDIAN))
2084         padding_correction = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD)
2085                                                * BITS_PER_UNIT));
2086
2087       /* Copy the structure BITSIZE bits at a time.  */
2088       for (bitpos = 0, xbitpos = padding_correction;
2089            bitpos < bytes * BITS_PER_UNIT;
2090            bitpos += bitsize, xbitpos += bitsize)
2091         {
2092           /* We need a new destination pseudo each time xbitpos is
2093              on a word boundary and when xbitpos == padding_correction
2094              (the first time through).  */
2095           if (xbitpos % BITS_PER_WORD == 0
2096               || xbitpos == padding_correction)
2097             {
2098               /* Generate an appropriate register.  */
2099               dst = gen_reg_rtx (word_mode);
2100               result_pseudos[xbitpos / BITS_PER_WORD] = dst;
2101
2102               /* Clear the destination before we move anything into it.  */
2103               emit_move_insn (dst, CONST0_RTX (GET_MODE (dst)));
2104             }
2105
2106           /* We need a new source operand each time bitpos is on a word
2107              boundary.  */
2108           if (bitpos % BITS_PER_WORD == 0)
2109             src = operand_subword_force (result_val,
2110                                          bitpos / BITS_PER_WORD,
2111                                          BLKmode);
2112
2113           /* Use bitpos for the source extraction (left justified) and
2114              xbitpos for the destination store (right justified).  */
2115           store_bit_field (dst, bitsize, xbitpos % BITS_PER_WORD, word_mode,
2116                            extract_bit_field (src, bitsize,
2117                                               bitpos % BITS_PER_WORD, 1,
2118                                               NULL_RTX, word_mode, word_mode,
2119                                               BITS_PER_WORD),
2120                            BITS_PER_WORD);
2121         }
2122
2123       tmpmode = GET_MODE (result_rtl);
2124       if (tmpmode == BLKmode)
2125         {
2126           /* Find the smallest integer mode large enough to hold the
2127              entire structure and use that mode instead of BLKmode
2128              on the USE insn for the return register.  */
2129           for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
2130                tmpmode != VOIDmode;
2131                tmpmode = GET_MODE_WIDER_MODE (tmpmode))
2132             /* Have we found a large enough mode?  */
2133             if (GET_MODE_SIZE (tmpmode) >= bytes)
2134               break;
2135
2136           /* No suitable mode found.  */
2137           if (tmpmode == VOIDmode)
2138             abort ();
2139
2140           PUT_MODE (result_rtl, tmpmode);
2141         }
2142
2143       if (GET_MODE_SIZE (tmpmode) < GET_MODE_SIZE (word_mode))
2144         result_reg_mode = word_mode;
2145       else
2146         result_reg_mode = tmpmode;
2147       result_reg = gen_reg_rtx (result_reg_mode);
2148
2149       emit_queue ();
2150       for (i = 0; i < n_regs; i++)
2151         emit_move_insn (operand_subword (result_reg, i, 0, result_reg_mode),
2152                         result_pseudos[i]);
2153
2154       if (tmpmode != result_reg_mode)
2155         result_reg = gen_lowpart (tmpmode, result_reg);
2156
2157       expand_value_return (result_reg);
2158     }
2159   else if (retval_rhs != 0
2160            && !VOID_TYPE_P (TREE_TYPE (retval_rhs))
2161            && (REG_P (result_rtl)
2162                || (GET_CODE (result_rtl) == PARALLEL)))
2163     {
2164       /* Calculate the return value into a temporary (usually a pseudo
2165          reg).  */
2166       tree ot = TREE_TYPE (DECL_RESULT (current_function_decl));
2167       tree nt = build_qualified_type (ot, TYPE_QUALS (ot) | TYPE_QUAL_CONST);
2168
2169       val = assign_temp (nt, 0, 0, 1);
2170       val = expand_expr (retval_rhs, val, GET_MODE (val), 0);
2171       val = force_not_mem (val);
2172       emit_queue ();
2173       /* Return the calculated value.  */
2174       expand_value_return (shift_return_value (val));
2175     }
2176   else
2177     {
2178       /* No hard reg used; calculate value into hard return reg.  */
2179       expand_expr (retval, const0_rtx, VOIDmode, 0);
2180       emit_queue ();
2181       expand_value_return (result_rtl);
2182     }
2183 }
2184 \f
2185 /* Generate the RTL code for entering a binding contour.
2186    The variables are declared one by one, by calls to `expand_decl'.
2187
2188    FLAGS is a bitwise or of the following flags:
2189
2190      1 - Nonzero if this construct should be visible to
2191          `exit_something'.
2192
2193      2 - Nonzero if this contour does not require a
2194          NOTE_INSN_BLOCK_BEG note.  Virtually all calls from
2195          language-independent code should set this flag because they
2196          will not create corresponding BLOCK nodes.  (There should be
2197          a one-to-one correspondence between NOTE_INSN_BLOCK_BEG notes
2198          and BLOCKs.)  If this flag is set, MARK_ENDS should be zero
2199          when expand_end_bindings is called.
2200
2201     If we are creating a NOTE_INSN_BLOCK_BEG note, a BLOCK may
2202     optionally be supplied.  If so, it becomes the NOTE_BLOCK for the
2203     note.  */
2204
2205 void
2206 expand_start_bindings_and_block (int flags, tree block)
2207 {
2208   struct nesting *thisblock = ALLOC_NESTING ();
2209   rtx note;
2210   int exit_flag = ((flags & 1) != 0);
2211   int block_flag = ((flags & 2) == 0);
2212
2213   /* If a BLOCK is supplied, then the caller should be requesting a
2214      NOTE_INSN_BLOCK_BEG note.  */
2215   if (!block_flag && block)
2216     abort ();
2217
2218   /* Create a note to mark the beginning of the block.  */
2219   note = emit_note (NOTE_INSN_DELETED);
2220
2221   /* Make an entry on block_stack for the block we are entering.  */
2222
2223   thisblock->desc = BLOCK_NESTING;
2224   thisblock->next = block_stack;
2225   thisblock->all = nesting_stack;
2226   thisblock->depth = ++nesting_depth;
2227   thisblock->data.block.block_target_temp_slot_level = target_temp_slot_level;
2228
2229   thisblock->data.block.conditional_code = 0;
2230   thisblock->data.block.last_unconditional_cleanup = note;
2231   /* When we insert instructions after the last unconditional cleanup,
2232      we don't adjust last_insn.  That means that a later add_insn will
2233      clobber the instructions we've just added.  The easiest way to
2234      fix this is to just insert another instruction here, so that the
2235      instructions inserted after the last unconditional cleanup are
2236      never the last instruction.  */
2237   emit_note (NOTE_INSN_DELETED);
2238
2239   thisblock->data.block.first_insn = note;
2240   thisblock->data.block.block_start_count = ++current_block_start_count;
2241   thisblock->exit_label = exit_flag ? gen_label_rtx () : 0;
2242   block_stack = thisblock;
2243   nesting_stack = thisblock;
2244
2245   /* Make a new level for allocating stack slots.  */
2246   push_temp_slots ();
2247 }
2248
2249 /* Specify the scope of temporaries created by TARGET_EXPRs.  Similar
2250    to CLEANUP_POINT_EXPR, but handles cases when a series of calls to
2251    expand_expr are made.  After we end the region, we know that all
2252    space for all temporaries that were created by TARGET_EXPRs will be
2253    destroyed and their space freed for reuse.  */
2254
2255 void
2256 expand_start_target_temps (void)
2257 {
2258   /* This is so that even if the result is preserved, the space
2259      allocated will be freed, as we know that it is no longer in use.  */
2260   push_temp_slots ();
2261
2262   /* Start a new binding layer that will keep track of all cleanup
2263      actions to be performed.  */
2264   expand_start_bindings (2);
2265
2266   target_temp_slot_level = temp_slot_level;
2267 }
2268
2269 void
2270 expand_end_target_temps (void)
2271 {
2272   expand_end_bindings (NULL_TREE, 0, 0);
2273
2274   /* This is so that even if the result is preserved, the space
2275      allocated will be freed, as we know that it is no longer in use.  */
2276   pop_temp_slots ();
2277 }
2278
2279 /* Given a pointer to a BLOCK node return nonzero if (and only if) the node
2280    in question represents the outermost pair of curly braces (i.e. the "body
2281    block") of a function or method.
2282
2283    For any BLOCK node representing a "body block" of a function or method, the
2284    BLOCK_SUPERCONTEXT of the node will point to another BLOCK node which
2285    represents the outermost (function) scope for the function or method (i.e.
2286    the one which includes the formal parameters).  The BLOCK_SUPERCONTEXT of
2287    *that* node in turn will point to the relevant FUNCTION_DECL node.  */
2288
2289 int
2290 is_body_block (tree stmt)
2291 {
2292   if (lang_hooks.no_body_blocks)
2293     return 0;
2294
2295   if (TREE_CODE (stmt) == BLOCK)
2296     {
2297       tree parent = BLOCK_SUPERCONTEXT (stmt);
2298
2299       if (parent && TREE_CODE (parent) == BLOCK)
2300         {
2301           tree grandparent = BLOCK_SUPERCONTEXT (parent);
2302
2303           if (grandparent && TREE_CODE (grandparent) == FUNCTION_DECL)
2304             return 1;
2305         }
2306     }
2307
2308   return 0;
2309 }
2310
2311 /* True if we are currently emitting insns in an area of output code
2312    that is controlled by a conditional expression.  This is used by
2313    the cleanup handling code to generate conditional cleanup actions.  */
2314
2315 int
2316 conditional_context (void)
2317 {
2318   return block_stack && block_stack->data.block.conditional_code;
2319 }
2320
2321 /* Return an opaque pointer to the current nesting level, so frontend code
2322    can check its own sanity.  */
2323
2324 struct nesting *
2325 current_nesting_level (void)
2326 {
2327   return cfun ? block_stack : 0;
2328 }
2329
2330 /* Emit code to restore vital registers at the beginning of a nonlocal goto
2331    handler.  */
2332 static void
2333 expand_nl_goto_receiver (void)
2334 {
2335   /* Clobber the FP when we get here, so we have to make sure it's
2336      marked as used by this function.  */
2337   emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
2338
2339   /* Mark the static chain as clobbered here so life information
2340      doesn't get messed up for it.  */
2341   emit_insn (gen_rtx_CLOBBER (VOIDmode, static_chain_rtx));
2342
2343 #ifdef HAVE_nonlocal_goto
2344   if (! HAVE_nonlocal_goto)
2345 #endif
2346     /* First adjust our frame pointer to its actual value.  It was
2347        previously set to the start of the virtual area corresponding to
2348        the stacked variables when we branched here and now needs to be
2349        adjusted to the actual hardware fp value.
2350
2351        Assignments are to virtual registers are converted by
2352        instantiate_virtual_regs into the corresponding assignment
2353        to the underlying register (fp in this case) that makes
2354        the original assignment true.
2355        So the following insn will actually be
2356        decrementing fp by STARTING_FRAME_OFFSET.  */
2357     emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
2358
2359 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
2360   if (fixed_regs[ARG_POINTER_REGNUM])
2361     {
2362 #ifdef ELIMINABLE_REGS
2363       /* If the argument pointer can be eliminated in favor of the
2364          frame pointer, we don't need to restore it.  We assume here
2365          that if such an elimination is present, it can always be used.
2366          This is the case on all known machines; if we don't make this
2367          assumption, we do unnecessary saving on many machines.  */
2368       static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
2369       size_t i;
2370
2371       for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
2372         if (elim_regs[i].from == ARG_POINTER_REGNUM
2373             && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
2374           break;
2375
2376       if (i == ARRAY_SIZE (elim_regs))
2377 #endif
2378         {
2379           /* Now restore our arg pointer from the address at which it
2380              was saved in our stack frame.  */
2381           emit_move_insn (virtual_incoming_args_rtx,
2382                           copy_to_reg (get_arg_pointer_save_area (cfun)));
2383         }
2384     }
2385 #endif
2386
2387 #ifdef HAVE_nonlocal_goto_receiver
2388   if (HAVE_nonlocal_goto_receiver)
2389     emit_insn (gen_nonlocal_goto_receiver ());
2390 #endif
2391
2392   /* @@@ This is a kludge.  Not all machine descriptions define a blockage
2393      insn, but we must not allow the code we just generated to be reordered
2394      by scheduling.  Specifically, the update of the frame pointer must
2395      happen immediately, not later.  So emit an ASM_INPUT to act as blockage
2396      insn.  */
2397   emit_insn (gen_rtx_ASM_INPUT (VOIDmode, ""));
2398 }
2399
2400 /* Warn about any unused VARS (which may contain nodes other than
2401    VAR_DECLs, but such nodes are ignored).  The nodes are connected
2402    via the TREE_CHAIN field.  */
2403
2404 void
2405 warn_about_unused_variables (tree vars)
2406 {
2407   tree decl;
2408
2409   if (warn_unused_variable)
2410     for (decl = vars; decl; decl = TREE_CHAIN (decl))
2411       if (TREE_CODE (decl) == VAR_DECL
2412           && ! TREE_USED (decl)
2413           && ! DECL_IN_SYSTEM_HEADER (decl)
2414           && DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl))
2415         warning ("%Junused variable '%D'", decl, decl);
2416 }
2417
2418 /* Generate RTL code to terminate a binding contour.
2419
2420    VARS is the chain of VAR_DECL nodes for the variables bound in this
2421    contour.  There may actually be other nodes in this chain, but any
2422    nodes other than VAR_DECLS are ignored.
2423
2424    MARK_ENDS is nonzero if we should put a note at the beginning
2425    and end of this binding contour.
2426
2427    DONT_JUMP_IN is positive if it is not valid to jump into this contour,
2428    zero if we can jump into this contour only if it does not have a saved
2429    stack level, and negative if we are not to check for invalid use of
2430    labels (because the front end does that).  */
2431
2432 void
2433 expand_end_bindings (tree vars, int mark_ends ATTRIBUTE_UNUSED,
2434                      int dont_jump_in ATTRIBUTE_UNUSED)
2435 {
2436   struct nesting *thisblock = block_stack;
2437
2438   /* If any of the variables in this scope were not used, warn the
2439      user.  */
2440   warn_about_unused_variables (vars);
2441
2442   if (thisblock->exit_label)
2443     {
2444       do_pending_stack_adjust ();
2445       emit_label (thisblock->exit_label);
2446     }
2447
2448   /* Mark the beginning and end of the scope if requested.  */
2449
2450   /* Get rid of the beginning-mark if we don't make an end-mark.  */
2451   NOTE_LINE_NUMBER (thisblock->data.block.first_insn) = NOTE_INSN_DELETED;
2452
2453   /* Restore the temporary level of TARGET_EXPRs.  */
2454   target_temp_slot_level = thisblock->data.block.block_target_temp_slot_level;
2455
2456   /* Restore block_stack level for containing block.  */
2457
2458   POPSTACK (block_stack);
2459
2460   /* Pop the stack slot nesting and free any slots at this level.  */
2461   pop_temp_slots ();
2462 }
2463 \f
2464 /* Generate RTL for the automatic variable declaration DECL.
2465    (Other kinds of declarations are simply ignored if seen here.)  */
2466
2467 void
2468 expand_decl (tree decl)
2469 {
2470   tree type;
2471
2472   type = TREE_TYPE (decl);
2473
2474   /* For a CONST_DECL, set mode, alignment, and sizes from those of the
2475      type in case this node is used in a reference.  */
2476   if (TREE_CODE (decl) == CONST_DECL)
2477     {
2478       DECL_MODE (decl) = TYPE_MODE (type);
2479       DECL_ALIGN (decl) = TYPE_ALIGN (type);
2480       DECL_SIZE (decl) = TYPE_SIZE (type);
2481       DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (type);
2482       return;
2483     }
2484
2485   /* Otherwise, only automatic variables need any expansion done.  Static and
2486      external variables, and external functions, will be handled by
2487      `assemble_variable' (called from finish_decl).  TYPE_DECL requires
2488      nothing.  PARM_DECLs are handled in `assign_parms'.  */
2489   if (TREE_CODE (decl) != VAR_DECL)
2490     return;
2491
2492   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
2493     return;
2494
2495   /* Create the RTL representation for the variable.  */
2496
2497   if (type == error_mark_node)
2498     SET_DECL_RTL (decl, gen_rtx_MEM (BLKmode, const0_rtx));
2499
2500   else if (DECL_SIZE (decl) == 0)
2501     /* Variable with incomplete type.  */
2502     {
2503       rtx x;
2504       if (DECL_INITIAL (decl) == 0)
2505         /* Error message was already done; now avoid a crash.  */
2506         x = gen_rtx_MEM (BLKmode, const0_rtx);
2507       else
2508         /* An initializer is going to decide the size of this array.
2509            Until we know the size, represent its address with a reg.  */
2510         x = gen_rtx_MEM (BLKmode, gen_reg_rtx (Pmode));
2511
2512       set_mem_attributes (x, decl, 1);
2513       SET_DECL_RTL (decl, x);
2514     }
2515   else if (use_register_for_decl (decl))
2516     {
2517       /* Automatic variable that can go in a register.  */
2518       int unsignedp = TYPE_UNSIGNED (type);
2519       enum machine_mode reg_mode
2520         = promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
2521
2522       SET_DECL_RTL (decl, gen_reg_rtx (reg_mode));
2523
2524       /* Note if the object is a user variable.  */
2525       if (!DECL_ARTIFICIAL (decl))
2526         {
2527           mark_user_reg (DECL_RTL (decl));
2528
2529           /* Trust user variables which have a pointer type to really
2530              be pointers.  Do not trust compiler generated temporaries
2531              as our type system is totally busted as it relates to
2532              pointer arithmetic which translates into lots of compiler
2533              generated objects with pointer types, but which are not really
2534              pointers.  */
2535           if (POINTER_TYPE_P (type))
2536             mark_reg_pointer (DECL_RTL (decl),
2537                               TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
2538         }
2539
2540       maybe_set_unchanging (DECL_RTL (decl), decl);
2541     }
2542
2543   else if (TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
2544            && ! (flag_stack_check && ! STACK_CHECK_BUILTIN
2545                  && 0 < compare_tree_int (DECL_SIZE_UNIT (decl),
2546                                           STACK_CHECK_MAX_VAR_SIZE)))
2547     {
2548       /* Variable of fixed size that goes on the stack.  */
2549       rtx oldaddr = 0;
2550       rtx addr;
2551       rtx x;
2552
2553       /* If we previously made RTL for this decl, it must be an array
2554          whose size was determined by the initializer.
2555          The old address was a register; set that register now
2556          to the proper address.  */
2557       if (DECL_RTL_SET_P (decl))
2558         {
2559           if (!MEM_P (DECL_RTL (decl))
2560               || !REG_P (XEXP (DECL_RTL (decl), 0)))
2561             abort ();
2562           oldaddr = XEXP (DECL_RTL (decl), 0);
2563         }
2564
2565       /* Set alignment we actually gave this decl.  */
2566       DECL_ALIGN (decl) = (DECL_MODE (decl) == BLKmode ? BIGGEST_ALIGNMENT
2567                            : GET_MODE_BITSIZE (DECL_MODE (decl)));
2568       DECL_USER_ALIGN (decl) = 0;
2569
2570       x = assign_temp (decl, 1, 1, 1);
2571       set_mem_attributes (x, decl, 1);
2572       SET_DECL_RTL (decl, x);
2573
2574       if (oldaddr)
2575         {
2576           addr = force_operand (XEXP (DECL_RTL (decl), 0), oldaddr);
2577           if (addr != oldaddr)
2578             emit_move_insn (oldaddr, addr);
2579         }
2580     }
2581   else
2582     /* Dynamic-size object: must push space on the stack.  */
2583     {
2584       rtx address, size, x;
2585
2586       /* Record the stack pointer on entry to block, if have
2587          not already done so.  */
2588       do_pending_stack_adjust ();
2589
2590       /* Compute the variable's size, in bytes.  This will expand any
2591          needed SAVE_EXPRs for the first time.  */
2592       size = expand_expr (DECL_SIZE_UNIT (decl), NULL_RTX, VOIDmode, 0);
2593       free_temp_slots ();
2594
2595       /* Allocate space on the stack for the variable.  Note that
2596          DECL_ALIGN says how the variable is to be aligned and we
2597          cannot use it to conclude anything about the alignment of
2598          the size.  */
2599       address = allocate_dynamic_stack_space (size, NULL_RTX,
2600                                               TYPE_ALIGN (TREE_TYPE (decl)));
2601
2602       /* Reference the variable indirect through that rtx.  */
2603       x = gen_rtx_MEM (DECL_MODE (decl), address);
2604       set_mem_attributes (x, decl, 1);
2605       SET_DECL_RTL (decl, x);
2606
2607
2608       /* Indicate the alignment we actually gave this variable.  */
2609 #ifdef STACK_BOUNDARY
2610       DECL_ALIGN (decl) = STACK_BOUNDARY;
2611 #else
2612       DECL_ALIGN (decl) = BIGGEST_ALIGNMENT;
2613 #endif
2614       DECL_USER_ALIGN (decl) = 0;
2615     }
2616 }
2617 \f
2618 /* Emit code to allocate T_SIZE bytes of dynamic stack space for ALLOC.  */
2619 void
2620 expand_stack_alloc (tree alloc, tree t_size)
2621 {
2622   rtx address, dest, size;
2623   tree var, type;
2624
2625   if (TREE_CODE (alloc) != ADDR_EXPR)
2626     abort ();
2627   var = TREE_OPERAND (alloc, 0);
2628   if (TREE_CODE (var) != VAR_DECL)
2629     abort ();
2630
2631   type = TREE_TYPE (var);
2632
2633   /* Compute the variable's size, in bytes.  */
2634   size = expand_expr (t_size, NULL_RTX, VOIDmode, 0);
2635   free_temp_slots ();
2636
2637   /* Allocate space on the stack for the variable.  */
2638   address = XEXP (DECL_RTL (var), 0);
2639   dest = allocate_dynamic_stack_space (size, address, TYPE_ALIGN (type));
2640   if (dest != address)
2641     emit_move_insn (address, dest);
2642
2643   /* Indicate the alignment we actually gave this variable.  */
2644 #ifdef STACK_BOUNDARY
2645   DECL_ALIGN (var) = STACK_BOUNDARY;
2646 #else
2647   DECL_ALIGN (var) = BIGGEST_ALIGNMENT;
2648 #endif
2649   DECL_USER_ALIGN (var) = 0;
2650 }
2651
2652 /* Emit code to save the current value of stack.  */
2653 rtx
2654 expand_stack_save (void)
2655 {
2656   rtx ret = NULL_RTX;
2657
2658   do_pending_stack_adjust ();
2659   emit_stack_save (SAVE_BLOCK, &ret, NULL_RTX);
2660   return ret;
2661 }
2662
2663 /* Emit code to restore the current value of stack.  */
2664 void
2665 expand_stack_restore (tree var)
2666 {
2667   rtx sa = DECL_RTL (var);
2668
2669   emit_stack_restore (SAVE_BLOCK, sa, NULL_RTX);
2670 }
2671 \f
2672 /* Emit code to perform the initialization of a declaration DECL.  */
2673
2674 void
2675 expand_decl_init (tree decl)
2676 {
2677   int was_used = TREE_USED (decl);
2678
2679   /* If this is a CONST_DECL, we don't have to generate any code.  Likewise
2680      for static decls.  */
2681   if (TREE_CODE (decl) == CONST_DECL
2682       || TREE_STATIC (decl))
2683     return;
2684
2685   /* Compute and store the initial value now.  */
2686
2687   push_temp_slots ();
2688
2689   if (DECL_INITIAL (decl) == error_mark_node)
2690     {
2691       enum tree_code code = TREE_CODE (TREE_TYPE (decl));
2692
2693       if (code == INTEGER_TYPE || code == REAL_TYPE || code == ENUMERAL_TYPE
2694           || code == POINTER_TYPE || code == REFERENCE_TYPE)
2695         expand_assignment (decl, convert (TREE_TYPE (decl), integer_zero_node),
2696                            0);
2697       emit_queue ();
2698     }
2699   else if (DECL_INITIAL (decl) && TREE_CODE (DECL_INITIAL (decl)) != TREE_LIST)
2700     {
2701       emit_line_note (DECL_SOURCE_LOCATION (decl));
2702       expand_assignment (decl, DECL_INITIAL (decl), 0);
2703       emit_queue ();
2704     }
2705
2706   /* Don't let the initialization count as "using" the variable.  */
2707   TREE_USED (decl) = was_used;
2708
2709   /* Free any temporaries we made while initializing the decl.  */
2710   preserve_temp_slots (NULL_RTX);
2711   free_temp_slots ();
2712   pop_temp_slots ();
2713 }
2714
2715 \f
2716 /* DECL is an anonymous union.  CLEANUP is a cleanup for DECL.
2717    DECL_ELTS is the list of elements that belong to DECL's type.
2718    In each, the TREE_VALUE is a VAR_DECL, and the TREE_PURPOSE a cleanup.  */
2719
2720 void
2721 expand_anon_union_decl (tree decl, tree cleanup ATTRIBUTE_UNUSED,
2722                         tree decl_elts)
2723 {
2724   rtx x;
2725   tree t;
2726
2727   /* If any of the elements are addressable, so is the entire union.  */
2728   for (t = decl_elts; t; t = TREE_CHAIN (t))
2729     if (TREE_ADDRESSABLE (TREE_VALUE (t)))
2730       {
2731         TREE_ADDRESSABLE (decl) = 1;
2732         break;
2733       }
2734
2735   expand_decl (decl);
2736   x = DECL_RTL (decl);
2737
2738   /* Go through the elements, assigning RTL to each.  */
2739   for (t = decl_elts; t; t = TREE_CHAIN (t))
2740     {
2741       tree decl_elt = TREE_VALUE (t);
2742       enum machine_mode mode = TYPE_MODE (TREE_TYPE (decl_elt));
2743
2744       /* If any of the elements are addressable, so is the entire
2745          union.  */
2746       if (TREE_USED (decl_elt))
2747         TREE_USED (decl) = 1;
2748
2749       /* Propagate the union's alignment to the elements.  */
2750       DECL_ALIGN (decl_elt) = DECL_ALIGN (decl);
2751       DECL_USER_ALIGN (decl_elt) = DECL_USER_ALIGN (decl);
2752
2753       /* If the element has BLKmode and the union doesn't, the union is
2754          aligned such that the element doesn't need to have BLKmode, so
2755          change the element's mode to the appropriate one for its size.  */
2756       if (mode == BLKmode && DECL_MODE (decl) != BLKmode)
2757         DECL_MODE (decl_elt) = mode
2758           = mode_for_size_tree (DECL_SIZE (decl_elt), MODE_INT, 1);
2759
2760       /* (SUBREG (MEM ...)) at RTL generation time is invalid, so we
2761          instead create a new MEM rtx with the proper mode.  */
2762       if (MEM_P (x))
2763         {
2764           if (mode == GET_MODE (x))
2765             SET_DECL_RTL (decl_elt, x);
2766           else
2767             SET_DECL_RTL (decl_elt, adjust_address_nv (x, mode, 0));
2768         }
2769       else if (REG_P (x))
2770         {
2771           if (mode == GET_MODE (x))
2772             SET_DECL_RTL (decl_elt, x);
2773           else
2774             SET_DECL_RTL (decl_elt, gen_lowpart_SUBREG (mode, x));
2775         }
2776       else
2777         abort ();
2778     }
2779 }
2780 \f
2781 /* Enter a case (Pascal) or switch (C) statement.
2782    Push a block onto case_stack and nesting_stack
2783    to accumulate the case-labels that are seen
2784    and to record the labels generated for the statement.
2785
2786    EXIT_FLAG is nonzero if `exit_something' should exit this case stmt.
2787    Otherwise, this construct is transparent for `exit_something'.
2788
2789    EXPR is the index-expression to be dispatched on.
2790    TYPE is its nominal type.  We could simply convert EXPR to this type,
2791    but instead we take short cuts.  */
2792
2793 void
2794 expand_start_case (int exit_flag, tree expr, tree type,
2795                    const char *printname)
2796 {
2797   struct nesting *thiscase = ALLOC_NESTING ();
2798
2799   /* Make an entry on case_stack for the case we are entering.  */
2800
2801   thiscase->desc = CASE_NESTING;
2802   thiscase->next = case_stack;
2803   thiscase->all = nesting_stack;
2804   thiscase->depth = ++nesting_depth;
2805   thiscase->exit_label = exit_flag ? gen_label_rtx () : 0;
2806   thiscase->data.case_stmt.case_list = 0;
2807   thiscase->data.case_stmt.index_expr = expr;
2808   thiscase->data.case_stmt.nominal_type = type;
2809   thiscase->data.case_stmt.default_label = 0;
2810   thiscase->data.case_stmt.printname = printname;
2811   thiscase->data.case_stmt.line_number_status = force_line_numbers ();
2812   case_stack = thiscase;
2813   nesting_stack = thiscase;
2814
2815   do_pending_stack_adjust ();
2816   emit_queue ();
2817
2818   /* Make sure case_stmt.start points to something that won't
2819      need any transformation before expand_end_case.  */
2820   if (GET_CODE (get_last_insn ()) != NOTE)
2821     emit_note (NOTE_INSN_DELETED);
2822
2823   thiscase->data.case_stmt.start = get_last_insn ();
2824 }
2825
2826 /* Accumulate one case or default label inside a case or switch statement.
2827    VALUE is the value of the case (a null pointer, for a default label).
2828    The function CONVERTER, when applied to arguments T and V,
2829    converts the value V to the type T.
2830
2831    If not currently inside a case or switch statement, return 1 and do
2832    nothing.  The caller will print a language-specific error message.
2833    If VALUE is a duplicate or overlaps, return 2 and do nothing
2834    except store the (first) duplicate node in *DUPLICATE.
2835    If VALUE is out of range, return 3 and do nothing.
2836    Return 0 on success.
2837
2838    Extended to handle range statements.  */
2839
2840 int
2841 pushcase (tree value, tree (*converter) (tree, tree), tree label,
2842           tree *duplicate)
2843 {
2844   tree index_type;
2845   tree nominal_type;
2846
2847   /* Fail if not inside a real case statement.  */
2848   if (! (case_stack && case_stack->data.case_stmt.start))
2849     return 1;
2850
2851   index_type = TREE_TYPE (case_stack->data.case_stmt.index_expr);
2852   nominal_type = case_stack->data.case_stmt.nominal_type;
2853
2854   /* If the index is erroneous, avoid more problems: pretend to succeed.  */
2855   if (index_type == error_mark_node)
2856     return 0;
2857
2858   /* Convert VALUE to the type in which the comparisons are nominally done.  */
2859   if (value != 0)
2860     value = (*converter) (nominal_type, value);
2861
2862   /* Fail if this value is out of range for the actual type of the index
2863      (which may be narrower than NOMINAL_TYPE).  */
2864   if (value != 0
2865       && (TREE_CONSTANT_OVERFLOW (value)
2866           || ! int_fits_type_p (value, index_type)))
2867     return 3;
2868
2869   return add_case_node (value, value, label, duplicate, false);
2870 }
2871
2872 /* Like pushcase but this case applies to all values between VALUE1 and
2873    VALUE2 (inclusive).  If VALUE1 is NULL, the range starts at the lowest
2874    value of the index type and ends at VALUE2.  If VALUE2 is NULL, the range
2875    starts at VALUE1 and ends at the highest value of the index type.
2876    If both are NULL, this case applies to all values.
2877
2878    The return value is the same as that of pushcase but there is one
2879    additional error code: 4 means the specified range was empty.  */
2880
2881 int
2882 pushcase_range (tree value1, tree value2, tree (*converter) (tree, tree),
2883                 tree label, tree *duplicate)
2884 {
2885   tree index_type;
2886   tree nominal_type;
2887
2888   /* Fail if not inside a real case statement.  */
2889   if (! (case_stack && case_stack->data.case_stmt.start))
2890     return 1;
2891
2892   index_type = TREE_TYPE (case_stack->data.case_stmt.index_expr);
2893   nominal_type = case_stack->data.case_stmt.nominal_type;
2894
2895   /* If the index is erroneous, avoid more problems: pretend to succeed.  */
2896   if (index_type == error_mark_node)
2897     return 0;
2898
2899   /* Convert VALUEs to type in which the comparisons are nominally done
2900      and replace any unspecified value with the corresponding bound.  */
2901   if (value1 == 0)
2902     value1 = TYPE_MIN_VALUE (index_type);
2903   if (value2 == 0)
2904     value2 = TYPE_MAX_VALUE (index_type);
2905
2906   /* Fail if the range is empty.  Do this before any conversion since
2907      we want to allow out-of-range empty ranges.  */
2908   if (value2 != 0 && tree_int_cst_lt (value2, value1))
2909     return 4;
2910
2911   /* If the max was unbounded, use the max of the nominal_type we are
2912      converting to.  Do this after the < check above to suppress false
2913      positives.  */
2914   if (value2 == 0)
2915     value2 = TYPE_MAX_VALUE (nominal_type);
2916
2917   value1 = (*converter) (nominal_type, value1);
2918   value2 = (*converter) (nominal_type, value2);
2919
2920   /* Fail if these values are out of range.  */
2921   if (TREE_CONSTANT_OVERFLOW (value1)
2922       || ! int_fits_type_p (value1, index_type))
2923     return 3;
2924
2925   if (TREE_CONSTANT_OVERFLOW (value2)
2926       || ! int_fits_type_p (value2, index_type))
2927     return 3;
2928
2929   return add_case_node (value1, value2, label, duplicate, false);
2930 }
2931
2932 /* Do the actual insertion of a case label for pushcase and pushcase_range
2933    into case_stack->data.case_stmt.case_list.  Use an AVL tree to avoid
2934    slowdown for large switch statements.  */
2935
2936 int
2937 add_case_node (tree low, tree high, tree label, tree *duplicate,
2938                bool dont_expand_label)
2939 {
2940   struct case_node *p, **q, *r;
2941
2942   /* If there's no HIGH value, then this is not a case range; it's
2943      just a simple case label.  But that's just a degenerate case
2944      range.  */
2945   if (!high)
2946     high = low;
2947
2948   /* Handle default labels specially.  */
2949   if (!high && !low)
2950     {
2951       if (case_stack->data.case_stmt.default_label != 0)
2952         {
2953           *duplicate = case_stack->data.case_stmt.default_label;
2954           return 2;
2955         }
2956       case_stack->data.case_stmt.default_label = label;
2957       if (!dont_expand_label)
2958         expand_label (label);
2959       return 0;
2960     }
2961
2962   q = &case_stack->data.case_stmt.case_list;
2963   p = *q;
2964
2965   while ((r = *q))
2966     {
2967       p = r;
2968
2969       /* Keep going past elements distinctly greater than HIGH.  */
2970       if (tree_int_cst_lt (high, p->low))
2971         q = &p->left;
2972
2973       /* or distinctly less than LOW.  */
2974       else if (tree_int_cst_lt (p->high, low))
2975         q = &p->right;
2976
2977       else
2978         {
2979           /* We have an overlap; this is an error.  */
2980           *duplicate = p->code_label;
2981           return 2;
2982         }
2983     }
2984
2985   /* Add this label to the chain, and succeed.  */
2986
2987   r = ggc_alloc (sizeof (struct case_node));
2988   r->low = low;
2989
2990   /* If the bounds are equal, turn this into the one-value case.  */
2991   if (tree_int_cst_equal (low, high))
2992     r->high = r->low;
2993   else
2994     r->high = high;
2995
2996   r->code_label = label;
2997   if (!dont_expand_label)
2998     expand_label (label);
2999
3000   *q = r;
3001   r->parent = p;
3002   r->left = 0;
3003   r->right = 0;
3004   r->balance = 0;
3005
3006   while (p)
3007     {
3008       struct case_node *s;
3009
3010       if (r == p->left)
3011         {
3012           int b;
3013
3014           if (! (b = p->balance))
3015             /* Growth propagation from left side.  */
3016             p->balance = -1;
3017           else if (b < 0)
3018             {
3019               if (r->balance < 0)
3020                 {
3021                   /* R-Rotation */
3022                   if ((p->left = s = r->right))
3023                     s->parent = p;
3024
3025                   r->right = p;
3026                   p->balance = 0;
3027                   r->balance = 0;
3028                   s = p->parent;
3029                   p->parent = r;
3030
3031                   if ((r->parent = s))
3032                     {
3033                       if (s->left == p)
3034                         s->left = r;
3035                       else
3036                         s->right = r;
3037                     }
3038                   else
3039                     case_stack->data.case_stmt.case_list = r;
3040                 }
3041               else
3042                 /* r->balance == +1 */
3043                 {
3044                   /* LR-Rotation */
3045
3046                   int b2;
3047                   struct case_node *t = r->right;
3048
3049                   if ((p->left = s = t->right))
3050                     s->parent = p;
3051
3052                   t->right = p;
3053                   if ((r->right = s = t->left))
3054                     s->parent = r;
3055
3056                   t->left = r;
3057                   b = t->balance;
3058                   b2 = b < 0;
3059                   p->balance = b2;
3060                   b2 = -b2 - b;
3061                   r->balance = b2;
3062                   t->balance = 0;
3063                   s = p->parent;
3064                   p->parent = t;
3065                   r->parent = t;
3066
3067                   if ((t->parent = s))
3068                     {
3069                       if (s->left == p)
3070                         s->left = t;
3071                       else
3072                         s->right = t;
3073                     }
3074                   else
3075                     case_stack->data.case_stmt.case_list = t;
3076                 }
3077               break;
3078             }
3079
3080           else
3081             {
3082               /* p->balance == +1; growth of left side balances the node.  */
3083               p->balance = 0;
3084               break;
3085             }
3086         }
3087       else
3088         /* r == p->right */
3089         {
3090           int b;
3091
3092           if (! (b = p->balance))
3093             /* Growth propagation from right side.  */
3094             p->balance++;
3095           else if (b > 0)
3096             {
3097               if (r->balance > 0)
3098                 {
3099                   /* L-Rotation */
3100
3101                   if ((p->right = s = r->left))
3102                     s->parent = p;
3103
3104                   r->left = p;
3105                   p->balance = 0;
3106                   r->balance = 0;
3107                   s = p->parent;
3108                   p->parent = r;
3109                   if ((r->parent = s))
3110                     {
3111                       if (s->left == p)
3112                         s->left = r;
3113                       else
3114                         s->right = r;
3115                     }
3116
3117                   else
3118                     case_stack->data.case_stmt.case_list = r;
3119                 }
3120
3121               else
3122                 /* r->balance == -1 */
3123                 {
3124                   /* RL-Rotation */
3125                   int b2;
3126                   struct case_node *t = r->left;
3127
3128                   if ((p->right = s = t->left))
3129                     s->parent = p;
3130
3131                   t->left = p;
3132
3133                   if ((r->left = s = t->right))
3134                     s->parent = r;
3135
3136                   t->right = r;
3137                   b = t->balance;
3138                   b2 = b < 0;
3139                   r->balance = b2;
3140                   b2 = -b2 - b;
3141                   p->balance = b2;
3142                   t->balance = 0;
3143                   s = p->parent;
3144                   p->parent = t;
3145                   r->parent = t;
3146
3147                   if ((t->parent = s))
3148                     {
3149                       if (s->left == p)
3150                         s->left = t;
3151                       else
3152                         s->right = t;
3153                     }
3154
3155                   else
3156                     case_stack->data.case_stmt.case_list = t;
3157                 }
3158               break;
3159             }
3160           else
3161             {
3162               /* p->balance == -1; growth of right side balances the node.  */
3163               p->balance = 0;
3164               break;
3165             }
3166         }
3167
3168       r = p;
3169       p = p->parent;
3170     }
3171
3172   return 0;
3173 }
3174 \f
3175 /* Maximum number of case bit tests.  */
3176 #define MAX_CASE_BIT_TESTS  3
3177
3178 /* By default, enable case bit tests on targets with ashlsi3.  */
3179 #ifndef CASE_USE_BIT_TESTS
3180 #define CASE_USE_BIT_TESTS  (ashl_optab->handlers[word_mode].insn_code \
3181                              != CODE_FOR_nothing)
3182 #endif
3183
3184
3185 /* A case_bit_test represents a set of case nodes that may be
3186    selected from using a bit-wise comparison.  HI and LO hold
3187    the integer to be tested against, LABEL contains the label
3188    to jump to upon success and BITS counts the number of case
3189    nodes handled by this test, typically the number of bits
3190    set in HI:LO.  */
3191
3192 struct case_bit_test
3193 {
3194   HOST_WIDE_INT hi;
3195   HOST_WIDE_INT lo;
3196   rtx label;
3197   int bits;
3198 };
3199
3200 /* Determine whether "1 << x" is relatively cheap in word_mode.  */
3201
3202 static
3203 bool lshift_cheap_p (void)
3204 {
3205   static bool init = false;
3206   static bool cheap = true;
3207
3208   if (!init)
3209     {
3210       rtx reg = gen_rtx_REG (word_mode, 10000);
3211       int cost = rtx_cost (gen_rtx_ASHIFT (word_mode, const1_rtx, reg), SET);
3212       cheap = cost < COSTS_N_INSNS (3);
3213       init = true;
3214     }
3215
3216   return cheap;
3217 }
3218
3219 /* Comparison function for qsort to order bit tests by decreasing
3220    number of case nodes, i.e. the node with the most cases gets
3221    tested first.  */
3222
3223 static int
3224 case_bit_test_cmp (const void *p1, const void *p2)
3225 {
3226   const struct case_bit_test *d1 = p1;
3227   const struct case_bit_test *d2 = p2;
3228
3229   return d2->bits - d1->bits;
3230 }
3231
3232 /*  Expand a switch statement by a short sequence of bit-wise
3233     comparisons.  "switch(x)" is effectively converted into
3234     "if ((1 << (x-MINVAL)) & CST)" where CST and MINVAL are
3235     integer constants.
3236
3237     INDEX_EXPR is the value being switched on, which is of
3238     type INDEX_TYPE.  MINVAL is the lowest case value of in
3239     the case nodes, of INDEX_TYPE type, and RANGE is highest
3240     value minus MINVAL, also of type INDEX_TYPE.  NODES is
3241     the set of case nodes, and DEFAULT_LABEL is the label to
3242     branch to should none of the cases match.
3243
3244     There *MUST* be MAX_CASE_BIT_TESTS or less unique case
3245     node targets.  */
3246
3247 static void
3248 emit_case_bit_tests (tree index_type, tree index_expr, tree minval,
3249                      tree range, case_node_ptr nodes, rtx default_label)
3250 {
3251   struct case_bit_test test[MAX_CASE_BIT_TESTS];
3252   enum machine_mode mode;
3253   rtx expr, index, label;
3254   unsigned int i,j,lo,hi;
3255   struct case_node *n;
3256   unsigned int count;
3257
3258   count = 0;
3259   for (n = nodes; n; n = n->right)
3260     {
3261       label = label_rtx (n->code_label);
3262       for (i = 0; i < count; i++)
3263         if (same_case_target_p (label, test[i].label))
3264           break;
3265
3266       if (i == count)
3267         {
3268           if (count >= MAX_CASE_BIT_TESTS)
3269             abort ();
3270           test[i].hi = 0;
3271           test[i].lo = 0;
3272           test[i].label = label;
3273           test[i].bits = 1;
3274           count++;
3275         }
3276       else
3277         test[i].bits++;
3278
3279       lo = tree_low_cst (fold (build (MINUS_EXPR, index_type,
3280                                       n->low, minval)), 1);
3281       hi = tree_low_cst (fold (build (MINUS_EXPR, index_type,
3282                                       n->high, minval)), 1);
3283       for (j = lo; j <= hi; j++)
3284         if (j >= HOST_BITS_PER_WIDE_INT)
3285           test[i].hi |= (HOST_WIDE_INT) 1 << (j - HOST_BITS_PER_INT);
3286         else
3287           test[i].lo |= (HOST_WIDE_INT) 1 << j;
3288     }
3289
3290   qsort (test, count, sizeof(*test), case_bit_test_cmp);
3291
3292   index_expr = fold (build (MINUS_EXPR, index_type,
3293                             convert (index_type, index_expr),
3294                             convert (index_type, minval)));
3295   index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
3296   emit_queue ();
3297   index = protect_from_queue (index, 0);
3298   do_pending_stack_adjust ();
3299
3300   mode = TYPE_MODE (index_type);
3301   expr = expand_expr (range, NULL_RTX, VOIDmode, 0);
3302   emit_cmp_and_jump_insns (index, expr, GTU, NULL_RTX, mode, 1,
3303                            default_label);
3304
3305   index = convert_to_mode (word_mode, index, 0);
3306   index = expand_binop (word_mode, ashl_optab, const1_rtx,
3307                         index, NULL_RTX, 1, OPTAB_WIDEN);
3308
3309   for (i = 0; i < count; i++)
3310     {
3311       expr = immed_double_const (test[i].lo, test[i].hi, word_mode);
3312       expr = expand_binop (word_mode, and_optab, index, expr,
3313                            NULL_RTX, 1, OPTAB_WIDEN);
3314       emit_cmp_and_jump_insns (expr, const0_rtx, NE, NULL_RTX,
3315                                word_mode, 1, test[i].label);
3316     }
3317
3318   emit_jump (default_label);
3319 }
3320
3321 #ifndef HAVE_casesi
3322 #define HAVE_casesi 0
3323 #endif
3324
3325 #ifndef HAVE_tablejump
3326 #define HAVE_tablejump 0
3327 #endif
3328
3329 /* Terminate a case (Pascal) or switch (C) statement
3330    in which ORIG_INDEX is the expression to be tested.
3331    If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
3332    type as given in the source before any compiler conversions.
3333    Generate the code to test it and jump to the right place.  */
3334
3335 void
3336 expand_end_case_type (tree orig_index, tree orig_type)
3337 {
3338   tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE;
3339   rtx default_label = 0;
3340   struct case_node *n, *m;
3341   unsigned int count, uniq;
3342   rtx index;
3343   rtx table_label;
3344   int ncases;
3345   rtx *labelvec;
3346   int i;
3347   rtx before_case, end, lab;
3348   struct nesting *thiscase = case_stack;
3349   tree index_expr, index_type;
3350   bool exit_done = false;
3351   int unsignedp;
3352
3353   /* Don't crash due to previous errors.  */
3354   if (thiscase == NULL)
3355     return;
3356
3357   index_expr = thiscase->data.case_stmt.index_expr;
3358   index_type = TREE_TYPE (index_expr);
3359   unsignedp = TYPE_UNSIGNED (index_type);
3360   if (orig_type == NULL)
3361     orig_type = TREE_TYPE (orig_index);
3362
3363   do_pending_stack_adjust ();
3364
3365   /* An ERROR_MARK occurs for various reasons including invalid data type.  */
3366   if (index_type != error_mark_node)
3367     {
3368       /* If we don't have a default-label, create one here,
3369          after the body of the switch.  */
3370       if (thiscase->data.case_stmt.default_label == 0)
3371         {
3372           thiscase->data.case_stmt.default_label
3373             = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
3374           /* Share the exit label if possible.  */
3375           if (thiscase->exit_label)
3376             {
3377               SET_DECL_RTL (thiscase->data.case_stmt.default_label,
3378                             thiscase->exit_label);
3379               exit_done = true;
3380             }
3381           expand_label (thiscase->data.case_stmt.default_label);
3382         }
3383       default_label = label_rtx (thiscase->data.case_stmt.default_label);
3384
3385       before_case = get_last_insn ();
3386
3387       if (thiscase->data.case_stmt.case_list
3388           && thiscase->data.case_stmt.case_list->left)
3389         thiscase->data.case_stmt.case_list
3390           = case_tree2list (thiscase->data.case_stmt.case_list, 0);
3391
3392       /* Simplify the case-list before we count it.  */
3393       group_case_nodes (thiscase->data.case_stmt.case_list);
3394       strip_default_case_nodes (&thiscase->data.case_stmt.case_list,
3395                                 default_label);
3396
3397       /* Get upper and lower bounds of case values.
3398          Also convert all the case values to the index expr's data type.  */
3399
3400       uniq = 0;
3401       count = 0;
3402       for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
3403         {
3404           /* Check low and high label values are integers.  */
3405           if (TREE_CODE (n->low) != INTEGER_CST)
3406             abort ();
3407           if (TREE_CODE (n->high) != INTEGER_CST)
3408             abort ();
3409
3410           n->low = convert (index_type, n->low);
3411           n->high = convert (index_type, n->high);
3412
3413           /* Count the elements and track the largest and smallest
3414              of them (treating them as signed even if they are not).  */
3415           if (count++ == 0)
3416             {
3417               minval = n->low;
3418               maxval = n->high;
3419             }
3420           else
3421             {
3422               if (INT_CST_LT (n->low, minval))
3423                 minval = n->low;
3424               if (INT_CST_LT (maxval, n->high))
3425                 maxval = n->high;
3426             }
3427           /* A range counts double, since it requires two compares.  */
3428           if (! tree_int_cst_equal (n->low, n->high))
3429             count++;
3430
3431           /* Count the number of unique case node targets.  */
3432           uniq++;
3433           lab = label_rtx (n->code_label);
3434           for (m = thiscase->data.case_stmt.case_list; m != n; m = m->right)
3435             if (same_case_target_p (label_rtx (m->code_label), lab))
3436               {
3437                 uniq--;
3438                 break;
3439               }
3440         }
3441
3442       /* Compute span of values.  */
3443       if (count != 0)
3444         range = fold (build (MINUS_EXPR, index_type, maxval, minval));
3445
3446       if (count == 0)
3447         {
3448           expand_expr (index_expr, const0_rtx, VOIDmode, 0);
3449           emit_queue ();
3450           emit_jump (default_label);
3451         }
3452
3453       /* Try implementing this switch statement by a short sequence of
3454          bit-wise comparisons.  However, we let the binary-tree case
3455          below handle constant index expressions.  */
3456       else if (CASE_USE_BIT_TESTS
3457                && ! TREE_CONSTANT (index_expr)
3458                && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
3459                && compare_tree_int (range, 0) > 0
3460                && lshift_cheap_p ()
3461                && ((uniq == 1 && count >= 3)
3462                    || (uniq == 2 && count >= 5)
3463                    || (uniq == 3 && count >= 6)))
3464         {
3465           /* Optimize the case where all the case values fit in a
3466              word without having to subtract MINVAL.  In this case,
3467              we can optimize away the subtraction.  */
3468           if (compare_tree_int (minval, 0) > 0
3469               && compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0)
3470             {
3471               minval = integer_zero_node;
3472               range = maxval;
3473             }
3474           emit_case_bit_tests (index_type, index_expr, minval, range,
3475                                thiscase->data.case_stmt.case_list,
3476                                default_label);
3477         }
3478
3479       /* If range of values is much bigger than number of values,
3480          make a sequence of conditional branches instead of a dispatch.
3481          If the switch-index is a constant, do it this way
3482          because we can optimize it.  */
3483
3484       else if (count < case_values_threshold ()
3485                || compare_tree_int (range,
3486                                     (optimize_size ? 3 : 10) * count) > 0
3487                /* RANGE may be signed, and really large ranges will show up
3488                   as negative numbers.  */
3489                || compare_tree_int (range, 0) < 0
3490 #ifndef ASM_OUTPUT_ADDR_DIFF_ELT
3491                || flag_pic
3492 #endif
3493                || TREE_CONSTANT (index_expr)
3494                /* If neither casesi or tablejump is available, we can
3495                   only go this way.  */
3496                || (!HAVE_casesi && !HAVE_tablejump))
3497         {
3498           index = expand_expr (index_expr, NULL_RTX, VOIDmode, 0);
3499
3500           /* If the index is a short or char that we do not have
3501              an insn to handle comparisons directly, convert it to
3502              a full integer now, rather than letting each comparison
3503              generate the conversion.  */
3504
3505           if (GET_MODE_CLASS (GET_MODE (index)) == MODE_INT
3506               && ! have_insn_for (COMPARE, GET_MODE (index)))
3507             {
3508               enum machine_mode wider_mode;
3509               for (wider_mode = GET_MODE (index); wider_mode != VOIDmode;
3510                    wider_mode = GET_MODE_WIDER_MODE (wider_mode))
3511                 if (have_insn_for (COMPARE, wider_mode))
3512                   {
3513                     index = convert_to_mode (wider_mode, index, unsignedp);
3514                     break;
3515                   }
3516             }
3517
3518           emit_queue ();
3519           do_pending_stack_adjust ();
3520
3521           index = protect_from_queue (index, 0);
3522           if (MEM_P (index))
3523             index = copy_to_reg (index);
3524           if (GET_CODE (index) == CONST_INT
3525               || TREE_CODE (index_expr) == INTEGER_CST)
3526             {
3527               /* Make a tree node with the proper constant value
3528                  if we don't already have one.  */
3529               if (TREE_CODE (index_expr) != INTEGER_CST)
3530                 {
3531                   index_expr
3532                     = build_int_2 (INTVAL (index),
3533                                    unsignedp || INTVAL (index) >= 0 ? 0 : -1);
3534                   index_expr = convert (index_type, index_expr);
3535                 }
3536
3537               /* For constant index expressions we need only
3538                  issue an unconditional branch to the appropriate
3539                  target code.  The job of removing any unreachable
3540                  code is left to the optimization phase if the
3541                  "-O" option is specified.  */
3542               for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
3543                 if (! tree_int_cst_lt (index_expr, n->low)
3544                     && ! tree_int_cst_lt (n->high, index_expr))
3545                   break;
3546
3547               if (n)
3548                 emit_jump (label_rtx (n->code_label));
3549               else
3550                 emit_jump (default_label);
3551             }
3552           else
3553             {
3554               /* If the index expression is not constant we generate
3555                  a binary decision tree to select the appropriate
3556                  target code.  This is done as follows:
3557
3558                  The list of cases is rearranged into a binary tree,
3559                  nearly optimal assuming equal probability for each case.
3560
3561                  The tree is transformed into RTL, eliminating
3562                  redundant test conditions at the same time.
3563
3564                  If program flow could reach the end of the
3565                  decision tree an unconditional jump to the
3566                  default code is emitted.  */
3567
3568               use_cost_table
3569                 = (TREE_CODE (orig_type) != ENUMERAL_TYPE
3570                    && estimate_case_costs (thiscase->data.case_stmt.case_list));
3571               balance_case_nodes (&thiscase->data.case_stmt.case_list, NULL);
3572               emit_case_nodes (index, thiscase->data.case_stmt.case_list,
3573                                default_label, index_type);
3574               emit_jump_if_reachable (default_label);
3575             }
3576         }
3577       else
3578         {
3579           table_label = gen_label_rtx ();
3580           if (! try_casesi (index_type, index_expr, minval, range,
3581                             table_label, default_label))
3582             {
3583               index_type = thiscase->data.case_stmt.nominal_type;
3584
3585               /* Index jumptables from zero for suitable values of
3586                  minval to avoid a subtraction.  */
3587               if (! optimize_size
3588                   && compare_tree_int (minval, 0) > 0
3589                   && compare_tree_int (minval, 3) < 0)
3590                 {
3591                   minval = integer_zero_node;
3592                   range = maxval;
3593                 }
3594
3595               if (! try_tablejump (index_type, index_expr, minval, range,
3596                                    table_label, default_label))
3597                 abort ();
3598             }
3599
3600           /* Get table of labels to jump to, in order of case index.  */
3601
3602           ncases = tree_low_cst (range, 0) + 1;
3603           labelvec = alloca (ncases * sizeof (rtx));
3604           memset (labelvec, 0, ncases * sizeof (rtx));
3605
3606           for (n = thiscase->data.case_stmt.case_list; n; n = n->right)
3607             {
3608               /* Compute the low and high bounds relative to the minimum
3609                  value since that should fit in a HOST_WIDE_INT while the
3610                  actual values may not.  */
3611               HOST_WIDE_INT i_low
3612                 = tree_low_cst (fold (build (MINUS_EXPR, index_type,
3613                                              n->low, minval)), 1);
3614               HOST_WIDE_INT i_high
3615                 = tree_low_cst (fold (build (MINUS_EXPR, index_type,
3616                                              n->high, minval)), 1);
3617               HOST_WIDE_INT i;
3618
3619               for (i = i_low; i <= i_high; i ++)
3620                 labelvec[i]
3621                   = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label));
3622             }
3623
3624           /* Fill in the gaps with the default.  */
3625           for (i = 0; i < ncases; i++)
3626             if (labelvec[i] == 0)
3627               labelvec[i] = gen_rtx_LABEL_REF (Pmode, default_label);
3628
3629           /* Output the table.  */
3630           emit_label (table_label);
3631
3632           if (CASE_VECTOR_PC_RELATIVE || flag_pic)
3633             emit_jump_insn (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
3634                                                    gen_rtx_LABEL_REF (Pmode, table_label),
3635                                                    gen_rtvec_v (ncases, labelvec),
3636                                                    const0_rtx, const0_rtx));
3637           else
3638             emit_jump_insn (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
3639                                               gen_rtvec_v (ncases, labelvec)));
3640
3641           /* If the case insn drops through the table,
3642              after the table we must jump to the default-label.
3643              Otherwise record no drop-through after the table.  */
3644 #ifdef CASE_DROPS_THROUGH
3645           emit_jump (default_label);
3646 #else
3647           emit_barrier ();
3648 #endif
3649         }
3650
3651       before_case = NEXT_INSN (before_case);
3652       end = get_last_insn ();
3653       if (squeeze_notes (&before_case, &end))
3654         abort ();
3655       reorder_insns (before_case, end,
3656                      thiscase->data.case_stmt.start);
3657     }
3658
3659   if (thiscase->exit_label && !exit_done)
3660     emit_label (thiscase->exit_label);
3661
3662   POPSTACK (case_stack);
3663
3664   free_temp_slots ();
3665 }
3666
3667 /* Convert the tree NODE into a list linked by the right field, with the left
3668    field zeroed.  RIGHT is used for recursion; it is a list to be placed
3669    rightmost in the resulting list.  */
3670
3671 static struct case_node *
3672 case_tree2list (struct case_node *node, struct case_node *right)
3673 {
3674   struct case_node *left;
3675
3676   if (node->right)
3677     right = case_tree2list (node->right, right);
3678
3679   node->right = right;
3680   if ((left = node->left))
3681     {
3682       node->left = 0;
3683       return case_tree2list (left, node);
3684     }
3685
3686   return node;
3687 }
3688
3689 /* Generate code to jump to LABEL if OP1 and OP2 are equal.  */
3690
3691 static void
3692 do_jump_if_equal (rtx op1, rtx op2, rtx label, int unsignedp)
3693 {
3694   if (GET_CODE (op1) == CONST_INT && GET_CODE (op2) == CONST_INT)
3695     {
3696       if (op1 == op2)
3697         emit_jump (label);
3698     }
3699   else
3700     emit_cmp_and_jump_insns (op1, op2, EQ, NULL_RTX,
3701                              (GET_MODE (op1) == VOIDmode
3702                              ? GET_MODE (op2) : GET_MODE (op1)),
3703                              unsignedp, label);
3704 }
3705 \f
3706 /* Not all case values are encountered equally.  This function
3707    uses a heuristic to weight case labels, in cases where that
3708    looks like a reasonable thing to do.
3709
3710    Right now, all we try to guess is text, and we establish the
3711    following weights:
3712
3713         chars above space:      16
3714         digits:                 16
3715         default:                12
3716         space, punct:           8
3717         tab:                    4
3718         newline:                2
3719         other "\" chars:        1
3720         remaining chars:        0
3721
3722    If we find any cases in the switch that are not either -1 or in the range
3723    of valid ASCII characters, or are control characters other than those
3724    commonly used with "\", don't treat this switch scanning text.
3725
3726    Return 1 if these nodes are suitable for cost estimation, otherwise
3727    return 0.  */
3728
3729 static int
3730 estimate_case_costs (case_node_ptr node)
3731 {
3732   tree min_ascii = integer_minus_one_node;
3733   tree max_ascii = convert (TREE_TYPE (node->high), build_int_2 (127, 0));
3734   case_node_ptr n;
3735   int i;
3736
3737   /* If we haven't already made the cost table, make it now.  Note that the
3738      lower bound of the table is -1, not zero.  */
3739
3740   if (! cost_table_initialized)
3741     {
3742       cost_table_initialized = 1;
3743
3744       for (i = 0; i < 128; i++)
3745         {
3746           if (ISALNUM (i))
3747             COST_TABLE (i) = 16;
3748           else if (ISPUNCT (i))
3749             COST_TABLE (i) = 8;
3750           else if (ISCNTRL (i))
3751             COST_TABLE (i) = -1;
3752         }
3753
3754       COST_TABLE (' ') = 8;
3755       COST_TABLE ('\t') = 4;
3756       COST_TABLE ('\0') = 4;
3757       COST_TABLE ('\n') = 2;
3758       COST_TABLE ('\f') = 1;
3759       COST_TABLE ('\v') = 1;
3760       COST_TABLE ('\b') = 1;
3761     }
3762
3763   /* See if all the case expressions look like text.  It is text if the
3764      constant is >= -1 and the highest constant is <= 127.  Do all comparisons
3765      as signed arithmetic since we don't want to ever access cost_table with a
3766      value less than -1.  Also check that none of the constants in a range
3767      are strange control characters.  */
3768
3769   for (n = node; n; n = n->right)
3770     {
3771       if ((INT_CST_LT (n->low, min_ascii)) || INT_CST_LT (max_ascii, n->high))
3772         return 0;
3773
3774       for (i = (HOST_WIDE_INT) TREE_INT_CST_LOW (n->low);
3775            i <= (HOST_WIDE_INT) TREE_INT_CST_LOW (n->high); i++)
3776         if (COST_TABLE (i) < 0)
3777           return 0;
3778     }
3779
3780   /* All interesting values are within the range of interesting
3781      ASCII characters.  */
3782   return 1;
3783 }
3784
3785 /* Determine whether two case labels branch to the same target.  */
3786
3787 static bool
3788 same_case_target_p (rtx l1, rtx l2)
3789 {
3790 #if 0
3791   rtx i1, i2;
3792
3793   if (l1 == l2)
3794     return true;
3795
3796   i1 = next_real_insn (l1);
3797   i2 = next_real_insn (l2);
3798   if (i1 == i2)
3799     return true;
3800
3801   if (i1 && simplejump_p (i1))
3802     {
3803       l1 = XEXP (SET_SRC (PATTERN (i1)), 0);
3804     }
3805
3806   if (i2 && simplejump_p (i2))
3807     {
3808       l2 = XEXP (SET_SRC (PATTERN (i2)), 0);
3809     }
3810 #endif
3811   /* When coming from gimple, we usually won't have emitted either
3812      the labels or the body of the switch statement.  The job being
3813      done here should be done via jump threading at the tree level.
3814      Cases that go the same place should have the same label.  */
3815   return l1 == l2;
3816 }
3817
3818 /* Delete nodes that branch to the default label from a list of
3819    case nodes.  Eg. case 5: default: becomes just default:  */
3820
3821 static void
3822 strip_default_case_nodes (case_node_ptr *prev, rtx deflab)
3823 {
3824   case_node_ptr ptr;
3825
3826   while (*prev)
3827     {
3828       ptr = *prev;
3829       if (same_case_target_p (label_rtx (ptr->code_label), deflab))
3830         *prev = ptr->right;
3831       else
3832         prev = &ptr->right;
3833     }
3834 }
3835
3836 /* Scan an ordered list of case nodes
3837    combining those with consecutive values or ranges.
3838
3839    Eg. three separate entries 1: 2: 3: become one entry 1..3:  */
3840
3841 static void
3842 group_case_nodes (case_node_ptr head)
3843 {
3844   case_node_ptr node = head;
3845
3846   while (node)
3847     {
3848       rtx lab;
3849       case_node_ptr np = node;
3850
3851       lab = label_rtx (node->code_label);
3852
3853       /* Try to group the successors of NODE with NODE.  */
3854       while (((np = np->right) != 0)
3855              /* Do they jump to the same place?  */
3856              && same_case_target_p (label_rtx (np->code_label), lab)
3857              /* Are their ranges consecutive?  */
3858              && tree_int_cst_equal (np->low,
3859                                     fold (build (PLUS_EXPR,
3860                                                  TREE_TYPE (node->high),
3861                                                  node->high,
3862                                                  integer_one_node)))
3863              /* An overflow is not consecutive.  */
3864              && tree_int_cst_lt (node->high,
3865                                  fold (build (PLUS_EXPR,
3866                                               TREE_TYPE (node->high),
3867                                               node->high,
3868                                               integer_one_node))))
3869         {
3870           node->high = np->high;
3871         }
3872       /* NP is the first node after NODE which can't be grouped with it.
3873          Delete the nodes in between, and move on to that node.  */
3874       node->right = np;
3875       node = np;
3876     }
3877 }
3878
3879 /* Take an ordered list of case nodes
3880    and transform them into a near optimal binary tree,
3881    on the assumption that any target code selection value is as
3882    likely as any other.
3883
3884    The transformation is performed by splitting the ordered
3885    list into two equal sections plus a pivot.  The parts are
3886    then attached to the pivot as left and right branches.  Each
3887    branch is then transformed recursively.  */
3888
3889 static void
3890 balance_case_nodes (case_node_ptr *head, case_node_ptr parent)
3891 {
3892   case_node_ptr np;
3893
3894   np = *head;
3895   if (np)
3896     {
3897       int cost = 0;
3898       int i = 0;
3899       int ranges = 0;
3900       case_node_ptr *npp;
3901       case_node_ptr left;
3902
3903       /* Count the number of entries on branch.  Also count the ranges.  */
3904
3905       while (np)
3906         {
3907           if (!tree_int_cst_equal (np->low, np->high))
3908             {
3909               ranges++;
3910               if (use_cost_table)
3911                 cost += COST_TABLE (TREE_INT_CST_LOW (np->high));
3912             }
3913
3914           if (use_cost_table)
3915             cost += COST_TABLE (TREE_INT_CST_LOW (np->low));
3916
3917           i++;
3918           np = np->right;
3919         }
3920
3921       if (i > 2)
3922         {
3923           /* Split this list if it is long enough for that to help.  */
3924           npp = head;
3925           left = *npp;
3926           if (use_cost_table)
3927             {
3928               /* Find the place in the list that bisects the list's total cost,
3929                  Here I gets half the total cost.  */
3930               int n_moved = 0;
3931               i = (cost + 1) / 2;
3932               while (1)
3933                 {
3934                   /* Skip nodes while their cost does not reach that amount.  */
3935                   if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
3936                     i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->high));
3937                   i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->low));
3938                   if (i <= 0)
3939                     break;
3940                   npp = &(*npp)->right;
3941                   n_moved += 1;
3942                 }
3943               if (n_moved == 0)
3944                 {
3945                   /* Leave this branch lopsided, but optimize left-hand
3946                      side and fill in `parent' fields for right-hand side.  */
3947                   np = *head;
3948                   np->parent = parent;
3949                   balance_case_nodes (&np->left, np);
3950                   for (; np->right; np = np->right)
3951                     np->right->parent = np;
3952                   return;
3953                 }
3954             }
3955           /* If there are just three nodes, split at the middle one.  */
3956           else if (i == 3)
3957             npp = &(*npp)->right;
3958           else
3959             {
3960               /* Find the place in the list that bisects the list's total cost,
3961                  where ranges count as 2.
3962                  Here I gets half the total cost.  */
3963               i = (i + ranges + 1) / 2;
3964               while (1)
3965                 {
3966                   /* Skip nodes while their cost does not reach that amount.  */
3967                   if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
3968                     i--;
3969                   i--;
3970                   if (i <= 0)
3971                     break;
3972                   npp = &(*npp)->right;
3973                 }
3974             }
3975           *head = np = *npp;
3976           *npp = 0;
3977           np->parent = parent;
3978           np->left = left;
3979
3980           /* Optimize each of the two split parts.  */
3981           balance_case_nodes (&np->left, np);
3982           balance_case_nodes (&np->right, np);
3983         }
3984       else
3985         {
3986           /* Else leave this branch as one level,
3987              but fill in `parent' fields.  */
3988           np = *head;
3989           np->parent = parent;
3990           for (; np->right; np = np->right)
3991             np->right->parent = np;
3992         }
3993     }
3994 }
3995 \f
3996 /* Search the parent sections of the case node tree
3997    to see if a test for the lower bound of NODE would be redundant.
3998    INDEX_TYPE is the type of the index expression.
3999
4000    The instructions to generate the case decision tree are
4001    output in the same order as nodes are processed so it is
4002    known that if a parent node checks the range of the current
4003    node minus one that the current node is bounded at its lower
4004    span.  Thus the test would be redundant.  */
4005
4006 static int
4007 node_has_low_bound (case_node_ptr node, tree index_type)
4008 {
4009   tree low_minus_one;
4010   case_node_ptr pnode;
4011
4012   /* If the lower bound of this node is the lowest value in the index type,
4013      we need not test it.  */
4014
4015   if (tree_int_cst_equal (node->low, TYPE_MIN_VALUE (index_type)))
4016     return 1;
4017
4018   /* If this node has a left branch, the value at the left must be less
4019      than that at this node, so it cannot be bounded at the bottom and
4020      we need not bother testing any further.  */
4021
4022   if (node->left)
4023     return 0;
4024
4025   low_minus_one = fold (build (MINUS_EXPR, TREE_TYPE (node->low),
4026                                node->low, integer_one_node));
4027
4028   /* If the subtraction above overflowed, we can't verify anything.
4029      Otherwise, look for a parent that tests our value - 1.  */
4030
4031   if (! tree_int_cst_lt (low_minus_one, node->low))
4032     return 0;
4033
4034   for (pnode = node->parent; pnode; pnode = pnode->parent)
4035     if (tree_int_cst_equal (low_minus_one, pnode->high))
4036       return 1;
4037
4038   return 0;
4039 }
4040
4041 /* Search the parent sections of the case node tree
4042    to see if a test for the upper bound of NODE would be redundant.
4043    INDEX_TYPE is the type of the index expression.
4044
4045    The instructions to generate the case decision tree are
4046    output in the same order as nodes are processed so it is
4047    known that if a parent node checks the range of the current
4048    node plus one that the current node is bounded at its upper
4049    span.  Thus the test would be redundant.  */
4050
4051 static int
4052 node_has_high_bound (case_node_ptr node, tree index_type)
4053 {
4054   tree high_plus_one;
4055   case_node_ptr pnode;
4056
4057   /* If there is no upper bound, obviously no test is needed.  */
4058
4059   if (TYPE_MAX_VALUE (index_type) == NULL)
4060     return 1;
4061
4062   /* If the upper bound of this node is the highest value in the type
4063      of the index expression, we need not test against it.  */
4064
4065   if (tree_int_cst_equal (node->high, TYPE_MAX_VALUE (index_type)))
4066     return 1;
4067
4068   /* If this node has a right branch, the value at the right must be greater
4069      than that at this node, so it cannot be bounded at the top and
4070      we need not bother testing any further.  */
4071
4072   if (node->right)
4073     return 0;
4074
4075   high_plus_one = fold (build (PLUS_EXPR, TREE_TYPE (node->high),
4076                                node->high, integer_one_node));
4077
4078   /* If the addition above overflowed, we can't verify anything.
4079      Otherwise, look for a parent that tests our value + 1.  */
4080
4081   if (! tree_int_cst_lt (node->high, high_plus_one))
4082     return 0;
4083
4084   for (pnode = node->parent; pnode; pnode = pnode->parent)
4085     if (tree_int_cst_equal (high_plus_one, pnode->low))
4086       return 1;
4087
4088   return 0;
4089 }
4090
4091 /* Search the parent sections of the
4092    case node tree to see if both tests for the upper and lower
4093    bounds of NODE would be redundant.  */
4094
4095 static int
4096 node_is_bounded (case_node_ptr node, tree index_type)
4097 {
4098   return (node_has_low_bound (node, index_type)
4099           && node_has_high_bound (node, index_type));
4100 }
4101
4102 /*  Emit an unconditional jump to LABEL unless it would be dead code.  */
4103
4104 static void
4105 emit_jump_if_reachable (rtx label)
4106 {
4107   if (GET_CODE (get_last_insn ()) != BARRIER)
4108     emit_jump (label);
4109 }
4110 \f
4111 /* Emit step-by-step code to select a case for the value of INDEX.
4112    The thus generated decision tree follows the form of the
4113    case-node binary tree NODE, whose nodes represent test conditions.
4114    INDEX_TYPE is the type of the index of the switch.
4115
4116    Care is taken to prune redundant tests from the decision tree
4117    by detecting any boundary conditions already checked by
4118    emitted rtx.  (See node_has_high_bound, node_has_low_bound
4119    and node_is_bounded, above.)
4120
4121    Where the test conditions can be shown to be redundant we emit
4122    an unconditional jump to the target code.  As a further
4123    optimization, the subordinates of a tree node are examined to
4124    check for bounded nodes.  In this case conditional and/or
4125    unconditional jumps as a result of the boundary check for the
4126    current node are arranged to target the subordinates associated
4127    code for out of bound conditions on the current node.
4128
4129    We can assume that when control reaches the code generated here,
4130    the index value has already been compared with the parents
4131    of this node, and determined to be on the same side of each parent
4132    as this node is.  Thus, if this node tests for the value 51,
4133    and a parent tested for 52, we don't need to consider
4134    the possibility of a value greater than 51.  If another parent
4135    tests for the value 50, then this node need not test anything.  */
4136
4137 static void
4138 emit_case_nodes (rtx index, case_node_ptr node, rtx default_label,
4139                  tree index_type)
4140 {
4141   /* If INDEX has an unsigned type, we must make unsigned branches.  */
4142   int unsignedp = TYPE_UNSIGNED (index_type);
4143   enum machine_mode mode = GET_MODE (index);
4144   enum machine_mode imode = TYPE_MODE (index_type);
4145
4146   /* See if our parents have already tested everything for us.
4147      If they have, emit an unconditional jump for this node.  */
4148   if (node_is_bounded (node, index_type))
4149     emit_jump (label_rtx (node->code_label));
4150
4151   else if (tree_int_cst_equal (node->low, node->high))
4152     {
4153       /* Node is single valued.  First see if the index expression matches
4154          this node and then check our children, if any.  */
4155
4156       do_jump_if_equal (index,
4157                         convert_modes (mode, imode,
4158                                        expand_expr (node->low, NULL_RTX,
4159                                                     VOIDmode, 0),
4160                                        unsignedp),
4161                         label_rtx (node->code_label), unsignedp);
4162
4163       if (node->right != 0 && node->left != 0)
4164         {
4165           /* This node has children on both sides.
4166              Dispatch to one side or the other
4167              by comparing the index value with this node's value.
4168              If one subtree is bounded, check that one first,
4169              so we can avoid real branches in the tree.  */
4170
4171           if (node_is_bounded (node->right, index_type))
4172             {
4173               emit_cmp_and_jump_insns (index,
4174                                        convert_modes
4175                                        (mode, imode,
4176                                         expand_expr (node->high, NULL_RTX,
4177                                                      VOIDmode, 0),
4178                                         unsignedp),
4179                                        GT, NULL_RTX, mode, unsignedp,
4180                                        label_rtx (node->right->code_label));
4181               emit_case_nodes (index, node->left, default_label, index_type);
4182             }
4183
4184           else if (node_is_bounded (node->left, index_type))
4185             {
4186               emit_cmp_and_jump_insns (index,
4187                                        convert_modes
4188                                        (mode, imode,
4189                                         expand_expr (node->high, NULL_RTX,
4190                                                      VOIDmode, 0),
4191                                         unsignedp),
4192                                        LT, NULL_RTX, mode, unsignedp,
4193                                        label_rtx (node->left->code_label));
4194               emit_case_nodes (index, node->right, default_label, index_type);
4195             }
4196
4197           /* If both children are single-valued cases with no
4198              children, finish up all the work.  This way, we can save
4199              one ordered comparison.  */
4200           else if (tree_int_cst_equal (node->right->low, node->right->high)
4201                    && node->right->left == 0
4202                    && node->right->right == 0
4203                    && tree_int_cst_equal (node->left->low, node->left->high)
4204                    && node->left->left == 0
4205                    && node->left->right == 0)
4206             {
4207               /* Neither node is bounded.  First distinguish the two sides;
4208                  then emit the code for one side at a time.  */
4209
4210               /* See if the value matches what the right hand side
4211                  wants.  */
4212               do_jump_if_equal (index,
4213                                 convert_modes (mode, imode,
4214                                                expand_expr (node->right->low,
4215                                                             NULL_RTX,
4216                                                             VOIDmode, 0),
4217                                                unsignedp),
4218                                 label_rtx (node->right->code_label),
4219                                 unsignedp);
4220
4221               /* See if the value matches what the left hand side
4222                  wants.  */
4223               do_jump_if_equal (index,
4224                                 convert_modes (mode, imode,
4225                                                expand_expr (node->left->low,
4226                                                             NULL_RTX,
4227                                                             VOIDmode, 0),
4228                                                unsignedp),
4229                                 label_rtx (node->left->code_label),
4230                                 unsignedp);
4231             }
4232
4233           else
4234             {
4235               /* Neither node is bounded.  First distinguish the two sides;
4236                  then emit the code for one side at a time.  */
4237
4238               tree test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
4239
4240               /* See if the value is on the right.  */
4241               emit_cmp_and_jump_insns (index,
4242                                        convert_modes
4243                                        (mode, imode,
4244                                         expand_expr (node->high, NULL_RTX,
4245                                                      VOIDmode, 0),
4246                                         unsignedp),
4247                                        GT, NULL_RTX, mode, unsignedp,
4248                                        label_rtx (test_label));
4249
4250               /* Value must be on the left.
4251                  Handle the left-hand subtree.  */
4252               emit_case_nodes (index, node->left, default_label, index_type);
4253               /* If left-hand subtree does nothing,
4254                  go to default.  */
4255               emit_jump_if_reachable (default_label);
4256
4257               /* Code branches here for the right-hand subtree.  */
4258               expand_label (test_label);
4259               emit_case_nodes (index, node->right, default_label, index_type);
4260             }
4261         }
4262
4263       else if (node->right != 0 && node->left == 0)
4264         {
4265           /* Here we have a right child but no left so we issue conditional
4266              branch to default and process the right child.
4267
4268              Omit the conditional branch to default if we it avoid only one
4269              right child; it costs too much space to save so little time.  */
4270
4271           if (node->right->right || node->right->left
4272               || !tree_int_cst_equal (node->right->low, node->right->high))
4273             {
4274               if (!node_has_low_bound (node, index_type))
4275                 {
4276                   emit_cmp_and_jump_insns (index,
4277                                            convert_modes
4278                                            (mode, imode,
4279                                             expand_expr (node->high, NULL_RTX,
4280                                                          VOIDmode, 0),
4281                                             unsignedp),
4282                                            LT, NULL_RTX, mode, unsignedp,
4283                                            default_label);
4284                 }
4285
4286               emit_case_nodes (index, node->right, default_label, index_type);
4287             }
4288           else
4289             /* We cannot process node->right normally
4290                since we haven't ruled out the numbers less than
4291                this node's value.  So handle node->right explicitly.  */
4292             do_jump_if_equal (index,
4293                               convert_modes
4294                               (mode, imode,
4295                                expand_expr (node->right->low, NULL_RTX,
4296                                             VOIDmode, 0),
4297                                unsignedp),
4298                               label_rtx (node->right->code_label), unsignedp);
4299         }
4300
4301       else if (node->right == 0 && node->left != 0)
4302         {
4303           /* Just one subtree, on the left.  */
4304           if (node->left->left || node->left->right
4305               || !tree_int_cst_equal (node->left->low, node->left->high))
4306             {
4307               if (!node_has_high_bound (node, index_type))
4308                 {
4309                   emit_cmp_and_jump_insns (index,
4310                                            convert_modes
4311                                            (mode, imode,
4312                                             expand_expr (node->high, NULL_RTX,
4313                                                          VOIDmode, 0),
4314                                             unsignedp),
4315                                            GT, NULL_RTX, mode, unsignedp,
4316                                            default_label);
4317                 }
4318
4319               emit_case_nodes (index, node->left, default_label, index_type);
4320             }
4321           else
4322             /* We cannot process node->left normally
4323                since we haven't ruled out the numbers less than
4324                this node's value.  So handle node->left explicitly.  */
4325             do_jump_if_equal (index,
4326                               convert_modes
4327                               (mode, imode,
4328                                expand_expr (node->left->low, NULL_RTX,
4329                                             VOIDmode, 0),
4330                                unsignedp),
4331                               label_rtx (node->left->code_label), unsignedp);
4332         }
4333     }
4334   else
4335     {
4336       /* Node is a range.  These cases are very similar to those for a single
4337          value, except that we do not start by testing whether this node
4338          is the one to branch to.  */
4339
4340       if (node->right != 0 && node->left != 0)
4341         {
4342           /* Node has subtrees on both sides.
4343              If the right-hand subtree is bounded,
4344              test for it first, since we can go straight there.
4345              Otherwise, we need to make a branch in the control structure,
4346              then handle the two subtrees.  */
4347           tree test_label = 0;
4348
4349           if (node_is_bounded (node->right, index_type))
4350             /* Right hand node is fully bounded so we can eliminate any
4351                testing and branch directly to the target code.  */
4352             emit_cmp_and_jump_insns (index,
4353                                      convert_modes
4354                                      (mode, imode,
4355                                       expand_expr (node->high, NULL_RTX,
4356                                                    VOIDmode, 0),
4357                                       unsignedp),
4358                                      GT, NULL_RTX, mode, unsignedp,
4359                                      label_rtx (node->right->code_label));
4360           else
4361             {
4362               /* Right hand node requires testing.
4363                  Branch to a label where we will handle it later.  */
4364
4365               test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
4366               emit_cmp_and_jump_insns (index,
4367                                        convert_modes
4368                                        (mode, imode,
4369                                         expand_expr (node->high, NULL_RTX,
4370                                                      VOIDmode, 0),
4371                                         unsignedp),
4372                                        GT, NULL_RTX, mode, unsignedp,
4373                                        label_rtx (test_label));
4374             }
4375
4376           /* Value belongs to this node or to the left-hand subtree.  */
4377
4378           emit_cmp_and_jump_insns (index,
4379                                    convert_modes
4380                                    (mode, imode,
4381                                     expand_expr (node->low, NULL_RTX,
4382                                                  VOIDmode, 0),
4383                                     unsignedp),
4384                                    GE, NULL_RTX, mode, unsignedp,
4385                                    label_rtx (node->code_label));
4386
4387           /* Handle the left-hand subtree.  */
4388           emit_case_nodes (index, node->left, default_label, index_type);
4389
4390           /* If right node had to be handled later, do that now.  */
4391
4392           if (test_label)
4393             {
4394               /* If the left-hand subtree fell through,
4395                  don't let it fall into the right-hand subtree.  */
4396               emit_jump_if_reachable (default_label);
4397
4398               expand_label (test_label);
4399               emit_case_nodes (index, node->right, default_label, index_type);
4400             }
4401         }
4402
4403       else if (node->right != 0 && node->left == 0)
4404         {
4405           /* Deal with values to the left of this node,
4406              if they are possible.  */
4407           if (!node_has_low_bound (node, index_type))
4408             {
4409               emit_cmp_and_jump_insns (index,
4410                                        convert_modes
4411                                        (mode, imode,
4412                                         expand_expr (node->low, NULL_RTX,
4413                                                      VOIDmode, 0),
4414                                         unsignedp),
4415                                        LT, NULL_RTX, mode, unsignedp,
4416                                        default_label);
4417             }
4418
4419           /* Value belongs to this node or to the right-hand subtree.  */
4420
4421           emit_cmp_and_jump_insns (index,
4422                                    convert_modes
4423                                    (mode, imode,
4424                                     expand_expr (node->high, NULL_RTX,
4425                                                  VOIDmode, 0),
4426                                     unsignedp),
4427                                    LE, NULL_RTX, mode, unsignedp,
4428                                    label_rtx (node->code_label));
4429
4430           emit_case_nodes (index, node->right, default_label, index_type);
4431         }
4432
4433       else if (node->right == 0 && node->left != 0)
4434         {
4435           /* Deal with values to the right of this node,
4436              if they are possible.  */
4437           if (!node_has_high_bound (node, index_type))
4438             {
4439               emit_cmp_and_jump_insns (index,
4440                                        convert_modes
4441                                        (mode, imode,
4442                                         expand_expr (node->high, NULL_RTX,
4443                                                      VOIDmode, 0),
4444                                         unsignedp),
4445                                        GT, NULL_RTX, mode, unsignedp,
4446                                        default_label);
4447             }
4448
4449           /* Value belongs to this node or to the left-hand subtree.  */
4450
4451           emit_cmp_and_jump_insns (index,
4452                                    convert_modes
4453                                    (mode, imode,
4454                                     expand_expr (node->low, NULL_RTX,
4455                                                  VOIDmode, 0),
4456                                     unsignedp),
4457                                    GE, NULL_RTX, mode, unsignedp,
4458                                    label_rtx (node->code_label));
4459
4460           emit_case_nodes (index, node->left, default_label, index_type);
4461         }
4462
4463       else
4464         {
4465           /* Node has no children so we check low and high bounds to remove
4466              redundant tests.  Only one of the bounds can exist,
4467              since otherwise this node is bounded--a case tested already.  */
4468           int high_bound = node_has_high_bound (node, index_type);
4469           int low_bound = node_has_low_bound (node, index_type);
4470
4471           if (!high_bound && low_bound)
4472             {
4473               emit_cmp_and_jump_insns (index,
4474                                        convert_modes
4475                                        (mode, imode,
4476                                         expand_expr (node->high, NULL_RTX,
4477                                                      VOIDmode, 0),
4478                                         unsignedp),
4479                                        GT, NULL_RTX, mode, unsignedp,
4480                                        default_label);
4481             }
4482
4483           else if (!low_bound && high_bound)
4484             {
4485               emit_cmp_and_jump_insns (index,
4486                                        convert_modes
4487                                        (mode, imode,
4488                                         expand_expr (node->low, NULL_RTX,
4489                                                      VOIDmode, 0),
4490                                         unsignedp),
4491                                        LT, NULL_RTX, mode, unsignedp,
4492                                        default_label);
4493             }
4494           else if (!low_bound && !high_bound)
4495             {
4496               /* Widen LOW and HIGH to the same width as INDEX.  */
4497               tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
4498               tree low = build1 (CONVERT_EXPR, type, node->low);
4499               tree high = build1 (CONVERT_EXPR, type, node->high);
4500               rtx low_rtx, new_index, new_bound;
4501
4502               /* Instead of doing two branches, emit one unsigned branch for
4503                  (index-low) > (high-low).  */
4504               low_rtx = expand_expr (low, NULL_RTX, mode, 0);
4505               new_index = expand_simple_binop (mode, MINUS, index, low_rtx,
4506                                                NULL_RTX, unsignedp,
4507                                                OPTAB_WIDEN);
4508               new_bound = expand_expr (fold (build (MINUS_EXPR, type,
4509                                                     high, low)),
4510                                        NULL_RTX, mode, 0);
4511
4512               emit_cmp_and_jump_insns (new_index, new_bound, GT, NULL_RTX,
4513                                        mode, 1, default_label);
4514             }
4515
4516           emit_jump (label_rtx (node->code_label));
4517         }
4518     }
4519 }
4520
4521 #include "gt-stmt.h"