1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2024 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#include "IGC/BiFModule/Headers/bif_control_common.h"
#include "IGC/common/StringMacros.hpp"
#include "vc/GenXOpts/GenXOpts.h"
#include "vc/Support/BackendConfig.h"
#include "vc/Support/GenXDiagnostic.h"
#include "llvm/PassRegistry.h"
#include <llvm/IR/Function.h>
#include <llvm/IR/Module.h>
#include <llvm/Pass.h>
#include <llvm/Support/Registry.h>
#include <llvmWrapper/IR/Instructions.h>
#include <map>
using namespace llvm;
#define DEBUG_TYPE "GenXBIFFlagCtrlResolution"
#define BIF_FLAG_CONTROL(BIF_FLAG_TYPE, BIF_FLAG_NAME) \
BIF_FLAG_CTRL_N_S(BIF_FLAG_NAME),
#define BIF_FLAG_CTRL_SET(BIF_FLAG_NAME, BIF_FLAG_VALUE) \
ListDelegates.emplace(BIF_FLAG_CTRL_N_S(BIF_FLAG_NAME), [this]() -> bool { \
return replace(BIF_FLAG_VALUE, pModule->getGlobalVariable( \
BIF_FLAG_CTRL_N_S(BIF_FLAG_NAME))); \
})
namespace {
class GenXBIFFlagCtrlResolution final : public llvm::ModulePass {
public:
// Pass identification, replacement for typeid
static char ID;
GenXBIFFlagCtrlResolution() : ModulePass(ID) {}
~GenXBIFFlagCtrlResolution() {}
virtual bool runOnModule(Module &M) override;
private:
Module *pModule = nullptr;
std::map<StringRef, std::function<bool()>> ListDelegates;
template <typename T> bool replace(T Value, GlobalVariable *GV);
void FillFlagCtrl();
};
} // namespace
void GenXBIFFlagCtrlResolution::FillFlagCtrl() {
// Here we can add more flags
// Provide in first argument BiF flag control defined in
// IGC/BiFModule/Headers/bif_flag_controls.h
// In second place provide the value which should be
// inserted for this flag. If needed feed class GenXBIFFlagCtrlResolution
// with new value from outside.
// Need to feed this correctly
BIF_FLAG_CTRL_SET(PlatformType, 0 /*platform.GetProductFamily()*/);
BIF_FLAG_CTRL_SET(RenderFamily, 0 /*platform.eRenderCoreFamily*/);
BIF_FLAG_CTRL_SET(FlushDenormals, true);
BIF_FLAG_CTRL_SET(DashGSpecified, false);
BIF_FLAG_CTRL_SET(FastRelaxedMath, false);
BIF_FLAG_CTRL_SET(MadEnable, false);
BIF_FLAG_CTRL_SET(UseNative64BitIntBuiltin, true);
BIF_FLAG_CTRL_SET(UseNative64BitFloatBuiltin, true);
BIF_FLAG_CTRL_SET(CRMacros, true);
BIF_FLAG_CTRL_SET(IsSPIRV, false);
BIF_FLAG_CTRL_SET(EnableSWSrgbWrites, false);
BIF_FLAG_CTRL_SET(ProfilingTimerResolution, 0.0f);
BIF_FLAG_CTRL_SET(UseMathWithLUT, false);
BIF_FLAG_CTRL_SET(UseHighAccuracyMath, false);
BIF_FLAG_CTRL_SET(UseAssumeInGetGlobalId, true);
// FIXME: target specific, but subtarget cannot be reached in middle-end.
BIF_FLAG_CTRL_SET(HasInt64SLMAtomicCAS, false);
BIF_FLAG_CTRL_SET(JointMatrixLoadStoreOpt, 3);
BIF_FLAG_CTRL_SET(OptDisable, false);
BIF_FLAG_CTRL_SET(UseNativeFP32GlobalAtomicAdd, false);
BIF_FLAG_CTRL_SET(UseNativeFP16AtomicMinMax, false);
BIF_FLAG_CTRL_SET(UseNativeFP64GlobalAtomicAdd, false);
BIF_FLAG_CTRL_SET(HasThreadPauseSupport, false);
BIF_FLAG_CTRL_SET(hasHWLocalThreadID, false);
BIF_FLAG_CTRL_SET(APIRS, false);
BIF_FLAG_CTRL_SET(UseLSC, false);
BIF_FLAG_CTRL_SET(UseBfn, false);
BIF_FLAG_CTRL_SET(ForceL1Prefetch, false);
BIF_FLAG_CTRL_SET(UseNativeFP64GlobalAtomicAdd, false);
BIF_FLAG_CTRL_SET(MaxHWThreadIDPerSubDevice, 1);
BIF_FLAG_CTRL_SET(UseOOBChecks, false);
BIF_FLAG_CTRL_SET(UseBindlessImage, false);
}
#undef BIF_FLAG_CTRL_SET
bool GenXBIFFlagCtrlResolution::runOnModule(Module &M) {
pModule = &M;
FillFlagCtrl();
std::vector<StringRef> listOfFlagNames{
#include "IGC/BiFModule/Headers/bif_flag_controls.h"
};
bool wasModuleUpdated = false;
for (size_t i = 0; i < listOfFlagNames.size(); ++i) {
StringRef &bif_flag = listOfFlagNames[i];
auto iter = ListDelegates.find(bif_flag);
if (iter != ListDelegates.end()) {
// Here we are replacing the Bif flag control if present,
// it's executing the delegate function
wasModuleUpdated |= iter->second();
} else {
IGC_ASSERT_EXIT_MESSAGE(
0, "[BIF_VC] Missing setup for flag %s in FillFlagCtrl function",
bif_flag.str().c_str());
}
}
return wasModuleUpdated;
}
#undef BIF_FLAG_CONTROL
template <typename T>
bool GenXBIFFlagCtrlResolution::replace(T Value, GlobalVariable *GV) {
bool Changed = false;
if (!GV)
return Changed;
if (std::is_enum<T>() || std::is_integral<T>()) {
GV->setInitializer(ConstantInt::getIntegerValue(
GV->getValueType(),
APInt((unsigned)GV->getValueType()->getPrimitiveSizeInBits(),
(unsigned int)Value, std::is_signed<T>())));
Changed = true;
} else if (std::is_floating_point<T>()) {
GV->setInitializer(ConstantFP::get(GV->getValueType(), (double)Value));
Changed = true;
} else {
IGC_ASSERT_EXIT_MESSAGE(0, "[BIF_VC] Not supported BiF flag control type");
}
return Changed;
}
char GenXBIFFlagCtrlResolution::ID = 0;
INITIALIZE_PASS_BEGIN(GenXBIFFlagCtrlResolution, "GenXBIFFlagCtrlResolution",
"GenXBIFFlagCtrlResolution", false, false)
INITIALIZE_PASS_END(GenXBIFFlagCtrlResolution, "GenXBIFFlagCtrlResolution",
"GenXBIFFlagCtrlResolution", false, false)
namespace llvm {
ModulePass *createGenXBIFFlagCtrlResolutionPass() {
initializeGenXBIFFlagCtrlResolutionPass(*PassRegistry::getPassRegistry());
return new GenXBIFFlagCtrlResolution;
}
} // namespace llvm
#if LLVM_VERSION_MAJOR >= 16
PreservedAnalyses
GenXBIFFlagCtrlResolutionPass::run(llvm::Module &M,
llvm::AnalysisManager<llvm::Module> &) {
GenXBIFFlagCtrlResolution GenXBiF;
if (GenXBiF.runOnModule(M))
return PreservedAnalyses::none();
return PreservedAnalyses::all();
}
// TODO: No lit-tests
#endif
|