@@ -87,14 +87,6 @@ static inline mlir::Type getI8Type(mlir::MLIRContext *context) {
87
87
return mlir::IntegerType::get (context, 8 );
88
88
}
89
89
90
- static mlir::LLVM::ConstantOp
91
- genConstantIndex (mlir::Location loc, mlir::Type ity,
92
- mlir::ConversionPatternRewriter &rewriter,
93
- std::int64_t offset) {
94
- auto cattr = rewriter.getI64IntegerAttr (offset);
95
- return mlir::LLVM::ConstantOp::create (rewriter, loc, ity, cattr);
96
- }
97
-
98
90
static mlir::Block *createBlock (mlir::ConversionPatternRewriter &rewriter,
99
91
mlir::Block *insertBefore) {
100
92
assert (insertBefore && " expected valid insertion block" );
@@ -208,39 +200,6 @@ getDependentTypeMemSizeFn(fir::RecordType recTy, fir::AllocaOp op,
208
200
TODO (op.getLoc (), " did not find allocation function" );
209
201
}
210
202
211
- // Compute the alloc scale size (constant factors encoded in the array type).
212
- // We do this for arrays without a constant interior or arrays of character with
213
- // dynamic length arrays, since those are the only ones that get decayed to a
214
- // pointer to the element type.
215
- template <typename OP>
216
- static mlir::Value
217
- genAllocationScaleSize (OP op, mlir::Type ity,
218
- mlir::ConversionPatternRewriter &rewriter) {
219
- mlir::Location loc = op.getLoc ();
220
- mlir::Type dataTy = op.getInType ();
221
- auto seqTy = mlir::dyn_cast<fir::SequenceType>(dataTy);
222
- fir::SequenceType::Extent constSize = 1 ;
223
- if (seqTy) {
224
- int constRows = seqTy.getConstantRows ();
225
- const fir::SequenceType::ShapeRef &shape = seqTy.getShape ();
226
- if (constRows != static_cast <int >(shape.size ())) {
227
- for (auto extent : shape) {
228
- if (constRows-- > 0 )
229
- continue ;
230
- if (extent != fir::SequenceType::getUnknownExtent ())
231
- constSize *= extent;
232
- }
233
- }
234
- }
235
-
236
- if (constSize != 1 ) {
237
- mlir::Value constVal{
238
- genConstantIndex (loc, ity, rewriter, constSize).getResult ()};
239
- return constVal;
240
- }
241
- return nullptr ;
242
- }
243
-
244
203
namespace {
245
204
struct DeclareOpConversion : public fir ::FIROpConversion<fir::cg::XDeclareOp> {
246
205
public:
@@ -275,7 +234,7 @@ struct AllocaOpConversion : public fir::FIROpConversion<fir::AllocaOp> {
275
234
auto loc = alloc.getLoc ();
276
235
mlir::Type ity = lowerTy ().indexType ();
277
236
unsigned i = 0 ;
278
- mlir::Value size = genConstantIndex (loc, ity, rewriter, 1 ).getResult ();
237
+ mlir::Value size = fir:: genConstantIndex (loc, ity, rewriter, 1 ).getResult ();
279
238
mlir::Type firObjType = fir::unwrapRefType (alloc.getType ());
280
239
mlir::Type llvmObjectType = convertObjectType (firObjType);
281
240
if (alloc.hasLenParams ()) {
@@ -307,7 +266,7 @@ struct AllocaOpConversion : public fir::FIROpConversion<fir::AllocaOp> {
307
266
<< scalarType << " with type parameters" ;
308
267
}
309
268
}
310
- if (auto scaleSize = genAllocationScaleSize (alloc, ity, rewriter))
269
+ if (auto scaleSize = fir:: genAllocationScaleSize (alloc, ity, rewriter))
311
270
size =
312
271
rewriter.createOrFold <mlir::LLVM::MulOp>(loc, ity, size, scaleSize);
313
272
if (alloc.hasShapeOperands ()) {
@@ -484,7 +443,7 @@ struct BoxIsArrayOpConversion : public fir::FIROpConversion<fir::BoxIsArrayOp> {
484
443
auto loc = boxisarray.getLoc ();
485
444
TypePair boxTyPair = getBoxTypePair (boxisarray.getVal ().getType ());
486
445
mlir::Value rank = getRankFromBox (loc, boxTyPair, a, rewriter);
487
- mlir::Value c0 = genConstantIndex (loc, rank.getType (), rewriter, 0 );
446
+ mlir::Value c0 = fir:: genConstantIndex (loc, rank.getType (), rewriter, 0 );
488
447
rewriter.replaceOpWithNewOp <mlir::LLVM::ICmpOp>(
489
448
boxisarray, mlir::LLVM::ICmpPredicate::ne, rank, c0);
490
449
return mlir::success ();
@@ -820,7 +779,7 @@ struct ConvertOpConversion : public fir::FIROpConversion<fir::ConvertOp> {
820
779
// Do folding for constant inputs.
821
780
if (auto constVal = fir::getIntIfConstant (op0)) {
822
781
mlir::Value normVal =
823
- genConstantIndex (loc, toTy, rewriter, *constVal ? 1 : 0 );
782
+ fir:: genConstantIndex (loc, toTy, rewriter, *constVal ? 1 : 0 );
824
783
rewriter.replaceOp (convert, normVal);
825
784
return mlir::success ();
826
785
}
@@ -833,7 +792,7 @@ struct ConvertOpConversion : public fir::FIROpConversion<fir::ConvertOp> {
833
792
}
834
793
835
794
// Compare the input with zero.
836
- mlir::Value zero = genConstantIndex (loc, fromTy, rewriter, 0 );
795
+ mlir::Value zero = fir:: genConstantIndex (loc, fromTy, rewriter, 0 );
837
796
auto isTrue = mlir::LLVM::ICmpOp::create (
838
797
rewriter, loc, mlir::LLVM::ICmpPredicate::ne, op0, zero);
839
798
@@ -1082,21 +1041,6 @@ static mlir::SymbolRefAttr getMalloc(fir::AllocMemOp op,
1082
1041
return getMallocInModule (mod, op, rewriter, indexType);
1083
1042
}
1084
1043
1085
- // / Helper function for generating the LLVM IR that computes the distance
1086
- // / in bytes between adjacent elements pointed to by a pointer
1087
- // / of type \p ptrTy. The result is returned as a value of \p idxTy integer
1088
- // / type.
1089
- static mlir::Value
1090
- computeElementDistance (mlir::Location loc, mlir::Type llvmObjectType,
1091
- mlir::Type idxTy,
1092
- mlir::ConversionPatternRewriter &rewriter,
1093
- const mlir::DataLayout &dataLayout) {
1094
- llvm::TypeSize size = dataLayout.getTypeSize (llvmObjectType);
1095
- unsigned short alignment = dataLayout.getTypeABIAlignment (llvmObjectType);
1096
- std::int64_t distance = llvm::alignTo (size, alignment);
1097
- return genConstantIndex (loc, idxTy, rewriter, distance);
1098
- }
1099
-
1100
1044
// / Return value of the stride in bytes between adjacent elements
1101
1045
// / of LLVM type \p llTy. The result is returned as a value of
1102
1046
// / \p idxTy integer type.
@@ -1105,7 +1049,7 @@ genTypeStrideInBytes(mlir::Location loc, mlir::Type idxTy,
1105
1049
mlir::ConversionPatternRewriter &rewriter, mlir::Type llTy,
1106
1050
const mlir::DataLayout &dataLayout) {
1107
1051
// Create a pointer type and use computeElementDistance().
1108
- return computeElementDistance (loc, llTy, idxTy, rewriter, dataLayout);
1052
+ return fir:: computeElementDistance (loc, llTy, idxTy, rewriter, dataLayout);
1109
1053
}
1110
1054
1111
1055
namespace {
@@ -1124,8 +1068,8 @@ struct AllocMemOpConversion : public fir::FIROpConversion<fir::AllocMemOp> {
1124
1068
if (fir::isRecordWithTypeParameters (fir::unwrapSequenceType (dataTy)))
1125
1069
TODO (loc, " fir.allocmem codegen of derived type with length parameters" );
1126
1070
mlir::Value size = genTypeSizeInBytes (loc, ity, rewriter, llvmObjectTy);
1127
- if (auto scaleSize = genAllocationScaleSize (heap, ity, rewriter))
1128
- size = mlir::LLVM::MulOp::create (rewriter, loc, ity, size, scaleSize);
1071
+ if (auto scaleSize = fir:: genAllocationScaleSize (heap, ity, rewriter))
1072
+ size = rewriter. create < mlir::LLVM::MulOp>( loc, ity, size, scaleSize);
1129
1073
for (mlir::Value opnd : adaptor.getOperands ())
1130
1074
size = mlir::LLVM::MulOp::create (rewriter, loc, ity, size,
1131
1075
integerCast (loc, rewriter, ity, opnd));
@@ -1157,7 +1101,8 @@ struct AllocMemOpConversion : public fir::FIROpConversion<fir::AllocMemOp> {
1157
1101
mlir::Value genTypeSizeInBytes (mlir::Location loc, mlir::Type idxTy,
1158
1102
mlir::ConversionPatternRewriter &rewriter,
1159
1103
mlir::Type llTy) const {
1160
- return computeElementDistance (loc, llTy, idxTy, rewriter, getDataLayout ());
1104
+ return fir::computeElementDistance (loc, llTy, idxTy, rewriter,
1105
+ getDataLayout ());
1161
1106
}
1162
1107
};
1163
1108
} // namespace
@@ -1343,7 +1288,7 @@ genCUFAllocDescriptor(mlir::Location loc,
1343
1288
mlir::Type structTy = typeConverter.convertBoxTypeAsStruct (boxTy);
1344
1289
std::size_t boxSize = dl->getTypeSizeInBits (structTy) / 8 ;
1345
1290
mlir::Value sizeInBytes =
1346
- genConstantIndex (loc, llvmIntPtrType, rewriter, boxSize);
1291
+ fir:: genConstantIndex (loc, llvmIntPtrType, rewriter, boxSize);
1347
1292
llvm::SmallVector args = {sizeInBytes, sourceFile, sourceLine};
1348
1293
return rewriter
1349
1294
.create <mlir::LLVM::CallOp>(loc, fctTy, RTNAME_STRING (CUFAllocDescriptor),
@@ -1599,7 +1544,7 @@ struct EmboxCommonConversion : public fir::FIROpConversion<OP> {
1599
1544
// representation of derived types with pointer/allocatable components.
1600
1545
// This has been seen in hashing algorithms using TRANSFER.
1601
1546
mlir::Value zero =
1602
- genConstantIndex (loc, rewriter.getI64Type (), rewriter, 0 );
1547
+ fir:: genConstantIndex (loc, rewriter.getI64Type (), rewriter, 0 );
1603
1548
descriptor = insertField (rewriter, loc, descriptor,
1604
1549
{getLenParamFieldId (boxTy), 0 }, zero);
1605
1550
}
@@ -1944,8 +1889,8 @@ struct XEmboxOpConversion : public EmboxCommonConversion<fir::cg::XEmboxOp> {
1944
1889
bool hasSlice = !xbox.getSlice ().empty ();
1945
1890
unsigned sliceOffset = xbox.getSliceOperandIndex ();
1946
1891
mlir::Location loc = xbox.getLoc ();
1947
- mlir::Value zero = genConstantIndex (loc, i64Ty, rewriter, 0 );
1948
- mlir::Value one = genConstantIndex (loc, i64Ty, rewriter, 1 );
1892
+ mlir::Value zero = fir:: genConstantIndex (loc, i64Ty, rewriter, 0 );
1893
+ mlir::Value one = fir:: genConstantIndex (loc, i64Ty, rewriter, 1 );
1949
1894
mlir::Value prevPtrOff = one;
1950
1895
mlir::Type eleTy = boxTy.getEleTy ();
1951
1896
const unsigned rank = xbox.getRank ();
@@ -1994,7 +1939,7 @@ struct XEmboxOpConversion : public EmboxCommonConversion<fir::cg::XEmboxOp> {
1994
1939
prevDimByteStride =
1995
1940
getCharacterByteSize (loc, rewriter, charTy, adaptor.getLenParams ());
1996
1941
} else {
1997
- prevDimByteStride = genConstantIndex (
1942
+ prevDimByteStride = fir:: genConstantIndex (
1998
1943
loc, i64Ty, rewriter,
1999
1944
charTy.getLen () * lowerTy ().characterBitsize (charTy) / 8 );
2000
1945
}
@@ -2152,7 +2097,7 @@ struct XReboxOpConversion : public EmboxCommonConversion<fir::cg::XReboxOp> {
2152
2097
if (auto charTy = mlir::dyn_cast<fir::CharacterType>(inputEleTy)) {
2153
2098
if (charTy.hasConstantLen ()) {
2154
2099
mlir::Value len =
2155
- genConstantIndex (loc, idxTy, rewriter, charTy.getLen ());
2100
+ fir:: genConstantIndex (loc, idxTy, rewriter, charTy.getLen ());
2156
2101
lenParams.emplace_back (len);
2157
2102
} else {
2158
2103
mlir::Value len = getElementSizeFromBox (loc, idxTy, inputBoxTyPair,
@@ -2161,7 +2106,7 @@ struct XReboxOpConversion : public EmboxCommonConversion<fir::cg::XReboxOp> {
2161
2106
assert (!isInGlobalOp (rewriter) &&
2162
2107
" character target in global op must have constant length" );
2163
2108
mlir::Value width =
2164
- genConstantIndex (loc, idxTy, rewriter, charTy.getFKind ());
2109
+ fir:: genConstantIndex (loc, idxTy, rewriter, charTy.getFKind ());
2165
2110
len = mlir::LLVM::SDivOp::create (rewriter, loc, idxTy, len, width);
2166
2111
}
2167
2112
lenParams.emplace_back (len);
@@ -2215,8 +2160,9 @@ struct XReboxOpConversion : public EmboxCommonConversion<fir::cg::XReboxOp> {
2215
2160
mlir::ConversionPatternRewriter &rewriter) const {
2216
2161
mlir::Location loc = rebox.getLoc ();
2217
2162
mlir::Value zero =
2218
- genConstantIndex (loc, lowerTy ().indexType (), rewriter, 0 );
2219
- mlir::Value one = genConstantIndex (loc, lowerTy ().indexType (), rewriter, 1 );
2163
+ fir::genConstantIndex (loc, lowerTy ().indexType (), rewriter, 0 );
2164
+ mlir::Value one =
2165
+ fir::genConstantIndex (loc, lowerTy ().indexType (), rewriter, 1 );
2220
2166
for (auto iter : llvm::enumerate (llvm::zip (extents, strides))) {
2221
2167
mlir::Value extent = std::get<0 >(iter.value ());
2222
2168
unsigned dim = iter.index ();
@@ -2249,7 +2195,7 @@ struct XReboxOpConversion : public EmboxCommonConversion<fir::cg::XReboxOp> {
2249
2195
mlir::Location loc = rebox.getLoc ();
2250
2196
mlir::Type byteTy = ::getI8Type (rebox.getContext ());
2251
2197
mlir::Type idxTy = lowerTy ().indexType ();
2252
- mlir::Value zero = genConstantIndex (loc, idxTy, rewriter, 0 );
2198
+ mlir::Value zero = fir:: genConstantIndex (loc, idxTy, rewriter, 0 );
2253
2199
// Apply subcomponent and substring shift on base address.
2254
2200
if (!rebox.getSubcomponent ().empty () || !rebox.getSubstr ().empty ()) {
2255
2201
// Cast to inputEleTy* so that a GEP can be used.
@@ -2277,7 +2223,7 @@ struct XReboxOpConversion : public EmboxCommonConversion<fir::cg::XReboxOp> {
2277
2223
// and strides.
2278
2224
llvm::SmallVector<mlir::Value> slicedExtents;
2279
2225
llvm::SmallVector<mlir::Value> slicedStrides;
2280
- mlir::Value one = genConstantIndex (loc, idxTy, rewriter, 1 );
2226
+ mlir::Value one = fir:: genConstantIndex (loc, idxTy, rewriter, 1 );
2281
2227
const bool sliceHasOrigins = !rebox.getShift ().empty ();
2282
2228
unsigned sliceOps = rebox.getSliceOperandIndex ();
2283
2229
unsigned shiftOps = rebox.getShiftOperandIndex ();
@@ -2350,7 +2296,7 @@ struct XReboxOpConversion : public EmboxCommonConversion<fir::cg::XReboxOp> {
2350
2296
// which may be OK if all new extents are ones, the stride does not
2351
2297
// matter, use one.
2352
2298
mlir::Value stride = inputStrides.empty ()
2353
- ? genConstantIndex (loc, idxTy, rewriter, 1 )
2299
+ ? fir:: genConstantIndex (loc, idxTy, rewriter, 1 )
2354
2300
: inputStrides[0 ];
2355
2301
for (unsigned i = 0 ; i < rebox.getShape ().size (); ++i) {
2356
2302
mlir::Value rawExtent = operands[rebox.getShapeOperandIndex () + i];
@@ -2585,9 +2531,9 @@ struct XArrayCoorOpConversion
2585
2531
unsigned shiftOffset = coor.getShiftOperandIndex ();
2586
2532
unsigned sliceOffset = coor.getSliceOperandIndex ();
2587
2533
auto sliceOps = coor.getSlice ().begin ();
2588
- mlir::Value one = genConstantIndex (loc, idxTy, rewriter, 1 );
2534
+ mlir::Value one = fir:: genConstantIndex (loc, idxTy, rewriter, 1 );
2589
2535
mlir::Value prevExt = one;
2590
- mlir::Value offset = genConstantIndex (loc, idxTy, rewriter, 0 );
2536
+ mlir::Value offset = fir:: genConstantIndex (loc, idxTy, rewriter, 0 );
2591
2537
const bool isShifted = !coor.getShift ().empty ();
2592
2538
const bool isSliced = !coor.getSlice ().empty ();
2593
2539
const bool baseIsBoxed =
@@ -2918,7 +2864,7 @@ struct CoordinateOpConversion
2918
2864
// of lower bound aspects. This both accounts for dynamically sized
2919
2865
// types and non contiguous arrays.
2920
2866
auto idxTy = lowerTy ().indexType ();
2921
- mlir::Value off = genConstantIndex (loc, idxTy, rewriter, 0 );
2867
+ mlir::Value off = fir:: genConstantIndex (loc, idxTy, rewriter, 0 );
2922
2868
unsigned arrayDim = arrTy.getDimension ();
2923
2869
for (unsigned dim = 0 ; dim < arrayDim && it != end; ++dim, ++it) {
2924
2870
mlir::Value stride =
@@ -3837,7 +3783,7 @@ struct IsPresentOpConversion : public fir::FIROpConversion<fir::IsPresentOp> {
3837
3783
ptr = mlir::LLVM::ExtractValueOp::create (rewriter, loc, ptr, 0 );
3838
3784
}
3839
3785
mlir::LLVM::ConstantOp c0 =
3840
- genConstantIndex (isPresent.getLoc (), idxTy, rewriter, 0 );
3786
+ fir:: genConstantIndex (isPresent.getLoc (), idxTy, rewriter, 0 );
3841
3787
auto addr = mlir::LLVM::PtrToIntOp::create (rewriter, loc, idxTy, ptr);
3842
3788
rewriter.replaceOpWithNewOp <mlir::LLVM::ICmpOp>(
3843
3789
isPresent, mlir::LLVM::ICmpPredicate::ne, addr, c0);
0 commit comments