@@ -465,6 +465,51 @@ struct AssumeAlignmentOpLowering
465
465
}
466
466
};
467
467
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
+
468
513
// A `dealloc` is converted into a call to `free` on the underlying data buffer.
469
514
// The memref descriptor being an SSA value, there is no need to clean it up
470
515
// in any way.
@@ -1997,22 +2042,23 @@ void mlir::populateFinalizeMemRefToLLVMConversionPatterns(
1997
2042
patterns.add <
1998
2043
AllocaOpLowering,
1999
2044
AllocaScopeOpLowering,
2000
- AtomicRMWOpLowering,
2001
2045
AssumeAlignmentOpLowering,
2046
+ AtomicRMWOpLowering,
2002
2047
ConvertExtractAlignedPointerAsIndex,
2003
2048
DimOpLowering,
2049
+ DistinctObjectsOpLowering,
2004
2050
ExtractStridedMetadataOpLowering,
2005
2051
GenericAtomicRMWOpLowering,
2006
2052
GetGlobalMemrefOpLowering,
2007
2053
LoadOpLowering,
2008
2054
MemRefCastOpLowering,
2009
- MemorySpaceCastOpLowering,
2010
2055
MemRefReinterpretCastOpLowering,
2011
2056
MemRefReshapeOpLowering,
2057
+ MemorySpaceCastOpLowering,
2012
2058
PrefetchOpLowering,
2013
2059
RankOpLowering,
2014
- ReassociatingReshapeOpConversion<memref::ExpandShapeOp>,
2015
2060
ReassociatingReshapeOpConversion<memref::CollapseShapeOp>,
2061
+ ReassociatingReshapeOpConversion<memref::ExpandShapeOp>,
2016
2062
StoreOpLowering,
2017
2063
SubViewOpLowering,
2018
2064
TransposeOpLowering,
0 commit comments