brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.6 KiB · 855b62c Raw
199 lines · plain
1// Test code generation of hlfir.region_assign representing pointer2// assignments inside FORALL.3 4// RUN: fir-opt %s --lower-hlfir-ordered-assignments | FileCheck %s5 6!t = !fir.type<t{i:i64}>7!ptr_wrapper = !fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>8 9func.func @test_no_conflict(%n: i64, %arg1: !fir.box<!fir.array<?x!ptr_wrapper>>, %arg2: !fir.ref<!t> ) {10  %c1 = arith.constant 1 : i6411  %0 = fir.dummy_scope : !fir.dscope12  %1:2 = hlfir.declare %arg1 dummy_scope %0 {uniq_name = "a"} : (!fir.box<!fir.array<?x!ptr_wrapper>>, !fir.dscope) -> (!fir.box<!fir.array<?x!ptr_wrapper>>, !fir.box<!fir.array<?x!ptr_wrapper>>)13  %3:2 = hlfir.declare %arg2 dummy_scope %0 {fortran_attrs = #fir.var_attrs<target>, uniq_name = "somet"} : (!fir.ref<!t>, !fir.dscope) -> (!fir.ref<!t>, !fir.ref<!t>)14  hlfir.forall lb {15    hlfir.yield %c1 : i6416  } ub {17    hlfir.yield %n : i6418  }  (%arg3: i64) {19    hlfir.region_assign {20      %5 = fir.embox %3#0 : (!fir.ref<!t>) -> !fir.box<!fir.ptr<!t>>21      hlfir.yield %5 : !fir.box<!fir.ptr<!t>>22    } to {23      %6 = hlfir.designate %1#0 (%arg3)  : (!fir.box<!fir.array<?x!ptr_wrapper>>, i64) -> !fir.ref<!ptr_wrapper>24      %7 = hlfir.designate %6{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!ptr_wrapper>) -> !fir.ref<!fir.box<!fir.ptr<!t>>>25      hlfir.yield %7 : !fir.ref<!fir.box<!fir.ptr<!t>>>26    }27  }28  return29}30// CHECK-LABEL:   func.func @test_no_conflict(31// CHECK-SAME:                                %[[VAL_0:.*]]: i64,32// CHECK:           %[[VAL_3:.*]] = arith.constant 1 : i6433// CHECK:           %[[VAL_4:.*]] = fir.dummy_scope : !fir.dscope34// CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare{{.*}}"a"35// CHECK:           %[[VAL_6:.*]]:2 = hlfir.declare{{.*}}"somet"36// CHECK:           %[[VAL_7:.*]] = fir.convert %[[VAL_3]] : (i64) -> index37// CHECK:           %[[VAL_8:.*]] = fir.convert %[[VAL_0]] : (i64) -> index38// CHECK:           %[[VAL_9:.*]] = arith.constant 1 : index39// CHECK:           fir.do_loop %[[VAL_10:.*]] = %[[VAL_7]] to %[[VAL_8]] step %[[VAL_9]] {40// CHECK:             %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (index) -> i6441// CHECK:             %[[VAL_12:.*]] = hlfir.designate %[[VAL_5]]#0 (%[[VAL_11]])  : (!fir.box<!fir.array<?x!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>>, i64) -> !fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>42// CHECK:             %[[VAL_13:.*]] = hlfir.designate %[[VAL_12]]{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>43// CHECK:             %[[VAL_14:.*]] = fir.embox %[[VAL_6]]#0 : (!fir.ref<!fir.type<t{i:i64}>>) -> !fir.box<!fir.ptr<!fir.type<t{i:i64}>>>44// CHECK:             fir.store %[[VAL_14]] to %[[VAL_13]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>45// CHECK:           }46// CHECK:           return47// CHECK:         }48 49func.func @test_need_to_save_rhs(%n: i64, %arg1: !fir.box<!fir.array<?x!ptr_wrapper>> ) {50  %c1 = arith.constant 1 : i6451  %0 = fir.dummy_scope : !fir.dscope52  %1:2 = hlfir.declare %arg1 dummy_scope %0 {uniq_name = "a"} : (!fir.box<!fir.array<?x!ptr_wrapper>>, !fir.dscope) -> (!fir.box<!fir.array<?x!ptr_wrapper>>, !fir.box<!fir.array<?x!ptr_wrapper>>)53  hlfir.forall lb {54    hlfir.yield %c1 : i6455  } ub {56    hlfir.yield %n : i6457  }  (%arg2: i64) {58    hlfir.region_assign {59      %5 = arith.addi %n, %c1: i6460      %6 = arith.subi %5, %arg2 : i6461      %8 = hlfir.designate %1#0 (%6)  : (!fir.box<!fir.array<?x!ptr_wrapper>>, i64) -> !fir.ref<!ptr_wrapper>62      %9 = hlfir.designate %8{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!ptr_wrapper>) -> !fir.ref<!fir.box<!fir.ptr<!t>>>63      %10 = fir.load %9 : !fir.ref<!fir.box<!fir.ptr<!t>>>64      hlfir.yield %10 : !fir.box<!fir.ptr<!t>>65    } to {66      %5 = hlfir.designate %1#0 (%arg2)  : (!fir.box<!fir.array<?x!ptr_wrapper>>, i64) -> !fir.ref<!ptr_wrapper>67      %6 = hlfir.designate %5{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!ptr_wrapper>) -> !fir.ref<!fir.box<!fir.ptr<!t>>>68      hlfir.yield %6 : !fir.ref<!fir.box<!fir.ptr<!t>>>69    }70  }71  return72}73// CHECK-LABEL:   func.func @test_need_to_save_rhs(74// CHECK-SAME:                                %[[VAL_0:.*]]: i64,75// CHECK:           %[[VAL_2:.*]] = fir.alloca !fir.box<!fir.ptr<!fir.type<t{i:i64}>>>76// CHECK:           %[[VAL_3:.*]] = fir.alloca i6477// CHECK:           %[[VAL_4:.*]] = arith.constant 1 : i6478// CHECK:           %[[VAL_5:.*]] = fir.dummy_scope : !fir.dscope79// CHECK:           %[[VAL_6:.*]]:2 = hlfir.declare{{.*}}"a"80// CHECK:           %[[VAL_7:.*]] = fir.convert %[[VAL_4]] : (i64) -> index81// CHECK:           %[[VAL_8:.*]] = fir.convert %[[VAL_0]] : (i64) -> index82// CHECK:           %[[VAL_9:.*]] = arith.constant 1 : index83// CHECK:           %[[VAL_10:.*]] = arith.constant 0 : i6484// CHECK:           %[[VAL_11:.*]] = arith.constant 1 : i6485// CHECK:           fir.store %[[VAL_10]] to %[[VAL_3]] : !fir.ref<i64>86// CHECK:           %[[VAL_16:.*]] = fir.call @_FortranACreateDescriptorStack(87// CHECK:           fir.do_loop %[[VAL_17:.*]] = %[[VAL_7]] to %[[VAL_8]] step %[[VAL_9]] {88// CHECK:             %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (index) -> i6489// CHECK:             %[[VAL_19:.*]] = arith.addi %[[VAL_0]], %[[VAL_4]] : i6490// CHECK:             %[[VAL_20:.*]] = arith.subi %[[VAL_19]], %[[VAL_18]] : i6491// CHECK:             %[[VAL_21:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_20]])  : (!fir.box<!fir.array<?x!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>>, i64) -> !fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>92// CHECK:             %[[VAL_22:.*]] = hlfir.designate %[[VAL_21]]{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>93// CHECK:             %[[VAL_23:.*]] = fir.load %[[VAL_22]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>94// CHECK:             %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>) -> !fir.box<none>95// CHECK:             fir.call @_FortranAPushDescriptor(%[[VAL_16]], %[[VAL_24]]) : (!fir.llvm_ptr<i8>, !fir.box<none>) -> ()96// CHECK:           }97// CHECK:           %[[VAL_27:.*]] = fir.convert %[[VAL_4]] : (i64) -> index98// CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_0]] : (i64) -> index99// CHECK:           %[[VAL_29:.*]] = arith.constant 1 : index100// CHECK:           fir.store %[[VAL_10]] to %[[VAL_3]] : !fir.ref<i64>101// CHECK:           fir.do_loop %[[VAL_30:.*]] = %[[VAL_27]] to %[[VAL_28]] step %[[VAL_29]] {102// CHECK:             %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (index) -> i64103// CHECK:             %[[VAL_32:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_31]])  : (!fir.box<!fir.array<?x!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>>, i64) -> !fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>104// CHECK:             %[[VAL_33:.*]] = hlfir.designate %[[VAL_32]]{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>105// CHECK:             %[[VAL_34:.*]] = fir.load %[[VAL_3]] : !fir.ref<i64>106// CHECK:             %[[VAL_35:.*]] = arith.addi %[[VAL_34]], %[[VAL_11]] : i64107// CHECK:             fir.store %[[VAL_35]] to %[[VAL_3]] : !fir.ref<i64>108// CHECK:             %[[VAL_36:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>) -> !fir.ref<!fir.box<none>>109// CHECK:             fir.call @_FortranADescriptorAt(%[[VAL_16]], %[[VAL_34]], %[[VAL_36]]) : (!fir.llvm_ptr<i8>, i64, !fir.ref<!fir.box<none>>) -> ()110// CHECK:             %[[VAL_37:.*]] = fir.load %[[VAL_2]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>111// CHECK:             fir.store %[[VAL_37]] to %[[VAL_33]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>112// CHECK:           }113// CHECK:           fir.call @_FortranADestroyDescriptorStack(%[[VAL_16]]) : (!fir.llvm_ptr<i8>) -> ()114// CHECK:           return115// CHECK:         }116 117func.func @test_need_to_save_lhs(%n: i64, %arg1: !fir.box<!fir.array<?x!ptr_wrapper>>, %arg2: !fir.ref<!t> ) {118  %c1 = arith.constant 1 : i64119  %0 = fir.dummy_scope : !fir.dscope120  %1:2 = hlfir.declare %arg1 dummy_scope %0 {uniq_name = "a"} : (!fir.box<!fir.array<?x!ptr_wrapper>>, !fir.dscope) -> (!fir.box<!fir.array<?x!ptr_wrapper>>, !fir.box<!fir.array<?x!ptr_wrapper>>)121  %3:2 = hlfir.declare %arg2 dummy_scope %0 {fortran_attrs = #fir.var_attrs<target>, uniq_name = "somet"} : (!fir.ref<!t>, !fir.dscope) -> (!fir.ref<!t>, !fir.ref<!t>)122  hlfir.forall lb {123    hlfir.yield %c1 : i64124  } ub {125    hlfir.yield %n : i64126  }  (%arg3: i64) {127    hlfir.region_assign {128      %5 = fir.embox %3#0 : (!fir.ref<!t>) -> !fir.box<!fir.ptr<!t>>129      hlfir.yield %5 : !fir.box<!fir.ptr<!t>>130    } to {131      %6 = arith.addi %n, %c1 : i64132      %7 = arith.subi %6, %arg3 : i64133      %9 = hlfir.designate %1#0 (%7)  : (!fir.box<!fir.array<?x!ptr_wrapper>>, i64) -> !fir.ref<!ptr_wrapper>134      %10 = hlfir.designate %9{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!ptr_wrapper>) -> !fir.ref<!fir.box<!fir.ptr<!t>>>135      %11 = fir.load %10 : !fir.ref<!fir.box<!fir.ptr<!t>>>136      %13 = hlfir.designate %11{"i"}   : (!fir.box<!fir.ptr<!t>>) -> !fir.ref<i64>137      %14 = fir.load %13 : !fir.ref<i64>138      %16 = hlfir.designate %1#0 (%14)  : (!fir.box<!fir.array<?x!ptr_wrapper>>, i64) -> !fir.ref<!ptr_wrapper>139      %17 = hlfir.designate %16{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!ptr_wrapper>) -> !fir.ref<!fir.box<!fir.ptr<!t>>>140      hlfir.yield %17 : !fir.ref<!fir.box<!fir.ptr<!t>>>141    }142  }143  return144}145// CHECK-LABEL:   func.func @test_need_to_save_lhs(146// CHECK-SAME:                                %[[VAL_0:.*]]: i64,147// CHECK:           %[[VAL_3:.*]] = fir.alloca i64148// CHECK:           %[[VAL_4:.*]] = fir.alloca !fir.box<!fir.heap<i64>>149// CHECK:           %[[VAL_5:.*]] = fir.alloca i64150// CHECK:           %[[VAL_6:.*]] = arith.constant 1 : i64151// CHECK:           %[[VAL_7:.*]] = fir.dummy_scope : !fir.dscope152// CHECK:           %[[VAL_8:.*]]:2 = hlfir.declare{{.*}}"a"153// CHECK:           %[[VAL_9:.*]]:2 = hlfir.declare{{.*}}"somet"154// CHECK:           %[[VAL_10:.*]] = fir.convert %[[VAL_6]] : (i64) -> index155// CHECK:           %[[VAL_11:.*]] = fir.convert %[[VAL_0]] : (i64) -> index156// CHECK:           %[[VAL_12:.*]] = arith.constant 1 : index157// CHECK:           %[[VAL_13:.*]] = arith.constant 0 : i64158// CHECK:           %[[VAL_14:.*]] = arith.constant 1 : i64159// CHECK:           fir.store %[[VAL_13]] to %[[VAL_5]] : !fir.ref<i64>160// CHECK:           %[[VAL_19:.*]] = fir.call @_FortranACreateValueStack(161// CHECK:           fir.do_loop %[[VAL_20:.*]] = %[[VAL_10]] to %[[VAL_11]] step %[[VAL_12]] {162// CHECK:             %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (index) -> i64163// CHECK:             %[[VAL_22:.*]] = arith.addi %[[VAL_0]], %[[VAL_6]] : i64164// CHECK:             %[[VAL_23:.*]] = arith.subi %[[VAL_22]], %[[VAL_21]] : i64165// CHECK:             %[[VAL_24:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_23]])  : (!fir.box<!fir.array<?x!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>>, i64) -> !fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>166// CHECK:             %[[VAL_25:.*]] = hlfir.designate %[[VAL_24]]{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>167// CHECK:             %[[VAL_26:.*]] = fir.load %[[VAL_25]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>168// CHECK:             %[[VAL_27:.*]] = hlfir.designate %[[VAL_26]]{"i"}   : (!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>) -> !fir.ref<i64>169// CHECK:             %[[VAL_28:.*]] = fir.load %[[VAL_27]] : !fir.ref<i64>170// CHECK:             %[[VAL_29:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_28]])  : (!fir.box<!fir.array<?x!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>>, i64) -> !fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>171// CHECK:             %[[VAL_30:.*]] = hlfir.designate %[[VAL_29]]{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>172// CHECK:             %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (!fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>) -> i64173// CHECK:             fir.store %[[VAL_31]] to %[[VAL_3]] : !fir.ref<i64>174// CHECK:             %[[VAL_32:.*]] = fir.embox %[[VAL_3]] : (!fir.ref<i64>) -> !fir.box<i64>175// CHECK:             %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (!fir.box<i64>) -> !fir.box<none>176// CHECK:             fir.call @_FortranAPushValue(%[[VAL_19]], %[[VAL_33]]) : (!fir.llvm_ptr<i8>, !fir.box<none>) -> ()177// CHECK:           }178// CHECK:           %[[VAL_34:.*]] = fir.convert %[[VAL_6]] : (i64) -> index179// CHECK:           %[[VAL_35:.*]] = fir.convert %[[VAL_0]] : (i64) -> index180// CHECK:           %[[VAL_36:.*]] = arith.constant 1 : index181// CHECK:           fir.store %[[VAL_13]] to %[[VAL_5]] : !fir.ref<i64>182// CHECK:           fir.do_loop %[[VAL_37:.*]] = %[[VAL_34]] to %[[VAL_35]] step %[[VAL_36]] {183// CHECK:             %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (index) -> i64184// CHECK:             %[[VAL_39:.*]] = fir.load %[[VAL_5]] : !fir.ref<i64>185// CHECK:             %[[VAL_40:.*]] = arith.addi %[[VAL_39]], %[[VAL_14]] : i64186// CHECK:             fir.store %[[VAL_40]] to %[[VAL_5]] : !fir.ref<i64>187// CHECK:             %[[VAL_41:.*]] = fir.convert %[[VAL_4]] : (!fir.ref<!fir.box<!fir.heap<i64>>>) -> !fir.ref<!fir.box<none>>188// CHECK:             fir.call @_FortranAValueAt(%[[VAL_19]], %[[VAL_39]], %[[VAL_41]]) : (!fir.llvm_ptr<i8>, i64, !fir.ref<!fir.box<none>>) -> ()189// CHECK:             %[[VAL_42:.*]] = fir.load %[[VAL_4]] : !fir.ref<!fir.box<!fir.heap<i64>>>190// CHECK:             %[[VAL_43:.*]] = fir.box_addr %[[VAL_42]] : (!fir.box<!fir.heap<i64>>) -> !fir.heap<i64>191// CHECK:             %[[VAL_44:.*]] = fir.load %[[VAL_43]] : !fir.heap<i64>192// CHECK:             %[[VAL_45:.*]] = fir.convert %[[VAL_44]] : (i64) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>193// CHECK:             %[[VAL_46:.*]] = fir.embox %[[VAL_9]]#0 : (!fir.ref<!fir.type<t{i:i64}>>) -> !fir.box<!fir.ptr<!fir.type<t{i:i64}>>>194// CHECK:             fir.store %[[VAL_46]] to %[[VAL_45]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>195// CHECK:           }196// CHECK:           fir.call @_FortranADestroyValueStack(%[[VAL_19]]) : (!fir.llvm_ptr<i8>) -> ()197// CHECK:           return198// CHECK:         }199