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.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/test/gtest/cfg.cpp b/test/gtest/cfg.cpp
index b8ff9cb38..8780af8ca 100644
--- a/test/gtest/cfg.cpp
+++ b/test/gtest/cfg.cpp
@@ -1,4 +1,8 @@
+#include <iostream>
+
#include "analysis/cfg.h"
+#include "analysis/lattice.h"
+#include "analysis/monotone-analyzer.h"
#include "print-test.h"
#include "wasm.h"
#include "gtest/gtest.h"
@@ -79,3 +83,157 @@ TEST_F(CFGTest, Print) {
EXPECT_EQ(ss.str(), cfgText);
}
+
+TEST_F(CFGTest, LinearLiveness) {
+ auto moduleText = R"wasm(
+ (module
+ (func $bar
+ (local $a (i32))
+ (local $b (i32))
+ (local $c (i32))
+ (local.set $a
+ (i32.const 1)
+ )
+ (drop
+ (local.get $a)
+ )
+ (local.set $b
+ (local.get $a)
+ )
+ (local.set $c
+ (i32.const 1)
+ )
+ (drop
+ (local.get $c)
+ )
+ )
+ )
+ )wasm";
+
+ auto analyzerText = R"analyzer(CFG Analyzer
+State Block: 0
+State at beginning: 000
+State at end: 000
+Intermediate States (reverse order):
+000
+block
+000
+drop
+000
+local.get $2
+100
+local.set $2
+000
+i32.const 1
+000
+local.set $1
+000
+local.get $0
+001
+drop
+001
+local.get $0
+001
+local.set $0
+000
+i32.const 1
+000
+End
+)analyzer";
+
+ Module wasm;
+ parseWast(wasm, moduleText);
+
+ CFG cfg = CFG::fromFunction(wasm.getFunction("bar"));
+ const size_t sz = 3;
+ MonotoneCFGAnalyzer<sz> analyzer = MonotoneCFGAnalyzer<sz>::fromCFG(&cfg);
+ analyzer.evaluate();
+
+ std::stringstream ss;
+ analyzer.print(ss);
+
+ EXPECT_EQ(ss.str(), analyzerText);
+}
+
+TEST_F(CFGTest, NonlinearLiveness) {
+ auto moduleText = R"wasm(
+ (module
+ (func $bar
+ (local $a (i32))
+ (local $b (i32))
+ (local.set $a
+ (i32.const 1)
+ )
+ (if
+ (i32.eq
+ (local.get $a)
+ (i32.const 2)
+ )
+ (local.set $b
+ (i32.const 4)
+ )
+ (drop
+ (local.get $a)
+ )
+ )
+ )
+ )
+ )wasm";
+
+ auto analyzerText = R"analyzer(CFG Analyzer
+State Block: 0
+State at beginning: 00
+State at end: 01
+Intermediate States (reverse order):
+01
+i32.eq
+01
+i32.const 2
+01
+local.get $0
+01
+local.set $0
+00
+i32.const 1
+00
+State Block: 1
+State at beginning: 00
+State at end: 00
+Intermediate States (reverse order):
+00
+local.set $1
+00
+i32.const 4
+00
+State Block: 2
+State at beginning: 01
+State at end: 00
+Intermediate States (reverse order):
+00
+drop
+00
+local.get $0
+01
+State Block: 3
+State at beginning: 00
+State at end: 00
+Intermediate States (reverse order):
+00
+block
+00
+End
+)analyzer";
+
+ Module wasm;
+ parseWast(wasm, moduleText);
+
+ CFG cfg = CFG::fromFunction(wasm.getFunction("bar"));
+ const size_t sz = 2;
+ MonotoneCFGAnalyzer<sz> analyzer = MonotoneCFGAnalyzer<sz>::fromCFG(&cfg);
+ analyzer.evaluate();
+
+ std::stringstream ss;
+ analyzer.print(ss);
+
+ EXPECT_EQ(ss.str(), analyzerText);
+}