File: SPIRVSubtarget.h

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,235,796 kB
  • sloc: cpp: 7,617,614; ansic: 1,433,901; asm: 1,058,726; python: 252,096; f90: 94,671; objc: 70,753; lisp: 42,813; pascal: 18,401; sh: 10,032; ml: 5,111; perl: 4,720; awk: 3,523; makefile: 3,401; javascript: 2,272; xml: 892; fortran: 770
file content (161 lines) | stat: -rw-r--r-- 5,991 bytes parent folder | download | duplicates (4)
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
161
//===-- SPIRVSubtarget.h - SPIR-V Subtarget Information --------*- C++ -*--===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file declares the SPIR-V specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
#define LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H

#include "SPIRVCallLowering.h"
#include "SPIRVFrameLowering.h"
#include "SPIRVISelLowering.h"
#include "SPIRVInlineAsmLowering.h"
#include "SPIRVInstrInfo.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/TargetParser/Triple.h"

#define GET_SUBTARGETINFO_HEADER
#include "SPIRVGenSubtargetInfo.inc"

namespace llvm {
class StringRef;
class SPIRVTargetMachine;

class SPIRVSubtarget : public SPIRVGenSubtargetInfo {
public:
  // Enum for the SPIR-V environment: Kernel, Shader or Unknown.
  enum SPIRVEnvType { Kernel, Shader, Unknown };

private:
  const unsigned PointerSize;
  VersionTuple SPIRVVersion;
  VersionTuple OpenCLVersion;

  SmallSet<SPIRV::Extension::Extension, 4> AvailableExtensions;
  SmallSet<SPIRV::InstructionSet::InstructionSet, 4> AvailableExtInstSets;
  std::unique_ptr<SPIRVGlobalRegistry> GR;

  SPIRVInstrInfo InstrInfo;
  SPIRVFrameLowering FrameLowering;
  SPIRVTargetLowering TLInfo;
  Triple TargetTriple;
  SPIRVEnvType Env;

  // GlobalISel related APIs.
  std::unique_ptr<CallLowering> CallLoweringInfo;
  std::unique_ptr<RegisterBankInfo> RegBankInfo;
  std::unique_ptr<LegalizerInfo> Legalizer;
  std::unique_ptr<InstructionSelector> InstSelector;
  std::unique_ptr<InlineAsmLowering> InlineAsmInfo;

  // TODO: Initialise the available extensions, extended instruction sets
  // based on the environment settings.
  void initAvailableExtInstSets();
  void accountForAMDShaderTrinaryMinmax();

public:
  // This constructor initializes the data members to match that
  // of the specified triple.
  SPIRVSubtarget(const Triple &TT, const std::string &CPU,
                 const std::string &FS, const SPIRVTargetMachine &TM);
  SPIRVSubtarget &initSubtargetDependencies(StringRef CPU, StringRef FS);

  void initAvailableExtensions(
      const std::set<SPIRV::Extension::Extension> &AllowedExtIds);

  // Parses features string setting specified subtarget options.
  // The definition of this function is auto generated by tblgen.
  void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
  unsigned getPointerSize() const { return PointerSize; }
  unsigned getBound() const { return GR->getBound(); }
  bool canDirectlyComparePointers() const;
  void setEnv(SPIRVEnvType E) {
    if (E == Unknown)
      report_fatal_error("Unknown environment is not allowed.");
    if (Env != Unknown)
      report_fatal_error("Environment is already set.");

    Env = E;
  }
  SPIRVEnvType getEnv() const { return Env; }
  bool isKernel() const { return getEnv() == Kernel; }
  bool isShader() const { return getEnv() == Shader; }
  bool isLogicalSPIRV() const {
    return TargetTriple.getArch() == Triple::spirv;
  }
  bool isPhysicalSPIRV() const {
    return TargetTriple.getArch() == Triple::spirv32 ||
           TargetTriple.getArch() == Triple::spirv64;
  }
  const std::string &getTargetTripleAsStr() const { return TargetTriple.str(); }
  VersionTuple getSPIRVVersion() const { return SPIRVVersion; };
  bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const;
  bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const;
  // TODO: implement command line args or other ways to determine this.
  bool hasOpenCLFullProfile() const { return true; }
  bool hasOpenCLImageSupport() const { return true; }
  const SmallSet<SPIRV::Extension::Extension, 4> &
  getAllAvailableExtensions() const {
    return AvailableExtensions;
  }
  bool canUseExtension(SPIRV::Extension::Extension E) const;
  bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const;
  SPIRV::InstructionSet::InstructionSet getPreferredInstructionSet() const;

  SPIRVGlobalRegistry *getSPIRVGlobalRegistry() const { return GR.get(); }

  const CallLowering *getCallLowering() const override {
    return CallLoweringInfo.get();
  }
  const RegisterBankInfo *getRegBankInfo() const override {
    return RegBankInfo.get();
  }
  const LegalizerInfo *getLegalizerInfo() const override {
    return Legalizer.get();
  }
  InstructionSelector *getInstructionSelector() const override {
    return InstSelector.get();
  }
  const InlineAsmLowering *getInlineAsmLowering() const override {
    return InlineAsmInfo.get();
  }
  const SPIRVInstrInfo *getInstrInfo() const override { return &InstrInfo; }
  const SPIRVFrameLowering *getFrameLowering() const override {
    return &FrameLowering;
  }
  const SPIRVTargetLowering *getTargetLowering() const override {
    return &TLInfo;
  }
  const SPIRVRegisterInfo *getRegisterInfo() const override {
    return &InstrInfo.getRegisterInfo();
  }

  static bool classof(const TargetSubtargetInfo *ST) {
    return ST->getTargetTriple().isSPIRV();
  }

  static constexpr unsigned MaxLegalAddressSpace = 6;

  // Adds known SPIR-V extensions to the global list of allowed extensions that
  // SPIRVSubtarget module owns as
  // cl::opt<std::set<SPIRV::Extension::Extension>, ...> global variable.
  static void
  addExtensionsToClOpt(const std::set<SPIRV::Extension::Extension> &AllowList);
};
} // namespace llvm

#endif // LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H