diff options
Diffstat (limited to 'test/gtest')
-rw-r--r-- | test/gtest/cfg.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/test/gtest/cfg.cpp b/test/gtest/cfg.cpp index 07b44e261..6873f63fa 100644 --- a/test/gtest/cfg.cpp +++ b/test/gtest/cfg.cpp @@ -5,6 +5,7 @@ #include "analysis/liveness-transfer-function.h" #include "analysis/monotone-analyzer.h" #include "analysis/reaching-definitions-transfer-function.h" +#include "analysis/stack-lattice.h" #include "ir/find_all.h" #include "print-test.h" #include "wasm.h" @@ -579,3 +580,100 @@ TEST_F(CFGTest, ReachingDefinitionsLoop) { EXPECT_EQ(expectedResult, getSetses); } + +TEST_F(CFGTest, StackLatticeFunctioning) { + FiniteIntPowersetLattice contentLattice(4); + StackLattice<FiniteIntPowersetLattice> stackLattice(contentLattice); + + // These are constructed as expected references to compare everything else. + StackLattice<FiniteIntPowersetLattice>::Element expectedStack = + stackLattice.getBottom(); + FiniteIntPowersetLattice::Element expectedStackElement = + contentLattice.getBottom(); + + StackLattice<FiniteIntPowersetLattice>::Element firstStack = + stackLattice.getBottom(); + StackLattice<FiniteIntPowersetLattice>::Element secondStack = + stackLattice.getBottom(); + + for (size_t i = 0; i < 4; i++) { + FiniteIntPowersetLattice::Element temp = contentLattice.getBottom(); + for (size_t j = 0; j <= i; j++) { + temp.set(j, true); + } + firstStack.push(temp); + secondStack.push(temp); + if (i < 2) { + expectedStack.push(temp); + } + } + + EXPECT_EQ(stackLattice.compare(firstStack, secondStack), + LatticeComparison::EQUAL); + + for (size_t j = 0; j < 4; ++j) { + expectedStackElement.set(j, true); + } + + EXPECT_EQ(contentLattice.compare(secondStack.pop(), expectedStackElement), + LatticeComparison::EQUAL); + expectedStackElement.set(3, false); + EXPECT_EQ(contentLattice.compare(secondStack.pop(), expectedStackElement), + LatticeComparison::EQUAL); + + EXPECT_EQ(stackLattice.compare(firstStack, secondStack), + LatticeComparison::GREATER); + EXPECT_EQ(stackLattice.compare(secondStack, firstStack), + LatticeComparison::LESS); + + EXPECT_EQ(stackLattice.compare(secondStack, expectedStack), + LatticeComparison::EQUAL); + + { + expectedStack.stackTop().set(0, false); + expectedStack.stackTop().set(2, true); + FiniteIntPowersetLattice::Element temp = expectedStack.pop(); + expectedStack.stackTop().set(3, true); + expectedStack.push(temp); + + FiniteIntPowersetLattice::Element temp2 = contentLattice.getBottom(); + temp2.set(1, true); + temp2.set(3, true); + expectedStack.push(temp2); + } + + StackLattice<FiniteIntPowersetLattice>::Element thirdStack = + stackLattice.getBottom(); + { + FiniteIntPowersetLattice::Element temp = contentLattice.getBottom(); + temp.set(0, true); + temp.set(3, true); + FiniteIntPowersetLattice::Element temp2 = contentLattice.getBottom(); + temp2.set(1, true); + temp2.set(2, true); + FiniteIntPowersetLattice::Element temp3 = contentLattice.getBottom(); + temp3.set(1, true); + temp3.set(3, true); + thirdStack.push(std::move(temp)); + thirdStack.push(std::move(temp2)); + thirdStack.push(std::move(temp3)); + } + + EXPECT_EQ(stackLattice.compare(secondStack, thirdStack), + LatticeComparison::NO_RELATION); + + EXPECT_EQ(stackLattice.compare(thirdStack, expectedStack), + LatticeComparison::EQUAL); + + EXPECT_EQ(thirdStack.makeLeastUpperBound(secondStack), true); + + { + expectedStack.stackTop().set(0, true); + FiniteIntPowersetLattice::Element temp = expectedStack.pop(); + expectedStack.stackTop().set(0, true); + expectedStack.push(temp); + } + + EXPECT_EQ(stackLattice.compare(thirdStack, expectedStack), + LatticeComparison::EQUAL); +} |