summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/CodeFolding.cpp9
-rw-r--r--test/passes/code-folding.txt24
-rw-r--r--test/passes/code-folding.wast23
3 files changed, 53 insertions, 3 deletions
diff --git a/src/passes/CodeFolding.cpp b/src/passes/CodeFolding.cpp
index ae2f81283..047eee452 100644
--- a/src/passes/CodeFolding.cpp
+++ b/src/passes/CodeFolding.cpp
@@ -226,13 +226,17 @@ struct CodeFolding : public WalkerPass<ControlFlowWalker<CodeFolding>> {
// optimize returns at the end, so we can benefit from a fallthrough if there is a value TODO: separate passes for them?
optimizeTerminatingTails(returnTails);
// TODO add fallthrough for returns
- // TODO optimzier returns not in blocks, a big return value can be worth it
+ // TODO optimize returns not in blocks, a big return value can be worth it
// clean up
breakTails.clear();
unreachableTails.clear();
returnTails.clear();
unoptimizables.clear();
modifieds.clear();
+ // if we did any work, types may need to be propagated
+ if (anotherPass) {
+ ReFinalize().walkFunctionInModule(func, getModule());
+ }
}
}
@@ -371,8 +375,7 @@ private:
if (!tail.isFallthrough()) {
tail.block->list.push_back(last);
}
- // the blocks lose their endings, so any values are gone, and the blocks
- // are now either none or unreachable
+ // the block type may change if we removed final values
tail.block->finalize();
}
// since we managed a merge, then it might open up more opportunities later
diff --git a/test/passes/code-folding.txt b/test/passes/code-folding.txt
new file mode 100644
index 000000000..9143b9615
--- /dev/null
+++ b/test/passes/code-folding.txt
@@ -0,0 +1,24 @@
+(module
+ (type $13 (func (param f32)))
+ (type $1 (func))
+ (table 282 282 anyfunc)
+ (memory $0 1 1)
+ (func $0 (type $1)
+ (block $label$1
+ (if
+ (i32.const 1)
+ (block
+ (block $label$3
+ (call_indirect $13
+ (block $label$4
+ (br $label$3)
+ )
+ (i32.const 105)
+ )
+ )
+ (nop)
+ )
+ )
+ )
+ )
+)
diff --git a/test/passes/code-folding.wast b/test/passes/code-folding.wast
new file mode 100644
index 000000000..2310f9721
--- /dev/null
+++ b/test/passes/code-folding.wast
@@ -0,0 +1,23 @@
+(module
+ (type $13 (func (param f32)))
+ (table 282 282 anyfunc)
+ (memory $0 1 1)
+ (func $0
+ (block $label$1
+ (if
+ (i32.const 1)
+ (block $label$3
+ (call_indirect $13
+ (block $label$4 (result f32) ;; but this type may change dangerously
+ (nop) ;; fold this
+ (br $label$3)
+ )
+ (i32.const 105)
+ )
+ (nop) ;; with this
+ )
+ )
+ )
+ )
+)
+