xref: /llvm-project/flang/unittests/Optimizer/KindMappingTest.cpp (revision b07ef9e7cd6f5348df0a4f63e70a60491427ff64)
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 
13 using namespace fir;
14 namespace llvm {
15 struct fltSemantics;
16 } // namespace llvm
17 
18 namespace mlir {
19 class MLIRContext;
20 } // namespace mlir
21 
22 using Bitsize = fir::KindMapping::Bitsize;
23 using LLVMTypeID = fir::KindMapping::LLVMTypeID;
24 
25 struct DefaultStringTests : public testing::Test {
26 public:
SetUpDefaultStringTests27   void SetUp() { defaultString = new KindMapping(context); }
TearDownDefaultStringTests28   void TearDown() { delete defaultString; }
29 
30   KindMapping *defaultString{};
31   mlir::MLIRContext *context{};
32 };
33 
34 struct CommandLineStringTests : public testing::Test {
35 public:
SetUpCommandLineStringTests36   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   }
TearDownCommandLineStringTests43   void TearDown() {
44     delete commandLineString;
45     delete clStringConflict;
46   }
47 
48   KindMapping *commandLineString{};
49   KindMapping *clStringConflict{};
50   mlir::MLIRContext *context{};
51 };
52 
53 struct KindDefaultsTests : public testing::Test {
54 public:
SetUpKindDefaultsTests55   void SetUp() {
56     defaultDefaultKinds = new KindMapping(context);
57     overrideDefaultKinds =
58         new KindMapping(context, {20, 121, 32, 133, 44, 145});
59   }
TearDownKindDefaultsTests60   void TearDown() {
61     delete defaultDefaultKinds;
62     delete overrideDefaultKinds;
63   }
64 
65   mlir::MLIRContext *context{};
66   KindMapping *defaultDefaultKinds{};
67   KindMapping *overrideDefaultKinds{};
68 };
69 
TEST_F(DefaultStringTests,getIntegerBitsizeTest)70 TEST_F(DefaultStringTests, getIntegerBitsizeTest) {
71   EXPECT_EQ(defaultString->getIntegerBitsize(10), 80u);
72   EXPECT_EQ(defaultString->getIntegerBitsize(0), 0u);
73 }
74 
TEST_F(DefaultStringTests,getCharacterBitsizeTest)75 TEST_F(DefaultStringTests, getCharacterBitsizeTest) {
76   EXPECT_EQ(defaultString->getCharacterBitsize(10), 80u);
77   EXPECT_EQ(defaultString->getCharacterBitsize(0), 0u);
78 }
79 
TEST_F(DefaultStringTests,getLogicalBitsizeTest)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);
86 }
87 
TEST_F(DefaultStringTests,getRealTypeIDTest)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);
95   // Default cases
96   EXPECT_EQ(defaultString->getRealTypeID(-1), LLVMTypeID::FloatTyID);
97   EXPECT_EQ(defaultString->getRealTypeID(1), LLVMTypeID::FloatTyID);
98 }
99 
TEST_F(DefaultStringTests,getComplexTypeIDTest)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);
107   // Default cases
108   EXPECT_EQ(defaultString->getComplexTypeID(-1), LLVMTypeID::FloatTyID);
109   EXPECT_EQ(defaultString->getComplexTypeID(1), LLVMTypeID::FloatTyID);
110 }
111 
TEST_F(DefaultStringTests,getFloatSemanticsTest)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());
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 
TEST_F(CommandLineStringTests,getIntegerBitsizeTest)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());
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 
TEST(KindMappingDeathTests,mapTest)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"), "");
176 }
177 
TEST_F(KindDefaultsTests,getIntegerBitsizeTest)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);
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