Skip to content

Commit dbd7808

Browse files
committed
Fix br_on_non_null value
1 parent 8f2076d commit dbd7808

2 files changed

Lines changed: 30 additions & 11 deletions

File tree

src/passes/Flatten.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
// local, but in principle there's no reason it couldn't be. For now, error on
3838
// this.
3939

40+
#include "wasm-type.h"
4041
#include <ir/branch-utils.h>
4142
#include <ir/effects.h>
4243
#include <ir/eh-utils.h>
@@ -335,10 +336,20 @@ struct Flatten
335336
builder.makeUnary(UnaryOp::EqZInt32,
336337
builder.makeLocalGet(isNullTemp, Type::i32))));
337338

338-
replaceCurrent(builder.makeBreak(
339-
br->name,
340-
nullptr,
341-
builder.makeLocalGet(isNotNullTemp, Type::i32)));
339+
Index breakTargetTemp = getTempForBreakTarget(
340+
br->name, nullableType.with(Nullability::NonNullable));
341+
342+
std::vector<Expression*> successBlock;
343+
successBlock.push_back(builder.makeLocalSet(
344+
breakTargetTemp,
345+
builder.makeRefAs(
346+
RefAsOp::RefAsNonNull,
347+
builder.makeLocalGet(nullableTemp, nullableType))));
348+
successBlock.push_back(builder.makeBreak(br->name));
349+
350+
replaceCurrent(
351+
builder.makeIf(builder.makeLocalGet(isNotNullTemp, Type::i32),
352+
builder.makeBlock(successBlock)));
342353
}
343354
} else if (br->op == BrOnCast || br->op == BrOnCastFail) {
344355
auto sourceType = br->ref->type;

test/lit/passes/flatten_br_on_non_null.wast

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
;; CHECK-NEXT: (local $2 (ref null $s))
1616
;; CHECK-NEXT: (local $3 i32)
1717
;; CHECK-NEXT: (local $4 i32)
18-
;; CHECK-NEXT: (local $5 (ref (exact $s)))
19-
;; CHECK-NEXT: (local $6 (ref null $s))
18+
;; CHECK-NEXT: (local $5 (ref null $s))
19+
;; CHECK-NEXT: (local $6 (ref (exact $s)))
2020
;; CHECK-NEXT: (local $7 (ref $s))
2121
;; CHECK-NEXT: (block $label0
2222
;; CHECK-NEXT: (local.set $1
@@ -35,19 +35,27 @@
3535
;; CHECK-NEXT: (local.get $3)
3636
;; CHECK-NEXT: )
3737
;; CHECK-NEXT: )
38-
;; CHECK-NEXT: (br_if $label0
38+
;; CHECK-NEXT: (if
3939
;; CHECK-NEXT: (local.get $4)
40+
;; CHECK-NEXT: (then
41+
;; CHECK-NEXT: (local.set $5
42+
;; CHECK-NEXT: (ref.as_non_null
43+
;; CHECK-NEXT: (local.get $2)
44+
;; CHECK-NEXT: )
45+
;; CHECK-NEXT: )
46+
;; CHECK-NEXT: (br $label0)
47+
;; CHECK-NEXT: )
4048
;; CHECK-NEXT: )
41-
;; CHECK-NEXT: (local.set $5
49+
;; CHECK-NEXT: (local.set $6
4250
;; CHECK-NEXT: (struct.new_default $s)
4351
;; CHECK-NEXT: )
44-
;; CHECK-NEXT: (local.set $6
45-
;; CHECK-NEXT: (local.get $5)
52+
;; CHECK-NEXT: (local.set $5
53+
;; CHECK-NEXT: (local.get $6)
4654
;; CHECK-NEXT: )
4755
;; CHECK-NEXT: )
4856
;; CHECK-NEXT: (local.set $7
4957
;; CHECK-NEXT: (ref.as_non_null
50-
;; CHECK-NEXT: (local.get $6)
58+
;; CHECK-NEXT: (local.get $5)
5159
;; CHECK-NEXT: )
5260
;; CHECK-NEXT: )
5361
;; CHECK-NEXT: (return

0 commit comments

Comments
 (0)