Skip to content

Commit a385f3b

Browse files
tlivelyradekdoulik
authored andcommitted
Fix branches to loops in IRBuilder (WebAssembly#6205)
Since branches to loops go to the beginnings of the loops, they should send values matching the input types for the loops (which are always none because we don't support loop input types). IRBuilder was previously using the output types of loops to determine what values the branches should carry, which was incorrect. Fix it.
1 parent fad920e commit a385f3b

File tree

2 files changed

+79
-35
lines changed

2 files changed

+79
-35
lines changed

src/wasm/wasm-ir-builder.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,15 +414,18 @@ Result<Expression*> IRBuilder::getBranchValue(Name labelName,
414414
}
415415
auto scope = getScope(*label);
416416
CHECK_ERR(scope);
417-
std::vector<Expression*> values((*scope)->getResultType().size());
418-
for (size_t i = 0, size = values.size(); i < size; ++i) {
417+
// Loops would receive their input type rather than their output type, if we
418+
// supported that.
419+
size_t numValues = (*scope)->getLoop() ? 0 : (*scope)->getResultType().size();
420+
std::vector<Expression*> values(numValues);
421+
for (size_t i = 0; i < numValues; ++i) {
419422
auto val = pop();
420423
CHECK_ERR(val);
421-
values[size - 1 - i] = *val;
424+
values[numValues - 1 - i] = *val;
422425
}
423-
if (values.size() == 0) {
426+
if (numValues == 0) {
424427
return nullptr;
425-
} else if (values.size() == 1) {
428+
} else if (numValues == 1) {
426429
return values[0];
427430
} else {
428431
return builder.makeTupleMake(values);

test/lit/wat-kitchen-sink.wast

Lines changed: 71 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -46,29 +46,29 @@
4646

4747
;; CHECK: (type $a0 (array i32))
4848

49-
;; CHECK: (type $17 (func (result i64 f32)))
49+
;; CHECK: (type $17 (func (result i64)))
5050

51-
;; CHECK: (type $18 (func (param i32 i32 i32)))
51+
;; CHECK: (type $18 (func (result i64 f32)))
5252

53-
;; CHECK: (type $19 (func (param v128 i32) (result v128)))
53+
;; CHECK: (type $19 (func (param i32 i32 i32)))
54+
55+
;; CHECK: (type $20 (func (param v128 i32) (result v128)))
5456

5557
;; CHECK: (type $packed-i16 (array (mut i16)))
5658

5759
;; CHECK: (type $any-array (array (mut anyref)))
5860

59-
;; CHECK: (type $22 (func (param stringref)))
60-
61-
;; CHECK: (type $23 (func (param stringref stringref) (result i32)))
61+
;; CHECK: (type $23 (func (param stringref)))
6262

63-
;; CHECK: (type $24 (func (param i32 i64) (result f32)))
63+
;; CHECK: (type $24 (func (param stringref stringref) (result i32)))
6464

65-
;; CHECK: (type $25 (func (param i64 v128) (result v128)))
65+
;; CHECK: (type $25 (func (param i32 i64) (result f32)))
6666

67-
;; CHECK: (type $26 (func (param i64 v128)))
67+
;; CHECK: (type $26 (func (param i64 v128) (result v128)))
6868

69-
;; CHECK: (type $27 (func (param i32 i32)))
69+
;; CHECK: (type $27 (func (param i64 v128)))
7070

71-
;; CHECK: (type $28 (func (result i64)))
71+
;; CHECK: (type $28 (func (param i32 i32)))
7272

7373
;; CHECK: (type $29 (func (param i32 i32 f64 f64)))
7474

@@ -860,7 +860,7 @@
860860
drop
861861
)
862862

863-
;; CHECK: (func $locals (type $27) (param $0 i32) (param $x i32)
863+
;; CHECK: (func $locals (type $28) (param $0 i32) (param $x i32)
864864
;; CHECK-NEXT: (local $2 i32)
865865
;; CHECK-NEXT: (local $y i32)
866866
;; CHECK-NEXT: (drop
@@ -2566,7 +2566,7 @@
25662566
br_if 0
25672567
)
25682568

2569-
;; CHECK: (func $br_if-value (type $28) (result i64)
2569+
;; CHECK: (func $br_if-value (type $17) (result i64)
25702570
;; CHECK-NEXT: (block $l (result i64)
25712571
;; CHECK-NEXT: (br_if $l
25722572
;; CHECK-NEXT: (i64.const 0)
@@ -2582,8 +2582,8 @@
25822582
end
25832583
)
25842584

2585-
;; CHECK: (func $br_if-multivalue (type $17) (result i64 f32)
2586-
;; CHECK-NEXT: (block $l (type $17) (result i64 f32)
2585+
;; CHECK: (func $br_if-multivalue (type $18) (result i64 f32)
2586+
;; CHECK-NEXT: (block $l (type $18) (result i64 f32)
25872587
;; CHECK-NEXT: (br_if $l
25882588
;; CHECK-NEXT: (tuple.make 2
25892589
;; CHECK-NEXT: (i64.const 0)
@@ -2602,6 +2602,26 @@
26022602
end
26032603
)
26042604

2605+
;; CHECK: (func $br_if-loop (type $17) (result i64)
2606+
;; CHECK-NEXT: (local $scratch i64)
2607+
;; CHECK-NEXT: (loop $l (result i64)
2608+
;; CHECK-NEXT: (local.set $scratch
2609+
;; CHECK-NEXT: (i64.const 42)
2610+
;; CHECK-NEXT: )
2611+
;; CHECK-NEXT: (br_if $l
2612+
;; CHECK-NEXT: (i32.const 0)
2613+
;; CHECK-NEXT: )
2614+
;; CHECK-NEXT: (local.get $scratch)
2615+
;; CHECK-NEXT: )
2616+
;; CHECK-NEXT: )
2617+
(func $br_if-loop (result i64)
2618+
loop $l (result i64)
2619+
i64.const 42
2620+
i32.const 0
2621+
br_if $l
2622+
end
2623+
)
2624+
26052625
;; CHECK: (func $br-table (type $void)
26062626
;; CHECK-NEXT: (block $a
26072627
;; CHECK-NEXT: (block $b
@@ -2710,6 +2730,27 @@
27102730
end
27112731
)
27122732

2733+
;; CHECK: (func $br-table-loop (type $1) (result i32)
2734+
;; CHECK-NEXT: (loop $a (result i32)
2735+
;; CHECK-NEXT: (loop $b (result i32)
2736+
;; CHECK-NEXT: (drop
2737+
;; CHECK-NEXT: (i32.const 42)
2738+
;; CHECK-NEXT: )
2739+
;; CHECK-NEXT: (br_table $a $b
2740+
;; CHECK-NEXT: (i32.const 0)
2741+
;; CHECK-NEXT: )
2742+
;; CHECK-NEXT: )
2743+
;; CHECK-NEXT: )
2744+
;; CHECK-NEXT: )
2745+
(func $br-table-loop (result i32)
2746+
loop $a (result i32)
2747+
loop $b (result i32)
2748+
i32.const 42
2749+
i32.const 0
2750+
br_table $a $b
2751+
end
2752+
end
2753+
)
27132754

27142755
;; CHECK: (func $binary (type $29) (param $0 i32) (param $1 i32) (param $2 f64) (param $3 f64)
27152756
;; CHECK-NEXT: (drop
@@ -2749,7 +2790,7 @@
27492790
drop
27502791
)
27512792

2752-
;; CHECK: (func $select (type $18) (param $0 i32) (param $1 i32) (param $2 i32)
2793+
;; CHECK: (func $select (type $19) (param $0 i32) (param $1 i32) (param $2 i32)
27532794
;; CHECK-NEXT: (drop
27542795
;; CHECK-NEXT: (select
27552796
;; CHECK-NEXT: (local.get $0)
@@ -3041,7 +3082,7 @@
30413082
i32x4.extract_lane 3
30423083
)
30433084

3044-
;; CHECK: (func $simd-replace (type $19) (param $0 v128) (param $1 i32) (result v128)
3085+
;; CHECK: (func $simd-replace (type $20) (param $0 v128) (param $1 i32) (result v128)
30453086
;; CHECK-NEXT: (i32x4.replace_lane 2
30463087
;; CHECK-NEXT: (local.get $0)
30473088
;; CHECK-NEXT: (local.get $1)
@@ -3079,7 +3120,7 @@
30793120
v128.bitselect
30803121
)
30813122

3082-
;; CHECK: (func $simd-shift (type $19) (param $0 v128) (param $1 i32) (result v128)
3123+
;; CHECK: (func $simd-shift (type $20) (param $0 v128) (param $1 i32) (result v128)
30833124
;; CHECK-NEXT: (i8x16.shl
30843125
;; CHECK-NEXT: (local.get $0)
30853126
;; CHECK-NEXT: (local.get $1)
@@ -3134,7 +3175,7 @@
31343175
v128.store64_lane 5 align=4 0
31353176
)
31363177

3137-
;; CHECK: (func $memory-init (type $18) (param $0 i32) (param $1 i32) (param $2 i32)
3178+
;; CHECK: (func $memory-init (type $19) (param $0 i32) (param $1 i32) (param $2 i32)
31383179
;; CHECK-NEXT: (memory.init $mem-i32 $passive
31393180
;; CHECK-NEXT: (local.get $0)
31403181
;; CHECK-NEXT: (local.get $1)
@@ -3322,7 +3363,7 @@
33223363
(func $ref-func
33233364
ref.func $ref-func
33243365
drop
3325-
ref.func 140
3366+
ref.func 142
33263367
drop
33273368
)
33283369

@@ -4113,7 +4154,7 @@
41134154
string.const "\00\00\00"
41144155
)
41154156

4116-
;; CHECK: (func $string-measure (type $22) (param $0 stringref)
4157+
;; CHECK: (func $string-measure (type $23) (param $0 stringref)
41174158
;; CHECK-NEXT: (drop
41184159
;; CHECK-NEXT: (string.measure_wtf8
41194160
;; CHECK-NEXT: (local.get $0)
@@ -4170,7 +4211,7 @@
41704211
stringview_wtf16.length
41714212
)
41724213

4173-
;; CHECK: (func $string-encode (type $22) (param $0 stringref)
4214+
;; CHECK: (func $string-encode (type $23) (param $0 stringref)
41744215
;; CHECK-NEXT: (drop
41754216
;; CHECK-NEXT: (string.encode_wtf8
41764217
;; CHECK-NEXT: (local.get $0)
@@ -4241,7 +4282,7 @@
42414282
string.concat
42424283
)
42434284

4244-
;; CHECK: (func $string-eq (type $23) (param $0 stringref) (param $1 stringref) (result i32)
4285+
;; CHECK: (func $string-eq (type $24) (param $0 stringref) (param $1 stringref) (result i32)
42454286
;; CHECK-NEXT: (string.eq
42464287
;; CHECK-NEXT: (local.get $0)
42474288
;; CHECK-NEXT: (local.get $1)
@@ -4253,7 +4294,7 @@
42534294
string.eq
42544295
)
42554296

4256-
;; CHECK: (func $string-compare (type $23) (param $0 stringref) (param $1 stringref) (result i32)
4297+
;; CHECK: (func $string-compare (type $24) (param $0 stringref) (param $1 stringref) (result i32)
42574298
;; CHECK-NEXT: (string.compare
42584299
;; CHECK-NEXT: (local.get $0)
42594300
;; CHECK-NEXT: (local.get $1)
@@ -4396,7 +4437,7 @@
43964437
stringview_iter.slice
43974438
)
43984439

4399-
;; CHECK: (func $call (type $24) (param $0 i32) (param $1 i64) (result f32)
4440+
;; CHECK: (func $call (type $25) (param $0 i32) (param $1 i64) (result f32)
44004441
;; CHECK-NEXT: (call $call
44014442
;; CHECK-NEXT: (local.get $0)
44024443
;; CHECK-NEXT: (local.get $1)
@@ -4408,7 +4449,7 @@
44084449
call $call
44094450
)
44104451

4411-
;; CHECK: (func $return_call (type $24) (param $0 i32) (param $1 i64) (result f32)
4452+
;; CHECK: (func $return_call (type $25) (param $0 i32) (param $1 i64) (result f32)
44124453
;; CHECK-NEXT: (return_call $return_call
44134454
;; CHECK-NEXT: (local.get $0)
44144455
;; CHECK-NEXT: (local.get $1)
@@ -4449,7 +4490,7 @@
44494490
;; CHECK-NEXT: (local.get $0)
44504491
;; CHECK-NEXT: )
44514492
;; CHECK-NEXT: (drop
4452-
;; CHECK-NEXT: (call_indirect $timport$0 (type $25)
4493+
;; CHECK-NEXT: (call_indirect $timport$0 (type $26)
44534494
;; CHECK-NEXT: (local.get $1)
44544495
;; CHECK-NEXT: (local.get $2)
44554496
;; CHECK-NEXT: (local.get $0)
@@ -4511,7 +4552,7 @@
45114552
;; CHECK-NEXT: (local.get $0)
45124553
;; CHECK-NEXT: )
45134554
;; CHECK-NEXT: (drop
4514-
;; CHECK-NEXT: (call_indirect $timport$0 (type $25)
4555+
;; CHECK-NEXT: (call_indirect $timport$0 (type $26)
45154556
;; CHECK-NEXT: (local.get $1)
45164557
;; CHECK-NEXT: (local.get $2)
45174558
;; CHECK-NEXT: (local.get $0)
@@ -4583,7 +4624,7 @@
45834624
;; CHECK-NEXT: (return_call_indirect $funcs (type $void)
45844625
;; CHECK-NEXT: (local.get $0)
45854626
;; CHECK-NEXT: )
4586-
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $26)
4627+
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $27)
45874628
;; CHECK-NEXT: (local.get $1)
45884629
;; CHECK-NEXT: (local.get $2)
45894630
;; CHECK-NEXT: (local.get $0)
@@ -4642,7 +4683,7 @@
46424683
;; CHECK-NEXT: (return_call_indirect $funcs (type $void)
46434684
;; CHECK-NEXT: (local.get $0)
46444685
;; CHECK-NEXT: )
4645-
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $26)
4686+
;; CHECK-NEXT: (return_call_indirect $timport$0 (type $27)
46464687
;; CHECK-NEXT: (local.get $1)
46474688
;; CHECK-NEXT: (local.get $2)
46484689
;; CHECK-NEXT: (local.get $0)

0 commit comments

Comments
 (0)