Skip to content

Commit 8727097

Browse files
authored
[RISCV][Sema] Add feature check for target attribute to VSETVL intrinsics (#126064)
This fixes the target attribute issue for vsetvl and vsetvlmax intrinsics. Fixes #125154
1 parent 87916f8 commit 8727097

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

clang/include/clang/Basic/riscv_vector.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,6 @@ let HeaderCode =
634634
#define __riscv_vsetvl_e32m4(avl) __builtin_rvv_vsetvli((size_t)(avl), 2, 2)
635635
#define __riscv_vsetvl_e32m8(avl) __builtin_rvv_vsetvli((size_t)(avl), 2, 3)
636636

637-
#if __riscv_v_elen >= 64
638637
#define __riscv_vsetvl_e8mf8(avl) __builtin_rvv_vsetvli((size_t)(avl), 0, 5)
639638
#define __riscv_vsetvl_e16mf4(avl) __builtin_rvv_vsetvli((size_t)(avl), 1, 6)
640639
#define __riscv_vsetvl_e32mf2(avl) __builtin_rvv_vsetvli((size_t)(avl), 2, 7)
@@ -643,7 +642,6 @@ let HeaderCode =
643642
#define __riscv_vsetvl_e64m2(avl) __builtin_rvv_vsetvli((size_t)(avl), 3, 1)
644643
#define __riscv_vsetvl_e64m4(avl) __builtin_rvv_vsetvli((size_t)(avl), 3, 2)
645644
#define __riscv_vsetvl_e64m8(avl) __builtin_rvv_vsetvli((size_t)(avl), 3, 3)
646-
#endif
647645

648646
#define __riscv_vsetvlmax_e8mf4() __builtin_rvv_vsetvlimax(0, 6)
649647
#define __riscv_vsetvlmax_e8mf2() __builtin_rvv_vsetvlimax(0, 7)
@@ -663,7 +661,6 @@ let HeaderCode =
663661
#define __riscv_vsetvlmax_e32m4() __builtin_rvv_vsetvlimax(2, 2)
664662
#define __riscv_vsetvlmax_e32m8() __builtin_rvv_vsetvlimax(2, 3)
665663

666-
#if __riscv_v_elen >= 64
667664
#define __riscv_vsetvlmax_e8mf8() __builtin_rvv_vsetvlimax(0, 5)
668665
#define __riscv_vsetvlmax_e16mf4() __builtin_rvv_vsetvlimax(1, 6)
669666
#define __riscv_vsetvlmax_e32mf2() __builtin_rvv_vsetvlimax(2, 7)
@@ -672,7 +669,6 @@ let HeaderCode =
672669
#define __riscv_vsetvlmax_e64m2() __builtin_rvv_vsetvlimax(3, 1)
673670
#define __riscv_vsetvlmax_e64m4() __builtin_rvv_vsetvlimax(3, 2)
674671
#define __riscv_vsetvlmax_e64m8() __builtin_rvv_vsetvlimax(3, 3)
675-
#endif
676672

677673
}] in
678674
def vsetvl_macro: RVVHeader;

clang/lib/Sema/SemaRISCV.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -624,13 +624,34 @@ bool SemaRISCV::CheckBuiltinFunctionCall(const TargetInfo &TI,
624624
}
625625
}
626626

627+
auto CheckVSetVL = [&](unsigned SEWOffset, unsigned LMULOffset) -> bool {
628+
const FunctionDecl *FD = SemaRef.getCurFunctionDecl();
629+
llvm::StringMap<bool> FunctionFeatureMap;
630+
Context.getFunctionFeatureMap(FunctionFeatureMap, FD);
631+
llvm::APSInt SEWResult;
632+
llvm::APSInt LMULResult;
633+
if (SemaRef.BuiltinConstantArg(TheCall, SEWOffset, SEWResult) ||
634+
SemaRef.BuiltinConstantArg(TheCall, LMULOffset, LMULResult))
635+
return true;
636+
int SEWValue = SEWResult.getSExtValue();
637+
int LMULValue = LMULResult.getSExtValue();
638+
if (((SEWValue == 0 && LMULValue == 5) || // e8mf8
639+
(SEWValue == 1 && LMULValue == 6) || // e16mf4
640+
(SEWValue == 2 && LMULValue == 7) || // e32mf2
641+
SEWValue == 3) && // e64
642+
!TI.hasFeature("zve64x") &&
643+
!FunctionFeatureMap.lookup("zve64x"))
644+
return Diag(TheCall->getBeginLoc(),
645+
diag::err_riscv_builtin_requires_extension)
646+
<< /* IsExtension */ true << TheCall->getSourceRange() << "zve64x";
647+
return SemaRef.BuiltinConstantArgRange(TheCall, SEWOffset, 0, 3) ||
648+
CheckLMUL(TheCall, LMULOffset);
649+
};
627650
switch (BuiltinID) {
628651
case RISCVVector::BI__builtin_rvv_vsetvli:
629-
return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 3) ||
630-
CheckLMUL(TheCall, 2);
652+
return CheckVSetVL(1, 2);
631653
case RISCVVector::BI__builtin_rvv_vsetvlimax:
632-
return SemaRef.BuiltinConstantArgRange(TheCall, 0, 0, 3) ||
633-
CheckLMUL(TheCall, 1);
654+
return CheckVSetVL(0, 1);
634655
case RISCVVector::BI__builtin_rvv_vget_v: {
635656
ASTContext::BuiltinVectorTypeInfo ResVecInfo =
636657
Context.getBuiltinVectorTypeInfo(cast<BuiltinType>(

clang/test/CodeGen/RISCV/riscv-func-attr-target.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,20 @@ void test_rvv_f64_type_w_zve64d() {
6565
vfloat64m1_t v;
6666
}
6767

68+
__attribute__((target("arch=+v")))
69+
int test_vsetvl_e64m1(unsigned avl) {
70+
// CHECK-LABEL: test_vsetvl_e64m1
71+
// CHECK-SAME: #13
72+
return __riscv_vsetvl_e64m1(avl);
73+
}
74+
75+
__attribute__((target("arch=+v")))
76+
int test_vsetvlmax_e64m1() {
77+
// CHECK-LABEL: test_vsetvlmax_e64m1
78+
// CHECK-SAME: #13
79+
return __riscv_vsetvlmax_e64m1();
80+
}
81+
6882
//.
6983
// CHECK: attributes #0 = { {{.*}}"target-features"="+64bit,+a,+m,+save-restore,+zaamo,+zalrsc,+zifencei,+zmmul,-relax,-zbb,-zfa" }
7084
// CHECK: attributes #1 = { {{.*}}"target-cpu"="rocket-rv64" "target-features"="+64bit,+a,+d,+f,+m,+save-restore,+v,+zaamo,+zalrsc,+zicsr,+zifencei,+zmmul,+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b,-relax,-zbb,-zfa" "tune-cpu"="generic-rv64" }

0 commit comments

Comments
 (0)