Skip to content

Commit 7f9d258

Browse files
committed
use ChildLocalizer
1 parent 1adf7d0 commit 7f9d258

File tree

3 files changed

+116
-55
lines changed

3 files changed

+116
-55
lines changed

src/ir/localize.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,17 +153,20 @@ struct ChildLocalizer {
153153
// Nothing to add.
154154
return parent;
155155
}
156+
auto* block = getChildrenReplacement();
157+
if (!hasUnreachableChild) {
158+
block->list.push_back(parent);
159+
block->finalize();
160+
}
161+
return block;
162+
}
156163

164+
// Like `getReplacement`, but the result never contains the parent.
165+
Block* getChildrenReplacement() {
157166
auto* block = Builder(wasm).makeBlock();
158167
block->list.set(sets);
159168
if (hasUnreachableChild) {
160-
// If there is an unreachable child then we do not need the parent at all,
161-
// and we know the type is unreachable.
162169
block->type = Type::unreachable;
163-
} else {
164-
// Otherwise, add the parent and finalize.
165-
block->list.push_back(parent);
166-
block->finalize();
167170
}
168171
return block;
169172
}

src/passes/Inlining.cpp

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "ir/element-utils.h"
3838
#include "ir/find_all.h"
3939
#include "ir/literal-utils.h"
40+
#include "ir/localize.h"
4041
#include "ir/module-utils.h"
4142
#include "ir/names.h"
4243
#include "ir/type-updating.h"
@@ -334,33 +335,16 @@ struct Updater : public PostWalker<Updater> {
334335
return;
335336
}
336337

338+
// Set the children to locals as necessary, then add a branch out of the
339+
// inlined body. The branch label will be set later when we create branch
340+
// targets for the calls.
341+
Block* childBlock = ChildLocalizer(curr, getFunction(), *module, options)
342+
.getChildrenReplacement();
337343
Break* branch = builder->makeBreak(Name());
338-
if (sig.params.size() || curr->template is<CallIndirect>() ||
339-
curr->template is<CallRef>()) {
340-
// Set the children to locals at the original callsite before the branch.
341-
Block* branchBlock = builder->makeBlock();
342-
for (Index i = 0; i < sig.params.size(); ++i) {
343-
auto var = builder->addVar(getFunction(), sig.params[i]);
344-
branchBlock->list.push_back(
345-
builder->makeLocalSet(var, curr->operands[i]));
346-
curr->operands[i] = builder->makeLocalGet(var, sig.params[i]);
347-
}
348-
if (auto* call = curr->template dynCast<CallIndirect>()) {
349-
auto var = builder->addVar(getFunction(), Type::i32);
350-
branchBlock->list.push_back(builder->makeLocalSet(var, call->target));
351-
call->target = builder->makeLocalGet(var, Type::i32);
352-
} else if (auto* call = curr->template dynCast<CallRef>()) {
353-
assert(call->target->type.isSignature());
354-
auto var = builder->addVar(getFunction(), call->target->type);
355-
branchBlock->list.push_back(builder->makeLocalSet(var, call->target));
356-
call->target = builder->makeLocalGet(var, call->target->type);
357-
}
358-
branchBlock->list.push_back(branch);
359-
branchBlock->finalize(Type::unreachable);
360-
replaceCurrent(branchBlock);
361-
} else {
362-
replaceCurrent(branch);
363-
}
344+
childBlock->list.push_back(branch);
345+
childBlock->type = Type::unreachable;
346+
replaceCurrent(childBlock);
347+
364348
curr->isReturn = false;
365349
curr->type = sig.results;
366350
returnCallInfos.push_back({curr, branch});

test/lit/passes/inlining_enable-tail-call.wast

