Skip to content

Commit 898a7bd

Browse files
committed
[flang][hlfir] Establish <storage, mustFree> tuple for ApplyOp and NoReassocOp.
The bufferization pass must create the tuple for these operations, because the users may require it. For example, in case of ElementalOp inlining a DestroyOp may be generated for the operand of YieldElementOp, and the operand may be ApplyOp->NoReassocOp chain. Differential Revision: https://reviews.llvm.org/D150343
1 parent d5b8401 commit 898a7bd

File tree

3 files changed

+170
-3
lines changed

3 files changed

+170
-3
lines changed

flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,14 @@ struct ApplyOpConversion : public mlir::OpConversionPattern<hlfir::ApplyOp> {
215215
mlir::Value result = rewriter.create<hlfir::DesignateOp>(
216216
loc, resultType, bufferizedExpr, adaptor.getIndices(),
217217
adaptor.getTypeparams());
218-
if (fir::isa_trivial(apply.getType()))
218+
if (fir::isa_trivial(apply.getType())) {
219219
result = rewriter.create<fir::LoadOp>(loc, result);
220+
} else {
221+
auto module = apply->getParentOfType<mlir::ModuleOp>();
222+
fir::FirOpBuilder builder(rewriter, fir::getKindMapping(module));
223+
result =
224+
packageBufferizedExpr(loc, builder, hlfir::Entity{result}, false);
225+
}
220226
rewriter.replaceOp(apply, result);
221227
return mlir::success();
222228
}
@@ -451,8 +457,20 @@ struct NoReassocOpConversion
451457
mlir::LogicalResult
452458
matchAndRewrite(hlfir::NoReassocOp noreassoc, OpAdaptor adaptor,
453459
mlir::ConversionPatternRewriter &rewriter) const override {
454-
rewriter.replaceOpWithNewOp<hlfir::NoReassocOp>(
455-
noreassoc, getBufferizedExprStorage(adaptor.getVal()));
460+
mlir::Location loc = noreassoc->getLoc();
461+
auto module = noreassoc->getParentOfType<mlir::ModuleOp>();
462+
fir::FirOpBuilder builder(rewriter, fir::getKindMapping(module));
463+
mlir::Value bufferizedExpr = getBufferizedExprStorage(adaptor.getVal());
464+
mlir::Value result =
465+
builder.create<hlfir::NoReassocOp>(loc, bufferizedExpr);
466+
467+
if (!fir::isa_trivial(bufferizedExpr.getType())) {
468+
// NoReassocOp should not be needed on the mustFree path.
469+
mlir::Value mustFree = getBufferizedExprMustFreeFlag(adaptor.getVal());
470+
result =
471+
packageBufferizedExpr(loc, builder, hlfir::Entity{result}, mustFree);
472+
}
473+
rewriter.replaceOp(noreassoc, result);
456474
return mlir::success();
457475
}
458476
};

