reames created this revision. reames added a reviewer: craig.topper. Herald added subscribers: sunshaoce, VincentWu, StephenFan, vkmr, frasercrmck, evandro, luismarques, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, bollu, simoncook, johnrusso, rbar, asb, arichardson, mcrosier. Herald added a project: All. reames requested review of this revision. Herald added subscribers: cfe-commits, pcwang-thead, eopXD, MaskRay. Herald added projects: clang, LLVM.
Follow up on D135894 <https://reviews.llvm.org/D135894>, restructure code to work in terms of minimum and maximum VLEN coming from RISCVISAInfo.cpp. In the original review, I'd mentioned that MinVLEN was sometimes zero. That's still true, but apparently only happens if you specify multiple extensions in the -target_feature string. So, we can at least test "v" and "zve64x" on their own before I go figure out exactly what's going wrong regarding e.g. parsing "+v,+zvl512b". Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D136106 Files: clang/lib/Basic/Targets/RISCV.cpp clang/test/CodeGen/riscv-vector-bits-vscale-range.c llvm/include/llvm/Support/RISCVISAInfo.h Index: llvm/include/llvm/Support/RISCVISAInfo.h =================================================================== --- llvm/include/llvm/Support/RISCVISAInfo.h +++ llvm/include/llvm/Support/RISCVISAInfo.h @@ -60,6 +60,7 @@ unsigned getXLen() const { return XLen; }; unsigned getFLen() const { return FLen; }; unsigned getMinVLen() const { return MinVLen; } + unsigned getMaxVLen() const { return 65536; } unsigned getMaxELen() const { return MaxELen; } unsigned getMaxELenFp() const { return MaxELenFp; } Index: clang/test/CodeGen/riscv-vector-bits-vscale-range.c =================================================================== --- clang/test/CodeGen/riscv-vector-bits-vscale-range.c +++ clang/test/CodeGen/riscv-vector-bits-vscale-range.c @@ -9,11 +9,13 @@ // RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=8 -S -emit-llvm -o - %s | FileCheck %s -D#VBITS=8 --check-prefix=CHECK-NOMAX // RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=16 -S -emit-llvm -o - %s | FileCheck %s -D#VBITS=16 --check-prefix=CHECK-NOMAX // RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=1 -mvscale-max=0 -S -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-UNBOUNDED -// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -S -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-NONE +// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -S -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-V +// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +zve64x -S -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-ZVE64 // CHECK-LABEL: @func() #0 // CHECK: attributes #0 = { {{.*}} vscale_range([[#VBITS]],[[#VBITS]]) {{.*}} } // CHECK-NOMAX: attributes #0 = { {{.*}} vscale_range([[#VBITS]],0) {{.*}} } // CHECK-UNBOUNDED: attributes #0 = { {{.*}} vscale_range(1,0) {{.*}} } -// CHECK-NONE: attributes #0 = { {{.*}} vscale_range(2,1024) {{.*}} } +// CHECK-V: attributes #0 = { {{.*}} vscale_range(2,1024) {{.*}} } +// CHECK-ZVE64: attributes #0 = { {{.*}} vscale_range(1,1024) {{.*}} } void func(void) {} Index: clang/lib/Basic/Targets/RISCV.cpp =================================================================== --- clang/lib/Basic/Targets/RISCV.cpp +++ clang/lib/Basic/Targets/RISCV.cpp @@ -252,9 +252,11 @@ return std::pair<unsigned, unsigned>( LangOpts.VScaleMin ? LangOpts.VScaleMin : 1, LangOpts.VScaleMax); - if (hasFeature("v")) - // Minimum VLEN=128, Maximum VLEN=64k, and RISCV::RVVBitsPerBlock is 64. - return std::pair<unsigned, unsigned>(2, 1024); + if (unsigned MinVLen = ISAInfo->getMinVLen()) { + unsigned MaxVLen = ISAInfo->getMaxVLen(); + // RISCV::RVVBitsPerBlock is 64. + return std::pair<unsigned, unsigned>(MinVLen/64, MaxVLen/64); + } return None; }
Index: llvm/include/llvm/Support/RISCVISAInfo.h =================================================================== --- llvm/include/llvm/Support/RISCVISAInfo.h +++ llvm/include/llvm/Support/RISCVISAInfo.h @@ -60,6 +60,7 @@ unsigned getXLen() const { return XLen; }; unsigned getFLen() const { return FLen; }; unsigned getMinVLen() const { return MinVLen; } + unsigned getMaxVLen() const { return 65536; } unsigned getMaxELen() const { return MaxELen; } unsigned getMaxELenFp() const { return MaxELenFp; } Index: clang/test/CodeGen/riscv-vector-bits-vscale-range.c =================================================================== --- clang/test/CodeGen/riscv-vector-bits-vscale-range.c +++ clang/test/CodeGen/riscv-vector-bits-vscale-range.c @@ -9,11 +9,13 @@ // RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=8 -S -emit-llvm -o - %s | FileCheck %s -D#VBITS=8 --check-prefix=CHECK-NOMAX // RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=16 -S -emit-llvm -o - %s | FileCheck %s -D#VBITS=16 --check-prefix=CHECK-NOMAX // RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=1 -mvscale-max=0 -S -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-UNBOUNDED -// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -S -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-NONE +// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +v -S -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-V +// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +zve64x -S -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-ZVE64 // CHECK-LABEL: @func() #0 // CHECK: attributes #0 = { {{.*}} vscale_range([[#VBITS]],[[#VBITS]]) {{.*}} } // CHECK-NOMAX: attributes #0 = { {{.*}} vscale_range([[#VBITS]],0) {{.*}} } // CHECK-UNBOUNDED: attributes #0 = { {{.*}} vscale_range(1,0) {{.*}} } -// CHECK-NONE: attributes #0 = { {{.*}} vscale_range(2,1024) {{.*}} } +// CHECK-V: attributes #0 = { {{.*}} vscale_range(2,1024) {{.*}} } +// CHECK-ZVE64: attributes #0 = { {{.*}} vscale_range(1,1024) {{.*}} } void func(void) {} Index: clang/lib/Basic/Targets/RISCV.cpp =================================================================== --- clang/lib/Basic/Targets/RISCV.cpp +++ clang/lib/Basic/Targets/RISCV.cpp @@ -252,9 +252,11 @@ return std::pair<unsigned, unsigned>( LangOpts.VScaleMin ? LangOpts.VScaleMin : 1, LangOpts.VScaleMax); - if (hasFeature("v")) - // Minimum VLEN=128, Maximum VLEN=64k, and RISCV::RVVBitsPerBlock is 64. - return std::pair<unsigned, unsigned>(2, 1024); + if (unsigned MinVLen = ISAInfo->getMinVLen()) { + unsigned MaxVLen = ISAInfo->getMaxVLen(); + // RISCV::RVVBitsPerBlock is 64. + return std::pair<unsigned, unsigned>(MinVLen/64, MaxVLen/64); + } return None; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits