diff --git a/llvm/include/llvm/IR/Instructions.h b/llvm/include/llvm/IR/Instructions.h --- a/llvm/include/llvm/IR/Instructions.h +++ b/llvm/include/llvm/IR/Instructions.h @@ -1977,7 +1977,7 @@ /// shufflevector <4 x n> A, <4 x n> B, <1,2,3,4,5> bool changesLength() const { unsigned NumSourceElts = - cast(Op<0>()->getType())->getNumElements(); + cast(Op<0>()->getType())->getElementCount().Min; unsigned NumMaskElts = ShuffleMask.size(); return NumSourceElts != NumMaskElts; } diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -2205,8 +2205,14 @@ bool ShuffleVectorInst::isIdentityWithExtract() const { if (isa(Op<2>())) return false; - int NumOpElts = cast(Op<0>()->getType())->getNumElements(); - int NumMaskElts = getType()->getNumElements(); + + // FIXME: Not currently possible to express a shuffle mask for a scalable + // vector for this case + if (isa(getType())) + return false; + + int NumOpElts = cast(Op<0>()->getType())->getNumElements(); + int NumMaskElts = cast(getType())->getNumElements(); if (NumMaskElts >= NumOpElts) return false;