Author: 4vtomat Date: 2023-08-03T01:48:23-07:00 New Revision: f3ce925083d2214289c73b8f21590ac32beef03d
URL: https://github.com/llvm/llvm-project/commit/f3ce925083d2214289c73b8f21590ac32beef03d DIFF: https://github.com/llvm/llvm-project/commit/f3ce925083d2214289c73b8f21590ac32beef03d.diff LOG: [RISCV] Resolve a few bugs in RISCVVIntrinsicUtils.cpp This patch does a few things: 1. Add a new type called Undefined to ScalarTypeKind. 2. Make RVVType::applyModifier early return when encounter invalid ScalarType, otherwise it could be modified to "non-invalid" type in the following code. 3. When FixedLMULType::SmallerThan is applied, the lmul should be "<" than specified one, so lmuls which are ">=" should be marked as invalid. Differential Revision: https://reviews.llvm.org/D156223 Added: clang/test/CodeGen/RISCV/rvv-intrinsics-autogenerated/non-policy/non-overloaded/vlmul_trunc_v_invalid.c Modified: clang/include/clang/Support/RISCVVIntrinsicUtils.h clang/lib/Sema/SemaRISCVVectorLookup.cpp clang/lib/Support/RISCVVIntrinsicUtils.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Support/RISCVVIntrinsicUtils.h b/clang/include/clang/Support/RISCVVIntrinsicUtils.h index 804b1518c06b51..e69df9ed720607 100644 --- a/clang/include/clang/Support/RISCVVIntrinsicUtils.h +++ b/clang/include/clang/Support/RISCVVIntrinsicUtils.h @@ -218,6 +218,7 @@ enum ScalarTypeKind : uint8_t { UnsignedInteger, Float, Invalid, + Undefined, }; // Exponential LMUL @@ -240,7 +241,7 @@ class RVVType { friend class RVVTypeCache; BasicType BT; - ScalarTypeKind ScalarType = Invalid; + ScalarTypeKind ScalarType = Undefined; LMULType LMUL; bool IsPointer = false; // IsConstant indices are "int", but have the constant expression. diff --git a/clang/lib/Sema/SemaRISCVVectorLookup.cpp b/clang/lib/Sema/SemaRISCVVectorLookup.cpp index db2059e68b3d17..eec2bc11e35d9e 100644 --- a/clang/lib/Sema/SemaRISCVVectorLookup.cpp +++ b/clang/lib/Sema/SemaRISCVVectorLookup.cpp @@ -133,6 +133,7 @@ static QualType RVVType2Qual(ASTContext &Context, const RVVType *Type) { } break; case Invalid: + case Undefined: llvm_unreachable("Unhandled type."); } if (Type->isVector()) { diff --git a/clang/lib/Support/RISCVVIntrinsicUtils.cpp b/clang/lib/Support/RISCVVIntrinsicUtils.cpp index 4b9736b6009ca9..abb4009ef2bce9 100644 --- a/clang/lib/Support/RISCVVIntrinsicUtils.cpp +++ b/clang/lib/Support/RISCVVIntrinsicUtils.cpp @@ -742,6 +742,10 @@ void RVVType::applyModifier(const PrototypeDescriptor &Transformer) { break; } + // Early return if the current type modifier is already invalid. + if (ScalarType == Invalid) + return; + for (unsigned TypeModifierMaskShift = 0; TypeModifierMaskShift <= static_cast<unsigned>(TypeModifier::MaxOffset); ++TypeModifierMaskShift) { @@ -803,13 +807,13 @@ void RVVType::applyFixedSEW(unsigned NewSEW) { void RVVType::applyFixedLog2LMUL(int Log2LMUL, enum FixedLMULType Type) { switch (Type) { case FixedLMULType::LargerThan: - if (Log2LMUL < LMUL.Log2LMUL) { + if (Log2LMUL <= LMUL.Log2LMUL) { ScalarType = ScalarTypeKind::Invalid; return; } break; case FixedLMULType::SmallerThan: - if (Log2LMUL > LMUL.Log2LMUL) { + if (Log2LMUL >= LMUL.Log2LMUL) { ScalarType = ScalarTypeKind::Invalid; return; } diff --git a/clang/test/CodeGen/RISCV/rvv-intrinsics-autogenerated/non-policy/non-overloaded/vlmul_trunc_v_invalid.c b/clang/test/CodeGen/RISCV/rvv-intrinsics-autogenerated/non-policy/non-overloaded/vlmul_trunc_v_invalid.c new file mode 100644 index 00000000000000..d00db214a69dcc --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvv-intrinsics-autogenerated/non-policy/non-overloaded/vlmul_trunc_v_invalid.c @@ -0,0 +1,21 @@ +// REQUIRES: riscv-registered-target +// RUN: %clang_cc1 -triple riscv64 -target-feature +v -target-feature +zfh \ +// RUN: -target-feature +zvfh -disable-O0-optnone %s -fsyntax-only -verify + +#include <riscv_vector.h> + +vuint64m2_t test_vlmul_trunc_v_u64m2_u64m2(vuint64m2_t op1) { // expected-note {{'test_vlmul_trunc_v_u64m2_u64m2' declared here}} + return __riscv_vlmul_trunc_v_u64m2_u64m2(op1); // expected-error {{call to undeclared function '__riscv_vlmul_trunc_v_u64m2_u64m2'; ISO C99 and later do not support implicit function declarations}} expected-error {{returning 'int' from a function with incompatible result type 'vuint64m2_t' (aka '__rvv_uint64m2_t')}} expected-note {{did you mean 'test_vlmul_trunc_v_u64m2_u64m2'?}} +} + +vuint64m4_t test_vlmul_trunc_v_u64m4_u64m4(vuint64m4_t op1) { // expected-note {{'test_vlmul_trunc_v_u64m4_u64m4' declared here}} + return __riscv_vlmul_trunc_v_u64m4_u64m4(op1); // expected-error {{call to undeclared function '__riscv_vlmul_trunc_v_u64m4_u64m4'; ISO C99 and later do not support implicit function declarations}} expected-error {{returning 'int' from a function with incompatible result type 'vuint64m4_t' (aka '__rvv_uint64m4_t')}} expected-note {{did you mean 'test_vlmul_trunc_v_u64m4_u64m4'?}} +} + +vuint64m1_t test_vlmul_trunc_v_u64m1_u64m1(vuint64m1_t op1) { // expected-note {{'test_vlmul_trunc_v_u64m1_u64m1' declared here}} + return __riscv_vlmul_trunc_v_u64m1_u64m1(op1); // expected-error {{call to undeclared function '__riscv_vlmul_trunc_v_u64m1_u64m1'; ISO C99 and later do not support implicit function declarations}} expected-error {{returning 'int' from a function with incompatible result type 'vuint64m1_t' (aka '__rvv_uint64m1_t')}} expected-note {{did you mean 'test_vlmul_trunc_v_u64m1_u64m1'?}} +} + +vuint64m8_t test_vlmul_trunc_v_u64m8_u64m8(vuint64m8_t op1) { // expected-note {{'test_vlmul_trunc_v_u64m8_u64m8' declared here}} + return __riscv_vlmul_trunc_v_u64m8_u64m8(op1); // expected-error {{call to undeclared function '__riscv_vlmul_trunc_v_u64m8_u64m8'; ISO C99 and later do not support implicit function declarations}} expected-error {{returning 'int' from a function with incompatible result type 'vuint64m8_t' (aka '__rvv_uint64m8_t')}} expected-note {{did you mean 'test_vlmul_trunc_v_u64m8_u64m8'?}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits