// RUN: fir-opt %s --split-input-file --pass-pipeline="builtin.module(test-acc-recipe-populate{recipe-type=private})" | FileCheck %s // The tests here use a synthetic hlfir.declare in order to ensure that the hlfir dialect is // loaded. This is required because the pass used is part of OpenACC test passes outside of // flang and the APIs being test may generate hlfir even when it does not appear. // Test scalar type (f32) // CHECK: acc.private.recipe @private_scalar : !fir.ref init { // CHECK: ^bb0(%{{.*}}: !fir.ref): // CHECK: %[[ALLOC:.*]] = fir.alloca f32 // CHECK: acc.yield %[[ALLOC]] : !fir.ref // CHECK: } // CHECK-NOT: destroy func.func @test_scalar() { %0 = fir.alloca f32 {test.var = "scalar"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test logical type // CHECK: acc.private.recipe @private_logical : !fir.ref> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>): // CHECK: %[[ALLOC:.*]] = fir.alloca !fir.logical<4> // CHECK: acc.yield %[[ALLOC]] : !fir.ref> // CHECK: } // CHECK-NOT: destroy func.func @test_logical() { %0 = fir.alloca !fir.logical<4> {test.var = "logical"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test complex type // CHECK: acc.private.recipe @private_complex : !fir.ref> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>): // CHECK: %[[ALLOC:.*]] = fir.alloca complex // CHECK: acc.yield %[[ALLOC]] : !fir.ref> // CHECK: } // CHECK-NOT: destroy func.func @test_complex() { %0 = fir.alloca complex {test.var = "complex"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test 1D static array // CHECK: acc.private.recipe @private_array_1d : !fir.ref> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>): // CHECK: %[[ALLOC:.*]] = fir.alloca !fir.array<100xf32> // CHECK: acc.yield %[[ALLOC]] : !fir.ref> // CHECK: } // CHECK-NOT: destroy func.func @test_array_1d() { %0 = fir.alloca !fir.array<100xf32> {test.var = "array_1d"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test 3D static array // CHECK: acc.private.recipe @private_array_3d : !fir.ref> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>): // CHECK: %[[ALLOC:.*]] = fir.alloca !fir.array<5x10x15xi32> // CHECK: acc.yield %[[ALLOC]] : !fir.ref> // CHECK: } // CHECK-NOT: destroy func.func @test_array_3d() { %0 = fir.alloca !fir.array<5x10x15xi32> {test.var = "array_3d"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test derived type with multiple fields // CHECK: acc.private.recipe @private_derived : !fir.ref> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>): // CHECK: %[[ALLOC:.*]] = fir.alloca !fir.type<_QTpoint{x:f32,y:f32,z:f32}> // CHECK: acc.yield %[[ALLOC]] : !fir.ref> // CHECK: } // CHECK-NOT: destroy func.func @test_derived() { %0 = fir.alloca !fir.type<_QTpoint{x:f32,y:f32,z:f32}> {test.var = "derived"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test box type with heap scalar (needs destroy) // CHECK: acc.private.recipe @private_box_heap_scalar : !fir.ref>> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>>): // CHECK: %[[SCALAR:.*]] = fir.allocmem f64 // CHECK: %[[EMBOX:.*]] = fir.embox %[[SCALAR]] : (!fir.heap) -> !fir.box> // CHECK: %[[BOXALLOC:.*]] = fir.alloca !fir.box> // CHECK: fir.store %[[EMBOX]] to %[[BOXALLOC]] : !fir.ref>> // CHECK: acc.yield %[[BOXALLOC]] : !fir.ref>> // CHECK: } destroy { // CHECK: ^bb0(%{{.*}}: !fir.ref>>, %{{.*}}: !fir.ref>>): // CHECK: acc.terminator // CHECK: } func.func @test_box_heap_scalar() { %0 = fir.alloca !fir.box> {test.var = "box_heap_scalar"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test box type with pointer scalar (needs destroy) // CHECK: acc.private.recipe @private_box_ptr_scalar : !fir.ref>> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>>): // CHECK: %[[SCALAR:.*]] = fir.allocmem i32 // CHECK: %[[EMBOX:.*]] = fir.embox %[[SCALAR]] : (!fir.heap) -> !fir.box> // CHECK: %[[BOXALLOC:.*]] = fir.alloca !fir.box> // CHECK: fir.store %[[EMBOX]] to %[[BOXALLOC]] : !fir.ref>> // CHECK: acc.yield %[[BOXALLOC]] : !fir.ref>> // CHECK: } destroy { // CHECK: ^bb0(%{{.*}}: !fir.ref>>, %{{.*}}: !fir.ref>>): // CHECK: acc.terminator // CHECK: } func.func @test_box_ptr_scalar() { %0 = fir.alloca !fir.box> {test.var = "box_ptr_scalar"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test box type with 1D heap array (needs destroy) // CHECK: acc.private.recipe @private_box_heap_array_1d : !fir.ref>>> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>>>): // CHECK: %[[BOXALLOC:.*]] = fir.alloca !fir.box>> // CHECK: acc.yield %[[BOXALLOC]] : !fir.ref>>> // CHECK: } destroy { // CHECK: ^bb0(%{{.*}}: !fir.ref>>>, %{{.*}}: !fir.ref>>>): // CHECK: acc.terminator // CHECK: } func.func @test_box_heap_array_1d() { %0 = fir.alloca !fir.box>> {test.var = "box_heap_array_1d"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test box type with 2D heap array (needs destroy) // CHECK: acc.private.recipe @private_box_heap_array_2d : !fir.ref>>> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>>>): // CHECK: %[[BOXALLOC:.*]] = fir.alloca !fir.box>> // CHECK: acc.yield %[[BOXALLOC]] : !fir.ref>>> // CHECK: } destroy { // CHECK: ^bb0(%{{.*}}: !fir.ref>>>, %{{.*}}: !fir.ref>>>): // CHECK: acc.terminator // CHECK: } func.func @test_box_heap_array_2d() { %0 = fir.alloca !fir.box>> {test.var = "box_heap_array_2d"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return } // ----- // Test box type with pointer array (needs destroy) // CHECK: acc.private.recipe @private_box_ptr_array : !fir.ref>>> init { // CHECK: ^bb0(%{{.*}}: !fir.ref>>>): // CHECK: %[[BOXALLOC:.*]] = fir.alloca !fir.box>> // CHECK: acc.yield %[[BOXALLOC]] : !fir.ref>>> // CHECK: } destroy { // CHECK: ^bb0(%{{.*}}: !fir.ref>>>, %{{.*}}: !fir.ref>>>): // CHECK: acc.terminator // CHECK: } func.func @test_box_ptr_array() { %0 = fir.alloca !fir.box>> {test.var = "box_ptr_array"} %var = fir.alloca f32 %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref) -> (!fir.ref, !fir.ref) return }