diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -2689,24 +2689,26 @@ 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 @@ 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.