diff --git a/llvm/lib/Analysis/VectorUtils.cpp b/llvm/lib/Analysis/VectorUtils.cpp --- a/llvm/lib/Analysis/VectorUtils.cpp +++ b/llvm/lib/Analysis/VectorUtils.cpp @@ -959,12 +959,18 @@ DFS.perform(LI); for (BasicBlock *BB : make_range(DFS.beginRPO(), DFS.endRPO())) for (auto &I : *BB) { - auto *LI = dyn_cast(&I); - auto *SI = dyn_cast(&I); - if (!LI && !SI) + Type *ElementTy; + Value *Ptr; + if (auto *LI = dyn_cast(&I)) { + ElementTy = LI->getType(); + Ptr = LI->getPointerOperand(); + } else if (auto *SI = dyn_cast(&I)) { + ElementTy = SI->getValueOperand()->getType(); + Ptr = SI->getPointerOperand(); + } else { continue; + } - Value *Ptr = getLoadStorePointerOperand(&I); // We don't check wrapping here because we don't know yet if Ptr will be // part of a full group or a group with gaps. Checking wrapping for all // pointers (even those that end up in groups with no gaps) will be overly @@ -976,8 +982,7 @@ /*Assume=*/true, /*ShouldCheckWrap=*/false); const SCEV *Scev = replaceSymbolicStrideSCEV(PSE, Strides, Ptr); - PointerType *PtrTy = cast(Ptr->getType()); - uint64_t Size = DL.getTypeAllocSize(PtrTy->getElementType()); + uint64_t Size = DL.getTypeAllocSize(ElementTy); AccessStrideInfo[&I] = StrideDescriptor(Stride, Scev, Size, getLoadStoreAlignment(&I)); }