xref: /llvm-project/flang/unittests/Optimizer/Builder/ComplexTest.cpp (revision f023da12d12635f5fba436e825cbfc999e28e623)
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