blob: 547dec8076eb85886adad20ca7f501de553b08ff [file] [log] [blame] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
;; Test that memory-packing does the right thing in the presence of array.new_data.
;; RUN: foreach %s %t wasm-opt --memory-packing --all-features -S -o - | filecheck %s
(module
;; CHECK: (type $array (array i8))
(type $array (array i8))
(data "hello")
;; CHECK: (type $none_=>_ref|$array| (func (result (ref $array))))
;; CHECK: (data $0 "hello")
;; CHECK: (func $array-new-data (type $none_=>_ref|$array|) (result (ref $array))
;; CHECK-NEXT: (array.new_data $array $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $array-new-data (result (ref $array))
;; The segment is referenced by array.new_data, so it should not be optimized out.
(array.new_data $array 0
(i32.const 0)
(i32.const 5)
)
)
)
(module
;; CHECK: (type $array (array i8))
(type $array (array i8))
(data "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00hello\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
;; CHECK: (type $none_=>_ref|$array| (func (result (ref $array))))
;; CHECK: (data $0 "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00hello\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
;; CHECK: (func $no-drop-ends (type $none_=>_ref|$array|) (result (ref $array))
;; CHECK-NEXT: (array.new_data $array $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $no-drop-ends (result (ref $array))
;; The referenced segment should not have its zeros trimmed.
(array.new_data $array 0
(i32.const 0)
(i32.const 5)
)
)
)
(module
;; CHECK: (type $array (array i8))
(type $array (array i8))
;; CHECK: (type $none_=>_ref|$array| (func (result (ref $array))))
;; CHECK: (memory $mem 1 1)
(memory $mem 1 1)
(data "optimize\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
;; CHECK: (data $0 "optimize\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
;; CHECK: (func $no-split (type $none_=>_ref|$array|) (result (ref $array))
;; CHECK-NEXT: (array.new_data $array $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $no-split (result (ref $array))
;; The referenced segment should not be split.
(array.new_data $array 0
(i32.const 0)
(i32.const 8)
)
)
)
(module
;; CHECK: (type $array (array i8))
(type $array (array i8))
;; CHECK: (type $none_=>_ref|$array| (func (result (ref $array))))
;; CHECK: (memory $mem 1 1)
(memory $mem 1 1)
(data (i32.const 0) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00optimize\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
;; CHECK: (data $0 (i32.const 0) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00optimize\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00")
;; CHECK: (func $no-split-active (type $none_=>_ref|$array|) (result (ref $array))
;; CHECK-NEXT: (array.new_data $array $0
;; CHECK-NEXT: (i32.const 16)
;; CHECK-NEXT: (i32.const 8)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $no-split-active (result (ref $array))
;; The segment should still not be optimized, even though it is an active segment.
;; TODO: We could optimize this better by realizing the array.new_data will trap.
(array.new_data $array 0
(i32.const 16)
(i32.const 8)
)
)
)
(module
;; CHECK: (type $array (array i8))
(type $array (array i8))
(data (i32.const 0) "optimize\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
(data "but not\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
;; CHECK: (type $none_=>_ref|$array| (func (result (ref $array))))
;; CHECK: (memory $mem 1 1)
(memory $mem 1 1)
;; CHECK: (data $0 (i32.const 0) "optimize")
;; CHECK: (data $0.1 (i32.const 24) "me")
;; CHECK: (data $1 "but not\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
;; CHECK: (func $renumber-segment (type $none_=>_ref|$array|) (result (ref $array))
;; CHECK-NEXT: (array.new_data $array $1
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $renumber-segment (result (ref $array))
;; Segment 0 is optimized out, so the segment referenced here should be updated.
(array.new_data $array 1
(i32.const 0)
(i32.const 7)
)
)
)
(module
;; CHECK: (type $array (array i8))
(type $array (array i8))
(data "dead\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00segment")
(data "but not\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
;; CHECK: (type $none_=>_ref|$array| (func (result (ref $array))))
;; CHECK: (memory $mem 1 1)
(memory $mem 1 1)
;; CHECK: (data $1 "but not\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
;; CHECK: (func $renumber-segment (type $none_=>_ref|$array|) (result (ref $array))
;; CHECK-NEXT: (array.new_data $array $1
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (i32.const 7)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $renumber-segment (result (ref $array))
;; Segment 0 is split in two, so the segment referenced here should be updated.
(array.new_data $array 1
(i32.const 0)
(i32.const 7)
)
)
)