summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-07-16 16:27:38 -0700
committerGitHub <noreply@github.com>2016-07-16 16:27:38 -0700
commitcd61f6a1ae959cc3ee22f4e72f0f4ba73c2abbd1 (patch)
treeeef538171ffef9c72ca9d319d93a1f56bd47cd85
parentce8ee20462a465f00520dbe0dd2aa3e1601f4ca1 (diff)
parent07170478897c81aa973217ae8070d2d155d16b2e (diff)
downloadbinaryen-cd61f6a1ae959cc3ee22f4e72f0f4ba73c2abbd1.tar.gz
binaryen-cd61f6a1ae959cc3ee22f4e72f0f4ba73c2abbd1.tar.bz2
binaryen-cd61f6a1ae959cc3ee22f4e72f0f4ba73c2abbd1.zip
Merge pull request #644 from WebAssembly/fix-debug
Fix dce bug in non-parallel mode, which happens in debug mode
-rwxr-xr-xcheck.py3
-rw-r--r--src/passes/DeadCodeElimination.cpp7
-rw-r--r--src/passes/pass.cpp9
-rw-r--r--test/passes/dce.txt6
-rw-r--r--test/passes/dce.wast7
5 files changed, 30 insertions, 2 deletions
diff --git a/check.py b/check.py
index 5d9a72ac0..d3f0ea4c6 100755
--- a/check.py
+++ b/check.py
@@ -272,6 +272,9 @@ for t in sorted(os.listdir(os.path.join('test', 'passes'))):
with open('split.wast', 'w') as o: o.write(module)
cmd = [os.path.join('bin', 'wasm-opt')] + opts + ['split.wast', '--print']
actual += run_command(cmd)
+ # also check debug mode output is valid
+ debugged = run_command(cmd + ['--debug'], stderr=subprocess.PIPE)
+ fail_if_not_contained(actual, debugged)
fail_if_not_identical(actual, open(os.path.join('test', 'passes', passname + '.txt')).read())
print '[ checking asm2wasm testcases... ]\n'
diff --git a/src/passes/DeadCodeElimination.cpp b/src/passes/DeadCodeElimination.cpp
index 9562b2973..de1191131 100644
--- a/src/passes/DeadCodeElimination.cpp
+++ b/src/passes/DeadCodeElimination.cpp
@@ -40,7 +40,12 @@ struct DeadCodeElimination : public WalkerPass<PostWalker<DeadCodeElimination, V
Pass* create() override { return new DeadCodeElimination; }
// whether the current code is actually reachable
- bool reachable = true;
+ bool reachable;
+
+ void doWalkFunction(Function* func) {
+ reachable = true;
+ walk(func->body);
+ }
std::set<Name> reachableBreaks;
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index e04033d90..f27eccf6a 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -149,7 +149,14 @@ void PassRunner::run() {
std::cerr << ' ';
}
before = std::chrono::high_resolution_clock::now();
- pass->run(this, wasm);
+ if (pass->isFunctionParallel()) {
+ // function-parallel passes should get a new instance per function
+ for (auto& func : wasm->functions) {
+ runPassOnFunction(pass, func.get());
+ }
+ } else {
+ pass->run(this, wasm);
+ }
auto after = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = after - before;
std::cerr << diff.count() << " seconds." << std::endl;
diff --git a/test/passes/dce.txt b/test/passes/dce.txt
index 3d32d9bed..5f287e183 100644
--- a/test/passes/dce.txt
+++ b/test/passes/dce.txt
@@ -236,4 +236,10 @@
)
(i32.const 1337)
)
+ (func $killer
+ (unreachable)
+ )
+ (func $target
+ (i32.const 2000)
+ )
)
diff --git a/test/passes/dce.wast b/test/passes/dce.wast
index e76607ecd..dcec20cc1 100644
--- a/test/passes/dce.wast
+++ b/test/passes/dce.wast
@@ -193,5 +193,12 @@
)
(i32.const 1337)
)
+ (func $killer
+ (unreachable)
+ (i32.const 1000)
+ )
+ (func $target
+ (i32.const 2000)
+ )
)