From 62d30134a47a59239b4680ab4c108ec7b7a35c0a Mon Sep 17 00:00:00 2001 From: Konstantin S Bobrovsky Date: Wed, 28 Sep 2022 15:10:55 -0700 Subject: [PATCH 1/2] [ESIMD] Follow-up fix for ESIMDOptimizeVecArgCallConv memory corruption. https://github.com/intel/llvm/pull/6557 rolled back necessary code, return it back with this patch. Problem somehow reproduced only in internal debug Windows build - the SYCLLowerIR/ESIMD/vec_arg_call_conv.ll test crashed opt. Signed-off-by: Konstantin S Bobrovsky --- llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp index 4c88e794b7195..923760e923b52 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); From 71e47673024229a3a9b460ba5f8e44dd0385caf8 Mon Sep 17 00:00:00 2001 From: kbobrovs Date: Thu, 29 Sep 2022 11:33:16 -0700 Subject: [PATCH 2/2] clang-format --- llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp index 923760e923b52..bd913475244c4 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/ESIMDOptimizeVecArgCallConv.cpp @@ -478,7 +478,7 @@ static bool processFunction(Function *F) { // Copy users to a separate container, to enable safe eraseFromParent // within optimizeCall. - SmallVector FUsers; + SmallVector FUsers; std::copy(F->users().begin(), F->users().end(), std::back_inserter(FUsers)); // Optimize calls to the function.