@@ -465,6 +465,51 @@ struct AssumeAlignmentOpLowering
465465 }
466466};
467467
468+ struct DistinctObjectsOpLowering
469+ : public ConvertOpToLLVMPattern<memref::DistinctObjectsOp> {
470+ using ConvertOpToLLVMPattern<
471+ memref::DistinctObjectsOp>::ConvertOpToLLVMPattern;
472+ explicit DistinctObjectsOpLowering (const LLVMTypeConverter &converter)
473+ : ConvertOpToLLVMPattern<memref::DistinctObjectsOp>(converter) {}
474+
475+ LogicalResult
476+ matchAndRewrite (memref::DistinctObjectsOp op, OpAdaptor adaptor,
477+ ConversionPatternRewriter &rewriter) const override {
478+ ValueRange operands = adaptor.getOperands ();
479+ if (operands.size () <= 1 ) {
480+ // Fast path.
481+ rewriter.replaceOp (op, operands);
482+ return success ();
483+ }
484+
485+ Location loc = op.getLoc ();
486+ SmallVector<Value> ptrs;
487+ for (auto [origOperand, newOperand] :
488+ llvm::zip_equal (op.getOperands (), operands)) {
489+ auto memrefType = cast<MemRefType>(origOperand.getType ());
490+ MemRefDescriptor memRefDescriptor (newOperand);
491+ Value ptr = memRefDescriptor.bufferPtr (rewriter, loc, *getTypeConverter (),
492+ memrefType);
493+ ptrs.push_back (ptr);
494+ }
495+
496+ auto cond =
497+ LLVM::ConstantOp::create (rewriter, loc, rewriter.getI1Type (), 1 );
498+ // Generate separate_storage assumptions for each pair of pointers.
499+ for (auto i : llvm::seq<size_t >(ptrs.size () - 1 )) {
500+ for (auto j : llvm::seq<size_t >(i + 1 , ptrs.size ())) {
501+ Value ptr1 = ptrs[i];
502+ Value ptr2 = ptrs[j];
503+ LLVM::AssumeOp::create (rewriter, loc, cond,
504+ LLVM::AssumeSeparateStorageTag{}, ptr1, ptr2);
505+ }
506+ }
507+
508+ rewriter.replaceOp (op, operands);
509+ return success ();
510+ }
511+ };
512+
468513// A `dealloc` is converted into a call to `free` on the underlying data buffer.
469514// The memref descriptor being an SSA value, there is no need to clean it up
470515// in any way.
@@ -1997,22 +2042,23 @@ void mlir::populateFinalizeMemRefToLLVMConversionPatterns(
19972042 patterns.add <
19982043 AllocaOpLowering,
19992044 AllocaScopeOpLowering,
2000- AtomicRMWOpLowering,
20012045 AssumeAlignmentOpLowering,
2046+ AtomicRMWOpLowering,
20022047 ConvertExtractAlignedPointerAsIndex,
20032048 DimOpLowering,
2049+ DistinctObjectsOpLowering,
20042050 ExtractStridedMetadataOpLowering,
20052051 GenericAtomicRMWOpLowering,
20062052 GetGlobalMemrefOpLowering,
20072053 LoadOpLowering,
20082054 MemRefCastOpLowering,
2009- MemorySpaceCastOpLowering,
20102055 MemRefReinterpretCastOpLowering,
20112056 MemRefReshapeOpLowering,
2057+ MemorySpaceCastOpLowering,
20122058 PrefetchOpLowering,
20132059 RankOpLowering,
2014- ReassociatingReshapeOpConversion<memref::ExpandShapeOp>,
20152060 ReassociatingReshapeOpConversion<memref::CollapseShapeOp>,
2061+ ReassociatingReshapeOpConversion<memref::ExpandShapeOp>,
20162062 StoreOpLowering,
20172063 SubViewOpLowering,
20182064 TransposeOpLowering,
0 commit comments