================ @@ -3878,6 +3883,130 @@ static Align computeCommonAlignment(ArrayRef<Value *> VL) { return CommonAlignment; } +/// Check if \p Order represents reverse order. +static bool isReverseOrder(ArrayRef<unsigned> Order) { + unsigned Sz = Order.size(); + return !Order.empty() && all_of(enumerate(Order), [&](const auto &Pair) { + return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value(); + }); +} + +/// Checks if the provided list of pointers \p Pointers represents the strided +/// pointers for type ElemTy. If they are not, std::nullopt is returned. +/// Otherwise, if \p Inst is not specified, just initialized optional value is +/// returned to show that the pointers represent strided pointers. If \p Inst +/// specified, the runtime stride is materialized before the given \p Inst. +/// \returns std::nullopt if the pointers are not pointers with the runtime +/// stride, nullptr or actual stride value, otherwise. +static std::optional<Value *> +calculateRtStride(ArrayRef<Value *> PointerOps, Type *ElemTy, + const DataLayout &DL, ScalarEvolution &SE, + SmallVectorImpl<unsigned> &SortedIndices, + Instruction *Inst = nullptr) { + SmallVector<const SCEV *> SCEVs; ---------------- preames wrote:
An alternate approach which might be simpler and yet cover many of the interesting test cases might be: * Loop over the pointers, check that getPointerBase matches. * Loop again doing removePointerBase * This gives a list of offsets from base, bail if any non-constant * Sort the list of constant offsets * Check if strided w/shuffle? If you don't want a shuffle afterwards, you can check the delta without sorting. This won't cover non-constant strides, but I'm not sure we really care about those in practice. https://github.com/llvm/llvm-project/pull/80310 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits