blob: 61542aa1aa4d7772295832d8cc9b4ad613d4f511 [file] [log] [blame]
// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s
omp.private {type = private} @i_privatizer : !llvm.ptr alloc {
^bb0(%arg0: !llvm.ptr):
%0 = llvm.mlir.constant(1 : i64) : i64
%1 = llvm.alloca %0 x i32 {bindc_name = "i", pinned} : (i64) -> !llvm.ptr
omp.yield(%1 : !llvm.ptr)
}
// CHECK-LABEL: test_loop_var_privatization()
// Original (non-privatized) allocation for `i`.
// CHECK: %{{.*}} = alloca i32, i64 1, align 4
// CHECK: %[[DUMMY:.*]] = alloca float, i64 1, align 4
// CHECK: %[[PRIV_I:.*]] = alloca i32, i64 1, align 4
// CHECK: br label %[[LATE_ALLOC:.*]]
// CHECK: [[LATE_ALLOC]]:
// CHECK: br label %[[AFTER_ALLOC:.*]]
// CHECK: [[AFTER_ALLOC]]:
// CHECK: br label %[[ENTRY:.*]]
// CHECK: [[ENTRY]]:
// CHECK: br label %[[OMP_LOOP_PREHEADER:.*]]
// CHECK: [[OMP_LOOP_PREHEADER]]:
// CHECK: br label %[[OMP_LOOP_HEADER:.*]]
// CHECK: [[OMP_LOOP_HEADER]]:
// CHECK: %[[OMP_LOOP_IV:.*]] = phi i32 [ 0, %[[OMP_LOOP_PREHEADER]] ], [ %[[OMP_LOOP_NEXT:.*]], %[[OMP_LOOP_INC:.*]] ]
// CHECK: br label %[[OMP_LOOP_COND:.*]]
// CHECK: [[OMP_LOOP_COND]]:
// CHECK: %[[OMP_LOOP_CMP:.*]] = icmp ult i32 %[[OMP_LOOP_IV]], 10
// CHECK: br i1 %[[OMP_LOOP_CMP]], label %[[OMP_LOOP_BODY:.*]], label %[[OMP_LOOP_EXIT:.*]]
// CHECK: [[OMP_LOOP_BODY]]:
// CHECK: %[[IV_UPDATE:.*]] = mul i32 %[[OMP_LOOP_IV]], 1
// CHECK: %[[IV_UPDATE_2:.*]] = add i32 %[[IV_UPDATE]], 1
// CHECK: br label %[[OMP_SIMD_REGION:.*]]
// CHECK: [[OMP_SIMD_REGION]]:
// CHECK: store i32 %[[IV_UPDATE_2]], ptr %[[PRIV_I]], align 4
// CHECK: %[[DUMMY_VAL:.*]] = load float, ptr %[[DUMMY]], align 4
// CHECK: %[[PRIV_I_VAL:.*]] = load i32, ptr %[[PRIV_I]], align 4
// CHECK: %[[PRIV_I_VAL_FLT:.*]] = sitofp i32 %[[PRIV_I_VAL]] to float
// CHECK: %[[DUMMY_VAL_UPDATE:.*]] = fadd {{.*}} float %[[DUMMY_VAL]], %[[PRIV_I_VAL_FLT]]
// CHECK: store float %[[DUMMY_VAL_UPDATE]], ptr %[[DUMMY]], align 4, !llvm.access.group !1
// CHECK: br label %[[OMP_REGION_CONT:.*]]
// CHECK: [[OMP_REGION_CONT]]:
// CHECK: br label %[[OMP_LOOP_INC:.*]]
// CHECK: [[OMP_LOOP_INC]]:
// CHECK: %[[OMP_LOOP_NEXT:.*]] = add nuw i32 %[[OMP_LOOP_IV]], 1
// CHECK: br label %[[OMP_LOOP_HEADER]]
// CHECK: [[OMP_LOOP_EXIT]]:
llvm.func @test_loop_var_privatization() attributes {fir.internal_name = "_QPtest_private_clause"} {
%0 = llvm.mlir.constant(1 : i64) : i64
%1 = llvm.alloca %0 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr
%3 = llvm.alloca %0 x f32 {bindc_name = "dummy"} : (i64) -> !llvm.ptr
%4 = llvm.mlir.constant(10 : i32) : i32
%5 = llvm.mlir.constant(1 : i32) : i32
omp.simd private(@i_privatizer %1 -> %arg0 : !llvm.ptr) {
omp.loop_nest (%arg1) : i32 = (%5) to (%4) inclusive step (%5) {
llvm.store %arg1, %arg0 : i32, !llvm.ptr
%8 = llvm.load %3 : !llvm.ptr -> f32
%9 = llvm.load %arg0 : !llvm.ptr -> i32
%10 = llvm.sitofp %9 : i32 to f32
%11 = llvm.fadd %8, %10 {fastmathFlags = #llvm.fastmath<contract>} : f32
llvm.store %11, %3 : f32, !llvm.ptr
omp.yield
}
}
llvm.return
}
omp.private {type = private} @dummy_privatizer : !llvm.ptr alloc {
^bb0(%arg0: !llvm.ptr):
%0 = llvm.mlir.constant(1 : i64) : i64
%1 = llvm.alloca %0 x f32 {bindc_name = "dummy", pinned} : (i64) -> !llvm.ptr
omp.yield(%1 : !llvm.ptr)
}
// CHECK-LABEL: test_private_clause()
// Original (non-privatized) allocation for `i`.
// CHECK: %{{.*}} = alloca i32, i64 1, align 4
// Original (non-privatized) allocation for `dummy`.
// CHECK: %{{.*}} = alloca float, i64 1, align 4
// CHECK: %[[PRIV_DUMMY:.*]] = alloca float, i64 1, align 4
// CHECK: %[[PRIV_I:.*]] = alloca i32, i64 1, align 4
// CHECK: omp.simd.region:
// CHECK-NOT: br label
// CHECK: store i32 %{{.*}}, ptr %[[PRIV_I]], align 4
// CHECK: %{{.*}} = load float, ptr %[[PRIV_DUMMY]], align 4
// CHECK: store float %{{.*}}, ptr %[[PRIV_DUMMY]], align 4
llvm.func @test_private_clause() attributes {fir.internal_name = "_QPtest_private_clause"} {
%0 = llvm.mlir.constant(1 : i64) : i64
%1 = llvm.alloca %0 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr
%3 = llvm.alloca %0 x f32 {bindc_name = "dummy"} : (i64) -> !llvm.ptr
%4 = llvm.mlir.constant(10 : i32) : i32
%5 = llvm.mlir.constant(1 : i32) : i32
omp.simd private(@dummy_privatizer %3 -> %arg0, @i_privatizer %1 -> %arg1 : !llvm.ptr, !llvm.ptr) {
omp.loop_nest (%arg2) : i32 = (%5) to (%4) inclusive step (%5) {
llvm.store %arg2, %arg1 : i32, !llvm.ptr
%8 = llvm.load %arg0 : !llvm.ptr -> f32
%9 = llvm.load %arg1 : !llvm.ptr -> i32
%10 = llvm.sitofp %9 : i32 to f32
%11 = llvm.fadd %8, %10 {fastmathFlags = #llvm.fastmath<contract>} : f32
llvm.store %11, %arg0 : f32, !llvm.ptr
omp.yield
}
}
llvm.return
}