diff --git a/mindspore/ccsrc/optimizer/opt.cc b/mindspore/ccsrc/optimizer/opt.cc index 987c3c27bc37a53a30c9644ec7846ab8c00d3abe..069c9d8dddd37c718261794a55a9dfeb4a91d3ff 100644 --- a/mindspore/ccsrc/optimizer/opt.cc +++ b/mindspore/ccsrc/optimizer/opt.cc @@ -88,6 +88,22 @@ AnfNodePtr Substitution::operator()(const OptimizerPtr &optimizer, const AnfNode return result; } +inline bool isTraversable(const AnfNodePtr &node) { + if (node == nullptr) { + return false; + } + + if (node->isa() || node->isa()) { + return true; + } + + if (IsValueNode(node) || IsValueNode(node)) { + return true; + } + + return false; +} + bool SubstitutionList::ApplyTransform(const OptimizerPtr &optimizer, const AnfNodePtr &root_node, const SubstitutionPtr &transform) const { #ifdef ENABLE_PROFILE @@ -106,7 +122,7 @@ bool SubstitutionList::ApplyTransform(const OptimizerPtr &optimizer, const AnfNo todo.pop_front(); // check whether this node has been matched. - if (node == nullptr || node->seen_ == seen || !all_nodes.contains(node)) { + if (node == nullptr || node->seen_ == seen || !isTraversable(node) || !all_nodes.contains(node)) { continue; } node->seen_ = seen;