Skip to content

Commit 8158d45

Browse files
authored
Sync back XArrayCoorOp and XEmboxOp conversion passtern (#1329)
1 parent 58a7b8e commit 8158d45

File tree

3 files changed

+394
-25
lines changed

3 files changed

+394
-25
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,10 @@ class FIROpConversion : public mlir::OpConversionPattern<FromOp> {
196196
mlir::ConversionPatternRewriter &rewriter) const {
197197
auto idxTy = lowerTy().indexType();
198198
auto c0 = genConstantOffset(loc, rewriter, 0);
199-
auto c7 = genConstantOffset(loc, rewriter, 7);
199+
auto cDims = genConstantOffset(loc, rewriter, kDimsPosInBox);
200200
auto dimValue = genConstantIndex(loc, idxTy, rewriter, dim);
201-
return loadFromOffset(loc, box, c0, c7, dimValue, 2, idxTy, rewriter);
201+
return loadFromOffset(loc, box, c0, cDims, dimValue, kDimStridePos, idxTy,
202+
rewriter);
202203
}
203204

204205
/// Read base address from a fir.box. Returned address has type ty.
@@ -1388,34 +1389,34 @@ struct XEmboxOpConversion : public EmboxCommonConversion<fir::cg::XEmboxOp> {
13881389
operands.drop_front(xbox.lenParamOffset()));
13891390
// Generate the triples in the dims field of the descriptor
13901391
auto i64Ty = mlir::IntegerType::get(xbox.getContext(), 64);
1391-
auto base = operands[0];
1392+
mlir::Value base = operands[0];
13921393
assert(!xbox.shape().empty() && "must have a shape");
1393-
unsigned shapeOff = xbox.shapeOffset();
1394+
unsigned shapeOffset = xbox.shapeOffset();
13941395
bool hasShift = !xbox.shift().empty();
1395-
unsigned shiftOff = xbox.shiftOffset();
1396+
unsigned shiftOffset = xbox.shiftOffset();
13961397
bool hasSlice = !xbox.slice().empty();
1397-
unsigned sliceOff = xbox.sliceOffset();
1398-
auto loc = xbox.getLoc();
1398+
unsigned sliceOffset = xbox.sliceOffset();
1399+
mlir::Location loc = xbox.getLoc();
13991400
mlir::Value zero = genConstantIndex(loc, i64Ty, rewriter, 0);
14001401
mlir::Value one = genConstantIndex(loc, i64Ty, rewriter, 1);
14011402
mlir::Value prevDim = integerCast(loc, rewriter, i64Ty, eleSize);
14021403
mlir::Value prevPtrOff = one;
1403-
auto eleTy = boxTy.getEleTy();
1404-
const auto rank = xbox.getRank();
1404+
mlir::Type eleTy = boxTy.getEleTy();
1405+
const unsigned rank = xbox.getRank();
14051406
llvm::SmallVector<mlir::Value> gepArgs;
14061407
unsigned constRows = 0;
14071408
mlir::Value ptrOffset = zero;
1408-
auto memEleTy = fir::dyn_cast_ptrEleTy(xbox.memref().getType());
1409+
mlir::Type memEleTy = fir::dyn_cast_ptrEleTy(xbox.memref().getType());
14091410
assert(memEleTy.isa<fir::SequenceType>());
14101411
auto seqTy = memEleTy.cast<fir::SequenceType>();
1411-
auto seqEleTy = seqTy.getEleTy();
1412+
mlir::Type seqEleTy = seqTy.getEleTy();
14121413
// Adjust the element scaling factor if the element is a dependent type.
14131414
if (fir::hasDynamicSize(seqEleTy)) {
14141415
if (auto charTy = seqEleTy.dyn_cast<fir::CharacterType>()) {
14151416
assert(xbox.lenParams().size() == 1);
1416-
auto charSize = genConstantIndex(
1417+
mlir::LLVM::ConstantOp charSize = genConstantIndex(
14171418
loc, i64Ty, rewriter, lowerTy().characterBitsize(charTy) / 8);
1418-
auto castedLen =
1419+
mlir::Value castedLen =
14191420
integerCast(loc, rewriter, i64Ty, operands[xbox.lenParamOffset()]);
14201421
auto byteOffset =
14211422
rewriter.create<mlir::LLVM::MulOp>(loc, i64Ty, charSize, castedLen);
@@ -1455,14 +1456,14 @@ struct XEmboxOpConversion : public EmboxCommonConversion<fir::cg::XEmboxOp> {
14551456
// translating everything to values in the descriptor wherever the entity
14561457
// has a dynamic array dimension.
14571458
for (unsigned di = 0, descIdx = 0; di < rank; ++di) {
1458-
mlir::Value extent = operands[shapeOff];
1459+
mlir::Value extent = operands[shapeOffset];
14591460
mlir::Value outerExtent = extent;
14601461
bool skipNext = false;
14611462
if (hasSlice) {
1462-
auto off = operands[sliceOff];
1463+
auto off = operands[sliceOffset];
14631464
auto adj = one;
14641465
if (hasShift)
1465-
adj = operands[shiftOff];
1466+
adj = operands[shiftOffset];
14661467
auto ao = rewriter.create<mlir::LLVM::SubOp>(loc, i64Ty, off, adj);
14671468
if (constRows > 0) {
14681469
gepArgs.push_back(ao);
@@ -1494,21 +1495,21 @@ struct XEmboxOpConversion : public EmboxCommonConversion<fir::cg::XEmboxOp> {
14941495
// then use the value from the shift op as the lower bound.
14951496
if (hasShift &&
14961497
(isaPointerOrAllocatable || !normalizedLowerBound(xbox)))
1497-
lb = operands[shiftOff];
1498+
lb = operands[shiftOffset];
14981499
dest = insertLowerBound(rewriter, loc, dest, descIdx, lb);
14991500

15001501
// store extent
15011502
if (hasSlice)
1502-
extent = computeTripletExtent(rewriter, loc, operands[sliceOff],
1503-
operands[sliceOff + 1],
1504-
operands[sliceOff + 2], zero, i64Ty);
1503+
extent = computeTripletExtent(rewriter, loc, operands[sliceOffset],
1504+
operands[sliceOffset + 1],
1505+
operands[sliceOffset + 2], zero, i64Ty);
15051506
dest = insertExtent(rewriter, loc, dest, descIdx, extent);
15061507

15071508
// store step (scaled by shaped extent)
15081509
mlir::Value step = (hasSubcomp || hasSubstr) ? stepExpr : prevDim;
15091510
if (hasSlice)
15101511
step = rewriter.create<mlir::LLVM::MulOp>(loc, i64Ty, step,
1511-
operands[sliceOff + 2]);
1512+
operands[sliceOffset + 2]);
15121513
dest = insertStride(rewriter, loc, dest, descIdx, step);
15131514
++descIdx;
15141515
}
@@ -1521,11 +1522,11 @@ struct XEmboxOpConversion : public EmboxCommonConversion<fir::cg::XEmboxOp> {
15211522
outerExtent);
15221523

15231524
// increment iterators
1524-
++shapeOff;
1525+
++shapeOffset;
15251526
if (hasShift)
1526-
++shiftOff;
1527+
++shiftOffset;
15271528
if (hasSlice)
1528-
sliceOff += 3;
1529+
sliceOffset += 3;
15291530
}
15301531
if (hasSlice || hasSubcomp || hasSubstr) {
15311532
llvm::SmallVector<mlir::Value> args = {base, ptrOffset};
@@ -1543,7 +1544,7 @@ struct XEmboxOpConversion : public EmboxCommonConversion<fir::cg::XEmboxOp> {
15431544
}
15441545
base = rewriter.create<mlir::LLVM::GEPOp>(loc, base.getType(), args);
15451546
if (hasSubstr)
1546-
base = shiftSubstringBase(rewriter, loc, base, xbox.substr()[0]);
1547+
base = shiftSubstringBase(rewriter, loc, base, operands[xbox.substrOffset()]);
15471548
}
15481549
dest = insertBaseAddress(rewriter, loc, dest, base);
15491550
if (isDerivedTypeWithLenParams(boxTy))

flang/lib/Optimizer/CodeGen/TypeConverter.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ static constexpr unsigned kF18AddendumPosInBox = 6;
3434
static constexpr unsigned kDimsPosInBox = 7;
3535
static constexpr unsigned kOptTypePtrPosInBox = 8;
3636
static constexpr unsigned kOptRowTypePosInBox = 9;
37+
// Position of the different values in [dims]
38+
static constexpr unsigned kDimLowerBoundPos = 0;
39+
static constexpr unsigned kDimExtentPos = 1;
40+
static constexpr unsigned kDimStridePos = 2;
3741

3842
namespace fir {
3943

0 commit comments

Comments
 (0)