================ @@ -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) ---------------- MacDue wrote:
This is specifically RAW? Of something like: ``` store A[x] load A[x + 2] ``` Perhaps I'm muddled on what "final two elements" means, but isn't the first two elements store that is valid (so it won't overwrite the elements for the load)? 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