[Mlir-commits] [mlir] [mlir][llvm] Add support for memset.inline (PR #115711)
Tobias Gysi
llvmlistbot at llvm.org
Mon Nov 11 08:21:05 PST 2024
================
@@ -988,62 +1012,74 @@ bool LLVM::MemsetOp::canUsesBeRemoved(
if (!canConvertType)
return false;
- if (getIsVolatile())
+ if (op.getIsVolatile())
return false;
- return getStaticMemIntrLen(*this) == dataLayout.getTypeSize(slot.elemType);
+ return getStaticMemIntrLen(op) == dataLayout.getTypeSize(slot.elemType);
}
-
-DeletionKind LLVM::MemsetOp::removeBlockingUses(
- const MemorySlot &slot, const SmallPtrSetImpl<OpOperand *> &blockingUses,
- OpBuilder &builder, Value reachingDefinition,
- const DataLayout &dataLayout) {
- return DeletionKind::Delete;
+namespace {
+template <class MemsetLike>
+void createMemsetLenAttr(MemsetLike op, IntegerAttr &memsetLenAttr) {
+ bool successfulMatch =
+ matchPattern(op.getLen(), m_Constant<IntegerAttr>(&memsetLenAttr));
+ (void)successfulMatch;
+ assert(successfulMatch);
}
-
-LogicalResult LLVM::MemsetOp::ensureOnlySafeAccesses(
- const MemorySlot &slot, SmallVectorImpl<MemorySlot> &mustBeSafelyUsed,
- const DataLayout &dataLayout) {
- return success(definitelyWritesOnlyWithinSlot(*this, slot, dataLayout));
+template <>
+void createMemsetLenAttr(LLVM::MemsetInlineOp op, IntegerAttr &memsetLenAttr) {
+ memsetLenAttr = op.getLenAttr();
+}
+template <class MemsetLike>
+void createMemsetLikeToReplace(OpBuilder &builder, MemsetLike toReplace,
+ IntegerAttr memsetLenAttr,
+ uint64_t newMemsetSize,
+ DenseMap<Attribute, MemorySlot> &subslots,
+ Attribute index) {
+
+ Value newMemsetSizeValue =
+ builder
+ .create<LLVM::ConstantOp>(
+ toReplace.getLen().getLoc(),
+ IntegerAttr::get(memsetLenAttr.getType(), newMemsetSize))
+ .getResult();
+
+ builder.create<LLVM::MemsetOp>(toReplace.getLoc(), subslots.at(index).ptr,
+ toReplace.getVal(), newMemsetSizeValue,
+ toReplace.getIsVolatile());
}
+template <>
+void createMemsetLikeToReplace(OpBuilder &builder,
+ LLVM::MemsetInlineOp toReplace,
+ IntegerAttr memsetLenAttr,
+ uint64_t newMemsetSize,
+ DenseMap<Attribute, MemorySlot> &subslots,
+ Attribute index) {
-bool LLVM::MemsetOp::canRewire(const DestructurableMemorySlot &slot,
- SmallPtrSetImpl<Attribute> &usedIndices,
- SmallVectorImpl<MemorySlot> &mustBeSafelyUsed,
- const DataLayout &dataLayout) {
- if (&slot.elemType.getDialect() != getOperation()->getDialect())
- return false;
-
- if (getIsVolatile())
- return false;
-
- if (!cast<DestructurableTypeInterface>(slot.elemType).getSubelementIndexMap())
- return false;
-
- if (!areAllIndicesI32(slot))
- return false;
+ auto newMemsetSizeValue =
+ IntegerAttr::get(memsetLenAttr.getType(), newMemsetSize);
- return definitelyWritesOnlyWithinSlot(*this, slot, dataLayout);
+ builder.create<LLVM::MemsetInlineOp>(
+ toReplace.getLoc(), subslots.at(index).ptr, toReplace.getVal(),
+ newMemsetSizeValue, toReplace.getIsVolatile());
}
+} // namespace
----------------
gysit wrote:
```suggestion
} // namespace
```
nit: Add newline.
https://github.com/llvm/llvm-project/pull/115711
More information about the Mlir-commits
mailing list