1616
1717#include " analysis/lattices/bool.h"
1818#include " analysis/lattices/int.h"
19+ #include " analysis/lattices/inverted.h"
1920#include " gtest/gtest.h"
2021
2122using namespace wasm ;
@@ -25,6 +26,11 @@ TEST(BoolLattice, GetBottom) {
2526 EXPECT_FALSE (lattice.getBottom ());
2627}
2728
29+ TEST (BoolLattice, GetTop) {
30+ analysis::Bool lattice;
31+ EXPECT_TRUE (lattice.getTop ());
32+ }
33+
2834TEST (BoolLattice, Compare) {
2935 analysis::Bool lattice;
3036 EXPECT_EQ (lattice.compare (false , false ), analysis::EQUAL);
@@ -50,18 +56,49 @@ TEST(BoolLattice, Join) {
5056 ASSERT_TRUE (elem);
5157}
5258
59+ TEST (BoolLattice, Meet) {
60+ analysis::Bool lattice;
61+ bool elem = true ;
62+
63+ EXPECT_FALSE (lattice.meet (elem, true ));
64+ ASSERT_TRUE (elem);
65+
66+ EXPECT_TRUE (lattice.meet (elem, false ));
67+ ASSERT_FALSE (elem);
68+
69+ EXPECT_FALSE (lattice.meet (elem, true ));
70+ ASSERT_FALSE (elem);
71+
72+ EXPECT_FALSE (lattice.meet (elem, false ));
73+ ASSERT_FALSE (elem);
74+ }
75+
5376TEST (IntLattice, GetBottom) {
5477 analysis::Int32 int32;
55- EXPECT_EQ (int32.getBottom (), (int32_t )(1ll << 31 ));
78+ EXPECT_EQ (int32.getBottom (), (int32_t )(1ull << 31 ));
5679
5780 analysis::Int64 int64;
58- EXPECT_EQ (int64.getBottom (), (int64_t )(1ll << 63 ));
81+ EXPECT_EQ (int64.getBottom (), (int64_t )(1ull << 63 ));
5982
6083 analysis::UInt32 uint32;
6184 EXPECT_EQ (uint32.getBottom (), (uint32_t )0 );
6285
6386 analysis::UInt64 uint64;
64- EXPECT_EQ (uint64.getBottom (), (uint32_t )0 );
87+ EXPECT_EQ (uint64.getBottom (), (uint64_t )0 );
88+ }
89+
90+ TEST (IntLattice, GetTop) {
91+ analysis::Int32 int32;
92+ EXPECT_EQ (int32.getTop (), (int32_t )((1ull << 31 ) - 1 ));
93+
94+ analysis::Int64 int64;
95+ EXPECT_EQ (int64.getTop (), (int64_t )((1ull << 63 ) - 1 ));
96+
97+ analysis::UInt32 uint32;
98+ EXPECT_EQ (uint32.getTop (), (uint32_t )-1ull );
99+
100+ analysis::UInt64 uint64;
101+ EXPECT_EQ (uint64.getTop (), (uint64_t )-1ull );
65102}
66103
67104TEST (IntLattice, Compare) {
@@ -84,3 +121,76 @@ TEST(IntLattice, Join) {
84121 EXPECT_TRUE (int32.join (elem, 100 ));
85122 ASSERT_EQ (elem, 100 );
86123}
124+
125+ TEST (IntLattice, Meet) {
126+ analysis::Int32 int32;
127+ int elem = 0 ;
128+
129+ EXPECT_FALSE (int32.meet (elem, 10 ));
130+ ASSERT_EQ (elem, 0 );
131+
132+ EXPECT_FALSE (int32.meet (elem, 0 ));
133+ ASSERT_EQ (elem, 0 );
134+
135+ EXPECT_TRUE (int32.meet (elem, -100 ));
136+ ASSERT_EQ (elem, -100 );
137+ }
138+
139+ TEST (InvertedLattice, GetBottom) {
140+ analysis::Inverted inverted (analysis::Bool{});
141+ EXPECT_TRUE (inverted.getBottom ());
142+ }
143+
144+ TEST (InvertedLattice, GetTop) {
145+ analysis::Inverted inverted (analysis::Bool{});
146+ EXPECT_FALSE (inverted.getTop ());
147+ }
148+
149+ TEST (InvertedLattice, Compare) {
150+ analysis::Inverted inverted (analysis::Bool{});
151+ EXPECT_EQ (inverted.compare (false , false ), analysis::EQUAL);
152+ EXPECT_EQ (inverted.compare (false , true ), analysis::GREATER);
153+ EXPECT_EQ (inverted.compare (true , false ), analysis::LESS);
154+ EXPECT_EQ (inverted.compare (true , true ), analysis::EQUAL);
155+ }
156+
157+ TEST (InvertedLattice, Join) {
158+ analysis::Inverted inverted (analysis::Bool{});
159+ bool elem = true ;
160+
161+ EXPECT_FALSE (inverted.join (elem, true ));
162+ ASSERT_TRUE (elem);
163+
164+ EXPECT_TRUE (inverted.join (elem, false ));
165+ ASSERT_FALSE (elem);
166+
167+ EXPECT_FALSE (inverted.join (elem, true ));
168+ ASSERT_FALSE (elem);
169+
170+ EXPECT_FALSE (inverted.join (elem, false ));
171+ ASSERT_FALSE (elem);
172+ }
173+
174+ TEST (InvertedLattice, Meet) {
175+ analysis::Inverted inverted (analysis::Bool{});
176+ bool elem = false ;
177+
178+ EXPECT_FALSE (inverted.meet (elem, false ));
179+ ASSERT_FALSE (elem);
180+
181+ EXPECT_TRUE (inverted.meet (elem, true ));
182+ ASSERT_TRUE (elem);
183+
184+ EXPECT_FALSE (inverted.meet (elem, false ));
185+ ASSERT_TRUE (elem);
186+
187+ EXPECT_FALSE (inverted.meet (elem, true ));
188+ ASSERT_TRUE (elem);
189+ }
190+
191+ TEST (InvertedLattice, DoubleInverted) {
192+ using DoubleInverted = analysis::Inverted<analysis::Inverted<analysis::Bool>>;
193+ DoubleInverted identity (analysis::Inverted<analysis::Bool>{analysis::Bool{}});
194+ EXPECT_FALSE (identity.getBottom ());
195+ EXPECT_TRUE (identity.getTop ());
196+ }
0 commit comments