summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm/wasm-binary.cpp28
-rw-r--r--test/lit/passes/roundtrip.wast8
2 files changed, 8 insertions, 28 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index d6eb3b235..011957cd3 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -3006,32 +3006,14 @@ void WasmBinaryReader::skipUnreachableCode() {
void WasmBinaryReader::pushExpression(Expression* curr) {
auto type = curr->type;
if (type.isTuple()) {
- // Store tuple to local and push individual extracted values
+ // Store tuple to local and push individual extracted values.
Builder builder(wasm);
- // Non-nullable types require special handling as they cannot be stored to
- // a local, so we may need to use a different local type than the original.
- auto localType = type;
- if (!wasm.features.hasGCNNLocals()) {
- std::vector<Type> finalTypes;
- for (auto t : type) {
- if (t.isNonNullable()) {
- t = Type(t.getHeapType(), Nullable);
- }
- finalTypes.push_back(t);
- }
- localType = Type(Tuple(finalTypes));
- }
requireFunctionContext("pushExpression-tuple");
- Index tuple = builder.addVar(currFunction, localType);
+ Index tuple = builder.addVar(currFunction, type);
expressionStack.push_back(builder.makeLocalSet(tuple, curr));
- for (Index i = 0; i < localType.size(); ++i) {
- Expression* value =
- builder.makeTupleExtract(builder.makeLocalGet(tuple, localType), i);
- if (localType[i] != type[i]) {
- // We modified this to be nullable; undo that.
- value = builder.makeRefAs(RefAsNonNull, value);
- }
- expressionStack.push_back(value);
+ for (Index i = 0; i < type.size(); ++i) {
+ expressionStack.push_back(
+ builder.makeTupleExtract(builder.makeLocalGet(tuple, type), i));
}
} else {
expressionStack.push_back(curr);
diff --git a/test/lit/passes/roundtrip.wast b/test/lit/passes/roundtrip.wast
index 6b00f2e6d..f41761c2e 100644
--- a/test/lit/passes/roundtrip.wast
+++ b/test/lit/passes/roundtrip.wast
@@ -5,7 +5,7 @@
;; CHECK: (type $none (func))
(type $none (func))
;; CHECK: (func $foo (type $none)
- ;; CHECK-NEXT: (local $0 (funcref (ref null $none)))
+ ;; CHECK-NEXT: (local $0 (funcref (ref $none)))
;; CHECK-NEXT: (local $1 funcref)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (block $label$1 (result funcref (ref $none))
@@ -23,10 +23,8 @@
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
- ;; CHECK-NEXT: (ref.as_non_null
- ;; CHECK-NEXT: (tuple.extract 1
- ;; CHECK-NEXT: (local.get $0)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (tuple.extract 1
+ ;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $1)