1// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s 2 3 omp.declare_reduction @add_reduction_i_32 : !llvm.ptr alloc { 4 %1 = llvm.mlir.constant(1 : i64) : i64 5 %2 = llvm.alloca %1 x i32 : (i64) -> !llvm.ptr 6 omp.yield(%2 : !llvm.ptr) 7 } init { 8 ^bb0(%arg0: !llvm.ptr, %alloc: !llvm.ptr): 9 %0 = llvm.mlir.constant(0 : i32) : i32 10 llvm.store %0, %alloc : i32, !llvm.ptr 11 omp.yield(%alloc : !llvm.ptr) 12 } combiner { 13 ^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr): 14 %0 = llvm.load %arg0 : !llvm.ptr -> i32 15 %1 = llvm.load %arg1 : !llvm.ptr -> i32 16 %2 = llvm.add %0, %1 : i32 17 llvm.store %2, %arg0 : i32, !llvm.ptr 18 omp.yield(%arg0 : !llvm.ptr) 19 } 20 21 // CHECK-LABEL: @main 22 llvm.func @main() { 23 %0 = llvm.mlir.constant(-1 : i32) : i32 24 %1 = llvm.mlir.addressof @i : !llvm.ptr 25 omp.parallel reduction(byref @add_reduction_i_32 %1 -> %arg0 : !llvm.ptr) { 26 llvm.store %0, %arg0 : i32, !llvm.ptr 27 omp.terminator 28 } 29 llvm.return 30 } 31 llvm.mlir.global internal @i() {addr_space = 0 : i32} : i32 { 32 %0 = llvm.mlir.constant(0 : i32) : i32 33 llvm.return %0 : i32 34 } 35 36// CHECK: %{{.+}} = 37// Call to the outlined function. 38// CHECK: call void {{.*}} @__kmpc_fork_call 39// CHECK-SAME: @[[OUTLINED:[A-Za-z_.][A-Za-z0-9_.]*]] 40 41// Outlined function. 42// CHECK: define internal void @[[OUTLINED]] 43 44// Private reduction variable and its initialization. 45// CHECK: %tid.addr.local = alloca i32 46// CHECK: %[[PRIVATE:.+]] = alloca i32 47// CHECK: store ptr %[[PRIVATE]], ptr %[[PRIV_PTR:.+]], 48// CHECK: store i32 0, ptr %[[PRIVATE]] 49 50// Call to the reduction function. 51// CHECK: call i32 @__kmpc_reduce 52// CHECK-SAME: @[[REDFUNC:[A-Za-z_.][A-Za-z0-9_.]*]] 53 54 55// Non-atomic reduction: 56// CHECK: %[[PRIV_VAL_PTR:.+]] = load ptr, ptr %[[PRIV_PTR]] 57// CHECK: %[[LOAD:.+]] = load i32, ptr @i 58// CHECK: %[[PRIV_VAL:.+]] = load i32, ptr %[[PRIV_VAL_PTR]] 59// CHECK: %[[SUM:.+]] = add i32 %[[LOAD]], %[[PRIV_VAL]] 60// CHECK: store i32 %[[SUM]], ptr @i 61// CHECK: call void @__kmpc_end_reduce 62// CHECK: br label %[[FINALIZE:.+]] 63 64// CHECK: [[FINALIZE]]: 65 66// Reduction function. 67// CHECK: define internal void @[[REDFUNC]] 68// CHECK: add i32 69