1 /** 2 * Copyright 2023 Huawei Technologies Co., Ltd 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #ifndef MINDSPORE_PI_JIT_IR_VISITOR_H_ 17 #define MINDSPORE_PI_JIT_IR_VISITOR_H_ 18 19 #include "pipeline/jit/pi/graph_compiler/pi_ir/ctrl_flow.h" 20 #include "pipeline/jit/pi/graph_compiler/pi_ir/custom_nodes.h" 21 #include "pipeline/jit/pi/graph_compiler/pi_ir/functor.h" 22 #include "pipeline/jit/pi/graph_compiler/pi_ir/value.h" 23 24 namespace mindspore { 25 namespace pijit { 26 namespace ir { 27 class IRVisitor { 28 public: 29 /* 30 * \brief recursively visit an IR node 31 */ Visit(const NodePtr & node)32 virtual void Visit(const NodePtr &node) { 33 static const FVisit &f = vtable(); 34 if (node != nullptr) { 35 f(node, this); 36 } 37 } 38 39 /// \brief destructor ~IRVisitor()40 virtual ~IRVisitor() {} 41 42 /*! \brief functor type of visitor */ 43 using FVisit = NodeFunctor<void(const NodePtr &, IRVisitor *)>; 44 /*! \return internal vtable */ 45 static FVisit &vtable(); 46 47 // overloadable visit function. 48 virtual void Visit_(const PlaceHolderPtr &node); 49 virtual void Visit_(const RefNodePtr &node); 50 virtual void Visit_(const ValuePtr &node); 51 virtual void Visit_(const ParameterPtr &node); 52 virtual void Visit_(const CastNodePtr &node); 53 virtual void Visit_(const DeleteNodePtr &node); 54 virtual void Visit_(const GetNodePtr &node); 55 virtual void Visit_(const InvertNodePtr &node); 56 virtual void Visit_(const NegativeNodePtr &node); 57 virtual void Visit_(const NotNodePtr &node); 58 virtual void Visit_(const ReturnNodePtr &node); 59 virtual void Visit_(const LoadValueNodePtr &node); 60 virtual void Visit_(const UnaryOperationPtr &node); 61 virtual void Visit_(const AddNodePtr &node); 62 virtual void Visit_(const SubNodePtr &node); 63 virtual void Visit_(const MulNodePtr &node); 64 virtual void Visit_(const DivNodePtr &node); 65 virtual void Visit_(const BitwiseNodePtr &node); 66 virtual void Visit_(const CompareNodePtr &node); 67 virtual void Visit_(const ContainsNodePtr &node); 68 virtual void Visit_(const IsNodePtr &node); 69 virtual void Visit_(const JumpNodePtr &node); 70 virtual void Visit_(const StoreNodePtr &node); 71 virtual void Visit_(const UpdateNodePtr &node); 72 virtual void Visit_(const BinaryOperationPtr &node); 73 virtual void Visit_(const LoadFieldNodePtr &node); 74 virtual void Visit_(const BuildNodePtr &node); 75 virtual void Visit_(const CallNodePtr &node); 76 virtual void Visit_(const NaryWithFlagNodePtr &node); 77 virtual void Visit_(const FormatNodePtr &node); 78 virtual void Visit_(const NaryOperationPtr &node); 79 virtual void Visit_(const FunctionNodePtr &node); 80 virtual void Visit_(const IfNodePtr &node); 81 virtual void Visit_(const WhileNodePtr &node); 82 virtual void Visit_(const AttrNodePtr &node); 83 virtual void Visit_(const PairNodePtr &node); 84 virtual void Visit_(const SubscrNodePtr &node); 85 }; 86 87 #define VISIT_NODE_LIST(LIST) \ 88 do { \ 89 std::for_each(LIST.begin(), LIST.end(), [this](const ir::NodePtr &node) { Visit(node); }); \ 90 } while (0); 91 92 #define DISPATCH_TO_VISIT(OP) \ 93 set_dispatch<OP>([](const NodePtr &node, IRVisitor *v) { v->Visit_(std::static_pointer_cast<OP>(node)); }) 94 } // namespace ir 95 } // namespace pijit 96 } // namespace mindspore 97 98 #endif // MINDSPORE_PI_JIT_IR_VISITOR_H_ 99