summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/Flatten.cpp10
-rw-r--r--test/passes/flatten.txt277
-rw-r--r--test/passes/flatten.wast3
3 files changed, 175 insertions, 115 deletions
diff --git a/src/passes/Flatten.cpp b/src/passes/Flatten.cpp
index b3266e89b..f4b468098 100644
--- a/src/passes/Flatten.cpp
+++ b/src/passes/Flatten.cpp
@@ -257,14 +257,8 @@ struct Flatten : public WalkerPass<ExpressionStackWalker<Flatten, UnifiedExpress
curr = getCurrent(); // we may have replaced it
// we have changed children
ReFinalizeNode().visit(curr);
- // handle side effects and control flow, things we need to be
- // in the prelude. note that we must handle anything here, not just
- // side effects, as a sibling after us may have side effect for us,
- // and thus we need to move in anticipation of that (e.g., we are
- // a get, and a later sibling is a tee - if just the tee moves,
- // that is bade) TODO optimize
- if (isControlFlowStructure(curr) || EffectAnalyzer(getPassOptions(), curr).hasAnything()) {
- // we need to move the side effects to the prelude
+ // move everything to the prelude, if we need to: anything but constants
+ if (!curr->is<Const>()) {
if (curr->type == unreachable) {
ourPreludes.push_back(curr);
replaceCurrent(builder.makeUnreachable());
diff --git a/test/passes/flatten.txt b/test/passes/flatten.txt
index c09305cb8..201cad478 100644
--- a/test/passes/flatten.txt
+++ b/test/passes/flatten.txt
@@ -10,20 +10,29 @@
(elem (i32.const 0) $call-me)
(memory $0 10)
(func $a1 (; 0 ;) (type $1)
- (drop
+ (local $0 i32)
+ (set_local $0
(i32.add
(i32.const 0)
(i32.const 1)
)
)
+ (drop
+ (get_local $0)
+ )
+ (nop)
)
(func $a2 (; 1 ;) (type $2) (result i32)
- (return
+ (local $0 i32)
+ (set_local $0
(i32.add
(i32.const 0)
(i32.const 1)
)
)
+ (return
+ (get_local $0)
+ )
)
(func $a3 (; 2 ;) (type $2) (result i32)
(local $0 i32)
@@ -288,6 +297,7 @@
(local $3 i32)
(local $4 i32)
(local $5 i32)
+ (local $6 i32)
(loop $outer
(loop $inner
(block
@@ -301,26 +311,29 @@
(i32.const 1)
)
)
- )
- (set_local $1
- (get_local $0)
+ (set_local $1
+ (get_local $0)
+ )
)
(set_local $2
(get_local $1)
)
- )
- (set_local $3
- (get_local $2)
+ (set_local $3
+ (get_local $2)
+ )
)
(set_local $4
(get_local $3)
)
+ (set_local $5
+ (get_local $4)
+ )
)
- (set_local $5
- (get_local $4)
+ (set_local $6
+ (get_local $5)
)
(return
- (get_local $5)
+ (get_local $6)
)
)
(func $a10 (; 9 ;) (type $2) (result i32)
@@ -428,8 +441,11 @@
(func $a11 (; 10 ;) (type $1)
(if
(i32.const 0)
- (drop
- (i32.const 1)
+ (block
+ (drop
+ (i32.const 1)
+ )
+ (nop)
)
)
(nop)
@@ -714,10 +730,14 @@
(drop
(i32.const 0)
)
+ (nop)
(if
(i32.const 1)
- (drop
- (i32.const 2)
+ (block
+ (drop
+ (i32.const 2)
+ )
+ (nop)
)
)
(nop)
@@ -738,6 +758,7 @@
(drop
(i32.const 0)
)
+ (nop)
)
(unreachable)
)
@@ -752,6 +773,7 @@
(drop
(i32.const 0)
)
+ (nop)
)
(unreachable)
)
@@ -765,6 +787,7 @@
(drop
(i32.const 0)
)
+ (nop)
)
(nop)
(block $out5
@@ -775,6 +798,7 @@
(drop
(i32.const 0)
)
+ (nop)
)
(nop)
(if
@@ -790,6 +814,7 @@
(drop
(i32.const 0)
)
+ (nop)
)
(unreachable)
)
@@ -800,6 +825,7 @@
(drop
(i32.const 0)
)
+ (nop)
)
(unreachable)
)
@@ -808,6 +834,7 @@
(drop
(i32.const 0)
)
+ (nop)
)
(unreachable)
)
@@ -823,6 +850,7 @@
(drop
(i32.const 0)
)
+ (nop)
(unreachable)
(unreachable)
)
@@ -846,6 +874,7 @@
(drop
(i32.const 0)
)
+ (nop)
(unreachable)
(unreachable)
)
@@ -870,6 +899,7 @@
(drop
(i32.const 0)
)
+ (nop)
(unreachable)
(unreachable)
)
@@ -914,6 +944,7 @@
(drop
(i32.const 10)
)
+ (nop)
)
(unreachable)
)
@@ -962,6 +993,7 @@
(drop
(i32.const 10)
)
+ (nop)
)
(unreachable)
)
@@ -974,9 +1006,11 @@
(drop
(i32.const 10)
)
+ (nop)
(drop
(i32.const 42)
)
+ (nop)
(unreachable)
(unreachable)
(unreachable)
@@ -1038,6 +1072,7 @@
(drop
(i32.const 10)
)
+ (nop)
)
(unreachable)
)
@@ -1303,6 +1338,7 @@
(drop
(i32.const 1337)
)
+ (nop)
)
(nop)
)
@@ -1313,6 +1349,7 @@
(drop
(i32.const 1000)
)
+ (nop)
)
(unreachable)
)
@@ -1320,6 +1357,7 @@
(drop
(i32.const 2000)
)
+ (nop)
)
(func $typed-block-none-then-unreachable (; 23 ;) (type $2) (result i32)
(local $0 i32)
@@ -1725,13 +1763,19 @@
(local $35 i32)
(local $36 i32)
(local $37 i32)
+ (local $38 i32)
+ (local $39 i32)
(block $out
- (drop
+ (set_local $0
(i32.add
(i32.const 1)
(i32.const 2)
)
)
+ (drop
+ (get_local $0)
+ )
+ (nop)
(br $out)
(i32.add
(i32.const 1)
@@ -1765,118 +1809,124 @@
(drop
(i32.const 2)
)
+ (nop)
(drop
(i32.const 3)
)
- (set_local $0
+ (nop)
+ (set_local $1
(i32.const 4)
)
)
- (set_local $1
- (get_local $0)
- )
(set_local $2
+ (get_local $1)
+ )
+ (set_local $3
(i32.add
(i32.const 1)
- (get_local $1)
+ (get_local $2)
)
)
(drop
- (get_local $2)
+ (get_local $3)
)
(nop)
(block $in
(block $switch-in
- (set_local $3
- (i32.const 2)
- )
(set_local $4
- (get_local $3)
+ (i32.const 2)
)
(set_local $5
- (get_local $3)
+ (get_local $4)
+ )
+ (set_local $6
+ (get_local $4)
)
(br_table $in $switch-in $in
(i32.const 777)
)
(unreachable)
)
- (set_local $6
- (get_local $5)
+ (set_local $7
+ (get_local $6)
)
(drop
- (get_local $6)
+ (get_local $7)
)
(nop)
- (set_local $4
+ (set_local $5
(i32.const 3)
)
(br $in)
(unreachable)
- (set_local $4
+ (set_local $5
(i32.const 4)
)
)
- (set_local $7
- (get_local $4)
- )
(set_local $8
+ (get_local $5)
+ )
+ (set_local $9
(i32.add
(i32.const 1)
- (get_local $7)
+ (get_local $8)
)
)
(drop
- (get_local $8)
+ (get_local $9)
)
(nop)
(loop $loop-in
- (set_local $9
+ (set_local $10
(i32.const 5)
)
)
- (set_local $10
- (get_local $9)
- )
(set_local $11
+ (get_local $10)
+ )
+ (set_local $12
(i32.add
(i32.const 1)
- (get_local $10)
+ (get_local $11)
)
)
(drop
- (get_local $11)
+ (get_local $12)
)
(nop)
(if
(i32.const 6)
- (set_local $12
+ (set_local $13
(i32.const 7)
)
- (set_local $12
+ (set_local $13
(i32.const 8)
)
)
- (set_local $13
- (get_local $12)
- )
(set_local $14
+ (get_local $13)
+ )
+ (set_local $15
(i32.add
(i32.const 1)
- (get_local $13)
+ (get_local $14)
)
)
(drop
- (get_local $14)
+ (get_local $15)
)
(nop)
- (drop
+ (set_local $16
(select
(i32.const 9)
(i32.const 10)
(i32.const 11)
)
)
+ (drop
+ (get_local $16)
+ )
+ (nop)
(br $out)
(select
(unreachable)
@@ -1909,106 +1959,106 @@
(unreachable)
(if
(i32.const 11)
- (set_local $15
+ (set_local $17
(i32.const 12)
)
- (set_local $15
+ (set_local $17
(i32.const 13)
)
)
- (set_local $16
- (get_local $15)
+ (set_local $18
+ (get_local $17)
)
- (set_local $17
+ (set_local $19
(select
- (get_local $16)
+ (get_local $18)
(i32.const 9)
(i32.const 10)
)
)
(drop
- (get_local $17)
+ (get_local $19)
)
(nop)
(if
(i32.const 11)
- (set_local $18
+ (set_local $20
(i32.const 12)
)
- (set_local $18
+ (set_local $20
(i32.const 13)
)
)
- (set_local $19
- (get_local $18)
+ (set_local $21
+ (get_local $20)
)
- (set_local $20
+ (set_local $22
(select
(i32.const 9)
- (get_local $19)
+ (get_local $21)
(i32.const 10)
)
)
(drop
- (get_local $20)
+ (get_local $22)
)
(nop)
(if
(i32.const 11)
- (set_local $21
+ (set_local $23
(i32.const 12)
)
- (set_local $21
+ (set_local $23
(i32.const 13)
)
)
- (set_local $22
- (get_local $21)
+ (set_local $24
+ (get_local $23)
)
- (set_local $23
+ (set_local $25
(select
(i32.const 9)
(i32.const 10)
- (get_local $22)
+ (get_local $24)
)
)
(drop
- (get_local $23)
+ (get_local $25)
)
(nop)
(if
(i32.const 11)
- (set_local $24
+ (set_local $26
(i32.const 12)
)
- (set_local $24
+ (set_local $26
(i32.const 13)
)
)
- (set_local $25
- (get_local $24)
+ (set_local $27
+ (get_local $26)
)
(if
(i32.const 15)
- (set_local $26
+ (set_local $28
(i32.const 16)
)
- (set_local $26
+ (set_local $28
(i32.const 17)
)
)
- (set_local $27
- (get_local $26)
+ (set_local $29
+ (get_local $28)
)
- (set_local $28
+ (set_local $30
(select
- (get_local $25)
- (i32.const 14)
(get_local $27)
+ (i32.const 14)
+ (get_local $29)
)
)
(drop
- (get_local $28)
+ (get_local $30)
)
(nop)
(return)
@@ -2032,66 +2082,66 @@
(block
(if
(i32.const 5)
- (set_local $29
+ (set_local $31
(i32.const 6)
)
- (set_local $29
+ (set_local $31
(i32.const 7)
)
)
- (set_local $30
- (get_local $29)
+ (set_local $32
+ (get_local $31)
)
(if
- (get_local $30)
- (set_local $33
+ (get_local $32)
+ (set_local $35
(i32.const 8)
)
(block
(if
(i32.const 9)
- (set_local $31
+ (set_local $33
(i32.const 10)
)
- (set_local $31
+ (set_local $33
(i32.const 11)
)
)
- (set_local $32
- (get_local $31)
+ (set_local $34
+ (get_local $33)
)
- (set_local $33
- (get_local $32)
+ (set_local $35
+ (get_local $34)
)
)
)
)
- (set_local $34
- (get_local $33)
+ (set_local $36
+ (get_local $35)
)
(drop
- (get_local $34)
+ (get_local $36)
)
(nop)
(block $temp
- (set_local $35
+ (set_local $37
(i32.const 1)
)
(br_if $temp
(i32.const 2)
)
- (set_local $36
- (get_local $35)
+ (set_local $38
+ (get_local $37)
)
- (set_local $35
- (get_local $36)
+ (set_local $37
+ (get_local $38)
)
)
- (set_local $37
- (get_local $35)
+ (set_local $39
+ (get_local $37)
)
(drop
- (get_local $37)
+ (get_local $39)
)
(nop)
)
@@ -2448,4 +2498,17 @@
)
(unreachable)
)
+ (func $return (; 42 ;) (type $3) (param $x i32) (result i32)
+ (local $1 i32)
+ (set_local $1
+ (i32.sub
+ (i32.const 1)
+ (i32.const 2)
+ )
+ )
+ (return
+ (get_local $1)
+ )
+ (unreachable)
+ )
)
diff --git a/test/passes/flatten.wast b/test/passes/flatten.wast
index 6b71158f6..c04c7b12f 100644
--- a/test/passes/flatten.wast
+++ b/test/passes/flatten.wast
@@ -1016,4 +1016,7 @@
(drop (tee_local $x (unreachable)))
(drop (tee_local $y (tee_local $x (i32.const 2))))
)
+ (func $return (param $x i32) (result i32)
+ (return (i32.sub (i32.const 1) (i32.const 2)))
+ )
)