// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s llvm.func @free(!llvm.ptr) llvm.func @parallel_op_dealloc(%arg0: !llvm.ptr) { omp.parallel private(@x.privatizer %arg0 -> %arg2 : !llvm.ptr) { %0 = llvm.load %arg2 : !llvm.ptr -> f32 omp.terminator } llvm.return } omp.private {type = firstprivate} @x.privatizer : f32 copy { ^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr): %0 = llvm.load %arg0 : !llvm.ptr -> f32 llvm.store %0, %arg1 : f32, !llvm.ptr omp.yield(%arg1 : !llvm.ptr) } dealloc { ^bb0(%arg0: !llvm.ptr): %0 = llvm.ptrtoint %arg0 : !llvm.ptr to i64 %c0 = llvm.mlir.constant(0 : i64) : i64 %1 = llvm.icmp "ne" %0, %c0 : i64 llvm.cond_br %1, ^bb1, ^bb2 ^bb1: llvm.call @free(%arg0) : (!llvm.ptr) -> () llvm.br ^bb2 ^bb2: omp.yield } // CHECK-LABEL: define internal void @parallel_op_dealloc..omp_par // CHECK: %[[LOCAL_ALLOC:.*]] = alloca float, align 4 // CHECK: omp.par.pre_finalize: // CHECK: br label %[[DEALLOC_REG_START:.*]] // CHECK: [[DEALLOC_REG_START]]: // CHECK: %[[LOCAL_ALLOC_CONV:.*]] = ptrtoint ptr %[[LOCAL_ALLOC]] to i64 // CHECK: %[[COND:.*]] = icmp ne i64 %[[LOCAL_ALLOC_CONV]], 0 // CHECK: br i1 %[[COND]], label %[[DEALLOC_REG_BB1:.*]], label %[[DEALLOC_REG_BB2:.*]] // CHECK: [[DEALLOC_REG_BB2]]: // CHECK: [[DEALLOC_REG_BB1]]: // CHECK-NEXT: call void @free(ptr %[[LOCAL_ALLOC]]) // CHECK-NEXT: br label %[[DEALLOC_REG_BB2]]