[llvm] [LowerMemIntrinsics] Avoid udiv/urem when type size is a power of 2 (PR #81238)
Pierre van Houtryve via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 12 00:20:17 PST 2024
================
@@ -155,6 +156,26 @@ void llvm::createMemCpyLoopKnownSize(
"Bytes copied should match size in the call!");
}
+// \returns \p Len udiv \p OpSize, checking for optimization opportunities.
+static Value *getRuntimeLoopCount(const DataLayout &DL, IRBuilderBase &B,
+ Value *Len, Value *OpSize,
+ unsigned OpSizeVal) {
+ // For powers of 2, we can lshr by log2 instead of using udiv.
+ if (isPowerOf2_32(OpSizeVal))
+ return B.CreateLShr(Len, Log2_32(OpSizeVal));
+ return B.CreateUDiv(Len, OpSize);
+}
+
+// \returns \p Len urem \p OpSize, checking for optimization opportunities.
+static Value *getRuntimeLoopRemainder(const DataLayout &DL, IRBuilderBase &B,
+ Value *Len, Value *OpSize,
+ unsigned OpSizeVal) {
+ // For powers of 2, we can and by (OpSizeVal - 1) instead of using urem.
+ if (isPowerOf2_32(OpSizeVal))
+ return B.CreateAnd(Len, OpSizeVal - 1);
+ return B.CreateURem(Len, OpSize);
----------------
Pierre-vh wrote:
No we don't, I just noticed that the type size is always a power of 2 because it's controlled by TTI
I can add a CL switch to no do the optimization + add another set of CHECK lines if you want.
https://github.com/llvm/llvm-project/pull/81238
More information about the llvm-commits
mailing list