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