Lines changed: 97 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,9 @@
775775
;; CHECK-NEXT: (block (result i32)
776776
;; CHECK-NEXT: (block $__return_call
777777
;; CHECK-NEXT: (block
778-
;; CHECK-NEXT: (br $__return_call)
778+
;; CHECK-NEXT: (block
779+
;; CHECK-NEXT: (br $__return_call)
780+
;; CHECK-NEXT: )
779781
;; CHECK-NEXT: )
780782
;; CHECK-NEXT: )
781783
;; CHECK-NEXT: (block (result i32)
@@ -800,19 +802,104 @@
800802
(i32.const 42)
801803
)
802804
)
805+
803806
(module
804807
;; CHECK: (type $0 (func))
805808

806809
;; CHECK: (func $0
807810
;; CHECK-NEXT: (local $0 i32)
808-
;; CHECK-NEXT: (local $1 i32)
809811
;; CHECK-NEXT: (block $__inlined_func$1
810812
;; CHECK-NEXT: (block
811813
;; CHECK-NEXT: (block $__return_call
812814
;; CHECK-NEXT: (block
815+
;; CHECK-NEXT: (br $__return_call)
816+
;; CHECK-NEXT: )
817+
;; CHECK-NEXT: (br $__inlined_func$1)
818+
;; CHECK-NEXT: )
819+
;; CHECK-NEXT: (block
820+
;; CHECK-NEXT: (block $__inlined_func$2$1
813821
;; CHECK-NEXT: (local.set $0
814822
;; CHECK-NEXT: (i32.const 42)
815823
;; CHECK-NEXT: )
824+
;; CHECK-NEXT: (drop
825+
;; CHECK-NEXT: (local.get $0)
826+
;; CHECK-NEXT: )
827+
;; CHECK-NEXT: )
828+
;; CHECK-NEXT: )
829+
;; CHECK-NEXT: )
830+
;; CHECK-NEXT: )
831+
;; CHECK-NEXT: )
832+
(func $0
833+
(call $1)
834+
)
835+
(func $1
836+
(return_call $2
837+
(i32.const 42)
838+
)
839+
)
840+
(func $2 (param i32)
841+
(drop
842+
(local.get 0)
843+
)
844+
)
845+
)
846+
847+
(module
848+
;; Same as above, but with nontrivial effects in the children.
849+
;; CHECK: (type $0 (func))
850+
851+
;; CHECK: (type $1 (func (param i32)))
852+
853+
;; CHECK: (func $0
854+
;; CHECK-NEXT: (block $__inlined_func$1
855+
;; CHECK-NEXT: (block
856+
;; CHECK-NEXT: (block $__return_call
857+
;; CHECK-NEXT: (br $__inlined_func$1)
858+
;; CHECK-NEXT: (br $__return_call)
859+
;; CHECK-NEXT: (br $__inlined_func$1)
860+
;; CHECK-NEXT: )
861+
;; CHECK-NEXT: (call $2
862+
;; CHECK-NEXT: (unreachable)
863+
;; CHECK-NEXT: )
864+
;; CHECK-NEXT: )
865+
;; CHECK-NEXT: )
866+
;; CHECK-NEXT: )
867+
(func $0
868+
(call $1)
869+
)
870+
(func $1
871+
(return_call $2
872+
(return)
873+
)
874+
)
875+
;; CHECK: (func $2 (param $0 i32)
876+
;; CHECK-NEXT: (drop
877+
;; CHECK-NEXT: (local.get $0)
878+
;; CHECK-NEXT: )
879+
;; CHECK-NEXT: )
880+
(func $2 (param i32)
881+
(drop
882+
(local.get 0)
883+
)
884+
)
885+
)
886+
887+
(module
888+
;; Same as above, but this time the child is not unreachable.
889+
;; CHECK: (type $0 (func))
890+
891+
;; CHECK: (func $0
892+
;; CHECK-NEXT: (local $0 i32)
893+
;; CHECK-NEXT: (local $1 i32)
894+
;; CHECK-NEXT: (block $__inlined_func$1
895+
;; CHECK-NEXT: (block
896+
;; CHECK-NEXT: (block $__return_call
897+
;; CHECK-NEXT: (block
898+
;; CHECK-NEXT: (local.tee $0
899+
;; CHECK-NEXT: (block
900+
;; CHECK-NEXT: (br $__inlined_func$1)
901+
;; CHECK-NEXT: )
902+
;; CHECK-NEXT: )
816903
;; CHECK-NEXT: (br $__return_call)
817904
;; CHECK-NEXT: )
818905
;; CHECK-NEXT: (br $__inlined_func$1)
@@ -835,7 +922,9 @@
835922
)
836923
(func $1
837924
(return_call $2
838-
(i32.const 42)
925+
(block (result i32)
926+
(return)
927+
)
839928
)
840929
)
841930
(func $2 (param i32)
@@ -844,6 +933,7 @@
844933
)
845934
)
846935
)
936+
847937
(module
848938
;; CHECK: (type $0 (func))
849939

@@ -853,26 +943,18 @@
853943
;; CHECK: (table $0 10 funcref)
854944

855945
;; CHECK: (func $0
856-
;; CHECK-NEXT: (local $0 i32)
857-
;; CHECK-NEXT: (local $1 i32)
858946
;; CHECK-NEXT: (drop
859947
;; CHECK-NEXT: (block (result i32)
860948
;; CHECK-NEXT: (block $__inlined_func$1 (result i32)
861949
;; CHECK-NEXT: (block (result i32)
862950
;; CHECK-NEXT: (block $__return_call
863951
;; CHECK-NEXT: (block
864-
;; CHECK-NEXT: (local.set $0
865-
;; CHECK-NEXT: (i32.const 42)
866-
;; CHECK-NEXT: )
867-
;; CHECK-NEXT: (local.set $1
868-
;; CHECK-NEXT: (i32.const 0)
869-
;; CHECK-NEXT: )
870952
;; CHECK-NEXT: (br $__return_call)
871953
;; CHECK-NEXT: )
872954
;; CHECK-NEXT: )
873955
;; CHECK-NEXT: (call_indirect (type $T)
874-
;; CHECK-NEXT: (local.get $0)
875-
;; CHECK-NEXT: (local.get $1)
956+
;; CHECK-NEXT: (i32.const 42)
957+
;; CHECK-NEXT: (i32.const 0)
876958
;; CHECK-NEXT: )
877959
;; CHECK-NEXT: )
878960
;; CHECK-NEXT: )
@@ -900,23 +982,15 @@
900982
;; CHECK: (table $0 10 funcref)
901983

902984
;; CHECK: (func $0
903-
;; CHECK-NEXT: (local $0 i32)
904-
;; CHECK-NEXT: (local $1 i32)
905985
;; CHECK-NEXT: (block $__inlined_func$1
906986
;; CHECK-NEXT: (block
907987
;; CHECK-NEXT: (block $__return_call
908-
;; CHECK-NEXT: (local.set $0
909-
;; CHECK-NEXT: (i32.const 42)
910-
;; CHECK-NEXT: )
911-
;; CHECK-NEXT: (local.set $1
912-
;; CHECK-NEXT: (i32.const 0)
913-
;; CHECK-NEXT: )
914988
;; CHECK-NEXT: (br $__return_call)
915989
;; CHECK-NEXT: (br $__inlined_func$1)
916990
;; CHECK-NEXT: )
917991
;; CHECK-NEXT: (call_indirect (type $T)
918-
;; CHECK-NEXT: (local.get $0)
919-
;; CHECK-NEXT: (local.get $1)
992+
;; CHECK-NEXT: (i32.const 42)
993+
;; CHECK-NEXT: (i32.const 0)
920994
;; CHECK-NEXT: )
921995
;; CHECK-NEXT: )
922996
;; CHECK-NEXT: )

0 commit comments

Comments
 (0)