// RUN: mlir-opt %s -acc-recipe-materialization | FileCheck %s acc.firstprivate.recipe @firstprivatization_memref_i32 : memref init { ^bb0(%arg0: memref): %0 = memref.alloca() : memref acc.yield %0 : memref } copy { ^bb0(%arg0: memref, %arg1: memref): %0 = memref.load %arg0[] : memref memref.store %0, %arg1[] : memref acc.terminator } acc.private.recipe @privatization_memref_i32 : memref init { ^bb0(%arg0: memref): %0 = memref.alloca() : memref acc.yield %0 : memref } // 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:.*]] = memref.alloca() {acc.var_name = #acc.var_name<"t">} : memref // CHECK: %[[FIRSTPRIVLOAD:.*]] = memref.load %{{.*}}[] : memref // CHECK: memref.store %[[FIRSTPRIVLOAD]], %[[ALLOCA]][] : memref // CHECK: %[[ALLOCALOAD:.*]] = memref.load %[[ALLOCA]][] : memref // CHECK: %[[ADDI:.*]] = arith.addi %[[ALLOCALOAD]], %c1{{.*}} : i32 // CHECK: memref.store %[[ADDI]], %[[ALLOCA]][] : memref func.func @firstpriv() { %c1336 = arith.constant 1336 : i32 %alloc = memref.alloca() : memref memref.store %c1336, %alloc[] : memref %fp = acc.firstprivate varPtr(%alloc : memref) recipe(@firstprivatization_memref_i32) -> memref {implicit = true, name = "t"} acc.parallel firstprivate(%fp : memref) { %c1 = arith.constant 1 : i32 %v = memref.load %fp[] : memref %add = arith.addi %v, %c1 : i32 memref.store %add, %fp[] : memref acc.yield } return }