diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4080,8 +4080,15 @@ if (isa(Ops[0])) return UndefValue::get(GEPTy); - bool IsScalableVec = - SrcTy->isVectorTy() ? SrcTy->getVectorIsScalable() : false; + bool IsScalableVec = false; + if (SrcTy->isVectorTy() && SrcTy->getVectorIsScalable()) + IsScalableVec = true; + else + for (auto Op : Ops) + if (Op->getType()->isVectorTy() && Op->getType()->getVectorIsScalable()) { + IsScalableVec = true; + break; + } if (Ops.size() == 2) { // getelementptr P, 0 -> P. diff --git a/llvm/test/Transforms/InstSimplify/vscale.ll b/llvm/test/Transforms/InstSimplify/vscale.ll --- a/llvm/test/Transforms/InstSimplify/vscale.ll +++ b/llvm/test/Transforms/InstSimplify/vscale.ll @@ -143,3 +143,12 @@ %cmp = icmp eq * %x, null ret i1 %cmp } + +define @getelementptr_src_ty_not_vscale( %a, %offset) { +; CHECK-LABEL: @getelementptr_src_ty_not_vscale( +; CHECK-NEXT: [[V:%.*]] = getelementptr i8, [[A:%.*]], [[OFFSET:%.*]] +; CHECK-NEXT: ret [[V]] +; + %v = getelementptr i8, %a, %offset + ret %v +}