diff --git a/mindspore/ccsrc/frontend/optimizer/irpass/item_tuple_or_list_eliminate.h b/mindspore/ccsrc/frontend/optimizer/irpass/item_tuple_or_list_eliminate.h index 4a1b55beb01..2e7ac661471 100644 --- a/mindspore/ccsrc/frontend/optimizer/irpass/item_tuple_or_list_eliminate.h +++ b/mindspore/ccsrc/frontend/optimizer/irpass/item_tuple_or_list_eliminate.h @@ -360,7 +360,26 @@ class GetitemDependReorder : public AnfVisitor { auto fg = node->func_graph(); auto item_node = NewCNode({NewValueNode(prim::kPrimTupleGetItem), x_, c_}, fg); - return NewCNode({NewValueNode(prim::kPrimDepend), item_node, y_}, fg); + auto depend_node = NewCNode({NewValueNode(prim::kPrimDepend), item_node, y_}, fg); + auto abs = x_->abstract(); + if (abs == nullptr) { + return depend_node; + } + auto idx_value = GetValueNode(c_); + MS_EXCEPTION_IF_NULL(idx_value); + int64_t idx = idx_value->value(); + if (abs->isa()) { + auto abs_tuple = abs->cast(); + if (LongToSize(idx) >= abs_tuple->elements().size() || idx < 0) { + MS_LOG(EXCEPTION) << "The idx value " << idx << " of tuple_getitem node " << c_->DebugString() + << " is out of range."; + } + item_node->set_abstract(abs_tuple->elements()[idx]); + } else { + item_node->set_abstract(abs); + } + depend_node->set_abstract(item_node->abstract()); + return depend_node; } void Visit(const CNodePtr &cnode) override {