diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Basic/Targets/AMDGPU.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/Basic/Targets/AMDGPU.cpp | 309 | 
1 files changed, 131 insertions, 178 deletions
diff --git a/contrib/llvm/tools/clang/lib/Basic/Targets/AMDGPU.cpp b/contrib/llvm/tools/clang/lib/Basic/Targets/AMDGPU.cpp index 4c510e47379f..b6b9aa2f1244 100644 --- a/contrib/llvm/tools/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/contrib/llvm/tools/clang/lib/Basic/Targets/AMDGPU.cpp @@ -30,64 +30,35 @@ namespace targets {  static const char *const DataLayoutStringR600 =      "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" -    "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"; +    "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5"; -static const char *const DataLayoutStringSIPrivateIsZero = -    "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32" +static const char *const DataLayoutStringAMDGCN = +    "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32"      "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" -    "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"; - -static const char *const DataLayoutStringSIGenericIsZero = -    "e-p:64:64-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:32:32" -    "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" -    "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-A5"; - -static const LangASMap AMDGPUPrivIsZeroDefIsGenMap = { -    4, // Default -    1, // opencl_global -    3, // opencl_local -    2, // opencl_constant -    0, // opencl_private -    4, // opencl_generic -    1, // cuda_device -    2, // cuda_constant -    3  // cuda_shared +    "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5"; + +const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = { +    Generic,  // Default +    Global,   // opencl_global +    Local,    // opencl_local +    Constant, // opencl_constant +    Private,  // opencl_private +    Generic,  // opencl_generic +    Global,   // cuda_device +    Constant, // cuda_constant +    Local     // cuda_shared  }; -static const LangASMap AMDGPUGenIsZeroDefIsGenMap = { -    0, // Default -    1, // opencl_global -    3, // opencl_local -    2, // opencl_constant -    5, // opencl_private -    0, // opencl_generic -    1, // cuda_device -    2, // cuda_constant -    3  // cuda_shared -}; - -static const LangASMap AMDGPUPrivIsZeroDefIsPrivMap = { -    0, // Default -    1, // opencl_global -    3, // opencl_local -    2, // opencl_constant -    0, // opencl_private -    4, // opencl_generic -    1, // cuda_device -    2, // cuda_constant -    3  // cuda_shared -}; - -static const LangASMap AMDGPUGenIsZeroDefIsPrivMap = { -    5, // Default -    1, // opencl_global -    3, // opencl_local -    2, // opencl_constant -    5, // opencl_private -    0, // opencl_generic -    1, // cuda_device -    2, // cuda_constant -    3  // cuda_shared +const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = { +    Private,  // Default +    Global,   // opencl_global +    Local,    // opencl_local +    Constant, // opencl_constant +    Private,  // opencl_private +    Generic,  // opencl_generic +    Global,   // cuda_device +    Constant, // cuda_constant +    Local     // cuda_shared  };  } // namespace targets  } // namespace clang @@ -144,7 +115,7 @@ const char *const AMDGPUTargetInfo::GCCRegNames[] = {    "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", "s112",    "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121",    "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc", -  "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi",  +  "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi",    "flat_scratch_lo", "flat_scratch_hi"  }; @@ -157,49 +128,66 @@ bool AMDGPUTargetInfo::initFeatureMap(      const std::vector<std::string> &FeatureVec) const {    // XXX - What does the member GPU mean if device name string passed here? -  if (getTriple().getArch() == llvm::Triple::amdgcn) { +  if (isAMDGCN(getTriple())) {      if (CPU.empty()) -      CPU = "tahiti"; - -    switch (parseAMDGCNName(CPU)) { -    case GK_GFX6: -    case GK_GFX7: -      break; +      CPU = "gfx600"; -    case GK_GFX9: +    switch (parseAMDGCNName(CPU).Kind) { +    case GK_GFX906: +      Features["dl-insts"] = true; +      LLVM_FALLTHROUGH; +    case GK_GFX904: +    case GK_GFX902: +    case GK_GFX900:        Features["gfx9-insts"] = true;        LLVM_FALLTHROUGH; -    case GK_GFX8: -      Features["s-memrealtime"] = true; +    case GK_GFX810: +    case GK_GFX803: +    case GK_GFX802: +    case GK_GFX801:        Features["16-bit-insts"] = true;        Features["dpp"] = true; +      Features["s-memrealtime"] = true; +      break; +    case GK_GFX704: +    case GK_GFX703: +    case GK_GFX702: +    case GK_GFX701: +    case GK_GFX700: +    case GK_GFX601: +    case GK_GFX600:        break; -      case GK_NONE:        return false;      default: -      llvm_unreachable("unhandled subtarget"); +      llvm_unreachable("Unhandled GPU!");      }    } else {      if (CPU.empty())        CPU = "r600"; -    switch (parseR600Name(CPU)) { -    case GK_R600: -    case GK_R700: -    case GK_EVERGREEN: -    case GK_NORTHERN_ISLANDS: -      break; -    case GK_R600_DOUBLE_OPS: -    case GK_R700_DOUBLE_OPS: -    case GK_EVERGREEN_DOUBLE_OPS: +    switch (parseR600Name(CPU).Kind) {      case GK_CAYMAN: +    case GK_CYPRESS: +    case GK_RV770: +    case GK_RV670:        // TODO: Add fp64 when implemented.        break; -    case GK_NONE: -      return false; +    case GK_TURKS: +    case GK_CAICOS: +    case GK_BARTS: +    case GK_SUMO: +    case GK_REDWOOD: +    case GK_JUNIPER: +    case GK_CEDAR: +    case GK_RV730: +    case GK_RV710: +    case GK_RS880: +    case GK_R630: +    case GK_R600: +      break;      default: -      llvm_unreachable("unhandled subtarget"); +      llvm_unreachable("Unhandled GPU!");      }    } @@ -210,6 +198,7 @@ void AMDGPUTargetInfo::adjustTargetOptions(const CodeGenOptions &CGOpts,                                             TargetOptions &TargetOpts) const {    bool hasFP32Denormals = false;    bool hasFP64Denormals = false; +  GPUInfo CGOptsGPU = parseGPUName(TargetOpts.CPU);    for (auto &I : TargetOpts.FeaturesAsWritten) {      if (I == "+fp32-denormals" || I == "-fp32-denormals")        hasFP32Denormals = true; @@ -218,120 +207,68 @@ void AMDGPUTargetInfo::adjustTargetOptions(const CodeGenOptions &CGOpts,    }    if (!hasFP32Denormals)      TargetOpts.Features.push_back( -        (Twine(hasFullSpeedFMAF32(TargetOpts.CPU) && !CGOpts.FlushDenorm +        (Twine(CGOptsGPU.HasFastFMAF && !CGOpts.FlushDenorm                     ? '+'                     : '-') +           Twine("fp32-denormals"))              .str());    // Always do not flush fp64 or fp16 denorms. -  if (!hasFP64Denormals && hasFP64) +  if (!hasFP64Denormals && CGOptsGPU.HasFP64)      TargetOpts.Features.push_back("+fp64-fp16-denormals");  } -AMDGPUTargetInfo::GPUKind AMDGPUTargetInfo::parseR600Name(StringRef Name) { -  return llvm::StringSwitch<GPUKind>(Name) -      .Case("r600", GK_R600) -      .Case("rv610", GK_R600) -      .Case("rv620", GK_R600) -      .Case("rv630", GK_R600) -      .Case("rv635", GK_R600) -      .Case("rs780", GK_R600) -      .Case("rs880", GK_R600) -      .Case("rv670", GK_R600_DOUBLE_OPS) -      .Case("rv710", GK_R700) -      .Case("rv730", GK_R700) -      .Case("rv740", GK_R700_DOUBLE_OPS) -      .Case("rv770", GK_R700_DOUBLE_OPS) -      .Case("palm", GK_EVERGREEN) -      .Case("cedar", GK_EVERGREEN) -      .Case("sumo", GK_EVERGREEN) -      .Case("sumo2", GK_EVERGREEN) -      .Case("redwood", GK_EVERGREEN) -      .Case("juniper", GK_EVERGREEN) -      .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS) -      .Case("cypress", GK_EVERGREEN_DOUBLE_OPS) -      .Case("barts", GK_NORTHERN_ISLANDS) -      .Case("turks", GK_NORTHERN_ISLANDS) -      .Case("caicos", GK_NORTHERN_ISLANDS) -      .Case("cayman", GK_CAYMAN) -      .Case("aruba", GK_CAYMAN) -      .Default(GK_NONE); +constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::InvalidGPU; +constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::R600GPUs[]; +constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::AMDGCNGPUs[]; + +AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseR600Name(StringRef Name) { +  const auto *Result = llvm::find_if( +      R600GPUs, [Name](const GPUInfo &GPU) { return GPU.Name == Name; }); + +  if (Result == std::end(R600GPUs)) +    return InvalidGPU; +  return *Result;  } -AMDGPUTargetInfo::GPUKind AMDGPUTargetInfo::parseAMDGCNName(StringRef Name) { -  return llvm::StringSwitch<GPUKind>(Name) -      .Case("gfx600", GK_GFX6) -      .Case("tahiti", GK_GFX6) -      .Case("gfx601", GK_GFX6) -      .Case("pitcairn", GK_GFX6) -      .Case("verde", GK_GFX6) -      .Case("oland", GK_GFX6) -      .Case("hainan", GK_GFX6) -      .Case("gfx700", GK_GFX7) -      .Case("bonaire", GK_GFX7) -      .Case("kaveri", GK_GFX7) -      .Case("gfx701", GK_GFX7) -      .Case("hawaii", GK_GFX7) -      .Case("gfx702", GK_GFX7) -      .Case("gfx703", GK_GFX7) -      .Case("kabini", GK_GFX7) -      .Case("mullins", GK_GFX7) -      .Case("gfx800", GK_GFX8) -      .Case("iceland", GK_GFX8) -      .Case("gfx801", GK_GFX8) -      .Case("carrizo", GK_GFX8) -      .Case("gfx802", GK_GFX8) -      .Case("tonga", GK_GFX8) -      .Case("gfx803", GK_GFX8) -      .Case("fiji", GK_GFX8) -      .Case("polaris10", GK_GFX8) -      .Case("polaris11", GK_GFX8) -      .Case("gfx804", GK_GFX8) -      .Case("gfx810", GK_GFX8) -      .Case("stoney", GK_GFX8) -      .Case("gfx900", GK_GFX9) -      .Case("gfx901", GK_GFX9) -      .Case("gfx902", GK_GFX9) -      .Case("gfx903", GK_GFX9) -      .Default(GK_NONE); +AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseAMDGCNName(StringRef Name) { +  const auto *Result = llvm::find_if( +      AMDGCNGPUs, [Name](const GPUInfo &GPU) { return GPU.Name == Name; }); + +  if (Result == std::end(AMDGCNGPUs)) +    return InvalidGPU; +  return *Result; +} + +AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseGPUName(StringRef Name) const { +  if (isAMDGCN(getTriple())) +    return parseAMDGCNName(Name); +  else +    return parseR600Name(Name); +} + +void AMDGPUTargetInfo::fillValidCPUList( +    SmallVectorImpl<StringRef> &Values) const { +  if (isAMDGCN(getTriple())) +    llvm::for_each(AMDGCNGPUs, [&Values](const GPUInfo &GPU) { +                   Values.emplace_back(GPU.Name);}); +  else +    llvm::for_each(R600GPUs, [&Values](const GPUInfo &GPU) { +                   Values.emplace_back(GPU.Name);});  }  void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) { -  if (isGenericZero(getTriple())) { -    AddrSpaceMap = DefaultIsPrivate ? &AMDGPUGenIsZeroDefIsPrivMap -                                    : &AMDGPUGenIsZeroDefIsGenMap; -  } else { -    AddrSpaceMap = DefaultIsPrivate ? &AMDGPUPrivIsZeroDefIsPrivMap -                                    : &AMDGPUPrivIsZeroDefIsGenMap; -  } +  AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap : &AMDGPUDefIsGenMap;  }  AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,                                     const TargetOptions &Opts)      : TargetInfo(Triple), -      GPU(isAMDGCN(Triple) ? GK_GFX6 : parseR600Name(Opts.CPU)), -      hasFP64(false), hasFMAF(false), hasLDEXPF(false), -      AS(isGenericZero(Triple)) { -  if (getTriple().getArch() == llvm::Triple::amdgcn) { -    hasFP64 = true; -    hasFMAF = true; -    hasLDEXPF = true; -  } -  if (getTriple().getArch() == llvm::Triple::r600) { -    if (GPU == GK_EVERGREEN_DOUBLE_OPS || GPU == GK_CAYMAN) { -      hasFMAF = true; -    } -  } -  auto IsGenericZero = isGenericZero(Triple); -  resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn -                      ? (IsGenericZero ? DataLayoutStringSIGenericIsZero -                                       : DataLayoutStringSIPrivateIsZero) -                      : DataLayoutStringR600); -  assert(DataLayout->getAllocaAddrSpace() == AS.Private); +      GPU(isAMDGCN(Triple) ? AMDGCNGPUs[0] : parseR600Name(Opts.CPU)) { +  resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN +                                        : DataLayoutStringR600); +  assert(DataLayout->getAllocaAddrSpace() == Private);    setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D || -                     Triple.getEnvironment() == llvm::Triple::OpenCL || -                     Triple.getEnvironmentName() == "amdgizcl" ||                       !isAMDGCN(Triple));    UseAddrSpaceMapMangling = true; @@ -349,7 +286,11 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,  void AMDGPUTargetInfo::adjust(LangOptions &Opts) {    TargetInfo::adjust(Opts); -  setAddressSpaceMap(Opts.OpenCL || !isAMDGCN(getTriple())); +  // ToDo: There are still a few places using default address space as private +  // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL +  // can be removed from the following line. +  setAddressSpaceMap(/*DefaultIsPrivate=*/Opts.OpenCL || +                     !isAMDGCN(getTriple()));  }  ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const { @@ -359,15 +300,27 @@ ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {  void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,                                          MacroBuilder &Builder) const { -  if (getTriple().getArch() == llvm::Triple::amdgcn) +  Builder.defineMacro("__AMD__"); +  Builder.defineMacro("__AMDGPU__"); + +  if (isAMDGCN(getTriple()))      Builder.defineMacro("__AMDGCN__");    else      Builder.defineMacro("__R600__"); -  if (hasFMAF) +  if (GPU.Kind != GK_NONE) +    Builder.defineMacro(Twine("__") + Twine(GPU.CanonicalName) + Twine("__")); + +  // TODO: __HAS_FMAF__, __HAS_LDEXPF__, __HAS_FP64__ are deprecated and will be +  // removed in the near future. +  if (GPU.HasFMAF)      Builder.defineMacro("__HAS_FMAF__"); -  if (hasLDEXPF) +  if (GPU.HasFastFMAF) +    Builder.defineMacro("FP_FAST_FMAF"); +  if (GPU.HasLDEXPF)      Builder.defineMacro("__HAS_LDEXPF__"); -  if (hasFP64) +  if (GPU.HasFP64)      Builder.defineMacro("__HAS_FP64__"); +  if (GPU.HasFastFMA) +    Builder.defineMacro("FP_FAST_FMA");  }  | 
