// RUN: fir-opt %s -acc-recipe-materialization | FileCheck %s // RUN: fir-opt %s -acc-recipe-materialization -acc-optimize-firstprivate-map | FileCheck %s --check-prefix=CHECK-MAP module { acc.private.recipe @privatization_ref_i32 : !fir.ref init { ^bb0(%arg0: !fir.ref): %0 = fir.alloca i32 acc.yield %0 : !fir.ref } acc.firstprivate.recipe @firstprivatization_ref_i32 : !fir.ref init { ^bb0(%arg0: !fir.ref): %0 = fir.alloca i32 acc.yield %0 : !fir.ref } copy { ^bb0(%arg0: !fir.ref, %arg1: !fir.ref): %0 = fir.load %arg0 : !fir.ref fir.store %0 to %arg1 : !fir.ref acc.terminator } func.func @firstpriv() { %c1336_i32 = arith.constant 1336 : i32 %0 = fir.dummy_scope : !fir.dscope %1 = fir.alloca i32 {bindc_name = "t", uniq_name = "_QFfirstprivEt"} %2 = fir.declare %1 {uniq_name = "_QFfirstprivEt"} : (!fir.ref) -> !fir.ref fir.store %c1336_i32 to %2 : !fir.ref %3 = acc.firstprivate varPtr(%2 : !fir.ref) recipe(@firstprivatization_ref_i32) -> !fir.ref {implicit = true, name = "t"} acc.parallel firstprivate(%3 : !fir.ref) { %c1_i32 = arith.constant 1 : i32 %4 = fir.load %3 : !fir.ref %5 = arith.addi %4, %c1_i32 : i32 fir.store %5 to %3 : !fir.ref acc.yield } return } } // Verify that the firstprivate was materialized into a copy outside the kernel // and an alloca (as per the recipe) inside the region. // Then ensure that all uses are of the private alloca. // CHECK-LABEL: func.func @firstpriv // CHECK: acc.parallel // CHECK: %[[ALLOCA:.*]] = fir.alloca i32 {{.*}}acc.var_name = #acc.var_name<"t"> // CHECK: %[[FIRSTPRIVLOAD:.*]] = fir.load %{{.*}} : !fir.ref // CHECK: fir.store %[[FIRSTPRIVLOAD]] to %[[ALLOCA]] : !fir.ref // CHECK: %[[ALLOCALOAD:.*]] = fir.load %[[ALLOCA]] : !fir.ref // CHECK: %[[ADDI:.*]] = arith.addi %[[ALLOCALOAD]], %c1{{.*}} : i32 // CHECK: fir.store %[[ADDI]] to %[[ALLOCA]] : !fir.ref // CHECK-MAP-LABEL: func.func @firstpriv // CHECK-MAP: fir.load {{.*}} : !fir.ref // CHECK-MAP: acc.parallel { // CHECK-MAP-NOT: acc.firstprivate_map // CHECK-MAP: fir.alloca i32 {{.*}}acc.var_name = #acc.var_name<"t"> // CHECK-MAP: fir.store {{.*}} to {{.*}} : !fir.ref // CHECK-MAP: arith.addi {{.*}} %c1