================ @@ -8944,6 +8944,146 @@ static bool optimizeBranch(CondBrInst *Branch, const TargetLowering &TLI, return false; } +// Performs very basic loop strength reduction to vector values with a known +// evolution from one iteration to the next that are used as the value operand +// for a store. +// A simple example to illustrate: +// +// %vec.ind = phi <vscale x 2 x i64> [ %start, %entry ], +// [ %vec.ind.next, %vector.body ] +// %data.gep = getelementptr inbounds nuw [72 x i8], ptr %datap, +// <vscale x 2 x i64> %vec.ind +// %addr.gep = getelementptr inbounds nuw [8 x i8], ptr %addrp, i64 %index +// store <vscale x 2 x ptr> %data.gep, ptr %addr.gep, align 8 +// %vec.ind.next = add nuw nsw <vscale x 2 x i64> %vec.ind, %elt.cnt.splat +// +// This will end up with a multiply by a vscale-scaled term in the loop, as +// well as adding to the base. Changing it to add a splat based on vscale * +// min.elt.cnt * sizeof(ptrdiff) and remove the gep removes the multiply. +// +// TODO: Support more cases, such as the address instead of value operand for +// strided memory operations. ---------------- sdesmalen-arm wrote:
It's not clear to me what you mean by this, can you clarify? https://github.com/llvm/llvm-project/pull/226197 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
