|
| 1 | +// RUN: polygeist-opt --convert-polygeist-to-llvm --split-input-file %s --allow-unregistered-dialect | FileCheck %s |
| 2 | + |
| 3 | +module { |
| 4 | + llvm.func @_Z3runP11CUstream_stPii(%arg0: !llvm.ptr<struct<()>>, %arg1: !llvm.ptr<i32>, %arg2: i32) { |
| 5 | + %0 = llvm.mlir.constant(0 : index) : i64 |
| 6 | + %1 = llvm.mlir.constant(1 : index) : i64 |
| 7 | + %2 = llvm.mlir.constant(20 : index) : i64 |
| 8 | + %3 = llvm.mlir.constant(10 : index) : i64 |
| 9 | + %4 = llvm.bitcast %arg0 : !llvm.ptr<struct<()>> to !llvm.ptr<i8> |
| 10 | + %5 = llvm.bitcast %4 : !llvm.ptr<i8> to !llvm.ptr<i8> |
| 11 | + %6 = builtin.unrealized_conversion_cast %5 : !llvm.ptr<i8> to memref<?xi8> |
| 12 | + %7 = "polygeist.stream2token"(%6) : (memref<?xi8>) -> !async.token |
| 13 | + %token = async.execute [%7] { |
| 14 | + omp.parallel { |
| 15 | + omp.wsloop for (%arg3, %arg4) : i64 = (%0, %0) to (%3, %2) step (%1, %1) { |
| 16 | + llvm.call @_Z9somethingPii(%arg1, %arg2) : (!llvm.ptr<i32>, i32) -> () |
| 17 | + omp.yield |
| 18 | + } |
| 19 | + omp.terminator |
| 20 | + } |
| 21 | + async.yield |
| 22 | + } |
| 23 | + llvm.return |
| 24 | + } |
| 25 | + llvm.func @_Z9somethingPii(!llvm.ptr<i32>, i32) attributes {sym_visibility = "private"} |
| 26 | +} |
| 27 | + |
| 28 | +// CHECK-LABEL: llvm.func @_Z3runP11CUstream_stPii( |
| 29 | +// CHECK-SAME: %[[VAL_0:.*]]: !llvm.ptr<struct<()>>, |
| 30 | +// CHECK-SAME: %[[VAL_1:.*]]: !llvm.ptr<i32>, |
| 31 | +// CHECK-SAME: %[[VAL_2:.*]]: i32) { |
| 32 | +// CHECK-NEXT: %[[VAL_3:.*]] = llvm.mlir.constant(0 : index) : i64 |
| 33 | +// CHECK-NEXT: %[[VAL_4:.*]] = llvm.mlir.constant(1 : index) : i64 |
| 34 | +// CHECK-NEXT: %[[VAL_5:.*]] = llvm.mlir.constant(20 : index) : i64 |
| 35 | +// CHECK-NEXT: %[[VAL_6:.*]] = llvm.mlir.constant(10 : index) : i64 |
| 36 | +// CHECK-NEXT: %[[VAL_7:.*]] = llvm.bitcast %[[VAL_0]] : !llvm.ptr<struct<()>> to !llvm.ptr<i8> |
| 37 | +// CHECK-NEXT: %[[VAL_8:.*]] = llvm.bitcast %[[VAL_7]] : !llvm.ptr<i8> to !llvm.ptr<i8> |
| 38 | +// CHECK-NEXT: %[[VAL_9:.*]] = builtin.unrealized_conversion_cast %[[VAL_8]] : !llvm.ptr<i8> to memref<?xi8> |
| 39 | +// CHECK-NEXT: %[[VAL_10:.*]] = llvm.mlir.constant(16 : i64) : i64 |
| 40 | +// CHECK-NEXT: %[[VAL_11:.*]] = llvm.call @malloc(%[[VAL_10]]) : (i64) -> !llvm.ptr<i8> |
| 41 | +// CHECK-NEXT: %[[VAL_12:.*]] = llvm.bitcast %[[VAL_11]] : !llvm.ptr<i8> to !llvm.ptr<struct<(ptr<i32>, i32)>> |
| 42 | +// CHECK-NEXT: %[[VAL_13:.*]] = llvm.mlir.constant(0 : i32) : i32 |
| 43 | +// CHECK-NEXT: %[[VAL_14:.*]] = llvm.mlir.constant(0 : i32) : i32 |
| 44 | +// CHECK-NEXT: %[[VAL_15:.*]] = llvm.getelementptr %[[VAL_12]]{{\[}}%[[VAL_13]], 0] : (!llvm.ptr<struct<(ptr<i32>, i32)>>, i32) -> !llvm.ptr<ptr<i32>> |
| 45 | +// CHECK-NEXT: llvm.store %[[VAL_1]], %[[VAL_15]] : !llvm.ptr<ptr<i32>> |
| 46 | +// CHECK-NEXT: %[[VAL_16:.*]] = llvm.mlir.constant(0 : i32) : i32 |
| 47 | +// CHECK-NEXT: %[[VAL_17:.*]] = llvm.mlir.constant(1 : i32) : i32 |
| 48 | +// CHECK-NEXT: %[[VAL_18:.*]] = llvm.getelementptr %[[VAL_12]]{{\[}}%[[VAL_16]], 1] : (!llvm.ptr<struct<(ptr<i32>, i32)>>, i32) -> !llvm.ptr<i32> |
| 49 | +// CHECK-NEXT: llvm.store %[[VAL_2]], %[[VAL_18]] : !llvm.ptr<i32> |
| 50 | +// CHECK-NEXT: %[[VAL_19:.*]] = llvm.bitcast %[[VAL_12]] : !llvm.ptr<struct<(ptr<i32>, i32)>> to !llvm.ptr<i8> |
| 51 | +// CHECK-NEXT: %[[VAL_20:.*]] = llvm.mlir.addressof @kernelbody.{{[0-9\.]+}} : !llvm.ptr<func<void (ptr<i8>)>> |
| 52 | +// CHECK-NEXT: %[[VAL_21:.*]] = llvm.bitcast %[[VAL_8]] : !llvm.ptr<i8> to !llvm.ptr<i8> |
| 53 | +// CHECK-NEXT: llvm.call @fake_cuda_dispatch(%[[VAL_19]], %[[VAL_20]], %[[VAL_21]]) : (!llvm.ptr<i8>, !llvm.ptr<func<void (ptr<i8>)>>, !llvm.ptr<i8>) -> () |
| 54 | +// CHECK-NEXT: llvm.return |
| 55 | + |
| 56 | +// CHECK-LABEL: llvm.func @kernelbody.{{[0-9\.]+}}( |
| 57 | +// CHECK-SAME: %[[VAL_0:.*]]: !llvm.ptr<i8>) { |
| 58 | +// CHECK-NEXT: %[[VAL_1:.*]] = llvm.mlir.constant(0 : index) : i64 |
| 59 | +// CHECK-NEXT: %[[VAL_2:.*]] = llvm.mlir.constant(10 : index) : i64 |
| 60 | +// CHECK-NEXT: %[[VAL_3:.*]] = llvm.mlir.constant(20 : index) : i64 |
| 61 | +// CHECK-NEXT: %[[VAL_4:.*]] = llvm.mlir.constant(1 : index) : i64 |
| 62 | +// CHECK-NEXT: %[[VAL_5:.*]] = llvm.bitcast %[[VAL_0]] : !llvm.ptr<i8> to !llvm.ptr<struct<(ptr<i32>, i32)>> |
| 63 | +// CHECK-NEXT: %[[VAL_6:.*]] = llvm.mlir.constant(0 : i32) : i32 |
| 64 | +// CHECK-NEXT: %[[VAL_7:.*]] = llvm.mlir.constant(0 : i32) : i32 |
| 65 | +// CHECK-NEXT: %[[VAL_8:.*]] = llvm.getelementptr %[[VAL_5]]{{\[}}%[[VAL_6]], 0] : (!llvm.ptr<struct<(ptr<i32>, i32)>>, i32) -> !llvm.ptr<ptr<i32>> |
| 66 | +// CHECK-NEXT: %[[VAL_9:.*]] = llvm.load %[[VAL_8]] : !llvm.ptr<ptr<i32>> |
| 67 | +// CHECK-NEXT: %[[VAL_10:.*]] = llvm.mlir.constant(0 : i32) : i32 |
| 68 | +// CHECK-NEXT: %[[VAL_11:.*]] = llvm.mlir.constant(1 : i32) : i32 |
| 69 | +// CHECK-NEXT: %[[VAL_12:.*]] = llvm.getelementptr %[[VAL_5]]{{\[}}%[[VAL_10]], 1] : (!llvm.ptr<struct<(ptr<i32>, i32)>>, i32) -> !llvm.ptr<i32> |
| 70 | +// CHECK-NEXT: %[[VAL_13:.*]] = llvm.load %[[VAL_12]] : !llvm.ptr<i32> |
| 71 | +// CHECK-NEXT: llvm.call @free(%[[VAL_0]]) : (!llvm.ptr<i8>) -> () |
| 72 | +// CHECK-NEXT: omp.parallel { |
| 73 | +// CHECK-NEXT: omp.wsloop for (%[[VAL_14:.*]], %[[VAL_15:.*]]) : i64 = (%[[VAL_1]], %[[VAL_1]]) to (%[[VAL_2]], %[[VAL_3]]) step (%[[VAL_4]], %[[VAL_4]]) { |
| 74 | +// CHECK-NEXT: llvm.call @_Z9somethingPii(%[[VAL_9]], %[[VAL_13]]) : (!llvm.ptr<i32>, i32) -> () |
| 75 | +// CHECK-NEXT: omp.yield |
| 76 | +// CHECK-NEXT: } |
| 77 | +// CHECK-NEXT: omp.terminator |
| 78 | +// CHECK-NEXT: } |
| 79 | +// CHECK-NEXT: llvm.return |
| 80 | + |
0 commit comments