diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h --- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h +++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h @@ -811,7 +811,12 @@ uint64_t Field = ConstIdx->getZExtValue(); BaseOffset += DL.getStructLayout(STy)->getElementOffset(Field); } else { - int64_t ElementSize = DL.getTypeAllocSize(GTI.getIndexedType()); + // If this operand is a scalable type, bail out early. + // TODO: handle scalable vectors + if (isa(TargetType)) + return TTI::TCC_Basic; + int64_t ElementSize = + DL.getTypeAllocSize(GTI.getIndexedType()).getFixedSize(); if (ConstIdx) { BaseOffset += ConstIdx->getValue().sextOrTrunc(PtrSizeBits) * ElementSize; diff --git a/llvm/test/Analysis/CostModel/AArch64/cost-scalable-vector-gep.ll b/llvm/test/Analysis/CostModel/AArch64/cost-scalable-vector-gep.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/CostModel/AArch64/cost-scalable-vector-gep.ll @@ -0,0 +1,15 @@ +; RUN: opt -cost-model -analyze -mtriple=aarch64--linux-gnu -mattr=+sve < %s 2>%t | FileCheck %s +; RUN: FileCheck --check-prefix=WARN --allow-empty %s < %t + +; This regression test is verifying that a GEP instruction performed on a +; scalable vector does not produce a 'assumption that TypeSize is not scalable' +; warning when performing cost analysis. + +; If this check fails please read test/CodeGen/AArch64/README for instructions on how to resolve it. +; WARN-NOT: warning: {{.*}}TypeSize is not scalable + +; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %retval = getelementptr +define * @gep_scalable_vector(* %ptr) { + %retval = getelementptr , * %ptr, i32 2 + ret * %retval +}