diff --git a/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp b/hpvm/lib/Transforms/FuseHPVMTensorNodes/FuseHPVMTensorNodes.cpp
index 616b8a9b572473ed4acb2f2316d88f41a06e434a..ecf6635e479af8eb6583a415a3e4014e98e40ce9 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) &&