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