Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
mlir/lib/Conversion/MemRefToLLVM/AllocLikeConversion.cpp
Show All 17 Lines | |||||
// with SymbolTable trait instead of ModuleOp and make similar change here. This | // with SymbolTable trait instead of ModuleOp and make similar change here. This | ||||
// allows call sites to use getParentWithTrait<OpTrait::SymbolTable> instead | // allows call sites to use getParentWithTrait<OpTrait::SymbolTable> instead | ||||
// of getParentOfType<ModuleOp> to pass down the operation. | // of getParentOfType<ModuleOp> to pass down the operation. | ||||
LLVM::LLVMFuncOp getNotalignedAllocFn(LLVMTypeConverter *typeConverter, | LLVM::LLVMFuncOp getNotalignedAllocFn(LLVMTypeConverter *typeConverter, | ||||
ModuleOp module, Type indexType) { | ModuleOp module, Type indexType) { | ||||
bool useGenericFn = typeConverter->getOptions().useGenericFunctions; | bool useGenericFn = typeConverter->getOptions().useGenericFunctions; | ||||
if (useGenericFn) | if (useGenericFn) | ||||
return LLVM::lookupOrCreateGenericAllocFn(module, indexType); | return LLVM::lookupOrCreateGenericAllocFn( | ||||
module, indexType, typeConverter->useOpaquePointers()); | |||||
return LLVM::lookupOrCreateMallocFn(module, indexType); | return LLVM::lookupOrCreateMallocFn(module, indexType, | ||||
typeConverter->useOpaquePointers()); | |||||
} | } | ||||
LLVM::LLVMFuncOp getAlignedAllocFn(LLVMTypeConverter *typeConverter, | LLVM::LLVMFuncOp getAlignedAllocFn(LLVMTypeConverter *typeConverter, | ||||
ModuleOp module, Type indexType) { | ModuleOp module, Type indexType) { | ||||
bool useGenericFn = typeConverter->getOptions().useGenericFunctions; | bool useGenericFn = typeConverter->getOptions().useGenericFunctions; | ||||
if (useGenericFn) | if (useGenericFn) | ||||
return LLVM::lookupOrCreateGenericAlignedAllocFn(module, indexType); | return LLVM::lookupOrCreateGenericAlignedAllocFn( | ||||
module, indexType, typeConverter->useOpaquePointers()); | |||||
return LLVM::lookupOrCreateAlignedAllocFn(module, indexType); | return LLVM::lookupOrCreateAlignedAllocFn(module, indexType, | ||||
typeConverter->useOpaquePointers()); | |||||
} | } | ||||
} // end namespace | } // end namespace | ||||
Value AllocationOpLLVMLowering::createAligned( | Value AllocationOpLLVMLowering::createAligned( | ||||
ConversionPatternRewriter &rewriter, Location loc, Value input, | ConversionPatternRewriter &rewriter, Location loc, Value input, | ||||
Value alignment) { | Value alignment) { | ||||
Value one = createIndexAttrConstant(rewriter, loc, alignment.getType(), 1); | Value one = createIndexAttrConstant(rewriter, loc, alignment.getType(), 1); | ||||
Value bump = rewriter.create<LLVM::SubOp>(loc, alignment, one); | Value bump = rewriter.create<LLVM::SubOp>(loc, alignment, one); | ||||
Value bumped = rewriter.create<LLVM::AddOp>(loc, input, bump); | Value bumped = rewriter.create<LLVM::AddOp>(loc, input, bump); | ||||
Value mod = rewriter.create<LLVM::URemOp>(loc, bumped, alignment); | Value mod = rewriter.create<LLVM::URemOp>(loc, bumped, alignment); | ||||
return rewriter.create<LLVM::SubOp>(loc, bumped, mod); | return rewriter.create<LLVM::SubOp>(loc, bumped, mod); | ||||
} | } | ||||
static Value castAllocFuncResult(ConversionPatternRewriter &rewriter, | static Value castAllocFuncResult(ConversionPatternRewriter &rewriter, | ||||
Location loc, Value allocatedPtr, | Location loc, Value allocatedPtr, | ||||
MemRefType memRefType, Type elementPtrType, | MemRefType memRefType, Type elementPtrType, | ||||
LLVMTypeConverter &typeConverter) { | LLVMTypeConverter &typeConverter) { | ||||
auto allocatedPtrTy = allocatedPtr.getType().cast<LLVM::LLVMPointerType>(); | auto allocatedPtrTy = allocatedPtr.getType().cast<LLVM::LLVMPointerType>(); | ||||
if (allocatedPtrTy.getAddressSpace() != memRefType.getMemorySpaceAsInt()) | if (allocatedPtrTy.getAddressSpace() != memRefType.getMemorySpaceAsInt()) | ||||
allocatedPtr = rewriter.create<LLVM::AddrSpaceCastOp>( | allocatedPtr = rewriter.create<LLVM::AddrSpaceCastOp>( | ||||
loc, | loc, | ||||
LLVM::LLVMPointerType::get(allocatedPtrTy.getElementType(), | typeConverter.getPointerType(allocatedPtrTy.getElementType(), | ||||
memRefType.getMemorySpaceAsInt()), | memRefType.getMemorySpaceAsInt()), | ||||
allocatedPtr); | allocatedPtr); | ||||
if (!typeConverter.useOpaquePointers()) | |||||
allocatedPtr = | allocatedPtr = | ||||
rewriter.create<LLVM::BitcastOp>(loc, elementPtrType, allocatedPtr); | rewriter.create<LLVM::BitcastOp>(loc, elementPtrType, allocatedPtr); | ||||
return allocatedPtr; | return allocatedPtr; | ||||
} | } | ||||
std::tuple<Value, Value> AllocationOpLLVMLowering::allocateBufferManuallyAlign( | std::tuple<Value, Value> AllocationOpLLVMLowering::allocateBufferManuallyAlign( | ||||
ConversionPatternRewriter &rewriter, Location loc, Value sizeBytes, | ConversionPatternRewriter &rewriter, Location loc, Value sizeBytes, | ||||
Operation *op, Value alignment) const { | Operation *op, Value alignment) const { | ||||
if (alignment) { | if (alignment) { | ||||
// Adjust the allocation size to consider alignment. | // Adjust the allocation size to consider alignment. | ||||
▲ Show 20 Lines • Show All 107 Lines • Show Last 20 Lines |