91 lines · plain
1// RUN: mlir-opt %s -convert-async-to-llvm | FileCheck %s2 3// CHECK-LABEL: @coro_id4func.func @coro_id() {5 // CHECK: %0 = llvm.mlir.constant(0 : i32) : i326 // CHECK: %1 = llvm.mlir.zero : !llvm.ptr7 // CHECK: %2 = llvm.intr.coro.id %0, %1, %1, %1 : (i32, !llvm.ptr, !llvm.ptr, !llvm.ptr) -> !llvm.token8 %0 = async.coro.id9 return10}11 12// CHECK-LABEL: @coro_begin13func.func @coro_begin() {14 // CHECK: %[[ID:.*]] = llvm.intr.coro.id15 %0 = async.coro.id16 // CHECK: %[[SIZE:.*]] = llvm.intr.coro.size : i6417 // CHECK: %[[ALIGN:.*]] = llvm.intr.coro.align : i6418 // CHECK: %[[SIZE_PLUS_ALIGN:.*]] = llvm.add %[[SIZE]], %[[ALIGN]] : i6419 // CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : i64) : i6420 // CHECK: %[[SIZE_PLUS_ALIGN_MINUS_ONE:.*]] = llvm.sub %[[SIZE_PLUS_ALIGN]], %[[C1]] : i6421 // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i6422 // CHECK: %[[NEGATED_ALIGN:.*]] = llvm.sub %[[C0]], %[[ALIGN]] : i6423 // CHECK: %[[ROUNDED_SIZE:.*]] = llvm.and %[[SIZE_PLUS_ALIGN_MINUS_ONE]], %[[NEGATED_ALIGN]] : i6424 // CHECK: %[[ALLOC:.*]] = llvm.call @aligned_alloc(%[[ALIGN]], %[[ROUNDED_SIZE]])25 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin %[[ID]], %[[ALLOC]]26 %1 = async.coro.begin %027 return28}29 30// CHECK-LABEL: @coro_free31func.func @coro_free() {32 // CHECK: %[[ID:.*]] = llvm.intr.coro.id33 %0 = async.coro.id34 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin35 %1 = async.coro.begin %036 // CHECK: %[[MEM:.*]] = llvm.intr.coro.free %[[ID]], %[[HDL]]37 // CHECK: llvm.call @free(%[[MEM]])38 async.coro.free %0, %139 return40}41 42// CHECK-LABEL: @coro_end43func.func @coro_end() {44 %0 = async.coro.id45 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin46 %1 = async.coro.begin %047 // CHECK: %[[FALSE:.*]] = llvm.mlir.constant(false) : i148 // CHECK: llvm.intr.coro.end %[[HDL]], %[[FALSE]]49 async.coro.end %150 return51}52 53// CHECK-LABEL: @coro_save54func.func @coro_save() {55 %0 = async.coro.id56 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin57 %1 = async.coro.begin %058 // CHECK: llvm.intr.coro.save %[[HDL]]59 %2 = async.coro.save %160 return61}62 63// CHECK-LABEL: @coro_suspend64func.func @coro_suspend() {65 %0 = async.coro.id66 // CHECK: %[[HDL:.*]] = llvm.intr.coro.begin67 %1 = async.coro.begin %068 // CHECK: %[[STATE:.*]] = llvm.intr.coro.save %[[HDL]]69 %2 = async.coro.save %170 71 // CHECK: %[[FINAL:.*]] = llvm.mlir.constant(false) : i172 // CHECK: %[[RET:.*]] = llvm.intr.coro.suspend %[[STATE]], %[[FINAL]]73 // CHECK: %[[SEXT:.*]] = llvm.sext %[[RET]] : i8 to i3274 // CHECK: llvm.switch %[[SEXT]] : i32, ^[[SUSPEND:[b0-9]+]]75 // CHECK-NEXT: 0: ^[[RESUME:[b0-9]+]]76 // CHECK-NEXT: 1: ^[[CLEANUP:[b0-9]+]]77 async.coro.suspend %2, ^suspend, ^resume, ^cleanup78^resume:79 // CHECK: ^[[RESUME]]80 // CHECK: return {coro.resume}81 return { coro.resume }82^cleanup:83 // CHECK: ^[[CLEANUP]]84 // CHECK: return {coro.cleanup}85 return { coro.cleanup }86^suspend:87 // CHECK: ^[[SUSPEND]]88 // CHECK: return {coro.suspend}89 return { coro.suspend }90}91