1//===- KindMappingTest.cpp ------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "flang/Optimizer/Dialect/Support/KindMapping.h"
10#include "gtest/gtest.h"
11#include <string>
12
13using namespace fir;
14namespace llvm {
15struct fltSemantics;
16} // namespace llvm
17
18namespace mlir {
19class MLIRContext;
20} // namespace mlir
21
22using Bitsize = fir::KindMapping::Bitsize;
23using LLVMTypeID = fir::KindMapping::LLVMTypeID;
24
25struct DefaultStringTests : public testing::Test {
26public:
27 void SetUp() { defaultString = new KindMapping(context); }
28 void TearDown() { delete defaultString; }
29
30 KindMapping *defaultString{};
31 mlir::MLIRContext *context{};
32};
33
34struct CommandLineStringTests : public testing::Test {
35public:
36 void SetUp() {
37 commandLineString = new KindMapping(context,
38 "i10:80,l3:24,a1:8,r54:Double,c20:X86_FP80,r11:PPC_FP128,"
39 "r12:FP128,r13:X86_FP80,r14:Double,r15:Float,r16:Half,r23:BFloat");
40 clStringConflict =
41 new KindMapping(context, "i10:80,i10:40,r54:Double,r54:X86_FP80");
42 }
43 void TearDown() {
44 delete commandLineString;
45 delete clStringConflict;
46 }
47
48 KindMapping *commandLineString{};
49 KindMapping *clStringConflict{};
50 mlir::MLIRContext *context{};
51};
52
53struct KindDefaultsTests : public testing::Test {
54public:
55 void SetUp() {
56 defaultDefaultKinds = new KindMapping(context);
57 overrideDefaultKinds =
58 new KindMapping(context, {20, 121, 32, 133, 44, 145});
59 }
60 void TearDown() {
61 delete defaultDefaultKinds;
62 delete overrideDefaultKinds;
63 }
64
65 mlir::MLIRContext *context{};
66 KindMapping *defaultDefaultKinds{};
67 KindMapping *overrideDefaultKinds{};
68};
69
70TEST_F(DefaultStringTests, getIntegerBitsizeTest) {
71 EXPECT_EQ(defaultString->getIntegerBitsize(10), 80u);
72 EXPECT_EQ(defaultString->getIntegerBitsize(0), 0u);
73}
74
75TEST_F(DefaultStringTests, getCharacterBitsizeTest) {
76 EXPECT_EQ(defaultString->getCharacterBitsize(10), 80u);
77 EXPECT_EQ(defaultString->getCharacterBitsize(0), 0u);
78}
79
80TEST_F(DefaultStringTests, getLogicalBitsizeTest) {
81 EXPECT_EQ(defaultString->getLogicalBitsize(10), 80u);
82 // Unsigned values are expected
83 std::string actual = std::to_string(defaultString->getLogicalBitsize(-10));
84 std::string expect = "-80";
85 EXPECT_NE(actual, expect);
86}
87
88TEST_F(DefaultStringTests, getRealTypeIDTest) {
89 EXPECT_EQ(defaultString->getRealTypeID(2), LLVMTypeID::HalfTyID);
90 EXPECT_EQ(defaultString->getRealTypeID(3), LLVMTypeID::BFloatTyID);
91 EXPECT_EQ(defaultString->getRealTypeID(4), LLVMTypeID::FloatTyID);
92 EXPECT_EQ(defaultString->getRealTypeID(8), LLVMTypeID::DoubleTyID);
93 EXPECT_EQ(defaultString->getRealTypeID(10), LLVMTypeID::X86_FP80TyID);
94 EXPECT_EQ(defaultString->getRealTypeID(16), LLVMTypeID::FP128TyID);
95 // Default cases
96 EXPECT_EQ(defaultString->getRealTypeID(-1), LLVMTypeID::FloatTyID);
97 EXPECT_EQ(defaultString->getRealTypeID(1), LLVMTypeID::FloatTyID);
98}
99
100TEST_F(DefaultStringTests, getComplexTypeIDTest) {
101 EXPECT_EQ(defaultString->getComplexTypeID(2), LLVMTypeID::HalfTyID);
102 EXPECT_EQ(defaultString->getComplexTypeID(3), LLVMTypeID::BFloatTyID);
103 EXPECT_EQ(defaultString->getComplexTypeID(4), LLVMTypeID::FloatTyID);
104 EXPECT_EQ(defaultString->getComplexTypeID(8), LLVMTypeID::DoubleTyID);
105 EXPECT_EQ(defaultString->getComplexTypeID(10), LLVMTypeID::X86_FP80TyID);
106 EXPECT_EQ(defaultString->getComplexTypeID(16), LLVMTypeID::FP128TyID);
107 // Default cases
108 EXPECT_EQ(defaultString->getComplexTypeID(-1), LLVMTypeID::FloatTyID);
109 EXPECT_EQ(defaultString->getComplexTypeID(1), LLVMTypeID::FloatTyID);
110}
111
112TEST_F(DefaultStringTests, getFloatSemanticsTest) {
113 EXPECT_EQ(&defaultString->getFloatSemantics(2), &llvm::APFloat::IEEEhalf());
114 EXPECT_EQ(&defaultString->getFloatSemantics(3), &llvm::APFloat::BFloat());
115 EXPECT_EQ(&defaultString->getFloatSemantics(4), &llvm::APFloat::IEEEsingle());
116 EXPECT_EQ(&defaultString->getFloatSemantics(8), &llvm::APFloat::IEEEdouble());
117 EXPECT_EQ(&defaultString->getFloatSemantics(10),
118 &llvm::APFloat::x87DoubleExtended());
119 EXPECT_EQ(&defaultString->getFloatSemantics(16), &llvm::APFloat::IEEEquad());
120
121 // Default cases
122 EXPECT_EQ(
123 &defaultString->getFloatSemantics(-1), &llvm::APFloat::IEEEsingle());
124 EXPECT_EQ(&defaultString->getFloatSemantics(1), &llvm::APFloat::IEEEsingle());
125}
126
127TEST_F(CommandLineStringTests, getIntegerBitsizeTest) {
128 // KEY is present in map.
129 EXPECT_EQ(commandLineString->getIntegerBitsize(10), 80u);
130 EXPECT_EQ(commandLineString->getCharacterBitsize(1), 8u);
131 EXPECT_EQ(commandLineString->getLogicalBitsize(3), 24u);
132 EXPECT_EQ(commandLineString->getComplexTypeID(20), LLVMTypeID::X86_FP80TyID);
133 EXPECT_EQ(commandLineString->getRealTypeID(54), LLVMTypeID::DoubleTyID);
134 EXPECT_EQ(commandLineString->getRealTypeID(11), LLVMTypeID::PPC_FP128TyID);
135 EXPECT_EQ(&commandLineString->getFloatSemantics(11),
136 &llvm::APFloat::PPCDoubleDouble());
137 EXPECT_EQ(
138 &commandLineString->getFloatSemantics(12), &llvm::APFloat::IEEEquad());
139 EXPECT_EQ(&commandLineString->getFloatSemantics(13),
140 &llvm::APFloat::x87DoubleExtended());
141 EXPECT_EQ(
142 &commandLineString->getFloatSemantics(14), &llvm::APFloat::IEEEdouble());
143 EXPECT_EQ(
144 &commandLineString->getFloatSemantics(15), &llvm::APFloat::IEEEsingle());
145 EXPECT_EQ(
146 &commandLineString->getFloatSemantics(16), &llvm::APFloat::IEEEhalf());
147 EXPECT_EQ(
148 &commandLineString->getFloatSemantics(23), &llvm::APFloat::BFloat());
149
150 // Converts to default case
151 EXPECT_EQ(
152 &commandLineString->getFloatSemantics(20), &llvm::APFloat::IEEEsingle());
153
154 // KEY is absent from map, Default values are expected.
155 EXPECT_EQ(commandLineString->getIntegerBitsize(9), 72u);
156 EXPECT_EQ(commandLineString->getCharacterBitsize(9), 72u);
157 EXPECT_EQ(commandLineString->getLogicalBitsize(9), 72u);
158 EXPECT_EQ(commandLineString->getComplexTypeID(9), LLVMTypeID::FloatTyID);
159 EXPECT_EQ(commandLineString->getRealTypeID(9), LLVMTypeID::FloatTyID);
160
161 // KEY repeats in map.
162 EXPECT_NE(clStringConflict->getIntegerBitsize(10), 80u);
163 EXPECT_NE(clStringConflict->getRealTypeID(10), LLVMTypeID::DoubleTyID);
164}
165
166TEST(KindMappingDeathTests, mapTest) {
167 mlir::MLIRContext *context{};
168 // Catch parsing errors
169 ASSERT_DEATH(new KindMapping(context, "r10:Double,r20:Doubl"), "");
170 ASSERT_DEATH(new KindMapping(context, "10:Double"), "");
171 ASSERT_DEATH(new KindMapping(context, "rr:Double"), "");
172 ASSERT_DEATH(new KindMapping(context, "rr:"), "");
173 ASSERT_DEATH(new KindMapping(context, "rr:Double MoreContent"), "");
174 // length of 'size' > 10
175 ASSERT_DEATH(new KindMapping(context, "i11111111111:10"), "");
176}
177
178TEST_F(KindDefaultsTests, getIntegerBitsizeTest) {
179 EXPECT_EQ(defaultDefaultKinds->defaultCharacterKind(), 1u);
180 EXPECT_EQ(defaultDefaultKinds->defaultComplexKind(), 4u);
181 EXPECT_EQ(defaultDefaultKinds->defaultDoubleKind(), 8u);
182 EXPECT_EQ(defaultDefaultKinds->defaultIntegerKind(), 4u);
183 EXPECT_EQ(defaultDefaultKinds->defaultLogicalKind(), 4u);
184 EXPECT_EQ(defaultDefaultKinds->defaultRealKind(), 4u);
185
186 EXPECT_EQ(overrideDefaultKinds->defaultCharacterKind(), 20u);
187 EXPECT_EQ(overrideDefaultKinds->defaultComplexKind(), 121u);
188 EXPECT_EQ(overrideDefaultKinds->defaultDoubleKind(), 32u);
189 EXPECT_EQ(overrideDefaultKinds->defaultIntegerKind(), 133u);
190 EXPECT_EQ(overrideDefaultKinds->defaultLogicalKind(), 44u);
191 EXPECT_EQ(overrideDefaultKinds->defaultRealKind(), 145u);
192}
193
194// main() from gtest_main
195

source code of flang/unittests/Optimizer/KindMappingTest.cpp