| ;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. |
| ;; RUN: wasm-opt %s --simplify-locals -all -S -o - \ |
| ;; RUN: | filecheck %s |
| |
| (module |
| (memory 10 10) |
| |
| ;; CHECK: (type $array (sub (array (mut i8)))) |
| (type $array (sub (array (mut i8)))) |
| ;; CHECK: (type $array16 (sub (array (mut i16)))) |
| (type $array16 (sub (array (mut i16)))) |
| |
| ;; CHECK: (func $no-new-past-store (type $2) (param $array (ref $array)) (param $array16 (ref $array16)) |
| ;; CHECK-NEXT: (local $temp stringref) |
| ;; CHECK-NEXT: (local.set $temp |
| ;; CHECK-NEXT: (string.new_lossy_utf8_array |
| ;; CHECK-NEXT: (local.get $array) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (array.set $array |
| ;; CHECK-NEXT: (local.get $array) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $temp |
| ;; CHECK-NEXT: (string.new_wtf16_array |
| ;; CHECK-NEXT: (local.get $array16) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (array.set $array |
| ;; CHECK-NEXT: (local.get $array) |
| ;; CHECK-NEXT: (i32.const 3) |
| ;; CHECK-NEXT: (i32.const 4) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $no-new-past-store (param $array (ref $array)) (param $array16 (ref $array16)) |
| (local $temp stringref) |
| ;; A string.new_***_array cannot be moved past a GC store. |
| (local.set $temp |
| (string.new_lossy_utf8_array |
| (local.get $array) |
| (i32.const 1) |
| (i32.const 2) |
| ) |
| ) |
| (array.set $array |
| (local.get $array) |
| (i32.const 3) |
| (i32.const 4) |
| ) |
| (drop |
| (local.get $temp) |
| ) |
| (local.set $temp |
| (string.new_wtf16_array |
| (local.get $array16) |
| (i32.const 1) |
| (i32.const 2) |
| ) |
| ) |
| (array.set $array |
| (local.get $array) |
| (i32.const 3) |
| (i32.const 4) |
| ) |
| (drop |
| (local.get $temp) |
| ) |
| ) |
| |
| ;; CHECK: (func $yes-new-past-load (type $3) (param $array16 (ref $array16)) |
| ;; CHECK-NEXT: (local $temp stringref) |
| ;; CHECK-NEXT: (nop) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (array.get_u $array16 |
| ;; CHECK-NEXT: (local.get $array16) |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (string.new_wtf16_array |
| ;; CHECK-NEXT: (local.get $array16) |
| ;; CHECK-NEXT: (i32.const 1) |
| ;; CHECK-NEXT: (i32.const 2) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $yes-new-past-load (param $array16 (ref $array16)) |
| (local $temp stringref) |
| ;; A string.new can be moved past an array load. |
| (local.set $temp |
| (string.new_wtf16_array |
| (local.get $array16) |
| (i32.const 1) |
| (i32.const 2) |
| ) |
| ) |
| (drop |
| (array.get $array16 |
| (local.get $array16) |
| (i32.const 0) |
| ) |
| ) |
| (drop |
| (local.get $temp) |
| ) |
| ) |
| |
| ;; CHECK: (func $no-load-past-encode (type $4) (param $ref stringref) (param $array (ref $array)) (param $array16 (ref $array16)) |
| ;; CHECK-NEXT: (local $temp i32) |
| ;; CHECK-NEXT: (local.set $temp |
| ;; CHECK-NEXT: (array.get_u $array |
| ;; CHECK-NEXT: (local.get $array) |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (string.encode_lossy_utf8_array |
| ;; CHECK-NEXT: (local.get $ref) |
| ;; CHECK-NEXT: (local.get $array) |
| ;; CHECK-NEXT: (i32.const 10) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (local.set $temp |
| ;; CHECK-NEXT: (array.get_u $array |
| ;; CHECK-NEXT: (local.get $array) |
| ;; CHECK-NEXT: (i32.const 0) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (string.encode_wtf16_array |
| ;; CHECK-NEXT: (local.get $ref) |
| ;; CHECK-NEXT: (local.get $array16) |
| ;; CHECK-NEXT: (i32.const 20) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: (drop |
| ;; CHECK-NEXT: (local.get $temp) |
| ;; CHECK-NEXT: ) |
| ;; CHECK-NEXT: ) |
| (func $no-load-past-encode (param $ref stringref) (param $array (ref $array)) (param $array16 (ref $array16)) |
| (local $temp i32) |
| ;; string.encode_*_array writes to an array, so an array get can't be moved |
| ;; past it. |
| (local.set $temp |
| (array.get $array |
| (local.get $array) |
| (i32.const 0) |
| ) |
| ) |
| (drop |
| (string.encode_lossy_utf8_array |
| (local.get $ref) |
| (local.get $array) |
| (i32.const 10) |
| ) |
| ) |
| (drop |
| (local.get $temp) |
| ) |
| (local.set $temp |
| (array.get $array |
| (local.get $array) |
| (i32.const 0) |
| ) |
| ) |
| (drop |
| (string.encode_wtf16_array |
| (local.get $ref) |
| (local.get $array16) |
| (i32.const 20) |
| ) |
| ) |
| (drop |
| (local.get $temp) |
| ) |
| ) |
| ) |