• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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