Commit 1812ee9a authored by Justin Holewinski's avatar Justin Holewinski
Browse files

[NVPTX] Add more precise PTX/SM target attributes

Each SM and PTX version is modeled as a subtarget feature/CPU. Additionally,
PTX 3.1 is added as the default PTX version to be out-of-the-box compatible
with CUDA 5.0.

Available CPUs for this target:

  sm_10 - Select the sm_10 processor.
  sm_11 - Select the sm_11 processor.
  sm_12 - Select the sm_12 processor.
  sm_13 - Select the sm_13 processor.
  sm_20 - Select the sm_20 processor.
  sm_21 - Select the sm_21 processor.
  sm_30 - Select the sm_30 processor.
  sm_35 - Select the sm_35 processor.

Available features for this target:

  ptx30 - Use PTX version 3.0.
  ptx31 - Use PTX version 3.1.
  sm_10 - Target SM 1.0.
  sm_11 - Target SM 1.1.
  sm_12 - Target SM 1.2.
  sm_13 - Target SM 1.3.
  sm_20 - Target SM 2.0.
  sm_21 - Target SM 2.1.
  sm_30 - Target SM 3.0.
  sm_35 - Target SM 3.5.

llvm-svn: 167699
parent f963a8ff
Loading
Loading
Loading
Loading
+32 −2
Original line number Diff line number Diff line
@@ -24,7 +24,30 @@ include "NVPTXInstrInfo.td"
// - Need at least one feature to avoid generating zero sized array by
//   TableGen in NVPTXGenSubtarget.inc.
//===----------------------------------------------------------------------===//
def FeatureDummy  : SubtargetFeature<"dummy", "dummy", "true", "">;

// SM Versions
def SM10 : SubtargetFeature<"sm_10", "SmVersion", "10",
                            "Target SM 1.0">;
def SM11 : SubtargetFeature<"sm_11", "SmVersion", "11",
                            "Target SM 1.1">;
def SM12 : SubtargetFeature<"sm_12", "SmVersion", "12",
                            "Target SM 1.2">;
def SM13 : SubtargetFeature<"sm_13", "SmVersion", "13",
                            "Target SM 1.3">;
def SM20 : SubtargetFeature<"sm_20", "SmVersion", "20",
                            "Target SM 2.0">;
def SM21 : SubtargetFeature<"sm_21", "SmVersion", "21",
                            "Target SM 2.1">;
def SM30 : SubtargetFeature<"sm_30", "SmVersion", "30",
                            "Target SM 3.0">;
def SM35 : SubtargetFeature<"sm_35", "SmVersion", "35",
                            "Target SM 3.5">;

// PTX Versions
def PTX30 : SubtargetFeature<"ptx30", "PTXVersion", "30",
                             "Use PTX version 3.0">;
def PTX31 : SubtargetFeature<"ptx31", "PTXVersion", "31",
                             "Use PTX version 3.1">;

//===----------------------------------------------------------------------===//
// NVPTX supported processors.
@@ -33,7 +56,14 @@ def FeatureDummy : SubtargetFeature<"dummy", "dummy", "true", "">;
class Proc<string Name, list<SubtargetFeature> Features>
 : Processor<Name, NoItineraries, Features>;

def : Proc<"sm_10", [FeatureDummy]>;
def : Proc<"sm_10", [SM10]>;
def : Proc<"sm_11", [SM11]>;
def : Proc<"sm_12", [SM12]>;
def : Proc<"sm_13", [SM13]>;
def : Proc<"sm_20", [SM20]>;
def : Proc<"sm_21", [SM21]>;
def : Proc<"sm_30", [SM30]>;
def : Proc<"sm_35", [SM35]>;


def NVPTXInstrInfo : InstrInfo {
+2 −1
Original line number Diff line number Diff line
@@ -910,7 +910,8 @@ void NVPTXAsmPrinter::emitHeader (Module &M, raw_ostream &O) {
  O << "//\n";
  O << "\n";

  O << ".version 3.0\n";
  unsigned PTXVersion = nvptxSubtarget.getPTXVersion();
  O << ".version " << (PTXVersion / 10) << "." << (PTXVersion % 10) << "\n";

  O << ".target ";
  O << nvptxSubtarget.getTargetName();
+14 −6
Original line number Diff line number Diff line
@@ -34,16 +34,18 @@ DriverInterface(cl::desc("Choose driver interface:"),

NVPTXSubtarget::NVPTXSubtarget(const std::string &TT, const std::string &CPU,
                               const std::string &FS, bool is64Bit)
:NVPTXGenSubtargetInfo(TT, "", FS), // Don't pass CPU to subtarget,
 // because we don't register all
 // nvptx targets.
 Is64Bit(is64Bit) {
: NVPTXGenSubtargetInfo(TT, CPU, FS),
  Is64Bit(is64Bit),
  PTXVersion(0),
  SmVersion(10) {

  drvInterface = DriverInterface;

  // Provide the default CPU if none
  std::string defCPU = "sm_10";

  ParseSubtargetFeatures((CPU.empty() ? defCPU : CPU), FS);

  // Get the TargetName from the FS if available
  if (FS.empty() && CPU.empty())
    TargetName = defCPU;
@@ -52,6 +54,12 @@ NVPTXSubtarget::NVPTXSubtarget(const std::string &TT, const std::string &CPU,
  else
    llvm_unreachable("we are not using FeatureStr");

  // Set up the SmVersion
  SmVersion = atoi(TargetName.c_str()+3);
  // We default to PTX 3.1, but we cannot just default to it in the initializer
  // since the attribute parser checks if the given option is >= the default.
  // So if we set ptx31 as the default, the ptx30 attribute would never match.
  // Instead, we use 0 as the default and manually set 31 if the default is
  // used.
  if (PTXVersion == 0) {
    PTXVersion = 31;
  }
}
+9 −2
Original line number Diff line number Diff line
@@ -26,12 +26,17 @@ namespace llvm {

class NVPTXSubtarget : public NVPTXGenSubtargetInfo {
  
  unsigned int SmVersion;
  std::string TargetName;
  NVPTX::DrvInterface drvInterface;
  bool dummy; // For the 'dummy' feature, see NVPTX.td
  bool Is64Bit;

  // PTX version x.y is represented as 10*x+y, e.g. 3.1 == 31
  unsigned PTXVersion;

  // SM version x.y is represented as 10*x+y, e.g. 3.1 == 31
  unsigned int SmVersion;

public:
  /// This constructor initializes the data members to match that
  /// of the specified module.
@@ -69,6 +74,8 @@ public:
  NVPTX::DrvInterface getDrvInterface() const { return drvInterface; }
  std::string getTargetName() const { return TargetName; }

  unsigned getPTXVersion() const { return PTXVersion; }

  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);

  std::string getDataLayout() const {
+6 −0
Original line number Diff line number Diff line
; RUN: llc < %s -march=nvptx -mcpu=sm_20 -mattr=ptx30 | FileCheck %s
; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -mattr=ptx30 | FileCheck %s


; CHECK: .version 3.0
Loading