OSDN Git Service

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