diff --git a/llvm/include/llvm/Support/TypeSize.h b/llvm/include/llvm/Support/TypeSize.h --- a/llvm/include/llvm/Support/TypeSize.h +++ b/llvm/include/llvm/Support/TypeSize.h @@ -79,6 +79,10 @@ return {(unsigned)llvm::NextPowerOf2(Min), Scalable}; } + bool isKnownMultipleOf(unsigned RHS) const { + return Min % RHS == 0; + } + static ElementCount getFixed(unsigned Min) { return {Min, false}; } static ElementCount getScalable(unsigned Min) { return {Min, true}; } static ElementCount get(unsigned Min, bool Scalable) { diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -20620,7 +20620,7 @@ SDLoc DL(N); SDValue NewIdx; LLVMContext &Ctx = *DAG.getContext(); - unsigned NumElts = VT.getVectorNumElements(); + ElementCount NumElts = VT.getVectorElementCount(); unsigned EltSizeInBits = VT.getScalarSizeInBits(); if ((EltSizeInBits % N1SrcSVT.getSizeInBits()) == 0) { unsigned Scale = EltSizeInBits / N1SrcSVT.getSizeInBits(); @@ -20628,7 +20628,7 @@ NewIdx = DAG.getVectorIdxConstant(InsIdx * Scale, DL); } else if ((N1SrcSVT.getSizeInBits() % EltSizeInBits) == 0) { unsigned Scale = N1SrcSVT.getSizeInBits() / EltSizeInBits; - if ((NumElts % Scale) == 0 && (InsIdx % Scale) == 0) { + if (NumElts.isKnownMultipleOf(Scale) && (InsIdx % Scale) == 0) { NewVT = EVT::getVectorVT(Ctx, N1SrcSVT, NumElts / Scale); NewIdx = DAG.getVectorIdxConstant(InsIdx / Scale, DL); }