diff options
Diffstat (limited to 'test/lit')
-rw-r--r-- | test/lit/passes/optimize-instructions-gc.wast | 72 | ||||
-rw-r--r-- | test/lit/passes/optimize-instructions.wast | 195 |
2 files changed, 267 insertions, 0 deletions
diff --git a/test/lit/passes/optimize-instructions-gc.wast b/test/lit/passes/optimize-instructions-gc.wast index 78a08d9b1..3ae0e1d91 100644 --- a/test/lit/passes/optimize-instructions-gc.wast +++ b/test/lit/passes/optimize-instructions-gc.wast @@ -829,4 +829,76 @@ ) ) ) + ;; CHECK: (func $ternary-identical-arms (param $x i32) (param $y (ref null $struct)) (param $z (ref null $struct)) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (ref.is_null + ;; CHECK-NEXT: (if (result (ref null $struct)) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms (param $x i32) (param $y (ref null $struct)) (param $z (ref null $struct)) + (drop + (if (result i32) + (local.get $x) + (ref.is_null (local.get $y)) + (ref.is_null (local.get $z)) + ) + ) + ) + ;; CHECK: (func $ternary-identical-arms-but-side-effect (param $x (ref null $struct)) (param $y (ref null $struct)) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (struct.get_u $struct $i8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.get_u $struct $i8 + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-but-side-effect (param $x (ref null $struct)) (param $y (ref null $struct)) (param $z i32) + (drop + (select + ;; the arms are equal but have side effects + (struct.get_u $struct 0 + (local.get $x) + ) + (struct.get_u $struct 0 + (local.get $y) + ) + (local.get $z) + ) + ) + ) + ;; CHECK: (func $ternary-identical-arms-no-side-effect (param $x (ref $struct)) (param $y (ref $struct)) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (struct.get_u $struct $i8 + ;; CHECK-NEXT: (select (result (ref $struct)) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-no-side-effect (param $x (ref $struct)) (param $y (ref $struct)) (param $z i32) + (drop + (select + ;; the arms are equal and as the params are non-null, there are no possible side effects + (struct.get_u $struct 0 + (local.get $x) + ) + (struct.get_u $struct 0 + (local.get $y) + ) + (local.get $z) + ) + ) + ) ) diff --git a/test/lit/passes/optimize-instructions.wast b/test/lit/passes/optimize-instructions.wast index bb05f17ba..7150fc839 100644 --- a/test/lit/passes/optimize-instructions.wast +++ b/test/lit/passes/optimize-instructions.wast @@ -11818,4 +11818,199 @@ ) ) ) + ;; CHECK: (func $ternary-identical-arms (param $x i32) (param $y i32) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms (param $x i32) (param $y i32) (param $z i32) + (drop + (select + (i32.eqz (local.get $x)) + (i32.eqz (local.get $y)) + (local.get $z) + ) + ) + ) + ;; CHECK: (func $ternary-identical-arms-if (param $x i32) (param $y i32) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (if (result i32) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-if (param $x i32) (param $y i32) (param $z i32) + (drop + (if (result i32) + (local.get $z) + (i32.eqz (local.get $x)) + (i32.eqz (local.get $y)) + ) + ) + ) + ;; CHECK: (func $ternary-identical-arms-type-change (param $x f64) (param $y f64) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.demote_f64 + ;; CHECK-NEXT: (f64.floor + ;; CHECK-NEXT: (if (result f64) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-type-change (param $x f64) (param $y f64) (param $z i32) + (drop + ;; the if's type begins as f32, but after moving code out it will be + ;; f64 + (if (result f32) + (local.get $z) + (f32.demote_f64 (f64.floor (local.get $x))) + (f32.demote_f64 (f64.floor (local.get $y))) + ) + ) + ) + ;; CHECK: (func $ternary-identical-arms-more (param $x f32) (param $y f32) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.floor + ;; CHECK-NEXT: (f32.neg + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-more (param $x f32) (param $y f32) (param $z i32) + (drop + (select + (f32.floor (f32.neg (local.get $x))) + (f32.floor (f32.neg (local.get $y))) + (local.get $z) + ) + ) + ) + ;; CHECK: (func $ternary-identical-arms-morer (param $x f32) (param $y f32) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.abs + ;; CHECK-NEXT: (f32.floor + ;; CHECK-NEXT: (f32.neg + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-morer (param $x f32) (param $y f32) (param $z i32) + (drop + (select + (f32.abs (f32.floor (f32.neg (local.get $x)))) + (f32.abs (f32.floor (f32.neg (local.get $y)))) + (local.get $z) + ) + ) + ) + ;; CHECK: (func $ternary-identical-arms-but-type-is-none (param $x i32) (param $y i32) (param $z i32) + ;; CHECK-NEXT: (if + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-but-type-is-none (param $x i32) (param $y i32) (param $z i32) + (if + (local.get $z) + ;; identical arms, but type is none + (drop (i32.eqz (local.get $x))) + (drop (i32.eqz (local.get $y))) + ) + ) + ;; CHECK: (func $ternary-identical-arms-but-block (param $x i32) (param $y i32) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (block $block (result i32) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (block $block24 (result i32) + ;; CHECK-NEXT: (i32.eqz + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-but-block (param $x i32) (param $y i32) (param $z i32) + (drop + (select + ;; identical arms, but they are control flow structures + (block (result i32) + (i32.eqz (local.get $x)) + ) + (block (result i32) + (i32.eqz (local.get $y)) + ) + (local.get $z) + ) + ) + ) + ;; CHECK: (func $ternary-identical-arms-but-binary (param $x i32) (param $y i32) (param $z i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $z) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ternary-identical-arms-but-binary (param $x i32) (param $y i32) (param $z i32) + (drop + (select + ;; identical arms, but they are binaries, not unaries + (i32.add + (local.get $x) + (local.get $x) + ) + (i32.add + (local.get $y) + (local.get $y) + ) + (local.get $z) + ) + ) + ) ) |