1ec259036SIlia Diachkov //===-- SPIRVSubtarget.cpp - SPIR-V Subtarget Information ------*- C++ -*--===// 2ec259036SIlia Diachkov // 3ec259036SIlia Diachkov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4ec259036SIlia Diachkov // See https://llvm.org/LICENSE.txt for license information. 5ec259036SIlia Diachkov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ec259036SIlia Diachkov // 7ec259036SIlia Diachkov //===----------------------------------------------------------------------===// 8ec259036SIlia Diachkov // 9ec259036SIlia Diachkov // This file implements the SPIR-V specific subclass of TargetSubtargetInfo. 10ec259036SIlia Diachkov // 11ec259036SIlia Diachkov //===----------------------------------------------------------------------===// 12ec259036SIlia Diachkov 13ec259036SIlia Diachkov #include "SPIRVSubtarget.h" 14ec259036SIlia Diachkov #include "SPIRV.h" 15*eab7d363SIlia Diachkov #include "SPIRVGlobalRegistry.h" 16*eab7d363SIlia Diachkov #include "SPIRVLegalizerInfo.h" 17ec259036SIlia Diachkov #include "SPIRVRegisterBankInfo.h" 18ec259036SIlia Diachkov #include "SPIRVTargetMachine.h" 19ec259036SIlia Diachkov #include "llvm/MC/TargetRegistry.h" 20ec259036SIlia Diachkov #include "llvm/Support/Host.h" 21ec259036SIlia Diachkov 22ec259036SIlia Diachkov using namespace llvm; 23ec259036SIlia Diachkov 24ec259036SIlia Diachkov #define DEBUG_TYPE "spirv-subtarget" 25ec259036SIlia Diachkov 26ec259036SIlia Diachkov #define GET_SUBTARGETINFO_TARGET_DESC 27ec259036SIlia Diachkov #define GET_SUBTARGETINFO_CTOR 28ec259036SIlia Diachkov #include "SPIRVGenSubtargetInfo.inc" 29ec259036SIlia Diachkov 30ec259036SIlia Diachkov // Compare version numbers, but allow 0 to mean unspecified. 31ec259036SIlia Diachkov static bool isAtLeastVer(uint32_t Target, uint32_t VerToCompareTo) { 32ec259036SIlia Diachkov return Target == 0 || Target >= VerToCompareTo; 33ec259036SIlia Diachkov } 34ec259036SIlia Diachkov 35ec259036SIlia Diachkov static unsigned computePointerSize(const Triple &TT) { 36ec259036SIlia Diachkov const auto Arch = TT.getArch(); 37ec259036SIlia Diachkov // TODO: unify this with pointers legalization. 38ec259036SIlia Diachkov assert(TT.isSPIRV()); 39ec259036SIlia Diachkov return Arch == Triple::spirv32 ? 32 : 64; 40ec259036SIlia Diachkov } 41ec259036SIlia Diachkov 42ec259036SIlia Diachkov SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU, 43ec259036SIlia Diachkov const std::string &FS, 44ec259036SIlia Diachkov const SPIRVTargetMachine &TM) 45ec259036SIlia Diachkov : SPIRVGenSubtargetInfo(TT, CPU, /*TuneCPU=*/CPU, FS), 46ec259036SIlia Diachkov PointerSize(computePointerSize(TT)), SPIRVVersion(0), InstrInfo(), 47ec259036SIlia Diachkov FrameLowering(initSubtargetDependencies(CPU, FS)), TLInfo(TM, *this) { 48*eab7d363SIlia Diachkov GR = std::make_unique<SPIRVGlobalRegistry>(PointerSize); 49*eab7d363SIlia Diachkov CallLoweringInfo = 50*eab7d363SIlia Diachkov std::make_unique<SPIRVCallLowering>(TLInfo, *this, GR.get()); 51*eab7d363SIlia Diachkov Legalizer = std::make_unique<SPIRVLegalizerInfo>(*this); 52ec259036SIlia Diachkov RegBankInfo = std::make_unique<SPIRVRegisterBankInfo>(); 53*eab7d363SIlia Diachkov InstSelector.reset( 54*eab7d363SIlia Diachkov createSPIRVInstructionSelector(TM, *this, *RegBankInfo.get())); 55ec259036SIlia Diachkov } 56ec259036SIlia Diachkov 57ec259036SIlia Diachkov SPIRVSubtarget &SPIRVSubtarget::initSubtargetDependencies(StringRef CPU, 58ec259036SIlia Diachkov StringRef FS) { 59ec259036SIlia Diachkov ParseSubtargetFeatures(CPU, /*TuneCPU=*/CPU, FS); 60ec259036SIlia Diachkov if (SPIRVVersion == 0) 61ec259036SIlia Diachkov SPIRVVersion = 14; 62ec259036SIlia Diachkov return *this; 63ec259036SIlia Diachkov } 64ec259036SIlia Diachkov 65ec259036SIlia Diachkov // If the SPIR-V version is >= 1.4 we can call OpPtrEqual and OpPtrNotEqual. 66ec259036SIlia Diachkov bool SPIRVSubtarget::canDirectlyComparePointers() const { 67ec259036SIlia Diachkov return isAtLeastVer(SPIRVVersion, 14); 68ec259036SIlia Diachkov } 69