Skip to content

Commit 5ce28b5

Browse files
committed
Remove vectorClassSize parameter
1 parent 2c31071 commit 5ce28b5

File tree

8 files changed

+25
-36
lines changed

8 files changed

+25
-36
lines changed

flang/include/flang/Runtime/array-constructor-consts.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,12 @@ constexpr std::size_t MaxArrayConstructorVectorAlignInBytes = 8;
7474
extern "C" {
7575
// API to initialize an ArrayConstructorVector before any values are pushed to
7676
// it. Inlined code is only expected to allocate the "ArrayConstructorVector"
77-
// class instance storage with sufficient size (using
78-
// "2*sizeof(ArrayConstructorVector)" on the host should be safe regardless of
79-
// the target the runtime is compiled for). This avoids the need for the runtime
80-
// to maintain a state, or to use dynamic allocation for it. "vectorClassSize"
81-
// is used to validate that lowering allocated enough space for it.
77+
// class instance storage with sufficient size
78+
// (MaxArrayConstructorVectorSizeInBytes is expected to be large enough for all
79+
// supported targets). This avoids the need for the runtime to maintain a state,
80+
// or to use dynamic allocation for it.
8281
void RTDECL(InitArrayConstructorVector)(ArrayConstructorVector &vector,
83-
Descriptor &to, bool useValueLengthParameters, int vectorClassSize,
82+
Descriptor &to, bool useValueLengthParameters,
8483
const char *sourceFile = nullptr, int sourceLine = 0);
8584

8685
// Generic API to push any kind of entity into the array constructor (any

flang/lib/Optimizer/Builder/Runtime/ArrayConstructor.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ mlir::Value fir::runtime::genInitArrayConstructorVector(
2525
mlir::Location loc, fir::FirOpBuilder &builder, mlir::Value toBox,
2626
mlir::Value useValueLengthParameters) {
2727
// Allocate storage for the runtime cookie for the array constructor vector.
28-
// Use the "host" size and alignment, but double them to be safe regardless of
29-
// the target. The "cookieSize" argument is used to validate this wild
30-
// assumption until runtime interfaces are improved.
28+
// Use pessimistic values for size and alignment that are valid for all
29+
// supported targets. Whether the actual ArrayConstructorVector object fits
30+
// into the available MaxArrayConstructorVectorSizeInBytes is verified when
31+
// building clang-rt.
3132
std::size_t arrayVectorStructBitSize =
3233
MaxArrayConstructorVectorSizeInBytes * 8;
3334
std::size_t alignLike = MaxArrayConstructorVectorAlignInBytes * 8;
@@ -43,14 +44,12 @@ mlir::Value fir::runtime::genInitArrayConstructorVector(
4344
loc, builder);
4445
mlir::FunctionType funcType = func.getFunctionType();
4546
cookie = builder.createConvert(loc, funcType.getInput(0), cookie);
46-
mlir::Value cookieSize = builder.createIntegerConstant(
47-
loc, funcType.getInput(3), numElem * alignLike / 8);
4847
mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
4948
mlir::Value sourceLine =
50-
fir::factory::locationToLineNo(builder, loc, funcType.getInput(5));
49+
fir::factory::locationToLineNo(builder, loc, funcType.getInput(4));
5150
auto args = fir::runtime::createArguments(builder, loc, funcType, cookie,
5251
toBox, useValueLengthParameters,
53-
cookieSize, sourceFile, sourceLine);
52+
sourceFile, sourceLine);
5453
builder.create<fir::CallOp>(loc, func, args);
5554
return cookie;
5655
}

