================ @@ -3073,6 +3075,56 @@ struct VPWidenStoreEVLRecipe final : public VPWidenMemoryRecipe { } }; +// Given a pointer A that is being stored to, and pointer B that is being +// read from, both with unknown lengths, create a mask that disables +// elements which could overlap across a loop iteration. For example, if A +// is X and B is X + 2 with VF being 4, only the final two elements of the +// loaded vector can be stored since they don't overlap with the stored +// vector. %b.vec = load %b ; = [s, t, u, v] +// [...] +// store %a, %b.vec ; only u and v can be stored as their addresses don't +// overlap with %a + (VF - 1) +class VPAliasLaneMaskRecipe : public VPSingleDefRecipe { + +public: + VPAliasLaneMaskRecipe(VPValue *Src, VPValue *Sink, unsigned ElementSize, + bool WriteAfterRead) + : VPSingleDefRecipe(VPDef::VPAliasLaneMaskSC, {Src, Sink}), + ElementSize(ElementSize), WriteAfterRead(WriteAfterRead) {} + + ~VPAliasLaneMaskRecipe() override = default; + + VPAliasLaneMaskRecipe *clone() override { + return new VPAliasLaneMaskRecipe(getSourceValue(), getSinkValue(), + ElementSize, WriteAfterRead); + } + + VP_CLASSOF_IMPL(VPDef::VPAliasLaneMaskSC); + + void execute(VPTransformState &State) override; + + /// Get the VPValue* for the pointer being read from + VPValue *getSourceValue() const { return getOperand(0); } + + // Get the size of the element(s) accessed by the pointers + unsigned getAccessedElementSize() const { return ElementSize; } + + /// Get the VPValue* for the pointer being stored to + VPValue *getSinkValue() const { return getOperand(1); } + + bool isWriteAfterRead() const { return WriteAfterRead; } + +private: + unsigned ElementSize; + bool WriteAfterRead; + +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) + /// Print the recipe. + void print(raw_ostream &O, const Twine &Indent, ---------------- SamTebbs33 wrote:
Done. https://github.com/llvm/llvm-project/pull/100579 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits