]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/genmatch.c
re PR middle-end/77842 (genmatch segfault on a missing brace)
[thirdparty/gcc.git] / gcc / genmatch.c
1 /* Generate pattern matching and transform code shared between
2 GENERIC and GIMPLE folding code from match-and-simplify description.
3
4 Copyright (C) 2014-2016 Free Software Foundation, Inc.
5 Contributed by Richard Biener <rguenther@suse.de>
6 and Prathamesh Kulkarni <bilbotheelffriend@gmail.com>
7
8 This file is part of GCC.
9
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
14
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
23
24 #include "bconfig.h"
25 #include "system.h"
26 #include "coretypes.h"
27 #include <cpplib.h>
28 #include "errors.h"
29 #include "hash-table.h"
30 #include "hash-set.h"
31 #include "is-a.h"
32
33
34 /* Stubs for GGC referenced through instantiations triggered by hash-map. */
35 void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
36 size_t, size_t MEM_STAT_DECL)
37 {
38 return NULL;
39 }
40 void ggc_free (void *)
41 {
42 }
43
44
45 /* Global state. */
46
47 /* Verboseness. 0 is quiet, 1 adds some warnings, 2 is for debugging. */
48 unsigned verbose;
49
50
51 /* libccp helpers. */
52
53 static struct line_maps *line_table;
54
55 /* The rich_location class within libcpp requires a way to expand
56 source_location instances, and relies on the client code
57 providing a symbol named
58 linemap_client_expand_location_to_spelling_point
59 to do this.
60
61 This is the implementation for genmatch. */
62
63 expanded_location
64 linemap_client_expand_location_to_spelling_point (source_location loc)
65 {
66 const struct line_map_ordinary *map;
67 loc = linemap_resolve_location (line_table, loc, LRK_SPELLING_LOCATION, &map);
68 return linemap_expand_location (line_table, map, loc);
69 }
70
71 static bool
72 #if GCC_VERSION >= 4001
73 __attribute__((format (printf, 5, 0)))
74 #endif
75 error_cb (cpp_reader *, int errtype, int, rich_location *richloc,
76 const char *msg, va_list *ap)
77 {
78 const line_map_ordinary *map;
79 source_location location = richloc->get_loc ();
80 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
81 expanded_location loc = linemap_expand_location (line_table, map, location);
82 fprintf (stderr, "%s:%d:%d %s: ", loc.file, loc.line, loc.column,
83 (errtype == CPP_DL_WARNING) ? "warning" : "error");
84 vfprintf (stderr, msg, *ap);
85 fprintf (stderr, "\n");
86 FILE *f = fopen (loc.file, "r");
87 if (f)
88 {
89 char buf[128];
90 while (loc.line > 0)
91 {
92 if (!fgets (buf, 128, f))
93 goto notfound;
94 if (buf[strlen (buf) - 1] != '\n')
95 {
96 if (loc.line > 1)
97 loc.line++;
98 }
99 loc.line--;
100 }
101 fprintf (stderr, "%s", buf);
102 for (int i = 0; i < loc.column - 1; ++i)
103 fputc (' ', stderr);
104 fputc ('^', stderr);
105 fputc ('\n', stderr);
106 notfound:
107 fclose (f);
108 }
109
110 if (errtype == CPP_DL_FATAL)
111 exit (1);
112 return false;
113 }
114
115 static void
116 #if GCC_VERSION >= 4001
117 __attribute__((format (printf, 2, 3)))
118 #endif
119 fatal_at (const cpp_token *tk, const char *msg, ...)
120 {
121 rich_location richloc (line_table, tk->src_loc);
122 va_list ap;
123 va_start (ap, msg);
124 error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap);
125 va_end (ap);
126 }
127
128 static void
129 #if GCC_VERSION >= 4001
130 __attribute__((format (printf, 2, 3)))
131 #endif
132 fatal_at (source_location loc, const char *msg, ...)
133 {
134 rich_location richloc (line_table, loc);
135 va_list ap;
136 va_start (ap, msg);
137 error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap);
138 va_end (ap);
139 }
140
141 static void
142 #if GCC_VERSION >= 4001
143 __attribute__((format (printf, 2, 3)))
144 #endif
145 warning_at (const cpp_token *tk, const char *msg, ...)
146 {
147 rich_location richloc (line_table, tk->src_loc);
148 va_list ap;
149 va_start (ap, msg);
150 error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap);
151 va_end (ap);
152 }
153
154 static void
155 #if GCC_VERSION >= 4001
156 __attribute__((format (printf, 2, 3)))
157 #endif
158 warning_at (source_location loc, const char *msg, ...)
159 {
160 rich_location richloc (line_table, loc);
161 va_list ap;
162 va_start (ap, msg);
163 error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap);
164 va_end (ap);
165 }
166
167 /* Like fprintf, but print INDENT spaces at the beginning. */
168
169 static void
170 #if GCC_VERSION >= 4001
171 __attribute__((format (printf, 3, 4)))
172 #endif
173 fprintf_indent (FILE *f, unsigned int indent, const char *format, ...)
174 {
175 va_list ap;
176 for (; indent >= 8; indent -= 8)
177 fputc ('\t', f);
178 fprintf (f, "%*s", indent, "");
179 va_start (ap, format);
180 vfprintf (f, format, ap);
181 va_end (ap);
182 }
183
184 static void
185 output_line_directive (FILE *f, source_location location,
186 bool dumpfile = false)
187 {
188 const line_map_ordinary *map;
189 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
190 expanded_location loc = linemap_expand_location (line_table, map, location);
191 if (dumpfile)
192 {
193 /* When writing to a dumpfile only dump the filename. */
194 const char *file = strrchr (loc.file, DIR_SEPARATOR);
195 if (!file)
196 file = loc.file;
197 else
198 ++file;
199 fprintf (f, "%s:%d", file, loc.line);
200 }
201 else
202 /* Other gen programs really output line directives here, at least for
203 development it's right now more convenient to have line information
204 from the generated file. Still keep the directives as comment for now
205 to easily back-point to the meta-description. */
206 fprintf (f, "/* #line %d \"%s\" */\n", loc.line, loc.file);
207 }
208
209
210 /* Pull in tree codes and builtin function codes from their
211 definition files. */
212
213 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
214 enum tree_code {
215 #include "tree.def"
216 CONVERT0,
217 CONVERT1,
218 CONVERT2,
219 VIEW_CONVERT0,
220 VIEW_CONVERT1,
221 VIEW_CONVERT2,
222 MAX_TREE_CODES
223 };
224 #undef DEFTREECODE
225
226 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
227 enum built_in_function {
228 #include "builtins.def"
229 END_BUILTINS
230 };
231
232 #define DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) IFN_##CODE,
233 enum internal_fn {
234 #include "internal-fn.def"
235 IFN_LAST
236 };
237
238 /* Return true if CODE represents a commutative tree code. Otherwise
239 return false. */
240 bool
241 commutative_tree_code (enum tree_code code)
242 {
243 switch (code)
244 {
245 case PLUS_EXPR:
246 case MULT_EXPR:
247 case MULT_HIGHPART_EXPR:
248 case MIN_EXPR:
249 case MAX_EXPR:
250 case BIT_IOR_EXPR:
251 case BIT_XOR_EXPR:
252 case BIT_AND_EXPR:
253 case NE_EXPR:
254 case EQ_EXPR:
255 case UNORDERED_EXPR:
256 case ORDERED_EXPR:
257 case UNEQ_EXPR:
258 case LTGT_EXPR:
259 case TRUTH_AND_EXPR:
260 case TRUTH_XOR_EXPR:
261 case TRUTH_OR_EXPR:
262 case WIDEN_MULT_EXPR:
263 case VEC_WIDEN_MULT_HI_EXPR:
264 case VEC_WIDEN_MULT_LO_EXPR:
265 case VEC_WIDEN_MULT_EVEN_EXPR:
266 case VEC_WIDEN_MULT_ODD_EXPR:
267 return true;
268
269 default:
270 break;
271 }
272 return false;
273 }
274
275 /* Return true if CODE represents a ternary tree code for which the
276 first two operands are commutative. Otherwise return false. */
277 bool
278 commutative_ternary_tree_code (enum tree_code code)
279 {
280 switch (code)
281 {
282 case WIDEN_MULT_PLUS_EXPR:
283 case WIDEN_MULT_MINUS_EXPR:
284 case DOT_PROD_EXPR:
285 case FMA_EXPR:
286 return true;
287
288 default:
289 break;
290 }
291 return false;
292 }
293
294 /* Return true if CODE is a comparison. */
295
296 bool
297 comparison_code_p (enum tree_code code)
298 {
299 switch (code)
300 {
301 case EQ_EXPR:
302 case NE_EXPR:
303 case ORDERED_EXPR:
304 case UNORDERED_EXPR:
305 case LTGT_EXPR:
306 case UNEQ_EXPR:
307 case GT_EXPR:
308 case GE_EXPR:
309 case LT_EXPR:
310 case LE_EXPR:
311 case UNGT_EXPR:
312 case UNGE_EXPR:
313 case UNLT_EXPR:
314 case UNLE_EXPR:
315 return true;
316
317 default:
318 break;
319 }
320 return false;
321 }
322
323
324 /* Base class for all identifiers the parser knows. */
325
326 struct id_base : nofree_ptr_hash<id_base>
327 {
328 enum id_kind { CODE, FN, PREDICATE, USER, NULL_ID } kind;
329
330 id_base (id_kind, const char *, int = -1);
331
332 hashval_t hashval;
333 int nargs;
334 const char *id;
335
336 /* hash_table support. */
337 static inline hashval_t hash (const id_base *);
338 static inline int equal (const id_base *, const id_base *);
339 };
340
341 inline hashval_t
342 id_base::hash (const id_base *op)
343 {
344 return op->hashval;
345 }
346
347 inline int
348 id_base::equal (const id_base *op1,
349 const id_base *op2)
350 {
351 return (op1->hashval == op2->hashval
352 && strcmp (op1->id, op2->id) == 0);
353 }
354
355 /* The special id "null", which matches nothing. */
356 static id_base *null_id;
357
358 /* Hashtable of known pattern operators. This is pre-seeded from
359 all known tree codes and all known builtin function ids. */
360 static hash_table<id_base> *operators;
361
362 id_base::id_base (id_kind kind_, const char *id_, int nargs_)
363 {
364 kind = kind_;
365 id = id_;
366 nargs = nargs_;
367 hashval = htab_hash_string (id);
368 }
369
370 /* Identifier that maps to a tree code. */
371
372 struct operator_id : public id_base
373 {
374 operator_id (enum tree_code code_, const char *id_, unsigned nargs_,
375 const char *tcc_)
376 : id_base (id_base::CODE, id_, nargs_), code (code_), tcc (tcc_) {}
377 enum tree_code code;
378 const char *tcc;
379 };
380
381 /* Identifier that maps to a builtin or internal function code. */
382
383 struct fn_id : public id_base
384 {
385 fn_id (enum built_in_function fn_, const char *id_)
386 : id_base (id_base::FN, id_), fn (fn_) {}
387 fn_id (enum internal_fn fn_, const char *id_)
388 : id_base (id_base::FN, id_), fn (int (END_BUILTINS) + int (fn_)) {}
389 unsigned int fn;
390 };
391
392 struct simplify;
393
394 /* Identifier that maps to a user-defined predicate. */
395
396 struct predicate_id : public id_base
397 {
398 predicate_id (const char *id_)
399 : id_base (id_base::PREDICATE, id_), matchers (vNULL) {}
400 vec<simplify *> matchers;
401 };
402
403 /* Identifier that maps to a operator defined by a 'for' directive. */
404
405 struct user_id : public id_base
406 {
407 user_id (const char *id_, bool is_oper_list_ = false)
408 : id_base (id_base::USER, id_), substitutes (vNULL),
409 used (false), is_oper_list (is_oper_list_) {}
410 vec<id_base *> substitutes;
411 bool used;
412 bool is_oper_list;
413 };
414
415 template<>
416 template<>
417 inline bool
418 is_a_helper <fn_id *>::test (id_base *id)
419 {
420 return id->kind == id_base::FN;
421 }
422
423 template<>
424 template<>
425 inline bool
426 is_a_helper <operator_id *>::test (id_base *id)
427 {
428 return id->kind == id_base::CODE;
429 }
430
431 template<>
432 template<>
433 inline bool
434 is_a_helper <predicate_id *>::test (id_base *id)
435 {
436 return id->kind == id_base::PREDICATE;
437 }
438
439 template<>
440 template<>
441 inline bool
442 is_a_helper <user_id *>::test (id_base *id)
443 {
444 return id->kind == id_base::USER;
445 }
446
447 /* Add a predicate identifier to the hash. */
448
449 static predicate_id *
450 add_predicate (const char *id)
451 {
452 predicate_id *p = new predicate_id (id);
453 id_base **slot = operators->find_slot_with_hash (p, p->hashval, INSERT);
454 if (*slot)
455 fatal ("duplicate id definition");
456 *slot = p;
457 return p;
458 }
459
460 /* Add a tree code identifier to the hash. */
461
462 static void
463 add_operator (enum tree_code code, const char *id,
464 const char *tcc, unsigned nargs)
465 {
466 if (strcmp (tcc, "tcc_unary") != 0
467 && strcmp (tcc, "tcc_binary") != 0
468 && strcmp (tcc, "tcc_comparison") != 0
469 && strcmp (tcc, "tcc_expression") != 0
470 /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR. */
471 && strcmp (tcc, "tcc_reference") != 0
472 /* To have INTEGER_CST and friends as "predicate operators". */
473 && strcmp (tcc, "tcc_constant") != 0
474 /* And allow CONSTRUCTOR for vector initializers. */
475 && !(code == CONSTRUCTOR)
476 /* Allow SSA_NAME as predicate operator. */
477 && !(code == SSA_NAME))
478 return;
479 /* Treat ADDR_EXPR as atom, thus don't allow matching its operand. */
480 if (code == ADDR_EXPR)
481 nargs = 0;
482 operator_id *op = new operator_id (code, id, nargs, tcc);
483 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
484 if (*slot)
485 fatal ("duplicate id definition");
486 *slot = op;
487 }
488
489 /* Add a built-in or internal function identifier to the hash. ID is
490 the name of its CFN_* enumeration value. */
491
492 template <typename T>
493 static void
494 add_function (T code, const char *id)
495 {
496 fn_id *fn = new fn_id (code, id);
497 id_base **slot = operators->find_slot_with_hash (fn, fn->hashval, INSERT);
498 if (*slot)
499 fatal ("duplicate id definition");
500 *slot = fn;
501 }
502
503 /* Helper for easy comparing ID with tree code CODE. */
504
505 static bool
506 operator==(id_base &id, enum tree_code code)
507 {
508 if (operator_id *oid = dyn_cast <operator_id *> (&id))
509 return oid->code == code;
510 return false;
511 }
512
513 /* Lookup the identifier ID. Allow "null" if ALLOW_NULL. */
514
515 id_base *
516 get_operator (const char *id, bool allow_null = false)
517 {
518 if (allow_null && strcmp (id, "null") == 0)
519 return null_id;
520
521 id_base tem (id_base::CODE, id);
522
523 id_base *op = operators->find_with_hash (&tem, tem.hashval);
524 if (op)
525 {
526 /* If this is a user-defined identifier track whether it was used. */
527 if (user_id *uid = dyn_cast<user_id *> (op))
528 uid->used = true;
529 return op;
530 }
531
532 char *id2;
533 bool all_upper = true;
534 bool all_lower = true;
535 for (unsigned int i = 0; id[i]; ++i)
536 if (ISUPPER (id[i]))
537 all_lower = false;
538 else if (ISLOWER (id[i]))
539 all_upper = false;
540 if (all_lower)
541 {
542 /* Try in caps with _EXPR appended. */
543 id2 = ACONCAT ((id, "_EXPR", NULL));
544 for (unsigned int i = 0; id2[i]; ++i)
545 id2[i] = TOUPPER (id2[i]);
546 }
547 else if (all_upper && strncmp (id, "IFN_", 4) == 0)
548 /* Try CFN_ instead of IFN_. */
549 id2 = ACONCAT (("CFN_", id + 4, NULL));
550 else if (all_upper && strncmp (id, "BUILT_IN_", 9) == 0)
551 /* Try prepending CFN_. */
552 id2 = ACONCAT (("CFN_", id, NULL));
553 else
554 return NULL;
555
556 new (&tem) id_base (id_base::CODE, id2);
557 return operators->find_with_hash (&tem, tem.hashval);
558 }
559
560 /* Return the comparison operators that results if the operands are
561 swapped. This is safe for floating-point. */
562
563 id_base *
564 swap_tree_comparison (operator_id *p)
565 {
566 switch (p->code)
567 {
568 case EQ_EXPR:
569 case NE_EXPR:
570 case ORDERED_EXPR:
571 case UNORDERED_EXPR:
572 case LTGT_EXPR:
573 case UNEQ_EXPR:
574 return p;
575 case GT_EXPR:
576 return get_operator ("LT_EXPR");
577 case GE_EXPR:
578 return get_operator ("LE_EXPR");
579 case LT_EXPR:
580 return get_operator ("GT_EXPR");
581 case LE_EXPR:
582 return get_operator ("GE_EXPR");
583 case UNGT_EXPR:
584 return get_operator ("UNLT_EXPR");
585 case UNGE_EXPR:
586 return get_operator ("UNLE_EXPR");
587 case UNLT_EXPR:
588 return get_operator ("UNGT_EXPR");
589 case UNLE_EXPR:
590 return get_operator ("UNGE_EXPR");
591 default:
592 gcc_unreachable ();
593 }
594 }
595
596 typedef hash_map<nofree_string_hash, unsigned> cid_map_t;
597
598
599 /* The AST produced by parsing of the pattern definitions. */
600
601 struct dt_operand;
602 struct capture_info;
603
604 /* The base class for operands. */
605
606 struct operand {
607 enum op_type { OP_PREDICATE, OP_EXPR, OP_CAPTURE, OP_C_EXPR, OP_IF, OP_WITH };
608 operand (enum op_type type_, source_location loc_)
609 : type (type_), location (loc_) {}
610 enum op_type type;
611 source_location location;
612 virtual void gen_transform (FILE *, int, const char *, bool, int,
613 const char *, capture_info *,
614 dt_operand ** = 0,
615 int = 0)
616 { gcc_unreachable (); }
617 };
618
619 /* A predicate operand. Predicates are leafs in the AST. */
620
621 struct predicate : public operand
622 {
623 predicate (predicate_id *p_, source_location loc)
624 : operand (OP_PREDICATE, loc), p (p_) {}
625 predicate_id *p;
626 };
627
628 /* An operand that constitutes an expression. Expressions include
629 function calls and user-defined predicate invocations. */
630
631 struct expr : public operand
632 {
633 expr (id_base *operation_, source_location loc, bool is_commutative_ = false)
634 : operand (OP_EXPR, loc), operation (operation_),
635 ops (vNULL), expr_type (NULL), is_commutative (is_commutative_),
636 is_generic (false), force_single_use (false) {}
637 expr (expr *e)
638 : operand (OP_EXPR, e->location), operation (e->operation),
639 ops (vNULL), expr_type (e->expr_type), is_commutative (e->is_commutative),
640 is_generic (e->is_generic), force_single_use (e->force_single_use) {}
641 void append_op (operand *op) { ops.safe_push (op); }
642 /* The operator and its operands. */
643 id_base *operation;
644 vec<operand *> ops;
645 /* An explicitely specified type - used exclusively for conversions. */
646 const char *expr_type;
647 /* Whether the operation is to be applied commutatively. This is
648 later lowered to two separate patterns. */
649 bool is_commutative;
650 /* Whether the expression is expected to be in GENERIC form. */
651 bool is_generic;
652 /* Whether pushing any stmt to the sequence should be conditional
653 on this expression having a single-use. */
654 bool force_single_use;
655 virtual void gen_transform (FILE *f, int, const char *, bool, int,
656 const char *, capture_info *,
657 dt_operand ** = 0, int = 0);
658 };
659
660 /* An operator that is represented by native C code. This is always
661 a leaf operand in the AST. This class is also used to represent
662 the code to be generated for 'if' and 'with' expressions. */
663
664 struct c_expr : public operand
665 {
666 /* A mapping of an identifier and its replacement. Used to apply
667 'for' lowering. */
668 struct id_tab {
669 const char *id;
670 const char *oper;
671 id_tab (const char *id_, const char *oper_): id (id_), oper (oper_) {}
672 };
673
674 c_expr (cpp_reader *r_, source_location loc,
675 vec<cpp_token> code_, unsigned nr_stmts_,
676 vec<id_tab> ids_, cid_map_t *capture_ids_)
677 : operand (OP_C_EXPR, loc), r (r_), code (code_),
678 capture_ids (capture_ids_), nr_stmts (nr_stmts_), ids (ids_) {}
679 /* cpplib tokens and state to transform this back to source. */
680 cpp_reader *r;
681 vec<cpp_token> code;
682 cid_map_t *capture_ids;
683 /* The number of statements parsed (well, the number of ';'s). */
684 unsigned nr_stmts;
685 /* The identifier replacement vector. */
686 vec<id_tab> ids;
687 virtual void gen_transform (FILE *f, int, const char *, bool, int,
688 const char *, capture_info *,
689 dt_operand ** = 0, int = 0);
690 };
691
692 /* A wrapper around another operand that captures its value. */
693
694 struct capture : public operand
695 {
696 capture (source_location loc, unsigned where_, operand *what_)
697 : operand (OP_CAPTURE, loc), where (where_), what (what_) {}
698 /* Identifier index for the value. */
699 unsigned where;
700 /* The captured value. */
701 operand *what;
702 virtual void gen_transform (FILE *f, int, const char *, bool, int,
703 const char *, capture_info *,
704 dt_operand ** = 0, int = 0);
705 };
706
707 /* if expression. */
708
709 struct if_expr : public operand
710 {
711 if_expr (source_location loc)
712 : operand (OP_IF, loc), cond (NULL), trueexpr (NULL), falseexpr (NULL) {}
713 c_expr *cond;
714 operand *trueexpr;
715 operand *falseexpr;
716 };
717
718 /* with expression. */
719
720 struct with_expr : public operand
721 {
722 with_expr (source_location loc)
723 : operand (OP_WITH, loc), with (NULL), subexpr (NULL) {}
724 c_expr *with;
725 operand *subexpr;
726 };
727
728 template<>
729 template<>
730 inline bool
731 is_a_helper <capture *>::test (operand *op)
732 {
733 return op->type == operand::OP_CAPTURE;
734 }
735
736 template<>
737 template<>
738 inline bool
739 is_a_helper <predicate *>::test (operand *op)
740 {
741 return op->type == operand::OP_PREDICATE;
742 }
743
744 template<>
745 template<>
746 inline bool
747 is_a_helper <c_expr *>::test (operand *op)
748 {
749 return op->type == operand::OP_C_EXPR;
750 }
751
752 template<>
753 template<>
754 inline bool
755 is_a_helper <expr *>::test (operand *op)
756 {
757 return op->type == operand::OP_EXPR;
758 }
759
760 template<>
761 template<>
762 inline bool
763 is_a_helper <if_expr *>::test (operand *op)
764 {
765 return op->type == operand::OP_IF;
766 }
767
768 template<>
769 template<>
770 inline bool
771 is_a_helper <with_expr *>::test (operand *op)
772 {
773 return op->type == operand::OP_WITH;
774 }
775
776 /* The main class of a pattern and its transform. This is used to
777 represent both (simplify ...) and (match ...) kinds. The AST
778 duplicates all outer 'if' and 'for' expressions here so each
779 simplify can exist in isolation. */
780
781 struct simplify
782 {
783 enum simplify_kind { SIMPLIFY, MATCH };
784
785 simplify (simplify_kind kind_, operand *match_, operand *result_,
786 vec<vec<user_id *> > for_vec_, cid_map_t *capture_ids_)
787 : kind (kind_), match (match_), result (result_),
788 for_vec (for_vec_), for_subst_vec (vNULL),
789 capture_ids (capture_ids_), capture_max (capture_ids_->elements () - 1) {}
790
791 simplify_kind kind;
792 /* The expression that is matched against the GENERIC or GIMPLE IL. */
793 operand *match;
794 /* For a (simplify ...) an expression with ifs and withs with the expression
795 produced when the pattern applies in the leafs.
796 For a (match ...) the leafs are either empty if it is a simple predicate
797 or the single expression specifying the matched operands. */
798 struct operand *result;
799 /* Collected 'for' expression operators that have to be replaced
800 in the lowering phase. */
801 vec<vec<user_id *> > for_vec;
802 vec<std::pair<user_id *, id_base *> > for_subst_vec;
803 /* A map of capture identifiers to indexes. */
804 cid_map_t *capture_ids;
805 int capture_max;
806 };
807
808 /* Debugging routines for dumping the AST. */
809
810 DEBUG_FUNCTION void
811 print_operand (operand *o, FILE *f = stderr, bool flattened = false)
812 {
813 if (capture *c = dyn_cast<capture *> (o))
814 {
815 if (c->what && flattened == false)
816 print_operand (c->what, f, flattened);
817 fprintf (f, "@%u", c->where);
818 }
819
820 else if (predicate *p = dyn_cast<predicate *> (o))
821 fprintf (f, "%s", p->p->id);
822
823 else if (is_a<c_expr *> (o))
824 fprintf (f, "c_expr");
825
826 else if (expr *e = dyn_cast<expr *> (o))
827 {
828 if (e->ops.length () == 0)
829 fprintf (f, "%s", e->operation->id);
830 else
831 {
832 fprintf (f, "(%s", e->operation->id);
833
834 if (flattened == false)
835 {
836 for (unsigned i = 0; i < e->ops.length (); ++i)
837 {
838 putc (' ', f);
839 print_operand (e->ops[i], f, flattened);
840 }
841 }
842 putc (')', f);
843 }
844 }
845
846 else
847 gcc_unreachable ();
848 }
849
850 DEBUG_FUNCTION void
851 print_matches (struct simplify *s, FILE *f = stderr)
852 {
853 fprintf (f, "for expression: ");
854 print_operand (s->match, f);
855 putc ('\n', f);
856 }
857
858
859 /* AST lowering. */
860
861 /* Lowering of commutative operators. */
862
863 static void
864 cartesian_product (const vec< vec<operand *> >& ops_vector,
865 vec< vec<operand *> >& result, vec<operand *>& v, unsigned n)
866 {
867 if (n == ops_vector.length ())
868 {
869 vec<operand *> xv = v.copy ();
870 result.safe_push (xv);
871 return;
872 }
873
874 for (unsigned i = 0; i < ops_vector[n].length (); ++i)
875 {
876 v[n] = ops_vector[n][i];
877 cartesian_product (ops_vector, result, v, n + 1);
878 }
879 }
880
881 /* Lower OP to two operands in case it is marked as commutative. */
882
883 static vec<operand *>
884 commutate (operand *op, vec<vec<user_id *> > &for_vec)
885 {
886 vec<operand *> ret = vNULL;
887
888 if (capture *c = dyn_cast <capture *> (op))
889 {
890 if (!c->what)
891 {
892 ret.safe_push (op);
893 return ret;
894 }
895 vec<operand *> v = commutate (c->what, for_vec);
896 for (unsigned i = 0; i < v.length (); ++i)
897 {
898 capture *nc = new capture (c->location, c->where, v[i]);
899 ret.safe_push (nc);
900 }
901 return ret;
902 }
903
904 expr *e = dyn_cast <expr *> (op);
905 if (!e || e->ops.length () == 0)
906 {
907 ret.safe_push (op);
908 return ret;
909 }
910
911 vec< vec<operand *> > ops_vector = vNULL;
912 for (unsigned i = 0; i < e->ops.length (); ++i)
913 ops_vector.safe_push (commutate (e->ops[i], for_vec));
914
915 auto_vec< vec<operand *> > result;
916 auto_vec<operand *> v (e->ops.length ());
917 v.quick_grow_cleared (e->ops.length ());
918 cartesian_product (ops_vector, result, v, 0);
919
920
921 for (unsigned i = 0; i < result.length (); ++i)
922 {
923 expr *ne = new expr (e);
924 ne->is_commutative = false;
925 for (unsigned j = 0; j < result[i].length (); ++j)
926 ne->append_op (result[i][j]);
927 ret.safe_push (ne);
928 }
929
930 if (!e->is_commutative)
931 return ret;
932
933 for (unsigned i = 0; i < result.length (); ++i)
934 {
935 expr *ne = new expr (e);
936 if (operator_id *p = dyn_cast <operator_id *> (ne->operation))
937 {
938 if (comparison_code_p (p->code))
939 ne->operation = swap_tree_comparison (p);
940 }
941 else if (user_id *p = dyn_cast <user_id *> (ne->operation))
942 {
943 bool found_compare = false;
944 for (unsigned j = 0; j < p->substitutes.length (); ++j)
945 if (operator_id *q = dyn_cast <operator_id *> (p->substitutes[j]))
946 {
947 if (comparison_code_p (q->code)
948 && swap_tree_comparison (q) != q)
949 {
950 found_compare = true;
951 break;
952 }
953 }
954 if (found_compare)
955 {
956 user_id *newop = new user_id ("<internal>");
957 for (unsigned j = 0; j < p->substitutes.length (); ++j)
958 {
959 id_base *subst = p->substitutes[j];
960 if (operator_id *q = dyn_cast <operator_id *> (subst))
961 {
962 if (comparison_code_p (q->code))
963 subst = swap_tree_comparison (q);
964 }
965 newop->substitutes.safe_push (subst);
966 }
967 ne->operation = newop;
968 /* Search for 'p' inside the for vector and push 'newop'
969 to the same level. */
970 for (unsigned j = 0; newop && j < for_vec.length (); ++j)
971 for (unsigned k = 0; k < for_vec[j].length (); ++k)
972 if (for_vec[j][k] == p)
973 {
974 for_vec[j].safe_push (newop);
975 newop = NULL;
976 break;
977 }
978 }
979 }
980 ne->is_commutative = false;
981 // result[i].length () is 2 since e->operation is binary
982 for (unsigned j = result[i].length (); j; --j)
983 ne->append_op (result[i][j-1]);
984 ret.safe_push (ne);
985 }
986
987 return ret;
988 }
989
990 /* Lower operations marked as commutative in the AST of S and push
991 the resulting patterns to SIMPLIFIERS. */
992
993 static void
994 lower_commutative (simplify *s, vec<simplify *>& simplifiers)
995 {
996 vec<operand *> matchers = commutate (s->match, s->for_vec);
997 for (unsigned i = 0; i < matchers.length (); ++i)
998 {
999 simplify *ns = new simplify (s->kind, matchers[i], s->result,
1000 s->for_vec, s->capture_ids);
1001 simplifiers.safe_push (ns);
1002 }
1003 }
1004
1005 /* Strip conditional conversios using operator OPER from O and its
1006 children if STRIP, else replace them with an unconditional convert. */
1007
1008 operand *
1009 lower_opt_convert (operand *o, enum tree_code oper,
1010 enum tree_code to_oper, bool strip)
1011 {
1012 if (capture *c = dyn_cast<capture *> (o))
1013 {
1014 if (c->what)
1015 return new capture (c->location, c->where,
1016 lower_opt_convert (c->what, oper, to_oper, strip));
1017 else
1018 return c;
1019 }
1020
1021 expr *e = dyn_cast<expr *> (o);
1022 if (!e)
1023 return o;
1024
1025 if (*e->operation == oper)
1026 {
1027 if (strip)
1028 return lower_opt_convert (e->ops[0], oper, to_oper, strip);
1029
1030 expr *ne = new expr (e);
1031 ne->operation = (to_oper == CONVERT_EXPR
1032 ? get_operator ("CONVERT_EXPR")
1033 : get_operator ("VIEW_CONVERT_EXPR"));
1034 ne->append_op (lower_opt_convert (e->ops[0], oper, to_oper, strip));
1035 return ne;
1036 }
1037
1038 expr *ne = new expr (e);
1039 for (unsigned i = 0; i < e->ops.length (); ++i)
1040 ne->append_op (lower_opt_convert (e->ops[i], oper, to_oper, strip));
1041
1042 return ne;
1043 }
1044
1045 /* Determine whether O or its children uses the conditional conversion
1046 operator OPER. */
1047
1048 static bool
1049 has_opt_convert (operand *o, enum tree_code oper)
1050 {
1051 if (capture *c = dyn_cast<capture *> (o))
1052 {
1053 if (c->what)
1054 return has_opt_convert (c->what, oper);
1055 else
1056 return false;
1057 }
1058
1059 expr *e = dyn_cast<expr *> (o);
1060 if (!e)
1061 return false;
1062
1063 if (*e->operation == oper)
1064 return true;
1065
1066 for (unsigned i = 0; i < e->ops.length (); ++i)
1067 if (has_opt_convert (e->ops[i], oper))
1068 return true;
1069
1070 return false;
1071 }
1072
1073 /* Lower conditional convert operators in O, expanding it to a vector
1074 if required. */
1075
1076 static vec<operand *>
1077 lower_opt_convert (operand *o)
1078 {
1079 vec<operand *> v1 = vNULL, v2;
1080
1081 v1.safe_push (o);
1082
1083 enum tree_code opers[]
1084 = { CONVERT0, CONVERT_EXPR,
1085 CONVERT1, CONVERT_EXPR,
1086 CONVERT2, CONVERT_EXPR,
1087 VIEW_CONVERT0, VIEW_CONVERT_EXPR,
1088 VIEW_CONVERT1, VIEW_CONVERT_EXPR,
1089 VIEW_CONVERT2, VIEW_CONVERT_EXPR };
1090
1091 /* Conditional converts are lowered to a pattern with the
1092 conversion and one without. The three different conditional
1093 convert codes are lowered separately. */
1094
1095 for (unsigned i = 0; i < sizeof (opers) / sizeof (enum tree_code); i += 2)
1096 {
1097 v2 = vNULL;
1098 for (unsigned j = 0; j < v1.length (); ++j)
1099 if (has_opt_convert (v1[j], opers[i]))
1100 {
1101 v2.safe_push (lower_opt_convert (v1[j],
1102 opers[i], opers[i+1], false));
1103 v2.safe_push (lower_opt_convert (v1[j],
1104 opers[i], opers[i+1], true));
1105 }
1106
1107 if (v2 != vNULL)
1108 {
1109 v1 = vNULL;
1110 for (unsigned j = 0; j < v2.length (); ++j)
1111 v1.safe_push (v2[j]);
1112 }
1113 }
1114
1115 return v1;
1116 }
1117
1118 /* Lower conditional convert operators in the AST of S and push
1119 the resulting multiple patterns to SIMPLIFIERS. */
1120
1121 static void
1122 lower_opt_convert (simplify *s, vec<simplify *>& simplifiers)
1123 {
1124 vec<operand *> matchers = lower_opt_convert (s->match);
1125 for (unsigned i = 0; i < matchers.length (); ++i)
1126 {
1127 simplify *ns = new simplify (s->kind, matchers[i], s->result,
1128 s->for_vec, s->capture_ids);
1129 simplifiers.safe_push (ns);
1130 }
1131 }
1132
1133 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1134 GENERIC and a GIMPLE variant. */
1135
1136 static vec<operand *>
1137 lower_cond (operand *o)
1138 {
1139 vec<operand *> ro = vNULL;
1140
1141 if (capture *c = dyn_cast<capture *> (o))
1142 {
1143 if (c->what)
1144 {
1145 vec<operand *> lop = vNULL;
1146 lop = lower_cond (c->what);
1147
1148 for (unsigned i = 0; i < lop.length (); ++i)
1149 ro.safe_push (new capture (c->location, c->where, lop[i]));
1150 return ro;
1151 }
1152 }
1153
1154 expr *e = dyn_cast<expr *> (o);
1155 if (!e || e->ops.length () == 0)
1156 {
1157 ro.safe_push (o);
1158 return ro;
1159 }
1160
1161 vec< vec<operand *> > ops_vector = vNULL;
1162 for (unsigned i = 0; i < e->ops.length (); ++i)
1163 ops_vector.safe_push (lower_cond (e->ops[i]));
1164
1165 auto_vec< vec<operand *> > result;
1166 auto_vec<operand *> v (e->ops.length ());
1167 v.quick_grow_cleared (e->ops.length ());
1168 cartesian_product (ops_vector, result, v, 0);
1169
1170 for (unsigned i = 0; i < result.length (); ++i)
1171 {
1172 expr *ne = new expr (e);
1173 for (unsigned j = 0; j < result[i].length (); ++j)
1174 ne->append_op (result[i][j]);
1175 ro.safe_push (ne);
1176 /* If this is a COND with a captured expression or an
1177 expression with two operands then also match a GENERIC
1178 form on the compare. */
1179 if ((*e->operation == COND_EXPR
1180 || *e->operation == VEC_COND_EXPR)
1181 && ((is_a <capture *> (e->ops[0])
1182 && as_a <capture *> (e->ops[0])->what
1183 && is_a <expr *> (as_a <capture *> (e->ops[0])->what)
1184 && as_a <expr *>
1185 (as_a <capture *> (e->ops[0])->what)->ops.length () == 2)
1186 || (is_a <expr *> (e->ops[0])
1187 && as_a <expr *> (e->ops[0])->ops.length () == 2)))
1188 {
1189 expr *ne = new expr (e);
1190 for (unsigned j = 0; j < result[i].length (); ++j)
1191 ne->append_op (result[i][j]);
1192 if (capture *c = dyn_cast <capture *> (ne->ops[0]))
1193 {
1194 expr *ocmp = as_a <expr *> (c->what);
1195 expr *cmp = new expr (ocmp);
1196 for (unsigned j = 0; j < ocmp->ops.length (); ++j)
1197 cmp->append_op (ocmp->ops[j]);
1198 cmp->is_generic = true;
1199 ne->ops[0] = new capture (c->location, c->where, cmp);
1200 }
1201 else
1202 {
1203 expr *ocmp = as_a <expr *> (ne->ops[0]);
1204 expr *cmp = new expr (ocmp);
1205 for (unsigned j = 0; j < ocmp->ops.length (); ++j)
1206 cmp->append_op (ocmp->ops[j]);
1207 cmp->is_generic = true;
1208 ne->ops[0] = cmp;
1209 }
1210 ro.safe_push (ne);
1211 }
1212 }
1213
1214 return ro;
1215 }
1216
1217 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1218 GENERIC and a GIMPLE variant. */
1219
1220 static void
1221 lower_cond (simplify *s, vec<simplify *>& simplifiers)
1222 {
1223 vec<operand *> matchers = lower_cond (s->match);
1224 for (unsigned i = 0; i < matchers.length (); ++i)
1225 {
1226 simplify *ns = new simplify (s->kind, matchers[i], s->result,
1227 s->for_vec, s->capture_ids);
1228 simplifiers.safe_push (ns);
1229 }
1230 }
1231
1232 /* Return true if O refers to ID. */
1233
1234 bool
1235 contains_id (operand *o, user_id *id)
1236 {
1237 if (capture *c = dyn_cast<capture *> (o))
1238 return c->what && contains_id (c->what, id);
1239
1240 if (expr *e = dyn_cast<expr *> (o))
1241 {
1242 if (e->operation == id)
1243 return true;
1244 for (unsigned i = 0; i < e->ops.length (); ++i)
1245 if (contains_id (e->ops[i], id))
1246 return true;
1247 return false;
1248 }
1249
1250 if (with_expr *w = dyn_cast <with_expr *> (o))
1251 return (contains_id (w->with, id)
1252 || contains_id (w->subexpr, id));
1253
1254 if (if_expr *ife = dyn_cast <if_expr *> (o))
1255 return (contains_id (ife->cond, id)
1256 || contains_id (ife->trueexpr, id)
1257 || (ife->falseexpr && contains_id (ife->falseexpr, id)));
1258
1259 if (c_expr *ce = dyn_cast<c_expr *> (o))
1260 return ce->capture_ids && ce->capture_ids->get (id->id);
1261
1262 return false;
1263 }
1264
1265
1266 /* In AST operand O replace operator ID with operator WITH. */
1267
1268 operand *
1269 replace_id (operand *o, user_id *id, id_base *with)
1270 {
1271 /* Deep-copy captures and expressions, replacing operations as
1272 needed. */
1273 if (capture *c = dyn_cast<capture *> (o))
1274 {
1275 if (!c->what)
1276 return c;
1277 return new capture (c->location, c->where,
1278 replace_id (c->what, id, with));
1279 }
1280 else if (expr *e = dyn_cast<expr *> (o))
1281 {
1282 expr *ne = new expr (e);
1283 if (e->operation == id)
1284 ne->operation = with;
1285 for (unsigned i = 0; i < e->ops.length (); ++i)
1286 ne->append_op (replace_id (e->ops[i], id, with));
1287 return ne;
1288 }
1289 else if (with_expr *w = dyn_cast <with_expr *> (o))
1290 {
1291 with_expr *nw = new with_expr (w->location);
1292 nw->with = as_a <c_expr *> (replace_id (w->with, id, with));
1293 nw->subexpr = replace_id (w->subexpr, id, with);
1294 return nw;
1295 }
1296 else if (if_expr *ife = dyn_cast <if_expr *> (o))
1297 {
1298 if_expr *nife = new if_expr (ife->location);
1299 nife->cond = as_a <c_expr *> (replace_id (ife->cond, id, with));
1300 nife->trueexpr = replace_id (ife->trueexpr, id, with);
1301 if (ife->falseexpr)
1302 nife->falseexpr = replace_id (ife->falseexpr, id, with);
1303 return nife;
1304 }
1305
1306 /* For c_expr we simply record a string replacement table which is
1307 applied at code-generation time. */
1308 if (c_expr *ce = dyn_cast<c_expr *> (o))
1309 {
1310 vec<c_expr::id_tab> ids = ce->ids.copy ();
1311 ids.safe_push (c_expr::id_tab (id->id, with->id));
1312 return new c_expr (ce->r, ce->location,
1313 ce->code, ce->nr_stmts, ids, ce->capture_ids);
1314 }
1315
1316 return o;
1317 }
1318
1319 /* Return true if the binary operator OP is ok for delayed substitution
1320 during for lowering. */
1321
1322 static bool
1323 binary_ok (operator_id *op)
1324 {
1325 switch (op->code)
1326 {
1327 case PLUS_EXPR:
1328 case MINUS_EXPR:
1329 case MULT_EXPR:
1330 case TRUNC_DIV_EXPR:
1331 case CEIL_DIV_EXPR:
1332 case FLOOR_DIV_EXPR:
1333 case ROUND_DIV_EXPR:
1334 case TRUNC_MOD_EXPR:
1335 case CEIL_MOD_EXPR:
1336 case FLOOR_MOD_EXPR:
1337 case ROUND_MOD_EXPR:
1338 case RDIV_EXPR:
1339 case EXACT_DIV_EXPR:
1340 case MIN_EXPR:
1341 case MAX_EXPR:
1342 case BIT_IOR_EXPR:
1343 case BIT_XOR_EXPR:
1344 case BIT_AND_EXPR:
1345 return true;
1346 default:
1347 return false;
1348 }
1349 }
1350
1351 /* Lower recorded fors for SIN and output to SIMPLIFIERS. */
1352
1353 static void
1354 lower_for (simplify *sin, vec<simplify *>& simplifiers)
1355 {
1356 vec<vec<user_id *> >& for_vec = sin->for_vec;
1357 unsigned worklist_start = 0;
1358 auto_vec<simplify *> worklist;
1359 worklist.safe_push (sin);
1360
1361 /* Lower each recorded for separately, operating on the
1362 set of simplifiers created by the previous one.
1363 Lower inner-to-outer so inner for substitutes can refer
1364 to operators replaced by outer fors. */
1365 for (int fi = for_vec.length () - 1; fi >= 0; --fi)
1366 {
1367 vec<user_id *>& ids = for_vec[fi];
1368 unsigned n_ids = ids.length ();
1369 unsigned max_n_opers = 0;
1370 bool can_delay_subst = (sin->kind == simplify::SIMPLIFY);
1371 for (unsigned i = 0; i < n_ids; ++i)
1372 {
1373 if (ids[i]->substitutes.length () > max_n_opers)
1374 max_n_opers = ids[i]->substitutes.length ();
1375 /* Require that all substitutes are of the same kind so that
1376 if we delay substitution to the result op code generation
1377 can look at the first substitute for deciding things like
1378 types of operands. */
1379 enum id_base::id_kind kind = ids[i]->substitutes[0]->kind;
1380 for (unsigned j = 0; j < ids[i]->substitutes.length (); ++j)
1381 if (ids[i]->substitutes[j]->kind != kind)
1382 can_delay_subst = false;
1383 else if (operator_id *op
1384 = dyn_cast <operator_id *> (ids[i]->substitutes[j]))
1385 {
1386 operator_id *op0
1387 = as_a <operator_id *> (ids[i]->substitutes[0]);
1388 if (strcmp (op->tcc, "tcc_comparison") == 0
1389 && strcmp (op0->tcc, "tcc_comparison") == 0)
1390 ;
1391 /* Unfortunately we can't just allow all tcc_binary. */
1392 else if (strcmp (op->tcc, "tcc_binary") == 0
1393 && strcmp (op0->tcc, "tcc_binary") == 0
1394 && binary_ok (op)
1395 && binary_ok (op0))
1396 ;
1397 else if ((strcmp (op->id + 1, "SHIFT_EXPR") == 0
1398 || strcmp (op->id + 1, "ROTATE_EXPR") == 0)
1399 && (strcmp (op0->id + 1, "SHIFT_EXPR") == 0
1400 || strcmp (op0->id + 1, "ROTATE_EXPR") == 0))
1401 ;
1402 else
1403 can_delay_subst = false;
1404 }
1405 else if (is_a <fn_id *> (ids[i]->substitutes[j]))
1406 ;
1407 else
1408 can_delay_subst = false;
1409 }
1410
1411 unsigned worklist_end = worklist.length ();
1412 for (unsigned si = worklist_start; si < worklist_end; ++si)
1413 {
1414 simplify *s = worklist[si];
1415 for (unsigned j = 0; j < max_n_opers; ++j)
1416 {
1417 operand *match_op = s->match;
1418 operand *result_op = s->result;
1419 auto_vec<std::pair<user_id *, id_base *> > subst (n_ids);
1420 bool skip = false;
1421 for (unsigned i = 0; i < n_ids; ++i)
1422 {
1423 user_id *id = ids[i];
1424 id_base *oper = id->substitutes[j % id->substitutes.length ()];
1425 if (oper == null_id
1426 && (contains_id (match_op, id)
1427 || contains_id (result_op, id)))
1428 {
1429 skip = true;
1430 break;
1431 }
1432 subst.quick_push (std::make_pair (id, oper));
1433 match_op = replace_id (match_op, id, oper);
1434 if (result_op
1435 && !can_delay_subst)
1436 result_op = replace_id (result_op, id, oper);
1437 }
1438 if (skip)
1439 continue;
1440
1441 simplify *ns = new simplify (s->kind, match_op, result_op,
1442 vNULL, s->capture_ids);
1443 ns->for_subst_vec.safe_splice (s->for_subst_vec);
1444 if (result_op
1445 && can_delay_subst)
1446 ns->for_subst_vec.safe_splice (subst);
1447
1448 worklist.safe_push (ns);
1449 }
1450 }
1451 worklist_start = worklist_end;
1452 }
1453
1454 /* Copy out the result from the last for lowering. */
1455 for (unsigned i = worklist_start; i < worklist.length (); ++i)
1456 simplifiers.safe_push (worklist[i]);
1457 }
1458
1459 /* Lower the AST for everything in SIMPLIFIERS. */
1460
1461 static void
1462 lower (vec<simplify *>& simplifiers, bool gimple)
1463 {
1464 auto_vec<simplify *> out_simplifiers;
1465 for (unsigned i = 0; i < simplifiers.length (); ++i)
1466 lower_opt_convert (simplifiers[i], out_simplifiers);
1467
1468 simplifiers.truncate (0);
1469 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1470 lower_commutative (out_simplifiers[i], simplifiers);
1471
1472 out_simplifiers.truncate (0);
1473 if (gimple)
1474 for (unsigned i = 0; i < simplifiers.length (); ++i)
1475 lower_cond (simplifiers[i], out_simplifiers);
1476 else
1477 out_simplifiers.safe_splice (simplifiers);
1478
1479
1480 simplifiers.truncate (0);
1481 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1482 lower_for (out_simplifiers[i], simplifiers);
1483 }
1484
1485
1486
1487
1488 /* The decision tree built for generating GIMPLE and GENERIC pattern
1489 matching code. It represents the 'match' expression of all
1490 simplifies and has those as its leafs. */
1491
1492 struct dt_simplify;
1493
1494 /* A hash-map collecting semantically equivalent leafs in the decision
1495 tree for splitting out to separate functions. */
1496 struct sinfo
1497 {
1498 dt_simplify *s;
1499
1500 const char *fname;
1501 unsigned cnt;
1502 };
1503
1504 struct sinfo_hashmap_traits : simple_hashmap_traits<pointer_hash<dt_simplify>,
1505 sinfo *>
1506 {
1507 static inline hashval_t hash (const key_type &);
1508 static inline bool equal_keys (const key_type &, const key_type &);
1509 template <typename T> static inline void remove (T &) {}
1510 };
1511
1512 typedef hash_map<void * /* unused */, sinfo *, sinfo_hashmap_traits>
1513 sinfo_map_t;
1514
1515
1516 /* Decision tree base class, used for DT_TRUE and DT_NODE. */
1517
1518 struct dt_node
1519 {
1520 enum dt_type { DT_NODE, DT_OPERAND, DT_TRUE, DT_MATCH, DT_SIMPLIFY };
1521
1522 enum dt_type type;
1523 unsigned level;
1524 vec<dt_node *> kids;
1525
1526 /* Statistics. */
1527 unsigned num_leafs;
1528 unsigned total_size;
1529 unsigned max_level;
1530
1531 dt_node (enum dt_type type_): type (type_), level (0), kids (vNULL) {}
1532
1533 dt_node *append_node (dt_node *);
1534 dt_node *append_op (operand *, dt_node *parent = 0, unsigned pos = 0);
1535 dt_node *append_true_op (dt_node *parent = 0, unsigned pos = 0);
1536 dt_node *append_match_op (dt_operand *, dt_node *parent = 0, unsigned pos = 0);
1537 dt_node *append_simplify (simplify *, unsigned, dt_operand **);
1538
1539 virtual void gen (FILE *, int, bool) {}
1540
1541 void gen_kids (FILE *, int, bool);
1542 void gen_kids_1 (FILE *, int, bool,
1543 vec<dt_operand *>, vec<dt_operand *>, vec<dt_operand *>,
1544 vec<dt_operand *>, vec<dt_operand *>, vec<dt_node *>);
1545
1546 void analyze (sinfo_map_t &);
1547 };
1548
1549 /* Generic decision tree node used for DT_OPERAND and DT_MATCH. */
1550
1551 struct dt_operand : public dt_node
1552 {
1553 operand *op;
1554 dt_operand *match_dop;
1555 dt_operand *parent;
1556 unsigned pos;
1557
1558 dt_operand (enum dt_type type, operand *op_, dt_operand *match_dop_,
1559 dt_operand *parent_ = 0, unsigned pos_ = 0)
1560 : dt_node (type), op (op_), match_dop (match_dop_),
1561 parent (parent_), pos (pos_) {}
1562
1563 void gen (FILE *, int, bool);
1564 unsigned gen_predicate (FILE *, int, const char *, bool);
1565 unsigned gen_match_op (FILE *, int, const char *);
1566
1567 unsigned gen_gimple_expr (FILE *, int);
1568 unsigned gen_generic_expr (FILE *, int, const char *);
1569
1570 char *get_name (char *);
1571 void gen_opname (char *, unsigned);
1572 };
1573
1574 /* Leaf node of the decision tree, used for DT_SIMPLIFY. */
1575
1576 struct dt_simplify : public dt_node
1577 {
1578 simplify *s;
1579 unsigned pattern_no;
1580 dt_operand **indexes;
1581 sinfo *info;
1582
1583 dt_simplify (simplify *s_, unsigned pattern_no_, dt_operand **indexes_)
1584 : dt_node (DT_SIMPLIFY), s (s_), pattern_no (pattern_no_),
1585 indexes (indexes_), info (NULL) {}
1586
1587 void gen_1 (FILE *, int, bool, operand *);
1588 void gen (FILE *f, int, bool);
1589 };
1590
1591 template<>
1592 template<>
1593 inline bool
1594 is_a_helper <dt_operand *>::test (dt_node *n)
1595 {
1596 return (n->type == dt_node::DT_OPERAND
1597 || n->type == dt_node::DT_MATCH);
1598 }
1599
1600 template<>
1601 template<>
1602 inline bool
1603 is_a_helper <dt_simplify *>::test (dt_node *n)
1604 {
1605 return n->type == dt_node::DT_SIMPLIFY;
1606 }
1607
1608
1609
1610 /* A container for the actual decision tree. */
1611
1612 struct decision_tree
1613 {
1614 dt_node *root;
1615
1616 void insert (struct simplify *, unsigned);
1617 void gen (FILE *f, bool gimple);
1618 void print (FILE *f = stderr);
1619
1620 decision_tree () { root = new dt_node (dt_node::DT_NODE); }
1621
1622 static dt_node *insert_operand (dt_node *, operand *, dt_operand **indexes,
1623 unsigned pos = 0, dt_node *parent = 0);
1624 static dt_node *find_node (vec<dt_node *>&, dt_node *);
1625 static bool cmp_node (dt_node *, dt_node *);
1626 static void print_node (dt_node *, FILE *f = stderr, unsigned = 0);
1627 };
1628
1629 /* Compare two AST operands O1 and O2 and return true if they are equal. */
1630
1631 bool
1632 cmp_operand (operand *o1, operand *o2)
1633 {
1634 if (!o1 || !o2 || o1->type != o2->type)
1635 return false;
1636
1637 if (o1->type == operand::OP_PREDICATE)
1638 {
1639 predicate *p1 = as_a<predicate *>(o1);
1640 predicate *p2 = as_a<predicate *>(o2);
1641 return p1->p == p2->p;
1642 }
1643 else if (o1->type == operand::OP_EXPR)
1644 {
1645 expr *e1 = static_cast<expr *>(o1);
1646 expr *e2 = static_cast<expr *>(o2);
1647 return (e1->operation == e2->operation
1648 && e1->is_generic == e2->is_generic);
1649 }
1650 else
1651 return false;
1652 }
1653
1654 /* Compare two decision tree nodes N1 and N2 and return true if they
1655 are equal. */
1656
1657 bool
1658 decision_tree::cmp_node (dt_node *n1, dt_node *n2)
1659 {
1660 if (!n1 || !n2 || n1->type != n2->type)
1661 return false;
1662
1663 if (n1 == n2)
1664 return true;
1665
1666 if (n1->type == dt_node::DT_TRUE)
1667 return false;
1668
1669 if (n1->type == dt_node::DT_OPERAND)
1670 return cmp_operand ((as_a<dt_operand *> (n1))->op,
1671 (as_a<dt_operand *> (n2))->op);
1672 else if (n1->type == dt_node::DT_MATCH)
1673 return ((as_a<dt_operand *> (n1))->match_dop
1674 == (as_a<dt_operand *> (n2))->match_dop);
1675 return false;
1676 }
1677
1678 /* Search OPS for a decision tree node like P and return it if found. */
1679
1680 dt_node *
1681 decision_tree::find_node (vec<dt_node *>& ops, dt_node *p)
1682 {
1683 /* We can merge adjacent DT_TRUE. */
1684 if (p->type == dt_node::DT_TRUE
1685 && !ops.is_empty ()
1686 && ops.last ()->type == dt_node::DT_TRUE)
1687 return ops.last ();
1688 for (int i = ops.length () - 1; i >= 0; --i)
1689 {
1690 /* But we can't merge across DT_TRUE nodes as they serve as
1691 pattern order barriers to make sure that patterns apply
1692 in order of appearance in case multiple matches are possible. */
1693 if (ops[i]->type == dt_node::DT_TRUE)
1694 return NULL;
1695 if (decision_tree::cmp_node (ops[i], p))
1696 return ops[i];
1697 }
1698 return NULL;
1699 }
1700
1701 /* Append N to the decision tree if it there is not already an existing
1702 identical child. */
1703
1704 dt_node *
1705 dt_node::append_node (dt_node *n)
1706 {
1707 dt_node *kid;
1708
1709 kid = decision_tree::find_node (kids, n);
1710 if (kid)
1711 return kid;
1712
1713 kids.safe_push (n);
1714 n->level = this->level + 1;
1715
1716 return n;
1717 }
1718
1719 /* Append OP to the decision tree. */
1720
1721 dt_node *
1722 dt_node::append_op (operand *op, dt_node *parent, unsigned pos)
1723 {
1724 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1725 dt_operand *n = new dt_operand (DT_OPERAND, op, 0, parent_, pos);
1726 return append_node (n);
1727 }
1728
1729 /* Append a DT_TRUE decision tree node. */
1730
1731 dt_node *
1732 dt_node::append_true_op (dt_node *parent, unsigned pos)
1733 {
1734 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1735 dt_operand *n = new dt_operand (DT_TRUE, 0, 0, parent_, pos);
1736 return append_node (n);
1737 }
1738
1739 /* Append a DT_MATCH decision tree node. */
1740
1741 dt_node *
1742 dt_node::append_match_op (dt_operand *match_dop, dt_node *parent, unsigned pos)
1743 {
1744 dt_operand *parent_ = as_a<dt_operand *> (parent);
1745 dt_operand *n = new dt_operand (DT_MATCH, 0, match_dop, parent_, pos);
1746 return append_node (n);
1747 }
1748
1749 /* Append S to the decision tree. */
1750
1751 dt_node *
1752 dt_node::append_simplify (simplify *s, unsigned pattern_no,
1753 dt_operand **indexes)
1754 {
1755 dt_simplify *n = new dt_simplify (s, pattern_no, indexes);
1756 for (unsigned i = 0; i < kids.length (); ++i)
1757 if (dt_simplify *s2 = dyn_cast <dt_simplify *> (kids[i]))
1758 {
1759 warning_at (s->match->location, "duplicate pattern");
1760 warning_at (s2->s->match->location, "previous pattern defined here");
1761 print_operand (s->match, stderr);
1762 fprintf (stderr, "\n");
1763 }
1764 return append_node (n);
1765 }
1766
1767 /* Analyze the node and its children. */
1768
1769 void
1770 dt_node::analyze (sinfo_map_t &map)
1771 {
1772 num_leafs = 0;
1773 total_size = 1;
1774 max_level = level;
1775
1776 if (type == DT_SIMPLIFY)
1777 {
1778 /* Populate the map of equivalent simplifies. */
1779 dt_simplify *s = as_a <dt_simplify *> (this);
1780 bool existed;
1781 sinfo *&si = map.get_or_insert (s, &existed);
1782 if (!existed)
1783 {
1784 si = new sinfo;
1785 si->s = s;
1786 si->cnt = 1;
1787 si->fname = NULL;
1788 }
1789 else
1790 si->cnt++;
1791 s->info = si;
1792 num_leafs = 1;
1793 return;
1794 }
1795
1796 for (unsigned i = 0; i < kids.length (); ++i)
1797 {
1798 kids[i]->analyze (map);
1799 num_leafs += kids[i]->num_leafs;
1800 total_size += kids[i]->total_size;
1801 max_level = MAX (max_level, kids[i]->max_level);
1802 }
1803 }
1804
1805 /* Insert O into the decision tree and return the decision tree node found
1806 or created. */
1807
1808 dt_node *
1809 decision_tree::insert_operand (dt_node *p, operand *o, dt_operand **indexes,
1810 unsigned pos, dt_node *parent)
1811 {
1812 dt_node *q, *elm = 0;
1813
1814 if (capture *c = dyn_cast<capture *> (o))
1815 {
1816 unsigned capt_index = c->where;
1817
1818 if (indexes[capt_index] == 0)
1819 {
1820 if (c->what)
1821 q = insert_operand (p, c->what, indexes, pos, parent);
1822 else
1823 {
1824 q = elm = p->append_true_op (parent, pos);
1825 goto at_assert_elm;
1826 }
1827 // get to the last capture
1828 for (operand *what = c->what;
1829 what && is_a<capture *> (what);
1830 c = as_a<capture *> (what), what = c->what)
1831 ;
1832
1833 if (!c->what)
1834 {
1835 unsigned cc_index = c->where;
1836 dt_operand *match_op = indexes[cc_index];
1837
1838 dt_operand temp (dt_node::DT_TRUE, 0, 0);
1839 elm = decision_tree::find_node (p->kids, &temp);
1840
1841 if (elm == 0)
1842 {
1843 dt_operand temp (dt_node::DT_MATCH, 0, match_op);
1844 elm = decision_tree::find_node (p->kids, &temp);
1845 }
1846 }
1847 else
1848 {
1849 dt_operand temp (dt_node::DT_OPERAND, c->what, 0);
1850 elm = decision_tree::find_node (p->kids, &temp);
1851 }
1852
1853 at_assert_elm:
1854 gcc_assert (elm->type == dt_node::DT_TRUE
1855 || elm->type == dt_node::DT_OPERAND
1856 || elm->type == dt_node::DT_MATCH);
1857 indexes[capt_index] = static_cast<dt_operand *> (elm);
1858 return q;
1859 }
1860 else
1861 {
1862 p = p->append_match_op (indexes[capt_index], parent, pos);
1863 if (c->what)
1864 return insert_operand (p, c->what, indexes, 0, p);
1865 else
1866 return p;
1867 }
1868 }
1869 p = p->append_op (o, parent, pos);
1870 q = p;
1871
1872 if (expr *e = dyn_cast <expr *>(o))
1873 {
1874 for (unsigned i = 0; i < e->ops.length (); ++i)
1875 q = decision_tree::insert_operand (q, e->ops[i], indexes, i, p);
1876 }
1877
1878 return q;
1879 }
1880
1881 /* Insert S into the decision tree. */
1882
1883 void
1884 decision_tree::insert (struct simplify *s, unsigned pattern_no)
1885 {
1886 dt_operand **indexes = XCNEWVEC (dt_operand *, s->capture_max + 1);
1887 dt_node *p = decision_tree::insert_operand (root, s->match, indexes);
1888 p->append_simplify (s, pattern_no, indexes);
1889 }
1890
1891 /* Debug functions to dump the decision tree. */
1892
1893 DEBUG_FUNCTION void
1894 decision_tree::print_node (dt_node *p, FILE *f, unsigned indent)
1895 {
1896 if (p->type == dt_node::DT_NODE)
1897 fprintf (f, "root");
1898 else
1899 {
1900 fprintf (f, "|");
1901 for (unsigned i = 0; i < indent; i++)
1902 fprintf (f, "-");
1903
1904 if (p->type == dt_node::DT_OPERAND)
1905 {
1906 dt_operand *dop = static_cast<dt_operand *>(p);
1907 print_operand (dop->op, f, true);
1908 }
1909 else if (p->type == dt_node::DT_TRUE)
1910 fprintf (f, "true");
1911 else if (p->type == dt_node::DT_MATCH)
1912 fprintf (f, "match (%p)", (void *)((as_a<dt_operand *>(p))->match_dop));
1913 else if (p->type == dt_node::DT_SIMPLIFY)
1914 {
1915 dt_simplify *s = static_cast<dt_simplify *> (p);
1916 fprintf (f, "simplify_%u { ", s->pattern_no);
1917 for (int i = 0; i <= s->s->capture_max; ++i)
1918 fprintf (f, "%p, ", (void *) s->indexes[i]);
1919 fprintf (f, " } ");
1920 }
1921 }
1922
1923 fprintf (stderr, " (%p), %u, %u\n", (void *) p, p->level, p->kids.length ());
1924
1925 for (unsigned i = 0; i < p->kids.length (); ++i)
1926 decision_tree::print_node (p->kids[i], f, indent + 2);
1927 }
1928
1929 DEBUG_FUNCTION void
1930 decision_tree::print (FILE *f)
1931 {
1932 return decision_tree::print_node (root, f);
1933 }
1934
1935
1936 /* For GENERIC we have to take care of wrapping multiple-used
1937 expressions with side-effects in save_expr and preserve side-effects
1938 of expressions with omit_one_operand. Analyze captures in
1939 match, result and with expressions and perform early-outs
1940 on the outermost match expression operands for cases we cannot
1941 handle. */
1942
1943 struct capture_info
1944 {
1945 capture_info (simplify *s, operand *, bool);
1946 void walk_match (operand *o, unsigned toplevel_arg, bool, bool);
1947 bool walk_result (operand *o, bool, operand *);
1948 void walk_c_expr (c_expr *);
1949
1950 struct cinfo
1951 {
1952 bool expr_p;
1953 bool cse_p;
1954 bool force_no_side_effects_p;
1955 bool force_single_use;
1956 bool cond_expr_cond_p;
1957 unsigned long toplevel_msk;
1958 unsigned match_use_count;
1959 unsigned result_use_count;
1960 unsigned same_as;
1961 capture *c;
1962 };
1963
1964 auto_vec<cinfo> info;
1965 unsigned long force_no_side_effects;
1966 bool gimple;
1967 };
1968
1969 /* Analyze captures in S. */
1970
1971 capture_info::capture_info (simplify *s, operand *result, bool gimple_)
1972 {
1973 gimple = gimple_;
1974
1975 expr *e;
1976 if (s->kind == simplify::MATCH)
1977 {
1978 force_no_side_effects = -1;
1979 return;
1980 }
1981
1982 force_no_side_effects = 0;
1983 info.safe_grow_cleared (s->capture_max + 1);
1984 for (int i = 0; i <= s->capture_max; ++i)
1985 info[i].same_as = i;
1986
1987 e = as_a <expr *> (s->match);
1988 for (unsigned i = 0; i < e->ops.length (); ++i)
1989 walk_match (e->ops[i], i,
1990 (i != 0 && *e->operation == COND_EXPR)
1991 || *e->operation == TRUTH_ANDIF_EXPR
1992 || *e->operation == TRUTH_ORIF_EXPR,
1993 i == 0
1994 && (*e->operation == COND_EXPR
1995 || *e->operation == VEC_COND_EXPR));
1996
1997 walk_result (s->result, false, result);
1998 }
1999
2000 /* Analyze captures in the match expression piece O. */
2001
2002 void
2003 capture_info::walk_match (operand *o, unsigned toplevel_arg,
2004 bool conditional_p, bool cond_expr_cond_p)
2005 {
2006 if (capture *c = dyn_cast <capture *> (o))
2007 {
2008 unsigned where = c->where;
2009 info[where].match_use_count++;
2010 info[where].toplevel_msk |= 1 << toplevel_arg;
2011 info[where].force_no_side_effects_p |= conditional_p;
2012 info[where].cond_expr_cond_p |= cond_expr_cond_p;
2013 if (!info[where].c)
2014 info[where].c = c;
2015 if (!c->what)
2016 return;
2017 /* Recurse to exprs and captures. */
2018 if (is_a <capture *> (c->what)
2019 || is_a <expr *> (c->what))
2020 walk_match (c->what, toplevel_arg, conditional_p, false);
2021 /* We need to look past multiple captures to find a captured
2022 expression as with conditional converts two captures
2023 can be collapsed onto the same expression. Also collect
2024 what captures capture the same thing. */
2025 while (c->what && is_a <capture *> (c->what))
2026 {
2027 c = as_a <capture *> (c->what);
2028 if (info[c->where].same_as != c->where
2029 && info[c->where].same_as != info[where].same_as)
2030 fatal_at (c->location, "cannot handle this collapsed capture");
2031 info[c->where].same_as = info[where].same_as;
2032 }
2033 /* Mark expr (non-leaf) captures and forced single-use exprs. */
2034 expr *e;
2035 if (c->what
2036 && (e = dyn_cast <expr *> (c->what)))
2037 {
2038 info[where].expr_p = true;
2039 info[where].force_single_use |= e->force_single_use;
2040 }
2041 }
2042 else if (expr *e = dyn_cast <expr *> (o))
2043 {
2044 for (unsigned i = 0; i < e->ops.length (); ++i)
2045 {
2046 bool cond_p = conditional_p;
2047 bool cond_expr_cond_p = false;
2048 if (i != 0 && *e->operation == COND_EXPR)
2049 cond_p = true;
2050 else if (*e->operation == TRUTH_ANDIF_EXPR
2051 || *e->operation == TRUTH_ORIF_EXPR)
2052 cond_p = true;
2053 if (i == 0
2054 && (*e->operation == COND_EXPR
2055 || *e->operation == VEC_COND_EXPR))
2056 cond_expr_cond_p = true;
2057 walk_match (e->ops[i], toplevel_arg, cond_p, cond_expr_cond_p);
2058 }
2059 }
2060 else if (is_a <predicate *> (o))
2061 {
2062 /* Mark non-captured leafs toplevel arg for checking. */
2063 force_no_side_effects |= 1 << toplevel_arg;
2064 if (verbose >= 1
2065 && !gimple)
2066 warning_at (o->location,
2067 "forcing no side-effects on possibly lost leaf");
2068 }
2069 else
2070 gcc_unreachable ();
2071 }
2072
2073 /* Analyze captures in the result expression piece O. Return true
2074 if RESULT was visited in one of the children. Only visit
2075 non-if/with children if they are rooted on RESULT. */
2076
2077 bool
2078 capture_info::walk_result (operand *o, bool conditional_p, operand *result)
2079 {
2080 if (capture *c = dyn_cast <capture *> (o))
2081 {
2082 unsigned where = info[c->where].same_as;
2083 info[where].result_use_count++;
2084 /* If we substitute an expression capture we don't know
2085 which captures this will end up using (well, we don't
2086 compute that). Force the uses to be side-effect free
2087 which means forcing the toplevels that reach the
2088 expression side-effect free. */
2089 if (info[where].expr_p)
2090 force_no_side_effects |= info[where].toplevel_msk;
2091 /* Mark CSE capture uses as forced to have no side-effects. */
2092 if (c->what
2093 && is_a <expr *> (c->what))
2094 {
2095 info[where].cse_p = true;
2096 walk_result (c->what, true, result);
2097 }
2098 }
2099 else if (expr *e = dyn_cast <expr *> (o))
2100 {
2101 id_base *opr = e->operation;
2102 if (user_id *uid = dyn_cast <user_id *> (opr))
2103 opr = uid->substitutes[0];
2104 for (unsigned i = 0; i < e->ops.length (); ++i)
2105 {
2106 bool cond_p = conditional_p;
2107 if (i != 0 && *e->operation == COND_EXPR)
2108 cond_p = true;
2109 else if (*e->operation == TRUTH_ANDIF_EXPR
2110 || *e->operation == TRUTH_ORIF_EXPR)
2111 cond_p = true;
2112 walk_result (e->ops[i], cond_p, result);
2113 }
2114 }
2115 else if (if_expr *e = dyn_cast <if_expr *> (o))
2116 {
2117 /* 'if' conditions should be all fine. */
2118 if (e->trueexpr == result)
2119 {
2120 walk_result (e->trueexpr, false, result);
2121 return true;
2122 }
2123 if (e->falseexpr == result)
2124 {
2125 walk_result (e->falseexpr, false, result);
2126 return true;
2127 }
2128 bool res = false;
2129 if (is_a <if_expr *> (e->trueexpr)
2130 || is_a <with_expr *> (e->trueexpr))
2131 res |= walk_result (e->trueexpr, false, result);
2132 if (e->falseexpr
2133 && (is_a <if_expr *> (e->falseexpr)
2134 || is_a <with_expr *> (e->falseexpr)))
2135 res |= walk_result (e->falseexpr, false, result);
2136 return res;
2137 }
2138 else if (with_expr *e = dyn_cast <with_expr *> (o))
2139 {
2140 bool res = (e->subexpr == result);
2141 if (res
2142 || is_a <if_expr *> (e->subexpr)
2143 || is_a <with_expr *> (e->subexpr))
2144 res |= walk_result (e->subexpr, false, result);
2145 if (res)
2146 walk_c_expr (e->with);
2147 return res;
2148 }
2149 else if (c_expr *e = dyn_cast <c_expr *> (o))
2150 walk_c_expr (e);
2151 else
2152 gcc_unreachable ();
2153
2154 return false;
2155 }
2156
2157 /* Look for captures in the C expr E. */
2158
2159 void
2160 capture_info::walk_c_expr (c_expr *e)
2161 {
2162 /* Give up for C exprs mentioning captures not inside TREE_TYPE,
2163 TREE_REAL_CST, TREE_CODE or a predicate where they cannot
2164 really escape through. */
2165 unsigned p_depth = 0;
2166 for (unsigned i = 0; i < e->code.length (); ++i)
2167 {
2168 const cpp_token *t = &e->code[i];
2169 const cpp_token *n = i < e->code.length () - 1 ? &e->code[i+1] : NULL;
2170 id_base *id;
2171 if (t->type == CPP_NAME
2172 && (strcmp ((const char *)CPP_HASHNODE
2173 (t->val.node.node)->ident.str, "TREE_TYPE") == 0
2174 || strcmp ((const char *)CPP_HASHNODE
2175 (t->val.node.node)->ident.str, "TREE_CODE") == 0
2176 || strcmp ((const char *)CPP_HASHNODE
2177 (t->val.node.node)->ident.str, "TREE_REAL_CST") == 0
2178 || ((id = get_operator ((const char *)CPP_HASHNODE
2179 (t->val.node.node)->ident.str))
2180 && is_a <predicate_id *> (id)))
2181 && n->type == CPP_OPEN_PAREN)
2182 p_depth++;
2183 else if (t->type == CPP_CLOSE_PAREN
2184 && p_depth > 0)
2185 p_depth--;
2186 else if (p_depth == 0
2187 && t->type == CPP_ATSIGN
2188 && (n->type == CPP_NUMBER
2189 || n->type == CPP_NAME)
2190 && !(n->flags & PREV_WHITE))
2191 {
2192 const char *id;
2193 if (n->type == CPP_NUMBER)
2194 id = (const char *)n->val.str.text;
2195 else
2196 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
2197 unsigned where = *e->capture_ids->get(id);
2198 info[info[where].same_as].force_no_side_effects_p = true;
2199 if (verbose >= 1
2200 && !gimple)
2201 warning_at (t, "capture escapes");
2202 }
2203 }
2204 }
2205
2206
2207 /* Code generation off the decision tree and the refered AST nodes. */
2208
2209 bool
2210 is_conversion (id_base *op)
2211 {
2212 return (*op == CONVERT_EXPR
2213 || *op == NOP_EXPR
2214 || *op == FLOAT_EXPR
2215 || *op == FIX_TRUNC_EXPR
2216 || *op == VIEW_CONVERT_EXPR);
2217 }
2218
2219 /* Get the type to be used for generating operand POS of OP from the
2220 various sources. */
2221
2222 static const char *
2223 get_operand_type (id_base *op, unsigned pos,
2224 const char *in_type,
2225 const char *expr_type,
2226 const char *other_oprnd_type)
2227 {
2228 /* Generally operands whose type does not match the type of the
2229 expression generated need to know their types but match and
2230 thus can fall back to 'other_oprnd_type'. */
2231 if (is_conversion (op))
2232 return other_oprnd_type;
2233 else if (*op == REALPART_EXPR
2234 || *op == IMAGPART_EXPR)
2235 return other_oprnd_type;
2236 else if (is_a <operator_id *> (op)
2237 && strcmp (as_a <operator_id *> (op)->tcc, "tcc_comparison") == 0)
2238 return other_oprnd_type;
2239 else if (*op == COND_EXPR
2240 && pos == 0)
2241 return "boolean_type_node";
2242 else
2243 {
2244 /* Otherwise all types should match - choose one in order of
2245 preference. */
2246 if (expr_type)
2247 return expr_type;
2248 else if (in_type)
2249 return in_type;
2250 else
2251 return other_oprnd_type;
2252 }
2253 }
2254
2255 /* Generate transform code for an expression. */
2256
2257 void
2258 expr::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
2259 int depth, const char *in_type, capture_info *cinfo,
2260 dt_operand **indexes, int)
2261 {
2262 id_base *opr = operation;
2263 /* When we delay operator substituting during lowering of fors we
2264 make sure that for code-gen purposes the effects of each substitute
2265 are the same. Thus just look at that. */
2266 if (user_id *uid = dyn_cast <user_id *> (opr))
2267 opr = uid->substitutes[0];
2268
2269 bool conversion_p = is_conversion (opr);
2270 const char *type = expr_type;
2271 char optype[64];
2272 if (type)
2273 /* If there was a type specification in the pattern use it. */
2274 ;
2275 else if (conversion_p)
2276 /* For conversions we need to build the expression using the
2277 outer type passed in. */
2278 type = in_type;
2279 else if (*opr == REALPART_EXPR
2280 || *opr == IMAGPART_EXPR)
2281 {
2282 /* __real and __imag use the component type of its operand. */
2283 sprintf (optype, "TREE_TYPE (TREE_TYPE (ops%d[0]))", depth);
2284 type = optype;
2285 }
2286 else if (is_a <operator_id *> (opr)
2287 && !strcmp (as_a <operator_id *> (opr)->tcc, "tcc_comparison"))
2288 {
2289 /* comparisons use boolean_type_node (or what gets in), but
2290 their operands need to figure out the types themselves. */
2291 if (in_type)
2292 type = in_type;
2293 else
2294 {
2295 sprintf (optype, "boolean_type_node");
2296 type = optype;
2297 }
2298 in_type = NULL;
2299 }
2300 else if (*opr == COND_EXPR
2301 || *opr == VEC_COND_EXPR)
2302 {
2303 /* Conditions are of the same type as their first alternative. */
2304 sprintf (optype, "TREE_TYPE (ops%d[1])", depth);
2305 type = optype;
2306 }
2307 else
2308 {
2309 /* Other operations are of the same type as their first operand. */
2310 sprintf (optype, "TREE_TYPE (ops%d[0])", depth);
2311 type = optype;
2312 }
2313 if (!type)
2314 fatal_at (location, "cannot determine type of operand");
2315
2316 fprintf_indent (f, indent, "{\n");
2317 indent += 2;
2318 fprintf_indent (f, indent, "tree ops%d[%u], res;\n", depth, ops.length ());
2319 char op0type[64];
2320 snprintf (op0type, 64, "TREE_TYPE (ops%d[0])", depth);
2321 for (unsigned i = 0; i < ops.length (); ++i)
2322 {
2323 char dest[32];
2324 snprintf (dest, 32, "ops%d[%u]", depth, i);
2325 const char *optype
2326 = get_operand_type (opr, i, in_type, expr_type,
2327 i == 0 ? NULL : op0type);
2328 ops[i]->gen_transform (f, indent, dest, gimple, depth + 1, optype,
2329 cinfo, indexes,
2330 (*opr == COND_EXPR
2331 || *opr == VEC_COND_EXPR) && i == 0 ? 1 : 2);
2332 }
2333
2334 const char *opr_name;
2335 if (*operation == CONVERT_EXPR)
2336 opr_name = "NOP_EXPR";
2337 else
2338 opr_name = operation->id;
2339
2340 if (gimple)
2341 {
2342 if (*opr == CONVERT_EXPR)
2343 {
2344 fprintf_indent (f, indent,
2345 "if (%s != TREE_TYPE (ops%d[0])\n",
2346 type, depth);
2347 fprintf_indent (f, indent,
2348 " && !useless_type_conversion_p (%s, TREE_TYPE (ops%d[0])))\n",
2349 type, depth);
2350 fprintf_indent (f, indent + 2, "{\n");
2351 indent += 4;
2352 }
2353 /* ??? Building a stmt can fail for various reasons here, seq being
2354 NULL or the stmt referencing SSA names occuring in abnormal PHIs.
2355 So if we fail here we should continue matching other patterns. */
2356 fprintf_indent (f, indent, "code_helper tem_code = %s;\n", opr_name);
2357 fprintf_indent (f, indent, "tree tem_ops[3] = { ");
2358 for (unsigned i = 0; i < ops.length (); ++i)
2359 fprintf (f, "ops%d[%u]%s", depth, i,
2360 i == ops.length () - 1 ? " };\n" : ", ");
2361 fprintf_indent (f, indent,
2362 "gimple_resimplify%d (lseq, &tem_code, %s, tem_ops, valueize);\n",
2363 ops.length (), type);
2364 fprintf_indent (f, indent,
2365 "res = maybe_push_res_to_seq (tem_code, %s, tem_ops, lseq);\n",
2366 type);
2367 fprintf_indent (f, indent,
2368 "if (!res) return false;\n");
2369 if (*opr == CONVERT_EXPR)
2370 {
2371 indent -= 4;
2372 fprintf_indent (f, indent, " }\n");
2373 fprintf_indent (f, indent, "else\n");
2374 fprintf_indent (f, indent, " res = ops%d[0];\n", depth);
2375 }
2376 }
2377 else
2378 {
2379 if (*opr == CONVERT_EXPR)
2380 {
2381 fprintf_indent (f, indent, "if (TREE_TYPE (ops%d[0]) != %s)\n",
2382 depth, type);
2383 indent += 2;
2384 }
2385 if (opr->kind == id_base::CODE)
2386 fprintf_indent (f, indent, "res = fold_build%d_loc (loc, %s, %s",
2387 ops.length(), opr_name, type);
2388 else
2389 {
2390 fprintf_indent (f, indent, "{\n");
2391 fprintf_indent (f, indent, " res = maybe_build_call_expr_loc (loc, "
2392 "%s, %s, %d", opr_name, type, ops.length());
2393 }
2394 for (unsigned i = 0; i < ops.length (); ++i)
2395 fprintf (f, ", ops%d[%u]", depth, i);
2396 fprintf (f, ");\n");
2397 if (opr->kind != id_base::CODE)
2398 {
2399 fprintf_indent (f, indent, " if (!res)\n");
2400 fprintf_indent (f, indent, " return NULL_TREE;\n");
2401 fprintf_indent (f, indent, "}\n");
2402 }
2403 if (*opr == CONVERT_EXPR)
2404 {
2405 indent -= 2;
2406 fprintf_indent (f, indent, "else\n");
2407 fprintf_indent (f, indent, " res = ops%d[0];\n", depth);
2408 }
2409 }
2410 fprintf_indent (f, indent, "%s = res;\n", dest);
2411 indent -= 2;
2412 fprintf_indent (f, indent, "}\n");
2413 }
2414
2415 /* Generate code for a c_expr which is either the expression inside
2416 an if statement or a sequence of statements which computes a
2417 result to be stored to DEST. */
2418
2419 void
2420 c_expr::gen_transform (FILE *f, int indent, const char *dest,
2421 bool, int, const char *, capture_info *,
2422 dt_operand **, int)
2423 {
2424 if (dest && nr_stmts == 1)
2425 fprintf_indent (f, indent, "%s = ", dest);
2426
2427 unsigned stmt_nr = 1;
2428 for (unsigned i = 0; i < code.length (); ++i)
2429 {
2430 const cpp_token *token = &code[i];
2431
2432 /* Replace captures for code-gen. */
2433 if (token->type == CPP_ATSIGN)
2434 {
2435 const cpp_token *n = &code[i+1];
2436 if ((n->type == CPP_NUMBER
2437 || n->type == CPP_NAME)
2438 && !(n->flags & PREV_WHITE))
2439 {
2440 if (token->flags & PREV_WHITE)
2441 fputc (' ', f);
2442 const char *id;
2443 if (n->type == CPP_NUMBER)
2444 id = (const char *)n->val.str.text;
2445 else
2446 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
2447 unsigned *cid = capture_ids->get (id);
2448 if (!cid)
2449 fatal_at (token, "unknown capture id");
2450 fprintf (f, "captures[%u]", *cid);
2451 ++i;
2452 continue;
2453 }
2454 }
2455
2456 if (token->flags & PREV_WHITE)
2457 fputc (' ', f);
2458
2459 if (token->type == CPP_NAME)
2460 {
2461 const char *id = (const char *) NODE_NAME (token->val.node.node);
2462 unsigned j;
2463 for (j = 0; j < ids.length (); ++j)
2464 {
2465 if (strcmp (id, ids[j].id) == 0)
2466 {
2467 fprintf (f, "%s", ids[j].oper);
2468 break;
2469 }
2470 }
2471 if (j < ids.length ())
2472 continue;
2473 }
2474
2475 /* Output the token as string. */
2476 char *tk = (char *)cpp_token_as_text (r, token);
2477 fputs (tk, f);
2478
2479 if (token->type == CPP_SEMICOLON)
2480 {
2481 stmt_nr++;
2482 fputc ('\n', f);
2483 if (dest && stmt_nr == nr_stmts)
2484 fprintf_indent (f, indent, "%s = ", dest);
2485 }
2486 }
2487 }
2488
2489 /* Generate transform code for a capture. */
2490
2491 void
2492 capture::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
2493 int depth, const char *in_type, capture_info *cinfo,
2494 dt_operand **indexes, int cond_handling)
2495 {
2496 if (what && is_a<expr *> (what))
2497 {
2498 if (indexes[where] == 0)
2499 {
2500 char buf[20];
2501 sprintf (buf, "captures[%u]", where);
2502 what->gen_transform (f, indent, buf, gimple, depth, in_type,
2503 cinfo, NULL);
2504 }
2505 }
2506
2507 fprintf_indent (f, indent, "%s = captures[%u];\n", dest, where);
2508
2509 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
2510 with substituting a capture of that. */
2511 if (gimple
2512 && cond_handling != 0
2513 && cinfo->info[where].cond_expr_cond_p)
2514 {
2515 /* If substituting into a cond_expr condition, unshare. */
2516 if (cond_handling == 1)
2517 fprintf_indent (f, indent, "%s = unshare_expr (%s);\n", dest, dest);
2518 /* If substituting elsewhere we might need to decompose it. */
2519 else if (cond_handling == 2)
2520 {
2521 /* ??? Returning false here will also not allow any other patterns
2522 to match unless this generator was split out. */
2523 fprintf_indent (f, indent, "if (COMPARISON_CLASS_P (%s))\n", dest);
2524 fprintf_indent (f, indent, " {\n");
2525 fprintf_indent (f, indent, " if (!seq) return false;\n");
2526 fprintf_indent (f, indent, " %s = gimple_build (seq,"
2527 " TREE_CODE (%s),"
2528 " TREE_TYPE (%s), TREE_OPERAND (%s, 0),"
2529 " TREE_OPERAND (%s, 1));\n",
2530 dest, dest, dest, dest, dest);
2531 fprintf_indent (f, indent, " }\n");
2532 }
2533 }
2534 }
2535
2536 /* Return the name of the operand representing the decision tree node.
2537 Use NAME as space to generate it. */
2538
2539 char *
2540 dt_operand::get_name (char *name)
2541 {
2542 if (!parent)
2543 sprintf (name, "t");
2544 else if (parent->level == 1)
2545 sprintf (name, "op%u", pos);
2546 else if (parent->type == dt_node::DT_MATCH)
2547 return parent->get_name (name);
2548 else
2549 sprintf (name, "o%u%u", parent->level, pos);
2550 return name;
2551 }
2552
2553 /* Fill NAME with the operand name at position POS. */
2554
2555 void
2556 dt_operand::gen_opname (char *name, unsigned pos)
2557 {
2558 if (!parent)
2559 sprintf (name, "op%u", pos);
2560 else
2561 sprintf (name, "o%u%u", level, pos);
2562 }
2563
2564 /* Generate matching code for the decision tree operand which is
2565 a predicate. */
2566
2567 unsigned
2568 dt_operand::gen_predicate (FILE *f, int indent, const char *opname, bool gimple)
2569 {
2570 predicate *p = as_a <predicate *> (op);
2571
2572 if (p->p->matchers.exists ())
2573 {
2574 /* If this is a predicate generated from a pattern mangle its
2575 name and pass on the valueize hook. */
2576 if (gimple)
2577 fprintf_indent (f, indent, "if (gimple_%s (%s, valueize))\n",
2578 p->p->id, opname);
2579 else
2580 fprintf_indent (f, indent, "if (tree_%s (%s))\n", p->p->id, opname);
2581 }
2582 else
2583 fprintf_indent (f, indent, "if (%s (%s))\n", p->p->id, opname);
2584 fprintf_indent (f, indent + 2, "{\n");
2585 return 1;
2586 }
2587
2588 /* Generate matching code for the decision tree operand which is
2589 a capture-match. */
2590
2591 unsigned
2592 dt_operand::gen_match_op (FILE *f, int indent, const char *opname)
2593 {
2594 char match_opname[20];
2595 match_dop->get_name (match_opname);
2596 fprintf_indent (f, indent, "if (%s == %s || operand_equal_p (%s, %s, 0))\n",
2597 opname, match_opname, opname, match_opname);
2598 fprintf_indent (f, indent + 2, "{\n");
2599 return 1;
2600 }
2601
2602 /* Generate GIMPLE matching code for the decision tree operand. */
2603
2604 unsigned
2605 dt_operand::gen_gimple_expr (FILE *f, int indent)
2606 {
2607 expr *e = static_cast<expr *> (op);
2608 id_base *id = e->operation;
2609 unsigned n_ops = e->ops.length ();
2610
2611 for (unsigned i = 0; i < n_ops; ++i)
2612 {
2613 char child_opname[20];
2614 gen_opname (child_opname, i);
2615
2616 if (id->kind == id_base::CODE)
2617 {
2618 if (e->is_generic
2619 || *id == REALPART_EXPR || *id == IMAGPART_EXPR
2620 || *id == BIT_FIELD_REF || *id == VIEW_CONVERT_EXPR)
2621 {
2622 /* ??? If this is a memory operation we can't (and should not)
2623 match this. The only sensible operand types are
2624 SSA names and invariants. */
2625 fprintf_indent (f, indent,
2626 "tree %s = TREE_OPERAND (gimple_assign_rhs1 (def), %i);\n",
2627 child_opname, i);
2628 fprintf_indent (f, indent,
2629 "if ((TREE_CODE (%s) == SSA_NAME\n",
2630 child_opname);
2631 fprintf_indent (f, indent,
2632 " || is_gimple_min_invariant (%s))\n",
2633 child_opname);
2634 fprintf_indent (f, indent,
2635 " && (%s = do_valueize (valueize, %s)))\n",
2636 child_opname, child_opname);
2637 fprintf_indent (f, indent,
2638 " {\n");
2639 indent += 4;
2640 continue;
2641 }
2642 else
2643 fprintf_indent (f, indent,
2644 "tree %s = gimple_assign_rhs%u (def);\n",
2645 child_opname, i + 1);
2646 }
2647 else
2648 fprintf_indent (f, indent,
2649 "tree %s = gimple_call_arg (def, %u);\n",
2650 child_opname, i);
2651 fprintf_indent (f, indent,
2652 "if ((%s = do_valueize (valueize, %s)))\n",
2653 child_opname, child_opname);
2654 fprintf_indent (f, indent, " {\n");
2655 indent += 4;
2656 }
2657 /* While the toplevel operands are canonicalized by the caller
2658 after valueizing operands of sub-expressions we have to
2659 re-canonicalize operand order. */
2660 if (operator_id *code = dyn_cast <operator_id *> (id))
2661 {
2662 /* ??? We can't canonicalize tcc_comparison operands here
2663 because that requires changing the comparison code which
2664 we already matched... */
2665 if (commutative_tree_code (code->code)
2666 || commutative_ternary_tree_code (code->code))
2667 {
2668 char child_opname0[20], child_opname1[20];
2669 gen_opname (child_opname0, 0);
2670 gen_opname (child_opname1, 1);
2671 fprintf_indent (f, indent,
2672 "if (tree_swap_operands_p (%s, %s, false))\n",
2673 child_opname0, child_opname1);
2674 fprintf_indent (f, indent,
2675 " std::swap (%s, %s);\n",
2676 child_opname0, child_opname1);
2677 }
2678 }
2679
2680 return n_ops;
2681 }
2682
2683 /* Generate GENERIC matching code for the decision tree operand. */
2684
2685 unsigned
2686 dt_operand::gen_generic_expr (FILE *f, int indent, const char *opname)
2687 {
2688 expr *e = static_cast<expr *> (op);
2689 unsigned n_ops = e->ops.length ();
2690
2691 for (unsigned i = 0; i < n_ops; ++i)
2692 {
2693 char child_opname[20];
2694 gen_opname (child_opname, i);
2695
2696 if (e->operation->kind == id_base::CODE)
2697 fprintf_indent (f, indent, "tree %s = TREE_OPERAND (%s, %u);\n",
2698 child_opname, opname, i);
2699 else
2700 fprintf_indent (f, indent, "tree %s = CALL_EXPR_ARG (%s, %u);\n",
2701 child_opname, opname, i);
2702 }
2703
2704 return 0;
2705 }
2706
2707 /* Generate matching code for the children of the decision tree node. */
2708
2709 void
2710 dt_node::gen_kids (FILE *f, int indent, bool gimple)
2711 {
2712 auto_vec<dt_operand *> gimple_exprs;
2713 auto_vec<dt_operand *> generic_exprs;
2714 auto_vec<dt_operand *> fns;
2715 auto_vec<dt_operand *> generic_fns;
2716 auto_vec<dt_operand *> preds;
2717 auto_vec<dt_node *> others;
2718
2719 for (unsigned i = 0; i < kids.length (); ++i)
2720 {
2721 if (kids[i]->type == dt_node::DT_OPERAND)
2722 {
2723 dt_operand *op = as_a<dt_operand *> (kids[i]);
2724 if (expr *e = dyn_cast <expr *> (op->op))
2725 {
2726 if (e->ops.length () == 0
2727 && (!gimple || !(*e->operation == CONSTRUCTOR)))
2728 generic_exprs.safe_push (op);
2729 else if (e->operation->kind == id_base::FN)
2730 {
2731 if (gimple)
2732 fns.safe_push (op);
2733 else
2734 generic_fns.safe_push (op);
2735 }
2736 else if (e->operation->kind == id_base::PREDICATE)
2737 preds.safe_push (op);
2738 else
2739 {
2740 if (gimple && !e->is_generic)
2741 gimple_exprs.safe_push (op);
2742 else
2743 generic_exprs.safe_push (op);
2744 }
2745 }
2746 else if (op->op->type == operand::OP_PREDICATE)
2747 others.safe_push (kids[i]);
2748 else
2749 gcc_unreachable ();
2750 }
2751 else if (kids[i]->type == dt_node::DT_SIMPLIFY)
2752 others.safe_push (kids[i]);
2753 else if (kids[i]->type == dt_node::DT_MATCH
2754 || kids[i]->type == dt_node::DT_TRUE)
2755 {
2756 /* A DT_TRUE operand serves as a barrier - generate code now
2757 for what we have collected sofar.
2758 Like DT_TRUE, DT_MATCH serves as a barrier as it can cause
2759 dependent matches to get out-of-order. Generate code now
2760 for what we have collected sofar. */
2761 gen_kids_1 (f, indent, gimple, gimple_exprs, generic_exprs,
2762 fns, generic_fns, preds, others);
2763 /* And output the true operand itself. */
2764 kids[i]->gen (f, indent, gimple);
2765 gimple_exprs.truncate (0);
2766 generic_exprs.truncate (0);
2767 fns.truncate (0);
2768 generic_fns.truncate (0);
2769 preds.truncate (0);
2770 others.truncate (0);
2771 }
2772 else
2773 gcc_unreachable ();
2774 }
2775
2776 /* Generate code for the remains. */
2777 gen_kids_1 (f, indent, gimple, gimple_exprs, generic_exprs,
2778 fns, generic_fns, preds, others);
2779 }
2780
2781 /* Generate matching code for the children of the decision tree node. */
2782
2783 void
2784 dt_node::gen_kids_1 (FILE *f, int indent, bool gimple,
2785 vec<dt_operand *> gimple_exprs,
2786 vec<dt_operand *> generic_exprs,
2787 vec<dt_operand *> fns,
2788 vec<dt_operand *> generic_fns,
2789 vec<dt_operand *> preds,
2790 vec<dt_node *> others)
2791 {
2792 char buf[128];
2793 char *kid_opname = buf;
2794
2795 unsigned exprs_len = gimple_exprs.length ();
2796 unsigned gexprs_len = generic_exprs.length ();
2797 unsigned fns_len = fns.length ();
2798 unsigned gfns_len = generic_fns.length ();
2799
2800 if (exprs_len || fns_len || gexprs_len || gfns_len)
2801 {
2802 if (exprs_len)
2803 gimple_exprs[0]->get_name (kid_opname);
2804 else if (fns_len)
2805 fns[0]->get_name (kid_opname);
2806 else if (gfns_len)
2807 generic_fns[0]->get_name (kid_opname);
2808 else
2809 generic_exprs[0]->get_name (kid_opname);
2810
2811 fprintf_indent (f, indent, "switch (TREE_CODE (%s))\n", kid_opname);
2812 fprintf_indent (f, indent, " {\n");
2813 indent += 2;
2814 }
2815
2816 if (exprs_len || fns_len)
2817 {
2818 fprintf_indent (f, indent,
2819 "case SSA_NAME:\n");
2820 fprintf_indent (f, indent,
2821 " if (do_valueize (valueize, %s) != NULL_TREE)\n",
2822 kid_opname);
2823 fprintf_indent (f, indent,
2824 " {\n");
2825 fprintf_indent (f, indent,
2826 " gimple *def_stmt = SSA_NAME_DEF_STMT (%s);\n",
2827 kid_opname);
2828
2829 indent += 6;
2830 if (exprs_len)
2831 {
2832 fprintf_indent (f, indent,
2833 "if (gassign *def = dyn_cast <gassign *> (def_stmt))\n");
2834 fprintf_indent (f, indent,
2835 " switch (gimple_assign_rhs_code (def))\n");
2836 indent += 4;
2837 fprintf_indent (f, indent, "{\n");
2838 for (unsigned i = 0; i < exprs_len; ++i)
2839 {
2840 expr *e = as_a <expr *> (gimple_exprs[i]->op);
2841 id_base *op = e->operation;
2842 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2843 fprintf_indent (f, indent, "CASE_CONVERT:\n");
2844 else
2845 fprintf_indent (f, indent, "case %s:\n", op->id);
2846 fprintf_indent (f, indent, " {\n");
2847 gimple_exprs[i]->gen (f, indent + 4, true);
2848 fprintf_indent (f, indent, " break;\n");
2849 fprintf_indent (f, indent, " }\n");
2850 }
2851 fprintf_indent (f, indent, "default:;\n");
2852 fprintf_indent (f, indent, "}\n");
2853 indent -= 4;
2854 }
2855
2856 if (fns_len)
2857 {
2858 fprintf_indent (f, indent,
2859 "%sif (gcall *def = dyn_cast <gcall *>"
2860 " (def_stmt))\n",
2861 exprs_len ? "else " : "");
2862 fprintf_indent (f, indent,
2863 " switch (gimple_call_combined_fn (def))\n");
2864
2865 indent += 4;
2866 fprintf_indent (f, indent, "{\n");
2867 for (unsigned i = 0; i < fns_len; ++i)
2868 {
2869 expr *e = as_a <expr *>(fns[i]->op);
2870 fprintf_indent (f, indent, "case %s:\n", e->operation->id);
2871 fprintf_indent (f, indent, " {\n");
2872 fns[i]->gen (f, indent + 4, true);
2873 fprintf_indent (f, indent, " break;\n");
2874 fprintf_indent (f, indent, " }\n");
2875 }
2876
2877 fprintf_indent (f, indent, "default:;\n");
2878 fprintf_indent (f, indent, "}\n");
2879 indent -= 4;
2880 }
2881
2882 indent -= 6;
2883 fprintf_indent (f, indent, " }\n");
2884 fprintf_indent (f, indent, " break;\n");
2885 }
2886
2887 for (unsigned i = 0; i < generic_exprs.length (); ++i)
2888 {
2889 expr *e = as_a <expr *>(generic_exprs[i]->op);
2890 id_base *op = e->operation;
2891 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2892 fprintf_indent (f, indent, "CASE_CONVERT:\n");
2893 else
2894 fprintf_indent (f, indent, "case %s:\n", op->id);
2895 fprintf_indent (f, indent, " {\n");
2896 generic_exprs[i]->gen (f, indent + 4, gimple);
2897 fprintf_indent (f, indent, " break;\n");
2898 fprintf_indent (f, indent, " }\n");
2899 }
2900
2901 if (gfns_len)
2902 {
2903 fprintf_indent (f, indent,
2904 "case CALL_EXPR:\n");
2905 fprintf_indent (f, indent,
2906 " switch (get_call_combined_fn (%s))\n",
2907 kid_opname);
2908 fprintf_indent (f, indent,
2909 " {\n");
2910 indent += 4;
2911
2912 for (unsigned j = 0; j < generic_fns.length (); ++j)
2913 {
2914 expr *e = as_a <expr *>(generic_fns[j]->op);
2915 gcc_assert (e->operation->kind == id_base::FN);
2916
2917 fprintf_indent (f, indent, "case %s:\n", e->operation->id);
2918 fprintf_indent (f, indent, " {\n");
2919 generic_fns[j]->gen (f, indent + 4, false);
2920 fprintf_indent (f, indent, " break;\n");
2921 fprintf_indent (f, indent, " }\n");
2922 }
2923 fprintf_indent (f, indent, "default:;\n");
2924
2925 indent -= 4;
2926 fprintf_indent (f, indent, " }\n");
2927 fprintf_indent (f, indent, " break;\n");
2928 }
2929
2930 /* Close switch (TREE_CODE ()). */
2931 if (exprs_len || fns_len || gexprs_len || gfns_len)
2932 {
2933 indent -= 4;
2934 fprintf_indent (f, indent, " default:;\n");
2935 fprintf_indent (f, indent, " }\n");
2936 }
2937
2938 for (unsigned i = 0; i < preds.length (); ++i)
2939 {
2940 expr *e = as_a <expr *> (preds[i]->op);
2941 predicate_id *p = as_a <predicate_id *> (e->operation);
2942 preds[i]->get_name (kid_opname);
2943 fprintf_indent (f, indent, "tree %s_pops[%d];\n", kid_opname, p->nargs);
2944 fprintf_indent (f, indent, "if (%s_%s (%s, %s_pops%s))\n",
2945 gimple ? "gimple" : "tree",
2946 p->id, kid_opname, kid_opname,
2947 gimple ? ", valueize" : "");
2948 fprintf_indent (f, indent, " {\n");
2949 for (int j = 0; j < p->nargs; ++j)
2950 {
2951 char child_opname[20];
2952 preds[i]->gen_opname (child_opname, j);
2953 fprintf_indent (f, indent + 4, "tree %s = %s_pops[%d];\n",
2954 child_opname, kid_opname, j);
2955 }
2956 preds[i]->gen_kids (f, indent + 4, gimple);
2957 fprintf (f, "}\n");
2958 }
2959
2960 for (unsigned i = 0; i < others.length (); ++i)
2961 others[i]->gen (f, indent, gimple);
2962 }
2963
2964 /* Generate matching code for the decision tree operand. */
2965
2966 void
2967 dt_operand::gen (FILE *f, int indent, bool gimple)
2968 {
2969 char opname[20];
2970 get_name (opname);
2971
2972 unsigned n_braces = 0;
2973
2974 if (type == DT_OPERAND)
2975 switch (op->type)
2976 {
2977 case operand::OP_PREDICATE:
2978 n_braces = gen_predicate (f, indent, opname, gimple);
2979 break;
2980
2981 case operand::OP_EXPR:
2982 if (gimple)
2983 n_braces = gen_gimple_expr (f, indent);
2984 else
2985 n_braces = gen_generic_expr (f, indent, opname);
2986 break;
2987
2988 default:
2989 gcc_unreachable ();
2990 }
2991 else if (type == DT_TRUE)
2992 ;
2993 else if (type == DT_MATCH)
2994 n_braces = gen_match_op (f, indent, opname);
2995 else
2996 gcc_unreachable ();
2997
2998 indent += 4 * n_braces;
2999 gen_kids (f, indent, gimple);
3000
3001 for (unsigned i = 0; i < n_braces; ++i)
3002 {
3003 indent -= 4;
3004 if (indent < 0)
3005 indent = 0;
3006 fprintf_indent (f, indent, " }\n");
3007 }
3008 }
3009
3010
3011 /* Generate code for the '(if ...)', '(with ..)' and actual transform
3012 step of a '(simplify ...)' or '(match ...)'. This handles everything
3013 that is not part of the decision tree (simplify->match).
3014 Main recursive worker. */
3015
3016 void
3017 dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result)
3018 {
3019 if (result)
3020 {
3021 if (with_expr *w = dyn_cast <with_expr *> (result))
3022 {
3023 fprintf_indent (f, indent, "{\n");
3024 indent += 4;
3025 output_line_directive (f, w->location);
3026 w->with->gen_transform (f, indent, NULL, true, 1, "type", NULL);
3027 gen_1 (f, indent, gimple, w->subexpr);
3028 indent -= 4;
3029 fprintf_indent (f, indent, "}\n");
3030 return;
3031 }
3032 else if (if_expr *ife = dyn_cast <if_expr *> (result))
3033 {
3034 output_line_directive (f, ife->location);
3035 fprintf_indent (f, indent, "if (");
3036 ife->cond->gen_transform (f, indent, NULL, true, 1, "type", NULL);
3037 fprintf (f, ")\n");
3038 fprintf_indent (f, indent + 2, "{\n");
3039 indent += 4;
3040 gen_1 (f, indent, gimple, ife->trueexpr);
3041 indent -= 4;
3042 fprintf_indent (f, indent + 2, "}\n");
3043 if (ife->falseexpr)
3044 {
3045 fprintf_indent (f, indent, "else\n");
3046 fprintf_indent (f, indent + 2, "{\n");
3047 indent += 4;
3048 gen_1 (f, indent, gimple, ife->falseexpr);
3049 indent -= 4;
3050 fprintf_indent (f, indent + 2, "}\n");
3051 }
3052 return;
3053 }
3054 }
3055
3056 /* Analyze captures and perform early-outs on the incoming arguments
3057 that cover cases we cannot handle. */
3058 capture_info cinfo (s, result, gimple);
3059 if (s->kind == simplify::SIMPLIFY)
3060 {
3061 if (!gimple)
3062 {
3063 for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
3064 if (cinfo.force_no_side_effects & (1 << i))
3065 {
3066 fprintf_indent (f, indent,
3067 "if (TREE_SIDE_EFFECTS (op%d)) return NULL_TREE;\n",
3068 i);
3069 if (verbose >= 1)
3070 warning_at (as_a <expr *> (s->match)->ops[i]->location,
3071 "forcing toplevel operand to have no "
3072 "side-effects");
3073 }
3074 for (int i = 0; i <= s->capture_max; ++i)
3075 if (cinfo.info[i].cse_p)
3076 ;
3077 else if (cinfo.info[i].force_no_side_effects_p
3078 && (cinfo.info[i].toplevel_msk
3079 & cinfo.force_no_side_effects) == 0)
3080 {
3081 fprintf_indent (f, indent,
3082 "if (TREE_SIDE_EFFECTS (captures[%d])) "
3083 "return NULL_TREE;\n", i);
3084 if (verbose >= 1)
3085 warning_at (cinfo.info[i].c->location,
3086 "forcing captured operand to have no "
3087 "side-effects");
3088 }
3089 else if ((cinfo.info[i].toplevel_msk
3090 & cinfo.force_no_side_effects) != 0)
3091 /* Mark capture as having no side-effects if we had to verify
3092 that via forced toplevel operand checks. */
3093 cinfo.info[i].force_no_side_effects_p = true;
3094 }
3095 if (gimple)
3096 {
3097 /* Force single-use restriction by only allowing simple
3098 results via setting seq to NULL. */
3099 fprintf_indent (f, indent, "gimple_seq *lseq = seq;\n");
3100 bool first_p = true;
3101 for (int i = 0; i <= s->capture_max; ++i)
3102 if (cinfo.info[i].force_single_use)
3103 {
3104 if (first_p)
3105 {
3106 fprintf_indent (f, indent, "if (lseq\n");
3107 fprintf_indent (f, indent, " && (");
3108 first_p = false;
3109 }
3110 else
3111 {
3112 fprintf (f, "\n");
3113 fprintf_indent (f, indent, " || ");
3114 }
3115 fprintf (f, "!single_use (captures[%d])", i);
3116 }
3117 if (!first_p)
3118 {
3119 fprintf (f, "))\n");
3120 fprintf_indent (f, indent, " lseq = NULL;\n");
3121 }
3122 }
3123 }
3124
3125 fprintf_indent (f, indent, "if (dump_file && (dump_flags & TDF_DETAILS)) "
3126 "fprintf (dump_file, \"Applying pattern ");
3127 output_line_directive (f,
3128 result ? result->location : s->match->location, true);
3129 fprintf (f, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
3130
3131 if (!result)
3132 {
3133 /* If there is no result then this is a predicate implementation. */
3134 fprintf_indent (f, indent, "return true;\n");
3135 }
3136 else if (gimple)
3137 {
3138 /* For GIMPLE simply drop NON_LVALUE_EXPR (which only appears
3139 in outermost position). */
3140 if (result->type == operand::OP_EXPR
3141 && *as_a <expr *> (result)->operation == NON_LVALUE_EXPR)
3142 result = as_a <expr *> (result)->ops[0];
3143 if (result->type == operand::OP_EXPR)
3144 {
3145 expr *e = as_a <expr *> (result);
3146 id_base *opr = e->operation;
3147 bool is_predicate = false;
3148 /* When we delay operator substituting during lowering of fors we
3149 make sure that for code-gen purposes the effects of each substitute
3150 are the same. Thus just look at that. */
3151 if (user_id *uid = dyn_cast <user_id *> (opr))
3152 opr = uid->substitutes[0];
3153 else if (is_a <predicate_id *> (opr))
3154 is_predicate = true;
3155 if (!is_predicate)
3156 fprintf_indent (f, indent, "*res_code = %s;\n",
3157 *e->operation == CONVERT_EXPR
3158 ? "NOP_EXPR" : e->operation->id);
3159 for (unsigned j = 0; j < e->ops.length (); ++j)
3160 {
3161 char dest[32];
3162 snprintf (dest, 32, "res_ops[%d]", j);
3163 const char *optype
3164 = get_operand_type (opr, j,
3165 "type", e->expr_type,
3166 j == 0 ? NULL : "TREE_TYPE (res_ops[0])");
3167 /* We need to expand GENERIC conditions we captured from
3168 COND_EXPRs and we need to unshare them when substituting
3169 into COND_EXPRs. */
3170 int cond_handling = 0;
3171 if (!is_predicate)
3172 cond_handling = ((*opr == COND_EXPR
3173 || *opr == VEC_COND_EXPR) && j == 0) ? 1 : 2;
3174 e->ops[j]->gen_transform (f, indent, dest, true, 1, optype,
3175 &cinfo, indexes, cond_handling);
3176 }
3177
3178 /* Re-fold the toplevel result. It's basically an embedded
3179 gimple_build w/o actually building the stmt. */
3180 if (!is_predicate)
3181 fprintf_indent (f, indent,
3182 "gimple_resimplify%d (lseq, res_code, type, "
3183 "res_ops, valueize);\n", e->ops.length ());
3184 }
3185 else if (result->type == operand::OP_CAPTURE
3186 || result->type == operand::OP_C_EXPR)
3187 {
3188 result->gen_transform (f, indent, "res_ops[0]", true, 1, "type",
3189 &cinfo, indexes);
3190 fprintf_indent (f, indent, "*res_code = TREE_CODE (res_ops[0]);\n");
3191 if (is_a <capture *> (result)
3192 && cinfo.info[as_a <capture *> (result)->where].cond_expr_cond_p)
3193 {
3194 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
3195 with substituting a capture of that. */
3196 fprintf_indent (f, indent,
3197 "if (COMPARISON_CLASS_P (res_ops[0]))\n");
3198 fprintf_indent (f, indent,
3199 " {\n");
3200 fprintf_indent (f, indent,
3201 " tree tem = res_ops[0];\n");
3202 fprintf_indent (f, indent,
3203 " res_ops[0] = TREE_OPERAND (tem, 0);\n");
3204 fprintf_indent (f, indent,
3205 " res_ops[1] = TREE_OPERAND (tem, 1);\n");
3206 fprintf_indent (f, indent,
3207 " }\n");
3208 }
3209 }
3210 else
3211 gcc_unreachable ();
3212 fprintf_indent (f, indent, "return true;\n");
3213 }
3214 else /* GENERIC */
3215 {
3216 bool is_predicate = false;
3217 if (result->type == operand::OP_EXPR)
3218 {
3219 expr *e = as_a <expr *> (result);
3220 id_base *opr = e->operation;
3221 /* When we delay operator substituting during lowering of fors we
3222 make sure that for code-gen purposes the effects of each substitute
3223 are the same. Thus just look at that. */
3224 if (user_id *uid = dyn_cast <user_id *> (opr))
3225 opr = uid->substitutes[0];
3226 else if (is_a <predicate_id *> (opr))
3227 is_predicate = true;
3228 /* Search for captures used multiple times in the result expression
3229 and wrap them in a SAVE_EXPR. Allow as many uses as in the
3230 original expression. */
3231 if (!is_predicate)
3232 for (int i = 0; i < s->capture_max + 1; ++i)
3233 {
3234 if (cinfo.info[i].same_as != (unsigned)i
3235 || cinfo.info[i].cse_p)
3236 continue;
3237 if (cinfo.info[i].result_use_count
3238 > cinfo.info[i].match_use_count)
3239 fprintf_indent (f, indent,
3240 "if (! tree_invariant_p (captures[%d])) "
3241 "return NULL_TREE;\n", i);
3242 }
3243 for (unsigned j = 0; j < e->ops.length (); ++j)
3244 {
3245 char dest[32];
3246 if (is_predicate)
3247 snprintf (dest, 32, "res_ops[%d]", j);
3248 else
3249 {
3250 fprintf_indent (f, indent, "tree res_op%d;\n", j);
3251 snprintf (dest, 32, "res_op%d", j);
3252 }
3253 const char *optype
3254 = get_operand_type (opr, j,
3255 "type", e->expr_type,
3256 j == 0
3257 ? NULL : "TREE_TYPE (res_op0)");
3258 e->ops[j]->gen_transform (f, indent, dest, false, 1, optype,
3259 &cinfo, indexes);
3260 }
3261 if (is_predicate)
3262 fprintf_indent (f, indent, "return true;\n");
3263 else
3264 {
3265 fprintf_indent (f, indent, "tree res;\n");
3266 /* Re-fold the toplevel result. Use non_lvalue to
3267 build NON_LVALUE_EXPRs so they get properly
3268 ignored when in GIMPLE form. */
3269 if (*opr == NON_LVALUE_EXPR)
3270 fprintf_indent (f, indent,
3271 "res = non_lvalue_loc (loc, res_op0);\n");
3272 else
3273 {
3274 if (is_a <operator_id *> (opr))
3275 fprintf_indent (f, indent,
3276 "res = fold_build%d_loc (loc, %s, type",
3277 e->ops.length (),
3278 *e->operation == CONVERT_EXPR
3279 ? "NOP_EXPR" : e->operation->id);
3280 else
3281 fprintf_indent (f, indent,
3282 "res = maybe_build_call_expr_loc (loc, "
3283 "%s, type, %d", e->operation->id,
3284 e->ops.length());
3285 for (unsigned j = 0; j < e->ops.length (); ++j)
3286 fprintf (f, ", res_op%d", j);
3287 fprintf (f, ");\n");
3288 if (!is_a <operator_id *> (opr))
3289 {
3290 fprintf_indent (f, indent, "if (!res)\n");
3291 fprintf_indent (f, indent, " return NULL_TREE;\n");
3292 }
3293 }
3294 }
3295 }
3296 else if (result->type == operand::OP_CAPTURE
3297 || result->type == operand::OP_C_EXPR)
3298
3299 {
3300 fprintf_indent (f, indent, "tree res;\n");
3301 result->gen_transform (f, indent, "res", false, 1, "type",
3302 &cinfo, indexes);
3303 }
3304 else
3305 gcc_unreachable ();
3306 if (!is_predicate)
3307 {
3308 /* Search for captures not used in the result expression and dependent
3309 on TREE_SIDE_EFFECTS emit omit_one_operand. */
3310 for (int i = 0; i < s->capture_max + 1; ++i)
3311 {
3312 if (cinfo.info[i].same_as != (unsigned)i)
3313 continue;
3314 if (!cinfo.info[i].force_no_side_effects_p
3315 && !cinfo.info[i].expr_p
3316 && cinfo.info[i].result_use_count == 0)
3317 {
3318 fprintf_indent (f, indent,
3319 "if (TREE_SIDE_EFFECTS (captures[%d]))\n",
3320 i);
3321 fprintf_indent (f, indent + 2,
3322 "res = build2_loc (loc, COMPOUND_EXPR, type, "
3323 "fold_ignored_result (captures[%d]), res);\n",
3324 i);
3325 }
3326 }
3327 fprintf_indent (f, indent, "return res;\n");
3328 }
3329 }
3330 }
3331
3332 /* Generate code for the '(if ...)', '(with ..)' and actual transform
3333 step of a '(simplify ...)' or '(match ...)'. This handles everything
3334 that is not part of the decision tree (simplify->match). */
3335
3336 void
3337 dt_simplify::gen (FILE *f, int indent, bool gimple)
3338 {
3339 fprintf_indent (f, indent, "{\n");
3340 indent += 2;
3341 output_line_directive (f,
3342 s->result ? s->result->location : s->match->location);
3343 if (s->capture_max >= 0)
3344 {
3345 char opname[20];
3346 fprintf_indent (f, indent, "tree captures[%u] ATTRIBUTE_UNUSED = { %s",
3347 s->capture_max + 1, indexes[0]->get_name (opname));
3348
3349 for (int i = 1; i <= s->capture_max; ++i)
3350 {
3351 if (!indexes[i])
3352 break;
3353 fprintf (f, ", %s", indexes[i]->get_name (opname));
3354 }
3355 fprintf (f, " };\n");
3356 }
3357
3358 /* If we have a split-out function for the actual transform, call it. */
3359 if (info && info->fname)
3360 {
3361 if (gimple)
3362 {
3363 fprintf_indent (f, indent, "if (%s (res_code, res_ops, seq, "
3364 "valueize, type, captures", info->fname);
3365 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3366 if (s->for_subst_vec[i].first->used)
3367 fprintf (f, ", %s", s->for_subst_vec[i].second->id);
3368 fprintf (f, "))\n");
3369 fprintf_indent (f, indent, " return true;\n");
3370 }
3371 else
3372 {
3373 fprintf_indent (f, indent, "tree res = %s (loc, type",
3374 info->fname);
3375 for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
3376 fprintf (f, ", op%d", i);
3377 fprintf (f, ", captures");
3378 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3379 {
3380 if (s->for_subst_vec[i].first->used)
3381 fprintf (f, ", %s", s->for_subst_vec[i].second->id);
3382 }
3383 fprintf (f, ");\n");
3384 fprintf_indent (f, indent, "if (res) return res;\n");
3385 }
3386 }
3387 else
3388 {
3389 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3390 {
3391 if (! s->for_subst_vec[i].first->used)
3392 continue;
3393 if (is_a <operator_id *> (s->for_subst_vec[i].second))
3394 fprintf_indent (f, indent, "enum tree_code %s = %s;\n",
3395 s->for_subst_vec[i].first->id,
3396 s->for_subst_vec[i].second->id);
3397 else if (is_a <fn_id *> (s->for_subst_vec[i].second))
3398 fprintf_indent (f, indent, "combined_fn %s = %s;\n",
3399 s->for_subst_vec[i].first->id,
3400 s->for_subst_vec[i].second->id);
3401 else
3402 gcc_unreachable ();
3403 }
3404 gen_1 (f, indent, gimple, s->result);
3405 }
3406
3407 indent -= 2;
3408 fprintf_indent (f, indent, "}\n");
3409 }
3410
3411
3412 /* Hash function for finding equivalent transforms. */
3413
3414 hashval_t
3415 sinfo_hashmap_traits::hash (const key_type &v)
3416 {
3417 /* Only bother to compare those originating from the same source pattern. */
3418 return v->s->result->location;
3419 }
3420
3421 /* Compare function for finding equivalent transforms. */
3422
3423 static bool
3424 compare_op (operand *o1, simplify *s1, operand *o2, simplify *s2)
3425 {
3426 if (o1->type != o2->type)
3427 return false;
3428
3429 switch (o1->type)
3430 {
3431 case operand::OP_IF:
3432 {
3433 if_expr *if1 = as_a <if_expr *> (o1);
3434 if_expr *if2 = as_a <if_expr *> (o2);
3435 /* ??? Properly compare c-exprs. */
3436 if (if1->cond != if2->cond)
3437 return false;
3438 if (!compare_op (if1->trueexpr, s1, if2->trueexpr, s2))
3439 return false;
3440 if (if1->falseexpr != if2->falseexpr
3441 || (if1->falseexpr
3442 && !compare_op (if1->falseexpr, s1, if2->falseexpr, s2)))
3443 return false;
3444 return true;
3445 }
3446 case operand::OP_WITH:
3447 {
3448 with_expr *with1 = as_a <with_expr *> (o1);
3449 with_expr *with2 = as_a <with_expr *> (o2);
3450 if (with1->with != with2->with)
3451 return false;
3452 return compare_op (with1->subexpr, s1, with2->subexpr, s2);
3453 }
3454 default:;
3455 }
3456
3457 /* We've hit a result. Time to compare capture-infos - this is required
3458 in addition to the conservative pointer-equivalency of the result IL. */
3459 capture_info cinfo1 (s1, o1, true);
3460 capture_info cinfo2 (s2, o2, true);
3461
3462 if (cinfo1.force_no_side_effects != cinfo2.force_no_side_effects
3463 || cinfo1.info.length () != cinfo2.info.length ())
3464 return false;
3465
3466 for (unsigned i = 0; i < cinfo1.info.length (); ++i)
3467 {
3468 if (cinfo1.info[i].expr_p != cinfo2.info[i].expr_p
3469 || cinfo1.info[i].cse_p != cinfo2.info[i].cse_p
3470 || (cinfo1.info[i].force_no_side_effects_p
3471 != cinfo2.info[i].force_no_side_effects_p)
3472 || cinfo1.info[i].force_single_use != cinfo2.info[i].force_single_use
3473 || cinfo1.info[i].cond_expr_cond_p != cinfo2.info[i].cond_expr_cond_p
3474 /* toplevel_msk is an optimization */
3475 || cinfo1.info[i].result_use_count != cinfo2.info[i].result_use_count
3476 || cinfo1.info[i].same_as != cinfo2.info[i].same_as
3477 /* the pointer back to the capture is for diagnostics only */)
3478 return false;
3479 }
3480
3481 /* ??? Deep-compare the actual result. */
3482 return o1 == o2;
3483 }
3484
3485 bool
3486 sinfo_hashmap_traits::equal_keys (const key_type &v,
3487 const key_type &candidate)
3488 {
3489 return compare_op (v->s->result, v->s, candidate->s->result, candidate->s);
3490 }
3491
3492
3493 /* Main entry to generate code for matching GIMPLE IL off the decision
3494 tree. */
3495
3496 void
3497 decision_tree::gen (FILE *f, bool gimple)
3498 {
3499 sinfo_map_t si;
3500
3501 root->analyze (si);
3502
3503 fprintf (stderr, "%s decision tree has %u leafs, maximum depth %u and "
3504 "a total number of %u nodes\n",
3505 gimple ? "GIMPLE" : "GENERIC",
3506 root->num_leafs, root->max_level, root->total_size);
3507
3508 /* First split out the transform part of equal leafs. */
3509 unsigned rcnt = 0;
3510 unsigned fcnt = 1;
3511 for (sinfo_map_t::iterator iter = si.begin ();
3512 iter != si.end (); ++iter)
3513 {
3514 sinfo *s = (*iter).second;
3515 /* Do not split out single uses. */
3516 if (s->cnt <= 1)
3517 continue;
3518
3519 rcnt += s->cnt - 1;
3520 if (verbose >= 1)
3521 {
3522 fprintf (stderr, "found %u uses of", s->cnt);
3523 output_line_directive (stderr, s->s->s->result->location);
3524 }
3525
3526 /* Generate a split out function with the leaf transform code. */
3527 s->fname = xasprintf ("%s_simplify_%u", gimple ? "gimple" : "generic",
3528 fcnt++);
3529 if (gimple)
3530 fprintf (f, "\nstatic bool\n"
3531 "%s (code_helper *res_code, tree *res_ops,\n"
3532 " gimple_seq *seq, tree (*valueize)(tree) "
3533 "ATTRIBUTE_UNUSED,\n"
3534 " tree ARG_UNUSED (type), tree *ARG_UNUSED "
3535 "(captures)\n",
3536 s->fname);
3537 else
3538 {
3539 fprintf (f, "\nstatic tree\n"
3540 "%s (location_t ARG_UNUSED (loc), tree ARG_UNUSED (type),\n",
3541 (*iter).second->fname);
3542 for (unsigned i = 0;
3543 i < as_a <expr *>(s->s->s->match)->ops.length (); ++i)
3544 fprintf (f, " tree ARG_UNUSED (op%d),", i);
3545 fprintf (f, " tree *captures\n");
3546 }
3547 for (unsigned i = 0; i < s->s->s->for_subst_vec.length (); ++i)
3548 {
3549 if (! s->s->s->for_subst_vec[i].first->used)
3550 continue;
3551 if (is_a <operator_id *> (s->s->s->for_subst_vec[i].second))
3552 fprintf (f, ", enum tree_code ARG_UNUSED (%s)",
3553 s->s->s->for_subst_vec[i].first->id);
3554 else if (is_a <fn_id *> (s->s->s->for_subst_vec[i].second))
3555 fprintf (f, ", combined_fn ARG_UNUSED (%s)",
3556 s->s->s->for_subst_vec[i].first->id);
3557 }
3558
3559 fprintf (f, ")\n{\n");
3560 s->s->gen_1 (f, 2, gimple, s->s->s->result);
3561 if (gimple)
3562 fprintf (f, " return false;\n");
3563 else
3564 fprintf (f, " return NULL_TREE;\n");
3565 fprintf (f, "}\n");
3566 }
3567 fprintf (stderr, "removed %u duplicate tails\n", rcnt);
3568
3569 for (unsigned n = 1; n <= 3; ++n)
3570 {
3571 /* First generate split-out functions. */
3572 for (unsigned i = 0; i < root->kids.length (); i++)
3573 {
3574 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
3575 expr *e = static_cast<expr *>(dop->op);
3576 if (e->ops.length () != n
3577 /* Builtin simplifications are somewhat premature on
3578 GENERIC. The following drops patterns with outermost
3579 calls. It's easy to emit overloads for function code
3580 though if necessary. */
3581 || (!gimple
3582 && e->operation->kind != id_base::CODE))
3583 continue;
3584
3585 if (gimple)
3586 fprintf (f, "\nstatic bool\n"
3587 "gimple_simplify_%s (code_helper *res_code, tree *res_ops,\n"
3588 " gimple_seq *seq, tree (*valueize)(tree) "
3589 "ATTRIBUTE_UNUSED,\n"
3590 " code_helper ARG_UNUSED (code), tree "
3591 "ARG_UNUSED (type)\n",
3592 e->operation->id);
3593 else
3594 fprintf (f, "\nstatic tree\n"
3595 "generic_simplify_%s (location_t ARG_UNUSED (loc), enum "
3596 "tree_code ARG_UNUSED (code), tree ARG_UNUSED (type)",
3597 e->operation->id);
3598 for (unsigned i = 0; i < n; ++i)
3599 fprintf (f, ", tree op%d", i);
3600 fprintf (f, ")\n");
3601 fprintf (f, "{\n");
3602 dop->gen_kids (f, 2, gimple);
3603 if (gimple)
3604 fprintf (f, " return false;\n");
3605 else
3606 fprintf (f, " return NULL_TREE;\n");
3607 fprintf (f, "}\n");
3608 }
3609
3610 /* Then generate the main entry with the outermost switch and
3611 tail-calls to the split-out functions. */
3612 if (gimple)
3613 fprintf (f, "\nstatic bool\n"
3614 "gimple_simplify (code_helper *res_code, tree *res_ops,\n"
3615 " gimple_seq *seq, tree (*valueize)(tree),\n"
3616 " code_helper code, tree type");
3617 else
3618 fprintf (f, "\ntree\n"
3619 "generic_simplify (location_t loc, enum tree_code code, "
3620 "tree type ATTRIBUTE_UNUSED");
3621 for (unsigned i = 0; i < n; ++i)
3622 fprintf (f, ", tree op%d", i);
3623 fprintf (f, ")\n");
3624 fprintf (f, "{\n");
3625
3626 if (gimple)
3627 fprintf (f, " switch (code.get_rep())\n"
3628 " {\n");
3629 else
3630 fprintf (f, " switch (code)\n"
3631 " {\n");
3632 for (unsigned i = 0; i < root->kids.length (); i++)
3633 {
3634 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
3635 expr *e = static_cast<expr *>(dop->op);
3636 if (e->ops.length () != n
3637 /* Builtin simplifications are somewhat premature on
3638 GENERIC. The following drops patterns with outermost
3639 calls. It's easy to emit overloads for function code
3640 though if necessary. */
3641 || (!gimple
3642 && e->operation->kind != id_base::CODE))
3643 continue;
3644
3645 if (*e->operation == CONVERT_EXPR
3646 || *e->operation == NOP_EXPR)
3647 fprintf (f, " CASE_CONVERT:\n");
3648 else
3649 fprintf (f, " case %s%s:\n",
3650 is_a <fn_id *> (e->operation) ? "-" : "",
3651 e->operation->id);
3652 if (gimple)
3653 fprintf (f, " return gimple_simplify_%s (res_code, res_ops, "
3654 "seq, valueize, code, type", e->operation->id);
3655 else
3656 fprintf (f, " return generic_simplify_%s (loc, code, type",
3657 e->operation->id);
3658 for (unsigned i = 0; i < n; ++i)
3659 fprintf (f, ", op%d", i);
3660 fprintf (f, ");\n");
3661 }
3662 fprintf (f, " default:;\n"
3663 " }\n");
3664
3665 if (gimple)
3666 fprintf (f, " return false;\n");
3667 else
3668 fprintf (f, " return NULL_TREE;\n");
3669 fprintf (f, "}\n");
3670 }
3671 }
3672
3673 /* Output code to implement the predicate P from the decision tree DT. */
3674
3675 void
3676 write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple)
3677 {
3678 fprintf (f, "\nbool\n"
3679 "%s%s (tree t%s%s)\n"
3680 "{\n", gimple ? "gimple_" : "tree_", p->id,
3681 p->nargs > 0 ? ", tree *res_ops" : "",
3682 gimple ? ", tree (*valueize)(tree) ATTRIBUTE_UNUSED" : "");
3683 /* Conveniently make 'type' available. */
3684 fprintf_indent (f, 2, "tree type = TREE_TYPE (t);\n");
3685
3686 if (!gimple)
3687 fprintf_indent (f, 2, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
3688 dt.root->gen_kids (f, 2, gimple);
3689
3690 fprintf_indent (f, 2, "return false;\n"
3691 "}\n");
3692 }
3693
3694 /* Write the common header for the GIMPLE/GENERIC IL matching routines. */
3695
3696 static void
3697 write_header (FILE *f, const char *head)
3698 {
3699 fprintf (f, "/* Generated automatically by the program `genmatch' from\n");
3700 fprintf (f, " a IL pattern matching and simplification description. */\n");
3701
3702 /* Include the header instead of writing it awkwardly quoted here. */
3703 fprintf (f, "\n#include \"%s\"\n", head);
3704 }
3705
3706
3707
3708 /* AST parsing. */
3709
3710 class parser
3711 {
3712 public:
3713 parser (cpp_reader *);
3714
3715 private:
3716 const cpp_token *next ();
3717 const cpp_token *peek (unsigned = 1);
3718 const cpp_token *peek_ident (const char * = NULL, unsigned = 1);
3719 const cpp_token *expect (enum cpp_ttype);
3720 const cpp_token *eat_token (enum cpp_ttype);
3721 const char *get_string ();
3722 const char *get_ident ();
3723 const cpp_token *eat_ident (const char *);
3724 const char *get_number ();
3725
3726 id_base *parse_operation ();
3727 operand *parse_capture (operand *, bool);
3728 operand *parse_expr ();
3729 c_expr *parse_c_expr (cpp_ttype);
3730 operand *parse_op ();
3731
3732 void record_operlist (source_location, user_id *);
3733
3734 void parse_pattern ();
3735 operand *parse_result (operand *, predicate_id *);
3736 void push_simplify (simplify::simplify_kind,
3737 vec<simplify *>&, operand *, operand *);
3738 void parse_simplify (simplify::simplify_kind,
3739 vec<simplify *>&, predicate_id *, operand *);
3740 void parse_for (source_location);
3741 void parse_if (source_location);
3742 void parse_predicates (source_location);
3743 void parse_operator_list (source_location);
3744
3745 cpp_reader *r;
3746 vec<c_expr *> active_ifs;
3747 vec<vec<user_id *> > active_fors;
3748 hash_set<user_id *> *oper_lists_set;
3749 vec<user_id *> oper_lists;
3750
3751 cid_map_t *capture_ids;
3752
3753 public:
3754 vec<simplify *> simplifiers;
3755 vec<predicate_id *> user_predicates;
3756 bool parsing_match_operand;
3757 };
3758
3759 /* Lexing helpers. */
3760
3761 /* Read the next non-whitespace token from R. */
3762
3763 const cpp_token *
3764 parser::next ()
3765 {
3766 const cpp_token *token;
3767 do
3768 {
3769 token = cpp_get_token (r);
3770 }
3771 while (token->type == CPP_PADDING
3772 && token->type != CPP_EOF);
3773 return token;
3774 }
3775
3776 /* Peek at the next non-whitespace token from R. */
3777
3778 const cpp_token *
3779 parser::peek (unsigned num)
3780 {
3781 const cpp_token *token;
3782 unsigned i = 0;
3783 do
3784 {
3785 token = cpp_peek_token (r, i++);
3786 }
3787 while ((token->type == CPP_PADDING
3788 && token->type != CPP_EOF)
3789 || (--num > 0));
3790 /* If we peek at EOF this is a fatal error as it leaves the
3791 cpp_reader in unusable state. Assume we really wanted a
3792 token and thus this EOF is unexpected. */
3793 if (token->type == CPP_EOF)
3794 fatal_at (token, "unexpected end of file");
3795 return token;
3796 }
3797
3798 /* Peek at the next identifier token (or return NULL if the next
3799 token is not an identifier or equal to ID if supplied). */
3800
3801 const cpp_token *
3802 parser::peek_ident (const char *id, unsigned num)
3803 {
3804 const cpp_token *token = peek (num);
3805 if (token->type != CPP_NAME)
3806 return 0;
3807
3808 if (id == 0)
3809 return token;
3810
3811 const char *t = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;
3812 if (strcmp (id, t) == 0)
3813 return token;
3814
3815 return 0;
3816 }
3817
3818 /* Read the next token from R and assert it is of type TK. */
3819
3820 const cpp_token *
3821 parser::expect (enum cpp_ttype tk)
3822 {
3823 const cpp_token *token = next ();
3824 if (token->type != tk)
3825 fatal_at (token, "expected %s, got %s",
3826 cpp_type2name (tk, 0), cpp_type2name (token->type, 0));
3827
3828 return token;
3829 }
3830
3831 /* Consume the next token from R and assert it is of type TK. */
3832
3833 const cpp_token *
3834 parser::eat_token (enum cpp_ttype tk)
3835 {
3836 return expect (tk);
3837 }
3838
3839 /* Read the next token from R and assert it is of type CPP_STRING and
3840 return its value. */
3841
3842 const char *
3843 parser::get_string ()
3844 {
3845 const cpp_token *token = expect (CPP_STRING);
3846 return (const char *)token->val.str.text;
3847 }
3848
3849 /* Read the next token from R and assert it is of type CPP_NAME and
3850 return its value. */
3851
3852 const char *
3853 parser::get_ident ()
3854 {
3855 const cpp_token *token = expect (CPP_NAME);
3856 return (const char *)CPP_HASHNODE (token->val.node.node)->ident.str;
3857 }
3858
3859 /* Eat an identifier token with value S from R. */
3860
3861 const cpp_token *
3862 parser::eat_ident (const char *s)
3863 {
3864 const cpp_token *token = peek ();
3865 const char *t = get_ident ();
3866 if (strcmp (s, t) != 0)
3867 fatal_at (token, "expected '%s' got '%s'\n", s, t);
3868 return token;
3869 }
3870
3871 /* Read the next token from R and assert it is of type CPP_NUMBER and
3872 return its value. */
3873
3874 const char *
3875 parser::get_number ()
3876 {
3877 const cpp_token *token = expect (CPP_NUMBER);
3878 return (const char *)token->val.str.text;
3879 }
3880
3881
3882 /* Record an operator-list use for transparent for handling. */
3883
3884 void
3885 parser::record_operlist (source_location loc, user_id *p)
3886 {
3887 if (!oper_lists_set->add (p))
3888 {
3889 if (!oper_lists.is_empty ()
3890 && oper_lists[0]->substitutes.length () != p->substitutes.length ())
3891 fatal_at (loc, "User-defined operator list does not have the "
3892 "same number of entries as others used in the pattern");
3893 oper_lists.safe_push (p);
3894 }
3895 }
3896
3897 /* Parse the operator ID, special-casing convert?, convert1? and
3898 convert2? */
3899
3900 id_base *
3901 parser::parse_operation ()
3902 {
3903 const cpp_token *id_tok = peek ();
3904 const char *id = get_ident ();
3905 const cpp_token *token = peek ();
3906 if (strcmp (id, "convert0") == 0)
3907 fatal_at (id_tok, "use 'convert?' here");
3908 else if (strcmp (id, "view_convert0") == 0)
3909 fatal_at (id_tok, "use 'view_convert?' here");
3910 if (token->type == CPP_QUERY
3911 && !(token->flags & PREV_WHITE))
3912 {
3913 if (strcmp (id, "convert") == 0)
3914 id = "convert0";
3915 else if (strcmp (id, "convert1") == 0)
3916 ;
3917 else if (strcmp (id, "convert2") == 0)
3918 ;
3919 else if (strcmp (id, "view_convert") == 0)
3920 id = "view_convert0";
3921 else if (strcmp (id, "view_convert1") == 0)
3922 ;
3923 else if (strcmp (id, "view_convert2") == 0)
3924 ;
3925 else
3926 fatal_at (id_tok, "non-convert operator conditionalized");
3927
3928 if (!parsing_match_operand)
3929 fatal_at (id_tok, "conditional convert can only be used in "
3930 "match expression");
3931 eat_token (CPP_QUERY);
3932 }
3933 else if (strcmp (id, "convert1") == 0
3934 || strcmp (id, "convert2") == 0
3935 || strcmp (id, "view_convert1") == 0
3936 || strcmp (id, "view_convert2") == 0)
3937 fatal_at (id_tok, "expected '?' after conditional operator");
3938 id_base *op = get_operator (id);
3939 if (!op)
3940 fatal_at (id_tok, "unknown operator %s", id);
3941
3942 user_id *p = dyn_cast<user_id *> (op);
3943 if (p && p->is_oper_list)
3944 {
3945 if (active_fors.length() == 0)
3946 record_operlist (id_tok->src_loc, p);
3947 else
3948 fatal_at (id_tok, "operator-list %s cannot be exapnded inside 'for'", id);
3949 }
3950 return op;
3951 }
3952
3953 /* Parse a capture.
3954 capture = '@'<number> */
3955
3956 struct operand *
3957 parser::parse_capture (operand *op, bool require_existing)
3958 {
3959 source_location src_loc = eat_token (CPP_ATSIGN)->src_loc;
3960 const cpp_token *token = peek ();
3961 const char *id = NULL;
3962 if (token->type == CPP_NUMBER)
3963 id = get_number ();
3964 else if (token->type == CPP_NAME)
3965 id = get_ident ();
3966 else
3967 fatal_at (token, "expected number or identifier");
3968 unsigned next_id = capture_ids->elements ();
3969 bool existed;
3970 unsigned &num = capture_ids->get_or_insert (id, &existed);
3971 if (!existed)
3972 {
3973 if (require_existing)
3974 fatal_at (src_loc, "unknown capture id");
3975 num = next_id;
3976 }
3977 return new capture (src_loc, num, op);
3978 }
3979
3980 /* Parse an expression
3981 expr = '(' <operation>[capture][flag][type] <operand>... ')' */
3982
3983 struct operand *
3984 parser::parse_expr ()
3985 {
3986 const cpp_token *token = peek ();
3987 expr *e = new expr (parse_operation (), token->src_loc);
3988 token = peek ();
3989 operand *op;
3990 bool is_commutative = false;
3991 bool force_capture = false;
3992 const char *expr_type = NULL;
3993
3994 if (token->type == CPP_COLON
3995 && !(token->flags & PREV_WHITE))
3996 {
3997 eat_token (CPP_COLON);
3998 token = peek ();
3999 if (token->type == CPP_NAME
4000 && !(token->flags & PREV_WHITE))
4001 {
4002 const char *s = get_ident ();
4003 if (!parsing_match_operand)
4004 expr_type = s;
4005 else
4006 {
4007 const char *sp = s;
4008 while (*sp)
4009 {
4010 if (*sp == 'c')
4011 {
4012 if (operator_id *p
4013 = dyn_cast<operator_id *> (e->operation))
4014 {
4015 if (!commutative_tree_code (p->code)
4016 && !comparison_code_p (p->code))
4017 fatal_at (token, "operation is not commutative");
4018 }
4019 else if (user_id *p = dyn_cast<user_id *> (e->operation))
4020 for (unsigned i = 0;
4021 i < p->substitutes.length (); ++i)
4022 {
4023 if (operator_id *q
4024 = dyn_cast<operator_id *> (p->substitutes[i]))
4025 {
4026 if (!commutative_tree_code (q->code)
4027 && !comparison_code_p (q->code))
4028 fatal_at (token, "operation %s is not "
4029 "commutative", q->id);
4030 }
4031 }
4032 is_commutative = true;
4033 }
4034 else if (*sp == 'C')
4035 is_commutative = true;
4036 else if (*sp == 's')
4037 {
4038 e->force_single_use = true;
4039 force_capture = true;
4040 }
4041 else
4042 fatal_at (token, "flag %c not recognized", *sp);
4043 sp++;
4044 }
4045 }
4046 token = peek ();
4047 }
4048 else
4049 fatal_at (token, "expected flag or type specifying identifier");
4050 }
4051
4052 if (token->type == CPP_ATSIGN
4053 && !(token->flags & PREV_WHITE))
4054 op = parse_capture (e, false);
4055 else if (force_capture)
4056 {
4057 unsigned num = capture_ids->elements ();
4058 /* Big enough for a 32-bit UINT_MAX plus prefix. */
4059 char id[13];
4060 bool existed;
4061 sprintf (id, "__%u", num);
4062 capture_ids->get_or_insert (xstrdup (id), &existed);
4063 if (existed)
4064 fatal_at (token, "reserved capture id '%s' already used", id);
4065 op = new capture (token->src_loc, num, e);
4066 }
4067 else
4068 op = e;
4069 do
4070 {
4071 const cpp_token *token = peek ();
4072 if (token->type == CPP_CLOSE_PAREN)
4073 {
4074 if (e->operation->nargs != -1
4075 && e->operation->nargs != (int) e->ops.length ())
4076 fatal_at (token, "'%s' expects %u operands, not %u",
4077 e->operation->id, e->operation->nargs, e->ops.length ());
4078 if (is_commutative)
4079 {
4080 if (e->ops.length () == 2)
4081 e->is_commutative = true;
4082 else
4083 fatal_at (token, "only binary operators or function with "
4084 "two arguments can be marked commutative");
4085 }
4086 e->expr_type = expr_type;
4087 return op;
4088 }
4089 else if (!(token->flags & PREV_WHITE))
4090 fatal_at (token, "expected expression operand");
4091
4092 e->append_op (parse_op ());
4093 }
4094 while (1);
4095 }
4096
4097 /* Lex native C code delimited by START recording the preprocessing tokens
4098 for later processing.
4099 c_expr = ('{'|'(') <pp token>... ('}'|')') */
4100
4101 c_expr *
4102 parser::parse_c_expr (cpp_ttype start)
4103 {
4104 const cpp_token *token;
4105 cpp_ttype end;
4106 unsigned opencnt;
4107 vec<cpp_token> code = vNULL;
4108 unsigned nr_stmts = 0;
4109 source_location loc = eat_token (start)->src_loc;
4110 if (start == CPP_OPEN_PAREN)
4111 end = CPP_CLOSE_PAREN;
4112 else if (start == CPP_OPEN_BRACE)
4113 end = CPP_CLOSE_BRACE;
4114 else
4115 gcc_unreachable ();
4116 opencnt = 1;
4117 do
4118 {
4119 token = next ();
4120
4121 /* Count brace pairs to find the end of the expr to match. */
4122 if (token->type == start)
4123 opencnt++;
4124 else if (token->type == end
4125 && --opencnt == 0)
4126 break;
4127 else if (token->type == CPP_EOF)
4128 fatal_at (token, "unexpected end of file");
4129
4130 /* This is a lame way of counting the number of statements. */
4131 if (token->type == CPP_SEMICOLON)
4132 nr_stmts++;
4133
4134 /* If this is possibly a user-defined identifier mark it used. */
4135 if (token->type == CPP_NAME)
4136 {
4137 id_base *idb = get_operator ((const char *)CPP_HASHNODE
4138 (token->val.node.node)->ident.str);
4139 user_id *p;
4140 if (idb && (p = dyn_cast<user_id *> (idb)) && p->is_oper_list)
4141 record_operlist (token->src_loc, p);
4142 }
4143
4144 /* Record the token. */
4145 code.safe_push (*token);
4146 }
4147 while (1);
4148 return new c_expr (r, loc, code, nr_stmts, vNULL, capture_ids);
4149 }
4150
4151 /* Parse an operand which is either an expression, a predicate or
4152 a standalone capture.
4153 op = predicate | expr | c_expr | capture */
4154
4155 struct operand *
4156 parser::parse_op ()
4157 {
4158 const cpp_token *token = peek ();
4159 struct operand *op = NULL;
4160 if (token->type == CPP_OPEN_PAREN)
4161 {
4162 eat_token (CPP_OPEN_PAREN);
4163 op = parse_expr ();
4164 eat_token (CPP_CLOSE_PAREN);
4165 }
4166 else if (token->type == CPP_OPEN_BRACE)
4167 {
4168 op = parse_c_expr (CPP_OPEN_BRACE);
4169 }
4170 else
4171 {
4172 /* Remaining ops are either empty or predicates */
4173 if (token->type == CPP_NAME)
4174 {
4175 const char *id = get_ident ();
4176 id_base *opr = get_operator (id);
4177 if (!opr)
4178 fatal_at (token, "expected predicate name");
4179 if (operator_id *code = dyn_cast <operator_id *> (opr))
4180 {
4181 if (code->nargs != 0)
4182 fatal_at (token, "using an operator with operands as predicate");
4183 /* Parse the zero-operand operator "predicates" as
4184 expression. */
4185 op = new expr (opr, token->src_loc);
4186 }
4187 else if (user_id *code = dyn_cast <user_id *> (opr))
4188 {
4189 if (code->nargs != 0)
4190 fatal_at (token, "using an operator with operands as predicate");
4191 /* Parse the zero-operand operator "predicates" as
4192 expression. */
4193 op = new expr (opr, token->src_loc);
4194 }
4195 else if (predicate_id *p = dyn_cast <predicate_id *> (opr))
4196 op = new predicate (p, token->src_loc);
4197 else
4198 fatal_at (token, "using an unsupported operator as predicate");
4199 if (!parsing_match_operand)
4200 fatal_at (token, "predicates are only allowed in match expression");
4201 token = peek ();
4202 if (token->flags & PREV_WHITE)
4203 return op;
4204 }
4205 else if (token->type != CPP_COLON
4206 && token->type != CPP_ATSIGN)
4207 fatal_at (token, "expected expression or predicate");
4208 /* optionally followed by a capture and a predicate. */
4209 if (token->type == CPP_COLON)
4210 fatal_at (token, "not implemented: predicate on leaf operand");
4211 if (token->type == CPP_ATSIGN)
4212 op = parse_capture (op, !parsing_match_operand);
4213 }
4214
4215 return op;
4216 }
4217
4218 /* Create a new simplify from the current parsing state and MATCH,
4219 MATCH_LOC, RESULT and RESULT_LOC and push it to SIMPLIFIERS. */
4220
4221 void
4222 parser::push_simplify (simplify::simplify_kind kind,
4223 vec<simplify *>& simplifiers,
4224 operand *match, operand *result)
4225 {
4226 /* Build and push a temporary for operator list uses in expressions. */
4227 if (!oper_lists.is_empty ())
4228 active_fors.safe_push (oper_lists);
4229
4230 simplifiers.safe_push
4231 (new simplify (kind, match, result,
4232 active_fors.copy (), capture_ids));
4233
4234 if (!oper_lists.is_empty ())
4235 active_fors.pop ();
4236 }
4237
4238 /* Parse
4239 <result-op> = <op> | <if> | <with>
4240 <if> = '(' 'if' '(' <c-expr> ')' <result-op> ')'
4241 <with> = '(' 'with' '{' <c-expr> '}' <result-op> ')'
4242 and return it. */
4243
4244 operand *
4245 parser::parse_result (operand *result, predicate_id *matcher)
4246 {
4247 const cpp_token *token = peek ();
4248 if (token->type != CPP_OPEN_PAREN)
4249 return parse_op ();
4250
4251 eat_token (CPP_OPEN_PAREN);
4252 if (peek_ident ("if"))
4253 {
4254 eat_ident ("if");
4255 if_expr *ife = new if_expr (token->src_loc);
4256 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4257 if (peek ()->type == CPP_OPEN_PAREN)
4258 {
4259 ife->trueexpr = parse_result (result, matcher);
4260 if (peek ()->type == CPP_OPEN_PAREN)
4261 ife->falseexpr = parse_result (result, matcher);
4262 else if (peek ()->type != CPP_CLOSE_PAREN)
4263 ife->falseexpr = parse_op ();
4264 }
4265 else if (peek ()->type != CPP_CLOSE_PAREN)
4266 {
4267 ife->trueexpr = parse_op ();
4268 if (peek ()->type == CPP_OPEN_PAREN)
4269 ife->falseexpr = parse_result (result, matcher);
4270 else if (peek ()->type != CPP_CLOSE_PAREN)
4271 ife->falseexpr = parse_op ();
4272 }
4273 /* If this if is immediately closed then it contains a
4274 manual matcher or is part of a predicate definition. */
4275 else /* if (peek ()->type == CPP_CLOSE_PAREN) */
4276 {
4277 if (!matcher)
4278 fatal_at (peek (), "manual transform not implemented");
4279 ife->trueexpr = result;
4280 }
4281 eat_token (CPP_CLOSE_PAREN);
4282 return ife;
4283 }
4284 else if (peek_ident ("with"))
4285 {
4286 eat_ident ("with");
4287 with_expr *withe = new with_expr (token->src_loc);
4288 /* Parse (with c-expr expr) as (if-with (true) expr). */
4289 withe->with = parse_c_expr (CPP_OPEN_BRACE);
4290 withe->with->nr_stmts = 0;
4291 withe->subexpr = parse_result (result, matcher);
4292 eat_token (CPP_CLOSE_PAREN);
4293 return withe;
4294 }
4295 else if (peek_ident ("switch"))
4296 {
4297 token = eat_ident ("switch");
4298 source_location ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
4299 eat_ident ("if");
4300 if_expr *ife = new if_expr (ifloc);
4301 operand *res = ife;
4302 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4303 if (peek ()->type == CPP_OPEN_PAREN)
4304 ife->trueexpr = parse_result (result, matcher);
4305 else
4306 ife->trueexpr = parse_op ();
4307 eat_token (CPP_CLOSE_PAREN);
4308 if (peek ()->type != CPP_OPEN_PAREN
4309 || !peek_ident ("if", 2))
4310 fatal_at (token, "switch can be implemented with a single if");
4311 while (peek ()->type != CPP_CLOSE_PAREN)
4312 {
4313 if (peek ()->type == CPP_OPEN_PAREN)
4314 {
4315 if (peek_ident ("if", 2))
4316 {
4317 ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
4318 eat_ident ("if");
4319 ife->falseexpr = new if_expr (ifloc);
4320 ife = as_a <if_expr *> (ife->falseexpr);
4321 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4322 if (peek ()->type == CPP_OPEN_PAREN)
4323 ife->trueexpr = parse_result (result, matcher);
4324 else
4325 ife->trueexpr = parse_op ();
4326 eat_token (CPP_CLOSE_PAREN);
4327 }
4328 else
4329 {
4330 /* switch default clause */
4331 ife->falseexpr = parse_result (result, matcher);
4332 eat_token (CPP_CLOSE_PAREN);
4333 return res;
4334 }
4335 }
4336 else
4337 {
4338 /* switch default clause */
4339 ife->falseexpr = parse_op ();
4340 eat_token (CPP_CLOSE_PAREN);
4341 return res;
4342 }
4343 }
4344 eat_token (CPP_CLOSE_PAREN);
4345 return res;
4346 }
4347 else
4348 {
4349 operand *op = result;
4350 if (!matcher)
4351 op = parse_expr ();
4352 eat_token (CPP_CLOSE_PAREN);
4353 return op;
4354 }
4355 }
4356
4357 /* Parse
4358 simplify = 'simplify' <expr> <result-op>
4359 or
4360 match = 'match' <ident> <expr> [<result-op>]
4361 and fill SIMPLIFIERS with the results. */
4362
4363 void
4364 parser::parse_simplify (simplify::simplify_kind kind,
4365 vec<simplify *>& simplifiers, predicate_id *matcher,
4366 operand *result)
4367 {
4368 /* Reset the capture map. */
4369 if (!capture_ids)
4370 capture_ids = new cid_map_t;
4371 /* Reset oper_lists and set. */
4372 hash_set <user_id *> olist;
4373 oper_lists_set = &olist;
4374 oper_lists = vNULL;
4375
4376 const cpp_token *loc = peek ();
4377 parsing_match_operand = true;
4378 struct operand *match = parse_op ();
4379 parsing_match_operand = false;
4380 if (match->type == operand::OP_CAPTURE && !matcher)
4381 fatal_at (loc, "outermost expression cannot be captured");
4382 if (match->type == operand::OP_EXPR
4383 && is_a <predicate_id *> (as_a <expr *> (match)->operation))
4384 fatal_at (loc, "outermost expression cannot be a predicate");
4385
4386 /* Splice active_ifs onto result and continue parsing the
4387 "then" expr. */
4388 if_expr *active_if = NULL;
4389 for (int i = active_ifs.length (); i > 0; --i)
4390 {
4391 if_expr *ifc = new if_expr (active_ifs[i-1]->location);
4392 ifc->cond = active_ifs[i-1];
4393 ifc->trueexpr = active_if;
4394 active_if = ifc;
4395 }
4396 if_expr *outermost_if = active_if;
4397 while (active_if && active_if->trueexpr)
4398 active_if = as_a <if_expr *> (active_if->trueexpr);
4399
4400 const cpp_token *token = peek ();
4401
4402 /* If this if is immediately closed then it is part of a predicate
4403 definition. Push it. */
4404 if (token->type == CPP_CLOSE_PAREN)
4405 {
4406 if (!matcher)
4407 fatal_at (token, "expected transform expression");
4408 if (active_if)
4409 {
4410 active_if->trueexpr = result;
4411 result = outermost_if;
4412 }
4413 push_simplify (kind, simplifiers, match, result);
4414 return;
4415 }
4416
4417 operand *tem = parse_result (result, matcher);
4418 if (active_if)
4419 {
4420 active_if->trueexpr = tem;
4421 result = outermost_if;
4422 }
4423 else
4424 result = tem;
4425
4426 push_simplify (kind, simplifiers, match, result);
4427 }
4428
4429 /* Parsing of the outer control structures. */
4430
4431 /* Parse a for expression
4432 for = '(' 'for' <subst>... <pattern> ')'
4433 subst = <ident> '(' <ident>... ')' */
4434
4435 void
4436 parser::parse_for (source_location)
4437 {
4438 auto_vec<const cpp_token *> user_id_tokens;
4439 vec<user_id *> user_ids = vNULL;
4440 const cpp_token *token;
4441 unsigned min_n_opers = 0, max_n_opers = 0;
4442
4443 while (1)
4444 {
4445 token = peek ();
4446 if (token->type != CPP_NAME)
4447 break;
4448
4449 /* Insert the user defined operators into the operator hash. */
4450 const char *id = get_ident ();
4451 if (get_operator (id, true) != NULL)
4452 fatal_at (token, "operator already defined");
4453 user_id *op = new user_id (id);
4454 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
4455 *slot = op;
4456 user_ids.safe_push (op);
4457 user_id_tokens.safe_push (token);
4458
4459 eat_token (CPP_OPEN_PAREN);
4460
4461 int arity = -1;
4462 while ((token = peek_ident ()) != 0)
4463 {
4464 const char *oper = get_ident ();
4465 id_base *idb = get_operator (oper, true);
4466 if (idb == NULL)
4467 fatal_at (token, "no such operator '%s'", oper);
4468 if (*idb == CONVERT0 || *idb == CONVERT1 || *idb == CONVERT2
4469 || *idb == VIEW_CONVERT0 || *idb == VIEW_CONVERT1
4470 || *idb == VIEW_CONVERT2)
4471 fatal_at (token, "conditional operators cannot be used inside for");
4472
4473 if (arity == -1)
4474 arity = idb->nargs;
4475 else if (idb->nargs == -1)
4476 ;
4477 else if (idb->nargs != arity)
4478 fatal_at (token, "operator '%s' with arity %d does not match "
4479 "others with arity %d", oper, idb->nargs, arity);
4480
4481 user_id *p = dyn_cast<user_id *> (idb);
4482 if (p)
4483 {
4484 if (p->is_oper_list)
4485 op->substitutes.safe_splice (p->substitutes);
4486 else
4487 fatal_at (token, "iterator cannot be used as operator-list");
4488 }
4489 else
4490 op->substitutes.safe_push (idb);
4491 }
4492 op->nargs = arity;
4493 token = expect (CPP_CLOSE_PAREN);
4494
4495 unsigned nsubstitutes = op->substitutes.length ();
4496 if (nsubstitutes == 0)
4497 fatal_at (token, "A user-defined operator must have at least "
4498 "one substitution");
4499 if (max_n_opers == 0)
4500 {
4501 min_n_opers = nsubstitutes;
4502 max_n_opers = nsubstitutes;
4503 }
4504 else
4505 {
4506 if (nsubstitutes % min_n_opers != 0
4507 && min_n_opers % nsubstitutes != 0)
4508 fatal_at (token, "All user-defined identifiers must have a "
4509 "multiple number of operator substitutions of the "
4510 "smallest number of substitutions");
4511 if (nsubstitutes < min_n_opers)
4512 min_n_opers = nsubstitutes;
4513 else if (nsubstitutes > max_n_opers)
4514 max_n_opers = nsubstitutes;
4515 }
4516 }
4517
4518 unsigned n_ids = user_ids.length ();
4519 if (n_ids == 0)
4520 fatal_at (token, "for requires at least one user-defined identifier");
4521
4522 token = peek ();
4523 if (token->type == CPP_CLOSE_PAREN)
4524 fatal_at (token, "no pattern defined in for");
4525
4526 active_fors.safe_push (user_ids);
4527 while (1)
4528 {
4529 token = peek ();
4530 if (token->type == CPP_CLOSE_PAREN)
4531 break;
4532 parse_pattern ();
4533 }
4534 active_fors.pop ();
4535
4536 /* Remove user-defined operators from the hash again. */
4537 for (unsigned i = 0; i < user_ids.length (); ++i)
4538 {
4539 if (!user_ids[i]->used)
4540 warning_at (user_id_tokens[i],
4541 "operator %s defined but not used", user_ids[i]->id);
4542 operators->remove_elt (user_ids[i]);
4543 }
4544 }
4545
4546 /* Parse an identifier associated with a list of operators.
4547 oprs = '(' 'define_operator_list' <ident> <ident>... ')' */
4548
4549 void
4550 parser::parse_operator_list (source_location)
4551 {
4552 const cpp_token *token = peek ();
4553 const char *id = get_ident ();
4554
4555 if (get_operator (id, true) != 0)
4556 fatal_at (token, "operator %s already defined", id);
4557
4558 user_id *op = new user_id (id, true);
4559 int arity = -1;
4560
4561 while ((token = peek_ident ()) != 0)
4562 {
4563 token = peek ();
4564 const char *oper = get_ident ();
4565 id_base *idb = get_operator (oper, true);
4566
4567 if (idb == 0)
4568 fatal_at (token, "no such operator '%s'", oper);
4569
4570 if (arity == -1)
4571 arity = idb->nargs;
4572 else if (idb->nargs == -1)
4573 ;
4574 else if (arity != idb->nargs)
4575 fatal_at (token, "operator '%s' with arity %d does not match "
4576 "others with arity %d", oper, idb->nargs, arity);
4577
4578 /* We allow composition of multiple operator lists. */
4579 if (user_id *p = dyn_cast<user_id *> (idb))
4580 op->substitutes.safe_splice (p->substitutes);
4581 else
4582 op->substitutes.safe_push (idb);
4583 }
4584
4585 // Check that there is no junk after id-list
4586 token = peek();
4587 if (token->type != CPP_CLOSE_PAREN)
4588 fatal_at (token, "expected identifier got %s", cpp_type2name (token->type, 0));
4589
4590 if (op->substitutes.length () == 0)
4591 fatal_at (token, "operator-list cannot be empty");
4592
4593 op->nargs = arity;
4594 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
4595 *slot = op;
4596 }
4597
4598 /* Parse an outer if expression.
4599 if = '(' 'if' '(' <c-expr> ')' <pattern> ')' */
4600
4601 void
4602 parser::parse_if (source_location)
4603 {
4604 c_expr *ifexpr = parse_c_expr (CPP_OPEN_PAREN);
4605
4606 const cpp_token *token = peek ();
4607 if (token->type == CPP_CLOSE_PAREN)
4608 fatal_at (token, "no pattern defined in if");
4609
4610 active_ifs.safe_push (ifexpr);
4611 while (1)
4612 {
4613 const cpp_token *token = peek ();
4614 if (token->type == CPP_CLOSE_PAREN)
4615 break;
4616
4617 parse_pattern ();
4618 }
4619 active_ifs.pop ();
4620 }
4621
4622 /* Parse a list of predefined predicate identifiers.
4623 preds = '(' 'define_predicates' <ident>... ')' */
4624
4625 void
4626 parser::parse_predicates (source_location)
4627 {
4628 do
4629 {
4630 const cpp_token *token = peek ();
4631 if (token->type != CPP_NAME)
4632 break;
4633
4634 add_predicate (get_ident ());
4635 }
4636 while (1);
4637 }
4638
4639 /* Parse outer control structures.
4640 pattern = <preds>|<for>|<if>|<simplify>|<match> */
4641
4642 void
4643 parser::parse_pattern ()
4644 {
4645 /* All clauses start with '('. */
4646 eat_token (CPP_OPEN_PAREN);
4647 const cpp_token *token = peek ();
4648 const char *id = get_ident ();
4649 if (strcmp (id, "simplify") == 0)
4650 {
4651 parse_simplify (simplify::SIMPLIFY, simplifiers, NULL, NULL);
4652 capture_ids = NULL;
4653 }
4654 else if (strcmp (id, "match") == 0)
4655 {
4656 bool with_args = false;
4657 source_location e_loc = peek ()->src_loc;
4658 if (peek ()->type == CPP_OPEN_PAREN)
4659 {
4660 eat_token (CPP_OPEN_PAREN);
4661 with_args = true;
4662 }
4663 const char *name = get_ident ();
4664 id_base *id = get_operator (name);
4665 predicate_id *p;
4666 if (!id)
4667 {
4668 p = add_predicate (name);
4669 user_predicates.safe_push (p);
4670 }
4671 else if ((p = dyn_cast <predicate_id *> (id)))
4672 ;
4673 else
4674 fatal_at (token, "cannot add a match to a non-predicate ID");
4675 /* Parse (match <id> <arg>... (match-expr)) here. */
4676 expr *e = NULL;
4677 if (with_args)
4678 {
4679 capture_ids = new cid_map_t;
4680 e = new expr (p, e_loc);
4681 while (peek ()->type == CPP_ATSIGN)
4682 e->append_op (parse_capture (NULL, false));
4683 eat_token (CPP_CLOSE_PAREN);
4684 }
4685 if (p->nargs != -1
4686 && ((e && e->ops.length () != (unsigned)p->nargs)
4687 || (!e && p->nargs != 0)))
4688 fatal_at (token, "non-matching number of match operands");
4689 p->nargs = e ? e->ops.length () : 0;
4690 parse_simplify (simplify::MATCH, p->matchers, p, e);
4691 capture_ids = NULL;
4692 }
4693 else if (strcmp (id, "for") == 0)
4694 parse_for (token->src_loc);
4695 else if (strcmp (id, "if") == 0)
4696 parse_if (token->src_loc);
4697 else if (strcmp (id, "define_predicates") == 0)
4698 {
4699 if (active_ifs.length () > 0
4700 || active_fors.length () > 0)
4701 fatal_at (token, "define_predicates inside if or for is not supported");
4702 parse_predicates (token->src_loc);
4703 }
4704 else if (strcmp (id, "define_operator_list") == 0)
4705 {
4706 if (active_ifs.length () > 0
4707 || active_fors.length () > 0)
4708 fatal_at (token, "operator-list inside if or for is not supported");
4709 parse_operator_list (token->src_loc);
4710 }
4711 else
4712 fatal_at (token, "expected %s'simplify', 'match', 'for' or 'if'",
4713 active_ifs.length () == 0 && active_fors.length () == 0
4714 ? "'define_predicates', " : "");
4715
4716 eat_token (CPP_CLOSE_PAREN);
4717 }
4718
4719 /* Main entry of the parser. Repeatedly parse outer control structures. */
4720
4721 parser::parser (cpp_reader *r_)
4722 {
4723 r = r_;
4724 active_ifs = vNULL;
4725 active_fors = vNULL;
4726 simplifiers = vNULL;
4727 oper_lists_set = NULL;
4728 oper_lists = vNULL;
4729 capture_ids = NULL;
4730 user_predicates = vNULL;
4731 parsing_match_operand = false;
4732
4733 const cpp_token *token = next ();
4734 while (token->type != CPP_EOF)
4735 {
4736 _cpp_backup_tokens (r, 1);
4737 parse_pattern ();
4738 token = next ();
4739 }
4740 }
4741
4742
4743 /* Helper for the linemap code. */
4744
4745 static size_t
4746 round_alloc_size (size_t s)
4747 {
4748 return s;
4749 }
4750
4751
4752 /* The genmatch generator progam. It reads from a pattern description
4753 and outputs GIMPLE or GENERIC IL matching and simplification routines. */
4754
4755 int
4756 main (int argc, char **argv)
4757 {
4758 cpp_reader *r;
4759
4760 progname = "genmatch";
4761
4762 if (argc < 2)
4763 return 1;
4764
4765 bool gimple = true;
4766 char *input = argv[argc-1];
4767 for (int i = 1; i < argc - 1; ++i)
4768 {
4769 if (strcmp (argv[i], "--gimple") == 0)
4770 gimple = true;
4771 else if (strcmp (argv[i], "--generic") == 0)
4772 gimple = false;
4773 else if (strcmp (argv[i], "-v") == 0)
4774 verbose = 1;
4775 else if (strcmp (argv[i], "-vv") == 0)
4776 verbose = 2;
4777 else
4778 {
4779 fprintf (stderr, "Usage: genmatch "
4780 "[--gimple] [--generic] [-v[v]] input\n");
4781 return 1;
4782 }
4783 }
4784
4785 line_table = XCNEW (struct line_maps);
4786 linemap_init (line_table, 0);
4787 line_table->reallocator = xrealloc;
4788 line_table->round_alloc_size = round_alloc_size;
4789
4790 r = cpp_create_reader (CLK_GNUC99, NULL, line_table);
4791 cpp_callbacks *cb = cpp_get_callbacks (r);
4792 cb->error = error_cb;
4793
4794 /* Add the build directory to the #include "" search path. */
4795 cpp_dir *dir = XCNEW (cpp_dir);
4796 dir->name = getpwd ();
4797 if (!dir->name)
4798 dir->name = ASTRDUP (".");
4799 cpp_set_include_chains (r, dir, NULL, false);
4800
4801 if (!cpp_read_main_file (r, input))
4802 return 1;
4803 cpp_define (r, gimple ? "GIMPLE=1": "GENERIC=1");
4804 cpp_define (r, gimple ? "GENERIC=0": "GIMPLE=0");
4805
4806 null_id = new id_base (id_base::NULL_ID, "null");
4807
4808 /* Pre-seed operators. */
4809 operators = new hash_table<id_base> (1024);
4810 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
4811 add_operator (SYM, # SYM, # TYPE, NARGS);
4812 #define END_OF_BASE_TREE_CODES
4813 #include "tree.def"
4814 add_operator (CONVERT0, "convert0", "tcc_unary", 1);
4815 add_operator (CONVERT1, "convert1", "tcc_unary", 1);
4816 add_operator (CONVERT2, "convert2", "tcc_unary", 1);
4817 add_operator (VIEW_CONVERT0, "view_convert0", "tcc_unary", 1);
4818 add_operator (VIEW_CONVERT1, "view_convert1", "tcc_unary", 1);
4819 add_operator (VIEW_CONVERT2, "view_convert2", "tcc_unary", 1);
4820 #undef END_OF_BASE_TREE_CODES
4821 #undef DEFTREECODE
4822
4823 /* Pre-seed builtin functions.
4824 ??? Cannot use N (name) as that is targetm.emultls.get_address
4825 for BUILT_IN_EMUTLS_GET_ADDRESS ... */
4826 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) \
4827 add_function (ENUM, "CFN_" # ENUM);
4828 #include "builtins.def"
4829
4830 #define DEF_INTERNAL_FN(CODE, NAME, FNSPEC) \
4831 add_function (IFN_##CODE, "CFN_" #CODE);
4832 #include "internal-fn.def"
4833
4834 /* Parse ahead! */
4835 parser p (r);
4836
4837 if (gimple)
4838 write_header (stdout, "gimple-match-head.c");
4839 else
4840 write_header (stdout, "generic-match-head.c");
4841
4842 /* Go over all predicates defined with patterns and perform
4843 lowering and code generation. */
4844 for (unsigned i = 0; i < p.user_predicates.length (); ++i)
4845 {
4846 predicate_id *pred = p.user_predicates[i];
4847 lower (pred->matchers, gimple);
4848
4849 if (verbose == 2)
4850 for (unsigned i = 0; i < pred->matchers.length (); ++i)
4851 print_matches (pred->matchers[i]);
4852
4853 decision_tree dt;
4854 for (unsigned i = 0; i < pred->matchers.length (); ++i)
4855 dt.insert (pred->matchers[i], i);
4856
4857 if (verbose == 2)
4858 dt.print (stderr);
4859
4860 write_predicate (stdout, pred, dt, gimple);
4861 }
4862
4863 /* Lower the main simplifiers and generate code for them. */
4864 lower (p.simplifiers, gimple);
4865
4866 if (verbose == 2)
4867 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
4868 print_matches (p.simplifiers[i]);
4869
4870 decision_tree dt;
4871 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
4872 dt.insert (p.simplifiers[i], i);
4873
4874 if (verbose == 2)
4875 dt.print (stderr);
4876
4877 dt.gen (stdout, gimple);
4878
4879 /* Finalize. */
4880 cpp_finish (r, NULL);
4881 cpp_destroy (r);
4882
4883 delete operators;
4884
4885 return 0;
4886 }