/*
 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */


package org.graalvm.compiler.core.match;

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.graalvm.compiler.nodes.ConstantNode;

This annotation declares a textual pattern for matching an HIR tree. The format is a LISP style s-expression with node types and/or names that are matched against the HIR. Node types are always uppercase and the names of nodes are always lowercase. Named nodes can be used to match trees where a node is used multiple times but only as an input to the full match.
  <node-name>    := [a-z][a-zA-Z0-9]*
  <node-type>    := [A-Z][a-zA-Z0-9]*
  <node-spec>    := <node-type> { '=' <node-name> }
  <node-or-name> := <node-spec> | <node-name>
  <argument>     := <node-or-name> | <match-rule>
  <match-rule>   := '(' <node-spec> <argument>+ ')'
All matched nodes except the root of the match and ConstantNodes must have a single user. All matched nodes must be in the same block.
/** * This annotation declares a textual pattern for matching an HIR tree. The format is a LISP style * s-expression with node types and/or names that are matched against the HIR. Node types are always * uppercase and the names of nodes are always lowercase. Named nodes can be used to match trees * where a node is used multiple times but only as an input to the full match. * * <pre> * &lt;node-name&gt; := [a-z][a-zA-Z0-9]* * &lt;node-type&gt; := [A-Z][a-zA-Z0-9]* * &lt;node-spec&gt; := &lt;node-type&gt; { '=' &lt;node-name&gt; } * &lt;node-or-name&gt; := &lt;node-spec&gt; | &lt;node-name&gt; * &lt;argument&gt; := &lt;node-or-name&gt; | &lt;match-rule&gt; * &lt;match-rule&gt; := '(' &lt;node-spec&gt; &lt;argument&gt;+ ')' * </pre> * * All matched nodes except the root of the match and {@link ConstantNode}s must have a single user. * All matched nodes must be in the same block. */
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Repeatable(value = MatchRules.class) public @interface MatchRule { String value(); }