diff --git a/clang/include/clang/Support/RISCVVIntrinsicUtils.h b/clang/include/clang/Support/RISCVVIntrinsicUtils.h --- a/clang/include/clang/Support/RISCVVIntrinsicUtils.h +++ b/clang/include/clang/Support/RISCVVIntrinsicUtils.h @@ -218,6 +218,7 @@ UnsignedInteger, Float, Invalid, + Undefined, }; // Exponential LMUL @@ -240,7 +241,7 @@ 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 --- a/clang/lib/Sema/SemaRISCVVectorLookup.cpp +++ b/clang/lib/Sema/SemaRISCVVectorLookup.cpp @@ -133,6 +133,7 @@ } 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 --- a/clang/lib/Support/RISCVVIntrinsicUtils.cpp +++ b/clang/lib/Support/RISCVVIntrinsicUtils.cpp @@ -742,6 +742,10 @@ break; } + // Early return if the current type modifier is already invalid. + if (ScalarType == Invalid) + return; + for (unsigned TypeModifierMaskShift = 0; TypeModifierMaskShift <= static_cast(TypeModifier::MaxOffset); ++TypeModifierMaskShift) { @@ -803,13 +807,13 @@ 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; }