#ifndef HALIDE_IR_MATCH_H #define HALIDE_IR_MATCH_H /** \file * Defines a method to match a fragment of IR against a pattern containing wildcards */ #include "IR.h" namespace Halide { namespace Internal { /** Does the first expression have the same structure as the second? * Variables in the first expression with the name * are interpreted * as wildcards, and their matching equivalent in the second * expression is placed in the vector give as the third argument. * Wildcards require the types to match. For the type bits and width, * a 0 indicates "match anything". So an Int(8, 0) will match 8-bit * integer vectors of any width (including scalars), and a UInt(0, 0) * will match any unsigned integer type. * * For example: \code Expr x = Variable::make(Int(32), "*"); match(x + x, 3 + (2*k), result) \endcode * should return true, and set result[0] to 3 and * result[1] to 2*k. */ EXPORT bool expr_match(Expr pattern, Expr expr, std::vector<Expr> &result); /** Does the first expression have the same structure as the second? * Variables are matched consistently. The first time a variable is * matched, it assumes the value of the matching part of the second * expression. Subsequent matches must be equal to the first match. * * For example: \code Var x("x"), y("y"); match(x*(x + y), a*(a + b), result) \endcode * should return true, and set result["x"] = a, and result["y"] = b. */ EXPORT bool expr_match(Expr pattern, Expr expr, std::map<std::string, Expr> &result); EXPORT void expr_match_test(); } } #endif