|
| 1 | +// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s |
| 2 | + |
| 3 | +llvm.func @cp_async_mbarrier_arrive(%bar_shared: !llvm.ptr<3>, %bar_gen: !llvm.ptr) { |
| 4 | + // CHECK-LABEL: define void @cp_async_mbarrier_arrive(ptr addrspace(3) %0, ptr %1) { |
| 5 | + // CHECK-NEXT: call void @llvm.nvvm.cp.async.mbarrier.arrive(ptr %1) |
| 6 | + // CHECK-NEXT: call void @llvm.nvvm.cp.async.mbarrier.arrive.noinc(ptr %1) |
| 7 | + // CHECK-NEXT: call void @llvm.nvvm.cp.async.mbarrier.arrive.shared(ptr addrspace(3) %0) |
| 8 | + // CHECK-NEXT: call void @llvm.nvvm.cp.async.mbarrier.arrive.noinc.shared(ptr addrspace(3) %0) |
| 9 | + // CHECK-NEXT: ret void |
| 10 | + // CHECK-NEXT: } |
| 11 | + nvvm.cp.async.mbarrier.arrive %bar_gen : !llvm.ptr |
| 12 | + nvvm.cp.async.mbarrier.arrive %bar_gen {noinc = true} : !llvm.ptr |
| 13 | + nvvm.cp.async.mbarrier.arrive %bar_shared : !llvm.ptr<3> |
| 14 | + nvvm.cp.async.mbarrier.arrive %bar_shared {noinc = true} : !llvm.ptr<3> |
| 15 | + llvm.return |
| 16 | +} |
| 17 | + |
| 18 | +llvm.func @mbarrier_init_generic(%barrier: !llvm.ptr) { |
| 19 | + // CHECK-LABEL: define void @mbarrier_init_generic(ptr %0) { |
| 20 | + // CHECK-NEXT: %2 = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() |
| 21 | + // CHECK-NEXT: call void @llvm.nvvm.mbarrier.init(ptr %0, i32 %2) |
| 22 | + // CHECK-NEXT: ret void |
| 23 | + // CHECK-NEXT: } |
| 24 | + %count = nvvm.read.ptx.sreg.ntid.x : i32 |
| 25 | + nvvm.mbarrier.init %barrier, %count : !llvm.ptr, i32 |
| 26 | + llvm.return |
| 27 | +} |
| 28 | + |
| 29 | +llvm.func @mbarrier_init_shared(%barrier: !llvm.ptr<3>) { |
| 30 | + // CHECK-LABEL: define void @mbarrier_init_shared(ptr addrspace(3) %0) { |
| 31 | + // CHECK-NEXT: %2 = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() |
| 32 | + // CHECK-NEXT: call void @llvm.nvvm.mbarrier.init.shared(ptr addrspace(3) %0, i32 %2) |
| 33 | + // CHECK-NEXT: ret void |
| 34 | + // CHECK-NEXT: } |
| 35 | + %count = nvvm.read.ptx.sreg.ntid.x : i32 |
| 36 | + nvvm.mbarrier.init %barrier, %count : !llvm.ptr<3>, i32 |
| 37 | + llvm.return |
| 38 | +} |
| 39 | + |
| 40 | +llvm.func @mbarrier_inval_generic(%barrier: !llvm.ptr) { |
| 41 | + // CHECK-LABEL: define void @mbarrier_inval_generic(ptr %0) { |
| 42 | + // CHECK-NEXT: call void @llvm.nvvm.mbarrier.inval(ptr %0) |
| 43 | + // CHECK-NEXT: ret void |
| 44 | + // CHECK-NEXT: } |
| 45 | + nvvm.mbarrier.inval %barrier : !llvm.ptr |
| 46 | + llvm.return |
| 47 | +} |
| 48 | + |
| 49 | +llvm.func @mbarrier_inval_shared(%barrier: !llvm.ptr<3>) { |
| 50 | + // CHECK-LABEL: define void @mbarrier_inval_shared(ptr addrspace(3) %0) { |
| 51 | + // CHECK-NEXT: call void @llvm.nvvm.mbarrier.inval.shared(ptr addrspace(3) %0) |
| 52 | + // CHECK-NEXT: ret void |
| 53 | + // CHECK-NEXT: } |
| 54 | + nvvm.mbarrier.inval %barrier : !llvm.ptr<3> |
| 55 | + llvm.return |
| 56 | +} |
| 57 | + |
| 58 | +llvm.func @mbarrier_arrive(%barrier: !llvm.ptr) { |
| 59 | + // CHECK-LABEL: define void @mbarrier_arrive(ptr %0) { |
| 60 | + // CHECK-NEXT: %2 = call i64 @llvm.nvvm.mbarrier.arrive(ptr %0) |
| 61 | + // CHECK-NEXT: ret void |
| 62 | + // CHECK-NEXT: } |
| 63 | + %0 = nvvm.mbarrier.arrive %barrier : !llvm.ptr -> i64 |
| 64 | + llvm.return |
| 65 | +} |
| 66 | + |
| 67 | +llvm.func @mbarrier_arrive_shared(%barrier: !llvm.ptr<3>) { |
| 68 | + // CHECK-LABEL: define void @mbarrier_arrive_shared(ptr addrspace(3) %0) { |
| 69 | + // CHECK-NEXT: %2 = call i64 @llvm.nvvm.mbarrier.arrive.shared(ptr addrspace(3) %0) |
| 70 | + // CHECK-NEXT: ret void |
| 71 | + // CHECK-NEXT: } |
| 72 | + %0 = nvvm.mbarrier.arrive %barrier : !llvm.ptr<3> -> i64 |
| 73 | + llvm.return |
| 74 | +} |
| 75 | + |
| 76 | +llvm.func @mbarrier_arrive_nocomplete(%barrier: !llvm.ptr) { |
| 77 | + // CHECK-LABEL: define void @mbarrier_arrive_nocomplete(ptr %0) { |
| 78 | + // CHECK-NEXT: %2 = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() |
| 79 | + // CHECK-NEXT: %3 = call i64 @llvm.nvvm.mbarrier.arrive.noComplete(ptr %0, i32 %2) |
| 80 | + // CHECK-NEXT: ret void |
| 81 | + // CHECK-NEXT: } |
| 82 | + %count = nvvm.read.ptx.sreg.ntid.x : i32 |
| 83 | + %0 = nvvm.mbarrier.arrive.nocomplete %barrier, %count : !llvm.ptr, i32 -> i64 |
| 84 | + llvm.return |
| 85 | +} |
| 86 | + |
| 87 | +llvm.func @mbarrier_arrive_nocomplete_shared(%barrier: !llvm.ptr<3>) { |
| 88 | + // CHECK-LABEL: define void @mbarrier_arrive_nocomplete_shared(ptr addrspace(3) %0) { |
| 89 | + // CHECK-NEXT: %2 = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() |
| 90 | + // CHECK-NEXT: %3 = call i64 @llvm.nvvm.mbarrier.arrive.noComplete.shared(ptr addrspace(3) %0, i32 %2) |
| 91 | + // CHECK-NEXT: ret void |
| 92 | + // CHECK-NEXT: } |
| 93 | + %count = nvvm.read.ptx.sreg.ntid.x : i32 |
| 94 | + %0 = nvvm.mbarrier.arrive.nocomplete %barrier, %count : !llvm.ptr<3>, i32 -> i64 |
| 95 | + llvm.return |
| 96 | +} |
| 97 | + |
| 98 | +llvm.func @mbarrier_test_wait(%barrier: !llvm.ptr, %token : i64) -> i1 { |
| 99 | + // CHECK-LABEL: define i1 @mbarrier_test_wait(ptr %0, i64 %1) { |
| 100 | + // CHECK-NEXT: %3 = call i1 @llvm.nvvm.mbarrier.test.wait(ptr %0, i64 %1) |
| 101 | + // CHECK-NEXT: ret i1 %3 |
| 102 | + // CHECK-NEXT: } |
| 103 | + %isComplete = nvvm.mbarrier.test.wait %barrier, %token : !llvm.ptr, i64 -> i1 |
| 104 | + llvm.return %isComplete : i1 |
| 105 | +} |
| 106 | + |
| 107 | +llvm.func @mbarrier_test_wait_shared(%barrier: !llvm.ptr<3>, %token : i64) { |
| 108 | + // CHECK-LABEL: define void @mbarrier_test_wait_shared(ptr addrspace(3) %0, i64 %1) { |
| 109 | + // CHECK-NEXT: %3 = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x() |
| 110 | + // CHECK-NEXT: %4 = call i1 @llvm.nvvm.mbarrier.test.wait.shared(ptr addrspace(3) %0, i64 %1) |
| 111 | + // CHECK-NEXT: ret void |
| 112 | + // CHECK-NEXT: } |
| 113 | + %count = nvvm.read.ptx.sreg.ntid.x : i32 |
| 114 | + %isComplete = nvvm.mbarrier.test.wait %barrier, %token : !llvm.ptr<3>, i64 -> i1 |
| 115 | + llvm.return |
| 116 | +} |
0 commit comments