flang/runtime/array-constructor.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,10 @@ extern "C" {
9292
RT_EXT_API_GROUP_BEGIN
9393

9494
void RTDEF(InitArrayConstructorVector)(ArrayConstructorVector &vector,
95-
Descriptor &to, bool useValueLengthParameters, int vectorClassSize,
96-
const char *sourceFile, int sourceLine) {
95+
Descriptor &to, bool useValueLengthParameters, const char *sourceFile,
96+
int sourceLine) {
9797
Terminator terminator{vector.sourceFile, vector.sourceLine};
98-
RUNTIME_CHECK(terminator,
99-
to.rank() == 1 &&
100-
sizeof(ArrayConstructorVector) <=
101-
static_cast<std::size_t>(vectorClassSize));
98+
RUNTIME_CHECK(terminator, to.rank() == 1);
10299
SubscriptValue actualAllocationSize{
103100
to.IsAllocated() ? static_cast<SubscriptValue>(to.Elements()) : 0};
104101
(void)new (&vector) ArrayConstructorVector{to, /*nextValuePosition=*/0,

flang/test/Lower/HLFIR/array-ctor-as-runtime-temp.f90

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@ subroutine test_loops()
1717
! CHECK: fir.store %[[VAL_6]] to %[[VAL_2]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
1818
! CHECK: %[[VAL_7:.*]] = arith.constant false
1919
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
20-
! CHECK: %[[VAL_9:.*]] = arith.constant 80 : i32
2120
! CHECK: %[[VAL_10:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{[0-9]*}}>>
2221
! CHECK: %[[VAL_11:.*]] = arith.constant 7 : i32
2322
! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
2423
! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_10]] : (!fir.ref<!fir.char<1,{{[0-9]*}}>>) -> !fir.ref<i8>
25-
! CHECK: %[[VAL_14:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_8]], %[[VAL_12]], %[[VAL_7]], %[[VAL_9]], %[[VAL_13]], %[[VAL_11]]) fastmath<contract> : (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
24+
! CHECK: %[[VAL_14:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_8]], %[[VAL_12]], %[[VAL_7]], %[[VAL_13]], %[[VAL_11]]) fastmath<contract> : (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> none
2625
! CHECK: %[[VAL_15:.*]] = arith.constant 1 : i64
2726
! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i64) -> index
2827
! CHECK: %[[VAL_17:.*]] = fir.call @_QMarrayctorPibar() fastmath<contract> : () -> i32
@@ -86,7 +85,7 @@ subroutine test_arrays(a)
8685
! CHECK: %[[VAL_26:.*]] = arith.constant false
8786
! CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_1]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
8887
! CHECK: %[[VAL_31:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
89-
! CHECK: %[[VAL_33:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_27]], %[[VAL_31]], %[[VAL_26]], %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
88+
! CHECK: %[[VAL_33:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_27]], %[[VAL_31]], %[[VAL_26]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> none
9089
! CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_3]]#1 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<none>
9190
! CHECK: %[[VAL_35:.*]] = fir.call @_FortranAPushArrayConstructorValue(%[[VAL_27]], %[[VAL_34]]) {{.*}}: (!fir.llvm_ptr<i8>, !fir.box<none>) -> none
9291
! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_3]]#1 : (!fir.box<!fir.array<?x?xi32>>) -> !fir.box<none>
@@ -107,7 +106,7 @@ subroutine test_arrays_unpredictable_size()
107106
! CHECK: %[[VAL_9:.*]] = arith.constant false
108107
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
109108
! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_4]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) -> !fir.ref<!fir.box<none>>
110-
! CHECK: %[[VAL_16:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_10]], %[[VAL_14]], %[[VAL_9]], %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
109+
! CHECK: %[[VAL_16:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_10]], %[[VAL_14]], %[[VAL_9]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> none
111110
! CHECK: fir.call @_QMarrayctorPrank1() {{.*}}: () -> !fir.box<!fir.heap<!fir.array<?xi32>>>
112111
! CHECK: %[[VAL_21:.*]] = fir.call @_FortranAPushArrayConstructorValue(%[[VAL_10]], %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.box<none>) -> none
113112
! CHECK: fir.call @_QMarrayctorPrank3() {{.*}}: () -> !fir.box<!fir.heap<!fir.array<?x?x?xi32>>>

flang/test/Lower/HLFIR/array-ctor-character.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ subroutine test_dynamic_length()
5252
! CHECK: %[[VAL_15:.*]] = arith.constant true
5353
! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
5454
! CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<2x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>>
55-
! CHECK: %[[VAL_22:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_16]], %[[VAL_20]], %[[VAL_15]], %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
55+
! CHECK: %[[VAL_22:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_16]], %[[VAL_20]], %[[VAL_15]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> none
5656
! CHECK: fir.call @_QMchararrayctorPchar_pointer(
5757
! CHECK: fir.call @_FortranAPushArrayConstructorValue(%[[VAL_16]], %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.box<none>) -> none
5858
! CHECK: fir.call @_QMchararrayctorPchar_pointer(

flang/test/Lower/HLFIR/array-ctor-derived.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ subroutine test_simple(s1, s2)
2828
! CHECK: %[[VAL_11:.*]] = arith.constant false
2929
! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
3030
! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>>>) -> !fir.ref<!fir.box<none>>
31-
! CHECK: %[[VAL_18:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_12]], %[[VAL_16]], %[[VAL_11]], %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
31+
! CHECK: %[[VAL_18:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_12]], %[[VAL_16]], %[[VAL_11]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> none
3232
! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_4]]#1 : (!fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.llvm_ptr<i8>
3333
! CHECK: %[[VAL_20:.*]] = fir.call @_FortranAPushArrayConstructorSimpleScalar(%[[VAL_12]], %[[VAL_19]]) {{.*}}: (!fir.llvm_ptr<i8>, !fir.llvm_ptr<i8>) -> none
3434
! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_5]]#1 : (!fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.llvm_ptr<i8>
@@ -56,7 +56,7 @@ subroutine test_with_polymorphic(s1, s2)
5656
! CHECK: %[[VAL_11:.*]] = arith.constant false
5757
! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
5858
! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>>>) -> !fir.ref<!fir.box<none>>
59-
! CHECK: %[[VAL_18:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_12]], %[[VAL_16]], %[[VAL_11]], %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
59+
! CHECK: %[[VAL_18:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_12]], %[[VAL_16]], %[[VAL_11]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> none
6060
! CHECK: %[[VAL_19A:.*]] = fir.box_addr %[[VAL_4]]#1 : (!fir.class<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>
6161
! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_19A]] : (!fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.llvm_ptr<i8>
6262
! CHECK: %[[VAL_20:.*]] = fir.call @_FortranAPushArrayConstructorSimpleScalar(%[[VAL_12]], %[[VAL_19]]) {{.*}}: (!fir.llvm_ptr<i8>, !fir.llvm_ptr<i8>) -> none

flang/test/Lower/HLFIR/structure-constructor.f90

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,12 +273,11 @@ end subroutine test6
273273
! CHECK: fir.store %[[VAL_49]] to %[[VAL_4]] : !fir.ref<!fir.box<!fir.heap<!fir.array<1x!fir.type<_QMtypesTt1{c:!fir.char<1,4>}>>>>>
274274
! CHECK: %[[VAL_50:.*]] = arith.constant false
275275
! CHECK: %[[VAL_51:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8>
276-
! CHECK: %[[VAL_52:.*]] = arith.constant 80 : i32
277276
! CHECK: %[[VAL_53:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{[0-9]*}}>>
278277
! CHECK: %[[VAL_54:.*]] = arith.constant {{[0-9]*}} : i32
279278
! CHECK: %[[VAL_55:.*]] = fir.convert %[[VAL_4]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<1x!fir.type<_QMtypesTt1{c:!fir.char<1,4>}>>>>>) -> !fir.ref<!fir.box<none>>
280279
! CHECK: %[[VAL_56:.*]] = fir.convert %[[VAL_53]] : (!fir.ref<!fir.char<1,{{[0-9]*}}>>) -> !fir.ref<i8>
281-
! CHECK: %[[VAL_57:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_51]], %[[VAL_55]], %[[VAL_50]], %[[VAL_52]], %[[VAL_56]], %[[VAL_54]]) fastmath<contract> : (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, i32, !fir.ref<i8>, i32) -> none
280+
! CHECK: %[[VAL_57:.*]] = fir.call @_FortranAInitArrayConstructorVector(%[[VAL_51]], %[[VAL_55]], %[[VAL_50]], %[[VAL_56]], %[[VAL_54]]) fastmath<contract> : (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> none
282281
! CHECK: %[[VAL_58:.*]]:2 = hlfir.declare %[[VAL_2]] {uniq_name = "ctor.temp"} : (!fir.ref<!fir.type<_QMtypesTt1{c:!fir.char<1,4>}>>) -> (!fir.ref<!fir.type<_QMtypesTt1{c:!fir.char<1,4>}>>, !fir.ref<!fir.type<_QMtypesTt1{c:!fir.char<1,4>}>>)
283282
! CHECK: %[[VAL_59:.*]] = fir.embox %[[VAL_58]]#0 : (!fir.ref<!fir.type<_QMtypesTt1{c:!fir.char<1,4>}>>) -> !fir.box<!fir.type<_QMtypesTt1{c:!fir.char<1,4>}>>
284283
! CHECK: %[[VAL_60:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref<!fir.char<1,{{[0-9]*}}>>

flang/unittests/Runtime/ArrayConstructor.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ TEST(ArrayConstructor, Basic) {
4343
result.GetDimension(0).SetBounds(1, 0);
4444

4545
RTNAME(InitArrayConstructorVector)
46-
(*acVector, result, /*useValueLengthParameters=*/false,
47-
/*vectorClassSize=*/sizeof(ArrayConstructorVector));
46+
(*acVector, result, /*useValueLengthParameters=*/false);
4847
for (std::int32_t i{0}; i <= 99; ++i) {
4948
RTNAME(PushArrayConstructorSimpleScalar)(*acVector, &i);
5049
RTNAME(PushArrayConstructorValue)(*acVector, *x);
@@ -71,8 +70,7 @@ TEST(ArrayConstructor, Basic) {
7170
// and is allocated when the first value is pushed.
7271
result.GetDimension(0).SetBounds(1, 1234);
7372
RTNAME(InitArrayConstructorVector)
74-
(*acVector, result, /*useValueLengthParameters=*/false,
75-
/*vectorClassSize=*/sizeof(ArrayConstructorVector));
73+
(*acVector, result, /*useValueLengthParameters=*/false);
7674
EXPECT_EQ(0, acVector->actualAllocationSize);
7775
std::int32_t i{42};
7876
RTNAME(PushArrayConstructorSimpleScalar)(*acVector, &i);
@@ -109,8 +107,7 @@ TEST(ArrayConstructor, Character) {
109107
static constexpr std::size_t expectedElements{10 * (1 + 4 + 2 * 3)};
110108
result.GetDimension(0).SetBounds(1, 0);
111109
RTNAME(InitArrayConstructorVector)
112-
(*acVector, result, /*useValueLengthParameters=*/true,
113-
/*vectorClassSize=*/sizeof(ArrayConstructorVector));
110+
(*acVector, result, /*useValueLengthParameters=*/true);
114111
for (std::int32_t i{1}; i <= 10; ++i) {
115112
RTNAME(PushArrayConstructorValue)(*acVector, *c);
116113
RTNAME(PushArrayConstructorValue)(*acVector, *x);
@@ -151,8 +148,7 @@ TEST(ArrayConstructor, CharacterRuntimeCheck) {
151148

152149
result.GetDimension(0).SetBounds(1, 0);
153150
RTNAME(InitArrayConstructorVector)
154-
(*acVector, result, /*useValueLengthParameters=*/true,
155-
/*vectorClassSize=*/sizeof(ArrayConstructorVector));
151+
(*acVector, result, /*useValueLengthParameters=*/true);
156152
RTNAME(PushArrayConstructorValue)(*acVector, *c2);
157153
ASSERT_DEATH(RTNAME(PushArrayConstructorValue)(*acVector, *c3),
158154
"Array constructor: mismatched character lengths");

0 commit comments

Comments
 (0)