#ifndef GRAPH_BACKEND_FAKE_TRANSFORMATION_PASS_HPP
#define GRAPH_BACKEND_FAKE_TRANSFORMATION_PASS_HPP
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "graph/utils/pm/nested_matcher.hpp"
#include "graph/utils/pm/pass_base.hpp"
#include "graph/utils/pm/pbuilder.hpp"
#include "graph/backend/fake/pattern_utils.hpp"
namespace dnnl {
namespace impl {
namespace graph {
namespace fake_impl {
namespace pass {
class transformation_pass_t : public graph::pass::pass_base_t {
public:
explicit transformation_pass_t(std::string pbackend, std::string pname)
: graph::pass::pass_base_t(std::move(pbackend), std::move(pname)) {}
static graph::pass::pass_base_ptr create(
std::string pbackend, std::string pname) {
return std::make_shared<transformation_pass_t>(
std::move(pbackend), std::move(pname));
}
impl::status_t run(graph_t &agraph) override {
pattern_utils_t pu;
graph::pass::Pattern pgraph
= get_attr<graph::pass::Pattern>("Pattern")[0];
std::vector<op_t *> matched_op_list;
if (get_verbose(verbose_t::create_dispatch, component_t::graph)) {
verbose_printf(
"graph,create:dispatch,pattern_matcher,%s,fake_backend\n",
get_pass_name().c_str());
}
pu.match(agraph, pgraph, matched_op_list);
if (!matched_op_list.empty()) {
if (utils::get_graph_dump_mode(graph_dump_mode_t::pattern)) {
verbose_printf(
"graph,info,pattern,hit,%s\n", get_pass_name().c_str());
}
pu.fuse(agraph, matched_op_list);
}
return impl::status::success;
}
};
#define DECLARE_PASS_EX(bname, pname, counter) \
static auto _registered_pass_##pname##_##bname##_##counter##_
#define DECLARE_PASS(bname, pname, counter) \
DECLARE_PASS_EX(bname, pname, counter)
#define FAKE_BACKEND_REGISTER_TRANSFORMATION_PASS( \
backend_name, pass_class_name) \
DECLARE_PASS(backend_name, pass_class_name, __COUNTER__) \
= registry.register_pass(#backend_name, #pass_class_name, \
&transformation_pass_t::create)
#define FAKE_BACKEND_REGISTER_PASSES_DEF_BEGIN(passes_class_) \
inline void register_##passes_class_( \
graph::pass::pass_registry_t ®istry) {
#define FAKE_BACKEND_REGISTER_PASSES_DEF_END }
#define FAKE_BACKEND_REGISTER_PASSES_CALL(passes_class_, pass_registry_) \
pass::register_##passes_class_(pass_registry_);
} } } } }
#endif