114 lines · plain
1// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s2 3omp.private {type = private} @i_privatizer : i324 5// CHECK-LABEL: test_loop_var_privatization()6// Original (non-privatized) allocation for `i`.7// CHECK: %{{.*}} = alloca i32, i64 1, align 48// CHECK: %[[DUMMY:.*]] = alloca float, i64 1, align 49// CHECK: %[[PRIV_I:.*]] = alloca i32, align 410// CHECK: br label %[[LATE_ALLOC:.*]]11 12// CHECK: [[LATE_ALLOC]]:13// CHECK: br label %[[AFTER_ALLOC:.*]]14 15// CHECK: [[AFTER_ALLOC]]:16// CHECK: br label %[[ENTRY:.*]]17 18// CHECK: [[ENTRY]]:19// CHECK: br label %[[OMP_SIMD_REGION:.*]]20 21// CHECK: [[OMP_SIMD_REGION]]:22// CHECK: br label %[[OMP_LOOP_PREHEADER:.*]]23 24// CHECK: [[OMP_LOOP_PREHEADER]]:25// CHECK: br label %[[OMP_LOOP_HEADER:.*]]26 27// CHECK: [[OMP_LOOP_HEADER]]:28// CHECK: %[[OMP_LOOP_IV:.*]] = phi i32 [ 0, %[[OMP_LOOP_PREHEADER]] ], [ %[[OMP_LOOP_NEXT:.*]], %[[OMP_LOOP_INC:.*]] ]29// CHECK: br label %[[OMP_LOOP_COND:.*]]30 31// CHECK: [[OMP_LOOP_COND]]:32// CHECK: %[[OMP_LOOP_CMP:.*]] = icmp ult i32 %[[OMP_LOOP_IV]], 1033// CHECK: br i1 %[[OMP_LOOP_CMP]], label %[[OMP_LOOP_BODY:.*]], label %[[OMP_LOOP_EXIT:.*]]34 35// CHECK: [[OMP_LOOP_BODY]]:36// CHECK: %[[IV_UPDATE:.*]] = mul i32 %[[OMP_LOOP_IV]], 137// CHECK: %[[IV_UPDATE_2:.*]] = add i32 %[[IV_UPDATE]], 138// CHECK: br label %[[OMP_LOOP_NEST_REGION:.*]]39 40// CHECK: [[OMP_LOOP_NEST_REGION]]:41// CHECK: store i32 %[[IV_UPDATE_2]], ptr %[[PRIV_I]], align 442// CHECK: %[[DUMMY_VAL:.*]] = load float, ptr %[[DUMMY]], align 443// CHECK: %[[PRIV_I_VAL:.*]] = load i32, ptr %[[PRIV_I]], align 444// CHECK: %[[PRIV_I_VAL_FLT:.*]] = sitofp i32 %[[PRIV_I_VAL]] to float45// CHECK: %[[DUMMY_VAL_UPDATE:.*]] = fadd {{.*}} float %[[DUMMY_VAL]], %[[PRIV_I_VAL_FLT]]46// CHECK: store float %[[DUMMY_VAL_UPDATE]], ptr %[[DUMMY]], align 4, !llvm.access.group !147// CHECK: br label %[[OMP_REGION_CONT:.*]]48 49// CHECK: [[OMP_REGION_CONT]]:50// CHECK: br label %[[OMP_LOOP_INC:.*]]51 52// CHECK: [[OMP_LOOP_INC]]:53// CHECK: %[[OMP_LOOP_NEXT:.*]] = add nuw i32 %[[OMP_LOOP_IV]], 154// CHECK: br label %[[OMP_LOOP_HEADER]]55 56// CHECK: [[OMP_LOOP_EXIT]]:57 58 59llvm.func @test_loop_var_privatization() attributes {fir.internal_name = "_QPtest_private_clause"} {60 %0 = llvm.mlir.constant(1 : i64) : i6461 %1 = llvm.alloca %0 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr62 %3 = llvm.alloca %0 x f32 {bindc_name = "dummy"} : (i64) -> !llvm.ptr63 %4 = llvm.mlir.constant(10 : i32) : i3264 %5 = llvm.mlir.constant(1 : i32) : i3265 omp.simd private(@i_privatizer %1 -> %arg0 : !llvm.ptr) {66 omp.loop_nest (%arg1) : i32 = (%5) to (%4) inclusive step (%5) {67 llvm.store %arg1, %arg0 : i32, !llvm.ptr68 %8 = llvm.load %3 : !llvm.ptr -> f3269 %9 = llvm.load %arg0 : !llvm.ptr -> i3270 %10 = llvm.sitofp %9 : i32 to f3271 %11 = llvm.fadd %8, %10 {fastmathFlags = #llvm.fastmath<contract>} : f3272 llvm.store %11, %3 : f32, !llvm.ptr73 omp.yield74 }75 }76 llvm.return77}78 79omp.private {type = private} @dummy_privatizer : f3280 81// CHECK-LABEL: test_private_clause()82// Original (non-privatized) allocation for `i`.83// CHECK: %{{.*}} = alloca i32, i64 1, align 484// Original (non-privatized) allocation for `dummy`.85// CHECK: %{{.*}} = alloca float, i64 1, align 486// CHECK: %[[PRIV_DUMMY:.*]] = alloca float, align 487// CHECK: %[[PRIV_I:.*]] = alloca i32, align 488 89// CHECK: omp.loop_nest.region:90// CHECK-NOT: br label91// CHECK: store i32 %{{.*}}, ptr %[[PRIV_I]], align 492// CHECK: %{{.*}} = load float, ptr %[[PRIV_DUMMY]], align 493// CHECK: store float %{{.*}}, ptr %[[PRIV_DUMMY]], align 494 95llvm.func @test_private_clause() attributes {fir.internal_name = "_QPtest_private_clause"} {96 %0 = llvm.mlir.constant(1 : i64) : i6497 %1 = llvm.alloca %0 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr98 %3 = llvm.alloca %0 x f32 {bindc_name = "dummy"} : (i64) -> !llvm.ptr99 %4 = llvm.mlir.constant(10 : i32) : i32100 %5 = llvm.mlir.constant(1 : i32) : i32101 omp.simd private(@dummy_privatizer %3 -> %arg0, @i_privatizer %1 -> %arg1 : !llvm.ptr, !llvm.ptr) {102 omp.loop_nest (%arg2) : i32 = (%5) to (%4) inclusive step (%5) {103 llvm.store %arg2, %arg1 : i32, !llvm.ptr104 %8 = llvm.load %arg0 : !llvm.ptr -> f32105 %9 = llvm.load %arg1 : !llvm.ptr -> i32106 %10 = llvm.sitofp %9 : i32 to f32107 %11 = llvm.fadd %8, %10 {fastmathFlags = #llvm.fastmath<contract>} : f32108 llvm.store %11, %arg0 : f32, !llvm.ptr109 omp.yield110 }111 }112 llvm.return113}114