From f0aae37e1d58cc08f16d642c80e096f81de0a2ff Mon Sep 17 00:00:00 2001 From: Christopher Tetreault Date: Tue, 16 Jun 2020 13:19:15 -0700 Subject: [PATCH] [NFC] Bail out for scalable vectors before calling getNumElements Summary: Move the bail out logic to before constructing the Result and Lane vectors. This is both potentially faster, and avoids calling getNumElements on a potentially scalable vector Reviewers: efriedma, sunfish, chandlerc, c-rhodes, fpetrogalli Reviewed By: fpetrogalli Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D81619 --- lib/Analysis/ConstantFolding.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index 67591de756c..76e7b2906c9 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -2689,24 +2689,26 @@ static Constant *ConstantFoldVectorCall(StringRef Name, const DataLayout &DL, const TargetLibraryInfo *TLI, const CallBase *Call) { - SmallVector Result(VTy->getNumElements()); - SmallVector Lane(Operands.size()); - Type *Ty = VTy->getElementType(); - // Do not iterate on scalable vector. The number of elements is unknown at // compile-time. if (isa(VTy)) return nullptr; + auto *FVTy = cast(VTy); + + SmallVector Result(FVTy->getNumElements()); + SmallVector Lane(Operands.size()); + Type *Ty = FVTy->getElementType(); + if (IntrinsicID == Intrinsic::masked_load) { auto *SrcPtr = Operands[0]; auto *Mask = Operands[2]; auto *Passthru = Operands[3]; - Constant *VecData = ConstantFoldLoadFromConstPtr(SrcPtr, VTy, DL); + Constant *VecData = ConstantFoldLoadFromConstPtr(SrcPtr, FVTy, DL); SmallVector NewElements; - for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) { + for (unsigned I = 0, E = FVTy->getNumElements(); I != E; ++I) { auto *MaskElt = Mask->getAggregateElement(I); if (!MaskElt) break; @@ -2732,12 +2734,12 @@ static Constant *ConstantFoldVectorCall(StringRef Name, return nullptr; } } - if (NewElements.size() != VTy->getNumElements()) + if (NewElements.size() != FVTy->getNumElements()) return nullptr; return ConstantVector::get(NewElements); } - for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) { + for (unsigned I = 0, E = FVTy->getNumElements(); I != E; ++I) { // Gather a column of constants. for (unsigned J = 0, JE = Operands.size(); J != JE; ++J) { // Some intrinsics use a scalar type for certain arguments.