summaryrefslogtreecommitdiff
path: root/test/lit/passes
diff options
context:
space:
mode:
Diffstat (limited to 'test/lit/passes')
-rw-r--r--test/lit/passes/memory-packing_traps.wast85
1 files changed, 85 insertions, 0 deletions
diff --git a/test/lit/passes/memory-packing_traps.wast b/test/lit/passes/memory-packing_traps.wast
new file mode 100644
index 000000000..e7677ff84
--- /dev/null
+++ b/test/lit/passes/memory-packing_traps.wast
@@ -0,0 +1,85 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+
+;; RUN: foreach %s %t wasm-opt --memory-packing -all --zero-filled-memory -S -o - | filecheck %s
+;; RUN: foreach %s %t wasm-opt --memory-packing -all --zero-filled-memory -tnh -S -o - | filecheck %s --check-prefix=TNH__
+
+(module
+ ;; We should not optimize out a segment that will trap, as that is an effect
+ ;; we need to preserve (unless TrapsNeverHappen).
+ ;; CHECK: (memory $memory 1 2)
+ ;; TNH__: (memory $memory 1 2)
+ (memory $memory 1 2)
+ ;; CHECK: (data $data (i32.const -1) "\00")
+ (data $data (i32.const -1) "\00")
+)
+
+(module
+ ;; We should handle the possible overflow in adding the offset and size, and
+ ;; see this might trap. To keep the segment trapping, we will emit a segment
+ ;; with offset -1 of size 1 (which is the minimal thing we need for a trap).
+ ;; CHECK: (memory $memory 1 2)
+ ;; TNH__: (memory $memory 1 2)
+ (memory $memory 1 2)
+ ;; CHECK: (data $data (i32.const -1) "\00")
+ (data $data (i32.const -2) "\00\00\00")
+)
+
+(module
+ ;; This segment will almost trap, but not.
+ ;; CHECK: (memory $memory 1 2)
+ ;; TNH__: (memory $memory 1 2)
+ (memory $memory 1 2)
+ (data $data (i32.const 65535) "\00")
+)
+
+(module
+ ;; This one is slightly larger, and will trap. We can at least shorten the
+ ;; segment to only contain one byte, at the highest address the segment would
+ ;; write to.
+ ;; CHECK: (memory $memory 1 2)
+ ;; TNH__: (memory $memory 1 2)
+ (memory $memory 1 2)
+ ;; CHECK: (data $data (i32.const 65536) "\00")
+ (data $data (i32.const 65535) "\00\00")
+)
+
+(module
+ ;; This one is slightly larger, but the offset is lower so it will not trap.
+ ;; CHECK: (memory $memory 1 2)
+ ;; TNH__: (memory $memory 1 2)
+ (memory $memory 1 2)
+ (data $data (i32.const 65534) "\00\00")
+)
+
+(module
+ ;; This one's offset is just large enough to trap.
+ ;; CHECK: (memory $memory 1 2)
+ ;; TNH__: (memory $memory 1 2)
+ (memory $memory 1 2)
+ ;; CHECK: (data $data (i32.const 65536) "\00")
+ (data $data (i32.const 65536) "\00")
+)
+
+(module
+ ;; This offset is unknown, so assume the worst.
+ ;; TODO: We could remove it in TNH mode
+
+ ;; CHECK: (import "a" "b" (global $g i32))
+ ;; TNH__: (import "a" "b" (global $g i32))
+ (import "a" "b" (global $g i32))
+ ;; CHECK: (memory $memory 1 2)
+ ;; TNH__: (memory $memory 1 2)
+ (memory $memory 1 2)
+ ;; CHECK: (data $data (global.get $g) "\00")
+ ;; TNH__: (data $data (global.get $g) "\00")
+ (data $data (global.get $g) "\00")
+)
+
+(module
+ ;; Passive segments cannot trap during startup and are removable if they have
+ ;; no uses, like here.
+ ;; CHECK: (memory $memory 1 2)
+ ;; TNH__: (memory $memory 1 2)
+ (memory $memory 1 2)
+ (data $data "\00\00\00")
+)