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