1 //===-- SPIRVSubtarget.h - SPIR-V Subtarget Information --------*- C++ -*--===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file declares the SPIR-V specific subclass of TargetSubtargetInfo.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
14 #define LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
16 #include "SPIRVCallLowering.h"
17 #include "SPIRVFrameLowering.h"
18 #include "SPIRVISelLowering.h"
19 #include "SPIRVInstrInfo.h"
20 #include "llvm/ADT/SmallSet.h"
21 #include "llvm/CodeGen/GlobalISel/CallLowering.h"
22 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
23 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
24 #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
25 #include "llvm/CodeGen/TargetSubtargetInfo.h"
26 #include "llvm/IR/DataLayout.h"
27 #include "llvm/Target/TargetMachine.h"
28 #include "llvm/TargetParser/Triple.h"
30 #define GET_SUBTARGETINFO_HEADER
31 #include "SPIRVGenSubtargetInfo.inc"
35 class SPIRVTargetMachine
;
37 class SPIRVSubtarget
: public SPIRVGenSubtargetInfo
{
39 const unsigned PointerSize
;
40 VersionTuple SPIRVVersion
;
41 VersionTuple OpenCLVersion
;
43 SmallSet
<SPIRV::Extension::Extension
, 4> AvailableExtensions
;
44 SmallSet
<SPIRV::InstructionSet::InstructionSet
, 4> AvailableExtInstSets
;
45 std::unique_ptr
<SPIRVGlobalRegistry
> GR
;
47 SPIRVInstrInfo InstrInfo
;
48 SPIRVFrameLowering FrameLowering
;
49 SPIRVTargetLowering TLInfo
;
52 // GlobalISel related APIs.
53 std::unique_ptr
<CallLowering
> CallLoweringInfo
;
54 std::unique_ptr
<RegisterBankInfo
> RegBankInfo
;
55 std::unique_ptr
<LegalizerInfo
> Legalizer
;
56 std::unique_ptr
<InstructionSelector
> InstSelector
;
58 // TODO: Initialise the available extensions, extended instruction sets
59 // based on the environment settings.
60 void initAvailableExtensions();
61 void initAvailableExtInstSets();
64 // This constructor initializes the data members to match that
65 // of the specified triple.
66 SPIRVSubtarget(const Triple
&TT
, const std::string
&CPU
,
67 const std::string
&FS
, const SPIRVTargetMachine
&TM
);
68 SPIRVSubtarget
&initSubtargetDependencies(StringRef CPU
, StringRef FS
);
70 // Parses features string setting specified subtarget options.
71 // The definition of this function is auto generated by tblgen.
72 void ParseSubtargetFeatures(StringRef CPU
, StringRef TuneCPU
, StringRef FS
);
73 unsigned getPointerSize() const { return PointerSize
; }
74 unsigned getBound() const { return GR
->getBound(); }
75 bool canDirectlyComparePointers() const;
76 // TODO: this environment is not implemented in Triple, we need to decide
77 // how to standardize its support. For now, let's assume SPIR-V with physical
78 // addressing is OpenCL, and Logical addressing is Vulkan.
79 bool isOpenCLEnv() const {
80 return TargetTriple
.getArch() == Triple::spirv32
||
81 TargetTriple
.getArch() == Triple::spirv64
;
83 bool isVulkanEnv() const { return TargetTriple
.getArch() == Triple::spirv
; }
84 VersionTuple
getSPIRVVersion() const { return SPIRVVersion
; };
85 bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo
) const;
86 bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo
) const;
87 // TODO: implement command line args or other ways to determine this.
88 bool hasOpenCLFullProfile() const { return true; }
89 bool hasOpenCLImageSupport() const { return true; }
90 const SmallSet
<SPIRV::Extension::Extension
, 4> &
91 getAllAvailableExtensions() const {
92 return AvailableExtensions
;
94 bool canUseExtension(SPIRV::Extension::Extension E
) const;
95 bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E
) const;
97 SPIRVGlobalRegistry
*getSPIRVGlobalRegistry() const { return GR
.get(); }
99 const CallLowering
*getCallLowering() const override
{
100 return CallLoweringInfo
.get();
102 const RegisterBankInfo
*getRegBankInfo() const override
{
103 return RegBankInfo
.get();
105 const LegalizerInfo
*getLegalizerInfo() const override
{
106 return Legalizer
.get();
108 InstructionSelector
*getInstructionSelector() const override
{
109 return InstSelector
.get();
111 const SPIRVInstrInfo
*getInstrInfo() const override
{ return &InstrInfo
; }
112 const SPIRVFrameLowering
*getFrameLowering() const override
{
113 return &FrameLowering
;
115 const SPIRVTargetLowering
*getTargetLowering() const override
{
118 const SPIRVRegisterInfo
*getRegisterInfo() const override
{
119 return &InstrInfo
.getRegisterInfo();
122 static bool classof(const TargetSubtargetInfo
*ST
) {
123 return ST
->getTargetTriple().isSPIRV();
128 #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H