OSDN Git Service

contrib/
[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, 2005, 2006, 2007, 2008
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
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    The functions whose names start with `expand_' are called by the
25    expander to generate RTL instructions for various kinds of constructs.  */
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31
32 #include "rtl.h"
33 #include "hard-reg-set.h"
34 #include "tree.h"
35 #include "tm_p.h"
36 #include "flags.h"
37 #include "except.h"
38 #include "function.h"
39 #include "insn-config.h"
40 #include "expr.h"
41 #include "libfuncs.h"
42 #include "recog.h"
43 #include "machmode.h"
44 #include "toplev.h"
45 #include "output.h"
46 #include "ggc.h"
47 #include "langhooks.h"
48 #include "predict.h"
49 #include "optabs.h"
50 #include "target.h"
51 #include "regs.h"
52 #include "alloc-pool.h"
53 \f
54 /* Functions and data structures for expanding case statements.  */
55
56 /* Case label structure, used to hold info on labels within case
57    statements.  We handle "range" labels; for a single-value label
58    as in C, the high and low limits are the same.
59
60    We start with a vector of case nodes sorted in ascending order, and
61    the default label as the last element in the vector.  Before expanding
62    to RTL, we transform this vector into a list linked via the RIGHT
63    fields in the case_node struct.  Nodes with higher case values are
64    later in the list.
65
66    Switch statements can be output in three forms.  A branch table is
67    used if there are more than a few labels and the labels are dense
68    within the range between the smallest and largest case value.  If a
69    branch table is used, no further manipulations are done with the case
70    node chain.
71
72    The alternative to the use of a branch table is to generate a series
73    of compare and jump insns.  When that is done, we use the LEFT, RIGHT,
74    and PARENT fields to hold a binary tree.  Initially the tree is
75    totally unbalanced, with everything on the right.  We balance the tree
76    with nodes on the left having lower case values than the parent
77    and nodes on the right having higher values.  We then output the tree
78    in order.
79
80    For very small, suitable switch statements, we can generate a series
81    of simple bit test and branches instead.  */
82
83 struct case_node
84 {
85   struct case_node      *left;  /* Left son in binary tree */
86   struct case_node      *right; /* Right son in binary tree; also node chain */
87   struct case_node      *parent; /* Parent of node in binary tree */
88   tree                  low;    /* Lowest index value for this label */
89   tree                  high;   /* Highest index value for this label */
90   tree                  code_label; /* Label to jump to when node matches */
91 };
92
93 typedef struct case_node case_node;
94 typedef struct case_node *case_node_ptr;
95
96 /* These are used by estimate_case_costs and balance_case_nodes.  */
97
98 /* This must be a signed type, and non-ANSI compilers lack signed char.  */
99 static short cost_table_[129];
100 static int use_cost_table;
101 static int cost_table_initialized;
102
103 /* Special care is needed because we allow -1, but TREE_INT_CST_LOW
104    is unsigned.  */
105 #define COST_TABLE(I)  cost_table_[(unsigned HOST_WIDE_INT) ((I) + 1)]
106 \f
107 static int n_occurrences (int, const char *);
108 static bool tree_conflicts_with_clobbers_p (tree, HARD_REG_SET *);
109 static void expand_nl_goto_receiver (void);
110 static bool check_operand_nalternatives (tree, tree);
111 static bool check_unique_operand_names (tree, tree);
112 static char *resolve_operand_name_1 (char *, tree, tree);
113 static void expand_null_return_1 (void);
114 static void expand_value_return (rtx);
115 static int estimate_case_costs (case_node_ptr);
116 static bool lshift_cheap_p (void);
117 static int case_bit_test_cmp (const void *, const void *);
118 static void emit_case_bit_tests (tree, tree, tree, tree, case_node_ptr, rtx);
119 static void balance_case_nodes (case_node_ptr *, case_node_ptr);
120 static int node_has_low_bound (case_node_ptr, tree);
121 static int node_has_high_bound (case_node_ptr, tree);
122 static int node_is_bounded (case_node_ptr, tree);
123 static void emit_case_nodes (rtx, case_node_ptr, rtx, tree);
124 static struct case_node *add_case_node (struct case_node *, tree,
125                                         tree, tree, tree, alloc_pool);
126
127 \f
128 /* Return the rtx-label that corresponds to a LABEL_DECL,
129    creating it if necessary.  */
130
131 rtx
132 label_rtx (tree label)
133 {
134   gcc_assert (TREE_CODE (label) == LABEL_DECL);
135
136   if (!DECL_RTL_SET_P (label))
137     {
138       rtx r = gen_label_rtx ();
139       SET_DECL_RTL (label, r);
140       if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
141         LABEL_PRESERVE_P (r) = 1;
142     }
143
144   return DECL_RTL (label);
145 }
146
147 /* As above, but also put it on the forced-reference list of the
148    function that contains it.  */
149 rtx
150 force_label_rtx (tree label)
151 {
152   rtx ref = label_rtx (label);
153   tree function = decl_function_context (label);
154
155   gcc_assert (function);
156
157   forced_labels = gen_rtx_EXPR_LIST (VOIDmode, ref, forced_labels);
158   return ref;
159 }
160
161 /* Add an unconditional jump to LABEL as the next sequential instruction.  */
162
163 void
164 emit_jump (rtx label)
165 {
166   do_pending_stack_adjust ();
167   emit_jump_insn (gen_jump (label));
168   emit_barrier ();
169 }
170
171 /* Emit code to jump to the address
172    specified by the pointer expression EXP.  */
173
174 void
175 expand_computed_goto (tree exp)
176 {
177   rtx x = expand_normal (exp);
178
179   x = convert_memory_address (Pmode, x);
180
181   do_pending_stack_adjust ();
182   emit_indirect_jump (x);
183 }
184 \f
185 /* Handle goto statements and the labels that they can go to.  */
186
187 /* Specify the location in the RTL code of a label LABEL,
188    which is a LABEL_DECL tree node.
189
190    This is used for the kind of label that the user can jump to with a
191    goto statement, and for alternatives of a switch or case statement.
192    RTL labels generated for loops and conditionals don't go through here;
193    they are generated directly at the RTL level, by other functions below.
194
195    Note that this has nothing to do with defining label *names*.
196    Languages vary in how they do that and what that even means.  */
197
198 void
199 expand_label (tree label)
200 {
201   rtx label_r = label_rtx (label);
202
203   do_pending_stack_adjust ();
204   emit_label (label_r);
205   if (DECL_NAME (label))
206     LABEL_NAME (DECL_RTL (label)) = IDENTIFIER_POINTER (DECL_NAME (label));
207
208   if (DECL_NONLOCAL (label))
209     {
210       expand_nl_goto_receiver ();
211       nonlocal_goto_handler_labels
212         = gen_rtx_EXPR_LIST (VOIDmode, label_r,
213                              nonlocal_goto_handler_labels);
214     }
215
216   if (FORCED_LABEL (label))
217     forced_labels = gen_rtx_EXPR_LIST (VOIDmode, label_r, forced_labels);
218
219   if (DECL_NONLOCAL (label) || FORCED_LABEL (label))
220     maybe_set_first_label_num (label_r);
221 }
222
223 /* Generate RTL code for a `goto' statement with target label LABEL.
224    LABEL should be a LABEL_DECL tree node that was or will later be
225    defined with `expand_label'.  */
226
227 void
228 expand_goto (tree label)
229 {
230 #ifdef ENABLE_CHECKING
231   /* Check for a nonlocal goto to a containing function.  Should have
232      gotten translated to __builtin_nonlocal_goto.  */
233   tree context = decl_function_context (label);
234   gcc_assert (!context || context == current_function_decl);
235 #endif
236
237   emit_jump (label_rtx (label));
238 }
239 \f
240 /* Return the number of times character C occurs in string S.  */
241 static int
242 n_occurrences (int c, const char *s)
243 {
244   int n = 0;
245   while (*s)
246     n += (*s++ == c);
247   return n;
248 }
249 \f
250 /* Generate RTL for an asm statement (explicit assembler code).
251    STRING is a STRING_CST node containing the assembler code text,
252    or an ADDR_EXPR containing a STRING_CST.  VOL nonzero means the
253    insn is volatile; don't optimize it.  */
254
255 static void
256 expand_asm_loc (tree string, int vol, location_t locus)
257 {
258   rtx body;
259
260   if (TREE_CODE (string) == ADDR_EXPR)
261     string = TREE_OPERAND (string, 0);
262
263   body = gen_rtx_ASM_INPUT_loc (VOIDmode,
264                                 ggc_strdup (TREE_STRING_POINTER (string)),
265                                 locus);
266
267   MEM_VOLATILE_P (body) = vol;
268
269   emit_insn (body);
270 }
271
272 /* Parse the output constraint pointed to by *CONSTRAINT_P.  It is the
273    OPERAND_NUMth output operand, indexed from zero.  There are NINPUTS
274    inputs and NOUTPUTS outputs to this extended-asm.  Upon return,
275    *ALLOWS_MEM will be TRUE iff the constraint allows the use of a
276    memory operand.  Similarly, *ALLOWS_REG will be TRUE iff the
277    constraint allows the use of a register operand.  And, *IS_INOUT
278    will be true if the operand is read-write, i.e., if it is used as
279    an input as well as an output.  If *CONSTRAINT_P is not in
280    canonical form, it will be made canonical.  (Note that `+' will be
281    replaced with `=' as part of this process.)
282
283    Returns TRUE if all went well; FALSE if an error occurred.  */
284
285 bool
286 parse_output_constraint (const char **constraint_p, int operand_num,
287                          int ninputs, int noutputs, bool *allows_mem,
288                          bool *allows_reg, bool *is_inout)
289 {
290   const char *constraint = *constraint_p;
291   const char *p;
292
293   /* Assume the constraint doesn't allow the use of either a register
294      or memory.  */
295   *allows_mem = false;
296   *allows_reg = false;
297
298   /* Allow the `=' or `+' to not be at the beginning of the string,
299      since it wasn't explicitly documented that way, and there is a
300      large body of code that puts it last.  Swap the character to
301      the front, so as not to uglify any place else.  */
302   p = strchr (constraint, '=');
303   if (!p)
304     p = strchr (constraint, '+');
305
306   /* If the string doesn't contain an `=', issue an error
307      message.  */
308   if (!p)
309     {
310       error ("output operand constraint lacks %<=%>");
311       return false;
312     }
313
314   /* If the constraint begins with `+', then the operand is both read
315      from and written to.  */
316   *is_inout = (*p == '+');
317
318   /* Canonicalize the output constraint so that it begins with `='.  */
319   if (p != constraint || *is_inout)
320     {
321       char *buf;
322       size_t c_len = strlen (constraint);
323
324       if (p != constraint)
325         warning (0, "output constraint %qc for operand %d "
326                  "is not at the beginning",
327                  *p, operand_num);
328
329       /* Make a copy of the constraint.  */
330       buf = XALLOCAVEC (char, c_len + 1);
331       strcpy (buf, constraint);
332       /* Swap the first character and the `=' or `+'.  */
333       buf[p - constraint] = buf[0];
334       /* Make sure the first character is an `='.  (Until we do this,
335          it might be a `+'.)  */
336       buf[0] = '=';
337       /* Replace the constraint with the canonicalized string.  */
338       *constraint_p = ggc_alloc_string (buf, c_len);
339       constraint = *constraint_p;
340     }
341
342   /* Loop through the constraint string.  */
343   for (p = constraint + 1; *p; p += CONSTRAINT_LEN (*p, p))
344     switch (*p)
345       {
346       case '+':
347       case '=':
348         error ("operand constraint contains incorrectly positioned "
349                "%<+%> or %<=%>");
350         return false;
351
352       case '%':
353         if (operand_num + 1 == ninputs + noutputs)
354           {
355             error ("%<%%%> constraint used with last operand");
356             return false;
357           }
358         break;
359
360       case 'V':  case TARGET_MEM_CONSTRAINT:  case 'o':
361         *allows_mem = true;
362         break;
363
364       case '?':  case '!':  case '*':  case '&':  case '#':
365       case 'E':  case 'F':  case 'G':  case 'H':
366       case 's':  case 'i':  case 'n':
367       case 'I':  case 'J':  case 'K':  case 'L':  case 'M':
368       case 'N':  case 'O':  case 'P':  case ',':
369         break;
370
371       case '0':  case '1':  case '2':  case '3':  case '4':
372       case '5':  case '6':  case '7':  case '8':  case '9':
373       case '[':
374         error ("matching constraint not valid in output operand");
375         return false;
376
377       case '<':  case '>':
378         /* ??? Before flow, auto inc/dec insns are not supposed to exist,
379            excepting those that expand_call created.  So match memory
380            and hope.  */
381         *allows_mem = true;
382         break;
383
384       case 'g':  case 'X':
385         *allows_reg = true;
386         *allows_mem = true;
387         break;
388
389       case 'p': case 'r':
390         *allows_reg = true;
391         break;
392
393       default:
394         if (!ISALPHA (*p))
395           break;
396         if (REG_CLASS_FROM_CONSTRAINT (*p, p) != NO_REGS)
397           *allows_reg = true;
398 #ifdef EXTRA_CONSTRAINT_STR
399         else if (EXTRA_ADDRESS_CONSTRAINT (*p, p))
400           *allows_reg = true;
401         else if (EXTRA_MEMORY_CONSTRAINT (*p, p))
402           *allows_mem = true;
403         else
404           {
405             /* Otherwise we can't assume anything about the nature of
406                the constraint except that it isn't purely registers.
407                Treat it like "g" and hope for the best.  */
408             *allows_reg = true;
409             *allows_mem = true;
410           }
411 #endif
412         break;
413       }
414
415   return true;
416 }
417
418 /* Similar, but for input constraints.  */
419
420 bool
421 parse_input_constraint (const char **constraint_p, int input_num,
422                         int ninputs, int noutputs, int ninout,
423                         const char * const * constraints,
424                         bool *allows_mem, bool *allows_reg)
425 {
426   const char *constraint = *constraint_p;
427   const char *orig_constraint = constraint;
428   size_t c_len = strlen (constraint);
429   size_t j;
430   bool saw_match = false;
431
432   /* Assume the constraint doesn't allow the use of either
433      a register or memory.  */
434   *allows_mem = false;
435   *allows_reg = false;
436
437   /* Make sure constraint has neither `=', `+', nor '&'.  */
438
439   for (j = 0; j < c_len; j += CONSTRAINT_LEN (constraint[j], constraint+j))
440     switch (constraint[j])
441       {
442       case '+':  case '=':  case '&':
443         if (constraint == orig_constraint)
444           {
445             error ("input operand constraint contains %qc", constraint[j]);
446             return false;
447           }
448         break;
449
450       case '%':
451         if (constraint == orig_constraint
452             && input_num + 1 == ninputs - ninout)
453           {
454             error ("%<%%%> constraint used with last operand");
455             return false;
456           }
457         break;
458
459       case 'V':  case TARGET_MEM_CONSTRAINT:  case 'o':
460         *allows_mem = true;
461         break;
462
463       case '<':  case '>':
464       case '?':  case '!':  case '*':  case '#':
465       case 'E':  case 'F':  case 'G':  case 'H':
466       case 's':  case 'i':  case 'n':
467       case 'I':  case 'J':  case 'K':  case 'L':  case 'M':
468       case 'N':  case 'O':  case 'P':  case ',':
469         break;
470
471         /* Whether or not a numeric constraint allows a register is
472            decided by the matching constraint, and so there is no need
473            to do anything special with them.  We must handle them in
474            the default case, so that we don't unnecessarily force
475            operands to memory.  */
476       case '0':  case '1':  case '2':  case '3':  case '4':
477       case '5':  case '6':  case '7':  case '8':  case '9':
478         {
479           char *end;
480           unsigned long match;
481
482           saw_match = true;
483
484           match = strtoul (constraint + j, &end, 10);
485           if (match >= (unsigned long) noutputs)
486             {
487               error ("matching constraint references invalid operand number");
488               return false;
489             }
490
491           /* Try and find the real constraint for this dup.  Only do this
492              if the matching constraint is the only alternative.  */
493           if (*end == '\0'
494               && (j == 0 || (j == 1 && constraint[0] == '%')))
495             {
496               constraint = constraints[match];
497               *constraint_p = constraint;
498               c_len = strlen (constraint);
499               j = 0;
500               /* ??? At the end of the loop, we will skip the first part of
501                  the matched constraint.  This assumes not only that the
502                  other constraint is an output constraint, but also that
503                  the '=' or '+' come first.  */
504               break;
505             }
506           else
507             j = end - constraint;
508           /* Anticipate increment at end of loop.  */
509           j--;
510         }
511         /* Fall through.  */
512
513       case 'p':  case 'r':
514         *allows_reg = true;
515         break;
516
517       case 'g':  case 'X':
518         *allows_reg = true;
519         *allows_mem = true;
520         break;
521
522       default:
523         if (! ISALPHA (constraint[j]))
524           {
525             error ("invalid punctuation %qc in constraint", constraint[j]);
526             return false;
527           }
528         if (REG_CLASS_FROM_CONSTRAINT (constraint[j], constraint + j)
529             != NO_REGS)
530           *allows_reg = true;
531 #ifdef EXTRA_CONSTRAINT_STR
532         else if (EXTRA_ADDRESS_CONSTRAINT (constraint[j], constraint + j))
533           *allows_reg = true;
534         else if (EXTRA_MEMORY_CONSTRAINT (constraint[j], constraint + j))
535           *allows_mem = true;
536         else
537           {
538             /* Otherwise we can't assume anything about the nature of
539                the constraint except that it isn't purely registers.
540                Treat it like "g" and hope for the best.  */
541             *allows_reg = true;
542             *allows_mem = true;
543           }
544 #endif
545         break;
546       }
547
548   if (saw_match && !*allows_reg)
549     warning (0, "matching constraint does not allow a register");
550
551   return true;
552 }
553
554 /* Return DECL iff there's an overlap between *REGS and DECL, where DECL
555    can be an asm-declared register.  Called via walk_tree.  */
556
557 static tree
558 decl_overlaps_hard_reg_set_p (tree *declp, int *walk_subtrees ATTRIBUTE_UNUSED,
559                               void *data)
560 {
561   tree decl = *declp;
562   const HARD_REG_SET *const regs = (const HARD_REG_SET *) data;
563
564   if (TREE_CODE (decl) == VAR_DECL)
565     {
566       if (DECL_HARD_REGISTER (decl)
567           && REG_P (DECL_RTL (decl))
568           && REGNO (DECL_RTL (decl)) < FIRST_PSEUDO_REGISTER)
569         {
570           rtx reg = DECL_RTL (decl);
571
572           if (overlaps_hard_reg_set_p (*regs, GET_MODE (reg), REGNO (reg)))
573             return decl;
574         }
575       walk_subtrees = 0;
576     }
577   else if (TYPE_P (decl) || TREE_CODE (decl) == PARM_DECL)
578     walk_subtrees = 0;
579   return NULL_TREE;
580 }
581
582 /* If there is an overlap between *REGS and DECL, return the first overlap
583    found.  */
584 tree
585 tree_overlaps_hard_reg_set (tree decl, HARD_REG_SET *regs)
586 {
587   return walk_tree (&decl, decl_overlaps_hard_reg_set_p, regs, NULL);
588 }
589
590 /* Check for overlap between registers marked in CLOBBERED_REGS and
591    anything inappropriate in T.  Emit error and return the register
592    variable definition for error, NULL_TREE for ok.  */
593
594 static bool
595 tree_conflicts_with_clobbers_p (tree t, HARD_REG_SET *clobbered_regs)
596 {
597   /* Conflicts between asm-declared register variables and the clobber
598      list are not allowed.  */
599   tree overlap = tree_overlaps_hard_reg_set (t, clobbered_regs);
600
601   if (overlap)
602     {
603       error ("asm-specifier for variable %qs conflicts with asm clobber list",
604              IDENTIFIER_POINTER (DECL_NAME (overlap)));
605
606       /* Reset registerness to stop multiple errors emitted for a single
607          variable.  */
608       DECL_REGISTER (overlap) = 0;
609       return true;
610     }
611
612   return false;
613 }
614
615 /* Generate RTL for an asm statement with arguments.
616    STRING is the instruction template.
617    OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs.
618    Each output or input has an expression in the TREE_VALUE and
619    a tree list in TREE_PURPOSE which in turn contains a constraint
620    name in TREE_VALUE (or NULL_TREE) and a constraint string
621    in TREE_PURPOSE.
622    CLOBBERS is a list of STRING_CST nodes each naming a hard register
623    that is clobbered by this insn.
624
625    Not all kinds of lvalue that may appear in OUTPUTS can be stored directly.
626    Some elements of OUTPUTS may be replaced with trees representing temporary
627    values.  The caller should copy those temporary values to the originally
628    specified lvalues.
629
630    VOL nonzero means the insn is volatile; don't optimize it.  */
631
632 static void
633 expand_asm_operands (tree string, tree outputs, tree inputs,
634                      tree clobbers, int vol, location_t locus)
635 {
636   rtvec argvec, constraintvec;
637   rtx body;
638   int ninputs = list_length (inputs);
639   int noutputs = list_length (outputs);
640   int ninout;
641   int nclobbers;
642   HARD_REG_SET clobbered_regs;
643   int clobber_conflict_found = 0;
644   tree tail;
645   tree t;
646   int i;
647   /* Vector of RTX's of evaluated output operands.  */
648   rtx *output_rtx = XALLOCAVEC (rtx, noutputs);
649   int *inout_opnum = XALLOCAVEC (int, noutputs);
650   rtx *real_output_rtx = XALLOCAVEC (rtx, noutputs);
651   enum machine_mode *inout_mode = XALLOCAVEC (enum machine_mode, noutputs);
652   const char **constraints = XALLOCAVEC (const char *, noutputs + ninputs);
653   int old_generating_concat_p = generating_concat_p;
654
655   /* An ASM with no outputs needs to be treated as volatile, for now.  */
656   if (noutputs == 0)
657     vol = 1;
658
659   if (! check_operand_nalternatives (outputs, inputs))
660     return;
661
662   string = resolve_asm_operand_names (string, outputs, inputs);
663
664   /* Collect constraints.  */
665   i = 0;
666   for (t = outputs; t ; t = TREE_CHAIN (t), i++)
667     constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
668   for (t = inputs; t ; t = TREE_CHAIN (t), i++)
669     constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
670
671   /* Sometimes we wish to automatically clobber registers across an asm.
672      Case in point is when the i386 backend moved from cc0 to a hard reg --
673      maintaining source-level compatibility means automatically clobbering
674      the flags register.  */
675   clobbers = targetm.md_asm_clobbers (outputs, inputs, clobbers);
676
677   /* Count the number of meaningful clobbered registers, ignoring what
678      we would ignore later.  */
679   nclobbers = 0;
680   CLEAR_HARD_REG_SET (clobbered_regs);
681   for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
682     {
683       const char *regname;
684
685       if (TREE_VALUE (tail) == error_mark_node)
686         return;
687       regname = TREE_STRING_POINTER (TREE_VALUE (tail));
688
689       i = decode_reg_name (regname);
690       if (i >= 0 || i == -4)
691         ++nclobbers;
692       else if (i == -2)
693         error ("unknown register name %qs in %<asm%>", regname);
694
695       /* Mark clobbered registers.  */
696       if (i >= 0)
697         {
698           /* Clobbering the PIC register is an error.  */
699           if (i == (int) PIC_OFFSET_TABLE_REGNUM)
700             {
701               error ("PIC register %qs clobbered in %<asm%>", regname);
702               return;
703             }
704
705           SET_HARD_REG_BIT (clobbered_regs, i);
706         }
707     }
708
709   /* First pass over inputs and outputs checks validity and sets
710      mark_addressable if needed.  */
711
712   ninout = 0;
713   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
714     {
715       tree val = TREE_VALUE (tail);
716       tree type = TREE_TYPE (val);
717       const char *constraint;
718       bool is_inout;
719       bool allows_reg;
720       bool allows_mem;
721
722       /* If there's an erroneous arg, emit no insn.  */
723       if (type == error_mark_node)
724         return;
725
726       /* Try to parse the output constraint.  If that fails, there's
727          no point in going further.  */
728       constraint = constraints[i];
729       if (!parse_output_constraint (&constraint, i, ninputs, noutputs,
730                                     &allows_mem, &allows_reg, &is_inout))
731         return;
732
733       if (! allows_reg
734           && (allows_mem
735               || is_inout
736               || (DECL_P (val)
737                   && REG_P (DECL_RTL (val))
738                   && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type))))
739         lang_hooks.mark_addressable (val);
740
741       if (is_inout)
742         ninout++;
743     }
744
745   ninputs += ninout;
746   if (ninputs + noutputs > MAX_RECOG_OPERANDS)
747     {
748       error ("more than %d operands in %<asm%>", MAX_RECOG_OPERANDS);
749       return;
750     }
751
752   for (i = 0, tail = inputs; tail; i++, tail = TREE_CHAIN (tail))
753     {
754       bool allows_reg, allows_mem;
755       const char *constraint;
756
757       /* If there's an erroneous arg, emit no insn, because the ASM_INPUT
758          would get VOIDmode and that could cause a crash in reload.  */
759       if (TREE_TYPE (TREE_VALUE (tail)) == error_mark_node)
760         return;
761
762       constraint = constraints[i + noutputs];
763       if (! parse_input_constraint (&constraint, i, ninputs, noutputs, ninout,
764                                     constraints, &allows_mem, &allows_reg))
765         return;
766
767       if (! allows_reg && allows_mem)
768         lang_hooks.mark_addressable (TREE_VALUE (tail));
769     }
770
771   /* Second pass evaluates arguments.  */
772
773   ninout = 0;
774   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
775     {
776       tree val = TREE_VALUE (tail);
777       tree type = TREE_TYPE (val);
778       bool is_inout;
779       bool allows_reg;
780       bool allows_mem;
781       rtx op;
782       bool ok;
783
784       ok = parse_output_constraint (&constraints[i], i, ninputs,
785                                     noutputs, &allows_mem, &allows_reg,
786                                     &is_inout);
787       gcc_assert (ok);
788
789       /* If an output operand is not a decl or indirect ref and our constraint
790          allows a register, make a temporary to act as an intermediate.
791          Make the asm insn write into that, then our caller will copy it to
792          the real output operand.  Likewise for promoted variables.  */
793
794       generating_concat_p = 0;
795
796       real_output_rtx[i] = NULL_RTX;
797       if ((TREE_CODE (val) == INDIRECT_REF
798            && allows_mem)
799           || (DECL_P (val)
800               && (allows_mem || REG_P (DECL_RTL (val)))
801               && ! (REG_P (DECL_RTL (val))
802                     && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
803           || ! allows_reg
804           || is_inout)
805         {
806           op = expand_expr (val, NULL_RTX, VOIDmode, EXPAND_WRITE);
807           if (MEM_P (op))
808             op = validize_mem (op);
809
810           if (! allows_reg && !MEM_P (op))
811             error ("output number %d not directly addressable", i);
812           if ((! allows_mem && MEM_P (op))
813               || GET_CODE (op) == CONCAT)
814             {
815               real_output_rtx[i] = op;
816               op = gen_reg_rtx (GET_MODE (op));
817               if (is_inout)
818                 emit_move_insn (op, real_output_rtx[i]);
819             }
820         }
821       else
822         {
823           op = assign_temp (type, 0, 0, 1);
824           op = validize_mem (op);
825           TREE_VALUE (tail) = make_tree (type, op);
826         }
827       output_rtx[i] = op;
828
829       generating_concat_p = old_generating_concat_p;
830
831       if (is_inout)
832         {
833           inout_mode[ninout] = TYPE_MODE (type);
834           inout_opnum[ninout++] = i;
835         }
836
837       if (tree_conflicts_with_clobbers_p (val, &clobbered_regs))
838         clobber_conflict_found = 1;
839     }
840
841   /* Make vectors for the expression-rtx, constraint strings,
842      and named operands.  */
843
844   argvec = rtvec_alloc (ninputs);
845   constraintvec = rtvec_alloc (ninputs);
846
847   body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode
848                                 : GET_MODE (output_rtx[0])),
849                                ggc_strdup (TREE_STRING_POINTER (string)),
850                                empty_string, 0, argvec, constraintvec,
851                                locus);
852
853   MEM_VOLATILE_P (body) = vol;
854
855   /* Eval the inputs and put them into ARGVEC.
856      Put their constraints into ASM_INPUTs and store in CONSTRAINTS.  */
857
858   for (i = 0, tail = inputs; tail; tail = TREE_CHAIN (tail), ++i)
859     {
860       bool allows_reg, allows_mem;
861       const char *constraint;
862       tree val, type;
863       rtx op;
864       bool ok;
865
866       constraint = constraints[i + noutputs];
867       ok = parse_input_constraint (&constraint, i, ninputs, noutputs, ninout,
868                                    constraints, &allows_mem, &allows_reg);
869       gcc_assert (ok);
870
871       generating_concat_p = 0;
872
873       val = TREE_VALUE (tail);
874       type = TREE_TYPE (val);
875       /* EXPAND_INITIALIZER will not generate code for valid initializer
876          constants, but will still generate code for other types of operand.
877          This is the behavior we want for constant constraints.  */
878       op = expand_expr (val, NULL_RTX, VOIDmode,
879                         allows_reg ? EXPAND_NORMAL
880                         : allows_mem ? EXPAND_MEMORY
881                         : EXPAND_INITIALIZER);
882
883       /* Never pass a CONCAT to an ASM.  */
884       if (GET_CODE (op) == CONCAT)
885         op = force_reg (GET_MODE (op), op);
886       else if (MEM_P (op))
887         op = validize_mem (op);
888
889       if (asm_operand_ok (op, constraint) <= 0)
890         {
891           if (allows_reg && TYPE_MODE (type) != BLKmode)
892             op = force_reg (TYPE_MODE (type), op);
893           else if (!allows_mem)
894             warning (0, "asm operand %d probably doesn%'t match constraints",
895                      i + noutputs);
896           else if (MEM_P (op))
897             {
898               /* We won't recognize either volatile memory or memory
899                  with a queued address as available a memory_operand
900                  at this point.  Ignore it: clearly this *is* a memory.  */
901             }
902           else
903             {
904               warning (0, "use of memory input without lvalue in "
905                        "asm operand %d is deprecated", i + noutputs);
906
907               if (CONSTANT_P (op))
908                 {
909                   rtx mem = force_const_mem (TYPE_MODE (type), op);
910                   if (mem)
911                     op = validize_mem (mem);
912                   else
913                     op = force_reg (TYPE_MODE (type), op);
914                 }
915               if (REG_P (op)
916                   || GET_CODE (op) == SUBREG
917                   || GET_CODE (op) == CONCAT)
918                 {
919                   tree qual_type = build_qualified_type (type,
920                                                          (TYPE_QUALS (type)
921                                                           | TYPE_QUAL_CONST));
922                   rtx memloc = assign_temp (qual_type, 1, 1, 1);
923                   memloc = validize_mem (memloc);
924                   emit_move_insn (memloc, op);
925                   op = memloc;
926                 }
927             }
928         }
929
930       generating_concat_p = old_generating_concat_p;
931       ASM_OPERANDS_INPUT (body, i) = op;
932
933       ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i)
934         = gen_rtx_ASM_INPUT (TYPE_MODE (type), 
935                              ggc_strdup (constraints[i + noutputs]));
936
937       if (tree_conflicts_with_clobbers_p (val, &clobbered_regs))
938         clobber_conflict_found = 1;
939     }
940
941   /* Protect all the operands from the queue now that they have all been
942      evaluated.  */
943
944   generating_concat_p = 0;
945
946   /* For in-out operands, copy output rtx to input rtx.  */
947   for (i = 0; i < ninout; i++)
948     {
949       int j = inout_opnum[i];
950       char buffer[16];
951
952       ASM_OPERANDS_INPUT (body, ninputs - ninout + i)
953         = output_rtx[j];
954
955       sprintf (buffer, "%d", j);
956       ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, ninputs - ninout + i)
957         = gen_rtx_ASM_INPUT (inout_mode[i], ggc_strdup (buffer));
958     }
959
960   generating_concat_p = old_generating_concat_p;
961
962   /* Now, for each output, construct an rtx
963      (set OUTPUT (asm_operands INSN OUTPUTCONSTRAINT OUTPUTNUMBER
964                                ARGVEC CONSTRAINTS OPNAMES))
965      If there is more than one, put them inside a PARALLEL.  */
966
967   if (noutputs == 1 && nclobbers == 0)
968     {
969       ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = ggc_strdup (constraints[0]);
970       emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
971     }
972
973   else if (noutputs == 0 && nclobbers == 0)
974     {
975       /* No output operands: put in a raw ASM_OPERANDS rtx.  */
976       emit_insn (body);
977     }
978
979   else
980     {
981       rtx obody = body;
982       int num = noutputs;
983
984       if (num == 0)
985         num = 1;
986
987       body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num + nclobbers));
988
989       /* For each output operand, store a SET.  */
990       for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
991         {
992           XVECEXP (body, 0, i)
993             = gen_rtx_SET (VOIDmode,
994                            output_rtx[i],
995                            gen_rtx_ASM_OPERANDS
996                            (GET_MODE (output_rtx[i]),
997                             ggc_strdup (TREE_STRING_POINTER (string)),
998                             ggc_strdup (constraints[i]),
999                             i, argvec, constraintvec, locus));
1000
1001           MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol;
1002         }
1003
1004       /* If there are no outputs (but there are some clobbers)
1005          store the bare ASM_OPERANDS into the PARALLEL.  */
1006
1007       if (i == 0)
1008         XVECEXP (body, 0, i++) = obody;
1009
1010       /* Store (clobber REG) for each clobbered register specified.  */
1011
1012       for (tail = clobbers; tail; tail = TREE_CHAIN (tail))
1013         {
1014           const char *regname = TREE_STRING_POINTER (TREE_VALUE (tail));
1015           int j = decode_reg_name (regname);
1016           rtx clobbered_reg;
1017
1018           if (j < 0)
1019             {
1020               if (j == -3)      /* `cc', which is not a register */
1021                 continue;
1022
1023               if (j == -4)      /* `memory', don't cache memory across asm */
1024                 {
1025                   XVECEXP (body, 0, i++)
1026                     = gen_rtx_CLOBBER (VOIDmode,
1027                                        gen_rtx_MEM
1028                                        (BLKmode,
1029                                         gen_rtx_SCRATCH (VOIDmode)));
1030                   continue;
1031                 }
1032
1033               /* Ignore unknown register, error already signaled.  */
1034               continue;
1035             }
1036
1037           /* Use QImode since that's guaranteed to clobber just one reg.  */
1038           clobbered_reg = gen_rtx_REG (QImode, j);
1039
1040           /* Do sanity check for overlap between clobbers and respectively
1041              input and outputs that hasn't been handled.  Such overlap
1042              should have been detected and reported above.  */
1043           if (!clobber_conflict_found)
1044             {
1045               int opno;
1046
1047               /* We test the old body (obody) contents to avoid tripping
1048                  over the under-construction body.  */
1049               for (opno = 0; opno < noutputs; opno++)
1050                 if (reg_overlap_mentioned_p (clobbered_reg, output_rtx[opno]))
1051                   internal_error ("asm clobber conflict with output operand");
1052
1053               for (opno = 0; opno < ninputs - ninout; opno++)
1054                 if (reg_overlap_mentioned_p (clobbered_reg,
1055                                              ASM_OPERANDS_INPUT (obody, opno)))
1056                   internal_error ("asm clobber conflict with input operand");
1057             }
1058
1059           XVECEXP (body, 0, i++)
1060             = gen_rtx_CLOBBER (VOIDmode, clobbered_reg);
1061         }
1062
1063       emit_insn (body);
1064     }
1065
1066   /* For any outputs that needed reloading into registers, spill them
1067      back to where they belong.  */
1068   for (i = 0; i < noutputs; ++i)
1069     if (real_output_rtx[i])
1070       emit_move_insn (real_output_rtx[i], output_rtx[i]);
1071
1072   crtl->has_asm_statement = 1;
1073   free_temp_slots ();
1074 }
1075
1076 void
1077 expand_asm_expr (tree exp)
1078 {
1079   int noutputs, i;
1080   tree outputs, tail;
1081   tree *o;
1082
1083   if (ASM_INPUT_P (exp))
1084     {
1085       expand_asm_loc (ASM_STRING (exp), ASM_VOLATILE_P (exp), input_location);
1086       return;
1087     }
1088
1089   outputs = ASM_OUTPUTS (exp);
1090   noutputs = list_length (outputs);
1091   /* o[I] is the place that output number I should be written.  */
1092   o = (tree *) alloca (noutputs * sizeof (tree));
1093
1094   /* Record the contents of OUTPUTS before it is modified.  */
1095   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1096     o[i] = TREE_VALUE (tail);
1097
1098   /* Generate the ASM_OPERANDS insn; store into the TREE_VALUEs of
1099      OUTPUTS some trees for where the values were actually stored.  */
1100   expand_asm_operands (ASM_STRING (exp), outputs, ASM_INPUTS (exp),
1101                        ASM_CLOBBERS (exp), ASM_VOLATILE_P (exp),
1102                        input_location);
1103
1104   /* Copy all the intermediate outputs into the specified outputs.  */
1105   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
1106     {
1107       if (o[i] != TREE_VALUE (tail))
1108         {
1109           expand_assignment (o[i], TREE_VALUE (tail), false);
1110           free_temp_slots ();
1111
1112           /* Restore the original value so that it's correct the next
1113              time we expand this function.  */
1114           TREE_VALUE (tail) = o[i];
1115         }
1116     }
1117 }
1118
1119 /* A subroutine of expand_asm_operands.  Check that all operands have
1120    the same number of alternatives.  Return true if so.  */
1121
1122 static bool
1123 check_operand_nalternatives (tree outputs, tree inputs)
1124 {
1125   if (outputs || inputs)
1126     {
1127       tree tmp = TREE_PURPOSE (outputs ? outputs : inputs);
1128       int nalternatives
1129         = n_occurrences (',', TREE_STRING_POINTER (TREE_VALUE (tmp)));
1130       tree next = inputs;
1131
1132       if (nalternatives + 1 > MAX_RECOG_ALTERNATIVES)
1133         {
1134           error ("too many alternatives in %<asm%>");
1135           return false;
1136         }
1137
1138       tmp = outputs;
1139       while (tmp)
1140         {
1141           const char *constraint
1142             = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tmp)));
1143
1144           if (n_occurrences (',', constraint) != nalternatives)
1145             {
1146               error ("operand constraints for %<asm%> differ "
1147                      "in number of alternatives");
1148               return false;
1149             }
1150
1151           if (TREE_CHAIN (tmp))
1152             tmp = TREE_CHAIN (tmp);
1153           else
1154             tmp = next, next = 0;
1155         }
1156     }
1157
1158   return true;
1159 }
1160
1161 /* A subroutine of expand_asm_operands.  Check that all operand names
1162    are unique.  Return true if so.  We rely on the fact that these names
1163    are identifiers, and so have been canonicalized by get_identifier,
1164    so all we need are pointer comparisons.  */
1165
1166 static bool
1167 check_unique_operand_names (tree outputs, tree inputs)
1168 {
1169   tree i, j;
1170
1171   for (i = outputs; i ; i = TREE_CHAIN (i))
1172     {
1173       tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
1174       if (! i_name)
1175         continue;
1176
1177       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
1178         if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1179           goto failure;
1180     }
1181
1182   for (i = inputs; i ; i = TREE_CHAIN (i))
1183     {
1184       tree i_name = TREE_PURPOSE (TREE_PURPOSE (i));
1185       if (! i_name)
1186         continue;
1187
1188       for (j = TREE_CHAIN (i); j ; j = TREE_CHAIN (j))
1189         if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1190           goto failure;
1191       for (j = outputs; j ; j = TREE_CHAIN (j))
1192         if (simple_cst_equal (i_name, TREE_PURPOSE (TREE_PURPOSE (j))))
1193           goto failure;
1194     }
1195
1196   return true;
1197
1198  failure:
1199   error ("duplicate asm operand name %qs",
1200          TREE_STRING_POINTER (TREE_PURPOSE (TREE_PURPOSE (i))));
1201   return false;
1202 }
1203
1204 /* A subroutine of expand_asm_operands.  Resolve the names of the operands
1205    in *POUTPUTS and *PINPUTS to numbers, and replace the name expansions in
1206    STRING and in the constraints to those numbers.  */
1207
1208 tree
1209 resolve_asm_operand_names (tree string, tree outputs, tree inputs)
1210 {
1211   char *buffer;
1212   char *p;
1213   const char *c;
1214   tree t;
1215
1216   check_unique_operand_names (outputs, inputs);
1217
1218   /* Substitute [<name>] in input constraint strings.  There should be no
1219      named operands in output constraints.  */
1220   for (t = inputs; t ; t = TREE_CHAIN (t))
1221     {
1222       c = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
1223       if (strchr (c, '[') != NULL)
1224         {
1225           p = buffer = xstrdup (c);
1226           while ((p = strchr (p, '[')) != NULL)
1227             p = resolve_operand_name_1 (p, outputs, inputs);
1228           TREE_VALUE (TREE_PURPOSE (t))
1229             = build_string (strlen (buffer), buffer);
1230           free (buffer);
1231         }
1232     }
1233
1234   /* Now check for any needed substitutions in the template.  */
1235   c = TREE_STRING_POINTER (string);
1236   while ((c = strchr (c, '%')) != NULL)
1237     {
1238       if (c[1] == '[')
1239         break;
1240       else if (ISALPHA (c[1]) && c[2] == '[')
1241         break;
1242       else
1243         {
1244           c += 1;
1245           continue;
1246         }
1247     }
1248
1249   if (c)
1250     {
1251       /* OK, we need to make a copy so we can perform the substitutions.
1252          Assume that we will not need extra space--we get to remove '['
1253          and ']', which means we cannot have a problem until we have more
1254          than 999 operands.  */
1255       buffer = xstrdup (TREE_STRING_POINTER (string));
1256       p = buffer + (c - TREE_STRING_POINTER (string));
1257
1258       while ((p = strchr (p, '%')) != NULL)
1259         {
1260           if (p[1] == '[')
1261             p += 1;
1262           else if (ISALPHA (p[1]) && p[2] == '[')
1263             p += 2;
1264           else
1265             {
1266               p += 1;
1267               continue;
1268             }
1269
1270           p = resolve_operand_name_1 (p, outputs, inputs);
1271         }
1272
1273       string = build_string (strlen (buffer), buffer);
1274       free (buffer);
1275     }
1276
1277   return string;
1278 }
1279
1280 /* A subroutine of resolve_operand_names.  P points to the '[' for a
1281    potential named operand of the form [<name>].  In place, replace
1282    the name and brackets with a number.  Return a pointer to the
1283    balance of the string after substitution.  */
1284
1285 static char *
1286 resolve_operand_name_1 (char *p, tree outputs, tree inputs)
1287 {
1288   char *q;
1289   int op;
1290   tree t;
1291   size_t len;
1292
1293   /* Collect the operand name.  */
1294   q = strchr (p, ']');
1295   if (!q)
1296     {
1297       error ("missing close brace for named operand");
1298       return strchr (p, '\0');
1299     }
1300   len = q - p - 1;
1301
1302   /* Resolve the name to a number.  */
1303   for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++)
1304     {
1305       tree name = TREE_PURPOSE (TREE_PURPOSE (t));
1306       if (name)
1307         {
1308           const char *c = TREE_STRING_POINTER (name);
1309           if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
1310             goto found;
1311         }
1312     }
1313   for (t = inputs; t ; t = TREE_CHAIN (t), op++)
1314     {
1315       tree name = TREE_PURPOSE (TREE_PURPOSE (t));
1316       if (name)
1317         {
1318           const char *c = TREE_STRING_POINTER (name);
1319           if (strncmp (c, p + 1, len) == 0 && c[len] == '\0')
1320             goto found;
1321         }
1322     }
1323
1324   *q = '\0';
1325   error ("undefined named operand %qs", p + 1);
1326   op = 0;
1327  found:
1328
1329   /* Replace the name with the number.  Unfortunately, not all libraries
1330      get the return value of sprintf correct, so search for the end of the
1331      generated string by hand.  */
1332   sprintf (p, "%d", op);
1333   p = strchr (p, '\0');
1334
1335   /* Verify the no extra buffer space assumption.  */
1336   gcc_assert (p <= q);
1337
1338   /* Shift the rest of the buffer down to fill the gap.  */
1339   memmove (p, q + 1, strlen (q + 1) + 1);
1340
1341   return p;
1342 }
1343 \f
1344 /* Generate RTL to evaluate the expression EXP.  */
1345
1346 void
1347 expand_expr_stmt (tree exp)
1348 {
1349   rtx value;
1350   tree type;
1351
1352   value = expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
1353   type = TREE_TYPE (exp);
1354
1355   /* If all we do is reference a volatile value in memory,
1356      copy it to a register to be sure it is actually touched.  */
1357   if (value && MEM_P (value) && TREE_THIS_VOLATILE (exp))
1358     {
1359       if (TYPE_MODE (type) == VOIDmode)
1360         ;
1361       else if (TYPE_MODE (type) != BLKmode)
1362         value = copy_to_reg (value);
1363       else
1364         {
1365           rtx lab = gen_label_rtx ();
1366
1367           /* Compare the value with itself to reference it.  */
1368           emit_cmp_and_jump_insns (value, value, EQ,
1369                                    expand_normal (TYPE_SIZE (type)),
1370                                    BLKmode, 0, lab);
1371           emit_label (lab);
1372         }
1373     }
1374
1375   /* Free any temporaries used to evaluate this expression.  */
1376   free_temp_slots ();
1377 }
1378
1379 /* Warn if EXP contains any computations whose results are not used.
1380    Return 1 if a warning is printed; 0 otherwise.  LOCUS is the
1381    (potential) location of the expression.  */
1382
1383 int
1384 warn_if_unused_value (const_tree exp, location_t locus)
1385 {
1386  restart:
1387   if (TREE_USED (exp) || TREE_NO_WARNING (exp))
1388     return 0;
1389
1390   /* Don't warn about void constructs.  This includes casting to void,
1391      void function calls, and statement expressions with a final cast
1392      to void.  */
1393   if (VOID_TYPE_P (TREE_TYPE (exp)))
1394     return 0;
1395
1396   if (EXPR_HAS_LOCATION (exp))
1397     locus = EXPR_LOCATION (exp);
1398
1399   switch (TREE_CODE (exp))
1400     {
1401     case PREINCREMENT_EXPR:
1402     case POSTINCREMENT_EXPR:
1403     case PREDECREMENT_EXPR:
1404     case POSTDECREMENT_EXPR:
1405     case MODIFY_EXPR:
1406     case INIT_EXPR:
1407     case TARGET_EXPR:
1408     case CALL_EXPR:
1409     case TRY_CATCH_EXPR:
1410     case WITH_CLEANUP_EXPR:
1411     case EXIT_EXPR:
1412     case VA_ARG_EXPR:
1413       return 0;
1414
1415     case BIND_EXPR:
1416       /* For a binding, warn if no side effect within it.  */
1417       exp = BIND_EXPR_BODY (exp);
1418       goto restart;
1419
1420     case SAVE_EXPR:
1421       exp = TREE_OPERAND (exp, 0);
1422       goto restart;
1423
1424     case TRUTH_ORIF_EXPR:
1425     case TRUTH_ANDIF_EXPR:
1426       /* In && or ||, warn if 2nd operand has no side effect.  */
1427       exp = TREE_OPERAND (exp, 1);
1428       goto restart;
1429
1430     case COMPOUND_EXPR:
1431       if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus))
1432         return 1;
1433       /* Let people do `(foo (), 0)' without a warning.  */
1434       if (TREE_CONSTANT (TREE_OPERAND (exp, 1)))
1435         return 0;
1436       exp = TREE_OPERAND (exp, 1);
1437       goto restart;
1438
1439     case COND_EXPR:
1440       /* If this is an expression with side effects, don't warn; this
1441          case commonly appears in macro expansions.  */
1442       if (TREE_SIDE_EFFECTS (exp))
1443         return 0;
1444       goto warn;
1445
1446     case INDIRECT_REF:
1447       /* Don't warn about automatic dereferencing of references, since
1448          the user cannot control it.  */
1449       if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE)
1450         {
1451           exp = TREE_OPERAND (exp, 0);
1452           goto restart;
1453         }
1454       /* Fall through.  */
1455
1456     default:
1457       /* Referencing a volatile value is a side effect, so don't warn.  */
1458       if ((DECL_P (exp) || REFERENCE_CLASS_P (exp))
1459           && TREE_THIS_VOLATILE (exp))
1460         return 0;
1461
1462       /* If this is an expression which has no operands, there is no value
1463          to be unused.  There are no such language-independent codes,
1464          but front ends may define such.  */
1465       if (EXPRESSION_CLASS_P (exp) && TREE_OPERAND_LENGTH (exp) == 0)
1466         return 0;
1467
1468     warn:
1469       warning (OPT_Wunused_value, "%Hvalue computed is not used", &locus);
1470       return 1;
1471     }
1472 }
1473
1474 \f
1475 /* Generate RTL to return from the current function, with no value.
1476    (That is, we do not do anything about returning any value.)  */
1477
1478 void
1479 expand_null_return (void)
1480 {
1481   /* If this function was declared to return a value, but we
1482      didn't, clobber the return registers so that they are not
1483      propagated live to the rest of the function.  */
1484   clobber_return_register ();
1485
1486   expand_null_return_1 ();
1487 }
1488
1489 /* Generate RTL to return directly from the current function.
1490    (That is, we bypass any return value.)  */
1491
1492 void
1493 expand_naked_return (void)
1494 {
1495   rtx end_label;
1496
1497   clear_pending_stack_adjust ();
1498   do_pending_stack_adjust ();
1499
1500   end_label = naked_return_label;
1501   if (end_label == 0)
1502     end_label = naked_return_label = gen_label_rtx ();
1503
1504   emit_jump (end_label);
1505 }
1506
1507 /* Generate RTL to return from the current function, with value VAL.  */
1508
1509 static void
1510 expand_value_return (rtx val)
1511 {
1512   /* Copy the value to the return location
1513      unless it's already there.  */
1514
1515   rtx return_reg = DECL_RTL (DECL_RESULT (current_function_decl));
1516   if (return_reg != val)
1517     {
1518       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
1519       if (targetm.calls.promote_function_return (TREE_TYPE (current_function_decl)))
1520       {
1521         int unsignedp = TYPE_UNSIGNED (type);
1522         enum machine_mode old_mode
1523           = DECL_MODE (DECL_RESULT (current_function_decl));
1524         enum machine_mode mode
1525           = promote_mode (type, old_mode, &unsignedp, 1);
1526
1527         if (mode != old_mode)
1528           val = convert_modes (mode, old_mode, val, unsignedp);
1529       }
1530       if (GET_CODE (return_reg) == PARALLEL)
1531         emit_group_load (return_reg, val, type, int_size_in_bytes (type));
1532       else
1533         emit_move_insn (return_reg, val);
1534     }
1535
1536   expand_null_return_1 ();
1537 }
1538
1539 /* Output a return with no value.  */
1540
1541 static void
1542 expand_null_return_1 (void)
1543 {
1544   clear_pending_stack_adjust ();
1545   do_pending_stack_adjust ();
1546   emit_jump (return_label);
1547 }
1548 \f
1549 /* Generate RTL to evaluate the expression RETVAL and return it
1550    from the current function.  */
1551
1552 void
1553 expand_return (tree retval)
1554 {
1555   rtx result_rtl;
1556   rtx val = 0;
1557   tree retval_rhs;
1558
1559   /* If function wants no value, give it none.  */
1560   if (TREE_CODE (TREE_TYPE (TREE_TYPE (current_function_decl))) == VOID_TYPE)
1561     {
1562       expand_normal (retval);
1563       expand_null_return ();
1564       return;
1565     }
1566
1567   if (retval == error_mark_node)
1568     {
1569       /* Treat this like a return of no value from a function that
1570          returns a value.  */
1571       expand_null_return ();
1572       return;
1573     }
1574   else if ((TREE_CODE (retval) == MODIFY_EXPR
1575             || TREE_CODE (retval) == INIT_EXPR)
1576            && TREE_CODE (TREE_OPERAND (retval, 0)) == RESULT_DECL)
1577     retval_rhs = TREE_OPERAND (retval, 1);
1578   else
1579     retval_rhs = retval;
1580
1581   result_rtl = DECL_RTL (DECL_RESULT (current_function_decl));
1582
1583   /* If we are returning the RESULT_DECL, then the value has already
1584      been stored into it, so we don't have to do anything special.  */
1585   if (TREE_CODE (retval_rhs) == RESULT_DECL)
1586     expand_value_return (result_rtl);
1587
1588   /* If the result is an aggregate that is being returned in one (or more)
1589      registers, load the registers here.  The compiler currently can't handle
1590      copying a BLKmode value into registers.  We could put this code in a
1591      more general area (for use by everyone instead of just function
1592      call/return), but until this feature is generally usable it is kept here
1593      (and in expand_call).  */
1594
1595   else if (retval_rhs != 0
1596            && TYPE_MODE (TREE_TYPE (retval_rhs)) == BLKmode
1597            && REG_P (result_rtl))
1598     {
1599       int i;
1600       unsigned HOST_WIDE_INT bitpos, xbitpos;
1601       unsigned HOST_WIDE_INT padding_correction = 0;
1602       unsigned HOST_WIDE_INT bytes
1603         = int_size_in_bytes (TREE_TYPE (retval_rhs));
1604       int n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1605       unsigned int bitsize
1606         = MIN (TYPE_ALIGN (TREE_TYPE (retval_rhs)), BITS_PER_WORD);
1607       rtx *result_pseudos = XALLOCAVEC (rtx, n_regs);
1608       rtx result_reg, src = NULL_RTX, dst = NULL_RTX;
1609       rtx result_val = expand_normal (retval_rhs);
1610       enum machine_mode tmpmode, result_reg_mode;
1611
1612       if (bytes == 0)
1613         {
1614           expand_null_return ();
1615           return;
1616         }
1617
1618       /* If the structure doesn't take up a whole number of words, see
1619          whether the register value should be padded on the left or on
1620          the right.  Set PADDING_CORRECTION to the number of padding
1621          bits needed on the left side.
1622
1623          In most ABIs, the structure will be returned at the least end of
1624          the register, which translates to right padding on little-endian
1625          targets and left padding on big-endian targets.  The opposite
1626          holds if the structure is returned at the most significant
1627          end of the register.  */
1628       if (bytes % UNITS_PER_WORD != 0
1629           && (targetm.calls.return_in_msb (TREE_TYPE (retval_rhs))
1630               ? !BYTES_BIG_ENDIAN
1631               : BYTES_BIG_ENDIAN))
1632         padding_correction = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD)
1633                                                * BITS_PER_UNIT));
1634
1635       /* Copy the structure BITSIZE bits at a time.  */
1636       for (bitpos = 0, xbitpos = padding_correction;
1637            bitpos < bytes * BITS_PER_UNIT;
1638            bitpos += bitsize, xbitpos += bitsize)
1639         {
1640           /* We need a new destination pseudo each time xbitpos is
1641              on a word boundary and when xbitpos == padding_correction
1642              (the first time through).  */
1643           if (xbitpos % BITS_PER_WORD == 0
1644               || xbitpos == padding_correction)
1645             {
1646               /* Generate an appropriate register.  */
1647               dst = gen_reg_rtx (word_mode);
1648               result_pseudos[xbitpos / BITS_PER_WORD] = dst;
1649
1650               /* Clear the destination before we move anything into it.  */
1651               emit_move_insn (dst, CONST0_RTX (GET_MODE (dst)));
1652             }
1653
1654           /* We need a new source operand each time bitpos is on a word
1655              boundary.  */
1656           if (bitpos % BITS_PER_WORD == 0)
1657             src = operand_subword_force (result_val,
1658                                          bitpos / BITS_PER_WORD,
1659                                          BLKmode);
1660
1661           /* Use bitpos for the source extraction (left justified) and
1662              xbitpos for the destination store (right justified).  */
1663           store_bit_field (dst, bitsize, xbitpos % BITS_PER_WORD, word_mode,
1664                            extract_bit_field (src, bitsize,
1665                                               bitpos % BITS_PER_WORD, 1,
1666                                               NULL_RTX, word_mode, word_mode));
1667         }
1668
1669       tmpmode = GET_MODE (result_rtl);
1670       if (tmpmode == BLKmode)
1671         {
1672           /* Find the smallest integer mode large enough to hold the
1673              entire structure and use that mode instead of BLKmode
1674              on the USE insn for the return register.  */
1675           for (tmpmode = GET_CLASS_NARROWEST_MODE (MODE_INT);
1676                tmpmode != VOIDmode;
1677                tmpmode = GET_MODE_WIDER_MODE (tmpmode))
1678             /* Have we found a large enough mode?  */
1679             if (GET_MODE_SIZE (tmpmode) >= bytes)
1680               break;
1681
1682           /* A suitable mode should have been found.  */
1683           gcc_assert (tmpmode != VOIDmode);
1684
1685           PUT_MODE (result_rtl, tmpmode);
1686         }
1687
1688       if (GET_MODE_SIZE (tmpmode) < GET_MODE_SIZE (word_mode))
1689         result_reg_mode = word_mode;
1690       else
1691         result_reg_mode = tmpmode;
1692       result_reg = gen_reg_rtx (result_reg_mode);
1693
1694       for (i = 0; i < n_regs; i++)
1695         emit_move_insn (operand_subword (result_reg, i, 0, result_reg_mode),
1696                         result_pseudos[i]);
1697
1698       if (tmpmode != result_reg_mode)
1699         result_reg = gen_lowpart (tmpmode, result_reg);
1700
1701       expand_value_return (result_reg);
1702     }
1703   else if (retval_rhs != 0
1704            && !VOID_TYPE_P (TREE_TYPE (retval_rhs))
1705            && (REG_P (result_rtl)
1706                || (GET_CODE (result_rtl) == PARALLEL)))
1707     {
1708       /* Calculate the return value into a temporary (usually a pseudo
1709          reg).  */
1710       tree ot = TREE_TYPE (DECL_RESULT (current_function_decl));
1711       tree nt = build_qualified_type (ot, TYPE_QUALS (ot) | TYPE_QUAL_CONST);
1712
1713       val = assign_temp (nt, 0, 0, 1);
1714       val = expand_expr (retval_rhs, val, GET_MODE (val), EXPAND_NORMAL);
1715       val = force_not_mem (val);
1716       /* Return the calculated value.  */
1717       expand_value_return (val);
1718     }
1719   else
1720     {
1721       /* No hard reg used; calculate value into hard return reg.  */
1722       expand_expr (retval, const0_rtx, VOIDmode, EXPAND_NORMAL);
1723       expand_value_return (result_rtl);
1724     }
1725 }
1726 \f
1727 /* Given a pointer to a BLOCK node return nonzero if (and only if) the node
1728    in question represents the outermost pair of curly braces (i.e. the "body
1729    block") of a function or method.
1730
1731    For any BLOCK node representing a "body block" of a function or method, the
1732    BLOCK_SUPERCONTEXT of the node will point to another BLOCK node which
1733    represents the outermost (function) scope for the function or method (i.e.
1734    the one which includes the formal parameters).  The BLOCK_SUPERCONTEXT of
1735    *that* node in turn will point to the relevant FUNCTION_DECL node.  */
1736
1737 int
1738 is_body_block (const_tree stmt)
1739 {
1740   if (lang_hooks.no_body_blocks)
1741     return 0;
1742
1743   if (TREE_CODE (stmt) == BLOCK)
1744     {
1745       tree parent = BLOCK_SUPERCONTEXT (stmt);
1746
1747       if (parent && TREE_CODE (parent) == BLOCK)
1748         {
1749           tree grandparent = BLOCK_SUPERCONTEXT (parent);
1750
1751           if (grandparent && TREE_CODE (grandparent) == FUNCTION_DECL)
1752             return 1;
1753         }
1754     }
1755
1756   return 0;
1757 }
1758
1759 /* Emit code to restore vital registers at the beginning of a nonlocal goto
1760    handler.  */
1761 static void
1762 expand_nl_goto_receiver (void)
1763 {
1764   /* Clobber the FP when we get here, so we have to make sure it's
1765      marked as used by this function.  */
1766   emit_use (hard_frame_pointer_rtx);
1767
1768   /* Mark the static chain as clobbered here so life information
1769      doesn't get messed up for it.  */
1770   emit_clobber (static_chain_rtx);
1771
1772 #ifdef HAVE_nonlocal_goto
1773   if (! HAVE_nonlocal_goto)
1774 #endif
1775     /* First adjust our frame pointer to its actual value.  It was
1776        previously set to the start of the virtual area corresponding to
1777        the stacked variables when we branched here and now needs to be
1778        adjusted to the actual hardware fp value.
1779
1780        Assignments are to virtual registers are converted by
1781        instantiate_virtual_regs into the corresponding assignment
1782        to the underlying register (fp in this case) that makes
1783        the original assignment true.
1784        So the following insn will actually be
1785        decrementing fp by STARTING_FRAME_OFFSET.  */
1786     emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
1787
1788 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
1789   if (fixed_regs[ARG_POINTER_REGNUM])
1790     {
1791 #ifdef ELIMINABLE_REGS
1792       /* If the argument pointer can be eliminated in favor of the
1793          frame pointer, we don't need to restore it.  We assume here
1794          that if such an elimination is present, it can always be used.
1795          This is the case on all known machines; if we don't make this
1796          assumption, we do unnecessary saving on many machines.  */
1797       static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
1798       size_t i;
1799
1800       for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
1801         if (elim_regs[i].from == ARG_POINTER_REGNUM
1802             && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
1803           break;
1804
1805       if (i == ARRAY_SIZE (elim_regs))
1806 #endif
1807         {
1808           /* Now restore our arg pointer from the address at which it
1809              was saved in our stack frame.  */
1810           emit_move_insn (crtl->args.internal_arg_pointer,
1811                           copy_to_reg (get_arg_pointer_save_area ()));
1812         }
1813     }
1814 #endif
1815
1816 #ifdef HAVE_nonlocal_goto_receiver
1817   if (HAVE_nonlocal_goto_receiver)
1818     emit_insn (gen_nonlocal_goto_receiver ());
1819 #endif
1820
1821   /* We must not allow the code we just generated to be reordered by
1822      scheduling.  Specifically, the update of the frame pointer must
1823      happen immediately, not later.  */
1824   emit_insn (gen_blockage ());
1825 }
1826 \f
1827 /* Generate RTL for the automatic variable declaration DECL.
1828    (Other kinds of declarations are simply ignored if seen here.)  */
1829
1830 void
1831 expand_decl (tree decl)
1832 {
1833   tree type;
1834
1835   type = TREE_TYPE (decl);
1836
1837   /* For a CONST_DECL, set mode, alignment, and sizes from those of the
1838      type in case this node is used in a reference.  */
1839   if (TREE_CODE (decl) == CONST_DECL)
1840     {
1841       DECL_MODE (decl) = TYPE_MODE (type);
1842       DECL_ALIGN (decl) = TYPE_ALIGN (type);
1843       DECL_SIZE (decl) = TYPE_SIZE (type);
1844       DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (type);
1845       return;
1846     }
1847
1848   /* Otherwise, only automatic variables need any expansion done.  Static and
1849      external variables, and external functions, will be handled by
1850      `assemble_variable' (called from finish_decl).  TYPE_DECL requires
1851      nothing.  PARM_DECLs are handled in `assign_parms'.  */
1852   if (TREE_CODE (decl) != VAR_DECL)
1853     return;
1854
1855   if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
1856     return;
1857
1858   /* Create the RTL representation for the variable.  */
1859
1860   if (type == error_mark_node)
1861     SET_DECL_RTL (decl, gen_rtx_MEM (BLKmode, const0_rtx));
1862
1863   else if (DECL_SIZE (decl) == 0)
1864     {
1865       /* Variable with incomplete type.  */
1866       rtx x;
1867       if (DECL_INITIAL (decl) == 0)
1868         /* Error message was already done; now avoid a crash.  */
1869         x = gen_rtx_MEM (BLKmode, const0_rtx);
1870       else
1871         /* An initializer is going to decide the size of this array.
1872            Until we know the size, represent its address with a reg.  */
1873         x = gen_rtx_MEM (BLKmode, gen_reg_rtx (Pmode));
1874
1875       set_mem_attributes (x, decl, 1);
1876       SET_DECL_RTL (decl, x);
1877     }
1878   else if (use_register_for_decl (decl))
1879     {
1880       /* Automatic variable that can go in a register.  */
1881       int unsignedp = TYPE_UNSIGNED (type);
1882       enum machine_mode reg_mode
1883         = promote_mode (type, DECL_MODE (decl), &unsignedp, 0);
1884
1885       SET_DECL_RTL (decl, gen_reg_rtx (reg_mode));
1886
1887       /* Note if the object is a user variable.  */
1888       if (!DECL_ARTIFICIAL (decl))
1889           mark_user_reg (DECL_RTL (decl));
1890
1891       if (POINTER_TYPE_P (type))
1892         mark_reg_pointer (DECL_RTL (decl),
1893                           TYPE_ALIGN (TREE_TYPE (TREE_TYPE (decl))));
1894     }
1895
1896   else
1897     {
1898       rtx oldaddr = 0;
1899       rtx addr;
1900       rtx x;
1901
1902       /* Variable-sized decls are dealt with in the gimplifier.  */
1903       gcc_assert (TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST);
1904
1905       /* If we previously made RTL for this decl, it must be an array
1906          whose size was determined by the initializer.
1907          The old address was a register; set that register now
1908          to the proper address.  */
1909       if (DECL_RTL_SET_P (decl))
1910         {
1911           gcc_assert (MEM_P (DECL_RTL (decl)));
1912           gcc_assert (REG_P (XEXP (DECL_RTL (decl), 0)));
1913           oldaddr = XEXP (DECL_RTL (decl), 0);
1914         }
1915
1916       /* Set alignment we actually gave this decl.  */
1917       DECL_ALIGN (decl) = (DECL_MODE (decl) == BLKmode ? BIGGEST_ALIGNMENT
1918                            : GET_MODE_BITSIZE (DECL_MODE (decl)));
1919       DECL_USER_ALIGN (decl) = 0;
1920
1921       x = assign_temp (decl, 1, 1, 1);
1922       set_mem_attributes (x, decl, 1);
1923       SET_DECL_RTL (decl, x);
1924
1925       if (oldaddr)
1926         {
1927           addr = force_operand (XEXP (DECL_RTL (decl), 0), oldaddr);
1928           if (addr != oldaddr)
1929             emit_move_insn (oldaddr, addr);
1930         }
1931     }
1932 }
1933 \f
1934 /* Emit code to save the current value of stack.  */
1935 rtx
1936 expand_stack_save (void)
1937 {
1938   rtx ret = NULL_RTX;
1939
1940   do_pending_stack_adjust ();
1941   emit_stack_save (SAVE_BLOCK, &ret, NULL_RTX);
1942   return ret;
1943 }
1944
1945 /* Emit code to restore the current value of stack.  */
1946 void
1947 expand_stack_restore (tree var)
1948 {
1949   rtx sa = expand_normal (var);
1950
1951   sa = convert_memory_address (Pmode, sa);
1952   emit_stack_restore (SAVE_BLOCK, sa, NULL_RTX);
1953 }
1954 \f
1955 /* Do the insertion of a case label into case_list.  The labels are
1956    fed to us in descending order from the sorted vector of case labels used
1957    in the tree part of the middle end.  So the list we construct is
1958    sorted in ascending order.  The bounds on the case range, LOW and HIGH,
1959    are converted to case's index type TYPE.  */
1960
1961 static struct case_node *
1962 add_case_node (struct case_node *head, tree type, tree low, tree high,
1963                tree label, alloc_pool case_node_pool)
1964 {
1965   tree min_value, max_value;
1966   struct case_node *r;
1967
1968   gcc_assert (TREE_CODE (low) == INTEGER_CST);
1969   gcc_assert (!high || TREE_CODE (high) == INTEGER_CST);
1970
1971   min_value = TYPE_MIN_VALUE (type);
1972   max_value = TYPE_MAX_VALUE (type);
1973
1974   /* If there's no HIGH value, then this is not a case range; it's
1975      just a simple case label.  But that's just a degenerate case
1976      range.
1977      If the bounds are equal, turn this into the one-value case.  */
1978   if (!high || tree_int_cst_equal (low, high))
1979     {
1980       /* If the simple case value is unreachable, ignore it.  */
1981       if ((TREE_CODE (min_value) == INTEGER_CST
1982             && tree_int_cst_compare (low, min_value) < 0)
1983           || (TREE_CODE (max_value) == INTEGER_CST
1984               && tree_int_cst_compare (low, max_value) > 0))
1985         return head;
1986       low = fold_convert (type, low);
1987       high = low;
1988     }
1989   else
1990     {
1991       /* If the entire case range is unreachable, ignore it.  */
1992       if ((TREE_CODE (min_value) == INTEGER_CST
1993             && tree_int_cst_compare (high, min_value) < 0)
1994           || (TREE_CODE (max_value) == INTEGER_CST
1995               && tree_int_cst_compare (low, max_value) > 0))
1996         return head;
1997
1998       /* If the lower bound is less than the index type's minimum
1999          value, truncate the range bounds.  */
2000       if (TREE_CODE (min_value) == INTEGER_CST
2001             && tree_int_cst_compare (low, min_value) < 0)
2002         low = min_value;
2003       low = fold_convert (type, low);
2004
2005       /* If the upper bound is greater than the index type's maximum
2006          value, truncate the range bounds.  */
2007       if (TREE_CODE (max_value) == INTEGER_CST
2008           && tree_int_cst_compare (high, max_value) > 0)
2009         high = max_value;
2010       high = fold_convert (type, high);
2011     }
2012
2013
2014   /* Add this label to the chain.  Make sure to drop overflow flags.  */
2015   r = (struct case_node *) pool_alloc (case_node_pool);
2016   r->low = build_int_cst_wide (TREE_TYPE (low), TREE_INT_CST_LOW (low),
2017                                TREE_INT_CST_HIGH (low));
2018   r->high = build_int_cst_wide (TREE_TYPE (high), TREE_INT_CST_LOW (high),
2019                                 TREE_INT_CST_HIGH (high));
2020   r->code_label = label;
2021   r->parent = r->left = NULL;
2022   r->right = head;
2023   return r;
2024 }
2025 \f
2026 /* Maximum number of case bit tests.  */
2027 #define MAX_CASE_BIT_TESTS  3
2028
2029 /* By default, enable case bit tests on targets with ashlsi3.  */
2030 #ifndef CASE_USE_BIT_TESTS
2031 #define CASE_USE_BIT_TESTS  (optab_handler (ashl_optab, word_mode)->insn_code \
2032                              != CODE_FOR_nothing)
2033 #endif
2034
2035
2036 /* A case_bit_test represents a set of case nodes that may be
2037    selected from using a bit-wise comparison.  HI and LO hold
2038    the integer to be tested against, LABEL contains the label
2039    to jump to upon success and BITS counts the number of case
2040    nodes handled by this test, typically the number of bits
2041    set in HI:LO.  */
2042
2043 struct case_bit_test
2044 {
2045   HOST_WIDE_INT hi;
2046   HOST_WIDE_INT lo;
2047   rtx label;
2048   int bits;
2049 };
2050
2051 /* Determine whether "1 << x" is relatively cheap in word_mode.  */
2052
2053 static
2054 bool lshift_cheap_p (void)
2055 {
2056   static bool init = false;
2057   static bool cheap = true;
2058
2059   if (!init)
2060     {
2061       rtx reg = gen_rtx_REG (word_mode, 10000);
2062       int cost = rtx_cost (gen_rtx_ASHIFT (word_mode, const1_rtx, reg), SET,
2063                            optimize_insn_for_speed_p ());
2064       cheap = cost < COSTS_N_INSNS (3);
2065       init = true;
2066     }
2067
2068   return cheap;
2069 }
2070
2071 /* Comparison function for qsort to order bit tests by decreasing
2072    number of case nodes, i.e. the node with the most cases gets
2073    tested first.  */
2074
2075 static int
2076 case_bit_test_cmp (const void *p1, const void *p2)
2077 {
2078   const struct case_bit_test *const d1 = (const struct case_bit_test *) p1;
2079   const struct case_bit_test *const d2 = (const struct case_bit_test *) p2;
2080
2081   if (d2->bits != d1->bits)
2082     return d2->bits - d1->bits;
2083
2084   /* Stabilize the sort.  */
2085   return CODE_LABEL_NUMBER (d2->label) - CODE_LABEL_NUMBER (d1->label);
2086 }
2087
2088 /*  Expand a switch statement by a short sequence of bit-wise
2089     comparisons.  "switch(x)" is effectively converted into
2090     "if ((1 << (x-MINVAL)) & CST)" where CST and MINVAL are
2091     integer constants.
2092
2093     INDEX_EXPR is the value being switched on, which is of
2094     type INDEX_TYPE.  MINVAL is the lowest case value of in
2095     the case nodes, of INDEX_TYPE type, and RANGE is highest
2096     value minus MINVAL, also of type INDEX_TYPE.  NODES is
2097     the set of case nodes, and DEFAULT_LABEL is the label to
2098     branch to should none of the cases match.
2099
2100     There *MUST* be MAX_CASE_BIT_TESTS or less unique case
2101     node targets.  */
2102
2103 static void
2104 emit_case_bit_tests (tree index_type, tree index_expr, tree minval,
2105                      tree range, case_node_ptr nodes, rtx default_label)
2106 {
2107   struct case_bit_test test[MAX_CASE_BIT_TESTS];
2108   enum machine_mode mode;
2109   rtx expr, index, label;
2110   unsigned int i,j,lo,hi;
2111   struct case_node *n;
2112   unsigned int count;
2113
2114   count = 0;
2115   for (n = nodes; n; n = n->right)
2116     {
2117       label = label_rtx (n->code_label);
2118       for (i = 0; i < count; i++)
2119         if (label == test[i].label)
2120           break;
2121
2122       if (i == count)
2123         {
2124           gcc_assert (count < MAX_CASE_BIT_TESTS);
2125           test[i].hi = 0;
2126           test[i].lo = 0;
2127           test[i].label = label;
2128           test[i].bits = 1;
2129           count++;
2130         }
2131       else
2132         test[i].bits++;
2133
2134       lo = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2135                                       n->low, minval), 1);
2136       hi = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2137                                       n->high, minval), 1);
2138       for (j = lo; j <= hi; j++)
2139         if (j >= HOST_BITS_PER_WIDE_INT)
2140           test[i].hi |= (HOST_WIDE_INT) 1 << (j - HOST_BITS_PER_INT);
2141         else
2142           test[i].lo |= (HOST_WIDE_INT) 1 << j;
2143     }
2144
2145   qsort (test, count, sizeof(*test), case_bit_test_cmp);
2146
2147   index_expr = fold_build2 (MINUS_EXPR, index_type,
2148                             fold_convert (index_type, index_expr),
2149                             fold_convert (index_type, minval));
2150   index = expand_normal (index_expr);
2151   do_pending_stack_adjust ();
2152
2153   mode = TYPE_MODE (index_type);
2154   expr = expand_normal (range);
2155   if (default_label)
2156     emit_cmp_and_jump_insns (index, expr, GTU, NULL_RTX, mode, 1,
2157                              default_label);
2158
2159   index = convert_to_mode (word_mode, index, 0);
2160   index = expand_binop (word_mode, ashl_optab, const1_rtx,
2161                         index, NULL_RTX, 1, OPTAB_WIDEN);
2162
2163   for (i = 0; i < count; i++)
2164     {
2165       expr = immed_double_const (test[i].lo, test[i].hi, word_mode);
2166       expr = expand_binop (word_mode, and_optab, index, expr,
2167                            NULL_RTX, 1, OPTAB_WIDEN);
2168       emit_cmp_and_jump_insns (expr, const0_rtx, NE, NULL_RTX,
2169                                word_mode, 1, test[i].label);
2170     }
2171
2172   if (default_label)
2173     emit_jump (default_label);
2174 }
2175
2176 #ifndef HAVE_casesi
2177 #define HAVE_casesi 0
2178 #endif
2179
2180 #ifndef HAVE_tablejump
2181 #define HAVE_tablejump 0
2182 #endif
2183
2184 /* Terminate a case (Pascal/Ada) or switch (C) statement
2185    in which ORIG_INDEX is the expression to be tested.
2186    If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
2187    type as given in the source before any compiler conversions.
2188    Generate the code to test it and jump to the right place.  */
2189
2190 void
2191 expand_case (tree exp)
2192 {
2193   tree minval = NULL_TREE, maxval = NULL_TREE, range = NULL_TREE;
2194   rtx default_label = 0;
2195   struct case_node *n;
2196   unsigned int count, uniq;
2197   rtx index;
2198   rtx table_label;
2199   int ncases;
2200   rtx *labelvec;
2201   int i;
2202   rtx before_case, end, lab;
2203
2204   tree vec = SWITCH_LABELS (exp);
2205   tree orig_type = TREE_TYPE (exp);
2206   tree index_expr = SWITCH_COND (exp);
2207   tree index_type = TREE_TYPE (index_expr);
2208   int unsignedp = TYPE_UNSIGNED (index_type);
2209
2210   /* The insn after which the case dispatch should finally
2211      be emitted.  Zero for a dummy.  */
2212   rtx start;
2213
2214   /* A list of case labels; it is first built as a list and it may then
2215      be rearranged into a nearly balanced binary tree.  */
2216   struct case_node *case_list = 0;
2217
2218   /* Label to jump to if no case matches.  */
2219   tree default_label_decl = NULL_TREE;
2220
2221   alloc_pool case_node_pool = create_alloc_pool ("struct case_node pool",
2222                                                  sizeof (struct case_node),
2223                                                  100);
2224
2225   /* The switch body is lowered in gimplify.c, we should never have
2226      switches with a non-NULL SWITCH_BODY here.  */
2227   gcc_assert (!SWITCH_BODY (exp));
2228   gcc_assert (SWITCH_LABELS (exp));
2229
2230   do_pending_stack_adjust ();
2231
2232   /* An ERROR_MARK occurs for various reasons including invalid data type.  */
2233   if (index_type != error_mark_node)
2234     {
2235       tree elt;
2236       bitmap label_bitmap;
2237       int vl = TREE_VEC_LENGTH (vec);
2238
2239       /* cleanup_tree_cfg removes all SWITCH_EXPR with their index
2240          expressions being INTEGER_CST.  */
2241       gcc_assert (TREE_CODE (index_expr) != INTEGER_CST);
2242
2243       /* The default case, if ever taken, is at the end of TREE_VEC.  */
2244       elt = TREE_VEC_ELT (vec, vl - 1);
2245       if (!CASE_LOW (elt) && !CASE_HIGH (elt))
2246         {
2247           default_label_decl = CASE_LABEL (elt);
2248           --vl;
2249         }
2250
2251       for (i = vl - 1; i >= 0; --i)
2252         {
2253           tree low, high;
2254           elt = TREE_VEC_ELT (vec, i);
2255
2256           low = CASE_LOW (elt);
2257           gcc_assert (low);
2258           high = CASE_HIGH (elt);
2259
2260           /* Discard empty ranges.  */
2261           if (high && tree_int_cst_lt (high, low))
2262             continue;
2263
2264           case_list = add_case_node (case_list, index_type, low, high,
2265                                      CASE_LABEL (elt), case_node_pool);
2266         }
2267
2268
2269       before_case = start = get_last_insn ();
2270       if (default_label_decl)
2271         default_label = label_rtx (default_label_decl);
2272
2273       /* Get upper and lower bounds of case values.  */
2274
2275       uniq = 0;
2276       count = 0;
2277       label_bitmap = BITMAP_ALLOC (NULL);
2278       for (n = case_list; n; n = n->right)
2279         {
2280           /* Count the elements and track the largest and smallest
2281              of them (treating them as signed even if they are not).  */
2282           if (count++ == 0)
2283             {
2284               minval = n->low;
2285               maxval = n->high;
2286             }
2287           else
2288             {
2289               if (tree_int_cst_lt (n->low, minval))
2290                 minval = n->low;
2291               if (tree_int_cst_lt (maxval, n->high))
2292                 maxval = n->high;
2293             }
2294           /* A range counts double, since it requires two compares.  */
2295           if (! tree_int_cst_equal (n->low, n->high))
2296             count++;
2297
2298           /* If we have not seen this label yet, then increase the
2299              number of unique case node targets seen.  */
2300           lab = label_rtx (n->code_label);
2301           if (!bitmap_bit_p (label_bitmap, CODE_LABEL_NUMBER (lab)))
2302             {
2303               bitmap_set_bit (label_bitmap, CODE_LABEL_NUMBER (lab));
2304               uniq++;
2305             }
2306         }
2307
2308       BITMAP_FREE (label_bitmap);
2309
2310       /* cleanup_tree_cfg removes all SWITCH_EXPR with a single
2311          destination, such as one with a default case only.  However,
2312          it doesn't remove cases that are out of range for the switch
2313          type, so we may still get a zero here.  */
2314       if (count == 0)
2315         {
2316           if (default_label)
2317             emit_jump (default_label);
2318           free_alloc_pool (case_node_pool);
2319           return;
2320         }
2321
2322       /* Compute span of values.  */
2323       range = fold_build2 (MINUS_EXPR, index_type, maxval, minval);
2324
2325       /* Try implementing this switch statement by a short sequence of
2326          bit-wise comparisons.  However, we let the binary-tree case
2327          below handle constant index expressions.  */
2328       if (CASE_USE_BIT_TESTS
2329           && ! TREE_CONSTANT (index_expr)
2330           && compare_tree_int (range, GET_MODE_BITSIZE (word_mode)) < 0
2331           && compare_tree_int (range, 0) > 0
2332           && lshift_cheap_p ()
2333           && ((uniq == 1 && count >= 3)
2334               || (uniq == 2 && count >= 5)
2335               || (uniq == 3 && count >= 6)))
2336         {
2337           /* Optimize the case where all the case values fit in a
2338              word without having to subtract MINVAL.  In this case,
2339              we can optimize away the subtraction.  */
2340           if (compare_tree_int (minval, 0) > 0
2341               && compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0)
2342             {
2343               minval = build_int_cst (index_type, 0);
2344               range = maxval;
2345             }
2346           emit_case_bit_tests (index_type, index_expr, minval, range,
2347                                case_list, default_label);
2348         }
2349
2350       /* If range of values is much bigger than number of values,
2351          make a sequence of conditional branches instead of a dispatch.
2352          If the switch-index is a constant, do it this way
2353          because we can optimize it.  */
2354
2355       else if (count < case_values_threshold ()
2356                || compare_tree_int (range,
2357                                     (optimize_insn_for_size_p () ? 3 : 10) * count) > 0
2358                /* RANGE may be signed, and really large ranges will show up
2359                   as negative numbers.  */
2360                || compare_tree_int (range, 0) < 0
2361 #ifndef ASM_OUTPUT_ADDR_DIFF_ELT
2362                || flag_pic
2363 #endif
2364                || !flag_jump_tables
2365                || TREE_CONSTANT (index_expr)
2366                /* If neither casesi or tablejump is available, we can
2367                   only go this way.  */
2368                || (!HAVE_casesi && !HAVE_tablejump))
2369         {
2370           index = expand_normal (index_expr);
2371
2372           /* If the index is a short or char that we do not have
2373              an insn to handle comparisons directly, convert it to
2374              a full integer now, rather than letting each comparison
2375              generate the conversion.  */
2376
2377           if (GET_MODE_CLASS (GET_MODE (index)) == MODE_INT
2378               && ! have_insn_for (COMPARE, GET_MODE (index)))
2379             {
2380               enum machine_mode wider_mode;
2381               for (wider_mode = GET_MODE (index); wider_mode != VOIDmode;
2382                    wider_mode = GET_MODE_WIDER_MODE (wider_mode))
2383                 if (have_insn_for (COMPARE, wider_mode))
2384                   {
2385                     index = convert_to_mode (wider_mode, index, unsignedp);
2386                     break;
2387                   }
2388             }
2389
2390           do_pending_stack_adjust ();
2391
2392           if (MEM_P (index))
2393             index = copy_to_reg (index);
2394
2395           /* We generate a binary decision tree to select the
2396              appropriate target code.  This is done as follows:
2397
2398              The list of cases is rearranged into a binary tree,
2399              nearly optimal assuming equal probability for each case.
2400
2401              The tree is transformed into RTL, eliminating
2402              redundant test conditions at the same time.
2403
2404              If program flow could reach the end of the
2405              decision tree an unconditional jump to the
2406              default code is emitted.  */
2407
2408           use_cost_table
2409             = (TREE_CODE (orig_type) != ENUMERAL_TYPE
2410                && estimate_case_costs (case_list));
2411           balance_case_nodes (&case_list, NULL);
2412           emit_case_nodes (index, case_list, default_label, index_type);
2413           if (default_label)
2414             emit_jump (default_label);
2415         }
2416       else
2417         {
2418           rtx fallback_label = label_rtx (case_list->code_label);
2419           table_label = gen_label_rtx ();
2420           if (! try_casesi (index_type, index_expr, minval, range,
2421                             table_label, default_label, fallback_label))
2422             {
2423               bool ok;
2424
2425               /* Index jumptables from zero for suitable values of
2426                  minval to avoid a subtraction.  */
2427               if (optimize_insn_for_speed_p ()
2428                   && compare_tree_int (minval, 0) > 0
2429                   && compare_tree_int (minval, 3) < 0)
2430                 {
2431                   minval = build_int_cst (index_type, 0);
2432                   range = maxval;
2433                 }
2434
2435               ok = try_tablejump (index_type, index_expr, minval, range,
2436                                   table_label, default_label);
2437               gcc_assert (ok);
2438             }
2439
2440           /* Get table of labels to jump to, in order of case index.  */
2441
2442           ncases = tree_low_cst (range, 0) + 1;
2443           labelvec = XALLOCAVEC (rtx, ncases);
2444           memset (labelvec, 0, ncases * sizeof (rtx));
2445
2446           for (n = case_list; n; n = n->right)
2447             {
2448               /* Compute the low and high bounds relative to the minimum
2449                  value since that should fit in a HOST_WIDE_INT while the
2450                  actual values may not.  */
2451               HOST_WIDE_INT i_low
2452                 = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2453                                              n->low, minval), 1);
2454               HOST_WIDE_INT i_high
2455                 = tree_low_cst (fold_build2 (MINUS_EXPR, index_type,
2456                                              n->high, minval), 1);
2457               HOST_WIDE_INT i;
2458
2459               for (i = i_low; i <= i_high; i ++)
2460                 labelvec[i]
2461                   = gen_rtx_LABEL_REF (Pmode, label_rtx (n->code_label));
2462             }
2463
2464           /* Fill in the gaps with the default.  We may have gaps at
2465              the beginning if we tried to avoid the minval subtraction,
2466              so substitute some label even if the default label was
2467              deemed unreachable.  */
2468           if (!default_label)
2469             default_label = fallback_label;
2470           for (i = 0; i < ncases; i++)
2471             if (labelvec[i] == 0)
2472               labelvec[i] = gen_rtx_LABEL_REF (Pmode, default_label);
2473
2474           /* Output the table.  */
2475           emit_label (table_label);
2476
2477           if (CASE_VECTOR_PC_RELATIVE || flag_pic)
2478             emit_jump_insn (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
2479                                                    gen_rtx_LABEL_REF (Pmode, table_label),
2480                                                    gen_rtvec_v (ncases, labelvec),
2481                                                    const0_rtx, const0_rtx));
2482           else
2483             emit_jump_insn (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
2484                                               gen_rtvec_v (ncases, labelvec)));
2485
2486           /* Record no drop-through after the table.  */
2487           emit_barrier ();
2488         }
2489
2490       before_case = NEXT_INSN (before_case);
2491       end = get_last_insn ();
2492       reorder_insns (before_case, end, start);
2493     }
2494
2495   free_temp_slots ();
2496   free_alloc_pool (case_node_pool);
2497 }
2498
2499 /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE.  */
2500
2501 static void
2502 do_jump_if_equal (enum machine_mode mode, rtx op0, rtx op1, rtx label,
2503                   int unsignedp)
2504 {
2505   do_compare_rtx_and_jump (op0, op1, EQ, unsignedp, mode,
2506                            NULL_RTX, NULL_RTX, label);
2507 }
2508 \f
2509 /* Not all case values are encountered equally.  This function
2510    uses a heuristic to weight case labels, in cases where that
2511    looks like a reasonable thing to do.
2512
2513    Right now, all we try to guess is text, and we establish the
2514    following weights:
2515
2516         chars above space:      16
2517         digits:                 16
2518         default:                12
2519         space, punct:           8
2520         tab:                    4
2521         newline:                2
2522         other "\" chars:        1
2523         remaining chars:        0
2524
2525    If we find any cases in the switch that are not either -1 or in the range
2526    of valid ASCII characters, or are control characters other than those
2527    commonly used with "\", don't treat this switch scanning text.
2528
2529    Return 1 if these nodes are suitable for cost estimation, otherwise
2530    return 0.  */
2531
2532 static int
2533 estimate_case_costs (case_node_ptr node)
2534 {
2535   tree min_ascii = integer_minus_one_node;
2536   tree max_ascii = build_int_cst (TREE_TYPE (node->high), 127);
2537   case_node_ptr n;
2538   int i;
2539
2540   /* If we haven't already made the cost table, make it now.  Note that the
2541      lower bound of the table is -1, not zero.  */
2542
2543   if (! cost_table_initialized)
2544     {
2545       cost_table_initialized = 1;
2546
2547       for (i = 0; i < 128; i++)
2548         {
2549           if (ISALNUM (i))
2550             COST_TABLE (i) = 16;
2551           else if (ISPUNCT (i))
2552             COST_TABLE (i) = 8;
2553           else if (ISCNTRL (i))
2554             COST_TABLE (i) = -1;
2555         }
2556
2557       COST_TABLE (' ') = 8;
2558       COST_TABLE ('\t') = 4;
2559       COST_TABLE ('\0') = 4;
2560       COST_TABLE ('\n') = 2;
2561       COST_TABLE ('\f') = 1;
2562       COST_TABLE ('\v') = 1;
2563       COST_TABLE ('\b') = 1;
2564     }
2565
2566   /* See if all the case expressions look like text.  It is text if the
2567      constant is >= -1 and the highest constant is <= 127.  Do all comparisons
2568      as signed arithmetic since we don't want to ever access cost_table with a
2569      value less than -1.  Also check that none of the constants in a range
2570      are strange control characters.  */
2571
2572   for (n = node; n; n = n->right)
2573     {
2574       if (tree_int_cst_lt (n->low, min_ascii)
2575           || tree_int_cst_lt (max_ascii, n->high))
2576         return 0;
2577
2578       for (i = (HOST_WIDE_INT) TREE_INT_CST_LOW (n->low);
2579            i <= (HOST_WIDE_INT) TREE_INT_CST_LOW (n->high); i++)
2580         if (COST_TABLE (i) < 0)
2581           return 0;
2582     }
2583
2584   /* All interesting values are within the range of interesting
2585      ASCII characters.  */
2586   return 1;
2587 }
2588
2589 /* Take an ordered list of case nodes
2590    and transform them into a near optimal binary tree,
2591    on the assumption that any target code selection value is as
2592    likely as any other.
2593
2594    The transformation is performed by splitting the ordered
2595    list into two equal sections plus a pivot.  The parts are
2596    then attached to the pivot as left and right branches.  Each
2597    branch is then transformed recursively.  */
2598
2599 static void
2600 balance_case_nodes (case_node_ptr *head, case_node_ptr parent)
2601 {
2602   case_node_ptr np;
2603
2604   np = *head;
2605   if (np)
2606     {
2607       int cost = 0;
2608       int i = 0;
2609       int ranges = 0;
2610       case_node_ptr *npp;
2611       case_node_ptr left;
2612
2613       /* Count the number of entries on branch.  Also count the ranges.  */
2614
2615       while (np)
2616         {
2617           if (!tree_int_cst_equal (np->low, np->high))
2618             {
2619               ranges++;
2620               if (use_cost_table)
2621                 cost += COST_TABLE (TREE_INT_CST_LOW (np->high));
2622             }
2623
2624           if (use_cost_table)
2625             cost += COST_TABLE (TREE_INT_CST_LOW (np->low));
2626
2627           i++;
2628           np = np->right;
2629         }
2630
2631       if (i > 2)
2632         {
2633           /* Split this list if it is long enough for that to help.  */
2634           npp = head;
2635           left = *npp;
2636           if (use_cost_table)
2637             {
2638               /* Find the place in the list that bisects the list's total cost,
2639                  Here I gets half the total cost.  */
2640               int n_moved = 0;
2641               i = (cost + 1) / 2;
2642               while (1)
2643                 {
2644                   /* Skip nodes while their cost does not reach that amount.  */
2645                   if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
2646                     i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->high));
2647                   i -= COST_TABLE (TREE_INT_CST_LOW ((*npp)->low));
2648                   if (i <= 0)
2649                     break;
2650                   npp = &(*npp)->right;
2651                   n_moved += 1;
2652                 }
2653               if (n_moved == 0)
2654                 {
2655                   /* Leave this branch lopsided, but optimize left-hand
2656                      side and fill in `parent' fields for right-hand side.  */
2657                   np = *head;
2658                   np->parent = parent;
2659                   balance_case_nodes (&np->left, np);
2660                   for (; np->right; np = np->right)
2661                     np->right->parent = np;
2662                   return;
2663                 }
2664             }
2665           /* If there are just three nodes, split at the middle one.  */
2666           else if (i == 3)
2667             npp = &(*npp)->right;
2668           else
2669             {
2670               /* Find the place in the list that bisects the list's total cost,
2671                  where ranges count as 2.
2672                  Here I gets half the total cost.  */
2673               i = (i + ranges + 1) / 2;
2674               while (1)
2675                 {
2676                   /* Skip nodes while their cost does not reach that amount.  */
2677                   if (!tree_int_cst_equal ((*npp)->low, (*npp)->high))
2678                     i--;
2679                   i--;
2680                   if (i <= 0)
2681                     break;
2682                   npp = &(*npp)->right;
2683                 }
2684             }
2685           *head = np = *npp;
2686           *npp = 0;
2687           np->parent = parent;
2688           np->left = left;
2689
2690           /* Optimize each of the two split parts.  */
2691           balance_case_nodes (&np->left, np);
2692           balance_case_nodes (&np->right, np);
2693         }
2694       else
2695         {
2696           /* Else leave this branch as one level,
2697              but fill in `parent' fields.  */
2698           np = *head;
2699           np->parent = parent;
2700           for (; np->right; np = np->right)
2701             np->right->parent = np;
2702         }
2703     }
2704 }
2705 \f
2706 /* Search the parent sections of the case node tree
2707    to see if a test for the lower bound of NODE would be redundant.
2708    INDEX_TYPE is the type of the index expression.
2709
2710    The instructions to generate the case decision tree are
2711    output in the same order as nodes are processed so it is
2712    known that if a parent node checks the range of the current
2713    node minus one that the current node is bounded at its lower
2714    span.  Thus the test would be redundant.  */
2715
2716 static int
2717 node_has_low_bound (case_node_ptr node, tree index_type)
2718 {
2719   tree low_minus_one;
2720   case_node_ptr pnode;
2721
2722   /* If the lower bound of this node is the lowest value in the index type,
2723      we need not test it.  */
2724
2725   if (tree_int_cst_equal (node->low, TYPE_MIN_VALUE (index_type)))
2726     return 1;
2727
2728   /* If this node has a left branch, the value at the left must be less
2729      than that at this node, so it cannot be bounded at the bottom and
2730      we need not bother testing any further.  */
2731
2732   if (node->left)
2733     return 0;
2734
2735   low_minus_one = fold_build2 (MINUS_EXPR, TREE_TYPE (node->low),
2736                                node->low,
2737                                build_int_cst (TREE_TYPE (node->low), 1));
2738
2739   /* If the subtraction above overflowed, we can't verify anything.
2740      Otherwise, look for a parent that tests our value - 1.  */
2741
2742   if (! tree_int_cst_lt (low_minus_one, node->low))
2743     return 0;
2744
2745   for (pnode = node->parent; pnode; pnode = pnode->parent)
2746     if (tree_int_cst_equal (low_minus_one, pnode->high))
2747       return 1;
2748
2749   return 0;
2750 }
2751
2752 /* Search the parent sections of the case node tree
2753    to see if a test for the upper bound of NODE would be redundant.
2754    INDEX_TYPE is the type of the index expression.
2755
2756    The instructions to generate the case decision tree are
2757    output in the same order as nodes are processed so it is
2758    known that if a parent node checks the range of the current
2759    node plus one that the current node is bounded at its upper
2760    span.  Thus the test would be redundant.  */
2761
2762 static int
2763 node_has_high_bound (case_node_ptr node, tree index_type)
2764 {
2765   tree high_plus_one;
2766   case_node_ptr pnode;
2767
2768   /* If there is no upper bound, obviously no test is needed.  */
2769
2770   if (TYPE_MAX_VALUE (index_type) == NULL)
2771     return 1;
2772
2773   /* If the upper bound of this node is the highest value in the type
2774      of the index expression, we need not test against it.  */
2775
2776   if (tree_int_cst_equal (node->high, TYPE_MAX_VALUE (index_type)))
2777     return 1;
2778
2779   /* If this node has a right branch, the value at the right must be greater
2780      than that at this node, so it cannot be bounded at the top and
2781      we need not bother testing any further.  */
2782
2783   if (node->right)
2784     return 0;
2785
2786   high_plus_one = fold_build2 (PLUS_EXPR, TREE_TYPE (node->high),
2787                                node->high,
2788                                build_int_cst (TREE_TYPE (node->high), 1));
2789
2790   /* If the addition above overflowed, we can't verify anything.
2791      Otherwise, look for a parent that tests our value + 1.  */
2792
2793   if (! tree_int_cst_lt (node->high, high_plus_one))
2794     return 0;
2795
2796   for (pnode = node->parent; pnode; pnode = pnode->parent)
2797     if (tree_int_cst_equal (high_plus_one, pnode->low))
2798       return 1;
2799
2800   return 0;
2801 }
2802
2803 /* Search the parent sections of the
2804    case node tree to see if both tests for the upper and lower
2805    bounds of NODE would be redundant.  */
2806
2807 static int
2808 node_is_bounded (case_node_ptr node, tree index_type)
2809 {
2810   return (node_has_low_bound (node, index_type)
2811           && node_has_high_bound (node, index_type));
2812 }
2813 \f
2814 /* Emit step-by-step code to select a case for the value of INDEX.
2815    The thus generated decision tree follows the form of the
2816    case-node binary tree NODE, whose nodes represent test conditions.
2817    INDEX_TYPE is the type of the index of the switch.
2818
2819    Care is taken to prune redundant tests from the decision tree
2820    by detecting any boundary conditions already checked by
2821    emitted rtx.  (See node_has_high_bound, node_has_low_bound
2822    and node_is_bounded, above.)
2823
2824    Where the test conditions can be shown to be redundant we emit
2825    an unconditional jump to the target code.  As a further
2826    optimization, the subordinates of a tree node are examined to
2827    check for bounded nodes.  In this case conditional and/or
2828    unconditional jumps as a result of the boundary check for the
2829    current node are arranged to target the subordinates associated
2830    code for out of bound conditions on the current node.
2831
2832    We can assume that when control reaches the code generated here,
2833    the index value has already been compared with the parents
2834    of this node, and determined to be on the same side of each parent
2835    as this node is.  Thus, if this node tests for the value 51,
2836    and a parent tested for 52, we don't need to consider
2837    the possibility of a value greater than 51.  If another parent
2838    tests for the value 50, then this node need not test anything.  */
2839
2840 static void
2841 emit_case_nodes (rtx index, case_node_ptr node, rtx default_label,
2842                  tree index_type)
2843 {
2844   /* If INDEX has an unsigned type, we must make unsigned branches.  */
2845   int unsignedp = TYPE_UNSIGNED (index_type);
2846   enum machine_mode mode = GET_MODE (index);
2847   enum machine_mode imode = TYPE_MODE (index_type);
2848
2849   /* Handle indices detected as constant during RTL expansion.  */
2850   if (mode == VOIDmode)
2851     mode = imode;
2852
2853   /* See if our parents have already tested everything for us.
2854      If they have, emit an unconditional jump for this node.  */
2855   if (node_is_bounded (node, index_type))
2856     emit_jump (label_rtx (node->code_label));
2857
2858   else if (tree_int_cst_equal (node->low, node->high))
2859     {
2860       /* Node is single valued.  First see if the index expression matches
2861          this node and then check our children, if any.  */
2862
2863       do_jump_if_equal (mode, index,
2864                         convert_modes (mode, imode,
2865                                        expand_normal (node->low),
2866                                        unsignedp),
2867                         label_rtx (node->code_label), unsignedp);
2868
2869       if (node->right != 0 && node->left != 0)
2870         {
2871           /* This node has children on both sides.
2872              Dispatch to one side or the other
2873              by comparing the index value with this node's value.
2874              If one subtree is bounded, check that one first,
2875              so we can avoid real branches in the tree.  */
2876
2877           if (node_is_bounded (node->right, index_type))
2878             {
2879               emit_cmp_and_jump_insns (index,
2880                                        convert_modes
2881                                        (mode, imode,
2882                                         expand_normal (node->high),
2883                                         unsignedp),
2884                                        GT, NULL_RTX, mode, unsignedp,
2885                                        label_rtx (node->right->code_label));
2886               emit_case_nodes (index, node->left, default_label, index_type);
2887             }
2888
2889           else if (node_is_bounded (node->left, index_type))
2890             {
2891               emit_cmp_and_jump_insns (index,
2892                                        convert_modes
2893                                        (mode, imode,
2894                                         expand_normal (node->high),
2895                                         unsignedp),
2896                                        LT, NULL_RTX, mode, unsignedp,
2897                                        label_rtx (node->left->code_label));
2898               emit_case_nodes (index, node->right, default_label, index_type);
2899             }
2900
2901           /* If both children are single-valued cases with no
2902              children, finish up all the work.  This way, we can save
2903              one ordered comparison.  */
2904           else if (tree_int_cst_equal (node->right->low, node->right->high)
2905                    && node->right->left == 0
2906                    && node->right->right == 0
2907                    && tree_int_cst_equal (node->left->low, node->left->high)
2908                    && node->left->left == 0
2909                    && node->left->right == 0)
2910             {
2911               /* Neither node is bounded.  First distinguish the two sides;
2912                  then emit the code for one side at a time.  */
2913
2914               /* See if the value matches what the right hand side
2915                  wants.  */
2916               do_jump_if_equal (mode, index,
2917                                 convert_modes (mode, imode,
2918                                                expand_normal (node->right->low),
2919                                                unsignedp),
2920                                 label_rtx (node->right->code_label),
2921                                 unsignedp);
2922
2923               /* See if the value matches what the left hand side
2924                  wants.  */
2925               do_jump_if_equal (mode, index,
2926                                 convert_modes (mode, imode,
2927                                                expand_normal (node->left->low),
2928                                                unsignedp),
2929                                 label_rtx (node->left->code_label),
2930                                 unsignedp);
2931             }
2932
2933           else
2934             {
2935               /* Neither node is bounded.  First distinguish the two sides;
2936                  then emit the code for one side at a time.  */
2937
2938               tree test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
2939
2940               /* See if the value is on the right.  */
2941               emit_cmp_and_jump_insns (index,
2942                                        convert_modes
2943                                        (mode, imode,
2944                                         expand_normal (node->high),
2945                                         unsignedp),
2946                                        GT, NULL_RTX, mode, unsignedp,
2947                                        label_rtx (test_label));
2948
2949               /* Value must be on the left.
2950                  Handle the left-hand subtree.  */
2951               emit_case_nodes (index, node->left, default_label, index_type);
2952               /* If left-hand subtree does nothing,
2953                  go to default.  */
2954               if (default_label)
2955                 emit_jump (default_label);
2956
2957               /* Code branches here for the right-hand subtree.  */
2958               expand_label (test_label);
2959               emit_case_nodes (index, node->right, default_label, index_type);
2960             }
2961         }
2962
2963       else if (node->right != 0 && node->left == 0)
2964         {
2965           /* Here we have a right child but no left so we issue a conditional
2966              branch to default and process the right child.
2967
2968              Omit the conditional branch to default if the right child
2969              does not have any children and is single valued; it would
2970              cost too much space to save so little time.  */
2971
2972           if (node->right->right || node->right->left
2973               || !tree_int_cst_equal (node->right->low, node->right->high))
2974             {
2975               if (!node_has_low_bound (node, index_type))
2976                 {
2977                   emit_cmp_and_jump_insns (index,
2978                                            convert_modes
2979                                            (mode, imode,
2980                                             expand_normal (node->high),
2981                                             unsignedp),
2982                                            LT, NULL_RTX, mode, unsignedp,
2983                                            default_label);
2984                 }
2985
2986               emit_case_nodes (index, node->right, default_label, index_type);
2987             }
2988           else
2989             /* We cannot process node->right normally
2990                since we haven't ruled out the numbers less than
2991                this node's value.  So handle node->right explicitly.  */
2992             do_jump_if_equal (mode, index,
2993                               convert_modes
2994                               (mode, imode,
2995                                expand_normal (node->right->low),
2996                                unsignedp),
2997                               label_rtx (node->right->code_label), unsignedp);
2998         }
2999
3000       else if (node->right == 0 && node->left != 0)
3001         {
3002           /* Just one subtree, on the left.  */
3003           if (node->left->left || node->left->right
3004               || !tree_int_cst_equal (node->left->low, node->left->high))
3005             {
3006               if (!node_has_high_bound (node, index_type))
3007                 {
3008                   emit_cmp_and_jump_insns (index,
3009                                            convert_modes
3010                                            (mode, imode,
3011                                             expand_normal (node->high),
3012                                             unsignedp),
3013                                            GT, NULL_RTX, mode, unsignedp,
3014                                            default_label);
3015                 }
3016
3017               emit_case_nodes (index, node->left, default_label, index_type);
3018             }
3019           else
3020             /* We cannot process node->left normally
3021                since we haven't ruled out the numbers less than
3022                this node's value.  So handle node->left explicitly.  */
3023             do_jump_if_equal (mode, index,
3024                               convert_modes
3025                               (mode, imode,
3026                                expand_normal (node->left->low),
3027                                unsignedp),
3028                               label_rtx (node->left->code_label), unsignedp);
3029         }
3030     }
3031   else
3032     {
3033       /* Node is a range.  These cases are very similar to those for a single
3034          value, except that we do not start by testing whether this node
3035          is the one to branch to.  */
3036
3037       if (node->right != 0 && node->left != 0)
3038         {
3039           /* Node has subtrees on both sides.
3040              If the right-hand subtree is bounded,
3041              test for it first, since we can go straight there.
3042              Otherwise, we need to make a branch in the control structure,
3043              then handle the two subtrees.  */
3044           tree test_label = 0;
3045
3046           if (node_is_bounded (node->right, index_type))
3047             /* Right hand node is fully bounded so we can eliminate any
3048                testing and branch directly to the target code.  */
3049             emit_cmp_and_jump_insns (index,
3050                                      convert_modes
3051                                      (mode, imode,
3052                                       expand_normal (node->high),
3053                                       unsignedp),
3054                                      GT, NULL_RTX, mode, unsignedp,
3055                                      label_rtx (node->right->code_label));
3056           else
3057             {
3058               /* Right hand node requires testing.
3059                  Branch to a label where we will handle it later.  */
3060
3061               test_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
3062               emit_cmp_and_jump_insns (index,
3063                                        convert_modes
3064                                        (mode, imode,
3065                                         expand_normal (node->high),
3066                                         unsignedp),
3067                                        GT, NULL_RTX, mode, unsignedp,
3068                                        label_rtx (test_label));
3069             }
3070
3071           /* Value belongs to this node or to the left-hand subtree.  */
3072
3073           emit_cmp_and_jump_insns (index,
3074                                    convert_modes
3075                                    (mode, imode,
3076                                     expand_normal (node->low),
3077                                     unsignedp),
3078                                    GE, NULL_RTX, mode, unsignedp,
3079                                    label_rtx (node->code_label));
3080
3081           /* Handle the left-hand subtree.  */
3082           emit_case_nodes (index, node->left, default_label, index_type);
3083
3084           /* If right node had to be handled later, do that now.  */
3085
3086           if (test_label)
3087             {
3088               /* If the left-hand subtree fell through,
3089                  don't let it fall into the right-hand subtree.  */
3090               if (default_label)
3091                 emit_jump (default_label);
3092
3093               expand_label (test_label);
3094               emit_case_nodes (index, node->right, default_label, index_type);
3095             }
3096         }
3097
3098       else if (node->right != 0 && node->left == 0)
3099         {
3100           /* Deal with values to the left of this node,
3101              if they are possible.  */
3102           if (!node_has_low_bound (node, index_type))
3103             {
3104               emit_cmp_and_jump_insns (index,
3105                                        convert_modes
3106                                        (mode, imode,
3107                                         expand_normal (node->low),
3108                                         unsignedp),
3109                                        LT, NULL_RTX, mode, unsignedp,
3110                                        default_label);
3111             }
3112
3113           /* Value belongs to this node or to the right-hand subtree.  */
3114
3115           emit_cmp_and_jump_insns (index,
3116                                    convert_modes
3117                                    (mode, imode,
3118                                     expand_normal (node->high),
3119                                     unsignedp),
3120                                    LE, NULL_RTX, mode, unsignedp,
3121                                    label_rtx (node->code_label));
3122
3123           emit_case_nodes (index, node->right, default_label, index_type);
3124         }
3125
3126       else if (node->right == 0 && node->left != 0)
3127         {
3128           /* Deal with values to the right of this node,
3129              if they are possible.  */
3130           if (!node_has_high_bound (node, index_type))
3131             {
3132               emit_cmp_and_jump_insns (index,
3133                                        convert_modes
3134                                        (mode, imode,
3135                                         expand_normal (node->high),
3136                                         unsignedp),
3137                                        GT, NULL_RTX, mode, unsignedp,
3138                                        default_label);
3139             }
3140
3141           /* Value belongs to this node or to the left-hand subtree.  */
3142
3143           emit_cmp_and_jump_insns (index,
3144                                    convert_modes
3145                                    (mode, imode,
3146                                     expand_normal (node->low),
3147                                     unsignedp),
3148                                    GE, NULL_RTX, mode, unsignedp,
3149                                    label_rtx (node->code_label));
3150
3151           emit_case_nodes (index, node->left, default_label, index_type);
3152         }
3153
3154       else
3155         {
3156           /* Node has no children so we check low and high bounds to remove
3157              redundant tests.  Only one of the bounds can exist,
3158              since otherwise this node is bounded--a case tested already.  */
3159           int high_bound = node_has_high_bound (node, index_type);
3160           int low_bound = node_has_low_bound (node, index_type);
3161
3162           if (!high_bound && low_bound)
3163             {
3164               emit_cmp_and_jump_insns (index,
3165                                        convert_modes
3166                                        (mode, imode,
3167                                         expand_normal (node->high),
3168                                         unsignedp),
3169                                        GT, NULL_RTX, mode, unsignedp,
3170                                        default_label);
3171             }
3172
3173           else if (!low_bound && high_bound)
3174             {
3175               emit_cmp_and_jump_insns (index,
3176                                        convert_modes
3177                                        (mode, imode,
3178                                         expand_normal (node->low),
3179                                         unsignedp),
3180                                        LT, NULL_RTX, mode, unsignedp,
3181                                        default_label);
3182             }
3183           else if (!low_bound && !high_bound)
3184             {
3185               /* Widen LOW and HIGH to the same width as INDEX.  */
3186               tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
3187               tree low = build1 (CONVERT_EXPR, type, node->low);
3188               tree high = build1 (CONVERT_EXPR, type, node->high);
3189               rtx low_rtx, new_index, new_bound;
3190
3191               /* Instead of doing two branches, emit one unsigned branch for
3192                  (index-low) > (high-low).  */
3193               low_rtx = expand_expr (low, NULL_RTX, mode, EXPAND_NORMAL);
3194               new_index = expand_simple_binop (mode, MINUS, index, low_rtx,
3195                                                NULL_RTX, unsignedp,
3196                                                OPTAB_WIDEN);
3197               new_bound = expand_expr (fold_build2 (MINUS_EXPR, type,
3198                                                     high, low),
3199                                        NULL_RTX, mode, EXPAND_NORMAL);
3200
3201               emit_cmp_and_jump_insns (new_index, new_bound, GT, NULL_RTX,
3202                                        mode, 1, default_label);
3203             }
3204
3205           emit_jump (label_rtx (node->code_label));
3206         }
3207     }
3208 }