22 ModuleOp module,
Type indexType) {
32 ModuleOp module,
Type indexType) {
47 Value bump = rewriter.
create<LLVM::SubOp>(loc, alignment, one);
48 Value bumped = rewriter.
create<LLVM::AddOp>(loc, input, bump);
50 return rewriter.
create<LLVM::SubOp>(loc, bumped,
mod);
55 MemRefType memRefType,
Type elementPtrType,
57 auto allocatedPtrTy = cast<LLVM::LLVMPointerType>(allocatedPtr.
getType());
60 if (
failed(maybeMemrefAddrSpace))
62 unsigned memrefAddrSpace = *maybeMemrefAddrSpace;
63 if (allocatedPtrTy.getAddressSpace() != memrefAddrSpace)
64 allocatedPtr = rewriter.
create<LLVM::AddrSpaceCastOp>(
75 sizeBytes = rewriter.
create<LLVM::AddOp>(loc, sizeBytes, alignment);
81 LLVM::LLVMFuncOp allocFuncOp = getNotalignedAllocFn(
83 auto results = rewriter.
create<LLVM::CallOp>(loc, allocFuncOp, sizeBytes);
90 Value alignedPtr = allocatedPtr;
97 rewriter.
create<LLVM::IntToPtrOp>(loc, elementPtrType, alignmentInt);
100 return std::make_tuple(allocatedPtr, alignedPtr);
103 unsigned AllocationOpLLVMLowering::getMemRefEltSizeInBytes(
109 layout = &analysis->getAbove(op);
111 Type elementType = memRefType.getElementType();
112 if (
auto memRefElementType = dyn_cast<MemRefType>(elementType))
115 if (
auto memRefElementType = dyn_cast<UnrankedMemRefType>(elementType))
117 memRefElementType, *layout);
121 bool AllocationOpLLVMLowering::isMemRefSizeMultipleOf(
122 MemRefType type, uint64_t factor,
Operation *op,
124 uint64_t sizeDivisor = getMemRefEltSizeInBytes(type, op, defaultLayout);
125 for (
unsigned i = 0, e = type.getRank(); i < e; i++) {
126 if (type.isDynamicDim(i))
128 sizeDivisor = sizeDivisor * type.getDimSize(i);
130 return sizeDivisor % factor == 0;
136 Value allocAlignment =
142 if (!isMemRefSizeMultipleOf(memRefType, alignment, op, defaultLayout))
143 sizeBytes =
createAligned(rewriter, loc, sizeBytes, allocAlignment);
146 LLVM::LLVMFuncOp allocFuncOp = getAlignedAllocFn(
148 auto results = rewriter.
create<LLVM::CallOp>(
149 loc, allocFuncOp,
ValueRange({allocAlignment, sizeBytes}));
156 requiresNumElements =
true;
175 strides, size, !requiresNumElements);
178 auto [allocatedPtr, alignedPtr] =
181 if (!allocatedPtr || !alignedPtr)
183 "underlying buffer allocation failed");
187 loc, memRefType, allocatedPtr, alignedPtr, sizes, strides, rewriter);
190 rewriter.
replaceOp(op, {memRefDescriptor});
static Value castAllocFuncResult(ConversionPatternRewriter &rewriter, Location loc, Value allocatedPtr, MemRefType memRefType, Type elementPtrType, const LLVMTypeConverter &typeConverter)
MLIRContext * getContext() const
This class implements a pattern rewriter for use with ConversionPatterns.
void replaceOp(Operation *op, ValueRange newValues) override
PatternRewriter hook for replacing an operation.
LogicalResult notifyMatchFailure(Location loc, function_ref< void(Diagnostic &)> reasonCallback) override
PatternRewriter hook for notifying match failure reasons.
MemRefDescriptor createMemRefDescriptor(Location loc, MemRefType memRefType, Value allocatedPtr, Value alignedPtr, ArrayRef< Value > sizes, ArrayRef< Value > strides, ConversionPatternRewriter &rewriter) const
Creates and populates a canonical memref descriptor struct.
void getMemRefDescriptorSizes(Location loc, MemRefType memRefType, ValueRange dynamicSizes, ConversionPatternRewriter &rewriter, SmallVectorImpl< Value > &sizes, SmallVectorImpl< Value > &strides, Value &size, bool sizeInBytes=true) const
Computes sizes, strides and buffer size of memRefType with identity layout.
const LLVMTypeConverter * getTypeConverter() const
Type getElementPtrType(MemRefType type) const
Returns the type of a pointer to an element of the memref.
bool isConvertibleAndHasIdentityMaps(MemRefType type) const
Returns if the given memref has identity maps and the element type is convertible to LLVM.
Stores data layout objects for each operation that specifies the data layout above and below the give...
The main mechanism for performing data layout queries.
llvm::TypeSize getTypeSize(Type t) const
Returns the size of the given type in the current scope.
This class provides support for representing a failure result, or a valid value of type T.
Conversion from types to the LLVM IR dialect.
const LowerToLLVMOptions & getOptions() const
unsigned getUnrankedMemRefDescriptorSize(UnrankedMemRefType type, const DataLayout &layout) const
Returns the size of the unranked memref descriptor object in bytes.
FailureOr< unsigned > getMemRefAddressSpace(BaseMemRefType type) const
Return the LLVM address space corresponding to the memory space of the memref type type or failure if...
unsigned getMemRefDescriptorSize(MemRefType type, const DataLayout &layout) const
Returns the size of the memref descriptor object in bytes.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Operation * create(const OperationState &state)
Creates an operation given the fields represented as an OperationState.
Operation is the basic unit of execution within MLIR.
Location getLoc()
The source location the operation was defined or derived from.
OpTy getParentOfType()
Return the closest surrounding parent operation that is of type 'OpTy'.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
This class provides an abstraction over the different types of ranges over Values.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
Type getType() const
Return the type of this value.
LLVM::LLVMFuncOp lookupOrCreateAlignedAllocFn(ModuleOp moduleOp, Type indexType)
LLVM::LLVMFuncOp lookupOrCreateGenericAlignedAllocFn(ModuleOp moduleOp, Type indexType)
LLVM::LLVMFuncOp lookupOrCreateMallocFn(ModuleOp moduleOp, Type indexType)
LLVM::LLVMFuncOp lookupOrCreateGenericAllocFn(ModuleOp moduleOp, Type indexType)
Include the generated interface declarations.
LogicalResult success(bool isSuccess=true)
Utility function to generate a LogicalResult.
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
bool failed(LogicalResult result)
Utility function that returns true if the provided LogicalResult corresponds to a failure value.
int64_t mod(int64_t lhs, int64_t rhs)
Returns MLIR's mod operation on constants.
void setRequiresNumElements()
Sets the flag 'requiresNumElements', specifying the Op requires the number of elements instead of the...
virtual std::tuple< Value, Value > allocateBuffer(ConversionPatternRewriter &rewriter, Location loc, Value size, Operation *op) const =0
Allocates the underlying buffer.
Type getIndexType() const
Gets the MLIR type wrapping the LLVM integer type whose bit width is defined by the used type convert...
static Value createAligned(ConversionPatternRewriter &rewriter, Location loc, Value input, Value alignment)
Computes the aligned value for 'input' as follows: bumped = input + alignement - 1 aligned = bumped -...
Value allocateBufferAutoAlign(ConversionPatternRewriter &rewriter, Location loc, Value sizeBytes, Operation *op, const DataLayout *defaultLayout, int64_t alignment) const
Allocates a memory buffer using an aligned allocation method.
static MemRefType getMemRefResultType(Operation *op)
std::tuple< Value, Value > allocateBufferManuallyAlign(ConversionPatternRewriter &rewriter, Location loc, Value sizeBytes, Operation *op, Value alignment) const
Allocates a memory buffer using an allocation method that doesn't guarantee alignment.
static Value createIndexAttrConstant(OpBuilder &builder, Location loc, Type resultType, int64_t value)
Create a constant Op producing a value of resultType from an index-typed integer attribute.
This class represents an efficient way to signal success or failure.