From 02003f396889d0044b123517f9a8be5d213782a8 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Wed, 8 Jul 2026 23:16:59 -0700 Subject: [PATCH 1/2] Allow atomic operations on non-shared memory in SafeHeap SafeHeap needs to generate atomic helper functions even if the memory is not shared, because atomic instructions can still be used when threads feature is enabled. Also, removed the now-unused 'shared' parameter from isPossibleAtomicOperation, added a test case, and updated existing tests. TAG=agy CONV=75c799ef-6dca-4712-8ffe-d8d1dfaffd0b --- src/passes/SafeHeap.cpp | 12 +- .../safe-heap_enable-threads_enable-simd.wast | 1438 +++++-- ...afe-heap_enable-threads_enable-simd64.wast | 1432 +++++-- ..._enable-simd64_enable-relaxed-atomics.wast | 2480 ++++++++++-- ...ds_enable-simd_enable-relaxed-atomics.wast | 2410 ++++++++++-- ...ory-unused_enable-threads_enable-simd.wast | 1438 +++++-- ...ds_enable-simd_enable-relaxed-atomics.wast | 2410 ++++++++++-- test/lit/passes/safe-heap_no-shared.wast | 3482 +++++++++++++++++ 8 files changed, 13444 insertions(+), 1658 deletions(-) create mode 100644 test/lit/passes/safe-heap_no-shared.wast diff --git a/src/passes/SafeHeap.cpp b/src/passes/SafeHeap.cpp index d5a4f8843de..7bbf8689617 100644 --- a/src/passes/SafeHeap.cpp +++ b/src/passes/SafeHeap.cpp @@ -223,8 +223,8 @@ struct SafeHeap : public Pass { } bool - isPossibleAtomicOperation(Index align, Index bytes, bool shared, Type type) { - return align == bytes && shared && type.isInteger(); + isPossibleAtomicOperation(Index align, Index bytes, Type type) { + return align == bytes && type.isInteger(); } void addGlobals(Module* module, FeatureSet features) { @@ -264,8 +264,8 @@ struct SafeHeap : public Pass { for (MemoryOrder memoryOrder : memoryOrdersToGenerate) { load.order = memoryOrder; if (load.isAtomic() && - !isPossibleAtomicOperation( - align, bytes, module->memories[0]->shared, type)) { + (!features.hasAtomics() || + !isPossibleAtomicOperation(align, bytes, type))) { continue; } addLoadFunc(load, module); @@ -300,8 +300,8 @@ struct SafeHeap : public Pass { for (auto memoryOrder : memoryOrdersToGenerate) { store.order = memoryOrder; if (store.isAtomic() && - !isPossibleAtomicOperation( - align, bytes, module->memories[0]->shared, valueType)) { + (!features.hasAtomics() || + !isPossibleAtomicOperation(align, bytes, valueType))) { continue; } addStoreFunc(store, module); diff --git a/test/lit/passes/safe-heap_enable-threads_enable-simd.wast b/test/lit/passes/safe-heap_enable-threads_enable-simd.wast index 9f43f1aee48..6640d76cf2c 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd.wast @@ -4147,9 +4147,9 @@ (memory 100 100) ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - ;; CHECK: (type $1 (func (param i32 i32 i64))) + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) - ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + ;; CHECK: (type $2 (func (param i32 i32 i64))) ;; CHECK: (type $3 (func (param i32 i32 i32))) @@ -4230,7 +4230,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4265,12 +4265,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u -;; CHECK-NEXT: (local.get $2) +;; 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_2_1 (param $0 i32) (param $1 i32) (result i32) +;; 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 @@ -4288,7 +4294,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4305,12 +4311,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4328,7 +4334,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4345,21 +4351,12 @@ ;; 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: (i32.atomic.load8_u ;; 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: (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 @@ -4394,12 +4391,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (i32.load16_s 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: (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 @@ -4443,12 +4440,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i32.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4466,7 +4463,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4483,12 +4480,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_4_2 (param $0 i32) (param $1 i32) (result i32) +;; 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 @@ -4506,7 +4518,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4523,21 +4535,12 @@ ;; 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: (i32.load16_u align=1 ;; 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: (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 @@ -4555,7 +4558,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4575,18 +4578,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4604,7 +4607,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4621,12 +4624,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; 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_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -4644,7 +4656,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4661,12 +4673,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load align=1 ;; 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: (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 @@ -4684,7 +4696,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4701,12 +4713,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; 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_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -4724,7 +4745,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4744,18 +4765,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load ;; 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: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4773,7 +4794,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4790,12 +4811,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; 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_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -4813,7 +4843,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4830,21 +4860,12 @@ ;; 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: (i64.load8_s ;; 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: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4862,7 +4883,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4879,12 +4900,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_4_2 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -4902,7 +4929,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4919,21 +4946,12 @@ ;; 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: (i64.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4951,7 +4969,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4968,21 +4986,12 @@ ;; 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: (i64.atomic.load8_u ;; 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: (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 @@ -5000,7 +5009,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5017,12 +5026,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_s 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: (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 @@ -5040,7 +5049,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5066,12 +5075,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5089,7 +5098,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5109,18 +5118,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; 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: (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_8_1 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -5138,7 +5153,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5155,12 +5170,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u 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: (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 @@ -5178,7 +5193,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5204,12 +5219,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5227,7 +5242,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5247,18 +5262,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.atomic.load16_u ;; 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: (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 @@ -5276,7 +5291,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; 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) @@ -5296,18 +5351,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load32_s align=2 ;; 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: (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 @@ -5342,12 +5397,116 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; 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_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (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_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 @@ -5391,12 +5550,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u 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: (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 @@ -5440,12 +5599,61 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; 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: (func $SAFE_HEAP_LOAD_i64_4_U_SC (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_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5480,12 +5688,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.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: (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 @@ -5529,12 +5737,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.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: (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 @@ -5578,12 +5786,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.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: (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 @@ -5627,12 +5835,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.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: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5650,14 +5858,706 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; 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_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_1_SC (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_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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5667,14 +6567,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -5683,21 +6584,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5709,21 +6610,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) +;; 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.load align=2 +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) ;; 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: (func $SAFE_HEAP_STORE_i32_2_SC (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) @@ -5732,21 +6634,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5758,21 +6660,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; 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.load align=4 +;; CHECK-NEXT: (i32.atomic.store16 +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -5781,21 +6684,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5805,23 +6708,15 @@ ;; 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: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -5830,21 +6725,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5856,19 +6751,20 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 15) +;; 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.load +;; 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_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -5886,7 +6782,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5903,13 +6799,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; 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_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_SC (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -5927,7 +6832,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5944,13 +6849,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 +;; 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_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -5968,7 +6882,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5985,22 +6899,13 @@ ;; 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: (i64.store8 ;; 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: (func $SAFE_HEAP_STORE_i64_1_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6018,7 +6923,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6035,13 +6940,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (i64.atomic.store8 ;; 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: (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 @@ -6059,7 +6964,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6076,22 +6981,13 @@ ;; 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: (i64.store16 align=1 ;; 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: (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 @@ -6109,7 +7005,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6129,19 +7025,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (i64.store16 ;; 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: (func $SAFE_HEAP_STORE_i64_2_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6159,7 +7055,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6176,13 +7072,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6200,7 +7105,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6217,13 +7122,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; 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_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6241,7 +7146,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6267,13 +7172,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6308,13 +7213,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; 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_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6352,19 +7266,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; 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: (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 @@ -6382,7 +7296,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6399,22 +7313,13 @@ ;; 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: (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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6449,13 +7354,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6493,19 +7407,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; 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_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6543,19 +7457,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.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: (func $SAFE_HEAP_STORE_i64_8_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6599,7 +7513,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; 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 index bc471fe67d3..fbfdfe93996 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast @@ -4253,9 +4253,9 @@ (memory i64 100 100) ;; CHECK: (type $0 (func (param i64 i64) (result i64))) - ;; CHECK: (type $1 (func (param i64 i64 i64))) + ;; CHECK: (type $1 (func (param i64 i64) (result i32))) - ;; CHECK: (type $2 (func (param i64 i64) (result i32))) + ;; CHECK: (type $2 (func (param i64 i64 i64))) ;; CHECK: (type $3 (func (param i64 i64 i32))) @@ -4336,7 +4336,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4371,12 +4371,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u -;; CHECK-NEXT: (local.get $2) +;; 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_2_1 (param $0 i64) (param $1 i64) (result i32) +;; 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 @@ -4394,7 +4400,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4411,12 +4417,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4434,7 +4440,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4451,23 +4457,12 @@ ;; 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: (i32.atomic.load8_u ;; 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: (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 @@ -4502,12 +4497,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (i32.load16_s 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: (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 @@ -4553,12 +4548,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i32.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4576,7 +4571,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4593,12 +4588,29 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_4_2 (param $0 i64) (param $1 i64) (result i32) +;; 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 @@ -4616,7 +4628,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4633,23 +4645,12 @@ ;; 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: (i32.load16_u align=1 ;; 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: (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 @@ -4667,7 +4668,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4689,18 +4690,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4718,7 +4719,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4735,12 +4736,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; 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_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; 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 @@ -4758,7 +4770,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4775,12 +4787,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load align=1 ;; 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: (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 @@ -4798,7 +4810,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4815,12 +4827,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; 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_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; 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 @@ -4838,7 +4861,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4860,18 +4883,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load ;; 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: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4889,7 +4912,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4906,12 +4929,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; 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_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; 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 @@ -4929,7 +4963,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4946,23 +4980,12 @@ ;; 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: (i64.load8_s ;; 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: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4980,7 +5003,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4997,12 +5020,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_4_2 (param $0 i64) (param $1 i64) (result i64) +;; 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 @@ -5020,7 +5049,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5037,23 +5066,12 @@ ;; 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: (i64.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5071,7 +5089,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5088,23 +5106,12 @@ ;; 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: (i64.atomic.load8_u ;; 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: (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 @@ -5122,7 +5129,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5139,12 +5146,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_s 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: (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 @@ -5162,7 +5169,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5190,12 +5197,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5213,7 +5220,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5235,18 +5242,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; 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: (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_8_1 (param $0 i64) (param $1 i64) (result i64) +;; 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 @@ -5264,7 +5277,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5281,12 +5294,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u 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: (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 @@ -5304,7 +5317,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5332,12 +5345,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5355,7 +5368,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5377,18 +5390,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.atomic.load16_u ;; 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: (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 @@ -5406,7 +5419,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5423,23 +5436,12 @@ ;; 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: (i64.load32_s align=1 ;; 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: (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 @@ -5474,12 +5476,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; 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_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; 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 @@ -5519,18 +5532,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_s ;; 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: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5576,12 +5589,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load -;; CHECK-NEXT: (local.get $2) +;; 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_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; 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 @@ -5599,7 +5618,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5616,12 +5635,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.load32_u 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: (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 @@ -5639,7 +5658,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5667,12 +5686,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.load32_u 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: (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 @@ -5690,7 +5709,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5718,12 +5737,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load32_u ;; 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: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5741,7 +5760,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5763,18 +5782,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.atomic.load32_u ;; 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: (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 @@ -5792,7 +5811,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5809,12 +5828,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (i64.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: (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 @@ -5832,7 +5851,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5860,12 +5879,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (i64.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: (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 @@ -5883,7 +5902,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5911,12 +5930,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (i64.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: (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 @@ -5934,7 +5953,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5962,12 +5981,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (i64.load ;; 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: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5985,7 +6004,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6007,20 +6026,20 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (i64.atomic.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: (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) @@ -6029,21 +6048,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i64.const 1) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6053,15 +6072,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f32.load align=1 ;; 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: (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) @@ -6070,21 +6088,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i64.const 2) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6094,15 +6112,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; 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_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; 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) @@ -6111,21 +6139,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i64.const 2) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6138,23 +6166,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f32.load ;; 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: (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) @@ -6163,21 +6190,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i64.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6187,15 +6214,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=1 ;; 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: (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) @@ -6204,21 +6230,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i64.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6231,7 +6257,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -6239,15 +6265,14 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=2 ;; 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: (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) @@ -6256,21 +6281,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i64.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6283,7 +6308,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) @@ -6291,15 +6316,14 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=4 ;; 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: (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) @@ -6308,14 +6332,733 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i64.const 1) +;; 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_1_SC (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_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_2_SC (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_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_i32_4_SC (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_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) @@ -6338,6 +7081,47 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_SC (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_2_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 @@ -6431,6 +7215,58 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_SC (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_4_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 @@ -6576,6 +7412,58 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_SC (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_8_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 @@ -6773,6 +7661,58 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_SC (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_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 diff --git a/test/lit/passes/safe-heap_enable-threads_enable-simd64_enable-relaxed-atomics.wast b/test/lit/passes/safe-heap_enable-threads_enable-simd64_enable-relaxed-atomics.wast index cc04ae60be9..d078f2009cc 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd64_enable-relaxed-atomics.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd64_enable-relaxed-atomics.wast @@ -5193,9 +5193,9 @@ (memory i64 100 100) ;; CHECK: (type $0 (func (param i64 i64) (result i64))) - ;; CHECK: (type $1 (func (param i64 i64 i64))) + ;; CHECK: (type $1 (func (param i64 i64) (result i32))) - ;; CHECK: (type $2 (func (param i64 i64) (result i32))) + ;; CHECK: (type $2 (func (param i64 i64 i64))) ;; CHECK: (type $3 (func (param i64 i64 i32))) @@ -5276,7 +5276,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5311,12 +5311,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; 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_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5334,7 +5340,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5351,12 +5357,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_2_2 (param $0 i64) (param $1 i64) (result i32) +;; 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 @@ -5374,7 +5386,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5391,23 +5403,12 @@ ;; 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: (i32.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5425,7 +5426,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5442,12 +5443,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5465,7 +5466,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5482,23 +5483,12 @@ ;; 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: (i32.atomic.load8_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: (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 @@ -5516,7 +5506,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5533,12 +5523,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_s 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: (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 @@ -5556,7 +5546,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5584,12 +5574,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5607,7 +5597,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5629,18 +5619,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; 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_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5658,7 +5654,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5675,52 +5671,29 @@ ;; 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: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 ;; 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: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $segfault) -;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; 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_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; 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 @@ -5755,12 +5728,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_u 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: (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 @@ -5806,12 +5779,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5846,12 +5819,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5897,12 +5881,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.atomic.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: (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 @@ -5937,12 +5921,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load 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: (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 @@ -5988,12 +5972,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load 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: (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 @@ -6039,12 +6023,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; 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: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6079,12 +6063,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6124,18 +6119,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i32.atomic.load ;; 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: (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 @@ -6153,7 +6148,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6170,23 +6165,12 @@ ;; 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: (i64.load8_s ;; 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: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6204,7 +6188,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6221,12 +6205,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; 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_8_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6244,7 +6234,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6261,23 +6251,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) +;; 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 @@ -6295,7 +6280,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6312,23 +6297,52 @@ ;; 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_1_U_AR (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.and -;; CHECK-NEXT: (i32.wrap_i64 +;; 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: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6346,7 +6360,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6363,23 +6377,52 @@ ;; 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_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.and -;; CHECK-NEXT: (i32.wrap_i64 +;; 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: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load16_s align=1 ;; 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: (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 @@ -6397,7 +6440,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6414,12 +6457,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; 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_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6437,7 +6491,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6465,12 +6519,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; 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_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6488,7 +6548,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6510,18 +6570,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load -;; CHECK-NEXT: (local.get $2) +;; 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_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; 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 @@ -6539,7 +6605,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6556,12 +6622,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.load16_u 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: (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 @@ -6579,7 +6645,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6607,12 +6673,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6630,7 +6696,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6652,18 +6718,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -6681,7 +6747,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6703,18 +6769,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.atomic.load16_u ;; 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: (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 @@ -6732,7 +6798,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6749,12 +6815,63 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (i64.load32_s 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: (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 @@ -6765,21 +6882,1769 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; 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_AR (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 acqrel +;; 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_SC (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_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_4_U_AR (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 acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (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_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_i64_8_AR (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 acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (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_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_1_AR (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 acqrel +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_SC (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_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_2_AR (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 acqrel +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_SC (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_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_i32_4_AR (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 $2) -;; CHECK-NEXT: (i64.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6792,22 +8657,23 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (i32.atomic.store acqrel +;; CHECK-NEXT: (local.get $3) ;; 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: (func $SAFE_HEAP_STORE_i32_4_SC (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) @@ -6816,21 +8682,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i64.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6843,7 +8709,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) @@ -6851,14 +8717,15 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -6867,21 +8734,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i64.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6891,25 +8758,15 @@ ;; 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: (i64.store8 +;; CHECK-NEXT: (local.get $3) ;; 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: (func $SAFE_HEAP_STORE_i64_1_AR (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) @@ -6918,21 +8775,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i64.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6942,23 +8799,13 @@ ;; 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: (i64.atomic.store8 acqrel +;; 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: (func $SAFE_HEAP_STORE_i64_1_SC (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6993,13 +8840,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i64.atomic.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: (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 @@ -7034,13 +8881,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 +;; 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_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -7086,13 +8933,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i64.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: (func $SAFE_HEAP_STORE_i64_2_AR (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7110,7 +8957,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7127,13 +8974,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_2_SC (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7151,7 +9009,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7179,13 +9037,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (i64.atomic.store16 ;; 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: (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 @@ -7220,24 +9078,13 @@ ;; 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: (i64.store32 align=1 ;; 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: (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 @@ -7255,7 +9102,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7272,13 +9119,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; 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_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -7296,7 +9154,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7313,13 +9171,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; 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_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_AR (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7337,7 +9206,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7359,19 +9228,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store32 acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_4_SC (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7406,13 +9275,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; 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_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -7430,7 +9310,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7447,24 +9327,13 @@ ;; 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: (i64.store align=1 ;; 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: (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 @@ -7482,7 +9351,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7504,19 +9373,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; 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_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -7551,13 +9420,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; 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_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -7597,19 +9477,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store ;; 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: (func $SAFE_HEAP_STORE_i64_8_AR (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7649,19 +9529,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.atomic.store acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_8_SC (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7707,7 +9587,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/safe-heap_enable-threads_enable-simd_enable-relaxed-atomics.wast b/test/lit/passes/safe-heap_enable-threads_enable-simd_enable-relaxed-atomics.wast index b3da4b8d74b..2b618f82485 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd_enable-relaxed-atomics.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd_enable-relaxed-atomics.wast @@ -5061,9 +5061,9 @@ (memory 100 100) ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - ;; CHECK: (type $1 (func (param i32 i32 i64))) + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) - ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + ;; CHECK: (type $2 (func (param i32 i32 i64))) ;; CHECK: (type $3 (func (param i32 i32 i32))) @@ -5144,7 +5144,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5179,12 +5179,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; 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_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5202,7 +5208,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5219,12 +5225,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_2_2 (param $0 i32) (param $1 i32) (result i32) +;; 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 @@ -5242,7 +5254,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5259,21 +5271,12 @@ ;; 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: (i32.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5291,7 +5294,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5308,12 +5311,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5331,7 +5334,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5348,21 +5351,12 @@ ;; 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: (i32.atomic.load8_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: (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 @@ -5380,7 +5374,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5397,12 +5391,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_s 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: (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 @@ -5420,7 +5414,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5446,12 +5440,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5469,7 +5463,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5489,18 +5483,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; 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_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5518,7 +5518,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5535,52 +5535,27 @@ ;; 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: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $segfault) -;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; 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_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -5615,12 +5590,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_u 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: (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 @@ -5664,12 +5639,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5704,12 +5679,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5753,12 +5737,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.atomic.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: (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 @@ -5793,12 +5777,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load 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: (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 @@ -5842,12 +5826,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load 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: (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 @@ -5891,12 +5875,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; 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: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5931,12 +5915,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5974,18 +5967,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i32.atomic.load ;; 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: (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 @@ -6003,7 +5996,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6020,21 +6013,12 @@ ;; 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: (i64.load8_s ;; 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: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6052,7 +6036,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6069,12 +6053,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; 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_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6092,7 +6082,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6109,21 +6099,18 @@ ;; 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: (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: ) -;; CHECK-NEXT: (i64.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -6141,7 +6128,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6158,21 +6145,52 @@ ;; 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: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (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 $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6190,7 +6208,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6207,21 +6225,52 @@ ;; 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_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.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; 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 $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load16_s align=1 ;; 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: (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 @@ -6239,7 +6288,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6256,12 +6305,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; 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_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6279,7 +6337,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6305,12 +6363,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; 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_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6328,7 +6392,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6348,18 +6412,64 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; 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_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_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; 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 @@ -6377,7 +6487,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6394,12 +6504,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; 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_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6417,7 +6536,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6443,12 +6562,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6466,7 +6585,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6486,18 +6605,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.atomic.load16_u ;; 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: (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 @@ -6515,7 +6634,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; 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) @@ -6535,18 +6694,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load32_s align=2 ;; 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: (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 @@ -6564,14 +6723,1660 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; 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_AR (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 acqrel +;; 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_SC (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_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_4_U_AR (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 acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (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_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_i64_8_AR (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 acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (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_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_1_AR (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 acqrel +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_SC (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_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_2_AR (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 acqrel +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_SC (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_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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6581,14 +8386,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; 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_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_AR (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) @@ -6597,21 +8412,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6623,21 +8438,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; 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.load align=2 +;; CHECK-NEXT: (i32.atomic.store acqrel +;; CHECK-NEXT: (local.get $3) ;; 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: (func $SAFE_HEAP_STORE_i32_4_SC (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) @@ -6646,21 +8462,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6672,21 +8488,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) +;; 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.load align=4 +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -6695,21 +8512,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6719,23 +8536,15 @@ ;; 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: (i64.store8 +;; CHECK-NEXT: (local.get $3) ;; 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: (func $SAFE_HEAP_STORE_i64_1_AR (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) @@ -6744,21 +8553,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6768,21 +8577,13 @@ ;; 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: (i64.atomic.store8 acqrel +;; 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: (func $SAFE_HEAP_STORE_i64_1_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6817,13 +8618,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i64.atomic.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: (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 @@ -6858,13 +8659,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 +;; 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_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -6908,13 +8709,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i64.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: (func $SAFE_HEAP_STORE_i64_2_AR (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6932,7 +8733,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6949,13 +8750,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_2_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6973,7 +8783,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6999,13 +8809,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (i64.atomic.store16 ;; 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: (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 @@ -7040,22 +8850,13 @@ ;; 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: (i64.store32 align=1 ;; 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: (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 @@ -7073,7 +8874,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7090,13 +8891,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; 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_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -7114,7 +8924,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7131,13 +8941,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; 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_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_AR (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7155,7 +8974,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7175,19 +8994,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store32 acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_4_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7222,13 +9041,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -7246,7 +9074,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7263,22 +9091,13 @@ ;; 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: (i64.store align=1 ;; 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: (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 @@ -7296,7 +9115,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7316,19 +9135,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -7363,13 +9182,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -7407,19 +9235,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store ;; 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: (func $SAFE_HEAP_STORE_i64_8_AR (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7457,19 +9285,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.atomic.store acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_8_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7513,7 +9341,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; 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 index 656c3f05a3e..4c4ed8cfde6 100644 --- 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 @@ -4147,9 +4147,9 @@ (memory 100 100) ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - ;; CHECK: (type $1 (func (param i32 i32 i64))) + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) - ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + ;; CHECK: (type $2 (func (param i32 i32 i64))) ;; CHECK: (type $3 (func (param i32 i32 i32))) @@ -4230,7 +4230,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4265,12 +4265,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u -;; CHECK-NEXT: (local.get $2) +;; 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_2_1 (param $0 i32) (param $1 i32) (result i32) +;; 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 @@ -4288,7 +4294,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4305,12 +4311,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4328,7 +4334,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4345,21 +4351,12 @@ ;; 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: (i32.atomic.load8_u ;; 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: (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 @@ -4394,12 +4391,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (i32.load16_s 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: (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 @@ -4443,12 +4440,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i32.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4466,7 +4463,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4483,12 +4480,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_4_2 (param $0 i32) (param $1 i32) (result i32) +;; 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 @@ -4506,7 +4518,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4523,21 +4535,12 @@ ;; 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: (i32.load16_u align=1 ;; 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: (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 @@ -4555,7 +4558,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4575,18 +4578,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4604,7 +4607,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4621,12 +4624,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; 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_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -4644,7 +4656,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4661,12 +4673,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load align=1 ;; 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: (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 @@ -4684,7 +4696,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4701,12 +4713,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; 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_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -4724,7 +4745,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4744,18 +4765,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load ;; 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: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4773,7 +4794,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4790,12 +4811,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; 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_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -4813,7 +4843,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4830,21 +4860,12 @@ ;; 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: (i64.load8_s ;; 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: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4862,7 +4883,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4879,12 +4900,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_4_2 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -4902,7 +4929,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4919,21 +4946,12 @@ ;; 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: (i64.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4951,7 +4969,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4968,21 +4986,12 @@ ;; 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: (i64.atomic.load8_u ;; 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: (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 @@ -5000,7 +5009,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5017,12 +5026,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_s 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: (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 @@ -5040,7 +5049,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5066,12 +5075,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5089,7 +5098,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5109,18 +5118,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; 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: (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_8_1 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -5138,7 +5153,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5155,12 +5170,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u 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: (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 @@ -5178,7 +5193,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5204,12 +5219,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5227,7 +5242,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5247,18 +5262,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.atomic.load16_u ;; 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: (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 @@ -5276,7 +5291,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; 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) @@ -5296,18 +5351,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load32_s align=2 ;; 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: (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 @@ -5342,12 +5397,116 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; 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_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (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_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 @@ -5391,12 +5550,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u 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: (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 @@ -5440,12 +5599,61 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; 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: (func $SAFE_HEAP_LOAD_i64_4_U_SC (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_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5480,12 +5688,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.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: (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 @@ -5529,12 +5737,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.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: (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 @@ -5578,12 +5786,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.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: (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 @@ -5627,12 +5835,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.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: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5650,14 +5858,706 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; 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_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_1_SC (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_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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5667,14 +6567,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -5683,21 +6584,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5709,21 +6610,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) +;; 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.load align=2 +;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (local.get $3) ;; 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: (func $SAFE_HEAP_STORE_i32_2_SC (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) @@ -5732,21 +6634,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5758,21 +6660,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; 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.load align=4 +;; CHECK-NEXT: (i32.atomic.store16 +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -5781,21 +6684,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5805,23 +6708,15 @@ ;; 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: (i32.store align=1 +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -5830,21 +6725,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5856,19 +6751,20 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 15) +;; 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.load +;; 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_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -5886,7 +6782,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5903,13 +6799,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; 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_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_SC (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -5927,7 +6832,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5944,13 +6849,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 +;; 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_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -5968,7 +6882,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5985,22 +6899,13 @@ ;; 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: (i64.store8 ;; 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: (func $SAFE_HEAP_STORE_i64_1_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6018,7 +6923,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6035,13 +6940,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 +;; CHECK-NEXT: (i64.atomic.store8 ;; 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: (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 @@ -6059,7 +6964,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6076,22 +6981,13 @@ ;; 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: (i64.store16 align=1 ;; 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: (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 @@ -6109,7 +7005,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6129,19 +7025,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store +;; CHECK-NEXT: (i64.store16 ;; 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: (func $SAFE_HEAP_STORE_i64_2_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6159,7 +7055,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6176,13 +7072,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6200,7 +7105,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6217,13 +7122,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; 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_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6241,7 +7146,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6267,13 +7172,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6308,13 +7213,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; 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_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6352,19 +7266,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; 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: (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 @@ -6382,7 +7296,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6399,22 +7313,13 @@ ;; 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: (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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6449,13 +7354,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6493,19 +7407,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; 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_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6543,19 +7457,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.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: (func $SAFE_HEAP_STORE_i64_8_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6599,7 +7513,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd_enable-relaxed-atomics.wast b/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd_enable-relaxed-atomics.wast index d1e1f6ec32d..afcdf26c8ca 100644 --- a/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd_enable-relaxed-atomics.wast +++ b/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd_enable-relaxed-atomics.wast @@ -5061,9 +5061,9 @@ (memory 100 100) ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - ;; CHECK: (type $1 (func (param i32 i32 i64))) + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) - ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + ;; CHECK: (type $2 (func (param i32 i32 i64))) ;; CHECK: (type $3 (func (param i32 i32 i32))) @@ -5144,7 +5144,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5179,12 +5179,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; 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_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5202,7 +5208,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5219,12 +5225,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 -;; CHECK-NEXT: (local.get $2) +;; 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_2_2 (param $0 i32) (param $1 i32) (result i32) +;; 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 @@ -5242,7 +5254,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5259,21 +5271,12 @@ ;; 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: (i32.load8_u ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5291,7 +5294,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5308,12 +5311,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5331,7 +5334,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5348,21 +5351,12 @@ ;; 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: (i32.atomic.load8_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: (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 @@ -5380,7 +5374,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5397,12 +5391,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_s 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: (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 @@ -5420,7 +5414,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5446,12 +5440,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_s ;; 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: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5469,7 +5463,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5489,18 +5483,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; 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_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5518,7 +5518,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5535,52 +5535,27 @@ ;; 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: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $segfault) -;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; 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_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -5615,12 +5590,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_u 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: (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 @@ -5664,12 +5639,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_u ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5704,12 +5679,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5753,12 +5737,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.atomic.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: (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 @@ -5793,12 +5777,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load 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: (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 @@ -5842,12 +5826,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load 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: (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 @@ -5891,12 +5875,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; 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: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5931,12 +5915,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5974,18 +5967,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i32.atomic.load ;; 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: (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 @@ -6003,7 +5996,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6020,21 +6013,12 @@ ;; 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: (i64.load8_s ;; 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: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6052,7 +6036,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6069,12 +6053,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; 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_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6092,7 +6082,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6109,21 +6099,18 @@ ;; 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: (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: ) -;; CHECK-NEXT: (i64.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; 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 @@ -6141,7 +6128,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6158,21 +6145,52 @@ ;; 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: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (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 $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6190,7 +6208,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6207,21 +6225,52 @@ ;; 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_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.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; 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 $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load16_s align=1 ;; 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: (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 @@ -6239,7 +6288,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6256,12 +6305,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; 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_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6279,7 +6337,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6305,12 +6363,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; 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_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6328,7 +6392,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6348,18 +6412,64 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; 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_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_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; 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 @@ -6377,7 +6487,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6394,12 +6504,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; 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_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6417,7 +6536,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6443,12 +6562,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; 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: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -6466,7 +6585,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6486,18 +6605,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.atomic.load16_u ;; 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: (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 @@ -6515,7 +6634,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; 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) @@ -6535,18 +6694,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load32_s align=2 ;; 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: (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 @@ -6564,14 +6723,1660 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; 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_AR (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 acqrel +;; 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_SC (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_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_4_U_AR (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 acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (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_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_i64_8_AR (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 acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (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_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_1_AR (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 acqrel +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_SC (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_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_2_AR (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 acqrel +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_SC (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_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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6581,14 +8386,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; 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_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_AR (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) @@ -6597,21 +8412,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6623,21 +8438,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; 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.load align=2 +;; CHECK-NEXT: (i32.atomic.store acqrel +;; CHECK-NEXT: (local.get $3) ;; 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: (func $SAFE_HEAP_STORE_i32_4_SC (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) @@ -6646,21 +8462,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6672,21 +8488,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) +;; 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.load align=4 +;; CHECK-NEXT: (i32.atomic.store +;; CHECK-NEXT: (local.get $3) ;; 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: (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) @@ -6695,21 +8512,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6719,23 +8536,15 @@ ;; 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: (i64.store8 +;; CHECK-NEXT: (local.get $3) ;; 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: (func $SAFE_HEAP_STORE_i64_1_AR (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) @@ -6744,21 +8553,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; 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 $2) -;; CHECK-NEXT: (i32.const 16) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6768,21 +8577,13 @@ ;; 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: (i64.atomic.store8 acqrel +;; 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: (func $SAFE_HEAP_STORE_i64_1_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6817,13 +8618,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i64.atomic.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: (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 @@ -6858,13 +8659,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 +;; 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_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -6908,13 +8709,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i64.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: (func $SAFE_HEAP_STORE_i64_2_AR (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6932,7 +8733,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6949,13 +8750,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 +;; 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 acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_2_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6973,7 +8783,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6999,13 +8809,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 +;; CHECK-NEXT: (i64.atomic.store16 ;; 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: (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 @@ -7040,22 +8850,13 @@ ;; 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: (i64.store32 align=1 ;; 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: (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 @@ -7073,7 +8874,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7090,13 +8891,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; 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_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -7114,7 +8924,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7131,13 +8941,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; 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_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_AR (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7155,7 +8974,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7175,19 +8994,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store32 acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_4_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7222,13 +9041,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -7246,7 +9074,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7263,22 +9091,13 @@ ;; 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: (i64.store align=1 ;; 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: (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 @@ -7296,7 +9115,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7316,19 +9135,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -7363,13 +9182,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -7407,19 +9235,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store ;; 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: (func $SAFE_HEAP_STORE_i64_8_AR (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7457,19 +9285,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.atomic.store acqrel ;; 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: (func $SAFE_HEAP_STORE_i64_8_SC (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7513,7 +9341,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/safe-heap_no-shared.wast b/test/lit/passes/safe-heap_no-shared.wast new file mode 100644 index 00000000000..12b8f9d4ca5 --- /dev/null +++ b/test/lit/passes/safe-heap_no-shared.wast @@ -0,0 +1,3482 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; RUN: wasm-opt %s --safe-heap --enable-threads -S -o - | filecheck %s + +(module + (memory 100 100) + + ;; 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)) + + ;; CHECK: (type $5 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $6 (func (param i32 i32 f64))) + + ;; CHECK: (type $7 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $8 (func (param i32 i32 f32))) + + ;; CHECK: (type $9 (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_SC + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.atomic.load (i32.const 1))) + ) + + ;; CHECK: (func $stores + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_SC + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $stores + (i32.atomic.store (i32.const 1) (i32.const 100)) + ) +) + +;; 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_SC (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_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_1_U_SC (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_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_SC (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_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_2_U_SC (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_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_i32_4_SC (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_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_SC (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_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_1_U_SC (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_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_SC (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_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_2_U_SC (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_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_SC (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_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_4_U_SC (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_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_i64_8_SC (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_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_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_1_SC (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_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_2_SC (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_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_i32_4_SC (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_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_1_SC (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_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_2_SC (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_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_4_SC (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_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_i64_8_SC (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_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: ) From aef7ee63e25ca3c26b649e751effa9468d8df538 Mon Sep 17 00:00:00 2001 From: Derek Schuff Date: Tue, 14 Jul 2026 06:26:54 -0700 Subject: [PATCH 2/2] clamg-format --- src/passes/SafeHeap.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/passes/SafeHeap.cpp b/src/passes/SafeHeap.cpp index 7bbf8689617..ae691a78fa4 100644 --- a/src/passes/SafeHeap.cpp +++ b/src/passes/SafeHeap.cpp @@ -222,8 +222,7 @@ struct SafeHeap : public Pass { } } - bool - isPossibleAtomicOperation(Index align, Index bytes, Type type) { + bool isPossibleAtomicOperation(Index align, Index bytes, Type type) { return align == bytes && type.isInteger(); }