diff options
Diffstat (limited to 'llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp')
| -rw-r--r-- | llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index 6721c60834bd..1503f263e42c 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -37,6 +37,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTarget() { // Register the target. RegisterTargetMachine<SPIRVTargetMachine> X(getTheSPIRV32Target()); RegisterTargetMachine<SPIRVTargetMachine> Y(getTheSPIRV64Target()); + RegisterTargetMachine<SPIRVTargetMachine> Z(getTheSPIRVLogicalTarget()); PassRegistry &PR = *PassRegistry::getPassRegistry(); initializeGlobalISel(PR); @@ -45,6 +46,11 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTarget() { static std::string computeDataLayout(const Triple &TT) { const auto Arch = TT.getArch(); + // TODO: this probably needs to be revisited: + // Logical SPIR-V has no pointer size, so any fixed pointer size would be + // wrong. The choice to default to 32 or 64 is just motivated by another + // memory model used for graphics: PhysicalStorageBuffer64. But it shouldn't + // mean anything. if (Arch == Triple::spirv32) return "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-" "v96:128-v192:256-v256:256-v512:512-v1024:1024"; @@ -66,7 +72,7 @@ SPIRVTargetMachine::SPIRVTargetMachine(const Target &T, const Triple &TT, const TargetOptions &Options, std::optional<Reloc::Model> RM, std::optional<CodeModel::Model> CM, - CodeGenOpt::Level OL, bool JIT) + CodeGenOptLevel OL, bool JIT) : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options, getEffectiveRelocModel(RM), getEffectiveCodeModel(CM, CodeModel::Small), OL), @@ -84,7 +90,7 @@ namespace { class SPIRVPassConfig : public TargetPassConfig { public: SPIRVPassConfig(SPIRVTargetMachine &TM, PassManagerBase &PM) - : TargetPassConfig(TM, PM) {} + : TargetPassConfig(TM, PM), TM(TM) {} SPIRVTargetMachine &getSPIRVTargetMachine() const { return getTM<SPIRVTargetMachine>(); @@ -103,6 +109,9 @@ public: void addOptimizedRegAlloc() override {} void addPostRegAlloc() override; + +private: + const SPIRVTargetMachine &TM; }; } // namespace @@ -144,7 +153,7 @@ TargetPassConfig *SPIRVTargetMachine::createPassConfig(PassManagerBase &PM) { void SPIRVPassConfig::addIRPasses() { TargetPassConfig::addIRPasses(); addPass(createSPIRVRegularizerPass()); - addPass(createSPIRVPrepareFunctionsPass()); + addPass(createSPIRVPrepareFunctionsPass(TM)); } void SPIRVPassConfig::addISelPrepare() { |
