Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
mlir/lib/Conversion/AsyncToLLVM/AsyncToLLVM.cpp
Show First 20 Lines • Show All 372 Lines • ▼ Show 20 Lines | coroSize = | ||||
rewriter.create<LLVM::SubOp>(op->getLoc(), coroSize, makeConstant(1)); | rewriter.create<LLVM::SubOp>(op->getLoc(), coroSize, makeConstant(1)); | ||||
Value negCoroAlign = | Value negCoroAlign = | ||||
rewriter.create<LLVM::SubOp>(op->getLoc(), makeConstant(0), coroAlign); | rewriter.create<LLVM::SubOp>(op->getLoc(), makeConstant(0), coroAlign); | ||||
coroSize = | coroSize = | ||||
rewriter.create<LLVM::AndOp>(op->getLoc(), coroSize, negCoroAlign); | rewriter.create<LLVM::AndOp>(op->getLoc(), coroSize, negCoroAlign); | ||||
// Allocate memory for the coroutine frame. | // Allocate memory for the coroutine frame. | ||||
auto allocFuncOp = LLVM::lookupOrCreateAlignedAllocFn( | auto allocFuncOp = LLVM::lookupOrCreateAlignedAllocFn( | ||||
op->getParentOfType<ModuleOp>(), rewriter.getI64Type()); | op->getParentOfType<ModuleOp>(), rewriter.getI64Type(), | ||||
/*TODO: opaquePointers=*/false); | |||||
auto coroAlloc = rewriter.create<LLVM::CallOp>( | auto coroAlloc = rewriter.create<LLVM::CallOp>( | ||||
loc, allocFuncOp, ValueRange{coroAlign, coroSize}); | loc, allocFuncOp, ValueRange{coroAlign, coroSize}); | ||||
// Begin a coroutine: @llvm.coro.begin. | // Begin a coroutine: @llvm.coro.begin. | ||||
auto coroId = CoroBeginOpAdaptor(adaptor.getOperands()).getId(); | auto coroId = CoroBeginOpAdaptor(adaptor.getOperands()).getId(); | ||||
rewriter.replaceOpWithNewOp<LLVM::CoroBeginOp>( | rewriter.replaceOpWithNewOp<LLVM::CoroBeginOp>( | ||||
op, i8Ptr, ValueRange({coroId, coroAlloc.getResult()})); | op, i8Ptr, ValueRange({coroId, coroAlloc.getResult()})); | ||||
Show All 17 Lines | matchAndRewrite(CoroFreeOp op, OpAdaptor adaptor, | ||||
auto i8Ptr = AsyncAPI::opaquePointerType(op->getContext()); | auto i8Ptr = AsyncAPI::opaquePointerType(op->getContext()); | ||||
auto loc = op->getLoc(); | auto loc = op->getLoc(); | ||||
// Get a pointer to the coroutine frame memory: @llvm.coro.free. | // Get a pointer to the coroutine frame memory: @llvm.coro.free. | ||||
auto coroMem = | auto coroMem = | ||||
rewriter.create<LLVM::CoroFreeOp>(loc, i8Ptr, adaptor.getOperands()); | rewriter.create<LLVM::CoroFreeOp>(loc, i8Ptr, adaptor.getOperands()); | ||||
// Free the memory. | // Free the memory. | ||||
auto freeFuncOp = | auto freeFuncOp = LLVM::lookupOrCreateFreeFn( | ||||
LLVM::lookupOrCreateFreeFn(op->getParentOfType<ModuleOp>()); | op->getParentOfType<ModuleOp>(), /*TODO: opaquePointers=*/false); | ||||
rewriter.replaceOpWithNewOp<LLVM::CallOp>(op, freeFuncOp, | rewriter.replaceOpWithNewOp<LLVM::CallOp>(op, freeFuncOp, | ||||
ValueRange(coroMem.getResult())); | ValueRange(coroMem.getResult())); | ||||
return success(); | return success(); | ||||
} | } | ||||
}; | }; | ||||
} // namespace | } // namespace | ||||
▲ Show 20 Lines • Show All 718 Lines • Show Last 20 Lines |