Skip to content

Commit c7334a7

Browse files
dmitryryinteligcbot
authored andcommitted
avoid localization of large data for oclbin, use relocation instead
1 parent bb78ef0 commit c7334a7

File tree

5 files changed

+91
-14
lines changed

5 files changed

+91
-14
lines changed

IGC/VectorCompiler/include/vc/Support/BackendConfig.h

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,48 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5151
#include <llvm/Pass.h>
5252
#include <llvm/PassRegistry.h>
5353

54+
#include <limits>
55+
5456
namespace llvm {
5557

5658
void initializeGenXBackendConfigPass(PassRegistry &PR);
5759

60+
struct GlobalsLocalizationConfig {
61+
using LimitT = std::size_t;
62+
static constexpr auto NoLimit = std::numeric_limits<LimitT>::max();
63+
64+
private:
65+
// Whether every global variable must be localized.
66+
bool IsForced = true;
67+
// How many GRF memory is allowed to be used for localization.
68+
LimitT Limit = NoLimit;
69+
70+
public:
71+
GlobalsLocalizationConfig(bool IsForcedIn, LimitT LimitIn)
72+
: IsForced{IsForcedIn}, Limit{LimitIn} {
73+
if (IsForced)
74+
IGC_ASSERT_MESSAGE(
75+
Limit == NoLimit,
76+
"there can be no localization limit when localization is forced");
77+
}
78+
79+
GlobalsLocalizationConfig() {}
80+
81+
// Every global variable must be localized.
82+
static GlobalsLocalizationConfig CreateForcedLocalization() { return {}; }
83+
84+
// GlobalsLocalization is allowed to localize globals but it can use only
85+
// GlobalsLocalizationLimit bytes of GRF.
86+
static GlobalsLocalizationConfig
87+
CreateLocalizationWithLimit(LimitT GlobalsLocalizationLimitIn = NoLimit) {
88+
return {false, GlobalsLocalizationLimitIn};
89+
}
90+
91+
bool isForced() const { return IsForced; }
92+
93+
LimitT getLimit() const { return Limit; }
94+
};
95+
5896
// Plain structure to be filled by users who want to create backend
5997
// configuration. Some values are default-initialized from cl options.
6098
struct GenXBackendOptions {
@@ -74,6 +112,10 @@ struct GenXBackendOptions {
74112
bool EnableDebugInfoDumps;
75113
std::string DebugInfoDumpsNameOverride;
76114

115+
// Configuration for GlobalsLocalization pass
116+
// (part of CMABI pass by historical reasons).
117+
GlobalsLocalizationConfig GlobalsLocalization;
118+
77119
GenXBackendOptions();
78120
};
79121

@@ -132,6 +174,13 @@ class GenXBackendConfig : public ImmutablePass {
132174
const std::string &dbgInfoDumpsNameOverride() const {
133175
return Options.DebugInfoDumpsNameOverride;
134176
}
177+
178+
bool isGlobalsLocalizationForced() const {
179+
return Options.GlobalsLocalization.isForced();
180+
}
181+
GlobalsLocalizationConfig::LimitT getGlobalsLocalizationLimit() const {
182+
return Options.GlobalsLocalization.getLimit();
183+
}
135184
};
136185
} // namespace llvm
137186

IGC/VectorCompiler/lib/GenXCodeGen/GenXWrapper.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,10 @@ static GenXBackendOptions createBackendOptions(const vc::CompileOptions &Opts) {
454454
BackendOpts.EnableAsmDumps = Opts.DumpAsm;
455455
BackendOpts.EnableDebugInfoDumps = Opts.DumpDebugInfo;
456456
BackendOpts.Dumper = Opts.Dumper.get();
457+
BackendOpts.GlobalsLocalization =
458+
(Opts.Binary == vc::BinaryKind::OpenCL)
459+
? GlobalsLocalizationConfig::CreateLocalizationWithLimit()
460+
: GlobalsLocalizationConfig::CreateForcedLocalization();
457461
return BackendOpts;
458462
}
459463

IGC/VectorCompiler/lib/GenXOpts/CMTrans/CMABI.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,18 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4141

4242
#define DEBUG_TYPE "cmabi"
4343

44+
#include "llvmWrapper/Analysis/CallGraph.h"
4445
#include "llvmWrapper/IR/CallSite.h"
45-
#include "llvmWrapper/Support/Alignment.h"
4646
#include "llvmWrapper/IR/DerivedTypes.h"
4747
#include "llvmWrapper/IR/Instructions.h"
48+
#include "llvmWrapper/Support/Alignment.h"
49+
50+
#include "Probe/Assertion.h"
4851

4952
#include "vc/GenXOpts/GenXOpts.h"
5053
#include "vc/GenXOpts/Utils/GenXSTLExtras.h"
54+
#include "vc/Support/BackendConfig.h"
55+
5156
#include "llvm/ADT/DenseMap.h"
5257
#include "llvm/ADT/PostOrderIterator.h"
5358
#include "llvm/ADT/SCCIterator.h"
@@ -76,9 +81,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7681
#include "llvm/Support/raw_ostream.h"
7782
#include "llvm/Transforms/Scalar.h"
7883

79-
#include "llvmWrapper/Analysis/CallGraph.h"
80-
#include "Probe/Assertion.h"
81-
8284
#include <algorithm>
8385
#include <iterator>
8486
#include <numeric>
@@ -89,13 +91,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8991

9092
using namespace llvm;
9193

92-
using LocalizationLimitT = int32_t;
93-
static constexpr auto LocalizeAll = std::numeric_limits<LocalizationLimitT>::max();
94-
static cl::opt<LocalizationLimitT>
95-
LocalizationLimit("cm-abi-issues-localization-limit",
96-
cl::desc("maximum size (in bytes) used to localize global variables"),
97-
cl::init(LocalizeAll));
98-
9994
STATISTIC(NumArgumentsTransformed, "Number of pointer arguments transformed");
10095

10196
// FIXME: find a propper place for addrspace enum, agree on addrspace politics
@@ -253,6 +248,7 @@ int DiagnosticInfoOverlappingArgs::KindID = 0;
253248
class CMABIAnalysis : public ModulePass {
254249
// This map captures all global variables to be localized.
255250
std::vector<LocalizationInfo *> LocalizationInfoObjs;
251+
GlobalsLocalizationConfig::LimitT GlobalsLocalizationLimit;
256252

257253
public:
258254
static char ID;
@@ -267,6 +263,7 @@ class CMABIAnalysis : public ModulePass {
267263

268264
void getAnalysisUsage(AnalysisUsage &AU) const override {
269265
AU.addRequired<CallGraphWrapperPass>();
266+
AU.addRequired<GenXBackendConfig>();
270267
AU.setPreservesAll();
271268
}
272269

@@ -359,10 +356,25 @@ char CMABIAnalysis::ID = 0;
359356
INITIALIZE_PASS_BEGIN(CMABIAnalysis, "cmabi-analysis",
360357
"helper analysis pass to get info for CMABI", false, true)
361358
INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass)
359+
INITIALIZE_PASS_DEPENDENCY(GenXBackendConfig)
362360
INITIALIZE_PASS_END(CMABIAnalysis, "cmabi-analysis",
363361
"Fix ABI issues for the genx backend", false, true)
364362

363+
static std::size_t
364+
defineGlobalsLocalizationLimit(const GenXBackendConfig &Config) {
365+
if (Config.isGlobalsLocalizationForced())
366+
return GlobalsLocalizationConfig::NoLimit;
367+
368+
// Half of a size of standard GenX register file in bytes.
369+
// 128 * 32 / 2
370+
constexpr std::size_t HalfGRF = 2048;
371+
std::size_t Limit = Config.getGlobalsLocalizationLimit();
372+
return std::min(Limit, HalfGRF);
373+
}
374+
365375
bool CMABIAnalysis::runOnModule(Module &M) {
376+
GlobalsLocalizationLimit =
377+
defineGlobalsLocalizationLimit(getAnalysis<GenXBackendConfig>());
366378
runOnCallGraph(getAnalysis<CallGraphWrapperPass>().getCallGraph());
367379
return false;
368380
}
@@ -402,7 +414,7 @@ auto selectGlobalsToLocalize(ForwardRange Globals, T Bound,
402414
Globals, [ExcludePred](GVRef GV) { return !ExcludePred(GV); });
403415
using GVWithWeightT = std::pair<GVPtr, int>;
404416

405-
if (Bound == LocalizeAll) {
417+
if (Bound == GlobalsLocalizationConfig::NoLimit) {
406418
std::vector<GVPtr> ToLocalize;
407419
transform(Unexcluded, std::back_inserter(ToLocalize),
408420
[](GVRef GV) { return &GV; });
@@ -1950,7 +1962,7 @@ void CMABIAnalysis::analyzeGlobals(CallGraph &CG) {
19501962
};
19511963
const auto &DL = M.getDataLayout();
19521964
std::vector<GlobalVariable *> ToLocalize = selectGlobalsToLocalize(
1953-
M.globals(), LocalizationLimit.getValue(),
1965+
M.globals(), GlobalsLocalizationLimit,
19541966
[UsesPrintChecker](const GlobalVariable &GV) {
19551967
// don't localize global constant format string if it's used by print_index intrinsic
19561968
bool UsesPrintIndex = std::any_of(GV.use_begin(), GV.use_end(), UsesPrintChecker);

IGC/VectorCompiler/lib/GenXOpts/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ set(OPT_SOURCES
1616
add_library(VCTransforms ${OPT_SOURCES})
1717
target_link_libraries(VCTransforms
1818
VCHeaders
19+
VCSupport
1920
LLVMGenXIntrinsics
2021
)

IGC/VectorCompiler/lib/Support/BackendConfig.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@ static cl::opt<std::string>
7171
"precompiled OpenCL generic builtins"),
7272
cl::init(""));
7373

74+
static cl::opt<bool> ForceGlobalsLocalizationOpt(
75+
"vc-force-globals-localization",
76+
cl::desc("all global variables must be localized"), cl::init(true));
77+
78+
static cl::opt<GlobalsLocalizationConfig::LimitT> GlobalsLocalizationLimitOpt(
79+
"vc-globals-localization-limit",
80+
cl::desc("maximum size (in bytes) used to localize global variables"),
81+
cl::init(GlobalsLocalizationConfig::NoLimit));
82+
7483
//===----------------------------------------------------------------------===//
7584
//
7685
// Backend config related stuff.
@@ -82,7 +91,9 @@ GenXBackendOptions::GenXBackendOptions()
8291
: EnableKernelDebug(GenerateDebugInfoOpt), DumpRegAlloc(DumpRegAllocOpt),
8392
StackSurfaceMaxSize(StackMemSizeOpt), EnableAsmDumps(EnableAsmDumpsOpt),
8493
EnableDebugInfoDumps(EnableDebugInfoDumpOpt),
85-
DebugInfoDumpsNameOverride(DebugInfoDumpNameOverride) {}
94+
DebugInfoDumpsNameOverride(DebugInfoDumpNameOverride),
95+
GlobalsLocalization{ForceGlobalsLocalizationOpt.getValue(),
96+
GlobalsLocalizationLimitOpt.getValue()} {}
8697

8798
GenXBackendData::GenXBackendData() {
8899
if (OCLGenericBiFPath.getNumOccurrences() == 0)

0 commit comments

Comments
 (0)