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