flang/test/HLFIR/apply-codegen.fir

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@ func.func @character_apply(%arg0 : !fir.ref<!fir.array<?x!fir.char<2,?>>>, %l: i
2525
// CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) typeparams %[[VAL_1:.*]] {uniq_name = ".tmp"}
2626
// CHECK: %[[VAL_11:.*]] = arith.constant 42 : index
2727
// CHECK: %[[VAL_12:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_11]]) typeparams %[[VAL_1]] : (!fir.box<!fir.array<?x!fir.char<2,?>>>, index, index) -> !fir.boxchar<2>
28+
// CHECK: %[[VAL_13:.*]] = arith.constant false
29+
// CHECK: %[[VAL_14:.*]] = fir.undefined tuple<!fir.boxchar<2>, i1>
30+
// CHECK: %[[VAL_15:.*]] = fir.insert_value %[[VAL_14]], %[[VAL_13]], [1 : index] : (tuple<!fir.boxchar<2>, i1>, i1) -> tuple<!fir.boxchar<2>, i1>
31+
// CHECK: %[[VAL_16:.*]] = fir.insert_value %[[VAL_15]], %[[VAL_12]], [0 : index] : (tuple<!fir.boxchar<2>, i1>, !fir.boxchar<2>) -> tuple<!fir.boxchar<2>, i1>

flang/test/HLFIR/bufferize01.fir

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
// RUN: fir-opt --bufferize-hlfir --split-input-file %s | FileCheck %s
2+
3+
// -----
4+
5+
// Bufferization for hlfir.apply and hlfir.no_reassoc must establish
6+
// the <storage, mustFree> tuple properly, so that the users have
7+
// access to both components.
8+
9+
// CHECK-LABEL: func.func @_QPtest1() {
10+
// CHECK: %[[VAL_0:.*]] = arith.constant 1 : i32
11+
// CHECK: %[[VAL_1:.*]] = arith.constant 80 : i32
12+
// CHECK: %[[VAL_2:.*]] = arith.constant true
13+
// CHECK: %[[VAL_3:.*]] = arith.constant 1 : index
14+
// CHECK: %[[VAL_4:.*]] = arith.constant 0 : index
15+
// CHECK: %[[VAL_5:.*]] = fir.alloca !fir.array<10xi64> {bindc_name = ".rt.arrayctor.vector"}
16+
// CHECK: %[[VAL_6:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>> {bindc_name = ".tmp.arrayctor"}
17+
// CHECK: %[[VAL_7:.*]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>> {bindc_name = "w", uniq_name = "_QFtest1Ew"}
18+
// CHECK: %[[VAL_8:.*]] = fir.zero_bits !fir.heap<!fir.char<1,?>>
19+
// CHECK: %[[VAL_9:.*]] = fir.embox %[[VAL_8]] typeparams %[[VAL_4]] : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>>
20+
// CHECK: fir.store %[[VAL_9]] to %[[VAL_7]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
21+
// CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_7]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest1Ew"} : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>, !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>)
22+
// CHECK: %[[VAL_11:.*]] = fir.zero_bits !fir.heap<!fir.array<1x!fir.char<1,?>>>
23+
// CHECK: %[[VAL_12:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
24+
// CHECK: %[[VAL_13:.*]] = fir.embox %[[VAL_11]](%[[VAL_12]]) typeparams %[[VAL_4]] : (!fir.heap<!fir.array<1x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>
25+
// CHECK: fir.store %[[VAL_13]] to %[[VAL_6]] : !fir.ref<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>>
26+
// CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_5]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
27+
// CHECK: %[[VAL_15:.*]] = fir.address_of(@_QQcl.ce30ef70ff16a711a97719fb946c0b3d) : !fir.ref<!fir.char<1>>
28+
// CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_6]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>>
29+
// CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_15]] : (!fir.ref<!fir.char<1>>) -> !fir.ref<i8>
30+
// CHECK: %[[VAL_18:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_14]], %[[VAL_16]], %[[VAL_2]], %[[VAL_1]], %[[VAL_17]], %[[VAL_0]]) fastmath<contract> : (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
31+
// CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_10]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
32+
// CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
33+
// CHECK: %[[VAL_21:.*]] = fir.load %[[VAL_10]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
34+
// CHECK: %[[VAL_22:.*]] = fir.box_elesize %[[VAL_21]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> index
35+
// CHECK: %[[VAL_23:.*]] = fir.emboxchar %[[VAL_20]], %[[VAL_22]] : (!fir.heap<!fir.char<1,?>>, index) -> !fir.boxchar<1>
36+
// CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_10]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
37+
// CHECK: %[[VAL_25:.*]] = fir.box_elesize %[[VAL_24]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> index
38+
// CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (index) -> i64
39+
// CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (i64) -> index
40+
// CHECK: %[[VAL_28:.*]] = arith.cmpi sgt, %[[VAL_27]], %[[VAL_4]] : index
41+
// CHECK: %[[VAL_29:.*]] = arith.select %[[VAL_28]], %[[VAL_27]], %[[VAL_4]] : index
42+
// CHECK: %[[VAL_30:.*]] = hlfir.designate %[[VAL_23]] substr %[[VAL_3]], %[[VAL_27]] typeparams %[[VAL_29]] : (!fir.boxchar<1>, index, index, index) -> !fir.boxchar<1>
43+
// CHECK: %[[VAL_31:.*]]:2 = fir.unboxchar %[[VAL_30]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
44+
// CHECK: %[[VAL_32:.*]] = fir.embox %[[VAL_31]]#0 typeparams %[[VAL_29]] : (!fir.ref<!fir.char<1,?>>, index) -> !fir.box<!fir.char<1,?>>
45+
// CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (!fir.box<!fir.char<1,?>>) -> !fir.box<none>
46+
// CHECK: %[[VAL_34:.*]] = fir.call @_FortranAPushArrayConstructorValue(%[[VAL_14]], %[[VAL_33]]) fastmath<contract> : (!fir.llvm_ptr<i8>, !fir.box<none>) -> none
47+
// CHECK: %[[VAL_35:.*]] = fir.load %[[VAL_6]] : !fir.ref<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>>
48+
// CHECK: %[[VAL_36:.*]] = fir.undefined tuple<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>, i1>
49+
// CHECK: %[[VAL_37:.*]] = fir.insert_value %[[VAL_36]], %[[VAL_2]], [1 : index] : (tuple<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>, i1>, i1) -> tuple<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>, i1>
50+
// CHECK: %[[VAL_38:.*]] = fir.insert_value %[[VAL_37]], %[[VAL_35]], [0 : index] : (tuple<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>, i1>, !fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>) -> tuple<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>, i1>
51+
// CHECK: %[[VAL_39:.*]] = fir.box_elesize %[[VAL_35]] : (!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>) -> index
52+
// CHECK: %[[VAL_40:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
53+
// CHECK: %[[VAL_41:.*]] = fir.allocmem !fir.array<1x!fir.char<1,?>>(%[[VAL_39]] : index) {bindc_name = ".tmp.array", uniq_name = ""}
54+
// CHECK: %[[VAL_42:.*]]:2 = hlfir.declare %[[VAL_41]](%[[VAL_40]]) typeparams %[[VAL_39]] {uniq_name = ".tmp.array"} : (!fir.heap<!fir.array<1x!fir.char<1,?>>>, !fir.shape<1>, index) -> (!fir.box<!fir.array<1x!fir.char<1,?>>>, !fir.heap<!fir.array<1x!fir.char<1,?>>>)
55+
// CHECK: %[[VAL_43:.*]] = arith.constant true
56+
// CHECK: %[[VAL_44:.*]] = arith.constant 1 : index
57+
// CHECK: fir.do_loop %[[VAL_45:.*]] = %[[VAL_44]] to %[[VAL_3]] step %[[VAL_44]] {
58+
// CHECK: %[[VAL_46:.*]] = fir.box_elesize %[[VAL_35]] : (!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>) -> index
59+
// CHECK: %[[VAL_47:.*]] = hlfir.designate %[[VAL_35]] (%[[VAL_45]]) typeparams %[[VAL_46]] : (!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>, index, index) -> !fir.boxchar<1>
60+
// CHECK: %[[VAL_48:.*]] = arith.constant false
61+
// CHECK: %[[VAL_49:.*]] = fir.undefined tuple<!fir.boxchar<1>, i1>
62+
// CHECK: %[[VAL_50:.*]] = fir.insert_value %[[VAL_49]], %[[VAL_48]], [1 : index] : (tuple<!fir.boxchar<1>, i1>, i1) -> tuple<!fir.boxchar<1>, i1>
63+
// CHECK: %[[VAL_51:.*]] = fir.insert_value %[[VAL_50]], %[[VAL_47]], [0 : index] : (tuple<!fir.boxchar<1>, i1>, !fir.boxchar<1>) -> tuple<!fir.boxchar<1>, i1>
64+
// CHECK: %[[VAL_52:.*]] = hlfir.no_reassoc %[[VAL_47]] : !fir.boxchar<1>
65+
// CHECK: %[[VAL_53:.*]] = fir.undefined tuple<!fir.boxchar<1>, i1>
66+
// CHECK: %[[VAL_54:.*]] = fir.insert_value %[[VAL_53]], %[[VAL_48]], [1 : index] : (tuple<!fir.boxchar<1>, i1>, i1) -> tuple<!fir.boxchar<1>, i1>
67+
// CHECK: %[[VAL_55:.*]] = fir.insert_value %[[VAL_54]], %[[VAL_52]], [0 : index] : (tuple<!fir.boxchar<1>, i1>, !fir.boxchar<1>) -> tuple<!fir.boxchar<1>, i1>
68+
// CHECK: %[[VAL_56:.*]] = hlfir.designate %[[VAL_42]]#0 (%[[VAL_45]]) typeparams %[[VAL_39]] : (!fir.box<!fir.array<1x!fir.char<1,?>>>, index, index) -> !fir.boxchar<1>
69+
// CHECK: hlfir.assign %[[VAL_52]] to %[[VAL_56]] : !fir.boxchar<1>, !fir.boxchar<1>
70+
// CHECK: }
71+
// CHECK: %[[VAL_57:.*]] = fir.undefined tuple<!fir.box<!fir.array<1x!fir.char<1,?>>>, i1>
72+
// CHECK: %[[VAL_58:.*]] = fir.insert_value %[[VAL_57]], %[[VAL_43]], [1 : index] : (tuple<!fir.box<!fir.array<1x!fir.char<1,?>>>, i1>, i1) -> tuple<!fir.box<!fir.array<1x!fir.char<1,?>>>, i1>
73+
// CHECK: %[[VAL_59:.*]] = fir.insert_value %[[VAL_58]], %[[VAL_42]]#0, [0 : index] : (tuple<!fir.box<!fir.array<1x!fir.char<1,?>>>, i1>, !fir.box<!fir.array<1x!fir.char<1,?>>>) -> tuple<!fir.box<!fir.array<1x!fir.char<1,?>>>, i1>
74+
// CHECK: %[[VAL_60:.*]] = fir.convert %[[VAL_42]]#1 : (!fir.heap<!fir.array<1x!fir.char<1,?>>>) -> !fir.ref<!fir.array<1x!fir.char<1,?>>>
75+
// CHECK: %[[VAL_61:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
76+
// CHECK: %[[VAL_62:.*]]:2 = hlfir.declare %[[VAL_60]](%[[VAL_61]]) typeparams %[[VAL_39]] {uniq_name = "_QFtest1Ey"} : (!fir.ref<!fir.array<1x!fir.char<1,?>>>, !fir.shape<1>, index) -> (!fir.box<!fir.array<1x!fir.char<1,?>>>, !fir.ref<!fir.array<1x!fir.char<1,?>>>)
77+
// CHECK: %[[VAL_63:.*]] = fir.convert %[[VAL_60]] : (!fir.ref<!fir.array<1x!fir.char<1,?>>>) -> !fir.heap<!fir.array<1x!fir.char<1,?>>>
78+
// CHECK: fir.freemem %[[VAL_63]] : !fir.heap<!fir.array<1x!fir.char<1,?>>>
79+
// CHECK: %[[VAL_64:.*]] = fir.box_addr %[[VAL_35]] : (!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>) -> !fir.heap<!fir.array<1x!fir.char<1,?>>>
80+
// CHECK: fir.freemem %[[VAL_64]] : !fir.heap<!fir.array<1x!fir.char<1,?>>>
81+
// CHECK: return
82+
// CHECK: }
83+
func.func @_QPtest1() {
84+
%c1_i32 = arith.constant 1 : i32
85+
%c80_i32 = arith.constant 80 : i32
86+
%true = arith.constant true
87+
%c1 = arith.constant 1 : index
88+
%c0 = arith.constant 0 : index
89+
%0 = fir.alloca !fir.array<10xi64> {bindc_name = ".rt.arrayctor.vector"}
90+
%1 = fir.alloca !fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>> {bindc_name = ".tmp.arrayctor"}
91+
%2 = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>> {bindc_name = "w", uniq_name = "_QFtest1Ew"}
92+
%3 = fir.zero_bits !fir.heap<!fir.char<1,?>>
93+
%4 = fir.embox %3 typeparams %c0 : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>>
94+
fir.store %4 to %2 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
95+
%5:2 = hlfir.declare %2 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtest1Ew"} : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>, !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>)
96+
%6 = fir.zero_bits !fir.heap<!fir.array<1x!fir.char<1,?>>>
97+
%7 = fir.shape %c1 : (index) -> !fir.shape<1>
98+
%8 = fir.embox %6(%7) typeparams %c0 : (!fir.heap<!fir.array<1x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>
99+
fir.store %8 to %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>>
100+
%9 = fir.convert %0 : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
101+
%10 = fir.address_of(@_QQcl.ce30ef70ff16a711a97719fb946c0b3d) : !fir.ref<!fir.char<1,1>>
102+
%11 = fir.convert %1 : (!fir.ref<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>>
103+
%12 = fir.convert %10 : (!fir.ref<!fir.char<1,1>>) -> !fir.ref<i8>
104+
%13 = fir.call @_FortranAInitArrayConstructorVector(%9, %11, %true, %c80_i32, %12, %c1_i32) fastmath<contract> : (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
105+
%14 = fir.load %5#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
106+
%15 = fir.box_addr %14 : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
107+
%16 = fir.load %5#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
108+
%17 = fir.box_elesize %16 : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> index
109+
%18 = fir.emboxchar %15, %17 : (!fir.heap<!fir.char<1,?>>, index) -> !fir.boxchar<1>
110+
%19 = fir.load %5#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
111+
%20 = fir.box_elesize %19 : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> index
112+
%21 = fir.convert %20 : (index) -> i64
113+
%22 = fir.convert %21 : (i64) -> index
114+
%23 = arith.cmpi sgt, %22, %c0 : index
115+
%24 = arith.select %23, %22, %c0 : index
116+
%25 = hlfir.designate %18 substr %c1, %22 typeparams %24 : (!fir.boxchar<1>, index, index, index) -> !fir.boxchar<1>
117+
%26:2 = fir.unboxchar %25 : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
118+
%27 = fir.embox %26#0 typeparams %24 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.box<!fir.char<1,?>>
119+
%28 = fir.convert %27 : (!fir.box<!fir.char<1,?>>) -> !fir.box<none>
120+
%29 = fir.call @_FortranAPushArrayConstructorValue(%9, %28) fastmath<contract> : (!fir.llvm_ptr<i8>, !fir.box<none>) -> none
121+
%30 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>>
122+
%31 = hlfir.as_expr %30 move %true : (!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>, i1) -> !hlfir.expr<1x!fir.char<1,?>>
123+
%32 = fir.box_elesize %30 : (!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>) -> index
124+
%33 = fir.shape %c1 : (index) -> !fir.shape<1>
125+
%34 = hlfir.elemental %33 typeparams %32 : (!fir.shape<1>, index) -> !hlfir.expr<1x!fir.char<1,?>> {
126+
^bb0(%arg0: index):
127+
%38 = fir.box_elesize %30 : (!fir.box<!fir.heap<!fir.array<1x!fir.char<1,?>>>>) -> index
128+
%39 = hlfir.apply %31, %arg0 typeparams %38 : (!hlfir.expr<1x!fir.char<1,?>>, index, index) -> !hlfir.expr<!fir.char<1,?>>
129+
%40 = hlfir.no_reassoc %39 : !hlfir.expr<!fir.char<1,?>>
130+
hlfir.yield_element %40 : !hlfir.expr<!fir.char<1,?>>
131+
}
132+
%35:3 = hlfir.associate %34(%33) typeparams %32 {uniq_name = "adapt.valuebyref"} : (!hlfir.expr<1x!fir.char<1,?>>, !fir.shape<1>, index) -> (!fir.box<!fir.array<1x!fir.char<1,?>>>, !fir.ref<!fir.array<1x!fir.char<1,?>>>, i1)
133+
%36 = fir.shape %c1 : (index) -> !fir.shape<1>
134+
%37:2 = hlfir.declare %35#1(%36) typeparams %32 {uniq_name = "_QFtest1Ey"} : (!fir.ref<!fir.array<1x!fir.char<1,?>>>, !fir.shape<1>, index) -> (!fir.box<!fir.array<1x!fir.char<1,?>>>, !fir.ref<!fir.array<1x!fir.char<1,?>>>)
135+
hlfir.end_associate %35#1, %35#2 : !fir.ref<!fir.array<1x!fir.char<1,?>>>, i1
136+
hlfir.destroy %34 : !hlfir.expr<1x!fir.char<1,?>>
137+
hlfir.destroy %31 : !hlfir.expr<1x!fir.char<1,?>>
138+
return
139+
}
140+
func.func private @_FortranAInitArrayConstructorVector(!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none attributes {fir.runtime}
141+
fir.global linkonce @_QQcl.ce30ef70ff16a711a97719fb946c0b3d constant : !fir.char<1,1> {
142+
%0 = fir.string_lit "\00"(1) : !fir.char<1,1>
143+
fir.has_value %0 : !fir.char<1,1>
144+
}
145+
func.func private @_FortranAPushArrayConstructorValue(!fir.llvm_ptr<i8>, !fir.box<none>) -> none attributes {fir.runtime}

0 commit comments

Comments
 (0)