diff --git a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp index 4c88e794b7195..bd913475244c4 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp @@ -476,8 +476,13 @@ static bool processFunction(Function *F) { // Optimize the function. Function *NewF = optimizeFunction(F, OptimizeableParams, NewParamTs); + // Copy users to a separate container, to enable safe eraseFromParent + // within optimizeCall. + SmallVector FUsers; + std::copy(F->users().begin(), F->users().end(), std::back_inserter(FUsers)); + // Optimize calls to the function. - for (auto *U : F->users()) { + for (auto *U : FUsers) { auto *Call = cast(U); assert(Call->getCalledFunction() == F); optimizeCall(Call, NewF, OptimizeableParams);