Skip to content

Commit 04fd0e1

Browse files
mateuszchudykigcbot
authored andcommitted
Add pass checking if the address in load/store is valid.
This commit adds a new pass that iterate over all load/store instructions and checks if the address used in the instruction is greater of equal than the minimum valid address defined by a user.
1 parent c8c5eb1 commit 04fd0e1

File tree

18 files changed

+511
-0
lines changed

18 files changed

+511
-0
lines changed

IGC/AdaptorOCL/UnifyIROCL.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ SPDX-License-Identifier: MIT
131131
#include "Compiler/Optimizer/IGCInstCombiner/IGCInstructionCombining.hpp"
132132
#include "Compiler/Optimizer/OpenCLPasses/BufferBoundsChecking/BufferBoundsChecking.hpp"
133133
#include "Compiler/Optimizer/OpenCLPasses/BufferBoundsChecking/BufferBoundsCheckingPatcher.hpp"
134+
#include "Compiler/Optimizer/OpenCLPasses/MinimumValidAddressChecking/MinimumValidAddressChecking.hpp"
134135

135136
#include "common/debug/Debug.hpp"
136137
#include "common/igc_regkeys.hpp"
@@ -393,6 +394,19 @@ static void CommonOCLBasedPasses(OpenCLProgramContext* pContext)
393394
mpm.add(new BufferBoundsChecking());
394395
}
395396

397+
// Minimum valid address checking
398+
{
399+
uint64_t minimumValidAddress = IGC_GET_FLAG_VALUE(MinimumValidAddress);
400+
if (!minimumValidAddress)
401+
{
402+
minimumValidAddress = pContext->getMinimumValidAddress();
403+
}
404+
if (minimumValidAddress)
405+
{
406+
mpm.add(new MinimumValidAddressChecking(minimumValidAddress));
407+
}
408+
}
409+
396410
mpm.add(new NamedBarriersResolution(pContext->platform.getPlatformInfo().eRenderCoreFamily));
397411
mpm.add(new PreBIImportAnalysis());
398412
mpm.add(createTimeStatsCounterPass(pContext, TIME_Unify_BuiltinImport, STATS_COUNTER_START));

IGC/BiFModule/Implementation/assert.cl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,24 @@ void __bufferoutofbounds_assert_nodebug(long bufferAddress, long bufferOffsetInB
111111
header->flag = ERROR_TYPE_BUFFER_OUTOFBOUNDS;
112112
__builtin_IB_software_exception();
113113
}
114+
115+
void __minimumvalidaddresschecking_assert(const char* file, int line, int column, long address) {
116+
printf("Load/store uses the address less than the minimum valid address!\n"
117+
" Location: %s:%d:%d\n"
118+
" Address: 0x%X\n",
119+
file, line, column, address);
120+
121+
AssertBufferHeader* header = __builtin_IB_get_assert_buffer();
122+
header->flag = ERROR_TYPE_ASSERT;
123+
__builtin_IB_software_exception();
124+
}
125+
126+
void __minimumvalidaddresschecking_assert_nodebug(long address) {
127+
printf("Load/store uses the address less than the minimum valid address!\n"
128+
" Address: 0x%X\n",
129+
address);
130+
131+
AssertBufferHeader* header = __builtin_IB_get_assert_buffer();
132+
header->flag = ERROR_TYPE_ASSERT;
133+
__builtin_IB_software_exception();
134+
}

IGC/Compiler/CISACodeGen/OpenCLKernelCodeGen.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,11 @@ namespace IGC
256256
return platform.getSlmSizePerSsOrDss();
257257
}
258258

259+
uint64_t OpenCLProgramContext::getMinimumValidAddress() const
260+
{
261+
return m_InternalOptions.MinimumValidAddress;
262+
}
263+
259264
COpenCLKernel::COpenCLKernel(OpenCLProgramContext* ctx, Function* pFunc, CShaderProgram* pProgram) :
260265
CComputeShaderBase(pFunc, pProgram)
261266
{

IGC/Compiler/CISACodeGen/OpenCLKernelCodeGen.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ namespace IGC
107107
unsigned GetSlmSizePerSubslice();
108108
float GetSpillThreshold(SIMDMode dispatchSize);
109109
bool isAutoGRFSelectionEnabled() const override;
110+
uint64_t getMinimumValidAddress() const override;
110111

111112
void clearBeforeRetry() {
112113
m_programOutput.clearBeforeRetry();

IGC/Compiler/CISACodeGen/OpenCLOptions.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,20 @@ void InternalOptions::parseOptions(const char* internalOpts)
409409
{
410410
EnableBufferBoundsChecking = true;
411411
}
412+
413+
if (const llvm::opt::Arg* arg = internalOptions.getLastArg(OPT_minimum_valid_address_checking_common))
414+
{
415+
llvm::StringRef valStr = arg->getValue();
416+
int val = 0;
417+
if (valStr.getAsInteger(16, val) || val < 0)
418+
{
419+
IGC_ASSERT_MESSAGE(false, "-cl-minimum-valid-address-checking: invalid value, ignored!");
420+
}
421+
else
422+
{
423+
MinimumValidAddress = val;
424+
}
425+
}
412426
}
413427

414428
void Options::parseOptions(const char* opts)

IGC/Compiler/CISACodeGen/OpenCLOptions.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ class InternalOptions
120120
// Compile only up to vISA stage.
121121
bool EmitVisaOnly = false;
122122

123+
124+
uint64_t MinimumValidAddress = 0;
125+
123126
private:
124127
void parseOptions(const char* internalOpts);
125128
};

