summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/lit/passes/memory-packing-gc.wast173
1 files changed, 173 insertions, 0 deletions
diff --git a/test/lit/passes/memory-packing-gc.wast b/test/lit/passes/memory-packing-gc.wast
new file mode 100644
index 000000000..8a2e3a5da
--- /dev/null
+++ b/test/lit/passes/memory-packing-gc.wast
@@ -0,0 +1,173 @@
+;; 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 $none_=>_ref|$array| (func (result (ref $array))))
+
+ ;; CHECK: (type $array (array i8))
+ (type $array (array i8))
+
+ ;; CHECK: (data "hello")
+ (data "hello")
+
+ ;; CHECK: (func $array-new-data (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 $none_=>_ref|$array| (func (result (ref $array))))
+
+ ;; CHECK: (type $array (array i8))
+ (type $array (array i8))
+
+ ;; CHECK: (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")
+ (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: (func $no-drop-ends (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 $none_=>_ref|$array| (func (result (ref $array))))
+
+ ;; CHECK: (type $array (array i8))
+ (type $array (array i8))
+
+ ;; CHECK: (memory $mem 1 1)
+ (memory $mem 1 1)
+
+ ;; CHECK: (data "optimize\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
+ (data "optimize\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00me")
+
+ ;; CHECK: (func $no-split (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 $none_=>_ref|$array| (func (result (ref $array))))
+
+ ;; CHECK: (type $array (array i8))
+ (type $array (array i8))
+
+ ;; 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 (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 (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 $none_=>_ref|$array| (func (result (ref $array))))
+
+ ;; 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")
+
+ ;; CHECK: (memory $mem 1 1)
+
+ ;; CHECK: (data (i32.const 0) "optimize")
+
+ ;; CHECK: (data (i32.const 24) "me")
+
+ ;; CHECK: (data "but not\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")
+
+ (memory $mem 1 1)
+
+ ;; CHECK: (func $renumber-segment (result (ref $array))
+ ;; CHECK-NEXT: (array.new_data $array 2
+ ;; 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 $none_=>_ref|$array| (func (result (ref $array))))
+
+ ;; 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")
+
+ ;; CHECK: (memory $mem 1 1)
+
+ ;; CHECK: (data "but not\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")
+
+ (memory $mem 1 1)
+
+ ;; CHECK: (func $renumber-segment (result (ref $array))
+ ;; CHECK-NEXT: (array.new_data $array 0
+ ;; 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)
+ )
+ )
+)