diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index dc45e8d61cea7..8c3abc29315e7 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4474,14 +4474,24 @@ static bool CheckInvalidVLENandLMUL(const TargetInfo &TI, CallExpr *TheCall, assert((EGW == 128 || EGW == 256) && "EGW can only be 128 or 256 bits"); // LMUL * VLEN >= EGW - uint64_t ElemSize = Type->isRVVType(32, false) ? 32 : 64; - uint64_t ElemCount = Type->isRVVType(1) ? 1 : - Type->isRVVType(2) ? 2 : - Type->isRVVType(4) ? 4 : - Type->isRVVType(8) ? 8 : - 16; - float Lmul = (float)(ElemSize * ElemCount) / llvm::RISCV::RVVBitsPerBlock; - uint64_t MinRequiredVLEN = std::max(EGW / Lmul, (float)ElemSize); + unsigned ElemSize = Type->isRVVType(32, false) ? 32 : 64; + unsigned MinElemCount = Type->isRVVType(1) ? 1 + : Type->isRVVType(2) ? 2 + : Type->isRVVType(4) ? 4 + : Type->isRVVType(8) ? 8 + : 16; + + unsigned EGS = EGW / ElemSize; + // If EGS is less than or equal to the minimum number of elements, then the + // type is valid. + if (EGS <= MinElemCount) + return false; + + // Otherwise, we need vscale to be at least EGS / MinElemCont. + assert(EGS % MinElemCount == 0); + unsigned VScaleFactor = EGS / MinElemCount; + // Vscale is VLEN/RVVBitsPerBlock. + unsigned MinRequiredVLEN = VScaleFactor * llvm::RISCV::RVVBitsPerBlock; std::string RequiredExt = "zvl" + std::to_string(MinRequiredVLEN) + "b"; if (!TI.hasFeature(RequiredExt)) return S.Diag(TheCall->getBeginLoc(),