IGC/Compiler/CodeGenContext.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,11 @@ namespace IGC
981981
return simdMode;
982982
}
983983

984+
uint64_t CodeGenContext::getMinimumValidAddress() const
985+
{
986+
return 0;
987+
}
988+
984989
// [used by shader dump] create unqiue id, starting from 1, for each
985990
// entry function.
986991
// Each entry function has 1-1 map b/w its name and its dump name.

IGC/Compiler/CodeGenPublic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,7 @@ namespace IGC
11271127
virtual bool enableZEBinary() const;
11281128
bool isPOSH() const;
11291129
virtual bool isBufferBoundsChecking() const;
1130+
virtual uint64_t getMinimumValidAddress() const;
11301131

11311132
UserAddrSpaceMD& getUserAddrSpaceMD() {
11321133
IGC_ASSERT(llvmCtxWrapper);

IGC/Compiler/InitializePasses.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,3 +261,4 @@ void initializeBufferBoundsCheckingPass(llvm::PassRegistry&);
261261
void initializeBufferBoundsCheckingPatcherPass(llvm::PassRegistry&);
262262
void initializeBfloatFuncsResolutionPass(llvm::PassRegistry &);
263263
void initializeBarrierControlFlowOptimizationPass(llvm::PassRegistry&);
264+
void initializeMinimumValidAddressCheckingPass(llvm::PassRegistry&);

IGC/Compiler/Optimizer/OpenCLPasses/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ add_subdirectory(BufferBoundsChecking)
3535
add_subdirectory(LSCFuncs)
3636
add_subdirectory(Decompose2DBlockFuncs)
3737
add_subdirectory(LocalBuffers)
38+
add_subdirectory(MinimumValidAddressChecking)
3839
add_subdirectory(NamedBarriers)
3940
add_subdirectory(NontemporalLoadsAndStoresInAssert)
4041
add_subdirectory(OpenCLPrintf)
@@ -85,6 +86,7 @@ set(IGC_BUILD__SRC__Optimizer_OpenCLPasses_All
8586
${IGC_BUILD__SRC__OpenCLPasses_BufferBoundsChecking}
8687
${IGC_BUILD__SRC__OpenCLPasses_LSCFuncs}
8788
${IGC_BUILD__SRC__OpenCLPasses_LocalBuffers}
89+
${IGC_BUILD__SRC__OpenCLPasses_MinimumValidAddressChecking}
8890
${IGC_BUILD__SRC__OpenCLPasses_NamedBarriers}
8991
${IGC_BUILD__SRC__OpenCLPasses_NontemporalLoadsAndStoresInAssert}
9092
${IGC_BUILD__SRC__OpenCLPasses_OpenCLPrintf}
@@ -141,6 +143,7 @@ set(IGC_BUILD__HDR__Optimizer_OpenCLPasses_All
141143
${IGC_BUILD__HDR__OpenCLPasses_LSCFuncs}
142144
${IGC_BUILD__HDR__OpenCLPasses_IOBlock2DFuncs}
143145
${IGC_BUILD__HDR__OpenCLPasses_LocalBuffers}
146+
${IGC_BUILD__HDR__OpenCLPasses_MinimumValidAddressChecking}
144147
${IGC_BUILD__HDR__OpenCLPasses_NamedBarriers}
145148
${IGC_BUILD__HDR__OpenCLPasses_NontemporalLoadsAndStoresInAssert}
146149
${IGC_BUILD__HDR__OpenCLPasses_OpenCLPrintf}
@@ -197,6 +200,7 @@ set(IGC_BUILD_Compiler_OpenCLPasses_Groups
197200
Compiler__OpenCLPasses_LSCFuncs
198201
Compiler__OpenCLPasses_IOBlock2DFuncs
199202
Compiler__OpenCLPasses_LocalBuffers
203+
Compiler__OpenCLPasses_MinimumValidAddressChecking
200204
Compiler__OpenCLPasses_NamedBarriers
201205
Compiler__OpenCLPasses_NontemporalLoadsAndStoresInAssert
202206
Compiler__OpenCLPasses_OpenCLPrintf
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) 2024 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__MinimumValidAddressChecking
13+
"${CMAKE_CURRENT_SOURCE_DIR}/MinimumValidAddressChecking.cpp"
14+
)
15+
set(IGC_BUILD__SRC__OpenCLPasses_MinimumValidAddressChecking ${IGC_BUILD__SRC__MinimumValidAddressChecking} PARENT_SCOPE)
16+
17+
set(IGC_BUILD__HDR__MinimumValidAddressChecking
18+
"${CMAKE_CURRENT_SOURCE_DIR}/MinimumValidAddressChecking.hpp"
19+
)
20+
set(IGC_BUILD__HDR__OpenCLPasses_MinimumValidAddressChecking ${IGC_BUILD__HDR__MinimumValidAddressChecking} PARENT_SCOPE)
21+
22+
23+
igc_sg_register(
24+
Compiler__OpenCLPasses_MinimumValidAddressChecking
25+
"MinimumValidAddressChecking"
26+
FILES
27+
${IGC_BUILD__SRC__MinimumValidAddressChecking}
28+
${IGC_BUILD__HDR__MinimumValidAddressChecking}
29+
)

0 commit comments

Comments
 (0)