summaryrefslogtreecommitdiff
path: root/test/gtest/cfg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/gtest/cfg.cpp')
-rw-r--r--test/gtest/cfg.cpp98
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);
+}