[llvm-branch-commits] [llvm] [CGP] Simple loop strength reduction for vector values (PR #226197)
Graham Hunter via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Sep 30 02:54:28 PDT 2026
================
@@ -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.
----------------
huntergr-arm wrote:
Currently, this work only supports strength reduction of the value (data) operand for store instructions. For contiguous stores, the address is a scalar and is dealt with by normal LSR.
However, @david-arm suggested there may be cases (strided memory operations) where doing a similar operation for the address operand may be beneficial; so that would be for gathers/scatters.
https://github.com/llvm/llvm-project/pull/226197
More information about the llvm-branch-commits
mailing list