Skip to content

Commit fe4d0f1

Browse files
authored
Sync ragged array after upstreaming (#1326)
1 parent c35fc94 commit fe4d0f1

File tree

10 files changed

+81
-10
lines changed

10 files changed

+81
-10
lines changed

flang/include/flang/Optimizer/Builder/FIRBuilder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,8 @@ void genRecordAssignment(fir::FirOpBuilder &builder, mlir::Location loc,
493493
const fir::ExtendedValue &rhs);
494494

495495
/// Builds and returns the type of a ragged array header used to cache mask
496-
/// evaluations.
496+
/// evaluations. RaggedArrayHeader is defined in
497+
/// flang/include/flang/Runtime/ragged.h.
497498
mlir::TupleType getRaggedArrayHeaderType(fir::FirOpBuilder &builder);
498499

499500
/// Generate the, possibly dynamic, LEN of a CHARACTER. \p arrLoad determines

flang/include/flang/Runtime/ragged.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ namespace Fortran::runtime {
1919
// structure. It contains a pair in `flags` to indicate if the header points to
2020
// an array of headers (isIndirection) or data elements and the rank of the
2121
// pointed-to array. The rank is the length of the extents vector accessed
22-
// through `extentPointer`. The `bufferPointer` is overloaded and is null,
23-
// points to an array of headers (isIndirection), or data.
22+
// through `extentPointer`. The `bufferPointer` is overloaded
23+
// and is null, points to an array of headers (isIndirection), or data.
2424
// By default, a header is set to zero, which is its unused state.
2525
// The layout of a ragged buffer header is mirrored in the compiler.
2626
struct RaggedArrayHeader {
27-
std::uint64_t flags{0u};
28-
void *bufferPointer{nullptr};
29-
std::int64_t *extentPointer{nullptr};
27+
std::uint64_t flags;
28+
void *bufferPointer;
29+
std::int64_t *extentPointer;
3030
};
3131

3232
RaggedArrayHeader *RaggedArrayAllocate(

flang/lib/Optimizer/Builder/FIRBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,7 @@ void fir::factory::genRecordAssignment(fir::FirOpBuilder &builder,
10141014

10151015
mlir::TupleType
10161016
fir::factory::getRaggedArrayHeaderType(fir::FirOpBuilder &builder) {
1017-
auto i64Ty = builder.getIntegerType(64);
1017+
mlir::IntegerType i64Ty = builder.getIntegerType(64);
10181018
auto arrTy = fir::SequenceType::get(builder.getIntegerType(8), 1);
10191019
auto buffTy = fir::HeapType::get(arrTy);
10201020
auto extTy = fir::SequenceType::get(i64Ty, 1);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ void fir::runtime::genRaggedArrayAllocate(mlir::Location loc,
2929
static_cast<fir::SequenceType::Extent>(rank)};
3030
auto extentTy = fir::SequenceType::get(shape, i64Ty);
3131
auto refTy = fir::ReferenceType::get(i64Ty);
32+
// Position of the bufferPointer in the header struct.
3233
auto one = builder.createIntegerConstant(loc, i32Ty, 1);
3334
auto eleTy = fir::unwrapSequenceType(fir::unwrapRefType(header.getType()));
3435
auto ptrTy = builder.getRefType(eleTy.cast<mlir::TupleType>().getType(1));

flang/runtime/ragged.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ inline std::size_t rank(const RaggedArrayHeader *const header) {
2222
RaggedArrayHeader *RaggedArrayAllocate(RaggedArrayHeader *header, bool isHeader,
2323
std::int64_t rank, std::int64_t elementSize, std::int64_t *extentVector) {
2424
if (header && rank) {
25-
std::int64_t size = 1;
25+
std::int64_t size{1};
2626
for (std::int64_t counter{0}; counter < rank; ++counter) {
2727
size *= extentVector[counter];
2828
if (size <= 0) {
@@ -32,7 +32,7 @@ RaggedArrayHeader *RaggedArrayAllocate(RaggedArrayHeader *header, bool isHeader,
3232
header->flags = (rank << 1) | isHeader;
3333
header->extentPointer = extentVector;
3434
if (isHeader) {
35-
header->bufferPointer = new RaggedArrayHeader[size];
35+
header->bufferPointer = std::calloc(sizeof(RaggedArrayHeader), size);
3636
} else {
3737
header->bufferPointer =
3838
static_cast<void *>(std::calloc(elementSize, size));

flang/test/Lower/nested-where.f90

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,4 +327,3 @@ program nested_where
327327
! CHECK: return
328328
! CHECK: }
329329
end program nested_where
330-
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//===- RaggedTest.cpp -- Ragged array runtime function builder unit tests -===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "flang/Optimizer/Builder/Runtime/Ragged.h"
10+
#include "RuntimeCallTestBase.h"
11+
#include "gtest/gtest.h"
12+
13+
TEST_F(RuntimeCallTest, genRaggedArrayAllocateTest) {
14+
auto loc = firBuilder->getUnknownLoc();
15+
mlir::TupleType headerTy =
16+
fir::factory::getRaggedArrayHeaderType(*firBuilder);
17+
mlir::Value header = firBuilder->create<fir::UndefOp>(loc, headerTy);
18+
mlir::Value eleSize = firBuilder->createIntegerConstant(loc, i32Ty, 1);
19+
mlir::Value extent = firBuilder->createIntegerConstant(loc, i32Ty, 1);
20+
// Use a dummy header just to test the correctness of the generated call.
21+
fir::runtime::genRaggedArrayAllocate(
22+
loc, *firBuilder, header, false, eleSize, {extent});
23+
checkCallOpFromResultBox(
24+
eleSize, "_FortranARaggedArrayAllocate", 5, /*addLocArgs=*/false);
25+
}
26+
27+
TEST_F(RuntimeCallTest, genRaggedArrayDeallocateTest) {
28+
auto loc = firBuilder->getUnknownLoc();
29+
mlir::TupleType headerTy =
30+
fir::factory::getRaggedArrayHeaderType(*firBuilder);
31+
// Use a dummy header just to test the correctness of the generated call.
32+
mlir::Value header = firBuilder->create<fir::UndefOp>(loc, headerTy);
33+
fir::runtime::genRaggedArrayDeallocate(loc, *firBuilder, header);
34+
checkCallOpFromResultBox(
35+
header, "_FortranARaggedArrayDeallocate", 1, /*addLocArgs=*/false);
36+
}

flang/unittests/Optimizer/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ add_flang_unittest(FlangOptimizerTests
1414
Builder/DoLoopHelperTest.cpp
1515
Builder/FIRBuilderTest.cpp
1616
Builder/Runtime/AssignTest.cpp
17+
Builder/Runtime/RaggedTest.cpp
1718
Builder/Runtime/ReductionTest.cpp
1819
Builder/Runtime/TransformationalTest.cpp
1920
FIRContextTest.cpp

flang/unittests/Runtime/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ add_flang_unittest(FlangRuntimeTests
1111
Namelist.cpp
1212
Numeric.cpp
1313
NumericalFormatTest.cpp
14+
Ragged.cpp
1415
Random.cpp
1516
Reduction.cpp
1617
RuntimeCrashTest.cpp

flang/unittests/Runtime/Ragged.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//===-- flang/unittests/Runtime/Ragged.cpp ----------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "flang/Runtime/ragged.h"
10+
#include "gtest/gtest.h"
11+
12+
using namespace Fortran::runtime;
13+
14+
TEST(Ragged, RaggedArrayAllocateDeallocateTest) {
15+
struct RaggedArrayHeader header;
16+
unsigned rank = 2;
17+
int64_t *extents = new int64_t[2];
18+
extents[0] = 10;
19+
extents[1] = 100;
20+
RaggedArrayHeader *ret = (RaggedArrayHeader *)_FortranARaggedArrayAllocate(
21+
&header, false, rank, 32, extents);
22+
EXPECT_TRUE(ret != nullptr);
23+
EXPECT_TRUE(ret->bufferPointer != nullptr);
24+
EXPECT_EQ(extents, ret->extentPointer);
25+
EXPECT_EQ(10, ret->extentPointer[0]);
26+
EXPECT_EQ(100, ret->extentPointer[1]);
27+
EXPECT_EQ(rank, ret->flags >> 1);
28+
EXPECT_FALSE(ret->flags & 1);
29+
30+
_FortranARaggedArrayDeallocate(ret);
31+
EXPECT_EQ(0u, ret->flags);
32+
}

0 commit comments

Comments
 (0)