Skip to content

Commit d895809

Browse files
stefan-iligcbot
authored andcommitted
Add no-inline and targeted code removal for testing
Adds new pass to disable inlining, and passes to remove/drop specific functions and basic blocks. This is for testing purposes only.
1 parent 3e2f549 commit d895809

File tree

19 files changed

+775
-0
lines changed

19 files changed

+775
-0
lines changed

IGC/AdaptorOCL/UnifyIROCL.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ SPDX-License-Identifier: MIT
8484
#include "Compiler/Optimizer/OpenCLPasses/BIFTransforms/BIFTransforms.hpp"
8585
#include "Compiler/Optimizer/OpenCLPasses/BreakdownIntrinsic/BreakdownIntrinsic.h"
8686
#include "Compiler/Optimizer/OpenCLPasses/TransformUnmaskedFunctionsPass/TransformUnmaskedFunctionsPass.h"
87+
#include "Compiler/Optimizer/OpenCLPasses/DisableInlining/DisableInlining.h"
88+
#include "Compiler/Optimizer/OpenCLPasses/DropTargetFunctions/DropTargetFunctions.h"
8789
#include "Compiler/Optimizer/OpenCLPasses/KernelFunctionCloning/KernelFunctionCloning.h"
8890
#include "Compiler/Optimizer/OpenCLPasses/NontemporalLoadsAndStoresInAssert/NontemporalLoadsAndStoresInAssert.hpp"
8991
#include "Compiler/Optimizer/OpenCLPasses/HandleDevicelibAssert/HandleDevicelibAssert.hpp"
@@ -297,6 +299,14 @@ static void CommonOCLBasedPasses(OpenCLProgramContext *pContext) {
297299
mpm.add(new MetaDataUtilsWrapper(pMdUtils, pContext->getModuleMetaData()));
298300
mpm.add(new CodeGenContextWrapper(pContext));
299301

302+
if (IGC_IS_FLAG_ENABLED(EnableDropTargetFunctions)) {
303+
mpm.add(new DropTargetFunctions());
304+
}
305+
306+
if (IGC_IS_FLAG_ENABLED(DisableInlining)) {
307+
mpm.add(new DisableInlining());
308+
}
309+
300310
if (IGC_IS_FLAG_ENABLED(EnableUnmaskedFunctions)) {
301311
mpm.add(new TransformUnmaskedFunctionsPass());
302312
}

IGC/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,6 +1736,11 @@ if(UNIX)
17361736

17371737
endif()
17381738

1739+
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND
1740+
CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9)
1741+
link_libraries(stdc++fs)
1742+
endif()
1743+
17391744
if(IGC_OPTION__LINK_KHRONOS_SPIRV_TRANSLATOR)
17401745
target_link_libraries("${IGC_BUILD__PROJ__igc_dll}" PRIVATE LLVMSPIRVLib)
17411746
endif()

