@@ -333,20 +333,29 @@ class CoroBeginOpConversion : public OpConversionPattern<CoroBeginOp> {
333
333
auto loc = op->getLoc ();
334
334
335
335
// Get coroutine frame size: @llvm.coro.size.i64.
336
- auto coroSize =
336
+ Value coroSize =
337
337
rewriter.create <LLVM::CoroSizeOp>(loc, rewriter.getI64Type ());
338
338
// The coroutine lowering doesn't properly account for alignment of the
339
339
// frame, so align everything to 64 bytes which ought to be enough for
340
340
// everyone. https://llvm.org/PR53148
341
- auto coroAlign = rewriter.create <LLVM::ConstantOp>(
342
- op->getLoc (), rewriter.getI64Type (), rewriter.getI64IntegerAttr (64 ));
341
+ constexpr int64_t coroAlign = 64 ;
342
+ auto makeConstant = [&](uint64_t c) {
343
+ return rewriter.create <LLVM::ConstantOp>(
344
+ op->getLoc (), rewriter.getI64Type (), rewriter.getI64IntegerAttr (c));
345
+ };
346
+ // Round up the size to the alignment. This is a requirement of
347
+ // aligned_alloc.
348
+ coroSize = rewriter.create <LLVM::AddOp>(op->getLoc (), coroSize,
349
+ makeConstant (coroAlign - 1 ));
350
+ coroSize = rewriter.create <LLVM::AndOp>(op->getLoc (), coroSize,
351
+ makeConstant (-coroAlign));
343
352
344
353
// Allocate memory for the coroutine frame.
345
354
auto allocFuncOp = LLVM::lookupOrCreateAlignedAllocFn (
346
355
op->getParentOfType <ModuleOp>(), rewriter.getI64Type ());
347
356
auto coroAlloc = rewriter.create <LLVM::CallOp>(
348
357
loc, i8Ptr, SymbolRefAttr::get (allocFuncOp),
349
- ValueRange{coroAlign, coroSize. getResult () });
358
+ ValueRange{makeConstant ( coroAlign) , coroSize});
350
359
351
360
// Begin a coroutine: @llvm.coro.begin.
352
361
auto coroId = CoroBeginOpAdaptor (adaptor.getOperands ()).id ();
0 commit comments