1 /* Generate pattern matching and transform code shared between
2 GENERIC and GIMPLE folding code from match-and-simplify description.
4 Copyright (C) 2014-2015 Free Software Foundation, Inc.
5 Contributed by Richard Biener <rguenther@suse.de>
6 and Prathamesh Kulkarni <bilbotheelffriend@gmail.com>
8 This file is part of GCC.
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
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
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/>. */
27 #include "coretypes.h"
32 #include "hash-table.h"
39 /* Stubs for GGC referenced through instantiations triggered by hash-map. */
40 void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
41 size_t, size_t MEM_STAT_DECL
)
45 void ggc_free (void *)
52 static struct line_maps
*line_table
;
55 #if GCC_VERSION >= 4001
56 __attribute__((format (printf
, 6, 0)))
58 error_cb (cpp_reader
*, int errtype
, int, source_location location
,
59 unsigned int, const char *msg
, va_list *ap
)
62 linemap_resolve_location (line_table
, location
, LRK_SPELLING_LOCATION
, &map
);
63 expanded_location loc
= linemap_expand_location (line_table
, map
, location
);
64 fprintf (stderr
, "%s:%d:%d %s: ", loc
.file
, loc
.line
, loc
.column
,
65 (errtype
== CPP_DL_WARNING
) ? "warning" : "error");
66 vfprintf (stderr
, msg
, *ap
);
67 fprintf (stderr
, "\n");
68 FILE *f
= fopen (loc
.file
, "r");
74 if (!fgets (buf
, 128, f
))
76 if (buf
[strlen (buf
) - 1] != '\n')
83 fprintf (stderr
, "%s", buf
);
84 for (int i
= 0; i
< loc
.column
- 1; ++i
)
92 if (errtype
== CPP_DL_FATAL
)
98 #if GCC_VERSION >= 4001
99 __attribute__((format (printf
, 2, 3)))
101 fatal_at (const cpp_token
*tk
, const char *msg
, ...)
105 error_cb (NULL
, CPP_DL_FATAL
, 0, tk
->src_loc
, 0, msg
, &ap
);
110 #if GCC_VERSION >= 4001
111 __attribute__((format (printf
, 2, 3)))
113 fatal_at (source_location loc
, const char *msg
, ...)
117 error_cb (NULL
, CPP_DL_FATAL
, 0, loc
, 0, msg
, &ap
);
122 #if GCC_VERSION >= 4001
123 __attribute__((format (printf
, 2, 3)))
125 warning_at (const cpp_token
*tk
, const char *msg
, ...)
129 error_cb (NULL
, CPP_DL_WARNING
, 0, tk
->src_loc
, 0, msg
, &ap
);
134 output_line_directive (FILE *f
, source_location location
,
135 bool dumpfile
= false)
138 linemap_resolve_location (line_table
, location
, LRK_SPELLING_LOCATION
, &map
);
139 expanded_location loc
= linemap_expand_location (line_table
, map
, location
);
142 /* When writing to a dumpfile only dump the filename. */
143 const char *file
= strrchr (loc
.file
, DIR_SEPARATOR
);
148 fprintf (f
, "%s:%d", file
, loc
.line
);
151 /* Other gen programs really output line directives here, at least for
152 development it's right now more convenient to have line information
153 from the generated file. Still keep the directives as comment for now
154 to easily back-point to the meta-description. */
155 fprintf (f
, "/* #line %d \"%s\" */\n", loc
.line
, loc
.file
);
159 /* Pull in tree codes and builtin function codes from their
162 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
172 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
173 enum built_in_function
{
174 #include "builtins.def"
180 /* Base class for all identifiers the parser knows. */
182 struct id_base
: typed_noop_remove
<id_base
>
184 enum id_kind
{ CODE
, FN
, PREDICATE
, USER
} kind
;
186 id_base (id_kind
, const char *, int = -1);
192 /* hash_table support. */
193 typedef id_base value_type
;
194 typedef id_base compare_type
;
195 static inline hashval_t
hash (const value_type
*);
196 static inline int equal (const value_type
*, const compare_type
*);
200 id_base::hash (const value_type
*op
)
206 id_base::equal (const value_type
*op1
,
207 const compare_type
*op2
)
209 return (op1
->hashval
== op2
->hashval
210 && strcmp (op1
->id
, op2
->id
) == 0);
213 /* Hashtable of known pattern operators. This is pre-seeded from
214 all known tree codes and all known builtin function ids. */
215 static hash_table
<id_base
> *operators
;
217 id_base::id_base (id_kind kind_
, const char *id_
, int nargs_
)
222 hashval
= htab_hash_string (id
);
225 /* Identifier that maps to a tree code. */
227 struct operator_id
: public id_base
229 operator_id (enum tree_code code_
, const char *id_
, unsigned nargs_
,
231 : id_base (id_base::CODE
, id_
, nargs_
), code (code_
), tcc (tcc_
) {}
236 /* Identifier that maps to a builtin function code. */
238 struct fn_id
: public id_base
240 fn_id (enum built_in_function fn_
, const char *id_
)
241 : id_base (id_base::FN
, id_
), fn (fn_
) {}
242 enum built_in_function fn
;
247 /* Identifier that maps to a user-defined predicate. */
249 struct predicate_id
: public id_base
251 predicate_id (const char *id_
)
252 : id_base (id_base::PREDICATE
, id_
), matchers (vNULL
) {}
253 vec
<simplify
*> matchers
;
256 /* Identifier that maps to a operator defined by a 'for' directive. */
258 struct user_id
: public id_base
260 user_id (const char *id_
, bool is_oper_list_
= false)
261 : id_base (id_base::USER
, id_
), substitutes (vNULL
),
262 used (false), is_oper_list (is_oper_list_
) {}
263 vec
<id_base
*> substitutes
;
271 is_a_helper
<fn_id
*>::test (id_base
*id
)
273 return id
->kind
== id_base::FN
;
279 is_a_helper
<operator_id
*>::test (id_base
*id
)
281 return id
->kind
== id_base::CODE
;
287 is_a_helper
<predicate_id
*>::test (id_base
*id
)
289 return id
->kind
== id_base::PREDICATE
;
295 is_a_helper
<user_id
*>::test (id_base
*id
)
297 return id
->kind
== id_base::USER
;
300 /* Add a predicate identifier to the hash. */
302 static predicate_id
*
303 add_predicate (const char *id
)
305 predicate_id
*p
= new predicate_id (id
);
306 id_base
**slot
= operators
->find_slot_with_hash (p
, p
->hashval
, INSERT
);
308 fatal ("duplicate id definition");
313 /* Add a tree code identifier to the hash. */
316 add_operator (enum tree_code code
, const char *id
,
317 const char *tcc
, unsigned nargs
)
319 if (strcmp (tcc
, "tcc_unary") != 0
320 && strcmp (tcc
, "tcc_binary") != 0
321 && strcmp (tcc
, "tcc_comparison") != 0
322 && strcmp (tcc
, "tcc_expression") != 0
323 /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR. */
324 && strcmp (tcc
, "tcc_reference") != 0
325 /* To have INTEGER_CST and friends as "predicate operators". */
326 && strcmp (tcc
, "tcc_constant") != 0
327 /* And allow CONSTRUCTOR for vector initializers. */
328 && !(code
== CONSTRUCTOR
))
330 operator_id
*op
= new operator_id (code
, id
, nargs
, tcc
);
331 id_base
**slot
= operators
->find_slot_with_hash (op
, op
->hashval
, INSERT
);
333 fatal ("duplicate id definition");
337 /* Add a builtin identifier to the hash. */
340 add_builtin (enum built_in_function code
, const char *id
)
342 fn_id
*fn
= new fn_id (code
, id
);
343 id_base
**slot
= operators
->find_slot_with_hash (fn
, fn
->hashval
, INSERT
);
345 fatal ("duplicate id definition");
349 /* Helper for easy comparing ID with tree code CODE. */
352 operator==(id_base
&id
, enum tree_code code
)
354 if (operator_id
*oid
= dyn_cast
<operator_id
*> (&id
))
355 return oid
->code
== code
;
359 /* Lookup the identifier ID. */
362 get_operator (const char *id
)
364 id_base
tem (id_base::CODE
, id
);
366 id_base
*op
= operators
->find_with_hash (&tem
, tem
.hashval
);
369 /* If this is a user-defined identifier track whether it was used. */
370 if (user_id
*uid
= dyn_cast
<user_id
*> (op
))
375 /* Try all-uppercase. */
376 char *id2
= xstrdup (id
);
377 for (unsigned i
= 0; i
< strlen (id2
); ++i
)
378 id2
[i
] = TOUPPER (id2
[i
]);
379 new (&tem
) id_base (id_base::CODE
, id2
);
380 op
= operators
->find_with_hash (&tem
, tem
.hashval
);
387 /* Try _EXPR appended. */
388 id2
= (char *)xrealloc (id2
, strlen (id2
) + sizeof ("_EXPR") + 1);
389 strcat (id2
, "_EXPR");
390 new (&tem
) id_base (id_base::CODE
, id2
);
391 op
= operators
->find_with_hash (&tem
, tem
.hashval
);
402 /* Helper for the capture-id map. */
404 struct capture_id_map_hasher
: default_hashmap_traits
406 static inline hashval_t
hash (const char *);
407 static inline bool equal_keys (const char *, const char *);
411 capture_id_map_hasher::hash (const char *id
)
413 return htab_hash_string (id
);
417 capture_id_map_hasher::equal_keys (const char *id1
, const char *id2
)
419 return strcmp (id1
, id2
) == 0;
422 typedef hash_map
<const char *, unsigned, capture_id_map_hasher
> cid_map_t
;
425 /* The AST produced by parsing of the pattern definitions. */
430 /* The base class for operands. */
433 enum op_type
{ OP_PREDICATE
, OP_EXPR
, OP_CAPTURE
, OP_C_EXPR
};
434 operand (enum op_type type_
) : type (type_
) {}
436 virtual void gen_transform (FILE *, const char *, bool, int,
437 const char *, capture_info
*,
440 { gcc_unreachable (); }
443 /* A predicate operand. Predicates are leafs in the AST. */
445 struct predicate
: public operand
447 predicate (predicate_id
*p_
) : operand (OP_PREDICATE
), p (p_
) {}
451 /* An operand that constitutes an expression. Expressions include
452 function calls and user-defined predicate invocations. */
454 struct expr
: public operand
456 expr (id_base
*operation_
, bool is_commutative_
= false)
457 : operand (OP_EXPR
), operation (operation_
),
458 ops (vNULL
), expr_type (NULL
), is_commutative (is_commutative_
),
459 is_generic (false) {}
460 void append_op (operand
*op
) { ops
.safe_push (op
); }
461 /* The operator and its operands. */
464 /* An explicitely specified type - used exclusively for conversions. */
465 const char *expr_type
;
466 /* Whether the operation is to be applied commutatively. This is
467 later lowered to two separate patterns. */
469 /* Whether the expression is expected to be in GENERIC form. */
471 virtual void gen_transform (FILE *f
, const char *, bool, int,
472 const char *, capture_info
*,
473 dt_operand
** = 0, bool = true);
476 /* An operator that is represented by native C code. This is always
477 a leaf operand in the AST. This class is also used to represent
478 the code to be generated for 'if' and 'with' expressions. */
480 struct c_expr
: public operand
482 /* A mapping of an identifier and its replacement. Used to apply
487 id_tab (const char *id_
, const char *oper_
): id (id_
), oper (oper_
) {}
490 c_expr (cpp_reader
*r_
, vec
<cpp_token
> code_
, unsigned nr_stmts_
,
491 vec
<id_tab
> ids_
, cid_map_t
*capture_ids_
)
492 : operand (OP_C_EXPR
), r (r_
), code (code_
), capture_ids (capture_ids_
),
493 nr_stmts (nr_stmts_
), ids (ids_
) {}
494 /* cpplib tokens and state to transform this back to source. */
497 cid_map_t
*capture_ids
;
498 /* The number of statements parsed (well, the number of ';'s). */
500 /* The identifier replacement vector. */
502 virtual void gen_transform (FILE *f
, const char *, bool, int,
503 const char *, capture_info
*,
504 dt_operand
** = 0, bool = true);
507 /* A wrapper around another operand that captures its value. */
509 struct capture
: public operand
511 capture (unsigned where_
, operand
*what_
)
512 : operand (OP_CAPTURE
), where (where_
), what (what_
) {}
513 /* Identifier index for the value. */
515 /* The captured value. */
517 virtual void gen_transform (FILE *f
, const char *, bool, int,
518 const char *, capture_info
*,
519 dt_operand
** = 0, bool = true);
525 is_a_helper
<capture
*>::test (operand
*op
)
527 return op
->type
== operand::OP_CAPTURE
;
533 is_a_helper
<predicate
*>::test (operand
*op
)
535 return op
->type
== operand::OP_PREDICATE
;
541 is_a_helper
<c_expr
*>::test (operand
*op
)
543 return op
->type
== operand::OP_C_EXPR
;
549 is_a_helper
<expr
*>::test (operand
*op
)
551 return op
->type
== operand::OP_EXPR
;
554 /* Helper to distinguish 'if' from 'with' expressions. */
558 if_or_with (operand
*cexpr_
, source_location location_
, bool is_with_
)
559 : location (location_
), cexpr (cexpr_
), is_with (is_with_
) {}
560 source_location location
;
565 /* The main class of a pattern and its transform. This is used to
566 represent both (simplify ...) and (match ...) kinds. The AST
567 duplicates all outer 'if' and 'for' expressions here so each
568 simplify can exist in isolation. */
572 simplify (operand
*match_
, source_location match_location_
,
573 struct operand
*result_
, source_location result_location_
,
574 vec
<if_or_with
> ifexpr_vec_
, vec
<vec
<user_id
*> > for_vec_
,
575 cid_map_t
*capture_ids_
)
576 : match (match_
), match_location (match_location_
),
577 result (result_
), result_location (result_location_
),
578 ifexpr_vec (ifexpr_vec_
), for_vec (for_vec_
),
579 capture_ids (capture_ids_
), capture_max (capture_ids_
->elements () - 1) {}
581 /* The expression that is matched against the GENERIC or GIMPLE IL. */
583 source_location match_location
;
584 /* For a (simplify ...) the expression produced when the pattern applies.
585 For a (match ...) either NULL if it is a simple predicate or the
586 single expression specifying the matched operands. */
587 struct operand
*result
;
588 source_location result_location
;
589 /* Collected 'if' expressions that need to evaluate to true to make
590 the pattern apply. */
591 vec
<if_or_with
> ifexpr_vec
;
592 /* Collected 'for' expression operators that have to be replaced
593 in the lowering phase. */
594 vec
<vec
<user_id
*> > for_vec
;
595 /* A map of capture identifiers to indexes. */
596 cid_map_t
*capture_ids
;
600 /* Debugging routines for dumping the AST. */
603 print_operand (operand
*o
, FILE *f
= stderr
, bool flattened
= false)
605 if (capture
*c
= dyn_cast
<capture
*> (o
))
607 fprintf (f
, "@%u", c
->where
);
608 if (c
->what
&& flattened
== false)
611 print_operand (c
->what
, f
, flattened
);
616 else if (predicate
*p
= dyn_cast
<predicate
*> (o
))
617 fprintf (f
, "%s", p
->p
->id
);
619 else if (is_a
<c_expr
*> (o
))
620 fprintf (f
, "c_expr");
622 else if (expr
*e
= dyn_cast
<expr
*> (o
))
624 fprintf (f
, "(%s", e
->operation
->id
);
626 if (flattened
== false)
629 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
631 print_operand (e
->ops
[i
], f
, flattened
);
643 print_matches (struct simplify
*s
, FILE *f
= stderr
)
645 fprintf (f
, "for expression: ");
646 print_operand (s
->match
, f
);
653 /* Lowering of commutative operators. */
656 cartesian_product (const vec
< vec
<operand
*> >& ops_vector
,
657 vec
< vec
<operand
*> >& result
, vec
<operand
*>& v
, unsigned n
)
659 if (n
== ops_vector
.length ())
661 vec
<operand
*> xv
= v
.copy ();
662 result
.safe_push (xv
);
666 for (unsigned i
= 0; i
< ops_vector
[n
].length (); ++i
)
668 v
[n
] = ops_vector
[n
][i
];
669 cartesian_product (ops_vector
, result
, v
, n
+ 1);
673 /* Lower OP to two operands in case it is marked as commutative. */
675 static vec
<operand
*>
676 commutate (operand
*op
)
678 vec
<operand
*> ret
= vNULL
;
680 if (capture
*c
= dyn_cast
<capture
*> (op
))
687 vec
<operand
*> v
= commutate (c
->what
);
688 for (unsigned i
= 0; i
< v
.length (); ++i
)
690 capture
*nc
= new capture (c
->where
, v
[i
]);
696 expr
*e
= dyn_cast
<expr
*> (op
);
697 if (!e
|| e
->ops
.length () == 0)
703 vec
< vec
<operand
*> > ops_vector
= vNULL
;
704 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
705 ops_vector
.safe_push (commutate (e
->ops
[i
]));
707 auto_vec
< vec
<operand
*> > result
;
708 auto_vec
<operand
*> v (e
->ops
.length ());
709 v
.quick_grow_cleared (e
->ops
.length ());
710 cartesian_product (ops_vector
, result
, v
, 0);
713 for (unsigned i
= 0; i
< result
.length (); ++i
)
715 expr
*ne
= new expr (e
->operation
);
716 for (unsigned j
= 0; j
< result
[i
].length (); ++j
)
717 ne
->append_op (result
[i
][j
]);
721 if (!e
->is_commutative
)
724 for (unsigned i
= 0; i
< result
.length (); ++i
)
726 expr
*ne
= new expr (e
->operation
);
727 // result[i].length () is 2 since e->operation is binary
728 for (unsigned j
= result
[i
].length (); j
; --j
)
729 ne
->append_op (result
[i
][j
-1]);
736 /* Lower operations marked as commutative in the AST of S and push
737 the resulting patterns to SIMPLIFIERS. */
740 lower_commutative (simplify
*s
, vec
<simplify
*>& simplifiers
)
742 vec
<operand
*> matchers
= commutate (s
->match
);
743 for (unsigned i
= 0; i
< matchers
.length (); ++i
)
745 simplify
*ns
= new simplify (matchers
[i
], s
->match_location
,
746 s
->result
, s
->result_location
, s
->ifexpr_vec
,
747 s
->for_vec
, s
->capture_ids
);
748 simplifiers
.safe_push (ns
);
752 /* Strip conditional conversios using operator OPER from O and its
753 children if STRIP, else replace them with an unconditional convert. */
756 lower_opt_convert (operand
*o
, enum tree_code oper
, bool strip
)
758 if (capture
*c
= dyn_cast
<capture
*> (o
))
761 return new capture (c
->where
, lower_opt_convert (c
->what
, oper
, strip
));
766 expr
*e
= dyn_cast
<expr
*> (o
);
770 if (*e
->operation
== oper
)
773 return lower_opt_convert (e
->ops
[0], oper
, strip
);
775 expr
*ne
= new expr (get_operator ("CONVERT_EXPR"));
776 ne
->append_op (lower_opt_convert (e
->ops
[0], oper
, strip
));
780 expr
*ne
= new expr (e
->operation
, e
->is_commutative
);
781 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
782 ne
->append_op (lower_opt_convert (e
->ops
[i
], oper
, strip
));
787 /* Determine whether O or its children uses the conditional conversion
791 has_opt_convert (operand
*o
, enum tree_code oper
)
793 if (capture
*c
= dyn_cast
<capture
*> (o
))
796 return has_opt_convert (c
->what
, oper
);
801 expr
*e
= dyn_cast
<expr
*> (o
);
805 if (*e
->operation
== oper
)
808 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
809 if (has_opt_convert (e
->ops
[i
], oper
))
815 /* Lower conditional convert operators in O, expanding it to a vector
818 static vec
<operand
*>
819 lower_opt_convert (operand
*o
)
821 vec
<operand
*> v1
= vNULL
, v2
;
825 enum tree_code opers
[] = { CONVERT0
, CONVERT1
, CONVERT2
};
827 /* Conditional converts are lowered to a pattern with the
828 conversion and one without. The three different conditional
829 convert codes are lowered separately. */
831 for (unsigned i
= 0; i
< 3; ++i
)
834 for (unsigned j
= 0; j
< v1
.length (); ++j
)
835 if (has_opt_convert (v1
[j
], opers
[i
]))
837 v2
.safe_push (lower_opt_convert (v1
[j
], opers
[i
], false));
838 v2
.safe_push (lower_opt_convert (v1
[j
], opers
[i
], true));
844 for (unsigned j
= 0; j
< v2
.length (); ++j
)
845 v1
.safe_push (v2
[j
]);
852 /* Lower conditional convert operators in the AST of S and push
853 the resulting multiple patterns to SIMPLIFIERS. */
856 lower_opt_convert (simplify
*s
, vec
<simplify
*>& simplifiers
)
858 vec
<operand
*> matchers
= lower_opt_convert (s
->match
);
859 for (unsigned i
= 0; i
< matchers
.length (); ++i
)
861 simplify
*ns
= new simplify (matchers
[i
], s
->match_location
,
862 s
->result
, s
->result_location
, s
->ifexpr_vec
,
863 s
->for_vec
, s
->capture_ids
);
864 simplifiers
.safe_push (ns
);
868 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
869 GENERIC and a GIMPLE variant. */
871 static vec
<operand
*>
872 lower_cond (operand
*o
)
874 vec
<operand
*> ro
= vNULL
;
876 if (capture
*c
= dyn_cast
<capture
*> (o
))
880 vec
<operand
*> lop
= vNULL
;
881 lop
= lower_cond (c
->what
);
883 for (unsigned i
= 0; i
< lop
.length (); ++i
)
884 ro
.safe_push (new capture (c
->where
, lop
[i
]));
889 expr
*e
= dyn_cast
<expr
*> (o
);
890 if (!e
|| e
->ops
.length () == 0)
896 vec
< vec
<operand
*> > ops_vector
= vNULL
;
897 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
898 ops_vector
.safe_push (lower_cond (e
->ops
[i
]));
900 auto_vec
< vec
<operand
*> > result
;
901 auto_vec
<operand
*> v (e
->ops
.length ());
902 v
.quick_grow_cleared (e
->ops
.length ());
903 cartesian_product (ops_vector
, result
, v
, 0);
905 for (unsigned i
= 0; i
< result
.length (); ++i
)
907 expr
*ne
= new expr (e
->operation
);
908 for (unsigned j
= 0; j
< result
[i
].length (); ++j
)
909 ne
->append_op (result
[i
][j
]);
911 /* If this is a COND with a captured expression or an
912 expression with two operands then also match a GENERIC
913 form on the compare. */
914 if ((*e
->operation
== COND_EXPR
915 || *e
->operation
== VEC_COND_EXPR
)
916 && ((is_a
<capture
*> (e
->ops
[0])
917 && as_a
<capture
*> (e
->ops
[0])->what
918 && is_a
<expr
*> (as_a
<capture
*> (e
->ops
[0])->what
)
920 (as_a
<capture
*> (e
->ops
[0])->what
)->ops
.length () == 2)
921 || (is_a
<expr
*> (e
->ops
[0])
922 && as_a
<expr
*> (e
->ops
[0])->ops
.length () == 2)))
924 expr
*ne
= new expr (e
->operation
);
925 for (unsigned j
= 0; j
< result
[i
].length (); ++j
)
926 ne
->append_op (result
[i
][j
]);
927 if (capture
*c
= dyn_cast
<capture
*> (ne
->ops
[0]))
929 expr
*ocmp
= as_a
<expr
*> (c
->what
);
930 expr
*cmp
= new expr (ocmp
->operation
);
931 for (unsigned j
= 0; j
< ocmp
->ops
.length (); ++j
)
932 cmp
->append_op (ocmp
->ops
[j
]);
933 cmp
->is_generic
= true;
934 ne
->ops
[0] = new capture (c
->where
, cmp
);
938 expr
*ocmp
= as_a
<expr
*> (ne
->ops
[0]);
939 expr
*cmp
= new expr (ocmp
->operation
);
940 for (unsigned j
= 0; j
< ocmp
->ops
.length (); ++j
)
941 cmp
->append_op (ocmp
->ops
[j
]);
942 cmp
->is_generic
= true;
952 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
953 GENERIC and a GIMPLE variant. */
956 lower_cond (simplify
*s
, vec
<simplify
*>& simplifiers
)
958 vec
<operand
*> matchers
= lower_cond (s
->match
);
959 for (unsigned i
= 0; i
< matchers
.length (); ++i
)
961 simplify
*ns
= new simplify (matchers
[i
], s
->match_location
,
962 s
->result
, s
->result_location
, s
->ifexpr_vec
,
963 s
->for_vec
, s
->capture_ids
);
964 simplifiers
.safe_push (ns
);
968 /* In AST operand O replace operator ID with operator WITH. */
971 replace_id (operand
*o
, user_id
*id
, id_base
*with
)
973 /* Deep-copy captures and expressions, replacing operations as
975 if (capture
*c
= dyn_cast
<capture
*> (o
))
979 return new capture (c
->where
, replace_id (c
->what
, id
, with
));
981 else if (expr
*e
= dyn_cast
<expr
*> (o
))
983 expr
*ne
= new expr (e
->operation
== id
? with
: e
->operation
,
985 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
986 ne
->append_op (replace_id (e
->ops
[i
], id
, with
));
990 /* For c_expr we simply record a string replacement table which is
991 applied at code-generation time. */
992 if (c_expr
*ce
= dyn_cast
<c_expr
*> (o
))
994 vec
<c_expr::id_tab
> ids
= ce
->ids
.copy ();
995 ids
.safe_push (c_expr::id_tab (id
->id
, with
->id
));
996 return new c_expr (ce
->r
, ce
->code
, ce
->nr_stmts
, ids
, ce
->capture_ids
);
1002 /* Lower recorded fors for SIN and output to SIMPLIFIERS. */
1005 lower_for (simplify
*sin
, vec
<simplify
*>& simplifiers
)
1007 vec
<vec
<user_id
*> >& for_vec
= sin
->for_vec
;
1008 unsigned worklist_start
= 0;
1009 auto_vec
<simplify
*> worklist
;
1010 worklist
.safe_push (sin
);
1012 /* Lower each recorded for separately, operating on the
1013 set of simplifiers created by the previous one.
1014 Lower inner-to-outer so inner for substitutes can refer
1015 to operators replaced by outer fors. */
1016 for (int fi
= for_vec
.length () - 1; fi
>= 0; --fi
)
1018 vec
<user_id
*>& ids
= for_vec
[fi
];
1019 unsigned n_ids
= ids
.length ();
1020 unsigned max_n_opers
= 0;
1021 for (unsigned i
= 0; i
< n_ids
; ++i
)
1022 if (ids
[i
]->substitutes
.length () > max_n_opers
)
1023 max_n_opers
= ids
[i
]->substitutes
.length ();
1025 unsigned worklist_end
= worklist
.length ();
1026 for (unsigned si
= worklist_start
; si
< worklist_end
; ++si
)
1028 simplify
*s
= worklist
[si
];
1029 for (unsigned j
= 0; j
< max_n_opers
; ++j
)
1031 operand
*match_op
= s
->match
;
1032 operand
*result_op
= s
->result
;
1033 vec
<if_or_with
> ifexpr_vec
= s
->ifexpr_vec
.copy ();
1035 for (unsigned i
= 0; i
< n_ids
; ++i
)
1037 user_id
*id
= ids
[i
];
1038 id_base
*oper
= id
->substitutes
[j
% id
->substitutes
.length ()];
1039 match_op
= replace_id (match_op
, id
, oper
);
1041 result_op
= replace_id (result_op
, id
, oper
);
1042 for (unsigned k
= 0; k
< s
->ifexpr_vec
.length (); ++k
)
1043 ifexpr_vec
[k
].cexpr
= replace_id (ifexpr_vec
[k
].cexpr
,
1046 simplify
*ns
= new simplify (match_op
, s
->match_location
,
1047 result_op
, s
->result_location
,
1048 ifexpr_vec
, vNULL
, s
->capture_ids
);
1049 worklist
.safe_push (ns
);
1052 worklist_start
= worklist_end
;
1055 /* Copy out the result from the last for lowering. */
1056 for (unsigned i
= worklist_start
; i
< worklist
.length (); ++i
)
1057 simplifiers
.safe_push (worklist
[i
]);
1060 /* Lower the AST for everything in SIMPLIFIERS. */
1063 lower (vec
<simplify
*>& simplifiers
, bool gimple
)
1065 auto_vec
<simplify
*> out_simplifiers
;
1066 for (unsigned i
= 0; i
< simplifiers
.length (); ++i
)
1067 lower_opt_convert (simplifiers
[i
], out_simplifiers
);
1069 simplifiers
.truncate (0);
1070 for (unsigned i
= 0; i
< out_simplifiers
.length (); ++i
)
1071 lower_commutative (out_simplifiers
[i
], simplifiers
);
1073 out_simplifiers
.truncate (0);
1075 for (unsigned i
= 0; i
< simplifiers
.length (); ++i
)
1076 lower_cond (simplifiers
[i
], out_simplifiers
);
1078 out_simplifiers
.safe_splice (simplifiers
);
1081 simplifiers
.truncate (0);
1082 for (unsigned i
= 0; i
< out_simplifiers
.length (); ++i
)
1083 lower_for (out_simplifiers
[i
], simplifiers
);
1089 /* The decision tree built for generating GIMPLE and GENERIC pattern
1090 matching code. It represents the 'match' expression of all
1091 simplifies and has those as its leafs. */
1093 /* Decision tree base class, used for DT_TRUE and DT_NODE. */
1097 enum dt_type
{ DT_NODE
, DT_OPERAND
, DT_TRUE
, DT_MATCH
, DT_SIMPLIFY
};
1101 vec
<dt_node
*> kids
;
1103 dt_node (enum dt_type type_
): type (type_
), level (0), kids (vNULL
) {}
1105 dt_node
*append_node (dt_node
*);
1106 dt_node
*append_op (operand
*, dt_node
*parent
= 0, unsigned pos
= 0);
1107 dt_node
*append_true_op (dt_node
*parent
= 0, unsigned pos
= 0);
1108 dt_node
*append_match_op (dt_operand
*, dt_node
*parent
= 0, unsigned pos
= 0);
1109 dt_node
*append_simplify (simplify
*, unsigned, dt_operand
**);
1111 virtual void gen (FILE *, bool) {}
1113 void gen_kids (FILE *, bool);
1114 void gen_kids_1 (FILE *, bool,
1115 vec
<dt_operand
*>, vec
<dt_operand
*>, vec
<dt_operand
*>,
1116 vec
<dt_operand
*>, vec
<dt_operand
*>, vec
<dt_node
*>);
1119 /* Generic decision tree node used for DT_OPERAND and DT_MATCH. */
1121 struct dt_operand
: public dt_node
1124 dt_operand
*match_dop
;
1128 dt_operand (enum dt_type type
, operand
*op_
, dt_operand
*match_dop_
,
1129 dt_operand
*parent_
= 0, unsigned pos_
= 0)
1130 : dt_node (type
), op (op_
), match_dop (match_dop_
),
1131 parent (parent_
), pos (pos_
) {}
1133 void gen (FILE *, bool);
1134 unsigned gen_predicate (FILE *, const char *, bool);
1135 unsigned gen_match_op (FILE *, const char *);
1137 unsigned gen_gimple_expr (FILE *);
1138 unsigned gen_generic_expr (FILE *, const char *);
1140 char *get_name (char *);
1141 void gen_opname (char *, unsigned);
1144 /* Leaf node of the decision tree, used for DT_SIMPLIFY. */
1146 struct dt_simplify
: public dt_node
1149 unsigned pattern_no
;
1150 dt_operand
**indexes
;
1152 dt_simplify (simplify
*s_
, unsigned pattern_no_
, dt_operand
**indexes_
)
1153 : dt_node (DT_SIMPLIFY
), s (s_
), pattern_no (pattern_no_
),
1154 indexes (indexes_
) {}
1156 void gen (FILE *f
, bool);
1162 is_a_helper
<dt_operand
*>::test (dt_node
*n
)
1164 return (n
->type
== dt_node::DT_OPERAND
1165 || n
->type
== dt_node::DT_MATCH
);
1168 /* A container for the actual decision tree. */
1170 struct decision_tree
1174 void insert (struct simplify
*, unsigned);
1175 void gen_gimple (FILE *f
= stderr
);
1176 void gen_generic (FILE *f
= stderr
);
1177 void print (FILE *f
= stderr
);
1179 decision_tree () { root
= new dt_node (dt_node::DT_NODE
); }
1181 static dt_node
*insert_operand (dt_node
*, operand
*, dt_operand
**indexes
,
1182 unsigned pos
= 0, dt_node
*parent
= 0);
1183 static dt_node
*find_node (vec
<dt_node
*>&, dt_node
*);
1184 static bool cmp_node (dt_node
*, dt_node
*);
1185 static void print_node (dt_node
*, FILE *f
= stderr
, unsigned = 0);
1188 /* Compare two AST operands O1 and O2 and return true if they are equal. */
1191 cmp_operand (operand
*o1
, operand
*o2
)
1193 if (!o1
|| !o2
|| o1
->type
!= o2
->type
)
1196 if (o1
->type
== operand::OP_PREDICATE
)
1198 predicate
*p1
= as_a
<predicate
*>(o1
);
1199 predicate
*p2
= as_a
<predicate
*>(o2
);
1200 return p1
->p
== p2
->p
;
1202 else if (o1
->type
== operand::OP_EXPR
)
1204 expr
*e1
= static_cast<expr
*>(o1
);
1205 expr
*e2
= static_cast<expr
*>(o2
);
1206 return (e1
->operation
== e2
->operation
1207 && e1
->is_generic
== e2
->is_generic
);
1213 /* Compare two decision tree nodes N1 and N2 and return true if they
1217 decision_tree::cmp_node (dt_node
*n1
, dt_node
*n2
)
1219 if (!n1
|| !n2
|| n1
->type
!= n2
->type
)
1225 if (n1
->type
== dt_node::DT_TRUE
)
1228 if (n1
->type
== dt_node::DT_OPERAND
)
1229 return cmp_operand ((as_a
<dt_operand
*> (n1
))->op
,
1230 (as_a
<dt_operand
*> (n2
))->op
);
1231 else if (n1
->type
== dt_node::DT_MATCH
)
1232 return ((as_a
<dt_operand
*> (n1
))->match_dop
1233 == (as_a
<dt_operand
*> (n2
))->match_dop
);
1237 /* Search OPS for a decision tree node like P and return it if found. */
1240 decision_tree::find_node (vec
<dt_node
*>& ops
, dt_node
*p
)
1242 /* We can merge adjacent DT_TRUE. */
1243 if (p
->type
== dt_node::DT_TRUE
1245 && ops
.last ()->type
== dt_node::DT_TRUE
)
1247 for (int i
= ops
.length () - 1; i
>= 0; --i
)
1249 /* But we can't merge across DT_TRUE nodes as they serve as
1250 pattern order barriers to make sure that patterns apply
1251 in order of appearance in case multiple matches are possible. */
1252 if (ops
[i
]->type
== dt_node::DT_TRUE
)
1254 if (decision_tree::cmp_node (ops
[i
], p
))
1260 /* Append N to the decision tree if it there is not already an existing
1264 dt_node::append_node (dt_node
*n
)
1268 kid
= decision_tree::find_node (kids
, n
);
1273 n
->level
= this->level
+ 1;
1278 /* Append OP to the decision tree. */
1281 dt_node::append_op (operand
*op
, dt_node
*parent
, unsigned pos
)
1283 dt_operand
*parent_
= safe_as_a
<dt_operand
*> (parent
);
1284 dt_operand
*n
= new dt_operand (DT_OPERAND
, op
, 0, parent_
, pos
);
1285 return append_node (n
);
1288 /* Append a DT_TRUE decision tree node. */
1291 dt_node::append_true_op (dt_node
*parent
, unsigned pos
)
1293 dt_operand
*parent_
= safe_as_a
<dt_operand
*> (parent
);
1294 dt_operand
*n
= new dt_operand (DT_TRUE
, 0, 0, parent_
, pos
);
1295 return append_node (n
);
1298 /* Append a DT_MATCH decision tree node. */
1301 dt_node::append_match_op (dt_operand
*match_dop
, dt_node
*parent
, unsigned pos
)
1303 dt_operand
*parent_
= as_a
<dt_operand
*> (parent
);
1304 dt_operand
*n
= new dt_operand (DT_MATCH
, 0, match_dop
, parent_
, pos
);
1305 return append_node (n
);
1308 /* Append S to the decision tree. */
1311 dt_node::append_simplify (simplify
*s
, unsigned pattern_no
,
1312 dt_operand
**indexes
)
1314 dt_simplify
*n
= new dt_simplify (s
, pattern_no
, indexes
);
1315 return append_node (n
);
1318 /* Insert O into the decision tree and return the decision tree node found
1322 decision_tree::insert_operand (dt_node
*p
, operand
*o
, dt_operand
**indexes
,
1323 unsigned pos
, dt_node
*parent
)
1325 dt_node
*q
, *elm
= 0;
1327 if (capture
*c
= dyn_cast
<capture
*> (o
))
1329 unsigned capt_index
= c
->where
;
1331 if (indexes
[capt_index
] == 0)
1334 q
= insert_operand (p
, c
->what
, indexes
, pos
, parent
);
1337 q
= elm
= p
->append_true_op (parent
, pos
);
1340 // get to the last capture
1341 for (operand
*what
= c
->what
;
1342 what
&& is_a
<capture
*> (what
);
1343 c
= as_a
<capture
*> (what
), what
= c
->what
)
1348 unsigned cc_index
= c
->where
;
1349 dt_operand
*match_op
= indexes
[cc_index
];
1351 dt_operand
temp (dt_node::DT_TRUE
, 0, 0);
1352 elm
= decision_tree::find_node (p
->kids
, &temp
);
1356 dt_operand
temp (dt_node::DT_MATCH
, 0, match_op
);
1357 elm
= decision_tree::find_node (p
->kids
, &temp
);
1362 dt_operand
temp (dt_node::DT_OPERAND
, c
->what
, 0);
1363 elm
= decision_tree::find_node (p
->kids
, &temp
);
1367 gcc_assert (elm
->type
== dt_node::DT_TRUE
1368 || elm
->type
== dt_node::DT_OPERAND
1369 || elm
->type
== dt_node::DT_MATCH
);
1370 indexes
[capt_index
] = static_cast<dt_operand
*> (elm
);
1375 p
= p
->append_match_op (indexes
[capt_index
], parent
, pos
);
1377 return insert_operand (p
, c
->what
, indexes
, 0, p
);
1382 p
= p
->append_op (o
, parent
, pos
);
1385 if (expr
*e
= dyn_cast
<expr
*>(o
))
1387 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1388 q
= decision_tree::insert_operand (q
, e
->ops
[i
], indexes
, i
, p
);
1394 /* Insert S into the decision tree. */
1397 decision_tree::insert (struct simplify
*s
, unsigned pattern_no
)
1399 dt_operand
**indexes
= XCNEWVEC (dt_operand
*, s
->capture_max
+ 1);
1400 dt_node
*p
= decision_tree::insert_operand (root
, s
->match
, indexes
);
1401 p
->append_simplify (s
, pattern_no
, indexes
);
1404 /* Debug functions to dump the decision tree. */
1407 decision_tree::print_node (dt_node
*p
, FILE *f
, unsigned indent
)
1409 if (p
->type
== dt_node::DT_NODE
)
1410 fprintf (f
, "root");
1414 for (unsigned i
= 0; i
< indent
; i
++)
1417 if (p
->type
== dt_node::DT_OPERAND
)
1419 dt_operand
*dop
= static_cast<dt_operand
*>(p
);
1420 print_operand (dop
->op
, f
, true);
1422 else if (p
->type
== dt_node::DT_TRUE
)
1423 fprintf (f
, "true");
1424 else if (p
->type
== dt_node::DT_MATCH
)
1425 fprintf (f
, "match (%p)", (void *)((as_a
<dt_operand
*>(p
))->match_dop
));
1426 else if (p
->type
== dt_node::DT_SIMPLIFY
)
1428 dt_simplify
*s
= static_cast<dt_simplify
*> (p
);
1429 fprintf (f
, "simplify_%u { ", s
->pattern_no
);
1430 for (int i
= 0; i
<= s
->s
->capture_max
; ++i
)
1431 fprintf (f
, "%p, ", (void *) s
->indexes
[i
]);
1436 fprintf (stderr
, " (%p), %u, %u\n", (void *) p
, p
->level
, p
->kids
.length ());
1438 for (unsigned i
= 0; i
< p
->kids
.length (); ++i
)
1439 decision_tree::print_node (p
->kids
[i
], f
, indent
+ 2);
1443 decision_tree::print (FILE *f
)
1445 return decision_tree::print_node (root
, f
);
1449 /* For GENERIC we have to take care of wrapping multiple-used
1450 expressions with side-effects in save_expr and preserve side-effects
1451 of expressions with omit_one_operand. Analyze captures in
1452 match, result and with expressions and perform early-outs
1453 on the outermost match expression operands for cases we cannot
1458 capture_info (simplify
*s
);
1459 void walk_match (operand
*o
, unsigned toplevel_arg
, bool, bool);
1460 void walk_result (operand
*o
, bool);
1461 void walk_c_expr (c_expr
*);
1467 bool force_no_side_effects_p
;
1468 bool cond_expr_cond_p
;
1469 unsigned long toplevel_msk
;
1470 int result_use_count
;
1473 auto_vec
<cinfo
> info
;
1474 unsigned long force_no_side_effects
;
1477 /* Analyze captures in S. */
1479 capture_info::capture_info (simplify
*s
)
1483 || ((e
= dyn_cast
<expr
*> (s
->result
))
1484 && is_a
<predicate_id
*> (e
->operation
)))
1486 force_no_side_effects
= -1;
1490 force_no_side_effects
= 0;
1491 info
.safe_grow_cleared (s
->capture_max
+ 1);
1492 e
= as_a
<expr
*> (s
->match
);
1493 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1494 walk_match (e
->ops
[i
], i
,
1495 (i
!= 0 && *e
->operation
== COND_EXPR
)
1496 || *e
->operation
== TRUTH_ANDIF_EXPR
1497 || *e
->operation
== TRUTH_ORIF_EXPR
,
1499 && (*e
->operation
== COND_EXPR
1500 || *e
->operation
== VEC_COND_EXPR
));
1502 walk_result (s
->result
, false);
1504 for (unsigned i
= 0; i
< s
->ifexpr_vec
.length (); ++i
)
1505 if (s
->ifexpr_vec
[i
].is_with
)
1506 walk_c_expr (as_a
<c_expr
*>(s
->ifexpr_vec
[i
].cexpr
));
1509 /* Analyze captures in the match expression piece O. */
1512 capture_info::walk_match (operand
*o
, unsigned toplevel_arg
,
1513 bool conditional_p
, bool cond_expr_cond_p
)
1515 if (capture
*c
= dyn_cast
<capture
*> (o
))
1517 info
[c
->where
].toplevel_msk
|= 1 << toplevel_arg
;
1518 info
[c
->where
].force_no_side_effects_p
|= conditional_p
;
1519 info
[c
->where
].cond_expr_cond_p
|= cond_expr_cond_p
;
1520 /* Mark expr (non-leaf) captures and recurse. */
1522 && is_a
<expr
*> (c
->what
))
1524 info
[c
->where
].expr_p
= true;
1525 walk_match (c
->what
, toplevel_arg
, conditional_p
, false);
1528 else if (expr
*e
= dyn_cast
<expr
*> (o
))
1530 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1532 bool cond_p
= conditional_p
;
1533 bool cond_expr_cond_p
= false;
1534 if (i
!= 0 && *e
->operation
== COND_EXPR
)
1536 else if (*e
->operation
== TRUTH_ANDIF_EXPR
1537 || *e
->operation
== TRUTH_ORIF_EXPR
)
1540 && (*e
->operation
== COND_EXPR
1541 || *e
->operation
== VEC_COND_EXPR
))
1542 cond_expr_cond_p
= true;
1543 walk_match (e
->ops
[i
], toplevel_arg
, cond_p
, cond_expr_cond_p
);
1546 else if (is_a
<predicate
*> (o
))
1548 /* Mark non-captured leafs toplevel arg for checking. */
1549 force_no_side_effects
|= 1 << toplevel_arg
;
1555 /* Analyze captures in the result expression piece O. */
1558 capture_info::walk_result (operand
*o
, bool conditional_p
)
1560 if (capture
*c
= dyn_cast
<capture
*> (o
))
1562 info
[c
->where
].result_use_count
++;
1563 /* If we substitute an expression capture we don't know
1564 which captures this will end up using (well, we don't
1565 compute that). Force the uses to be side-effect free
1566 which means forcing the toplevels that reach the
1567 expression side-effect free. */
1568 if (info
[c
->where
].expr_p
)
1569 force_no_side_effects
|= info
[c
->where
].toplevel_msk
;
1570 /* Mark CSE capture capture uses as forced to have
1573 && is_a
<expr
*> (c
->what
))
1575 info
[c
->where
].cse_p
= true;
1576 walk_result (c
->what
, true);
1579 else if (expr
*e
= dyn_cast
<expr
*> (o
))
1581 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1583 bool cond_p
= conditional_p
;
1584 if (i
!= 0 && *e
->operation
== COND_EXPR
)
1586 else if (*e
->operation
== TRUTH_ANDIF_EXPR
1587 || *e
->operation
== TRUTH_ORIF_EXPR
)
1589 walk_result (e
->ops
[i
], cond_p
);
1592 else if (c_expr
*e
= dyn_cast
<c_expr
*> (o
))
1598 /* Look for captures in the C expr E. */
1601 capture_info::walk_c_expr (c_expr
*e
)
1603 /* Give up for C exprs mentioning captures not inside TREE_TYPE (). */
1604 unsigned p_depth
= 0;
1605 for (unsigned i
= 0; i
< e
->code
.length (); ++i
)
1607 const cpp_token
*t
= &e
->code
[i
];
1608 const cpp_token
*n
= i
< e
->code
.length () - 1 ? &e
->code
[i
+1] : NULL
;
1609 if (t
->type
== CPP_NAME
1610 && strcmp ((const char *)CPP_HASHNODE
1611 (t
->val
.node
.node
)->ident
.str
, "TREE_TYPE") == 0
1612 && n
->type
== CPP_OPEN_PAREN
)
1614 else if (t
->type
== CPP_CLOSE_PAREN
1617 else if (p_depth
== 0
1618 && t
->type
== CPP_ATSIGN
1619 && (n
->type
== CPP_NUMBER
1620 || n
->type
== CPP_NAME
)
1621 && !(n
->flags
& PREV_WHITE
))
1624 if (n
->type
== CPP_NUMBER
)
1625 id
= (const char *)n
->val
.str
.text
;
1627 id
= (const char *)CPP_HASHNODE (n
->val
.node
.node
)->ident
.str
;
1628 info
[*e
->capture_ids
->get(id
)].force_no_side_effects_p
= true;
1634 /* Code generation off the decision tree and the refered AST nodes. */
1637 is_conversion (id_base
*op
)
1639 return (*op
== CONVERT_EXPR
1641 || *op
== FLOAT_EXPR
1642 || *op
== FIX_TRUNC_EXPR
1643 || *op
== VIEW_CONVERT_EXPR
);
1646 /* Get the type to be used for generating operands of OP from the
1650 get_operand_type (id_base
*op
, const char *in_type
,
1651 const char *expr_type
,
1652 const char *other_oprnd_type
)
1654 /* Generally operands whose type does not match the type of the
1655 expression generated need to know their types but match and
1656 thus can fall back to 'other_oprnd_type'. */
1657 if (is_conversion (op
))
1658 return other_oprnd_type
;
1659 else if (*op
== REALPART_EXPR
1660 || *op
== IMAGPART_EXPR
)
1661 return other_oprnd_type
;
1662 else if (is_a
<operator_id
*> (op
)
1663 && strcmp (as_a
<operator_id
*> (op
)->tcc
, "tcc_comparison") == 0)
1664 return other_oprnd_type
;
1667 /* Otherwise all types should match - choose one in order of
1674 return other_oprnd_type
;
1678 /* Generate transform code for an expression. */
1681 expr::gen_transform (FILE *f
, const char *dest
, bool gimple
, int depth
,
1682 const char *in_type
, capture_info
*cinfo
,
1683 dt_operand
**indexes
, bool)
1685 bool conversion_p
= is_conversion (operation
);
1686 const char *type
= expr_type
;
1689 /* If there was a type specification in the pattern use it. */
1691 else if (conversion_p
)
1692 /* For conversions we need to build the expression using the
1693 outer type passed in. */
1695 else if (*operation
== REALPART_EXPR
1696 || *operation
== IMAGPART_EXPR
)
1698 /* __real and __imag use the component type of its operand. */
1699 sprintf (optype
, "TREE_TYPE (TREE_TYPE (ops%d[0]))", depth
);
1702 else if (is_a
<operator_id
*> (operation
)
1703 && !strcmp (as_a
<operator_id
*> (operation
)->tcc
, "tcc_comparison"))
1705 /* comparisons use boolean_type_node (or what gets in), but
1706 their operands need to figure out the types themselves. */
1707 sprintf (optype
, "boolean_type_node");
1712 /* Other operations are of the same type as their first operand. */
1713 sprintf (optype
, "TREE_TYPE (ops%d[0])", depth
);
1717 fatal ("two conversions in a row");
1720 fprintf (f
, " tree ops%d[%u], res;\n", depth
, ops
.length ());
1722 snprintf (op0type
, 64, "TREE_TYPE (ops%d[0])", depth
);
1723 for (unsigned i
= 0; i
< ops
.length (); ++i
)
1726 snprintf (dest
, 32, " ops%d[%u]", depth
, i
);
1728 = get_operand_type (operation
, in_type
, expr_type
,
1729 i
== 0 ? NULL
: op0type
);
1730 ops
[i
]->gen_transform (f
, dest
, gimple
, depth
+ 1, optype
, cinfo
, indexes
,
1731 ((!(*operation
== COND_EXPR
)
1732 && !(*operation
== VEC_COND_EXPR
))
1737 if (*operation
== CONVERT_EXPR
)
1740 opr
= operation
->id
;
1744 /* ??? Have another helper that is like gimple_build but may
1745 fail if seq == NULL. */
1746 fprintf (f
, " if (!seq)\n"
1748 " res = gimple_simplify (%s, %s", opr
, type
);
1749 for (unsigned i
= 0; i
< ops
.length (); ++i
)
1750 fprintf (f
, ", ops%d[%u]", depth
, i
);
1751 fprintf (f
, ", seq, valueize);\n");
1752 fprintf (f
, " if (!res) return false;\n");
1753 fprintf (f
, " }\n");
1754 fprintf (f
, " else\n");
1755 fprintf (f
, " res = gimple_build (seq, UNKNOWN_LOCATION, %s, %s",
1757 for (unsigned i
= 0; i
< ops
.length (); ++i
)
1758 fprintf (f
, ", ops%d[%u]", depth
, i
);
1759 fprintf (f
, ", valueize);\n");
1763 if (operation
->kind
== id_base::CODE
)
1764 fprintf (f
, " res = fold_build%d_loc (loc, %s, %s",
1765 ops
.length(), opr
, type
);
1767 fprintf (f
, " res = build_call_expr_loc (loc, "
1768 "builtin_decl_implicit (%s), %d", opr
, ops
.length());
1769 for (unsigned i
= 0; i
< ops
.length (); ++i
)
1770 fprintf (f
, ", ops%d[%u]", depth
, i
);
1771 fprintf (f
, ");\n");
1773 fprintf (f
, " %s = res;\n", dest
);
1777 /* Generate code for a c_expr which is either the expression inside
1778 an if statement or a sequence of statements which computes a
1779 result to be stored to DEST. */
1782 c_expr::gen_transform (FILE *f
, const char *dest
,
1783 bool, int, const char *, capture_info
*,
1784 dt_operand
**, bool)
1786 if (dest
&& nr_stmts
== 1)
1787 fprintf (f
, "%s = ", dest
);
1789 unsigned stmt_nr
= 1;
1790 for (unsigned i
= 0; i
< code
.length (); ++i
)
1792 const cpp_token
*token
= &code
[i
];
1794 /* Replace captures for code-gen. */
1795 if (token
->type
== CPP_ATSIGN
)
1797 const cpp_token
*n
= &code
[i
+1];
1798 if ((n
->type
== CPP_NUMBER
1799 || n
->type
== CPP_NAME
)
1800 && !(n
->flags
& PREV_WHITE
))
1802 if (token
->flags
& PREV_WHITE
)
1805 if (n
->type
== CPP_NUMBER
)
1806 id
= (const char *)n
->val
.str
.text
;
1808 id
= (const char *)CPP_HASHNODE (n
->val
.node
.node
)->ident
.str
;
1809 fprintf (f
, "captures[%u]", *capture_ids
->get(id
));
1815 if (token
->flags
& PREV_WHITE
)
1818 if (token
->type
== CPP_NAME
)
1820 const char *id
= (const char *) NODE_NAME (token
->val
.node
.node
);
1822 for (j
= 0; j
< ids
.length (); ++j
)
1824 if (strcmp (id
, ids
[j
].id
) == 0)
1826 fprintf (f
, "%s", ids
[j
].oper
);
1830 if (j
< ids
.length ())
1834 /* Output the token as string. */
1835 char *tk
= (char *)cpp_token_as_text (r
, token
);
1838 if (token
->type
== CPP_SEMICOLON
)
1841 if (dest
&& stmt_nr
== nr_stmts
)
1842 fprintf (f
, "\n %s = ", dest
);
1849 /* Generate transform code for a capture. */
1852 capture::gen_transform (FILE *f
, const char *dest
, bool gimple
, int depth
,
1853 const char *in_type
, capture_info
*cinfo
,
1854 dt_operand
**indexes
, bool expand_compares
)
1856 if (what
&& is_a
<expr
*> (what
))
1858 if (indexes
[where
] == 0)
1861 sprintf (buf
, "captures[%u]", where
);
1862 what
->gen_transform (f
, buf
, gimple
, depth
, in_type
, cinfo
, NULL
);
1866 fprintf (f
, "%s = captures[%u];\n", dest
, where
);
1868 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
1869 with substituting a capture of that.
1870 ??? Returning false here will also not allow any other patterns
1872 if (gimple
&& expand_compares
1873 && cinfo
->info
[where
].cond_expr_cond_p
)
1874 fprintf (f
, "if (COMPARISON_CLASS_P (%s))\n"
1876 " if (!seq) return false;\n"
1877 " %s = gimple_build (seq, TREE_CODE (%s),"
1878 " TREE_TYPE (%s), TREE_OPERAND (%s, 0),"
1879 " TREE_OPERAND (%s, 1));\n"
1880 " }\n", dest
, dest
, dest
, dest
, dest
, dest
);
1883 /* Return the name of the operand representing the decision tree node.
1884 Use NAME as space to generate it. */
1887 dt_operand::get_name (char *name
)
1890 sprintf (name
, "t");
1891 else if (parent
->level
== 1)
1892 sprintf (name
, "op%u", pos
);
1893 else if (parent
->type
== dt_node::DT_MATCH
)
1894 return parent
->get_name (name
);
1896 sprintf (name
, "o%u%u", parent
->level
, pos
);
1900 /* Fill NAME with the operand name at position POS. */
1903 dt_operand::gen_opname (char *name
, unsigned pos
)
1906 sprintf (name
, "op%u", pos
);
1908 sprintf (name
, "o%u%u", level
, pos
);
1911 /* Generate matching code for the decision tree operand which is
1915 dt_operand::gen_predicate (FILE *f
, const char *opname
, bool gimple
)
1917 predicate
*p
= as_a
<predicate
*> (op
);
1919 if (p
->p
->matchers
.exists ())
1921 /* If this is a predicate generated from a pattern mangle its
1922 name and pass on the valueize hook. */
1924 fprintf (f
, "if (gimple_%s (%s, valueize))\n", p
->p
->id
, opname
);
1926 fprintf (f
, "if (tree_%s (%s))\n", p
->p
->id
, opname
);
1929 fprintf (f
, "if (%s (%s))\n", p
->p
->id
, opname
);
1934 /* Generate matching code for the decision tree operand which is
1938 dt_operand::gen_match_op (FILE *f
, const char *opname
)
1940 char match_opname
[20];
1941 match_dop
->get_name (match_opname
);
1942 fprintf (f
, "if (%s == %s || operand_equal_p (%s, %s, 0))\n",
1943 opname
, match_opname
, opname
, match_opname
);
1948 /* Generate GIMPLE matching code for the decision tree operand. */
1951 dt_operand::gen_gimple_expr (FILE *f
)
1953 expr
*e
= static_cast<expr
*> (op
);
1954 id_base
*id
= e
->operation
;
1955 unsigned n_ops
= e
->ops
.length ();
1957 for (unsigned i
= 0; i
< n_ops
; ++i
)
1959 char child_opname
[20];
1960 gen_opname (child_opname
, i
);
1962 if (id
->kind
== id_base::CODE
)
1965 || *id
== REALPART_EXPR
|| *id
== IMAGPART_EXPR
1966 || *id
== BIT_FIELD_REF
|| *id
== VIEW_CONVERT_EXPR
)
1968 /* ??? If this is a memory operation we can't (and should not)
1969 match this. The only sensible operand types are
1970 SSA names and invariants. */
1971 fprintf (f
, "tree %s = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), %i);\n",
1973 fprintf (f
, "if ((TREE_CODE (%s) == SSA_NAME\n"
1974 "|| is_gimple_min_invariant (%s))\n"
1975 "&& (%s = do_valueize (valueize, %s)))\n"
1976 "{\n", child_opname
, child_opname
, child_opname
,
1981 fprintf (f
, "tree %s = gimple_assign_rhs%u (def_stmt);\n",
1982 child_opname
, i
+ 1);
1985 fprintf (f
, "tree %s = gimple_call_arg (def_stmt, %u);\n",
1987 fprintf (f
, "if ((%s = do_valueize (valueize, %s)))\n",
1988 child_opname
, child_opname
);
1995 /* Generate GENERIC matching code for the decision tree operand. */
1998 dt_operand::gen_generic_expr (FILE *f
, const char *opname
)
2000 expr
*e
= static_cast<expr
*> (op
);
2001 unsigned n_ops
= e
->ops
.length ();
2003 for (unsigned i
= 0; i
< n_ops
; ++i
)
2005 char child_opname
[20];
2006 gen_opname (child_opname
, i
);
2008 if (e
->operation
->kind
== id_base::CODE
)
2009 fprintf (f
, "tree %s = TREE_OPERAND (%s, %u);\n",
2010 child_opname
, opname
, i
);
2012 fprintf (f
, "tree %s = CALL_EXPR_ARG (%s, %u);\n",
2013 child_opname
, opname
, i
);
2019 /* Generate matching code for the children of the decision tree node. */
2022 dt_node::gen_kids (FILE *f
, bool gimple
)
2024 auto_vec
<dt_operand
*> gimple_exprs
;
2025 auto_vec
<dt_operand
*> generic_exprs
;
2026 auto_vec
<dt_operand
*> fns
;
2027 auto_vec
<dt_operand
*> generic_fns
;
2028 auto_vec
<dt_operand
*> preds
;
2029 auto_vec
<dt_node
*> others
;
2031 for (unsigned i
= 0; i
< kids
.length (); ++i
)
2033 if (kids
[i
]->type
== dt_node::DT_OPERAND
)
2035 dt_operand
*op
= as_a
<dt_operand
*> (kids
[i
]);
2036 if (expr
*e
= dyn_cast
<expr
*> (op
->op
))
2038 if (e
->ops
.length () == 0
2039 && (!gimple
|| !(*e
->operation
== CONSTRUCTOR
)))
2040 generic_exprs
.safe_push (op
);
2041 else if (e
->operation
->kind
== id_base::FN
)
2046 generic_fns
.safe_push (op
);
2048 else if (e
->operation
->kind
== id_base::PREDICATE
)
2049 preds
.safe_push (op
);
2053 gimple_exprs
.safe_push (op
);
2055 generic_exprs
.safe_push (op
);
2058 else if (op
->op
->type
== operand::OP_PREDICATE
)
2059 others
.safe_push (kids
[i
]);
2063 else if (kids
[i
]->type
== dt_node::DT_MATCH
2064 || kids
[i
]->type
== dt_node::DT_SIMPLIFY
)
2065 others
.safe_push (kids
[i
]);
2066 else if (kids
[i
]->type
== dt_node::DT_TRUE
)
2068 /* A DT_TRUE operand serves as a barrier - generate code now
2069 for what we have collected sofar. */
2070 gen_kids_1 (f
, gimple
, gimple_exprs
, generic_exprs
,
2071 fns
, generic_fns
, preds
, others
);
2072 /* And output the true operand itself. */
2073 kids
[i
]->gen (f
, gimple
);
2074 gimple_exprs
.truncate (0);
2075 generic_exprs
.truncate (0);
2077 generic_fns
.truncate (0);
2079 others
.truncate (0);
2085 /* Generate code for the remains. */
2086 gen_kids_1 (f
, gimple
, gimple_exprs
, generic_exprs
,
2087 fns
, generic_fns
, preds
, others
);
2090 /* Generate matching code for the children of the decision tree node. */
2093 dt_node::gen_kids_1 (FILE *f
, bool gimple
,
2094 vec
<dt_operand
*> gimple_exprs
,
2095 vec
<dt_operand
*> generic_exprs
,
2096 vec
<dt_operand
*> fns
,
2097 vec
<dt_operand
*> generic_fns
,
2098 vec
<dt_operand
*> preds
,
2099 vec
<dt_node
*> others
)
2102 char *kid_opname
= buf
;
2104 unsigned exprs_len
= gimple_exprs
.length ();
2105 unsigned gexprs_len
= generic_exprs
.length ();
2106 unsigned fns_len
= fns
.length ();
2107 unsigned gfns_len
= generic_fns
.length ();
2109 if (exprs_len
|| fns_len
|| gexprs_len
|| gfns_len
)
2112 gimple_exprs
[0]->get_name (kid_opname
);
2114 fns
[0]->get_name (kid_opname
);
2116 generic_fns
[0]->get_name (kid_opname
);
2118 generic_exprs
[0]->get_name (kid_opname
);
2120 fprintf (f
, "switch (TREE_CODE (%s))\n"
2124 if (exprs_len
|| fns_len
)
2126 fprintf (f
, "case SSA_NAME:\n");
2127 fprintf (f
, "if (do_valueize (valueize, %s) != NULL_TREE)\n", kid_opname
);
2129 fprintf (f
, "gimple def_stmt = SSA_NAME_DEF_STMT (%s);\n", kid_opname
);
2133 fprintf (f
, "if (is_gimple_assign (def_stmt))\n");
2134 fprintf (f
, "switch (gimple_assign_rhs_code (def_stmt))\n"
2136 for (unsigned i
= 0; i
< exprs_len
; ++i
)
2138 expr
*e
= as_a
<expr
*> (gimple_exprs
[i
]->op
);
2139 id_base
*op
= e
->operation
;
2140 if (*op
== CONVERT_EXPR
|| *op
== NOP_EXPR
)
2141 fprintf (f
, "CASE_CONVERT:\n");
2143 fprintf (f
, "case %s:\n", op
->id
);
2145 gimple_exprs
[i
]->gen (f
, true);
2146 fprintf (f
, "break;\n"
2149 fprintf (f
, "default:;\n"
2156 fprintf (f
, "else ");
2158 fprintf (f
, "if (gimple_call_builtin_p (def_stmt, BUILT_IN_NORMAL))\n"
2160 "tree fndecl = gimple_call_fndecl (def_stmt);\n"
2161 "switch (DECL_FUNCTION_CODE (fndecl))\n"
2164 for (unsigned i
= 0; i
< fns_len
; ++i
)
2166 expr
*e
= as_a
<expr
*>(fns
[i
]->op
);
2167 fprintf (f
, "case %s:\n"
2168 "{\n", e
->operation
->id
);
2169 fns
[i
]->gen (f
, true);
2170 fprintf (f
, "break;\n"
2174 fprintf (f
, "default:;\n"
2183 for (unsigned i
= 0; i
< generic_exprs
.length (); ++i
)
2185 expr
*e
= as_a
<expr
*>(generic_exprs
[i
]->op
);
2186 id_base
*op
= e
->operation
;
2187 if (*op
== CONVERT_EXPR
|| *op
== NOP_EXPR
)
2188 fprintf (f
, "CASE_CONVERT:\n");
2190 fprintf (f
, "case %s:\n", op
->id
);
2192 generic_exprs
[i
]->gen (f
, gimple
);
2193 fprintf (f
, "break;\n"
2199 fprintf (f
, "case CALL_EXPR:\n"
2201 "tree fndecl = get_callee_fndecl (%s);\n"
2202 "if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)\n"
2203 "switch (DECL_FUNCTION_CODE (fndecl))\n"
2206 for (unsigned j
= 0; j
< generic_fns
.length (); ++j
)
2208 expr
*e
= as_a
<expr
*>(generic_fns
[j
]->op
);
2209 gcc_assert (e
->operation
->kind
== id_base::FN
);
2211 fprintf (f
, "case %s:\n"
2212 "{\n", e
->operation
->id
);
2213 generic_fns
[j
]->gen (f
, false);
2214 fprintf (f
, "break;\n"
2218 fprintf (f
, "default:;\n"
2224 /* Close switch (TREE_CODE ()). */
2225 if (exprs_len
|| fns_len
|| gexprs_len
|| gfns_len
)
2226 fprintf (f
, "default:;\n"
2229 for (unsigned i
= 0; i
< preds
.length (); ++i
)
2231 expr
*e
= as_a
<expr
*> (preds
[i
]->op
);
2232 predicate_id
*p
= as_a
<predicate_id
*> (e
->operation
);
2233 preds
[i
]->get_name (kid_opname
);
2234 fprintf (f
, "tree %s_pops[%d];\n", kid_opname
, p
->nargs
);
2235 fprintf (f
, "if (%s_%s (%s, %s_pops%s))\n",
2236 gimple
? "gimple" : "tree",
2237 p
->id
, kid_opname
, kid_opname
,
2238 gimple
? ", valueize" : "");
2240 for (int j
= 0; j
< p
->nargs
; ++j
)
2242 char child_opname
[20];
2243 preds
[i
]->gen_opname (child_opname
, j
);
2244 fprintf (f
, "tree %s = %s_pops[%d];\n", child_opname
, kid_opname
, j
);
2246 preds
[i
]->gen_kids (f
, gimple
);
2250 for (unsigned i
= 0; i
< others
.length (); ++i
)
2251 others
[i
]->gen (f
, gimple
);
2254 /* Generate matching code for the decision tree operand. */
2257 dt_operand::gen (FILE *f
, bool gimple
)
2262 unsigned n_braces
= 0;
2264 if (type
== DT_OPERAND
)
2267 case operand::OP_PREDICATE
:
2268 n_braces
= gen_predicate (f
, opname
, gimple
);
2271 case operand::OP_EXPR
:
2273 n_braces
= gen_gimple_expr (f
);
2275 n_braces
= gen_generic_expr (f
, opname
);
2281 else if (type
== DT_TRUE
)
2283 else if (type
== DT_MATCH
)
2284 n_braces
= gen_match_op (f
, opname
);
2288 gen_kids (f
, gimple
);
2290 for (unsigned i
= 0; i
< n_braces
; ++i
)
2296 /* Generate code for the '(if ...)', '(with ..)' and actual transform
2297 step of a '(simplify ...)' or '(match ...)'. This handles everything
2298 that is not part of the decision tree (simplify->match). */
2301 dt_simplify::gen (FILE *f
, bool gimple
)
2304 output_line_directive (f
, s
->result_location
);
2305 if (s
->capture_max
>= 0)
2306 fprintf (f
, "tree captures[%u] ATTRIBUTE_UNUSED = {};\n",
2307 s
->capture_max
+ 1);
2309 for (int i
= 0; i
<= s
->capture_max
; ++i
)
2313 fprintf (f
, "captures[%u] = %s;\n", i
, indexes
[i
]->get_name (opname
));
2316 unsigned n_braces
= 0;
2317 if (s
->ifexpr_vec
!= vNULL
)
2319 for (unsigned i
= 0; i
< s
->ifexpr_vec
.length (); ++i
)
2321 if_or_with
&w
= s
->ifexpr_vec
[i
];
2325 output_line_directive (f
, w
.location
);
2326 w
.cexpr
->gen_transform (f
, NULL
, true, 1, "type", NULL
);
2331 output_line_directive (f
, w
.location
);
2332 fprintf (f
, "if (");
2333 if (i
== s
->ifexpr_vec
.length () - 1
2334 || s
->ifexpr_vec
[i
+1].is_with
)
2335 w
.cexpr
->gen_transform (f
, NULL
, true, 1, "type", NULL
);
2344 output_line_directive (f
, s
->ifexpr_vec
[j
].location
);
2348 s
->ifexpr_vec
[j
].cexpr
->gen_transform (f
, NULL
,
2354 while (j
< s
->ifexpr_vec
.length ()
2355 && !s
->ifexpr_vec
[j
].is_with
);
2365 /* Analyze captures and perform early-outs on the incoming arguments
2366 that cover cases we cannot handle. */
2367 capture_info
cinfo (s
);
2371 && !((e
= dyn_cast
<expr
*> (s
->result
))
2372 && is_a
<predicate_id
*> (e
->operation
)))
2374 for (unsigned i
= 0; i
< as_a
<expr
*> (s
->match
)->ops
.length (); ++i
)
2375 if (cinfo
.force_no_side_effects
& (1 << i
))
2376 fprintf (f
, "if (TREE_SIDE_EFFECTS (op%d)) return NULL_TREE;\n", i
);
2377 for (int i
= 0; i
<= s
->capture_max
; ++i
)
2378 if (cinfo
.info
[i
].cse_p
)
2380 else if (cinfo
.info
[i
].force_no_side_effects_p
2381 && (cinfo
.info
[i
].toplevel_msk
2382 & cinfo
.force_no_side_effects
) == 0)
2383 fprintf (f
, "if (TREE_SIDE_EFFECTS (captures[%d])) "
2384 "return NULL_TREE;\n", i
);
2385 else if ((cinfo
.info
[i
].toplevel_msk
2386 & cinfo
.force_no_side_effects
) != 0)
2387 /* Mark capture as having no side-effects if we had to verify
2388 that via forced toplevel operand checks. */
2389 cinfo
.info
[i
].force_no_side_effects_p
= true;
2392 fprintf (f
, "if (dump_file && (dump_flags & TDF_DETAILS)) "
2393 "fprintf (dump_file, \"Applying pattern ");
2394 output_line_directive (f
, s
->result_location
, true);
2395 fprintf (f
, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
2397 operand
*result
= s
->result
;
2400 /* If there is no result then this is a predicate implementation. */
2401 fprintf (f
, "return true;\n");
2405 /* For GIMPLE simply drop NON_LVALUE_EXPR (which only appears
2406 in outermost position). */
2407 if (result
->type
== operand::OP_EXPR
2408 && *as_a
<expr
*> (result
)->operation
== NON_LVALUE_EXPR
)
2409 result
= as_a
<expr
*> (result
)->ops
[0];
2410 if (result
->type
== operand::OP_EXPR
)
2412 expr
*e
= as_a
<expr
*> (result
);
2413 bool is_predicate
= is_a
<predicate_id
*> (e
->operation
);
2415 fprintf (f
, "*res_code = %s;\n",
2416 *e
->operation
== CONVERT_EXPR
2417 ? "NOP_EXPR" : e
->operation
->id
);
2418 for (unsigned j
= 0; j
< e
->ops
.length (); ++j
)
2421 snprintf (dest
, 32, " res_ops[%d]", j
);
2423 = get_operand_type (e
->operation
,
2424 "type", e
->expr_type
,
2426 ? NULL
: "TREE_TYPE (res_ops[0])");
2427 /* We need to expand GENERIC conditions we captured from
2429 bool expand_generic_cond_exprs_p
2431 /* But avoid doing that if the GENERIC condition is
2432 valid - which it is in the first operand of COND_EXPRs
2433 and VEC_COND_EXRPs. */
2434 && ((!(*e
->operation
== COND_EXPR
)
2435 && !(*e
->operation
== VEC_COND_EXPR
))
2437 e
->ops
[j
]->gen_transform (f
, dest
, true, 1, optype
, &cinfo
,
2438 indexes
, expand_generic_cond_exprs_p
);
2441 /* Re-fold the toplevel result. It's basically an embedded
2442 gimple_build w/o actually building the stmt. */
2444 fprintf (f
, "gimple_resimplify%d (seq, res_code, type, "
2445 "res_ops, valueize);\n", e
->ops
.length ());
2447 else if (result
->type
== operand::OP_CAPTURE
2448 || result
->type
== operand::OP_C_EXPR
)
2450 result
->gen_transform (f
, "res_ops[0]", true, 1, "type",
2451 &cinfo
, indexes
, false);
2452 fprintf (f
, "*res_code = TREE_CODE (res_ops[0]);\n");
2453 if (is_a
<capture
*> (result
)
2454 && cinfo
.info
[as_a
<capture
*> (result
)->where
].cond_expr_cond_p
)
2456 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
2457 with substituting a capture of that. */
2458 fprintf (f
, "if (COMPARISON_CLASS_P (res_ops[0]))\n"
2460 " tree tem = res_ops[0];\n"
2461 " res_ops[0] = TREE_OPERAND (tem, 0);\n"
2462 " res_ops[1] = TREE_OPERAND (tem, 1);\n"
2468 fprintf (f
, "return true;\n");
2472 bool is_predicate
= false;
2473 if (result
->type
== operand::OP_EXPR
)
2475 expr
*e
= as_a
<expr
*> (result
);
2476 is_predicate
= is_a
<predicate_id
*> (e
->operation
);
2477 /* Search for captures used multiple times in the result expression
2478 and dependent on TREE_SIDE_EFFECTS emit a SAVE_EXPR. */
2480 for (int i
= 0; i
< s
->capture_max
+ 1; ++i
)
2482 if (!cinfo
.info
[i
].force_no_side_effects_p
2483 && cinfo
.info
[i
].result_use_count
> 1)
2484 fprintf (f
, " if (TREE_SIDE_EFFECTS (captures[%d]))\n"
2485 " captures[%d] = save_expr (captures[%d]);\n",
2488 for (unsigned j
= 0; j
< e
->ops
.length (); ++j
)
2492 snprintf (dest
, 32, "res_ops[%d]", j
);
2495 fprintf (f
, " tree res_op%d;\n", j
);
2496 snprintf (dest
, 32, " res_op%d", j
);
2499 = get_operand_type (e
->operation
,
2500 "type", e
->expr_type
,
2502 ? NULL
: "TREE_TYPE (res_op0)");
2503 e
->ops
[j
]->gen_transform (f
, dest
, false, 1, optype
,
2507 fprintf (f
, "return true;\n");
2510 fprintf (f
, " tree res;\n");
2511 /* Re-fold the toplevel result. Use non_lvalue to
2512 build NON_LVALUE_EXPRs so they get properly
2513 ignored when in GIMPLE form. */
2514 if (*e
->operation
== NON_LVALUE_EXPR
)
2515 fprintf (f
, " res = non_lvalue_loc (loc, res_op0);\n");
2518 if (e
->operation
->kind
== id_base::CODE
)
2519 fprintf (f
, " res = fold_build%d_loc (loc, %s, type",
2521 *e
->operation
== CONVERT_EXPR
2522 ? "NOP_EXPR" : e
->operation
->id
);
2524 fprintf (f
, " res = build_call_expr_loc "
2525 "(loc, builtin_decl_implicit (%s), %d",
2526 e
->operation
->id
, e
->ops
.length());
2527 for (unsigned j
= 0; j
< e
->ops
.length (); ++j
)
2528 fprintf (f
, ", res_op%d", j
);
2529 fprintf (f
, ");\n");
2533 else if (result
->type
== operand::OP_CAPTURE
2534 || result
->type
== operand::OP_C_EXPR
)
2537 fprintf (f
, " tree res;\n");
2538 s
->result
->gen_transform (f
, " res", false, 1, "type",
2545 /* Search for captures not used in the result expression and dependent
2546 on TREE_SIDE_EFFECTS emit omit_one_operand. */
2547 for (int i
= 0; i
< s
->capture_max
+ 1; ++i
)
2549 if (!cinfo
.info
[i
].force_no_side_effects_p
2550 && !cinfo
.info
[i
].expr_p
2551 && cinfo
.info
[i
].result_use_count
== 0)
2552 fprintf (f
, " if (TREE_SIDE_EFFECTS (captures[%d]))\n"
2553 " res = build2_loc (loc, COMPOUND_EXPR, type,"
2554 " fold_ignored_result (captures[%d]), res);\n",
2557 fprintf (f
, " return res;\n");
2561 for (unsigned i
= 0; i
< n_braces
; ++i
)
2567 /* Main entry to generate code for matching GIMPLE IL off the decision
2571 decision_tree::gen_gimple (FILE *f
)
2573 for (unsigned n
= 1; n
<= 3; ++n
)
2575 fprintf (f
, "\nstatic bool\n"
2576 "gimple_simplify (code_helper *res_code, tree *res_ops,\n"
2577 " gimple_seq *seq, tree (*valueize)(tree),\n"
2578 " code_helper code, tree type");
2579 for (unsigned i
= 0; i
< n
; ++i
)
2580 fprintf (f
, ", tree op%d", i
);
2584 fprintf (f
, "switch (code.get_rep())\n"
2586 for (unsigned i
= 0; i
< root
->kids
.length (); i
++)
2588 dt_operand
*dop
= static_cast<dt_operand
*>(root
->kids
[i
]);
2589 expr
*e
= static_cast<expr
*>(dop
->op
);
2590 if (e
->ops
.length () != n
)
2593 if (*e
->operation
== CONVERT_EXPR
2594 || *e
->operation
== NOP_EXPR
)
2595 fprintf (f
, "CASE_CONVERT:\n");
2597 fprintf (f
, "case %s%s:\n",
2598 is_a
<fn_id
*> (e
->operation
) ? "-" : "",
2601 dop
->gen_kids (f
, true);
2602 fprintf (f
, "break;\n");
2605 fprintf (f
, "default:;\n"
2608 fprintf (f
, "return false;\n");
2613 /* Main entry to generate code for matching GENERIC IL off the decision
2617 decision_tree::gen_generic (FILE *f
)
2619 for (unsigned n
= 1; n
<= 3; ++n
)
2621 fprintf (f
, "\ntree\n"
2622 "generic_simplify (location_t loc, enum tree_code code, "
2623 "tree type ATTRIBUTE_UNUSED");
2624 for (unsigned i
= 0; i
< n
; ++i
)
2625 fprintf (f
, ", tree op%d", i
);
2629 fprintf (f
, "switch (code)\n"
2631 for (unsigned i
= 0; i
< root
->kids
.length (); i
++)
2633 dt_operand
*dop
= static_cast<dt_operand
*>(root
->kids
[i
]);
2634 expr
*e
= static_cast<expr
*>(dop
->op
);
2635 if (e
->ops
.length () != n
2636 /* Builtin simplifications are somewhat premature on
2637 GENERIC. The following drops patterns with outermost
2638 calls. It's easy to emit overloads for function code
2639 though if necessary. */
2640 || e
->operation
->kind
!= id_base::CODE
)
2643 operator_id
*op_id
= static_cast <operator_id
*> (e
->operation
);
2644 if (op_id
->code
== NOP_EXPR
|| op_id
->code
== CONVERT_EXPR
)
2645 fprintf (f
, "CASE_CONVERT:\n");
2647 fprintf (f
, "case %s:\n", e
->operation
->id
);
2649 dop
->gen_kids (f
, false);
2650 fprintf (f
, "break;\n"
2653 fprintf (f
, "default:;\n"
2656 fprintf (f
, "return NULL_TREE;\n");
2661 /* Output code to implement the predicate P from the decision tree DT. */
2664 write_predicate (FILE *f
, predicate_id
*p
, decision_tree
&dt
, bool gimple
)
2666 fprintf (f
, "\nbool\n"
2667 "%s%s (tree t%s%s)\n"
2668 "{\n", gimple
? "gimple_" : "tree_", p
->id
,
2669 p
->nargs
> 0 ? ", tree *res_ops" : "",
2670 gimple
? ", tree (*valueize)(tree)" : "");
2671 /* Conveniently make 'type' available. */
2672 fprintf (f
, "tree type = TREE_TYPE (t);\n");
2675 fprintf (f
, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
2676 dt
.root
->gen_kids (f
, gimple
);
2678 fprintf (f
, "return false;\n"
2682 /* Write the common header for the GIMPLE/GENERIC IL matching routines. */
2685 write_header (FILE *f
, const char *head
)
2687 fprintf (f
, "/* Generated automatically by the program `genmatch' from\n");
2688 fprintf (f
, " a IL pattern matching and simplification description. */\n");
2690 /* Include the header instead of writing it awkwardly quoted here. */
2691 fprintf (f
, "\n#include \"%s\"\n", head
);
2701 parser (cpp_reader
*);
2704 const cpp_token
*next ();
2705 const cpp_token
*peek ();
2706 const cpp_token
*peek_ident (const char * = NULL
);
2707 const cpp_token
*expect (enum cpp_ttype
);
2708 void eat_token (enum cpp_ttype
);
2709 const char *get_string ();
2710 const char *get_ident ();
2711 void eat_ident (const char *);
2712 const char *get_number ();
2714 id_base
*parse_operation ();
2715 operand
*parse_capture (operand
*);
2716 operand
*parse_expr ();
2717 c_expr
*parse_c_expr (cpp_ttype
);
2718 operand
*parse_op ();
2720 void record_operlist (source_location
, user_id
*);
2722 void parse_pattern ();
2723 void push_simplify (vec
<simplify
*>&, operand
*, source_location
,
2724 operand
*, source_location
);
2725 void parse_simplify (source_location
, vec
<simplify
*>&, predicate_id
*,
2727 void parse_for (source_location
);
2728 void parse_if (source_location
);
2729 void parse_predicates (source_location
);
2730 void parse_operator_list (source_location
);
2733 vec
<if_or_with
> active_ifs
;
2734 vec
<vec
<user_id
*> > active_fors
;
2735 hash_set
<user_id
*> *oper_lists_set
;
2736 vec
<user_id
*> oper_lists
;
2738 cid_map_t
*capture_ids
;
2741 vec
<simplify
*> simplifiers
;
2742 vec
<predicate_id
*> user_predicates
;
2743 bool parsing_match_operand
;
2746 /* Lexing helpers. */
2748 /* Read the next non-whitespace token from R. */
2753 const cpp_token
*token
;
2756 token
= cpp_get_token (r
);
2758 while (token
->type
== CPP_PADDING
2759 && token
->type
!= CPP_EOF
);
2763 /* Peek at the next non-whitespace token from R. */
2768 const cpp_token
*token
;
2772 token
= cpp_peek_token (r
, i
++);
2774 while (token
->type
== CPP_PADDING
2775 && token
->type
!= CPP_EOF
);
2776 /* If we peek at EOF this is a fatal error as it leaves the
2777 cpp_reader in unusable state. Assume we really wanted a
2778 token and thus this EOF is unexpected. */
2779 if (token
->type
== CPP_EOF
)
2780 fatal_at (token
, "unexpected end of file");
2784 /* Peek at the next identifier token (or return NULL if the next
2785 token is not an identifier or equal to ID if supplied). */
2788 parser::peek_ident (const char *id
)
2790 const cpp_token
*token
= peek ();
2791 if (token
->type
!= CPP_NAME
)
2797 const char *t
= (const char *) CPP_HASHNODE (token
->val
.node
.node
)->ident
.str
;
2798 if (strcmp (id
, t
) == 0)
2804 /* Read the next token from R and assert it is of type TK. */
2807 parser::expect (enum cpp_ttype tk
)
2809 const cpp_token
*token
= next ();
2810 if (token
->type
!= tk
)
2811 fatal_at (token
, "expected %s, got %s",
2812 cpp_type2name (tk
, 0), cpp_type2name (token
->type
, 0));
2817 /* Consume the next token from R and assert it is of type TK. */
2820 parser::eat_token (enum cpp_ttype tk
)
2825 /* Read the next token from R and assert it is of type CPP_STRING and
2826 return its value. */
2829 parser::get_string ()
2831 const cpp_token
*token
= expect (CPP_STRING
);
2832 return (const char *)token
->val
.str
.text
;
2835 /* Read the next token from R and assert it is of type CPP_NAME and
2836 return its value. */
2839 parser::get_ident ()
2841 const cpp_token
*token
= expect (CPP_NAME
);
2842 return (const char *)CPP_HASHNODE (token
->val
.node
.node
)->ident
.str
;
2845 /* Eat an identifier token with value S from R. */
2848 parser::eat_ident (const char *s
)
2850 const cpp_token
*token
= peek ();
2851 const char *t
= get_ident ();
2852 if (strcmp (s
, t
) != 0)
2853 fatal_at (token
, "expected '%s' got '%s'\n", s
, t
);
2856 /* Read the next token from R and assert it is of type CPP_NUMBER and
2857 return its value. */
2860 parser::get_number ()
2862 const cpp_token
*token
= expect (CPP_NUMBER
);
2863 return (const char *)token
->val
.str
.text
;
2867 /* Record an operator-list use for transparent for handling. */
2870 parser::record_operlist (source_location loc
, user_id
*p
)
2872 if (!oper_lists_set
->add (p
))
2874 if (!oper_lists
.is_empty ()
2875 && oper_lists
[0]->substitutes
.length () != p
->substitutes
.length ())
2876 fatal_at (loc
, "User-defined operator list does not have the "
2877 "same number of entries as others used in the pattern");
2878 oper_lists
.safe_push (p
);
2882 /* Parse the operator ID, special-casing convert?, convert1? and
2886 parser::parse_operation ()
2888 const cpp_token
*id_tok
= peek ();
2889 const char *id
= get_ident ();
2890 const cpp_token
*token
= peek ();
2891 if (strcmp (id
, "convert0") == 0)
2892 fatal_at (id_tok
, "use 'convert?' here");
2893 if (token
->type
== CPP_QUERY
2894 && !(token
->flags
& PREV_WHITE
))
2896 if (strcmp (id
, "convert") == 0)
2898 else if (strcmp (id
, "convert1") == 0)
2900 else if (strcmp (id
, "convert2") == 0)
2903 fatal_at (id_tok
, "non-convert operator conditionalized");
2905 if (!parsing_match_operand
)
2906 fatal_at (id_tok
, "conditional convert can only be used in "
2907 "match expression");
2908 eat_token (CPP_QUERY
);
2910 else if (strcmp (id
, "convert1") == 0
2911 || strcmp (id
, "convert2") == 0)
2912 fatal_at (id_tok
, "expected '?' after conditional operator");
2913 id_base
*op
= get_operator (id
);
2915 fatal_at (id_tok
, "unknown operator %s", id
);
2917 user_id
*p
= dyn_cast
<user_id
*> (op
);
2918 if (p
&& p
->is_oper_list
)
2919 record_operlist (id_tok
->src_loc
, p
);
2924 capture = '@'<number> */
2927 parser::parse_capture (operand
*op
)
2929 eat_token (CPP_ATSIGN
);
2930 const cpp_token
*token
= peek ();
2931 const char *id
= NULL
;
2932 if (token
->type
== CPP_NUMBER
)
2934 else if (token
->type
== CPP_NAME
)
2937 fatal_at (token
, "expected number or identifier");
2938 unsigned next_id
= capture_ids
->elements ();
2940 unsigned &num
= capture_ids
->get_or_insert (id
, &existed
);
2943 return new capture (num
, op
);
2946 /* Parse an expression
2947 expr = '(' <operation>[capture][flag][type] <operand>... ')' */
2950 parser::parse_expr ()
2952 expr
*e
= new expr (parse_operation ());
2953 const cpp_token
*token
= peek ();
2955 bool is_commutative
= false;
2956 const char *expr_type
= NULL
;
2958 if (token
->type
== CPP_COLON
2959 && !(token
->flags
& PREV_WHITE
))
2961 eat_token (CPP_COLON
);
2963 if (token
->type
== CPP_NAME
2964 && !(token
->flags
& PREV_WHITE
))
2966 const char *s
= get_ident ();
2967 if (s
[0] == 'c' && !s
[1])
2969 if (!parsing_match_operand
)
2971 "flag 'c' can only be used in match expression");
2972 is_commutative
= true;
2974 else if (s
[1] != '\0')
2976 if (parsing_match_operand
)
2977 fatal_at (token
, "type can only be used in result expression");
2981 fatal_at (token
, "flag %s not recognized", s
);
2986 fatal_at (token
, "expected flag or type specifying identifier");
2989 if (token
->type
== CPP_ATSIGN
2990 && !(token
->flags
& PREV_WHITE
))
2991 op
= parse_capture (e
);
2996 const cpp_token
*token
= peek ();
2997 if (token
->type
== CPP_CLOSE_PAREN
)
2999 if (e
->operation
->nargs
!= -1
3000 && e
->operation
->nargs
!= (int) e
->ops
.length ())
3001 fatal_at (token
, "'%s' expects %u operands, not %u",
3002 e
->operation
->id
, e
->operation
->nargs
, e
->ops
.length ());
3005 if (e
->ops
.length () == 2)
3006 e
->is_commutative
= true;
3008 fatal_at (token
, "only binary operators or function with "
3009 "two arguments can be marked commutative");
3011 e
->expr_type
= expr_type
;
3014 e
->append_op (parse_op ());
3019 /* Lex native C code delimited by START recording the preprocessing tokens
3020 for later processing.
3021 c_expr = ('{'|'(') <pp token>... ('}'|')') */
3024 parser::parse_c_expr (cpp_ttype start
)
3026 const cpp_token
*token
;
3029 vec
<cpp_token
> code
= vNULL
;
3030 unsigned nr_stmts
= 0;
3032 if (start
== CPP_OPEN_PAREN
)
3033 end
= CPP_CLOSE_PAREN
;
3034 else if (start
== CPP_OPEN_BRACE
)
3035 end
= CPP_CLOSE_BRACE
;
3043 /* Count brace pairs to find the end of the expr to match. */
3044 if (token
->type
== start
)
3046 else if (token
->type
== end
3050 /* This is a lame way of counting the number of statements. */
3051 if (token
->type
== CPP_SEMICOLON
)
3054 /* If this is possibly a user-defined identifier mark it used. */
3055 if (token
->type
== CPP_NAME
)
3057 id_base
*idb
= get_operator ((const char *)CPP_HASHNODE
3058 (token
->val
.node
.node
)->ident
.str
);
3060 if (idb
&& (p
= dyn_cast
<user_id
*> (idb
)) && p
->is_oper_list
)
3061 record_operlist (token
->src_loc
, p
);
3064 /* Record the token. */
3065 code
.safe_push (*token
);
3068 return new c_expr (r
, code
, nr_stmts
, vNULL
, capture_ids
);
3071 /* Parse an operand which is either an expression, a predicate or
3072 a standalone capture.
3073 op = predicate | expr | c_expr | capture */
3078 const cpp_token
*token
= peek ();
3079 struct operand
*op
= NULL
;
3080 if (token
->type
== CPP_OPEN_PAREN
)
3082 eat_token (CPP_OPEN_PAREN
);
3084 eat_token (CPP_CLOSE_PAREN
);
3086 else if (token
->type
== CPP_OPEN_BRACE
)
3088 op
= parse_c_expr (CPP_OPEN_BRACE
);
3092 /* Remaining ops are either empty or predicates */
3093 if (token
->type
== CPP_NAME
)
3095 const char *id
= get_ident ();
3096 id_base
*opr
= get_operator (id
);
3098 fatal_at (token
, "expected predicate name");
3099 if (operator_id
*code
= dyn_cast
<operator_id
*> (opr
))
3101 if (code
->nargs
!= 0)
3102 fatal_at (token
, "using an operator with operands as predicate");
3103 /* Parse the zero-operand operator "predicates" as
3105 op
= new expr (opr
);
3107 else if (user_id
*code
= dyn_cast
<user_id
*> (opr
))
3109 if (code
->nargs
!= 0)
3110 fatal_at (token
, "using an operator with operands as predicate");
3111 /* Parse the zero-operand operator "predicates" as
3113 op
= new expr (opr
);
3115 else if (predicate_id
*p
= dyn_cast
<predicate_id
*> (opr
))
3116 op
= new predicate (p
);
3118 fatal_at (token
, "using an unsupported operator as predicate");
3119 if (!parsing_match_operand
)
3120 fatal_at (token
, "predicates are only allowed in match expression");
3122 if (token
->flags
& PREV_WHITE
)
3125 else if (token
->type
!= CPP_COLON
3126 && token
->type
!= CPP_ATSIGN
)
3127 fatal_at (token
, "expected expression or predicate");
3128 /* optionally followed by a capture and a predicate. */
3129 if (token
->type
== CPP_COLON
)
3130 fatal_at (token
, "not implemented: predicate on leaf operand");
3131 if (token
->type
== CPP_ATSIGN
)
3132 op
= parse_capture (op
);
3138 /* Create a new simplify from the current parsing state and MATCH,
3139 MATCH_LOC, RESULT and RESULT_LOC and push it to SIMPLIFIERS. */
3142 parser::push_simplify (vec
<simplify
*>& simplifiers
,
3143 operand
*match
, source_location match_loc
,
3144 operand
*result
, source_location result_loc
)
3146 /* Build and push a temporary for for operator list uses in expressions. */
3147 if (!oper_lists
.is_empty ())
3148 active_fors
.safe_push (oper_lists
);
3150 simplifiers
.safe_push
3151 (new simplify (match
, match_loc
, result
, result_loc
,
3152 active_ifs
.copy (), active_fors
.copy (), capture_ids
));
3154 if (!oper_lists
.is_empty ())
3159 simplify = 'simplify' <expr> <result-op>
3161 match = 'match' <ident> <expr> [<result-op>]
3163 <result-op> = <op> | <if> | <with>
3164 <if> = '(' 'if' '(' <c-expr> ')' <result-op> ')'
3165 <with> = '(' 'with' '{' <c-expr> '}' <result-op> ')'
3166 and fill SIMPLIFIERS with the results. */
3169 parser::parse_simplify (source_location match_location
,
3170 vec
<simplify
*>& simplifiers
, predicate_id
*matcher
,
3173 /* Reset the capture map. */
3175 capture_ids
= new cid_map_t
;
3176 /* Reset oper_lists and set. */
3177 hash_set
<user_id
*> olist
;
3178 oper_lists_set
= &olist
;
3181 const cpp_token
*loc
= peek ();
3182 parsing_match_operand
= true;
3183 struct operand
*match
= parse_op ();
3184 parsing_match_operand
= false;
3185 if (match
->type
== operand::OP_CAPTURE
&& !matcher
)
3186 fatal_at (loc
, "outermost expression cannot be captured");
3187 if (match
->type
== operand::OP_EXPR
3188 && is_a
<predicate_id
*> (as_a
<expr
*> (match
)->operation
))
3189 fatal_at (loc
, "outermost expression cannot be a predicate");
3191 const cpp_token
*token
= peek ();
3193 /* If this if is immediately closed then it is part of a predicate
3194 definition. Push it. */
3195 if (token
->type
== CPP_CLOSE_PAREN
)
3198 fatal_at (token
, "expected transform expression");
3199 push_simplify (simplifiers
, match
, match_location
,
3200 result
, token
->src_loc
);
3204 unsigned active_ifs_len
= active_ifs
.length ();
3207 if (token
->type
== CPP_OPEN_PAREN
)
3209 source_location paren_loc
= token
->src_loc
;
3210 eat_token (CPP_OPEN_PAREN
);
3211 if (peek_ident ("if"))
3214 active_ifs
.safe_push (if_or_with (parse_c_expr (CPP_OPEN_PAREN
),
3215 token
->src_loc
, false));
3216 /* If this if is immediately closed then it contains a
3217 manual matcher or is part of a predicate definition.
3219 if (peek ()->type
== CPP_CLOSE_PAREN
)
3222 fatal_at (token
, "manual transform not implemented");
3223 push_simplify (simplifiers
, match
, match_location
,
3227 else if (peek_ident ("with"))
3230 /* Parse (with c-expr expr) as (if-with (true) expr). */
3231 c_expr
*e
= parse_c_expr (CPP_OPEN_BRACE
);
3233 active_ifs
.safe_push (if_or_with (e
, token
->src_loc
, true));
3237 operand
*op
= result
;
3240 push_simplify (simplifiers
, match
, match_location
,
3241 op
, token
->src_loc
);
3242 eat_token (CPP_CLOSE_PAREN
);
3243 /* A "default" result closes the enclosing scope. */
3244 if (active_ifs
.length () > active_ifs_len
)
3246 eat_token (CPP_CLOSE_PAREN
);
3253 else if (token
->type
== CPP_CLOSE_PAREN
)
3255 /* Close a scope if requested. */
3256 if (active_ifs
.length () > active_ifs_len
)
3258 eat_token (CPP_CLOSE_PAREN
);
3268 fatal_at (token
, "expected match operand expression");
3269 push_simplify (simplifiers
, match
, match_location
,
3270 matcher
? result
: parse_op (), token
->src_loc
);
3271 /* A "default" result closes the enclosing scope. */
3272 if (active_ifs
.length () > active_ifs_len
)
3274 eat_token (CPP_CLOSE_PAREN
);
3284 /* Parsing of the outer control structures. */
3286 /* Parse a for expression
3287 for = '(' 'for' <subst>... <pattern> ')'
3288 subst = <ident> '(' <ident>... ')' */
3291 parser::parse_for (source_location
)
3293 auto_vec
<const cpp_token
*> user_id_tokens
;
3294 vec
<user_id
*> user_ids
= vNULL
;
3295 const cpp_token
*token
;
3296 unsigned min_n_opers
= 0, max_n_opers
= 0;
3301 if (token
->type
!= CPP_NAME
)
3304 /* Insert the user defined operators into the operator hash. */
3305 const char *id
= get_ident ();
3306 if (get_operator (id
) != NULL
)
3307 fatal_at (token
, "operator already defined");
3308 user_id
*op
= new user_id (id
);
3309 id_base
**slot
= operators
->find_slot_with_hash (op
, op
->hashval
, INSERT
);
3311 user_ids
.safe_push (op
);
3312 user_id_tokens
.safe_push (token
);
3314 eat_token (CPP_OPEN_PAREN
);
3317 while ((token
= peek_ident ()) != 0)
3319 const char *oper
= get_ident ();
3320 id_base
*idb
= get_operator (oper
);
3322 fatal_at (token
, "no such operator '%s'", oper
);
3323 if (*idb
== CONVERT0
|| *idb
== CONVERT1
|| *idb
== CONVERT2
)
3324 fatal_at (token
, "conditional operators cannot be used inside for");
3328 else if (idb
->nargs
== -1)
3330 else if (idb
->nargs
!= arity
)
3331 fatal_at (token
, "operator '%s' with arity %d does not match "
3332 "others with arity %d", oper
, idb
->nargs
, arity
);
3334 user_id
*p
= dyn_cast
<user_id
*> (idb
);
3335 if (p
&& p
->is_oper_list
)
3336 op
->substitutes
.safe_splice (p
->substitutes
);
3338 op
->substitutes
.safe_push (idb
);
3341 token
= expect (CPP_CLOSE_PAREN
);
3343 unsigned nsubstitutes
= op
->substitutes
.length ();
3344 if (nsubstitutes
== 0)
3345 fatal_at (token
, "A user-defined operator must have at least "
3346 "one substitution");
3347 if (max_n_opers
== 0)
3349 min_n_opers
= nsubstitutes
;
3350 max_n_opers
= nsubstitutes
;
3354 if (nsubstitutes
% min_n_opers
!= 0
3355 && min_n_opers
% nsubstitutes
!= 0)
3356 fatal_at (token
, "All user-defined identifiers must have a "
3357 "multiple number of operator substitutions of the "
3358 "smallest number of substitutions");
3359 if (nsubstitutes
< min_n_opers
)
3360 min_n_opers
= nsubstitutes
;
3361 else if (nsubstitutes
> max_n_opers
)
3362 max_n_opers
= nsubstitutes
;
3366 unsigned n_ids
= user_ids
.length ();
3368 fatal_at (token
, "for requires at least one user-defined identifier");
3371 if (token
->type
== CPP_CLOSE_PAREN
)
3372 fatal_at (token
, "no pattern defined in for");
3374 active_fors
.safe_push (user_ids
);
3378 if (token
->type
== CPP_CLOSE_PAREN
)
3384 /* Remove user-defined operators from the hash again. */
3385 for (unsigned i
= 0; i
< user_ids
.length (); ++i
)
3387 if (!user_ids
[i
]->used
)
3388 warning_at (user_id_tokens
[i
],
3389 "operator %s defined but not used", user_ids
[i
]->id
);
3390 operators
->remove_elt (user_ids
[i
]);
3394 /* Parse an identifier associated with a list of operators.
3395 oprs = '(' 'define_operator_list' <ident> <ident>... ')' */
3398 parser::parse_operator_list (source_location
)
3400 const cpp_token
*token
= peek ();
3401 const char *id
= get_ident ();
3403 if (get_operator (id
) != 0)
3404 fatal_at (token
, "operator %s already defined", id
);
3406 user_id
*op
= new user_id (id
, true);
3409 while ((token
= peek_ident ()) != 0)
3412 const char *oper
= get_ident ();
3413 id_base
*idb
= get_operator (oper
);
3416 fatal_at (token
, "no such operator '%s'", oper
);
3420 else if (idb
->nargs
== -1)
3422 else if (arity
!= idb
->nargs
)
3423 fatal_at (token
, "operator '%s' with arity %d does not match "
3424 "others with arity %d", oper
, idb
->nargs
, arity
);
3426 /* We allow composition of multiple operator lists. */
3427 if (user_id
*p
= dyn_cast
<user_id
*> (idb
))
3428 op
->substitutes
.safe_splice (p
->substitutes
);
3430 op
->substitutes
.safe_push (idb
);
3433 if (op
->substitutes
.length () == 0)
3434 fatal_at (token
, "operator-list cannot be empty");
3437 id_base
**slot
= operators
->find_slot_with_hash (op
, op
->hashval
, INSERT
);
3441 /* Parse an outer if expression.
3442 if = '(' 'if' '(' <c-expr> ')' <pattern> ')' */
3445 parser::parse_if (source_location loc
)
3447 operand
*ifexpr
= parse_c_expr (CPP_OPEN_PAREN
);
3449 const cpp_token
*token
= peek ();
3450 if (token
->type
== CPP_CLOSE_PAREN
)
3451 fatal_at (token
, "no pattern defined in if");
3453 active_ifs
.safe_push (if_or_with (ifexpr
, loc
, false));
3456 const cpp_token
*token
= peek ();
3457 if (token
->type
== CPP_CLOSE_PAREN
)
3465 /* Parse a list of predefined predicate identifiers.
3466 preds = '(' 'define_predicates' <ident>... ')' */
3469 parser::parse_predicates (source_location
)
3473 const cpp_token
*token
= peek ();
3474 if (token
->type
!= CPP_NAME
)
3477 add_predicate (get_ident ());
3482 /* Parse outer control structures.
3483 pattern = <preds>|<for>|<if>|<simplify>|<match> */
3486 parser::parse_pattern ()
3488 /* All clauses start with '('. */
3489 eat_token (CPP_OPEN_PAREN
);
3490 const cpp_token
*token
= peek ();
3491 const char *id
= get_ident ();
3492 if (strcmp (id
, "simplify") == 0)
3494 parse_simplify (token
->src_loc
, simplifiers
, NULL
, NULL
);
3497 else if (strcmp (id
, "match") == 0)
3499 bool with_args
= false;
3500 if (peek ()->type
== CPP_OPEN_PAREN
)
3502 eat_token (CPP_OPEN_PAREN
);
3505 const char *name
= get_ident ();
3506 id_base
*id
= get_operator (name
);
3510 p
= add_predicate (name
);
3511 user_predicates
.safe_push (p
);
3513 else if ((p
= dyn_cast
<predicate_id
*> (id
)))
3516 fatal_at (token
, "cannot add a match to a non-predicate ID");
3517 /* Parse (match <id> <arg>... (match-expr)) here. */
3521 capture_ids
= new cid_map_t
;
3523 while (peek ()->type
== CPP_ATSIGN
)
3524 e
->append_op (parse_capture (NULL
));
3525 eat_token (CPP_CLOSE_PAREN
);
3528 && ((e
&& e
->ops
.length () != (unsigned)p
->nargs
)
3529 || (!e
&& p
->nargs
!= 0)))
3530 fatal_at (token
, "non-matching number of match operands");
3531 p
->nargs
= e
? e
->ops
.length () : 0;
3532 parse_simplify (token
->src_loc
, p
->matchers
, p
, e
);
3535 else if (strcmp (id
, "for") == 0)
3536 parse_for (token
->src_loc
);
3537 else if (strcmp (id
, "if") == 0)
3538 parse_if (token
->src_loc
);
3539 else if (strcmp (id
, "define_predicates") == 0)
3541 if (active_ifs
.length () > 0
3542 || active_fors
.length () > 0)
3543 fatal_at (token
, "define_predicates inside if or for is not supported");
3544 parse_predicates (token
->src_loc
);
3546 else if (strcmp (id
, "define_operator_list") == 0)
3548 if (active_ifs
.length () > 0
3549 || active_fors
.length () > 0)
3550 fatal_at (token
, "operator-list inside if or for is not supported");
3551 parse_operator_list (token
->src_loc
);
3554 fatal_at (token
, "expected %s'simplify', 'match', 'for' or 'if'",
3555 active_ifs
.length () == 0 && active_fors
.length () == 0
3556 ? "'define_predicates', " : "");
3558 eat_token (CPP_CLOSE_PAREN
);
3561 /* Main entry of the parser. Repeatedly parse outer control structures. */
3563 parser::parser (cpp_reader
*r_
)
3567 active_fors
= vNULL
;
3568 simplifiers
= vNULL
;
3569 oper_lists_set
= NULL
;
3572 user_predicates
= vNULL
;
3573 parsing_match_operand
= false;
3575 const cpp_token
*token
= next ();
3576 while (token
->type
!= CPP_EOF
)
3578 _cpp_backup_tokens (r
, 1);
3585 /* Helper for the linemap code. */
3588 round_alloc_size (size_t s
)
3594 /* The genmatch generator progam. It reads from a pattern description
3595 and outputs GIMPLE or GENERIC IL matching and simplification routines. */
3598 main (int argc
, char **argv
)
3602 progname
= "genmatch";
3608 bool verbose
= false;
3609 char *input
= argv
[argc
-1];
3610 for (int i
= 1; i
< argc
- 1; ++i
)
3612 if (strcmp (argv
[i
], "--gimple") == 0)
3614 else if (strcmp (argv
[i
], "--generic") == 0)
3616 else if (strcmp (argv
[i
], "-v") == 0)
3620 fprintf (stderr
, "Usage: genmatch "
3621 "[--gimple] [--generic] [-v] input\n");
3626 line_table
= XCNEW (struct line_maps
);
3627 linemap_init (line_table
, 0);
3628 line_table
->reallocator
= xrealloc
;
3629 line_table
->round_alloc_size
= round_alloc_size
;
3631 r
= cpp_create_reader (CLK_GNUC99
, NULL
, line_table
);
3632 cpp_callbacks
*cb
= cpp_get_callbacks (r
);
3633 cb
->error
= error_cb
;
3635 if (!cpp_read_main_file (r
, input
))
3637 cpp_define (r
, gimple
? "GIMPLE=1": "GENERIC=1");
3638 cpp_define (r
, gimple
? "GENERIC=0": "GIMPLE=0");
3640 /* Pre-seed operators. */
3641 operators
= new hash_table
<id_base
> (1024);
3642 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
3643 add_operator (SYM, # SYM, # TYPE, NARGS);
3644 #define END_OF_BASE_TREE_CODES
3646 add_operator (CONVERT0
, "CONVERT0", "tcc_unary", 1);
3647 add_operator (CONVERT1
, "CONVERT1", "tcc_unary", 1);
3648 add_operator (CONVERT2
, "CONVERT2", "tcc_unary", 1);
3649 #undef END_OF_BASE_TREE_CODES
3652 /* Pre-seed builtin functions.
3653 ??? Cannot use N (name) as that is targetm.emultls.get_address
3654 for BUILT_IN_EMUTLS_GET_ADDRESS ... */
3655 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) \
3656 add_builtin (ENUM, # ENUM);
3657 #include "builtins.def"
3664 write_header (stdout
, "gimple-match-head.c");
3666 write_header (stdout
, "generic-match-head.c");
3668 /* Go over all predicates defined with patterns and perform
3669 lowering and code generation. */
3670 for (unsigned i
= 0; i
< p
.user_predicates
.length (); ++i
)
3672 predicate_id
*pred
= p
.user_predicates
[i
];
3673 lower (pred
->matchers
, gimple
);
3676 for (unsigned i
= 0; i
< pred
->matchers
.length (); ++i
)
3677 print_matches (pred
->matchers
[i
]);
3680 for (unsigned i
= 0; i
< pred
->matchers
.length (); ++i
)
3681 dt
.insert (pred
->matchers
[i
], i
);
3686 write_predicate (stdout
, pred
, dt
, gimple
);
3689 /* Lower the main simplifiers and generate code for them. */
3690 lower (p
.simplifiers
, gimple
);
3693 for (unsigned i
= 0; i
< p
.simplifiers
.length (); ++i
)
3694 print_matches (p
.simplifiers
[i
]);
3697 for (unsigned i
= 0; i
< p
.simplifiers
.length (); ++i
)
3698 dt
.insert (p
.simplifiers
[i
], i
);
3704 dt
.gen_gimple (stdout
);
3706 dt
.gen_generic (stdout
);
3709 cpp_finish (r
, NULL
);