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
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2023-2024 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
//
/// GenXInitBiFConstants
/// --------------------
///
/// This pass initializes some special global constants from BiFs with target
/// specific values.
///
//===----------------------------------------------------------------------===//
#include "GenX.h"
#include "GenXSubtarget.h"
#include "GenXTargetMachine.h"
#include <llvm/CodeGen/TargetPassConfig.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Module.h>
#include <llvm/Linker/Linker.h>
#include <llvm/Pass.h>
using namespace llvm;
class GenXInitBiFConstants final : public ModulePass {
public:
static char ID;
GenXInitBiFConstants() : ModulePass(ID) {}
StringRef getPassName() const override {
return "GenX initialize BiF constants";
}
void getAnalysisUsage(AnalysisUsage &AU) const override;
bool runOnModule(Module &M) override;
private:
const GenXSubtarget *ST = nullptr;
Module *M = nullptr;
bool initGlobalConstant(StringRef Name, uint32_t Value);
};
char GenXInitBiFConstants::ID = 0;
namespace llvm {
void initializeGenXInitBiFConstantsPass(PassRegistry &);
} // end namespace llvm
INITIALIZE_PASS_BEGIN(GenXInitBiFConstants, "GenXInitBiFConstants",
"GenXInitBiFConstants", false, false)
INITIALIZE_PASS_END(GenXInitBiFConstants, "GenXInitBiFConstants",
"GenXInitBiFConstants", false, false)
ModulePass *llvm::createGenXInitBiFConstantsPass() {
initializeGenXInitBiFConstantsPass(*PassRegistry::getPassRegistry());
return new GenXInitBiFConstants;
}
void GenXInitBiFConstants::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<TargetPassConfig>();
}
bool GenXInitBiFConstants::runOnModule(Module &Mod) {
M = &Mod;
ST = &getAnalysis<TargetPassConfig>()
.getTM<GenXTargetMachine>()
.getGenXSubtarget();
bool Result = false;
Result |= initGlobalConstant("__cm_cl_MaxHWThreadIDPerSubDevice",
ST->getMaxThreadsNumPerSubDevice());
Result |= initGlobalConstant("__cm_cl_TargetSupportsIEEE",
ST->hasIEEEDivSqrt());
return Result;
}
bool GenXInitBiFConstants::initGlobalConstant(StringRef Name, uint32_t Value) {
IGC_ASSERT_EXIT(M);
auto *Global = M->getGlobalVariable(Name);
if (!Global)
return false;
Global->setInitializer(ConstantInt::get(Global->getValueType(), Value));
Global->setLinkage(GlobalValue::LinkageTypes::PrivateLinkage);
Global->setConstant(true);
return true;
}
|