diff options
author | Alon Zakai <alonzakai@gmail.com> | 2017-07-18 09:17:57 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-18 09:17:57 -0700 |
commit | e865f2fa2863b6e91521c059a61a4483769bf5c9 (patch) | |
tree | f2d4bbee701376a4975ebf0d2c518f10369fdabd /src/ast/effects.h | |
parent | 24accd15fb59d476daaebbbcd492b8a9ee729b2b (diff) | |
parent | 7bc2ed70de137aa6615fcd5d0e1f3e88f008a738 (diff) | |
download | binaryen-e865f2fa2863b6e91521c059a61a4483769bf5c9.tar.gz binaryen-e865f2fa2863b6e91521c059a61a4483769bf5c9.tar.bz2 binaryen-e865f2fa2863b6e91521c059a61a4483769bf5c9.zip |
Merge pull request #1095 from WebAssembly/fuzz-3
More fuzz fixes
Diffstat (limited to 'src/ast/effects.h')
-rw-r--r-- | src/ast/effects.h | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/ast/effects.h b/src/ast/effects.h index a7a5d8fb2..6e4bb617e 100644 --- a/src/ast/effects.h +++ b/src/ast/effects.h @@ -39,7 +39,7 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer> { if (breakNames.size() > 0) branches = true; } - bool branches = false; // branches out of this expression + bool branches = false; // branches out of this expression, returns, infinite loops, etc bool calls = false; std::set<Index> localsRead; std::set<Index> localsWritten; @@ -138,6 +138,18 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer> { } void visitLoop(Loop* curr) { if (curr->name.is()) breakNames.erase(curr->name); // these were internal breaks + // if the loop is unreachable, then there is branching control flow: + // (1) if the body is unreachable because of a (return), uncaught (br) etc., then we + // already noted branching, so it is ok to mark it again (if we have *caught* + // (br)s, then they did not lead to the loop body being unreachable). + // (same logic applies to blocks) + // (2) if the loop is unreachable because it only has branches up to the loop + // top, but no way to get out, then it is an infinite loop, and we consider + // that a branching side effect (note how the same logic does not apply to + // blocks). + if (curr->type == unreachable) { + branches = true; + } } void visitCall(Call *curr) { calls = true; } @@ -182,6 +194,7 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer> { case TruncUFloat64ToInt32: case TruncUFloat64ToInt64: { implicitTrap = true; + break; } default: {} } @@ -199,6 +212,7 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer> { case RemSInt64: case RemUInt64: { implicitTrap = true; + break; } default: {} } |