88 lines · plain
1// Test hlfir.region_assign and hlfir.yield operation parse, verify (no errors),2// and unparse.3// RUN: fir-opt %s | fir-opt | FileCheck %s4 5func.func @region_assign_test(%y : !fir.box<!fir.array<?xi64>>, %x: !fir.box<!fir.array<?xf32>>) {6 %c100 = arith.constant 100 : index7 %shape = fir.shape %c100 : (index) -> !fir.shape<1>8 hlfir.region_assign {9 %expr = hlfir.elemental %shape : (!fir.shape<1>) -> !hlfir.expr<?xf32> {10 ^bb0(%i : index):11 %yelt = hlfir.designate %y(%i) : (!fir.box<!fir.array<?xi64>>, index) -> !fir.ref<i64>12 %elt = fir.call @some_elemental(%yelt) : (!fir.ref<i64>) -> f3213 hlfir.yield_element %elt : f3214 }15 hlfir.yield %expr : !hlfir.expr<?xf32>16 } to {17 hlfir.yield %x : !fir.box<!fir.array<?xf32>>18 }19 return20}21// CHECK-LABEL: func.func @region_assign_test(22// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi64>>,23// CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xf32>>) {24// CHECK: %[[VAL_2:.*]] = arith.constant 100 : index25// CHECK: %[[VAL_3:.*]] = fir.shape %[[VAL_2]] : (index) -> !fir.shape<1>26// CHECK: hlfir.region_assign {27// CHECK: %[[VAL_4:.*]] = hlfir.elemental %[[VAL_3]] : (!fir.shape<1>) -> !hlfir.expr<?xf32> {28// CHECK: ^bb0(%[[VAL_5:.*]]: index):29// CHECK: %[[VAL_6:.*]] = hlfir.designate %[[VAL_0]] (%[[VAL_5]]) : (!fir.box<!fir.array<?xi64>>, index) -> !fir.ref<i64>30// CHECK: %[[VAL_7:.*]] = fir.call @some_elemental(%[[VAL_6]]) : (!fir.ref<i64>) -> f3231// CHECK: hlfir.yield_element %[[VAL_7]] : f3232// CHECK: }33// CHECK: hlfir.yield %[[VAL_8:.*]] : !hlfir.expr<?xf32>34// CHECK: } to {35// CHECK: hlfir.yield %[[VAL_1]] : !fir.box<!fir.array<?xf32>>36// CHECK: }37 38func.func @region_user_assign_test(%y : !fir.box<!fir.array<?xi64>>, %x: !fir.box<!fir.array<?xf32>>) {39 hlfir.region_assign {40 hlfir.yield %y : !fir.box<!fir.array<?xi64>>41 } to {42 hlfir.yield %x : !fir.box<!fir.array<?xf32>>43 } user_defined_assign (%rhs : !fir.ref<i64>) to (%lhs : !fir.ref<f32>) {44 %0 = fir.load %rhs : !fir.ref<i64>45 fir.call @user_assign(%lhs, %0) : (!fir.ref<f32>, i64) -> ()46 }47 return48}49// CHECK-LABEL: func.func @region_user_assign_test(50// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi64>>,51// CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xf32>>) {52// CHECK: hlfir.region_assign {53// CHECK: hlfir.yield %[[VAL_0]] : !fir.box<!fir.array<?xi64>>54// CHECK: } to {55// CHECK: hlfir.yield %[[VAL_1]] : !fir.box<!fir.array<?xf32>>56// CHECK: } user_defined_assign (%[[VAL_2:.*]]: !fir.ref<i64>) to (%[[VAL_3:.*]]: !fir.ref<f32>) {57// CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_2]] : !fir.ref<i64>58// CHECK: fir.call @user_assign(%[[VAL_3]], %[[VAL_4]]) : (!fir.ref<f32>, i64) -> ()59// CHECK: }60 61func.func @yield_cleanup(%x: !fir.box<!fir.array<?xf32>>) {62 hlfir.region_assign {63 %0 = fir.allocmem !fir.array<100xf32>64 fir.call @fillin_some_values(%0) : (!fir.heap<!fir.array<100xf32>>) -> ()65 hlfir.yield %0 : !fir.heap<!fir.array<100xf32>> cleanup {66 fir.freemem %0 : !fir.heap<!fir.array<100xf32>>67 }68 } to {69 hlfir.yield %x : !fir.box<!fir.array<?xf32>>70 }71 return72}73// CHECK-LABEL: func.func @yield_cleanup(74// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>) {75// CHECK: hlfir.region_assign {76// CHECK: %[[VAL_1:.*]] = fir.allocmem !fir.array<100xf32>77// CHECK: fir.call @fillin_some_values(%[[VAL_1]]) : (!fir.heap<!fir.array<100xf32>>) -> ()78// CHECK: hlfir.yield %[[VAL_1]] : !fir.heap<!fir.array<100xf32>> cleanup {79// CHECK: fir.freemem %[[VAL_1]] : !fir.heap<!fir.array<100xf32>>80// CHECK: }81// CHECK: } to {82// CHECK: hlfir.yield %[[VAL_0]] : !fir.box<!fir.array<?xf32>>83// CHECK: }84 85func.func private @user_assign(!fir.ref<f32>, i64) -> ()86func.func private @some_elemental(!fir.ref<i64>) -> f3287func.func private @fillin_some_values(!fir.heap<!fir.array<100xf32>>) -> ()88