brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.6 KiB · 0c3f3fe Raw
167 lines · plain
1// RUN: fir-opt %s --split-input-file --pass-pipeline="builtin.module(test-acc-recipe-populate{recipe-type=firstprivate})" | FileCheck %s2 3// The tests here use a synthetic hlfir.declare in order to ensure that the hlfir dialect is4// loaded. This is required because the pass used is part of OpenACC test passes outside of5// flang and the APIs being test may generate hlfir even when it does not appear.6 7// Test scalar type (f32)8// CHECK: acc.firstprivate.recipe @firstprivate_scalar : !fir.ref<f32> init {9// CHECK: ^bb0(%{{.*}}: !fir.ref<f32>):10// CHECK:   %[[ALLOC:.*]] = fir.alloca f3211// CHECK:   %{{.*}}:2 = hlfir.declare %[[ALLOC]] {uniq_name = "scalar"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)12// CHECK:   acc.yield %{{.*}}#0 : !fir.ref<f32>13// CHECK: } copy {14// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<f32>, %[[DST:.*]]: !fir.ref<f32>):15// CHECK:   %[[LOAD:.*]] = fir.load %[[SRC]] : !fir.ref<f32>16// CHECK:   fir.store %[[LOAD]] to %[[DST]] : !fir.ref<f32>17// CHECK:   acc.terminator18// CHECK: }19// CHECK-NOT: destroy20 21func.func @test_scalar() {22  %0 = fir.alloca f32 {test.var = "scalar"}23  %var = fir.alloca f3224  %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)25  return26}27 28// -----29 30// Test integer scalar31// CHECK: acc.firstprivate.recipe @firstprivate_int : !fir.ref<i32> init {32// CHECK: ^bb0(%{{.*}}: !fir.ref<i32>):33// CHECK:   %[[ALLOC:.*]] = fir.alloca i3234// CHECK:   %{{.*}}:2 = hlfir.declare %[[ALLOC]] {uniq_name = "int"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)35// CHECK:   acc.yield %{{.*}}#0 : !fir.ref<i32>36// CHECK: } copy {37// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<i32>, %[[DST:.*]]: !fir.ref<i32>):38// CHECK:   %[[LOAD:.*]] = fir.load %[[SRC]] : !fir.ref<i32>39// CHECK:   fir.store %[[LOAD]] to %[[DST]] : !fir.ref<i32>40// CHECK:   acc.terminator41// CHECK: }42// CHECK-NOT: destroy43 44func.func @test_int() {45  %0 = fir.alloca i32 {test.var = "int"}46  %var = fir.alloca f3247  %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)48  return49}50 51// -----52 53// Test logical type54// CHECK: acc.firstprivate.recipe @firstprivate_logical : !fir.ref<!fir.logical<4>> init {55// CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.logical<4>>):56// CHECK:   %[[ALLOC:.*]] = fir.alloca !fir.logical<4>57// CHECK:   %{{.*}}:2 = hlfir.declare %[[ALLOC]] {uniq_name = "logical"} : (!fir.ref<!fir.logical<4>>) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)58// CHECK:   acc.yield %{{.*}}#0 : !fir.ref<!fir.logical<4>>59// CHECK: } copy {60// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<!fir.logical<4>>, %[[DST:.*]]: !fir.ref<!fir.logical<4>>):61// CHECK:   %[[LOAD:.*]] = fir.load %[[SRC]] : !fir.ref<!fir.logical<4>>62// CHECK:   fir.store %[[LOAD]] to %[[DST]] : !fir.ref<!fir.logical<4>>63// CHECK:   acc.terminator64// CHECK: }65// CHECK-NOT: destroy66 67func.func @test_logical() {68  %0 = fir.alloca !fir.logical<4> {test.var = "logical"}69  %var = fir.alloca f3270  %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)71  return72}73 74// -----75 76// Test complex type77// CHECK: acc.firstprivate.recipe @firstprivate_complex : !fir.ref<complex<f32>> init {78// CHECK: ^bb0(%{{.*}}: !fir.ref<complex<f32>>):79// CHECK:   %[[ALLOC:.*]] = fir.alloca complex<f32>80// CHECK:   %{{.*}}:2 = hlfir.declare %[[ALLOC]] {uniq_name = "complex"} : (!fir.ref<complex<f32>>) -> (!fir.ref<complex<f32>>, !fir.ref<complex<f32>>)81// CHECK:   acc.yield %{{.*}}#0 : !fir.ref<complex<f32>>82// CHECK: } copy {83// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<complex<f32>>, %[[DST:.*]]: !fir.ref<complex<f32>>):84// CHECK:   %[[LOAD:.*]] = fir.load %[[SRC]] : !fir.ref<complex<f32>>85// CHECK:   fir.store %[[LOAD]] to %[[DST]] : !fir.ref<complex<f32>>86// CHECK:   acc.terminator87// CHECK: }88// CHECK-NOT: destroy89 90func.func @test_complex() {91  %0 = fir.alloca complex<f32> {test.var = "complex"}92  %var = fir.alloca f3293  %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)94  return95}96 97// -----98 99// Test 1D static array100// CHECK: acc.firstprivate.recipe @firstprivate_array_1d : !fir.ref<!fir.array<100xf32>> init {101// CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<100xf32>>):102// CHECK:   %[[C100:.*]] = arith.constant 100 : index103// CHECK:   %[[SHAPE:.*]] = fir.shape %[[C100]] : (index) -> !fir.shape<1>104// CHECK:   %[[ALLOC:.*]] = fir.alloca !fir.array<100xf32>105// CHECK:   %{{.*}}:2 = hlfir.declare %[[ALLOC]](%[[SHAPE]]) {uniq_name = "array_1d"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>)106// CHECK:   acc.yield %{{.*}}#0 : !fir.ref<!fir.array<100xf32>>107// CHECK: } copy {108// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<!fir.array<100xf32>>, %[[DST:.*]]: !fir.ref<!fir.array<100xf32>>):109// CHECK:   hlfir.assign %[[SRC]] to %[[DST]] : !fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>110// CHECK:   acc.terminator111// CHECK: }112// CHECK-NOT: destroy113 114func.func @test_array_1d() {115  %0 = fir.alloca !fir.array<100xf32> {test.var = "array_1d"}116  %var = fir.alloca f32117  %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)118  return119}120 121// -----122 123// Test 2D static array124// CHECK: acc.firstprivate.recipe @firstprivate_array_2d : !fir.ref<!fir.array<10x20xi32>> init {125// CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x20xi32>>):126// CHECK:   %[[C10:.*]] = arith.constant 10 : index127// CHECK:   %[[C20:.*]] = arith.constant 20 : index128// CHECK:   %[[SHAPE:.*]] = fir.shape %[[C10]], %[[C20]] : (index, index) -> !fir.shape<2>129// CHECK:   %[[ALLOC:.*]] = fir.alloca !fir.array<10x20xi32>130// CHECK:   %{{.*}}:2 = hlfir.declare %[[ALLOC]](%[[SHAPE]]) {uniq_name = "array_2d"} : (!fir.ref<!fir.array<10x20xi32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x20xi32>>, !fir.ref<!fir.array<10x20xi32>>)131// CHECK:   acc.yield %{{.*}}#0 : !fir.ref<!fir.array<10x20xi32>>132// CHECK: } copy {133// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<!fir.array<10x20xi32>>, %[[DST:.*]]: !fir.ref<!fir.array<10x20xi32>>):134// CHECK:   hlfir.assign %[[SRC]] to %[[DST]] : !fir.ref<!fir.array<10x20xi32>>, !fir.ref<!fir.array<10x20xi32>>135// CHECK:   acc.terminator136// CHECK: }137// CHECK-NOT: destroy138 139func.func @test_array_2d() {140  %0 = fir.alloca !fir.array<10x20xi32> {test.var = "array_2d"}141  %var = fir.alloca f32142  %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)143  return144}145 146// -----147 148// Test derived type with multiple fields149// CHECK: acc.firstprivate.recipe @firstprivate_derived : !fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>> init {150// CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>):151// CHECK:   %[[ALLOC:.*]] = fir.alloca !fir.type<_QTpoint{x:f32,y:f32,z:f32}>152// CHECK:   %{{.*}}:2 = hlfir.declare %[[ALLOC]] {uniq_name = "derived"} : (!fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>) -> (!fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>, !fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>)153// CHECK:   acc.yield %{{.*}}#0 : !fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>154// CHECK: } copy {155// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>, %[[DST:.*]]: !fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>):156// CHECK:   hlfir.assign %[[SRC]] to %[[DST]] : !fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>, !fir.ref<!fir.type<_QTpoint{x:f32,y:f32,z:f32}>>157// CHECK:   acc.terminator158// CHECK: }159// CHECK-NOT: destroy160 161func.func @test_derived() {162  %0 = fir.alloca !fir.type<_QTpoint{x:f32,y:f32,z:f32}> {test.var = "derived"}163  %var = fir.alloca f32164  %1:2 = hlfir.declare %var {uniq_name = "load_hlfir"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)165  return166}167