frasercrmck created this revision. frasercrmck added reviewers: craig.topper, rogfer01, HsiangKai, evandro, arcbbb, khchen. Herald added subscribers: vkmr, luismarques, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, edward-jones, zzheng, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, simoncook, johnrusso, rbar, asb. frasercrmck requested review of this revision. Herald added subscribers: cfe-commits, MaskRay. Herald added a project: clang.
This patch begins the process of supporting the `vscale_range` attribute for RVV. It implements it according to our supported v0.10 version of the specification, as opposed to the imminent v1.0. Most notably, this patch implements the attribute conservatively according to the minimum and maximum values of VLEN according to the specification. However, the backend can be given more information about VLEN using the `-riscv-v-vector-bits-min` and `-riscv-v-vector-bits-max` flags. This means that the API it aims to replace, `TargetTransformInfo::getMaxVScale`, may still generate better code with its better knowledge. It is unclear whether we want to move those backend options up into the frontend, whether we are able to allow the backend to infer all information from the IR attribute, or whether we even want to do that; that's a wider discussion. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D107290 Files: clang/lib/Basic/Targets/RISCV.cpp clang/lib/Basic/Targets/RISCV.h clang/test/CodeGen/riscv-vscale-range.c Index: clang/test/CodeGen/riscv-vscale-range.c =================================================================== --- /dev/null +++ clang/test/CodeGen/riscv-vscale-range.c @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +experimental-v -S -emit-llvm -o - %s | FileCheck %s + +// CHECK-LABEL: @func() #0 +// CHECK: attributes #0 = { {{.*}} vscale_range(2,1024) {{.*}} } +void func() {} Index: clang/lib/Basic/Targets/RISCV.h =================================================================== --- clang/lib/Basic/Targets/RISCV.h +++ clang/lib/Basic/Targets/RISCV.h @@ -111,7 +111,11 @@ DiagnosticsEngine &Diags) override; bool hasExtIntType() const override { return true; } + + Optional<std::pair<unsigned, unsigned>> + getVScaleRange(const LangOptions &LangOpts) const override; }; + class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo { public: RISCV32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) Index: clang/lib/Basic/Targets/RISCV.cpp =================================================================== --- clang/lib/Basic/Targets/RISCV.cpp +++ clang/lib/Basic/Targets/RISCV.cpp @@ -335,6 +335,20 @@ return true; } +Optional<std::pair<unsigned, unsigned>> +RISCVTargetInfo::getVScaleRange(const LangOptions &LangOpts) const { + if (!HasV) + return None; + // VLEN is defined in v0.10 to be at least 128 bits and at most 65536 bits, + // and vscale is VLEN/64. + // FIXME: v1.0 removes the minimum value. + // FIXME: The backend can be told about the more specific minimum/maximum + // VLEN but the frontend can't access this information. + unsigned VLENMin = 128; + unsigned VLENMax = 65536; + return std::make_pair(VLENMin / 64, VLENMax / 64); +} + bool RISCV32TargetInfo::isValidCPUName(StringRef Name) const { return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name), /*Is64Bit=*/false);
Index: clang/test/CodeGen/riscv-vscale-range.c =================================================================== --- /dev/null +++ clang/test/CodeGen/riscv-vscale-range.c @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -triple riscv64 -target-feature +experimental-v -S -emit-llvm -o - %s | FileCheck %s + +// CHECK-LABEL: @func() #0 +// CHECK: attributes #0 = { {{.*}} vscale_range(2,1024) {{.*}} } +void func() {} Index: clang/lib/Basic/Targets/RISCV.h =================================================================== --- clang/lib/Basic/Targets/RISCV.h +++ clang/lib/Basic/Targets/RISCV.h @@ -111,7 +111,11 @@ DiagnosticsEngine &Diags) override; bool hasExtIntType() const override { return true; } + + Optional<std::pair<unsigned, unsigned>> + getVScaleRange(const LangOptions &LangOpts) const override; }; + class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo { public: RISCV32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) Index: clang/lib/Basic/Targets/RISCV.cpp =================================================================== --- clang/lib/Basic/Targets/RISCV.cpp +++ clang/lib/Basic/Targets/RISCV.cpp @@ -335,6 +335,20 @@ return true; } +Optional<std::pair<unsigned, unsigned>> +RISCVTargetInfo::getVScaleRange(const LangOptions &LangOpts) const { + if (!HasV) + return None; + // VLEN is defined in v0.10 to be at least 128 bits and at most 65536 bits, + // and vscale is VLEN/64. + // FIXME: v1.0 removes the minimum value. + // FIXME: The backend can be told about the more specific minimum/maximum + // VLEN but the frontend can't access this information. + unsigned VLENMin = 128; + unsigned VLENMax = 65536; + return std::make_pair(VLENMin / 64, VLENMax / 64); +} + bool RISCV32TargetInfo::isValidCPUName(StringRef Name) const { return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name), /*Is64Bit=*/false);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits