[llvm] d33566d - [NFC][SPIR-V] Fuse redundant full-traversal loops in SPIRVPrepareFunctions (#215490)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 11 06:19:04 PDT 2026
Author: Arseniy Obolenskiy
Date: 2026-08-11T15:18:58+02:00
New Revision: d33566d943e5ebc7065b1b077910ef91ea6d9be6
URL: https://github.com/llvm/llvm-project/commit/d33566d943e5ebc7065b1b077910ef91ea6d9be6
DIFF: https://github.com/llvm/llvm-project/commit/d33566d943e5ebc7065b1b077910ef91ea6d9be6.diff
LOG: [NFC][SPIR-V] Fuse redundant full-traversal loops in SPIRVPrepareFunctions (#215490)
Split out of #211299 per review. Uses make_early_inc_range to rewrite
calls in place instead of collecting them into a vector first, and
builds the function worklist inside the existing per-function loop
instead of a separate pass over the module.
Added:
Modified:
llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
index 9b418e6f88d67..6d54b6c6fa19d 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPrepareFunctions.cpp
@@ -695,20 +695,18 @@ bool SPIRVPrepareFunctionsImpl::substituteAbortKHRCalls(Function *F) {
if (!isAbortKHRBuiltin(*F))
return false;
- SmallVector<CallInst *> Calls;
- for (User *U : F->users()) {
+ bool Changed = false;
+ for (User *U : make_early_inc_range(F->users())) {
auto *CI = dyn_cast<CallInst>(U);
if (!CI || CI->getCalledFunction() != F)
continue;
if (CI->arg_size() != 1)
continue;
- Calls.push_back(CI);
- }
-
- for (CallInst *CI : Calls)
rewriteAbortKHRCall(CI);
+ Changed = true;
+ }
- return !Calls.empty();
+ return Changed;
}
// When the SPV_KHR_abort extension is enabled, `llvm.trap` and
@@ -734,16 +732,11 @@ bool SPIRVPrepareFunctionsImpl::terminateBlocksAfterTrap(Module &M,
if (!ST.canUseExtension(SPIRV::Extension::SPV_KHR_abort))
return false;
- SmallVector<CallInst *> Calls;
- for (User *U : F->users()) {
+ bool Changed = false;
+ for (User *U : make_early_inc_range(F->users())) {
auto *CI = dyn_cast<CallInst>(U);
if (!CI || CI->getCalledFunction() != F)
continue;
- Calls.push_back(CI);
- }
-
- bool Changed = false;
- for (CallInst *CI : Calls) {
Instruction *Next = CI->getNextNode();
if (!Next || isa<UnreachableInst>(Next))
continue;
@@ -883,6 +876,7 @@ bool SPIRVPrepareFunctionsImpl::runOnModule(Module &M) {
}
}
+ std::vector<Function *> FuncsWorklist;
for (Function &F : M) {
// MachineFunctionPass skips available_externally; strip + tag so AuxData
// can re-emit the original linkage as NonSemantic.AuxData::Linkage.
@@ -895,11 +889,8 @@ bool SPIRVPrepareFunctionsImpl::runOnModule(Module &M) {
Changed |= substituteIntrinsicCalls(&F);
Changed |= sortBlocks(F);
Changed |= removeAggregateTypesFromCalls(&F);
- }
-
- std::vector<Function *> FuncsWorklist;
- for (auto &F : M)
FuncsWorklist.push_back(&F);
+ }
for (auto *F : FuncsWorklist) {
Function *NewF = removeAggregateTypesFromSignature(F);
More information about the llvm-commits
mailing list