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