OSDN Git Service

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