IGC/Compiler/CISACodeGen/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ set(IGC_BUILD__SRC__CISACodeGen_Common
105105
"${CMAKE_CURRENT_SOURCE_DIR}/VectorShuffleAnalysis.cpp"
106106
"${CMAKE_CURRENT_SOURCE_DIR}/WIAnalysis.cpp"
107107
"${CMAKE_CURRENT_SOURCE_DIR}/helper.cpp"
108+
"${CMAKE_CURRENT_SOURCE_DIR}/DropTargetBBs.cpp"
108109
"${CMAKE_CURRENT_SOURCE_DIR}/layout.cpp"
109110
"${CMAKE_CURRENT_SOURCE_DIR}/messageEncoding.cpp"
110111
"${CMAKE_CURRENT_SOURCE_DIR}/IGCLivenessAnalysis.cpp"
@@ -217,6 +218,7 @@ set(IGC_BUILD__HDR__CISACodeGen_Common
217218
"${CMAKE_CURRENT_SOURCE_DIR}/VectorShuffleAnalysis.hpp"
218219
"${CMAKE_CURRENT_SOURCE_DIR}/WIAnalysis.hpp"
219220
"${CMAKE_CURRENT_SOURCE_DIR}/helper.h"
221+
"${CMAKE_CURRENT_SOURCE_DIR}/DropTargetBBs.hpp"
220222
"${CMAKE_CURRENT_SOURCE_DIR}/layout.hpp"
221223
"${CMAKE_CURRENT_SOURCE_DIR}/messageEncoding.hpp"
222224
"${CMAKE_CURRENT_SOURCE_DIR}/opCode.h"
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*========================== begin_copyright_notice ============================
2+
3+
Copyright (C) 2025 Intel Corporation
4+
5+
SPDX-License-Identifier: MIT
6+
7+
============================= end_copyright_notice ===========================*/
8+
9+
#include "Compiler/CISACodeGen/DropTargetBBs.hpp"
10+
11+
#include "common/LLVMWarningsPush.hpp"
12+
#include <llvm/ADT/STLExtras.h>
13+
#include <llvm/IR/Function.h>
14+
#include <llvm/IR/Constants.h>
15+
#include <llvm/IR/Instructions.h>
16+
#include "common/LLVMWarningsPop.hpp"
17+
18+
#include "Compiler/IGCPassSupport.h"
19+
#include "common/igc_regkeys.hpp"
20+
21+
#include <fstream>
22+
#include <string>
23+
#include <optional>
24+
#include <filesystem>
25+
26+
using namespace llvm;
27+
using namespace IGC;
28+
29+
#define PASS_FLAG "igc-drop-target-bbs"
30+
#define PASS_DESCRIPTION "Drop target basic blocks"
31+
#define PASS_CFG_ONLY false
32+
#define PASS_ANALYSIS false
33+
IGC_INITIALIZE_PASS_BEGIN(DropTargetBBs, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
34+
IGC_INITIALIZE_PASS_END(DropTargetBBs, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
35+
36+
#define DROP_BB_DEBUG(msg) \
37+
do { \
38+
if (VerboseLog) { \
39+
llvm::errs() << msg << "\n"; \
40+
} \
41+
} while (0)
42+
43+
char IGC::DropTargetBBs::ID = 0;
44+
45+
DropTargetBBs::DropTargetBBs() : FunctionPass(ID), VerboseLog(IGC_GET_FLAG_VALUE(VerboseDropTargetBBs)) {
46+
initializeDropTargetBBsPass(*PassRegistry::getPassRegistry());
47+
}
48+
49+
void DropTargetBBs::getAnalysisUsage(llvm::AnalysisUsage &AU) const {}
50+
51+
static std::optional<int> getBBIndexByName(Function &F, const std::string &BBName) {
52+
int bbIndex = 0;
53+
for (auto &BB : F) {
54+
if (BB.hasName() && BB.getName() == BBName) {
55+
return bbIndex;
56+
}
57+
bbIndex++;
58+
}
59+
return std::nullopt;
60+
}
61+
62+
static std::optional<SmallVector<std::string, 8>> getBBNamesToDrop(const Function &F, const char *DropBBListBasePath) {
63+
SmallVector<std::string, 8> BBsToDrop;
64+
std::filesystem::path DropBBListPath = std::filesystem::path(DropBBListBasePath) / (F.getName().str() + ".txt");
65+
{
66+
std::ifstream DropBBFile(DropBBListPath);
67+
if (!DropBBFile.is_open()) {
68+
return std::nullopt;
69+
}
70+
71+
std::string line;
72+
while (std::getline(DropBBFile, line)) {
73+
if (line.empty()) {
74+
continue;
75+
}
76+
77+
if (line.back() == '\r') {
78+
line.pop_back();
79+
}
80+
81+
BBsToDrop.push_back(line);
82+
}
83+
DropBBFile.close();
84+
}
85+
return BBsToDrop;
86+
}
87+
88+
bool DropTargetBBs::runOnFunction(Function &F) {
89+
if (F.isDeclaration()) {
90+
return false;
91+
}
92+
93+
auto BBsToDropOptional = getBBNamesToDrop(F, IGC_GET_REGKEYSTRING(DropTargetBBListPath));
94+
if (!BBsToDropOptional.has_value()) {
95+
return false;
96+
}
97+
98+
const auto &BBsToDrop = BBsToDropOptional.value();
99+
SmallVector<std::uint32_t, 8> BBIndexesToDrop;
100+
for (const auto &BBName : BBsToDrop) {
101+
auto BBIndex = getBBIndexByName(F, BBName);
102+
if (BBIndex.has_value()) {
103+
BBIndexesToDrop.push_back(BBIndex.value());
104+
}
105+
}
106+
107+
if (BBIndexesToDrop.empty()) {
108+
return false;
109+
}
110+
111+
DROP_BB_DEBUG("DropTargetBBss: Examining function: " << F.getName());
112+
DROP_BB_DEBUG("DropTargetBBss: BB num: " << F.size());
113+
114+
for (const auto &BBIndex : BBIndexesToDrop) {
115+
if (BBIndex >= F.size()) {
116+
continue;
117+
}
118+
auto BI = F.begin();
119+
std::advance(BI, BBIndex);
120+
BasicBlock *BB = &*BI;
121+
DROP_BB_DEBUG("DropTargetBBs: Dropping BB index: " << BBIndex << " Name: " << BB->getName());
122+
123+
while (!BB->use_empty()) {
124+
auto *User = *BB->user_begin();
125+
if (auto *PHI = dyn_cast<PHINode>(User)) {
126+
PHI->removeIncomingValue(BB, true);
127+
} else if (auto *Br = dyn_cast<BranchInst>(User)) {
128+
BasicBlock *NextBB = BB->getNextNode();
129+
if (NextBB) {
130+
Br->setSuccessor(Br->getSuccessor(0) == BB ? 0 : 1, NextBB);
131+
} else {
132+
Br->eraseFromParent();
133+
}
134+
} else if (auto *SI = dyn_cast<SwitchInst>(User)) {
135+
if (auto *CI = SI->findCaseDest(BB)) {
136+
SI->removeCase(SI->findCaseValue(CI));
137+
}
138+
} else {
139+
User->replaceUsesOfWith(BB, PoisonValue::get(BB->getType()));
140+
}
141+
}
142+
143+
for (Instruction &I : *BB) {
144+
if (!I.use_empty()) {
145+
I.replaceAllUsesWith(PoisonValue::get(I.getType()));
146+
}
147+
}
148+
149+
BB->eraseFromParent();
150+
}
151+
152+
return true;
153+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*========================== begin_copyright_notice ============================
2+
3+
Copyright (C) 2025 Intel Corporation
4+
5+
SPDX-License-Identifier: MIT
6+
7+
============================= end_copyright_notice ===========================*/
8+
9+
#pragma once
10+
11+
#include "common/LLVMWarningsPush.hpp"
12+
#include <llvm/Pass.h>
13+
#include "common/LLVMWarningsPop.hpp"
14+
15+
namespace IGC {
16+
17+
class DropTargetBBs : public llvm::FunctionPass {
18+
public:
19+
static char ID;
20+
DropTargetBBs();
21+
22+
void getAnalysisUsage(llvm::AnalysisUsage &AU) const override;
23+
24+
llvm::StringRef getPassName() const override { return "DropTargetBBs"; }
25+
26+
bool runOnFunction(llvm::Function &func) override;
27+
28+
private:
29+
bool VerboseLog = false;
30+
};
31+
32+
} // namespace IGC

IGC/Compiler/CISACodeGen/ShaderCodeGen.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ SPDX-License-Identifier: MIT
99
#include "Compiler/CISACodeGen/ShaderCodeGen.hpp"
1010
#include "AdaptorOCL/MergeAllocasOCL.h"
1111
#include "Compiler/Legalizer/PeepholeTypeLegalizer.hpp"
12+
#include "Compiler/CISACodeGen/DropTargetBBs.hpp"
1213
#include "Compiler/CISACodeGen/layout.hpp"
1314
#include "Compiler/CISACodeGen/DeSSA.hpp"
1415
#include "Compiler/CISACodeGen/GenCodeGenModule.h"
@@ -366,6 +367,9 @@ void AddAnalysisPasses(CodeGenContext &ctx, IGCPassManager &mpm) {
366367
mpm.add(new IGCRegisterPressurePrinter("final"));
367368
// Let Layout be the last pass before Emit Pass
368369
mpm.add(new Layout());
370+
if(IGC_IS_FLAG_ENABLED(EnableDropTargetBBs)) {
371+
mpm.add(new DropTargetBBs());
372+
}
369373

370374

371375
mpm.add(createTimeStatsCounterPass(&ctx, TIME_CG_Analysis, STATS_COUNTER_END));

IGC/Compiler/InitializePasses.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ void initializeInlineLocalsResolutionPass(llvm::PassRegistry &);
101101
void initializeInlineUnmaskedFunctionsPassPass(llvm::PassRegistry &);
102102
void initializeInsertBranchOptPass(llvm::PassRegistry &);
103103
void initializeHFOptPass(llvm::PassRegistry &);
104+
void initializeDropTargetBBsPass(llvm::PassRegistry &);
104105
void initializeLayoutPass(llvm::PassRegistry &);
105106
void initializeLdShrinkPass(llvm::PassRegistry &);
106107
void initializeLegalizationPass(llvm::PassRegistry &);
@@ -164,6 +165,8 @@ void initializeStatelessToStatefulPass(llvm::PassRegistry &);
164165
void initializeSubGroupFuncsResolutionPass(llvm::PassRegistry &);
165166
void initializeSubGroupReductionPatternPass(llvm::PassRegistry &);
166167
void initializeTransformUnmaskedFunctionsPassPass(llvm::PassRegistry &);
168+
void initializeDisableInliningPass(llvm::PassRegistry &);
169+
void initializeDropTargetFunctionsPass(llvm::PassRegistry &);
167170
void initializeIndirectCallOptimizationPass(llvm::PassRegistry &);
168171
void initializePromoteInt8TypePass(llvm::PassRegistry &);
169172
void initializeDpasFuncsResolutionPass(llvm::PassRegistry &);

IGC/Compiler/Optimizer/OpenCLPasses/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ add_subdirectory(MergeScalarPhisPass)
6161
add_subdirectory(SubGroupFuncs)
6262
add_subdirectory(SubGroupReductionPattern)
6363
add_subdirectory(TransformUnmaskedFunctionsPass)
64+
add_subdirectory(DisableInlining)
65+
add_subdirectory(DropTargetFunctions)
6466
add_subdirectory(UndefinedReferences)
6567
add_subdirectory(UnreachableHandling)
6668
add_subdirectory(WGFuncs)
@@ -120,6 +122,8 @@ set(IGC_BUILD__SRC__Optimizer_OpenCLPasses_All
120122
${IGC_BUILD__SRC__OpenCLPasses_SubGroupFuncs}
121123
${IGC_BUILD__SRC__OpenCLPasses_SubGroupReductionPattern}
122124
${IGC_BUILD__SRC__OpenCLPasses_TransformUnmaskedFunctionsPass}
125+
${IGC_BUILD__SRC__OpenCLPasses_DisableInliningPass}
126+
${IGC_BUILD__SRC__OpenCLPasses_DropTargetFunctionsPass}
123127
${IGC_BUILD__SRC__OpenCLPasses_UndefinedReferences}
124128
${IGC_BUILD__SRC__OpenCLPasses_UnreachableHandling}
125129
${IGC_BUILD__SRC__OpenCLPasses_WGFuncs}
@@ -184,6 +188,8 @@ set(IGC_BUILD__HDR__Optimizer_OpenCLPasses_All
184188
${IGC_BUILD__HDR__OpenCLPasses_SubGroupFuncs}
185189
${IGC_BUILD__HDR__OpenCLPasses_SubGroupReductionPattern}
186190
${IGC_BUILD__HDR__OpenCLPasses_TransformUnmaskedFunctionsPass}
191+
${IGC_BUILD__HDR__OpenCLPasses_DisableInliningPass}
192+
${IGC_BUILD__HDR__OpenCLPasses_DropTargetFunctionsPass}
187193
${IGC_BUILD__HDR__OpenCLPasses_UndefinedReferences}
188194
${IGC_BUILD__HDR__OpenCLPasses_UnreachableHandling}
189195
${IGC_BUILD__HDR__OpenCLPasses_WGFuncs}
@@ -247,6 +253,8 @@ set(IGC_BUILD_Compiler_OpenCLPasses_Groups
247253
Compiler__OpenCLPasses_SubGroupFuncs
248254
Compiler__OpenCLPasses_SubGroupReductionPattern
249255
Compiler__OpenCLPasses_TransformUnmaskedFunctionsPass
256+
Compiler__OpenCLPasses_DisableInliningPass
257+
Compiler__OpenCLPasses_DropTargetFunctionsPass
250258
Compiler__OpenCLPasses_UndefinedReferences
251259
Compiler__OpenCLPasses_UnreachableHandling
252260
Compiler__OpenCLPasses_WGFuncs
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#=========================== begin_copyright_notice ============================
2+
#
3+
# Copyright (C) 2025 Intel Corporation
4+
#
5+
# SPDX-License-Identifier: MIT
6+
#
7+
#============================ end_copyright_notice =============================
8+
9+
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
10+
11+
12+
set(IGC_BUILD__SRC__DisableInliningPass
13+
"${CMAKE_CURRENT_SOURCE_DIR}/DisableInlining.cpp"
14+
)
15+
set(IGC_BUILD__SRC__OpenCLPasses_DisableInliningPass ${IGC_BUILD__SRC__DisableInliningPass} PARENT_SCOPE)
16+
17+
set(IGC_BUILD__HDR__DisableInliningPass
18+
"${CMAKE_CURRENT_SOURCE_DIR}/DisableInlining.h"
19+
)
20+
set(IGC_BUILD__HDR__OpenCLPasses_DisableInliningPass ${IGC_BUILD__HDR__DisableInliningPass} PARENT_SCOPE)
21+
22+
23+
igc_sg_register(
24+
Compiler__OpenCLPasses_DisableInliningPass
25+
"DisableInliningPass"
26+
FILES
27+
${IGC_BUILD__SRC__DisableInliningPass}
28+
${IGC_BUILD__HDR__DisableInliningPass}
29+
)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*========================== begin_copyright_notice ============================
2+
3+
Copyright (C) 2025 Intel Corporation
4+
5+
SPDX-License-Identifier: MIT
6+
7+
============================= end_copyright_notice ===========================*/
8+
9+
#include "Compiler/Optimizer/OpenCLPasses/DisableInlining/DisableInlining.h"
10+
11+
#include "Compiler/IGCPassSupport.h"
12+
13+
#include "common/LLVMWarningsPush.hpp"
14+
#include <llvm/IR/Function.h>
15+
#include "common/LLVMWarningsPop.hpp"
16+
17+
using namespace llvm;
18+
using namespace IGC;
19+
20+
#define PASS_FLAG "igc-disable-inlining"
21+
#define PASS_DESCRIPTION "Disable function inlining."
22+
#define PASS_CFG_ONLY false
23+
#define PASS_ANALYSIS false
24+
IGC_INITIALIZE_PASS_BEGIN(DisableInlining, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
25+
IGC_INITIALIZE_PASS_END(DisableInlining, PASS_FLAG, PASS_DESCRIPTION, PASS_CFG_ONLY, PASS_ANALYSIS)
26+
27+
char DisableInlining::ID = 0;
28+
29+
DisableInlining::DisableInlining() : FunctionPass(ID) {
30+
initializeDisableInliningPass(*PassRegistry::getPassRegistry());
31+
}
32+
33+
bool DisableInlining::runOnFunction(llvm::Function &F) {
34+
if (F.isDeclaration() || F.hasFnAttribute(llvm::Attribute::NoInline)) {
35+
return false;
36+
}
37+
if (F.hasFnAttribute(llvm::Attribute::AlwaysInline)) {
38+
F.removeFnAttr(llvm::Attribute::AlwaysInline);
39+
}
40+
F.addFnAttr(llvm::Attribute::NoInline);
41+
return true;
42+
}

0 commit comments

Comments
 (0)