[llvm] [LowerMemIntrinsics] Optimize memset lowering (PR #169040)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 16 12:53:56 PST 2026
================
@@ -983,10 +983,197 @@ static void createMemMoveLoopKnownSize(Instruction *InsertBefore,
}
}
+/// Create a Value of \p DstType that consists of a sequence of copies of
+/// \p SetValue, using bitcasts and a vector splat.
+static Value *createMemSetSplat(const DataLayout &DL, IRBuilderBase &B,
+ Value *SetValue, Type *DstType) {
+ unsigned DstSize = DL.getTypeStoreSize(DstType);
+ Type *SetValueType = SetValue->getType();
+ unsigned SetValueSize = DL.getTypeStoreSize(SetValueType);
+ assert(SetValueSize == DL.getTypeAllocSize(SetValueType) &&
+ "Store size and alloc size of SetValue's type must match");
+ assert(SetValueSize != 0 && DstSize % SetValueSize == 0 &&
+ "DstType size must be a multiple of SetValue size");
+
+ Value *Result = SetValue;
+ if (DstSize != SetValueSize) {
+ if (!SetValueType->isIntegerTy() && !SetValueType->isFloatingPointTy()) {
+ // If the type cannot be put into a vector, bitcast to iN first.
+ LLVMContext &Ctx = SetValue->getContext();
+ Result = B.CreateBitCast(Result, Type::getIntNTy(Ctx, SetValueSize * 8),
+ "setvalue.toint");
+ }
+ // Form a sufficiently large vector consisting of SetValue, repeated.
+ Result =
+ B.CreateVectorSplat(DstSize / SetValueSize, Result, "setvalue.splat");
+ }
+
+ // The value has the right size, but we might have to bitcast it to the right
+ // type.
+ if (Result->getType() != DstType) {
+ Result = B.CreateBitCast(Result, DstType, "setvalue.splat.cast");
----------------
arsenm wrote:
CreateBitCast checks the type anyway, can unconditionally do it
https://github.com/llvm/llvm-project/pull/169040
More information about the llvm-commits
mailing list