1 //===- KindMappingTest.cpp ------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "flang/Optimizer/Dialect/Support/KindMapping.h"
10 #include "gtest/gtest.h"
22 using Bitsize
= fir::KindMapping::Bitsize
;
23 using LLVMTypeID
= fir::KindMapping::LLVMTypeID
;
25 struct DefaultStringTests
: public testing::Test
{
27 void SetUp() { defaultString
= new KindMapping(context
); }
28 void TearDown() { delete defaultString
; }
30 KindMapping
*defaultString
{};
31 mlir::MLIRContext
*context
{};
34 struct CommandLineStringTests
: public testing::Test
{
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");
41 new KindMapping(context
, "i10:80,i10:40,r54:Double,r54:X86_FP80");
44 delete commandLineString
;
45 delete clStringConflict
;
48 KindMapping
*commandLineString
{};
49 KindMapping
*clStringConflict
{};
50 mlir::MLIRContext
*context
{};
53 struct KindDefaultsTests
: public testing::Test
{
56 defaultDefaultKinds
= new KindMapping(context
);
57 overrideDefaultKinds
=
58 new KindMapping(context
, {20, 121, 32, 133, 44, 145});
61 delete defaultDefaultKinds
;
62 delete overrideDefaultKinds
;
65 mlir::MLIRContext
*context
{};
66 KindMapping
*defaultDefaultKinds
{};
67 KindMapping
*overrideDefaultKinds
{};
70 TEST_F(DefaultStringTests
, getIntegerBitsizeTest
) {
71 EXPECT_EQ(defaultString
->getIntegerBitsize(10), 80u);
72 EXPECT_EQ(defaultString
->getIntegerBitsize(0), 0u);
75 TEST_F(DefaultStringTests
, getCharacterBitsizeTest
) {
76 EXPECT_EQ(defaultString
->getCharacterBitsize(10), 80u);
77 EXPECT_EQ(defaultString
->getCharacterBitsize(0), 0u);
80 TEST_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
);
88 TEST_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
);
96 EXPECT_EQ(defaultString
->getRealTypeID(-1), LLVMTypeID::FloatTyID
);
97 EXPECT_EQ(defaultString
->getRealTypeID(1), LLVMTypeID::FloatTyID
);
100 TEST_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
);
108 EXPECT_EQ(defaultString
->getComplexTypeID(-1), LLVMTypeID::FloatTyID
);
109 EXPECT_EQ(defaultString
->getComplexTypeID(1), LLVMTypeID::FloatTyID
);
112 TEST_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());
123 &defaultString
->getFloatSemantics(-1), &llvm::APFloat::IEEEsingle());
124 EXPECT_EQ(&defaultString
->getFloatSemantics(1), &llvm::APFloat::IEEEsingle());
127 TEST_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());
138 &commandLineString
->getFloatSemantics(12), &llvm::APFloat::IEEEquad());
139 EXPECT_EQ(&commandLineString
->getFloatSemantics(13),
140 &llvm::APFloat::x87DoubleExtended());
142 &commandLineString
->getFloatSemantics(14), &llvm::APFloat::IEEEdouble());
144 &commandLineString
->getFloatSemantics(15), &llvm::APFloat::IEEEsingle());
146 &commandLineString
->getFloatSemantics(16), &llvm::APFloat::IEEEhalf());
148 &commandLineString
->getFloatSemantics(23), &llvm::APFloat::BFloat());
150 // Converts to default case
152 &commandLineString
->getFloatSemantics(20), &llvm::APFloat::IEEEsingle());
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
);
161 // KEY repeats in map.
162 EXPECT_NE(clStringConflict
->getIntegerBitsize(10), 80u);
163 EXPECT_NE(clStringConflict
->getRealTypeID(10), LLVMTypeID::DoubleTyID
);
166 TEST(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"), "");
178 TEST_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);
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);
194 // main() from gtest_main