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