@@ -414,3 +414,114 @@ TEST_F(FIRBuilderTest, getExtents) {
414
414
auto readExtents = fir::factory::getExtents (builder, loc, ex);
415
415
EXPECT_EQ (2u , readExtents.size ());
416
416
}
417
+
418
+ TEST_F (FIRBuilderTest, createZeroValue) {
419
+ auto builder = getBuilder ();
420
+ auto loc = builder.getUnknownLoc ();
421
+
422
+ mlir::Type i64Ty = mlir::IntegerType::get (builder.getContext (), 64 );
423
+ mlir::Value zeroInt = fir::factory::createZeroValue (builder, loc, i64Ty);
424
+ EXPECT_TRUE (zeroInt.getType () == i64Ty);
425
+ auto cst =
426
+ mlir::dyn_cast_or_null<mlir::arith::ConstantOp>(zeroInt.getDefiningOp ());
427
+ EXPECT_TRUE (cst);
428
+ auto intAttr = cst.getValue ().dyn_cast <mlir::IntegerAttr>();
429
+ EXPECT_TRUE (intAttr && intAttr.getInt () == 0 );
430
+
431
+ mlir::Type f32Ty = mlir::FloatType::getF32 (builder.getContext ());
432
+ mlir::Value zeroFloat = fir::factory::createZeroValue (builder, loc, f32Ty);
433
+ EXPECT_TRUE (zeroFloat.getType () == f32Ty);
434
+ auto cst2 = mlir::dyn_cast_or_null<mlir::arith::ConstantOp>(
435
+ zeroFloat.getDefiningOp ());
436
+ EXPECT_TRUE (cst2);
437
+ auto floatAttr = cst2.getValue ().dyn_cast <mlir::FloatAttr>();
438
+ EXPECT_TRUE (floatAttr && floatAttr.getValueAsDouble () == 0 .);
439
+
440
+ mlir::Type boolTy = mlir::IntegerType::get (builder.getContext (), 1 );
441
+ mlir::Value flaseBool = fir::factory::createZeroValue (builder, loc, boolTy);
442
+ EXPECT_TRUE (flaseBool.getType () == boolTy);
443
+ auto cst3 = mlir::dyn_cast_or_null<mlir::arith::ConstantOp>(
444
+ flaseBool.getDefiningOp ());
445
+ EXPECT_TRUE (cst3);
446
+ auto intAttr2 = cst.getValue ().dyn_cast <mlir::IntegerAttr>();
447
+ EXPECT_TRUE (intAttr2 && intAttr2.getInt () == 0 );
448
+ }
449
+
450
+ TEST_F (FIRBuilderTest, getBaseTypeOf) {
451
+ auto builder = getBuilder ();
452
+ auto loc = builder.getUnknownLoc ();
453
+
454
+ auto makeExv = [&](mlir::Type elementType, mlir::Type arrayType)
455
+ -> std::tuple<llvm::SmallVector<fir::ExtendedValue, 4 >,
456
+ llvm::SmallVector<fir::ExtendedValue, 4 >> {
457
+ auto ptrTyArray = fir::PointerType::get (arrayType);
458
+ auto ptrTyScalar = fir::PointerType::get (elementType);
459
+ auto ptrBoxTyArray = fir::BoxType::get (ptrTyArray);
460
+ auto ptrBoxTyScalar = fir::BoxType::get (ptrTyScalar);
461
+ auto boxRefTyArray = fir::ReferenceType::get (ptrBoxTyArray);
462
+ auto boxRefTyScalar = fir::ReferenceType::get (ptrBoxTyScalar);
463
+ auto boxTyArray = fir::BoxType::get (arrayType);
464
+ auto boxTyScalar = fir::BoxType::get (elementType);
465
+
466
+ auto ptrValArray = builder.create <fir::UndefOp>(loc, ptrTyArray);
467
+ auto ptrValScalar = builder.create <fir::UndefOp>(loc, ptrTyScalar);
468
+ auto boxRefValArray = builder.create <fir::UndefOp>(loc, boxRefTyArray);
469
+ auto boxRefValScalar = builder.create <fir::UndefOp>(loc, boxRefTyScalar);
470
+ auto boxValArray = builder.create <fir::UndefOp>(loc, boxTyArray);
471
+ auto boxValScalar = builder.create <fir::UndefOp>(loc, boxTyScalar);
472
+
473
+ llvm::SmallVector<fir::ExtendedValue, 4 > scalars;
474
+ scalars.emplace_back (fir::UnboxedValue (ptrValScalar));
475
+ scalars.emplace_back (fir::BoxValue (boxValScalar));
476
+ scalars.emplace_back (
477
+ fir::MutableBoxValue (boxRefValScalar, mlir::ValueRange (), {}));
478
+
479
+ llvm::SmallVector<fir::ExtendedValue, 4 > arrays;
480
+ auto extent = builder.create <fir::UndefOp>(loc, builder.getIndexType ());
481
+ llvm::SmallVector<mlir::Value> extents (
482
+ arrayType.dyn_cast <fir::SequenceType>().getDimension (),
483
+ extent.getResult ());
484
+ arrays.emplace_back (fir::ArrayBoxValue (ptrValArray, extents));
485
+ arrays.emplace_back (fir::BoxValue (boxValArray));
486
+ arrays.emplace_back (
487
+ fir::MutableBoxValue (boxRefValArray, mlir::ValueRange (), {}));
488
+ return {scalars, arrays};
489
+ };
490
+
491
+ auto f32Ty = mlir::FloatType::getF32 (builder.getContext ());
492
+ mlir::Type f32SeqTy = builder.getVarLenSeqTy (f32Ty);
493
+ auto [f32Scalars, f32Arrays] = makeExv (f32Ty, f32SeqTy);
494
+ for (const auto &scalar : f32Scalars) {
495
+ EXPECT_EQ (fir::getBaseTypeOf (scalar), f32Ty);
496
+ EXPECT_EQ (fir::getElementTypeOf (scalar), f32Ty);
497
+ EXPECT_FALSE (fir::isDerivedWithLengthParameters (scalar));
498
+ }
499
+ for (const auto &array : f32Arrays) {
500
+ EXPECT_EQ (fir::getBaseTypeOf (array), f32SeqTy);
501
+ EXPECT_EQ (fir::getElementTypeOf (array), f32Ty);
502
+ EXPECT_FALSE (fir::isDerivedWithLengthParameters (array));
503
+ }
504
+
505
+ auto derivedWithLengthTy =
506
+ fir::RecordType::get (builder.getContext (), " derived_test" );
507
+
508
+ llvm::SmallVector<std::pair<std::string, mlir::Type>> parameters;
509
+ llvm::SmallVector<std::pair<std::string, mlir::Type>> components;
510
+ parameters.emplace_back (" p1" , builder.getI64Type ());
511
+ components.emplace_back (" c1" , f32Ty);
512
+ derivedWithLengthTy.finalize (parameters, components);
513
+ mlir::Type derivedWithLengthSeqTy =
514
+ builder.getVarLenSeqTy (derivedWithLengthTy);
515
+ auto [derivedWithLengthScalars, derivedWithLengthArrays] =
516
+ makeExv (derivedWithLengthTy, derivedWithLengthSeqTy);
517
+ for (const auto &scalar : derivedWithLengthScalars) {
518
+ EXPECT_EQ (fir::getBaseTypeOf (scalar), derivedWithLengthTy);
519
+ EXPECT_EQ (fir::getElementTypeOf (scalar), derivedWithLengthTy);
520
+ EXPECT_TRUE (fir::isDerivedWithLengthParameters (scalar));
521
+ }
522
+ for (const auto &array : derivedWithLengthArrays) {
523
+ EXPECT_EQ (fir::getBaseTypeOf (array), derivedWithLengthSeqTy);
524
+ EXPECT_EQ (fir::getElementTypeOf (array), derivedWithLengthTy);
525
+ EXPECT_TRUE (fir::isDerivedWithLengthParameters (array));
526
+ }
527
+ }
0 commit comments