From 06b53ce65b980b9dca2a09e833965ce627d96b8a Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Thu, 8 Jan 2026 00:01:47 +0000 Subject: [PATCH] Port tests to list --- .../safe-heap_enable-threads_enable-simd.wast | 11131 +++++++++++++++ ...afe-heap_enable-threads_enable-simd64.wast | 11423 ++++++++++++++++ ...ory-unused_enable-threads_enable-simd.wast | 11131 +++++++++++++++ .../safe-heap_enable-threads_enable-simd.txt | 10803 --------------- .../safe-heap_enable-threads_enable-simd.wast | 55 - ...e-heap_enable-threads_enable-simd64.passes | 1 - ...safe-heap_enable-threads_enable-simd64.txt | 11095 --------------- ...afe-heap_enable-threads_enable-simd64.wast | 56 - ...mory-unused_enable-threads_enable-simd.txt | 10803 --------------- ...ory-unused_enable-threads_enable-simd.wast | 56 - 10 files changed, 33685 insertions(+), 32869 deletions(-) create mode 100644 test/lit/passes/safe-heap_enable-threads_enable-simd.wast create mode 100644 test/lit/passes/safe-heap_enable-threads_enable-simd64.wast create mode 100644 test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast delete mode 100644 test/passes/safe-heap_enable-threads_enable-simd.txt delete mode 100644 test/passes/safe-heap_enable-threads_enable-simd.wast delete mode 100644 test/passes/safe-heap_enable-threads_enable-simd64.passes delete mode 100644 test/passes/safe-heap_enable-threads_enable-simd64.txt delete mode 100644 test/passes/safe-heap_enable-threads_enable-simd64.wast delete mode 100644 test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt delete mode 100644 test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast diff --git a/test/lit/passes/safe-heap_enable-threads_enable-simd.wast b/test/lit/passes/safe-heap_enable-threads_enable-simd.wast new file mode 100644 index 00000000000..6ba85e772b1 --- /dev/null +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd.wast @@ -0,0 +1,11131 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. + +;; RUN: foreach %s %t wasm-opt --safe-heap --enable-threads --enable-simd -S -o - | filecheck %s + +(module + (memory 100 100 shared) + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $2 (func (param i32 i32 i64))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func)) + + ;; CHECK: (type $7 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $8 (func (param i32 i32 f64))) + + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 100 100 shared) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 31) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_2 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_1 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_1_1 + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_2_U_2 + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_1_1 + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_2_U_2 + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_4_4 + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_8_4 + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_8_8 + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_f32_4_4 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_f64_8_8 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_v128_16_16 + ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i32.const 1))) + (drop (i32.atomic.load (i32.const 1))) + (drop (i32.load offset=31 (i32.const 2))) + (drop (i32.load align=2 (i32.const 3))) + (drop (i32.load align=1 (i32.const 4))) + (drop (i32.load8_s (i32.const 5))) + (drop (i32.load16_u (i32.const 6))) + (drop (i64.load8_s (i32.const 7))) + (drop (i64.load16_u (i32.const 8))) + (drop (i64.load32_s (i32.const 9))) + (drop (i64.load align=4 (i32.const 10))) + (drop (i64.load (i32.const 11))) + (drop (f32.load (i32.const 12))) + (drop (f64.load (i32.const 13))) + (drop (v128.load (i32.const 14))) + ) + ;; CHECK: (func $stores + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 31) + ;; CHECK-NEXT: (i32.const 200) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_2 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 300) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_1 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 400) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_1_1 + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 500) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_2_2 + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 600) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_1_1 + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 700) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_2_2 + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 800) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_4_4 + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 900) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_8_4 + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 1000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_8_8 + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 1100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_f32_4_4 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (f32.const 1200) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_f64_8_8 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (f64.const 1300) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_v128_16_16 + ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $stores + (i32.store (i32.const 1) (i32.const 100)) + (i32.atomic.store (i32.const 1) (i32.const 100)) + (i32.store offset=31 (i32.const 2) (i32.const 200)) + (i32.store align=2 (i32.const 3) (i32.const 300)) + (i32.store align=1 (i32.const 4) (i32.const 400)) + (i32.store8 (i32.const 5) (i32.const 500)) + (i32.store16 (i32.const 6) (i32.const 600)) + (i64.store8 (i32.const 7) (i64.const 700)) + (i64.store16 (i32.const 8) (i64.const 800)) + (i64.store32 (i32.const 9) (i64.const 900)) + (i64.store align=4 (i32.const 10) (i64.const 1000)) + (i64.store (i32.const 11) (i64.const 1100)) + (f32.store (i32.const 12) (f32.const 1200)) + (f64.store (i32.const 13) (f64.const 1300)) + (v128.store (i32.const 14) (v128.const i32x4 1 2 3 4)) + ) +) +;; not shared +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + (memory 100 100) + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32 i64))) + + ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i32.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $2 (func (param i32 i32 i64))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (memory $0 100 100 shared) + (memory $0 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $actions + (drop (i32.load (i32.const 1))) + (i32.store (i32.const 1) (i32.const 100)) + ) +) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) diff --git a/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast b/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast new file mode 100644 index 00000000000..890887abd06 --- /dev/null +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast @@ -0,0 +1,11423 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. + +;; RUN: foreach %s %t wasm-opt --safe-heap --enable-threads --enable-simd --enable-memory64 -S -o - | filecheck %s + +(module + (memory i64 100 100 shared) + ;; CHECK: (type $0 (func (param i64 i64) (result i64))) + + ;; CHECK: (type $1 (func (param i64 i64) (result i32))) + + ;; CHECK: (type $2 (func (param i64 i64 i64))) + + ;; CHECK: (type $3 (func (param i64 i64 i32))) + + ;; CHECK: (type $4 (func (param i64 i64) (result v128))) + + ;; CHECK: (type $5 (func (param i64 i64 v128))) + + ;; CHECK: (type $6 (func)) + + ;; CHECK: (type $7 (func (param i64 i64) (result f64))) + + ;; CHECK: (type $8 (func (param i64 i64 f64))) + + ;; CHECK: (type $9 (func (param i64 i64) (result f32))) + + ;; CHECK: (type $10 (func (param i64 i64 f32))) + + ;; CHECK: (type $11 (func (result i64))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 i64 100 100 shared) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i64.const 2) + ;; CHECK-NEXT: (i64.const 31) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_2 + ;; CHECK-NEXT: (i64.const 3) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_1 + ;; CHECK-NEXT: (i64.const 4) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_1_1 + ;; CHECK-NEXT: (i64.const 5) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_2_U_2 + ;; CHECK-NEXT: (i64.const 6) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_1_1 + ;; CHECK-NEXT: (i64.const 7) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_2_U_2 + ;; CHECK-NEXT: (i64.const 8) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_4_4 + ;; CHECK-NEXT: (i64.const 9) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_8_4 + ;; CHECK-NEXT: (i64.const 10) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_8_8 + ;; CHECK-NEXT: (i64.const 11) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_f32_4_4 + ;; CHECK-NEXT: (i64.const 12) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_f64_8_8 + ;; CHECK-NEXT: (i64.const 13) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_v128_16_16 + ;; CHECK-NEXT: (i64.const 14) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i64.const 1))) + (drop (i32.atomic.load (i64.const 1))) + (drop (i32.load offset=31 (i64.const 2))) + (drop (i32.load align=2 (i64.const 3))) + (drop (i32.load align=1 (i64.const 4))) + (drop (i32.load8_s (i64.const 5))) + (drop (i32.load16_u (i64.const 6))) + (drop (i64.load8_s (i64.const 7))) + (drop (i64.load16_u (i64.const 8))) + (drop (i64.load32_s (i64.const 9))) + (drop (i64.load align=4 (i64.const 10))) + (drop (i64.load (i64.const 11))) + (drop (f32.load (i64.const 12))) + (drop (f64.load (i64.const 13))) + (drop (v128.load (i64.const 14))) + ) + ;; CHECK: (func $stores + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i64.const 2) + ;; CHECK-NEXT: (i64.const 31) + ;; CHECK-NEXT: (i32.const 200) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_2 + ;; CHECK-NEXT: (i64.const 3) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i32.const 300) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_1 + ;; CHECK-NEXT: (i64.const 4) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i32.const 400) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_1_1 + ;; CHECK-NEXT: (i64.const 5) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i32.const 500) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_2_2 + ;; CHECK-NEXT: (i64.const 6) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i32.const 600) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_1_1 + ;; CHECK-NEXT: (i64.const 7) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i64.const 700) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_2_2 + ;; CHECK-NEXT: (i64.const 8) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i64.const 800) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_4_4 + ;; CHECK-NEXT: (i64.const 9) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i64.const 900) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_8_4 + ;; CHECK-NEXT: (i64.const 10) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i64.const 1000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_8_8 + ;; CHECK-NEXT: (i64.const 11) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i64.const 1100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_f32_4_4 + ;; CHECK-NEXT: (i64.const 12) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (f32.const 1200) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_f64_8_8 + ;; CHECK-NEXT: (i64.const 13) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (f64.const 1300) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_v128_16_16 + ;; CHECK-NEXT: (i64.const 14) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $stores + (i32.store (i64.const 1) (i32.const 100)) + (i32.atomic.store (i64.const 1) (i32.const 100)) + (i32.store offset=31 (i64.const 2) (i32.const 200)) + (i32.store align=2 (i64.const 3) (i32.const 300)) + (i32.store align=1 (i64.const 4) (i32.const 400)) + (i32.store8 (i64.const 5) (i32.const 500)) + (i32.store16 (i64.const 6) (i32.const 600)) + (i64.store8 (i64.const 7) (i64.const 700)) + (i64.store16 (i64.const 8) (i64.const 800)) + (i64.store32 (i64.const 9) (i64.const 900)) + (i64.store align=4 (i64.const 10) (i64.const 1000)) + (i64.store (i64.const 11) (i64.const 1100)) + (f32.store (i64.const 12) (f32.const 1200)) + (f64.store (i64.const 13) (f64.const 1300)) + (v128.store (i64.const 14) (v128.const i32x4 1 2 3 4)) + ) +) +;; not shared +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + (memory i64 100 100) + ;; CHECK: (type $0 (func (param i64 i64) (result i64))) + + ;; CHECK: (type $1 (func (param i64 i64 i64))) + + ;; CHECK: (type $2 (func (param i64 i64) (result i32))) + + ;; CHECK: (type $3 (func (param i64 i64 i32))) + + ;; CHECK: (type $4 (func (param i64 i64) (result v128))) + + ;; CHECK: (type $5 (func (param i64 i64 v128))) + + ;; CHECK: (type $6 (func (param i64 i64) (result f64))) + + ;; CHECK: (type $7 (func (param i64 i64 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i64 i64) (result f32))) + + ;; CHECK: (type $10 (func (param i64 i64 f32))) + + ;; CHECK: (type $11 (func (result i64))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 i64 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i64.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i64 i64) (result i64))) + + ;; CHECK: (type $1 (func (param i64 i64) (result i32))) + + ;; CHECK: (type $2 (func (param i64 i64 i64))) + + ;; CHECK: (type $3 (func (param i64 i64 i32))) + + ;; CHECK: (type $4 (func (param i64 i64) (result v128))) + + ;; CHECK: (type $5 (func (param i64 i64 v128))) + + ;; CHECK: (type $6 (func (param i64 i64) (result f64))) + + ;; CHECK: (type $7 (func (param i64 i64 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i64 i64) (result f32))) + + ;; CHECK: (type $10 (func (param i64 i64 f32))) + + ;; CHECK: (type $11 (func (result i64))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) + (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (memory $0 i64 100 100 shared) + (memory $0 i64 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $actions + (drop (i32.load (i64.const 1))) + (i32.store (i64.const 1) (i32.const 100)) + ) +) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) diff --git a/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast b/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast new file mode 100644 index 00000000000..f66e9bad90e --- /dev/null +++ b/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast @@ -0,0 +1,11131 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. + +;; RUN: foreach %s %t wasm-opt --safe-heap --low-memory-unused --enable-threads --enable-simd -S -o - | filecheck %s + +(module + (memory 100 100 shared) + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $2 (func (param i32 i32 i64))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func)) + + ;; CHECK: (type $7 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $8 (func (param i32 i32 f64))) + + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 100 100 shared) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 31) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_2 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_1 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_1_1 + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_2_U_2 + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_1_1 + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_2_U_2 + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_4_4 + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_8_4 + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i64_8_8 + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_f32_4_4 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_f64_8_8 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_v128_16_16 + ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i32.const 1))) + (drop (i32.atomic.load (i32.const 1))) + (drop (i32.load offset=31 (i32.const 2))) + (drop (i32.load align=2 (i32.const 3))) + (drop (i32.load align=1 (i32.const 4))) + (drop (i32.load8_s (i32.const 5))) + (drop (i32.load16_u (i32.const 6))) + (drop (i64.load8_s (i32.const 7))) + (drop (i64.load16_u (i32.const 8))) + (drop (i64.load32_s (i32.const 9))) + (drop (i64.load align=4 (i32.const 10))) + (drop (i64.load (i32.const 11))) + (drop (f32.load (i32.const 12))) + (drop (f64.load (i32.const 13))) + (drop (v128.load (i32.const 14))) + ) + ;; CHECK: (func $stores + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 31) + ;; CHECK-NEXT: (i32.const 200) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_2 + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 300) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_1 + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 400) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_1_1 + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 500) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_2_2 + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 600) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_1_1 + ;; CHECK-NEXT: (i32.const 7) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 700) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_2_2 + ;; CHECK-NEXT: (i32.const 8) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 800) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_4_4 + ;; CHECK-NEXT: (i32.const 9) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 900) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_8_4 + ;; CHECK-NEXT: (i32.const 10) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 1000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i64_8_8 + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i64.const 1100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_f32_4_4 + ;; CHECK-NEXT: (i32.const 12) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (f32.const 1200) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_f64_8_8 + ;; CHECK-NEXT: (i32.const 13) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (f64.const 1300) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_v128_16_16 + ;; CHECK-NEXT: (i32.const 14) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $stores + (i32.store (i32.const 1) (i32.const 100)) + (i32.atomic.store (i32.const 1) (i32.const 100)) + (i32.store offset=31 (i32.const 2) (i32.const 200)) + (i32.store align=2 (i32.const 3) (i32.const 300)) + (i32.store align=1 (i32.const 4) (i32.const 400)) + (i32.store8 (i32.const 5) (i32.const 500)) + (i32.store16 (i32.const 6) (i32.const 600)) + (i64.store8 (i32.const 7) (i64.const 700)) + (i64.store16 (i32.const 8) (i64.const 800)) + (i64.store32 (i32.const 9) (i64.const 900)) + (i64.store align=4 (i32.const 10) (i64.const 1000)) + (i64.store (i32.const 11) (i64.const 1100)) + (f32.store (i32.const 12) (f32.const 1200)) + (f64.store (i32.const 13) (f64.const 1300)) + (v128.store (i32.const 14) (v128.const i32x4 1 2 3 4)) + ) +) +;; not shared +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + (memory 100 100) + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32 i64))) + + ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i32.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $2 (func (param i32 i32 i64))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) + (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (memory $0 100 100 shared) + (memory $0 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $actions + (drop (i32.load (i32.const 1))) + (i32.store (i32.const 1) (i32.const 100)) + ) +) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) diff --git a/test/passes/safe-heap_enable-threads_enable-simd.txt b/test/passes/safe-heap_enable-threads_enable-simd.txt deleted file mode 100644 index ffc912a3c74..00000000000 --- a/test/passes/safe-heap_enable-threads_enable-simd.txt +++ /dev/null @@ -1,10803 +0,0 @@ -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func)) - (type $7 (func (param i32 i32) (result f64))) - (type $8 (func (param i32 i32 f64))) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_A - (i32.const 1) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 2) - (i32.const 31) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_2 - (i32.const 3) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_1 - (i32.const 4) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_1_1 - (i32.const 5) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_2_U_2 - (i32.const 6) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_1_1 - (i32.const 7) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_2_U_2 - (i32.const 8) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_4_4 - (i32.const 9) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_4 - (i32.const 10) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_8 - (i32.const 11) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f32_4_4 - (i32.const 12) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f64_8_8 - (i32.const 13) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_v128_16_16 - (i32.const 14) - (i32.const 0) - ) - ) - ) - (func $stores - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_A - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 2) - (i32.const 31) - (i32.const 200) - ) - (call $SAFE_HEAP_STORE_i32_4_2 - (i32.const 3) - (i32.const 0) - (i32.const 300) - ) - (call $SAFE_HEAP_STORE_i32_4_1 - (i32.const 4) - (i32.const 0) - (i32.const 400) - ) - (call $SAFE_HEAP_STORE_i32_1_1 - (i32.const 5) - (i32.const 0) - (i32.const 500) - ) - (call $SAFE_HEAP_STORE_i32_2_2 - (i32.const 6) - (i32.const 0) - (i32.const 600) - ) - (call $SAFE_HEAP_STORE_i64_1_1 - (i32.const 7) - (i32.const 0) - (i64.const 700) - ) - (call $SAFE_HEAP_STORE_i64_2_2 - (i32.const 8) - (i32.const 0) - (i64.const 800) - ) - (call $SAFE_HEAP_STORE_i64_4_4 - (i32.const 9) - (i32.const 0) - (i64.const 900) - ) - (call $SAFE_HEAP_STORE_i64_8_4 - (i32.const 10) - (i32.const 0) - (i64.const 1000) - ) - (call $SAFE_HEAP_STORE_i64_8_8 - (i32.const 11) - (i32.const 0) - (i64.const 1100) - ) - (call $SAFE_HEAP_STORE_f32_4_4 - (i32.const 12) - (i32.const 0) - (f32.const 1200) - ) - (call $SAFE_HEAP_STORE_f64_8_8 - (i32.const 13) - (i32.const 0) - (f64.const 1300) - ) - (call $SAFE_HEAP_STORE_v128_16_16 - (i32.const 14) - (i32.const 0) - (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32 i64))) - (type $2 (func (param i32 i32) (result i32))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $8 (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (memory $0 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) diff --git a/test/passes/safe-heap_enable-threads_enable-simd.wast b/test/passes/safe-heap_enable-threads_enable-simd.wast deleted file mode 100644 index a973230a527..00000000000 --- a/test/passes/safe-heap_enable-threads_enable-simd.wast +++ /dev/null @@ -1,55 +0,0 @@ -(module - (memory 100 100 shared) - (func $loads - (drop (i32.load (i32.const 1))) - (drop (i32.atomic.load (i32.const 1))) - (drop (i32.load offset=31 (i32.const 2))) - (drop (i32.load align=2 (i32.const 3))) - (drop (i32.load align=1 (i32.const 4))) - (drop (i32.load8_s (i32.const 5))) - (drop (i32.load16_u (i32.const 6))) - (drop (i64.load8_s (i32.const 7))) - (drop (i64.load16_u (i32.const 8))) - (drop (i64.load32_s (i32.const 9))) - (drop (i64.load align=4 (i32.const 10))) - (drop (i64.load (i32.const 11))) - (drop (f32.load (i32.const 12))) - (drop (f64.load (i32.const 13))) - (drop (v128.load (i32.const 14))) - ) - (func $stores - (i32.store (i32.const 1) (i32.const 100)) - (i32.atomic.store (i32.const 1) (i32.const 100)) - (i32.store offset=31 (i32.const 2) (i32.const 200)) - (i32.store align=2 (i32.const 3) (i32.const 300)) - (i32.store align=1 (i32.const 4) (i32.const 400)) - (i32.store8 (i32.const 5) (i32.const 500)) - (i32.store16 (i32.const 6) (i32.const 600)) - (i64.store8 (i32.const 7) (i64.const 700)) - (i64.store16 (i32.const 8) (i64.const 800)) - (i64.store32 (i32.const 9) (i64.const 900)) - (i64.store align=4 (i32.const 10) (i64.const 1000)) - (i64.store (i32.const 11) (i64.const 1100)) - (f32.store (i32.const 12) (f32.const 1200)) - (f64.store (i32.const 13) (f64.const 1300)) - (v128.store (i32.const 14) (v128.const i32x4 1 2 3 4)) - ) -) -;; not shared -(module - (memory 100 100) - (func $loads - (drop (i32.load (i32.const 1))) - ) -) -;; pre-existing -(module - (type $FUNCSIG$v (func)) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $actions - (drop (i32.load (i32.const 1))) - (i32.store (i32.const 1) (i32.const 100)) - ) -) diff --git a/test/passes/safe-heap_enable-threads_enable-simd64.passes b/test/passes/safe-heap_enable-threads_enable-simd64.passes deleted file mode 100644 index 67d7eef552b..00000000000 --- a/test/passes/safe-heap_enable-threads_enable-simd64.passes +++ /dev/null @@ -1 +0,0 @@ -safe-heap_enable-threads_enable-simd_enable-memory64 diff --git a/test/passes/safe-heap_enable-threads_enable-simd64.txt b/test/passes/safe-heap_enable-threads_enable-simd64.txt deleted file mode 100644 index 38482cd7d1c..00000000000 --- a/test/passes/safe-heap_enable-threads_enable-simd64.txt +++ /dev/null @@ -1,11095 +0,0 @@ -(module - (type $0 (func (param i64 i64) (result i64))) - (type $1 (func (param i64 i64) (result i32))) - (type $2 (func (param i64 i64 i64))) - (type $3 (func (param i64 i64 i32))) - (type $4 (func (param i64 i64) (result v128))) - (type $5 (func (param i64 i64 v128))) - (type $6 (func)) - (type $7 (func (param i64 i64) (result f64))) - (type $8 (func (param i64 i64 f64))) - (type $9 (func (param i64 i64) (result f32))) - (type $10 (func (param i64 i64 f32))) - (type $11 (func (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100 shared) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 1) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_A - (i64.const 1) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 2) - (i64.const 31) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_2 - (i64.const 3) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_1 - (i64.const 4) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_1_1 - (i64.const 5) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_2_U_2 - (i64.const 6) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_1_1 - (i64.const 7) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_2_U_2 - (i64.const 8) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_4_4 - (i64.const 9) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_4 - (i64.const 10) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_8 - (i64.const 11) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f32_4_4 - (i64.const 12) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f64_8_8 - (i64.const 13) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_v128_16_16 - (i64.const 14) - (i64.const 0) - ) - ) - ) - (func $stores - (call $SAFE_HEAP_STORE_i32_4_4 - (i64.const 1) - (i64.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_A - (i64.const 1) - (i64.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i64.const 2) - (i64.const 31) - (i32.const 200) - ) - (call $SAFE_HEAP_STORE_i32_4_2 - (i64.const 3) - (i64.const 0) - (i32.const 300) - ) - (call $SAFE_HEAP_STORE_i32_4_1 - (i64.const 4) - (i64.const 0) - (i32.const 400) - ) - (call $SAFE_HEAP_STORE_i32_1_1 - (i64.const 5) - (i64.const 0) - (i32.const 500) - ) - (call $SAFE_HEAP_STORE_i32_2_2 - (i64.const 6) - (i64.const 0) - (i32.const 600) - ) - (call $SAFE_HEAP_STORE_i64_1_1 - (i64.const 7) - (i64.const 0) - (i64.const 700) - ) - (call $SAFE_HEAP_STORE_i64_2_2 - (i64.const 8) - (i64.const 0) - (i64.const 800) - ) - (call $SAFE_HEAP_STORE_i64_4_4 - (i64.const 9) - (i64.const 0) - (i64.const 900) - ) - (call $SAFE_HEAP_STORE_i64_8_4 - (i64.const 10) - (i64.const 0) - (i64.const 1000) - ) - (call $SAFE_HEAP_STORE_i64_8_8 - (i64.const 11) - (i64.const 0) - (i64.const 1100) - ) - (call $SAFE_HEAP_STORE_f32_4_4 - (i64.const 12) - (i64.const 0) - (f32.const 1200) - ) - (call $SAFE_HEAP_STORE_f64_8_8 - (i64.const 13) - (i64.const 0) - (f64.const 1300) - ) - (call $SAFE_HEAP_STORE_v128_16_16 - (i64.const 14) - (i64.const 0) - (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i64 i64) (result i64))) - (type $1 (func (param i64 i64 i64))) - (type $2 (func (param i64 i64) (result i32))) - (type $3 (func (param i64 i64 i32))) - (type $4 (func (param i64 i64) (result v128))) - (type $5 (func (param i64 i64 v128))) - (type $6 (func (param i64 i64) (result f64))) - (type $7 (func (param i64 i64 f64))) - (type $8 (func)) - (type $9 (func (param i64 i64) (result f32))) - (type $10 (func (param i64 i64 f32))) - (type $11 (func (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 1) - (i64.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i64 i64) (result i64))) - (type $1 (func (param i64 i64) (result i32))) - (type $2 (func (param i64 i64 i64))) - (type $3 (func (param i64 i64 i32))) - (type $4 (func (param i64 i64) (result v128))) - (type $5 (func (param i64 i64 v128))) - (type $6 (func (param i64 i64) (result f64))) - (type $7 (func (param i64 i64 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i64 i64) (result f32))) - (type $10 (func (param i64 i64 f32))) - (type $11 (func (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 1) - (i64.const 0) - ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i64.const 1) - (i64.const 0) - (i32.const 100) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) diff --git a/test/passes/safe-heap_enable-threads_enable-simd64.wast b/test/passes/safe-heap_enable-threads_enable-simd64.wast deleted file mode 100644 index dc70a037b1c..00000000000 --- a/test/passes/safe-heap_enable-threads_enable-simd64.wast +++ /dev/null @@ -1,56 +0,0 @@ -(module - (memory i64 100 100 shared) - (func $loads - (drop (i32.load (i64.const 1))) - (drop (i32.atomic.load (i64.const 1))) - (drop (i32.load offset=31 (i64.const 2))) - (drop (i32.load align=2 (i64.const 3))) - (drop (i32.load align=1 (i64.const 4))) - (drop (i32.load8_s (i64.const 5))) - (drop (i32.load16_u (i64.const 6))) - (drop (i64.load8_s (i64.const 7))) - (drop (i64.load16_u (i64.const 8))) - (drop (i64.load32_s (i64.const 9))) - (drop (i64.load align=4 (i64.const 10))) - (drop (i64.load (i64.const 11))) - (drop (f32.load (i64.const 12))) - (drop (f64.load (i64.const 13))) - (drop (v128.load (i64.const 14))) - ) - (func $stores - (i32.store (i64.const 1) (i32.const 100)) - (i32.atomic.store (i64.const 1) (i32.const 100)) - (i32.store offset=31 (i64.const 2) (i32.const 200)) - (i32.store align=2 (i64.const 3) (i32.const 300)) - (i32.store align=1 (i64.const 4) (i32.const 400)) - (i32.store8 (i64.const 5) (i32.const 500)) - (i32.store16 (i64.const 6) (i32.const 600)) - (i64.store8 (i64.const 7) (i64.const 700)) - (i64.store16 (i64.const 8) (i64.const 800)) - (i64.store32 (i64.const 9) (i64.const 900)) - (i64.store align=4 (i64.const 10) (i64.const 1000)) - (i64.store (i64.const 11) (i64.const 1100)) - (f32.store (i64.const 12) (f32.const 1200)) - (f64.store (i64.const 13) (f64.const 1300)) - (v128.store (i64.const 14) (v128.const i32x4 1 2 3 4)) - ) -) -;; not shared -(module - (memory i64 100 100) - (func $loads - (drop (i32.load (i64.const 1))) - ) -) -;; pre-existing -(module - (type $FUNCSIG$v (func)) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100 shared) - (func $actions - (drop (i32.load (i64.const 1))) - (i32.store (i64.const 1) (i32.const 100)) - ) -) diff --git a/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt b/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt deleted file mode 100644 index 72b68f218e5..00000000000 --- a/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt +++ /dev/null @@ -1,10803 +0,0 @@ -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func)) - (type $7 (func (param i32 i32) (result f64))) - (type $8 (func (param i32 i32 f64))) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_A - (i32.const 1) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 2) - (i32.const 31) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_2 - (i32.const 3) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_1 - (i32.const 4) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_1_1 - (i32.const 5) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_2_U_2 - (i32.const 6) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_1_1 - (i32.const 7) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_2_U_2 - (i32.const 8) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_4_4 - (i32.const 9) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_4 - (i32.const 10) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_8 - (i32.const 11) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f32_4_4 - (i32.const 12) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f64_8_8 - (i32.const 13) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_v128_16_16 - (i32.const 14) - (i32.const 0) - ) - ) - ) - (func $stores - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_A - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 2) - (i32.const 31) - (i32.const 200) - ) - (call $SAFE_HEAP_STORE_i32_4_2 - (i32.const 3) - (i32.const 0) - (i32.const 300) - ) - (call $SAFE_HEAP_STORE_i32_4_1 - (i32.const 4) - (i32.const 0) - (i32.const 400) - ) - (call $SAFE_HEAP_STORE_i32_1_1 - (i32.const 5) - (i32.const 0) - (i32.const 500) - ) - (call $SAFE_HEAP_STORE_i32_2_2 - (i32.const 6) - (i32.const 0) - (i32.const 600) - ) - (call $SAFE_HEAP_STORE_i64_1_1 - (i32.const 7) - (i32.const 0) - (i64.const 700) - ) - (call $SAFE_HEAP_STORE_i64_2_2 - (i32.const 8) - (i32.const 0) - (i64.const 800) - ) - (call $SAFE_HEAP_STORE_i64_4_4 - (i32.const 9) - (i32.const 0) - (i64.const 900) - ) - (call $SAFE_HEAP_STORE_i64_8_4 - (i32.const 10) - (i32.const 0) - (i64.const 1000) - ) - (call $SAFE_HEAP_STORE_i64_8_8 - (i32.const 11) - (i32.const 0) - (i64.const 1100) - ) - (call $SAFE_HEAP_STORE_f32_4_4 - (i32.const 12) - (i32.const 0) - (f32.const 1200) - ) - (call $SAFE_HEAP_STORE_f64_8_8 - (i32.const 13) - (i32.const 0) - (f64.const 1300) - ) - (call $SAFE_HEAP_STORE_v128_16_16 - (i32.const 14) - (i32.const 0) - (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32 i64))) - (type $2 (func (param i32 i32) (result i32))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $8 (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) diff --git a/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast b/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast deleted file mode 100644 index 6b0adf3e3cd..00000000000 --- a/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast +++ /dev/null @@ -1,56 +0,0 @@ -(module - (memory 100 100 shared) - (func $loads - (drop (i32.load (i32.const 1))) - (drop (i32.atomic.load (i32.const 1))) - (drop (i32.load offset=31 (i32.const 2))) - (drop (i32.load align=2 (i32.const 3))) - (drop (i32.load align=1 (i32.const 4))) - (drop (i32.load8_s (i32.const 5))) - (drop (i32.load16_u (i32.const 6))) - (drop (i64.load8_s (i32.const 7))) - (drop (i64.load16_u (i32.const 8))) - (drop (i64.load32_s (i32.const 9))) - (drop (i64.load align=4 (i32.const 10))) - (drop (i64.load (i32.const 11))) - (drop (f32.load (i32.const 12))) - (drop (f64.load (i32.const 13))) - (drop (v128.load (i32.const 14))) - ) - (func $stores - (i32.store (i32.const 1) (i32.const 100)) - (i32.atomic.store (i32.const 1) (i32.const 100)) - (i32.store offset=31 (i32.const 2) (i32.const 200)) - (i32.store align=2 (i32.const 3) (i32.const 300)) - (i32.store align=1 (i32.const 4) (i32.const 400)) - (i32.store8 (i32.const 5) (i32.const 500)) - (i32.store16 (i32.const 6) (i32.const 600)) - (i64.store8 (i32.const 7) (i64.const 700)) - (i64.store16 (i32.const 8) (i64.const 800)) - (i64.store32 (i32.const 9) (i64.const 900)) - (i64.store align=4 (i32.const 10) (i64.const 1000)) - (i64.store (i32.const 11) (i64.const 1100)) - (f32.store (i32.const 12) (f32.const 1200)) - (f64.store (i32.const 13) (f64.const 1300)) - (v128.store (i32.const 14) (v128.const i32x4 1 2 3 4)) - ) -) -;; not shared -(module - (memory 100 100) - (func $loads - (drop (i32.load (i32.const 1))) - ) -) -;; pre-existing -(module - (type $FUNCSIG$v (func)) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $actions - (drop (i32.load (i32.const 1))) - (i32.store (i32.const 1) (i32.const 100)) - ) -)