diff options
author | Thomas Lively <tlively@google.com> | 2023-12-13 14:05:19 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-13 14:05:19 -0800 |
commit | e9b012ff6e0e55d73d57b9a9bc4f64c15521bde1 (patch) | |
tree | 8a84482f6000638638ee907a35d2ef9b41bf6c6b /test | |
parent | 94f9b9a0c4e57bae64bc787362712874c6d5a00d (diff) | |
download | binaryen-e9b012ff6e0e55d73d57b9a9bc4f64c15521bde1.tar.gz binaryen-e9b012ff6e0e55d73d57b9a9bc4f64c15521bde1.tar.bz2 binaryen-e9b012ff6e0e55d73d57b9a9bc4f64c15521bde1.zip |
Preserve multivalue drops in IRBuilder (#6150)
In Binaryen IR, we allow single `Drop` expressions to drop multiple values
packaged up as a tuple. When using IRBuilder to rebuild IR containing such a
drop, it previously treated the drop as a normal WebAssembly drop that dropped
only a single value, producing invalid IR that had extra, undropped values. Fix
the problem by preserving the arity of `Drop` inputs in IRBuilder. To avoid
bloating the IR, thread the size of the desired value through IRBuilder's pop
implementation so that tuple values do not need to be split up and recombined.
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/outlining.wast | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/test/lit/passes/outlining.wast b/test/lit/passes/outlining.wast index 46a3de0bd..1d7d0e6c2 100644 --- a/test/lit/passes/outlining.wast +++ b/test/lit/passes/outlining.wast @@ -729,20 +729,16 @@ ) ;; Test outlining works with call_indirect -;; 0 results, 2 params, 3 operands +;; 0 results, 0 params, 1 operand (module (table funcref) ;; CHECK: (type $0 (func)) - ;; CHECK: (type $1 (func (param i32 i32))) - ;; CHECK: (table $0 0 funcref) ;; CHECK: (func $outline$ (type $0) - ;; CHECK-NEXT: (call_indirect $0 (type $1) + ;; CHECK-NEXT: (call_indirect $0 (type $0) ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -752,31 +748,29 @@ ;; CHECK-NEXT: ) (func $a (call_indirect - (param i32 i32) (i32.const 0) - (i32.const 1) - (i32.const 2) ) (call_indirect - (param i32 i32) (i32.const 0) - (i32.const 1) - (i32.const 2) ) ) ) ;; Test outlining works with call_indirect -;; 0 results, 0 params, 1 operand +;; 1 result, 0 params, 1 operand (module (table funcref) ;; CHECK: (type $0 (func)) + ;; CHECK: (type $1 (func (result i32))) + ;; CHECK: (table $0 0 funcref) ;; CHECK: (func $outline$ (type $0) - ;; CHECK-NEXT: (call_indirect $0 (type $0) - ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call_indirect $0 (type $1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -785,27 +779,33 @@ ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: ) (func $a - (call_indirect - (i32.const 0) + (drop + (call_indirect + (result i32) + (i32.const 0) + ) ) - (call_indirect - (i32.const 0) + (drop + (call_indirect + (result i32) + (i32.const 0) + ) ) ) ) ;; Test outlining works with call_indirect -;; 1 result, 0 params, 1 operand +;; 2 results, 0 params, 1 operand (module (table funcref) ;; CHECK: (type $0 (func)) - ;; CHECK: (type $1 (func (result i32))) + ;; CHECK: (type $1 (func (result i32 i32))) ;; CHECK: (table $0 0 funcref) ;; CHECK: (func $outline$ (type $0) - ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (tuple.drop 2 ;; CHECK-NEXT: (call_indirect $0 (type $1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -817,15 +817,15 @@ ;; CHECK-NEXT: (call $outline$) ;; CHECK-NEXT: ) (func $a - (drop + (tuple.drop 2 (call_indirect - (result i32) + (result i32 i32) (i32.const 0) ) ) - (drop + (tuple.drop 2 (call_indirect - (result i32) + (result i32 i32) (i32.const 0) ) ) |