1a1f9bd32SKiran Chandramohan //===- ComplexExprTest.cpp -- ComplexExpr unit tests ----------===// 2a1f9bd32SKiran Chandramohan // 3a1f9bd32SKiran Chandramohan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a1f9bd32SKiran Chandramohan // See https://llvm.org/LICENSE.txt for license information. 5a1f9bd32SKiran Chandramohan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a1f9bd32SKiran Chandramohan // 7a1f9bd32SKiran Chandramohan //===----------------------------------------------------------------------===// 8a1f9bd32SKiran Chandramohan 9a1f9bd32SKiran Chandramohan #include "flang/Optimizer/Builder/Complex.h" 10a1f9bd32SKiran Chandramohan #include "gtest/gtest.h" 11a1f9bd32SKiran Chandramohan #include "flang/Optimizer/Builder/FIRBuilder.h" 12b07ef9e7SRenaud-K #include "flang/Optimizer/Dialect/Support/KindMapping.h" 13a1f9bd32SKiran Chandramohan #include "flang/Optimizer/Support/InitFIR.h" 14a1f9bd32SKiran Chandramohan 15a1f9bd32SKiran Chandramohan struct ComplexTest : public testing::Test { 16a1f9bd32SKiran Chandramohan public: 17a1f9bd32SKiran Chandramohan void SetUp() override { 1836550692SRiver Riddle fir::support::loadDialects(context); 1936550692SRiver Riddle 20a1f9bd32SKiran Chandramohan mlir::OpBuilder builder(&context); 21a1f9bd32SKiran Chandramohan auto loc = builder.getUnknownLoc(); 22a1f9bd32SKiran Chandramohan 23a1f9bd32SKiran Chandramohan // Set up a Module with a dummy function operation inside. 24a1f9bd32SKiran Chandramohan // Set the insertion point in the function entry block. 25c870632eSMatthias Springer moduleOp = builder.create<mlir::ModuleOp>(loc); 26c870632eSMatthias Springer builder.setInsertionPointToStart(moduleOp->getBody()); 27c870632eSMatthias Springer mlir::func::FuncOp func = builder.create<mlir::func::FuncOp>( 2863b63c3dSKazu Hirata loc, "func1", builder.getFunctionType(std::nullopt, std::nullopt)); 29a1f9bd32SKiran Chandramohan auto *entryBlock = func.addEntryBlock(); 30a1f9bd32SKiran Chandramohan builder.setInsertionPointToStart(entryBlock); 31a1f9bd32SKiran Chandramohan 32a1f9bd32SKiran Chandramohan kindMap = std::make_unique<fir::KindMapping>(&context); 33c870632eSMatthias Springer firBuilder = std::make_unique<fir::FirOpBuilder>(builder, *kindMap); 34a1f9bd32SKiran Chandramohan helper = std::make_unique<fir::factory::Complex>(*firBuilder, loc); 35a1f9bd32SKiran Chandramohan 36a1f9bd32SKiran Chandramohan // Init commonly used types 37*f023da12SMatthias Springer realTy1 = mlir::Float32Type::get(&context); 38c4204c0bSjeanPerier complexTy1 = mlir::ComplexType::get(realTy1); 39a1f9bd32SKiran Chandramohan integerTy1 = mlir::IntegerType::get(&context, 32); 40a1f9bd32SKiran Chandramohan 41a1f9bd32SKiran Chandramohan // Create commonly used reals 42a1f9bd32SKiran Chandramohan rOne = firBuilder->createRealConstant(loc, realTy1, 1u); 43a1f9bd32SKiran Chandramohan rTwo = firBuilder->createRealConstant(loc, realTy1, 2u); 44a1f9bd32SKiran Chandramohan rThree = firBuilder->createRealConstant(loc, realTy1, 3u); 45a1f9bd32SKiran Chandramohan rFour = firBuilder->createRealConstant(loc, realTy1, 4u); 46a1f9bd32SKiran Chandramohan } 47a1f9bd32SKiran Chandramohan 48a1f9bd32SKiran Chandramohan mlir::MLIRContext context; 49c870632eSMatthias Springer mlir::OwningOpRef<mlir::ModuleOp> moduleOp; 50a1f9bd32SKiran Chandramohan std::unique_ptr<fir::KindMapping> kindMap; 51a1f9bd32SKiran Chandramohan std::unique_ptr<fir::FirOpBuilder> firBuilder; 52a1f9bd32SKiran Chandramohan std::unique_ptr<fir::factory::Complex> helper; 53a1f9bd32SKiran Chandramohan 54a1f9bd32SKiran Chandramohan // Commonly used real/complex/integer types 55a1f9bd32SKiran Chandramohan mlir::FloatType realTy1; 56c4204c0bSjeanPerier mlir::ComplexType complexTy1; 57a1f9bd32SKiran Chandramohan mlir::IntegerType integerTy1; 58a1f9bd32SKiran Chandramohan 59a1f9bd32SKiran Chandramohan // Commonly used real numbers 60a1f9bd32SKiran Chandramohan mlir::Value rOne; 61a1f9bd32SKiran Chandramohan mlir::Value rTwo; 62a1f9bd32SKiran Chandramohan mlir::Value rThree; 63a1f9bd32SKiran Chandramohan mlir::Value rFour; 64a1f9bd32SKiran Chandramohan }; 65a1f9bd32SKiran Chandramohan 66a1f9bd32SKiran Chandramohan TEST_F(ComplexTest, verifyTypes) { 67a1f9bd32SKiran Chandramohan mlir::Value cVal1 = helper->createComplex(complexTy1, rOne, rTwo); 68a1f9bd32SKiran Chandramohan EXPECT_TRUE(fir::isa_complex(cVal1.getType())); 69a1f9bd32SKiran Chandramohan EXPECT_TRUE(fir::isa_real(helper->getComplexPartType(cVal1))); 70a1f9bd32SKiran Chandramohan 71a1f9bd32SKiran Chandramohan mlir::Value real1 = helper->extractComplexPart(cVal1, /*isImagPart=*/false); 72a1f9bd32SKiran Chandramohan mlir::Value imag1 = helper->extractComplexPart(cVal1, /*isImagPart=*/true); 73a1f9bd32SKiran Chandramohan EXPECT_EQ(realTy1, real1.getType()); 74a1f9bd32SKiran Chandramohan EXPECT_EQ(realTy1, imag1.getType()); 75a1f9bd32SKiran Chandramohan 76a1f9bd32SKiran Chandramohan mlir::Value cVal3 = 77a1f9bd32SKiran Chandramohan helper->insertComplexPart(cVal1, rThree, /*isImagPart=*/false); 78a1f9bd32SKiran Chandramohan mlir::Value cVal4 = 79a1f9bd32SKiran Chandramohan helper->insertComplexPart(cVal3, rFour, /*isImagPart=*/true); 80a1f9bd32SKiran Chandramohan EXPECT_TRUE(fir::isa_complex(cVal4.getType())); 81a1f9bd32SKiran Chandramohan EXPECT_TRUE(fir::isa_real(helper->getComplexPartType(cVal4))); 82a1f9bd32SKiran Chandramohan } 83a1f9bd32SKiran Chandramohan 84a1f9bd32SKiran Chandramohan TEST_F(ComplexTest, verifyConvertWithSemantics) { 85a1f9bd32SKiran Chandramohan auto loc = firBuilder->getUnknownLoc(); 86a1f9bd32SKiran Chandramohan rOne = firBuilder->createRealConstant(loc, realTy1, 1u); 87a1f9bd32SKiran Chandramohan // Convert real to complex 88a1f9bd32SKiran Chandramohan mlir::Value v1 = firBuilder->convertWithSemantics(loc, complexTy1, rOne); 89a1f9bd32SKiran Chandramohan EXPECT_TRUE(fir::isa_complex(v1.getType())); 90a1f9bd32SKiran Chandramohan 91a1f9bd32SKiran Chandramohan // Convert complex to integer 92a1f9bd32SKiran Chandramohan mlir::Value v2 = firBuilder->convertWithSemantics(loc, integerTy1, v1); 93fac349a1SChristian Sigg EXPECT_TRUE(mlir::isa<mlir::IntegerType>(v2.getType())); 94a1f9bd32SKiran Chandramohan EXPECT_TRUE(mlir::dyn_cast<fir::ConvertOp>(v2.getDefiningOp())); 95a1f9bd32SKiran Chandramohan } 96