xref: /llvm-project/mlir/test/Target/LLVMIR/openmp-omp.private-dealloc.mlir (revision 922ab7089b2eb234afa6fa0e7db85110cd8a3351)
1// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s
2
3llvm.func @free(!llvm.ptr)
4
5llvm.func @parallel_op_dealloc(%arg0: !llvm.ptr) {
6  omp.parallel private(@x.privatizer %arg0 -> %arg2 : !llvm.ptr) {
7    %0 = llvm.load %arg2 : !llvm.ptr -> f32
8    omp.terminator
9  }
10  llvm.return
11}
12
13omp.private {type = firstprivate} @x.privatizer : !llvm.ptr alloc {
14^bb0(%arg0: !llvm.ptr):
15  %c1 = llvm.mlir.constant(1 : i32) : i32
16  %0 = llvm.alloca %c1 x f32 : (i32) -> !llvm.ptr
17  omp.yield(%0 : !llvm.ptr)
18} copy {
19^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):
20  %0 = llvm.load %arg0 : !llvm.ptr -> f32
21  llvm.store %0, %arg1 : f32, !llvm.ptr
22  omp.yield(%arg1 : !llvm.ptr)
23} dealloc {
24^bb0(%arg0: !llvm.ptr):
25  %0 = llvm.ptrtoint %arg0 : !llvm.ptr to i64
26  %c0 = llvm.mlir.constant(0 : i64) : i64
27  %1 = llvm.icmp "ne" %0, %c0 : i64
28  llvm.cond_br %1, ^bb1, ^bb2
29
30^bb1:
31  llvm.call @free(%arg0) : (!llvm.ptr) -> ()
32  llvm.br ^bb2
33
34^bb2:
35  omp.yield
36}
37
38// CHECK-LABEL: define internal void @parallel_op_dealloc..omp_par
39// CHECK:         %[[LOCAL_ALLOC:.*]] = alloca float, align 4
40
41// CHECK:      omp.par.pre_finalize:
42// CHECK:        br label %[[DEALLOC_REG_START:.*]]
43
44// CHECK:      [[DEALLOC_REG_START]]:
45// CHECK:        %[[LOCAL_ALLOC_CONV:.*]] = ptrtoint ptr %[[LOCAL_ALLOC]] to i64
46// CHECK:        %[[COND:.*]] = icmp ne i64 %[[LOCAL_ALLOC_CONV]], 0
47// CHECK:        br i1 %[[COND]], label %[[DEALLOC_REG_BB1:.*]], label %[[DEALLOC_REG_BB2:.*]]
48
49// CHECK:      [[DEALLOC_REG_BB2]]:
50
51// CHECK:      [[DEALLOC_REG_BB1]]:
52// CHECK-NEXT:   call void @free(ptr %[[LOCAL_ALLOC]])
53// CHECK-NEXT:   br label %[[DEALLOC_REG_BB2]]
54