@@ -296,105 +296,6 @@ struct ZeroOpConversion : public FIROpConversion<fir::ZeroOp> {
296
296
}
297
297
};
298
298
299
- // Code shared between insert_value and extract_value Ops.
300
- struct ValueOpCommon {
301
- // Translate the arguments pertaining to any multidimensional array to
302
- // row-major order for LLVM-IR.
303
- static void toRowMajor (SmallVectorImpl<mlir::Attribute> &attrs,
304
- mlir::Type ty) {
305
- assert (ty && " type is null" );
306
- const auto end = attrs.size ();
307
- for (std::remove_const_t <decltype (end)> i = 0 ; i < end; ++i) {
308
- if (auto seq = ty.dyn_cast <mlir::LLVM::LLVMArrayType>()) {
309
- const auto dim = getDimension (seq);
310
- if (dim > 1 ) {
311
- auto ub = std::min (i + dim, end);
312
- std::reverse (attrs.begin () + i, attrs.begin () + ub);
313
- i += dim - 1 ;
314
- }
315
- ty = getArrayElementType (seq);
316
- } else if (auto st = ty.dyn_cast <mlir::LLVM::LLVMStructType>()) {
317
- ty = st.getBody ()[attrs[i].cast <mlir::IntegerAttr>().getInt ()];
318
- } else {
319
- llvm_unreachable (" index into invalid type" );
320
- }
321
- }
322
- }
323
-
324
- static llvm::SmallVector<mlir::Attribute>
325
- collectIndices (mlir::ConversionPatternRewriter &rewriter,
326
- mlir::ArrayAttr arrAttr) {
327
- llvm::SmallVector<mlir::Attribute> attrs;
328
- for (auto i = arrAttr.begin (), e = arrAttr.end (); i != e; ++i) {
329
- if (i->isa <mlir::IntegerAttr>()) {
330
- attrs.push_back (*i);
331
- } else {
332
- auto fieldName = i->cast <mlir::StringAttr>().getValue ();
333
- ++i;
334
- auto ty = i->cast <mlir::TypeAttr>().getValue ();
335
- auto index = ty.cast <fir::RecordType>().getFieldIndex (fieldName);
336
- attrs.push_back (mlir::IntegerAttr::get (rewriter.getI32Type (), index));
337
- }
338
- }
339
- return attrs;
340
- }
341
-
342
- private:
343
- static unsigned getDimension (mlir::LLVM::LLVMArrayType ty) {
344
- unsigned result = 1 ;
345
- for (auto eleTy = ty.getElementType ().dyn_cast <mlir::LLVM::LLVMArrayType>();
346
- eleTy;
347
- eleTy = eleTy.getElementType ().dyn_cast <mlir::LLVM::LLVMArrayType>())
348
- ++result;
349
- return result;
350
- }
351
-
352
- static mlir::Type getArrayElementType (mlir::LLVM::LLVMArrayType ty) {
353
- auto eleTy = ty.getElementType ();
354
- while (auto arrTy = eleTy.dyn_cast <mlir::LLVM::LLVMArrayType>())
355
- eleTy = arrTy.getElementType ();
356
- return eleTy;
357
- }
358
- };
359
-
360
- // / Extract a subobject value from an ssa-value of aggregate type
361
- struct ExtractValueOpConversion
362
- : public FIROpAndTypeConversion<fir::ExtractValueOp>,
363
- public ValueOpCommon {
364
- using FIROpAndTypeConversion::FIROpAndTypeConversion;
365
-
366
- mlir::LogicalResult
367
- doRewrite (fir::ExtractValueOp extractVal, mlir::Type ty, OpAdaptor adaptor,
368
- mlir::ConversionPatternRewriter &rewriter) const override {
369
- auto attrs = collectIndices (rewriter, extractVal.coor ());
370
- toRowMajor (attrs, adaptor.getOperands ()[0 ].getType ());
371
- auto position = mlir::ArrayAttr::get (extractVal.getContext (), attrs);
372
- rewriter.replaceOpWithNewOp <mlir::LLVM::ExtractValueOp>(
373
- extractVal, ty, adaptor.getOperands ()[0 ], position);
374
- return success ();
375
- }
376
- };
377
-
378
- // / InsertValue is the generalized instruction for the composition of new
379
- // / aggregate type values.
380
- struct InsertValueOpConversion
381
- : public FIROpAndTypeConversion<fir::InsertValueOp>,
382
- public ValueOpCommon {
383
- using FIROpAndTypeConversion::FIROpAndTypeConversion;
384
-
385
- mlir::LogicalResult
386
- doRewrite (fir::InsertValueOp insertVal, mlir::Type ty, OpAdaptor adaptor,
387
- mlir::ConversionPatternRewriter &rewriter) const override {
388
- auto attrs = collectIndices (rewriter, insertVal.coor ());
389
- toRowMajor (attrs, adaptor.getOperands ()[0 ].getType ());
390
- auto position = mlir::ArrayAttr::get (insertVal.getContext (), attrs);
391
- rewriter.replaceOpWithNewOp <mlir::LLVM::InsertValueOp>(
392
- insertVal, ty, adaptor.getOperands ()[0 ], adaptor.getOperands ()[1 ],
393
- position);
394
- return success ();
395
- }
396
- };
397
-
398
299
// / InsertOnRange inserts a value into a sequence over a range of offsets.
399
300
struct InsertOnRangeOpConversion
400
301
: public FIROpAndTypeConversion<fir::InsertOnRangeOp> {
@@ -488,11 +389,10 @@ class FIRToLLVMLowering : public fir::FIRToLLVMLoweringBase<FIRToLLVMLowering> {
488
389
auto *context = getModule ().getContext ();
489
390
fir::LLVMTypeConverter typeConverter{getModule ()};
490
391
mlir::OwningRewritePatternList pattern (context);
491
- pattern.insert <
492
- AddrOfOpConversion, ExtractValueOpConversion, HasValueOpConversion,
493
- GlobalOpConversion, InsertOnRangeOpConversion, InsertValueOpConversion,
494
- SelectOpConversion, SelectRankOpConversion, UndefOpConversion,
495
- UnreachableOpConversion, ZeroOpConversion>(typeConverter);
392
+ pattern.insert <AddrOfOpConversion, HasValueOpConversion, GlobalOpConversion,
393
+ InsertOnRangeOpConversion, SelectOpConversion,
394
+ SelectRankOpConversion, UnreachableOpConversion,
395
+ ZeroOpConversion, UndefOpConversion>(typeConverter);
496
396
mlir::populateStdToLLVMConversionPatterns (typeConverter, pattern);
497
397
mlir::arith::populateArithmeticToLLVMConversionPatterns (typeConverter,
498
398
pattern);
0 commit comments