223 lines · plain
1// Test code generation of hlfir.region_assign representing procedure pointer2// assignments inside FORALL.3 4// RUN: fir-opt %s --lower-hlfir-ordered-assignments | FileCheck %s5 6!t=!fir.type<t{p:!fir.boxproc<() -> i32>}>7func.func @test_no_conflict(%arg0: !fir.ref<!fir.array<10x!t>> {fir.bindc_name = "x"}) {8 %c10_i64 = arith.constant 10 : i649 %c1_i64 = arith.constant 1 : i6410 %c10 = arith.constant 10 : index11 %0 = fir.dummy_scope : !fir.dscope12 %1 = fir.shape %c10 : (index) -> !fir.shape<1>13 %2:2 = hlfir.declare %arg0(%1) dummy_scope %0 {uniq_name = "x"} : (!fir.ref<!fir.array<10x!t>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<10x!t>>, !fir.ref<!fir.array<10x!t>>)14 hlfir.forall lb {15 hlfir.yield %c1_i64 : i6416 } ub {17 hlfir.yield %c10_i64 : i6418 } (%arg1: i64) {19 hlfir.region_assign {20 %3 = fir.address_of(@f1) : () -> i3221 %4 = fir.emboxproc %3 : (() -> i32) -> !fir.boxproc<() -> ()>22 hlfir.yield %4 : !fir.boxproc<() -> ()>23 } to {24 %3 = hlfir.designate %2#0 (%arg1) : (!fir.ref<!fir.array<10x!t>>, i64) -> !fir.ref<!t>25 %4 = hlfir.designate %3{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!t>) -> !fir.ref<!fir.boxproc<() -> i32>>26 hlfir.yield %4 : !fir.ref<!fir.boxproc<() -> i32>>27 }28 }29 return30}31// CHECK-LABEL: func.func @test_no_conflict(32// CHECK: %[[VAL_1:.*]] = arith.constant 10 : i6433// CHECK: %[[VAL_2:.*]] = arith.constant 1 : i6434// CHECK: %[[VAL_3:.*]] = arith.constant 10 : index35// CHECK: %[[VAL_4:.*]] = fir.dummy_scope : !fir.dscope36// CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>37// CHECK: %[[VAL_6:.*]]:2 = hlfir.declare{{.*}}"x"38// CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_2]] : (i64) -> index39// CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_1]] : (i64) -> index40// CHECK: %[[VAL_9:.*]] = arith.constant 1 : index41// CHECK: fir.do_loop %[[VAL_10:.*]] = %[[VAL_7]] to %[[VAL_8]] step %[[VAL_9]] {42// CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (index) -> i6443// CHECK: %[[VAL_12:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10x!fir.type<t{p:!fir.boxproc<() -> i32>}>>>, i64) -> !fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>44// CHECK: %[[VAL_13:.*]] = hlfir.designate %[[VAL_12]]{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>) -> !fir.ref<!fir.boxproc<() -> i32>>45// CHECK: %[[VAL_14:.*]] = fir.address_of(@f1) : () -> i3246// CHECK: %[[VAL_15:.*]] = fir.emboxproc %[[VAL_14]] : (() -> i32) -> !fir.boxproc<() -> ()>47// CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (!fir.boxproc<() -> ()>) -> !fir.boxproc<() -> i32>48// CHECK: fir.store %[[VAL_16]] to %[[VAL_13]] : !fir.ref<!fir.boxproc<() -> i32>>49// CHECK: }50// CHECK: return51// CHECK: }52 53func.func @test_need_to_save_rhs(%arg0: !fir.ref<!fir.array<10x!t>> {fir.bindc_name = "x"}) {54 %c10_i64 = arith.constant 10 : i6455 %c1_i64 = arith.constant 1 : i6456 %c10 = arith.constant 10 : index57 %0 = fir.dummy_scope : !fir.dscope58 %1 = fir.shape %c10 : (index) -> !fir.shape<1>59 %2:2 = hlfir.declare %arg0(%1) dummy_scope %0 {uniq_name = "x"} : (!fir.ref<!fir.array<10x!t>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<10x!t>>, !fir.ref<!fir.array<10x!t>>)60 hlfir.forall lb {61 hlfir.yield %c1_i64 : i6462 } ub {63 hlfir.yield %c10_i64 : i6464 } (%arg1: i64) {65 hlfir.region_assign {66 %3 = hlfir.designate %2#0 (%c10) : (!fir.ref<!fir.array<10x!t>>, index) -> !fir.ref<!t>67 %4 = hlfir.designate %3{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!t>) -> !fir.ref<!fir.boxproc<() -> i32>>68 %5 = fir.load %4 : !fir.ref<!fir.boxproc<() -> i32>>69 hlfir.yield %5 : !fir.boxproc<() -> i32>70 } to {71 %3 = hlfir.designate %2#0 (%arg1) : (!fir.ref<!fir.array<10x!t>>, i64) -> !fir.ref<!t>72 %4 = hlfir.designate %3{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!t>) -> !fir.ref<!fir.boxproc<() -> i32>>73 hlfir.yield %4 : !fir.ref<!fir.boxproc<() -> i32>>74 }75 }76 return77}78// CHECK-LABEL: func.func @test_need_to_save_rhs(79// CHECK: %[[VAL_1:.*]] = fir.alloca i6480// CHECK: %[[VAL_2:.*]] = fir.alloca !fir.box<!fir.heap<i64>>81// CHECK: %[[VAL_3:.*]] = fir.alloca i6482// CHECK: %[[VAL_4:.*]] = arith.constant 10 : i6483// CHECK: %[[VAL_5:.*]] = arith.constant 1 : i6484// CHECK: %[[VAL_6:.*]] = arith.constant 10 : index85// CHECK: %[[VAL_7:.*]] = fir.dummy_scope : !fir.dscope86// CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1>87// CHECK: %[[VAL_9:.*]]:2 = hlfir.declare{{.*}}x88// CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_5]] : (i64) -> index89// CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_4]] : (i64) -> index90// CHECK: %[[VAL_12:.*]] = arith.constant 1 : index91// CHECK: %[[VAL_13:.*]] = arith.constant 0 : i6492// CHECK: %[[VAL_14:.*]] = arith.constant 1 : i6493// CHECK: fir.store %[[VAL_13]] to %[[VAL_3]] : !fir.ref<i64>94// CHECK: %[[VAL_19:.*]] = fir.call @_FortranACreateValueStack(95// CHECK: fir.do_loop %[[VAL_20:.*]] = %[[VAL_10]] to %[[VAL_11]] step %[[VAL_12]] {96// CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (index) -> i6497// CHECK: %[[VAL_22:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_6]]) : (!fir.ref<!fir.array<10x!fir.type<t{p:!fir.boxproc<() -> i32>}>>>, index) -> !fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>98// CHECK: %[[VAL_23:.*]] = hlfir.designate %[[VAL_22]]{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>) -> !fir.ref<!fir.boxproc<() -> i32>>99// CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_23]] : !fir.ref<!fir.boxproc<() -> i32>>100// CHECK: %[[VAL_25:.*]] = fir.box_addr %[[VAL_24]] : (!fir.boxproc<() -> i32>) -> (() -> i32)101// CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (() -> i32) -> i64102// CHECK: fir.store %[[VAL_26]] to %[[VAL_1]] : !fir.ref<i64>103// CHECK: %[[VAL_27:.*]] = fir.embox %[[VAL_1]] : (!fir.ref<i64>) -> !fir.box<i64>104// CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (!fir.box<i64>) -> !fir.box<none>105// CHECK: fir.call @_FortranAPushValue(%[[VAL_19]], %[[VAL_28]]) : (!fir.llvm_ptr<i8>, !fir.box<none>) -> ()106// CHECK: }107// CHECK: %[[VAL_29:.*]] = fir.convert %[[VAL_5]] : (i64) -> index108// CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_4]] : (i64) -> index109// CHECK: %[[VAL_31:.*]] = arith.constant 1 : index110// CHECK: fir.store %[[VAL_13]] to %[[VAL_3]] : !fir.ref<i64>111// CHECK: fir.do_loop %[[VAL_32:.*]] = %[[VAL_29]] to %[[VAL_30]] step %[[VAL_31]] {112// CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (index) -> i64113// CHECK: %[[VAL_34:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_33]]) : (!fir.ref<!fir.array<10x!fir.type<t{p:!fir.boxproc<() -> i32>}>>>, i64) -> !fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>114// CHECK: %[[VAL_35:.*]] = hlfir.designate %[[VAL_34]]{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>) -> !fir.ref<!fir.boxproc<() -> i32>>115// CHECK: %[[VAL_36:.*]] = fir.load %[[VAL_3]] : !fir.ref<i64>116// CHECK: %[[VAL_37:.*]] = arith.addi %[[VAL_36]], %[[VAL_14]] : i64117// CHECK: fir.store %[[VAL_37]] to %[[VAL_3]] : !fir.ref<i64>118// CHECK: %[[VAL_38:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.box<!fir.heap<i64>>>) -> !fir.ref<!fir.box<none>>119// CHECK: fir.call @_FortranAValueAt(%[[VAL_19]], %[[VAL_36]], %[[VAL_38]]) : (!fir.llvm_ptr<i8>, i64, !fir.ref<!fir.box<none>>) -> ()120// CHECK: %[[VAL_39:.*]] = fir.load %[[VAL_2]] : !fir.ref<!fir.box<!fir.heap<i64>>>121// CHECK: %[[VAL_40:.*]] = fir.box_addr %[[VAL_39]] : (!fir.box<!fir.heap<i64>>) -> !fir.heap<i64>122// CHECK: %[[VAL_41:.*]] = fir.load %[[VAL_40]] : !fir.heap<i64>123// CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_41]] : (i64) -> (() -> i32)124// CHECK: %[[VAL_43:.*]] = fir.emboxproc %[[VAL_42]] : (() -> i32) -> !fir.boxproc<() -> i32>125// CHECK: fir.store %[[VAL_43]] to %[[VAL_35]] : !fir.ref<!fir.boxproc<() -> i32>>126// CHECK: }127// CHECK: fir.call @_FortranADestroyValueStack(%[[VAL_19]]) : (!fir.llvm_ptr<i8>) -> ()128// CHECK: return129// CHECK: }130 131func.func @test_need_to_save_lhs(%arg0: !fir.ref<!fir.array<10x!t>>) {132 %c11_i64 = arith.constant 11 : i64133 %c10_i64 = arith.constant 10 : i64134 %c1_i64 = arith.constant 1 : i64135 %c10 = arith.constant 10 : index136 %0 = fir.dummy_scope : !fir.dscope137 %1 = fir.shape %c10 : (index) -> !fir.shape<1>138 %2:2 = hlfir.declare %arg0(%1) dummy_scope %0 {uniq_name = "x"} : (!fir.ref<!fir.array<10x!t>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<10x!t>>, !fir.ref<!fir.array<10x!t>>)139 hlfir.forall lb {140 hlfir.yield %c1_i64 : i64141 } ub {142 hlfir.yield %c10_i64 : i64143 } (%arg1: i64) {144 hlfir.region_assign {145 %3 = fir.address_of(@f1) : () -> i32146 %4 = fir.emboxproc %3 : (() -> i32) -> !fir.boxproc<() -> ()>147 hlfir.yield %4 : !fir.boxproc<() -> ()>148 } to {149 %3 = arith.subi %c11_i64, %arg1 : i64150 %4 = hlfir.designate %2#0 (%3) : (!fir.ref<!fir.array<10x!t>>, i64) -> !fir.ref<!t>151 %5 = hlfir.designate %4{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!t>) -> !fir.ref<!fir.boxproc<() -> i32>>152 %6 = fir.load %5 : !fir.ref<!fir.boxproc<() -> i32>>153 %7 = fir.box_addr %6 : (!fir.boxproc<() -> i32>) -> (() -> i32)154 %8 = fir.call %7() proc_attrs<pure> : () -> i32155 %9 = fir.convert %8 : (i32) -> i64156 %10 = hlfir.designate %2#0 (%9) : (!fir.ref<!fir.array<10x!t>>, i64) -> !fir.ref<!t>157 %11 = hlfir.designate %10{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!t>) -> !fir.ref<!fir.boxproc<() -> i32>>158 hlfir.yield %11 : !fir.ref<!fir.boxproc<() -> i32>>159 }160 }161 return162}163// CHECK-LABEL: func.func @test_need_to_save_lhs(164// CHECK: %[[VAL_1:.*]] = fir.alloca i64165// CHECK: %[[VAL_2:.*]] = fir.alloca !fir.box<!fir.heap<i64>>166// CHECK: %[[VAL_3:.*]] = fir.alloca i64167// CHECK: %[[VAL_4:.*]] = arith.constant 11 : i64168// CHECK: %[[VAL_5:.*]] = arith.constant 10 : i64169// CHECK: %[[VAL_6:.*]] = arith.constant 1 : i64170// CHECK: %[[VAL_7:.*]] = arith.constant 10 : index171// CHECK: %[[VAL_8:.*]] = fir.dummy_scope : !fir.dscope172// CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1>173// CHECK: %[[VAL_10:.*]]:2 = hlfir.declare{{.*}}"x"174// CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_6]] : (i64) -> index175// CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_5]] : (i64) -> index176// CHECK: %[[VAL_13:.*]] = arith.constant 1 : index177// CHECK: %[[VAL_14:.*]] = arith.constant 0 : i64178// CHECK: %[[VAL_15:.*]] = arith.constant 1 : i64179// CHECK: fir.store %[[VAL_14]] to %[[VAL_3]] : !fir.ref<i64>180// CHECK: %[[VAL_20:.*]] = fir.call @_FortranACreateValueStack(181// CHECK: fir.do_loop %[[VAL_21:.*]] = %[[VAL_11]] to %[[VAL_12]] step %[[VAL_13]] {182// CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (index) -> i64183// CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_4]], %[[VAL_22]] : i64184// CHECK: %[[VAL_24:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_23]]) : (!fir.ref<!fir.array<10x!fir.type<t{p:!fir.boxproc<() -> i32>}>>>, i64) -> !fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>185// CHECK: %[[VAL_25:.*]] = hlfir.designate %[[VAL_24]]{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>) -> !fir.ref<!fir.boxproc<() -> i32>>186// CHECK: %[[VAL_26:.*]] = fir.load %[[VAL_25]] : !fir.ref<!fir.boxproc<() -> i32>>187// CHECK: %[[VAL_27:.*]] = fir.box_addr %[[VAL_26]] : (!fir.boxproc<() -> i32>) -> (() -> i32)188// CHECK: %[[VAL_28:.*]] = fir.call %[[VAL_27]]() proc_attrs<pure> : () -> i32189// CHECK: %[[VAL_29:.*]] = fir.convert %[[VAL_28]] : (i32) -> i64190// CHECK: %[[VAL_30:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_29]]) : (!fir.ref<!fir.array<10x!fir.type<t{p:!fir.boxproc<() -> i32>}>>>, i64) -> !fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>191// CHECK: %[[VAL_31:.*]] = hlfir.designate %[[VAL_30]]{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<t{p:!fir.boxproc<() -> i32>}>>) -> !fir.ref<!fir.boxproc<() -> i32>>192// CHECK: %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (!fir.ref<!fir.boxproc<() -> i32>>) -> i64193// CHECK: fir.store %[[VAL_32]] to %[[VAL_1]] : !fir.ref<i64>194// CHECK: %[[VAL_33:.*]] = fir.embox %[[VAL_1]] : (!fir.ref<i64>) -> !fir.box<i64>195// CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_33]] : (!fir.box<i64>) -> !fir.box<none>196// CHECK: fir.call @_FortranAPushValue(%[[VAL_20]], %[[VAL_34]]) : (!fir.llvm_ptr<i8>, !fir.box<none>) -> ()197// CHECK: }198// CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_6]] : (i64) -> index199// CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_5]] : (i64) -> index200// CHECK: %[[VAL_37:.*]] = arith.constant 1 : index201// CHECK: fir.store %[[VAL_14]] to %[[VAL_3]] : !fir.ref<i64>202// CHECK: fir.do_loop %[[VAL_38:.*]] = %[[VAL_35]] to %[[VAL_36]] step %[[VAL_37]] {203// CHECK: %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (index) -> i64204// CHECK: %[[VAL_40:.*]] = fir.load %[[VAL_3]] : !fir.ref<i64>205// CHECK: %[[VAL_41:.*]] = arith.addi %[[VAL_40]], %[[VAL_15]] : i64206// CHECK: fir.store %[[VAL_41]] to %[[VAL_3]] : !fir.ref<i64>207// CHECK: %[[VAL_42:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.box<!fir.heap<i64>>>) -> !fir.ref<!fir.box<none>>208// CHECK: fir.call @_FortranAValueAt(%[[VAL_20]], %[[VAL_40]], %[[VAL_42]]) : (!fir.llvm_ptr<i8>, i64, !fir.ref<!fir.box<none>>) -> ()209// CHECK: %[[VAL_43:.*]] = fir.load %[[VAL_2]] : !fir.ref<!fir.box<!fir.heap<i64>>>210// CHECK: %[[VAL_44:.*]] = fir.box_addr %[[VAL_43]] : (!fir.box<!fir.heap<i64>>) -> !fir.heap<i64>211// CHECK: %[[VAL_45:.*]] = fir.load %[[VAL_44]] : !fir.heap<i64>212// CHECK: %[[VAL_46:.*]] = fir.convert %[[VAL_45]] : (i64) -> !fir.ref<!fir.boxproc<() -> i32>>213// CHECK: %[[VAL_47:.*]] = fir.address_of(@f1) : () -> i32214// CHECK: %[[VAL_48:.*]] = fir.emboxproc %[[VAL_47]] : (() -> i32) -> !fir.boxproc<() -> ()>215// CHECK: %[[VAL_49:.*]] = fir.convert %[[VAL_48]] : (!fir.boxproc<() -> ()>) -> !fir.boxproc<() -> i32>216// CHECK: fir.store %[[VAL_49]] to %[[VAL_46]] : !fir.ref<!fir.boxproc<() -> i32>>217// CHECK: }218// CHECK: fir.call @_FortranADestroyValueStack(%[[VAL_20]]) : (!fir.llvm_ptr<i8>) -> ()219// CHECK: return220// CHECK: }221 222func.func private @f1() -> i32 attributes {fir.proc_attrs = #fir.proc_attrs<pure>}223