From 5fea67b930e1a8b7a7091654f4de09df027439b3 Mon Sep 17 00:00:00 2001 From: Yifan Zhao <yifanz16@illinois.edu> Date: Tue, 27 Apr 2021 14:49:30 -0500 Subject: [PATCH] Fixed a problem that involves traversing inst users unsafely --- .../FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp b/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp index 616b8a9b57..ecf6635e47 100644 --- a/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp +++ b/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp @@ -652,12 +652,17 @@ void FuseHPVMTensorNodes::updateParentNodeFunction(IntrinsicInst *II1, IItoRemove.clear(); // Then, iterate over uses of the second node's createNode intrinsic - for (Value::user_iterator i = II2->user_begin(), ie = II2->user_end(); - i != ie; ++i) { + // List all the IntrinsicInst users into `IIs` first, because it's unsafe to + // traverse the users while making changes to the users + // (we caught a bug here). + std::vector<IntrinsicInst *> IIs; + for (auto i = II2->user_begin(), ie = II2->user_end(); i != ie; ++i) { Instruction *VI = dyn_cast<Instruction>(*i); IntrinsicInst *II = dyn_cast<IntrinsicInst>(VI); assert(II && "Use of a node handle outside of a hpvm intrinsic\n"); - + IIs.push_back(II); + } + for (auto *II: IIs) { switch (II->getIntrinsicID()) { case Intrinsic::hpvm_createEdge: { assert(isOutgoingEdgeIntrinsic(II, II2) && -- GitLab