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