brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.1 KiB · c5fcc4d Raw
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