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
|
/*========================== 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 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(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);
// 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(ForceL1Prefetch, false);
BIF_FLAG_CTRL_SET(UseNativeFP64GlobalAtomicAdd, false);
BIF_FLAG_CTRL_SET(MaxHWThreadIDPerSubDevice, 1);
}
#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
|