[flang] Support -mvscale-min and mvscale-max on all targets (#74633)
We have other targets with scalable vectors (e.g.RISC-V), and there doesn't seem to be any particular reason these options can't be used on those targets.
This commit is contained in:
@@ -710,8 +710,8 @@ void CodeGenAction::lowerHLFIRToFIR() {
|
||||
// TODO: We should get this from TargetInfo. However, that depends on
|
||||
// too much of clang, so for now, replicate the functionality.
|
||||
static std::optional<std::pair<unsigned, unsigned>>
|
||||
getVScaleRange(CompilerInstance &ci,
|
||||
const Fortran::frontend::LangOptions &langOpts) {
|
||||
getVScaleRange(CompilerInstance &ci) {
|
||||
const auto &langOpts = ci.getInvocation().getLangOpts();
|
||||
if (langOpts.VScaleMin || langOpts.VScaleMax)
|
||||
return std::pair<unsigned, unsigned>(
|
||||
langOpts.VScaleMin ? langOpts.VScaleMin : 1, langOpts.VScaleMax);
|
||||
@@ -746,13 +746,9 @@ void CodeGenAction::generateLLVMIR() {
|
||||
const auto targetOpts = ci.getInvocation().getTargetOpts();
|
||||
const llvm::Triple triple(targetOpts.triple);
|
||||
|
||||
// Only get the vscale range if AArch64.
|
||||
if (triple.isAArch64()) {
|
||||
auto langOpts = ci.getInvocation().getLangOpts();
|
||||
if (auto vsr = getVScaleRange(ci, langOpts)) {
|
||||
config.VScaleMin = vsr->first;
|
||||
config.VScaleMax = vsr->second;
|
||||
}
|
||||
if (auto vsr = getVScaleRange(ci)) {
|
||||
config.VScaleMin = vsr->first;
|
||||
config.VScaleMax = vsr->second;
|
||||
}
|
||||
|
||||
// Create the pass pipeline
|
||||
|
||||
21
flang/test/Lower/RISCV/riscv-vector-bits-vscale-range.f90
Normal file
21
flang/test/Lower/RISCV/riscv-vector-bits-vscale-range.f90
Normal file
@@ -0,0 +1,21 @@
|
||||
! REQUIRES: riscv-registered-target
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=1 -mvscale-max=1 -emit-llvm -o - %s | FileCheck %s -D#VBITS=1
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=2 -mvscale-max=2 -emit-llvm -o - %s | FileCheck %s -D#VBITS=2
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=4 -mvscale-max=4 -emit-llvm -o - %s | FileCheck %s -D#VBITS=4
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=8 -mvscale-max=8 -emit-llvm -o - %s | FileCheck %s -D#VBITS=8
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=16 -mvscale-max=16 -emit-llvm -o - %s | FileCheck %s -D#VBITS=16
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=1 -emit-llvm -o - %s | FileCheck %s -D#VBITS=1 --check-prefix=CHECK-NOMAX
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=2 -emit-llvm -o - %s | FileCheck %s -D#VBITS=2 --check-prefix=CHECK-NOMAX
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=4 -emit-llvm -o - %s | FileCheck %s -D#VBITS=4 --check-prefix=CHECK-NOMAX
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=8 -emit-llvm -o - %s | FileCheck %s -D#VBITS=8 --check-prefix=CHECK-NOMAX
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=16 -emit-llvm -o - %s | FileCheck %s -D#VBITS=16 --check-prefix=CHECK-NOMAX
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -mvscale-min=1 -mvscale-max=0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-UNBOUNDED
|
||||
! RUN: %flang_fc1 -triple riscv64-none-linux-gnu -target-feature +v -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-NONE
|
||||
|
||||
! 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-NOT: vscale_range
|
||||
subroutine func
|
||||
end subroutine func
|
||||
Reference in New Issue
Block a user