diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 0f007d6630a..e38e60c24ed 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -1371,7 +1371,8 @@ BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, (Expression*)ptr, (Expression*)value, Type(type), - getMemoryName(module, memoryName))); + getMemoryName(module, memoryName), + MemoryOrder::SeqCst)); } BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, diff --git a/src/parser/contexts.h b/src/parser/contexts.h index df1e16ad3fb..1ac3a7c525f 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -565,7 +565,8 @@ struct NullInstrParserCtx { int, bool, MemoryIdxT*, - MemargT) { + MemargT, + MemoryOrder) { return Ok{}; } Result<> makeAtomicRMW(Index, @@ -2255,12 +2256,13 @@ struct ParseDefsCtx : TypeParserCtx, AnnotationParserCtx { int bytes, bool isAtomic, Name* mem, - Memarg memarg) { + Memarg memarg, + MemoryOrder order) { auto m = getMemory(pos, mem); CHECK_ERR(m); if (isAtomic) { - return withLoc(pos, - irBuilder.makeAtomicStore(bytes, memarg.offset, type, *m)); + return withLoc( + pos, irBuilder.makeAtomicStore(bytes, memarg.offset, type, *m, order)); } return withLoc( pos, irBuilder.makeStore(bytes, memarg.offset, memarg.align, type, *m)); diff --git a/src/parser/parsers.h b/src/parser/parsers.h index bfea96f968d..77122643d40 100644 --- a/src/parser/parsers.h +++ b/src/parser/parsers.h @@ -850,17 +850,6 @@ Result memtypeContinued(Ctx& ctx, Type addressType) { return ctx.makeMemType(addressType, *limits, shared); } -// memorder ::= '' | 'seqcst' | 'acqrel' -template Result memorder(Ctx& ctx) { - if (ctx.in.takeKeyword("seqcst"sv)) { - return MemoryOrder::SeqCst; - } - if (ctx.in.takeKeyword("acqrel"sv)) { - return MemoryOrder::AcqRel; - } - return MemoryOrder::SeqCst; -} - // memorder ::= 'seqcst' | 'acqrel' template MaybeResult maybeMemOrder(Ctx& ctx) { if (ctx.in.takeKeyword("seqcst"sv)) { @@ -873,6 +862,13 @@ template MaybeResult maybeMemOrder(Ctx& ctx) { return {}; } +// memorder ::= '' | 'seqcst' | 'acqrel' +template Result memorder(Ctx& ctx) { + auto order = maybeMemOrder(ctx); + CHECK_ERR(order); + return order ? *order : MemoryOrder::SeqCst; +} + // tabletype ::= (limits32 | 'i32' limits32 | 'i64' limit64) reftype template Result tabletype(Ctx& ctx) { Type addressType = Type::i32; @@ -1755,7 +1751,8 @@ Result<> makeLoad(Ctx& ctx, CHECK_ERR(mem); // We could only parse this when `isAtomic`, but this way gives a clearer - // error since `memIdx` can never be mistaken for a `memOrder`. + // error when a memorder is given for non-atomic operations + // since the next token can never be mistaken for a `memOrder`. auto maybeOrder = maybeMemOrder(ctx); CHECK_ERR(maybeOrder); @@ -1787,10 +1784,26 @@ Result<> makeStore(Ctx& ctx, bool isAtomic) { auto mem = maybeMemidx(ctx); CHECK_ERR(mem); + + auto maybeOrder = maybeMemOrder(ctx); + CHECK_ERR(maybeOrder); + + if (maybeOrder && !isAtomic) { + return Err{"Memory ordering can only be provided for atomic stores."}; + } + auto arg = memarg(ctx, bytes); CHECK_ERR(arg); - return ctx.makeStore( - pos, annotations, type, bytes, isAtomic, mem.getPtr(), *arg); + return ctx.makeStore(pos, + annotations, + type, + bytes, + isAtomic, + mem.getPtr(), + *arg, + maybeOrder ? *maybeOrder + : isAtomic ? MemoryOrder::SeqCst + : MemoryOrder::Unordered); } template diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 2b08ae3c66c..e54d3eebdff 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -605,6 +605,7 @@ struct PrintExpressionContents } restoreNormalColor(o); printMemoryName(curr->memory, o, wasm); + printMemoryOrder(curr->order); if (curr->offset) { o << " offset=" << curr->offset; } diff --git a/src/passes/SafeHeap.cpp b/src/passes/SafeHeap.cpp index 10933575148..9a777221708 100644 --- a/src/passes/SafeHeap.cpp +++ b/src/passes/SafeHeap.cpp @@ -63,15 +63,22 @@ static Name getLoadName(Load* curr) { } static Name getStoreName(Store* curr) { - std::string ret = "SAFE_HEAP_STORE_"; - ret += curr->valueType.toString(); - ret += "_" + std::to_string(curr->bytes) + "_"; - if (curr->isAtomic()) { - ret += "A"; - } else { - ret += std::to_string(curr->align); + std::vector parts{curr->valueType.toString(), + std::to_string(curr->bytes)}; + switch (curr->order) { + case MemoryOrder::Unordered: { + parts.push_back(std::to_string(curr->align)); + break; + } + case MemoryOrder::SeqCst: { + parts.push_back("SC"); + break; + } + case MemoryOrder::AcqRel: { + parts.push_back("AR"); + } } - return ret; + return "SAFE_HEAP_STORE_" + String::join(parts, "_"); } struct AccessInstrumenter : public WalkerPass> { @@ -287,10 +294,9 @@ struct SafeHeap : public Pass { if (align > bytes) { continue; } - for (auto isAtomic : {true, false}) { - store.order = - isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered; - if (isAtomic && + for (auto memoryOrder : memoryOrdersToGenerate) { + store.order = memoryOrder; + if (store.isAtomic() && !isPossibleAtomicOperation( align, bytes, module->memories[0]->shared, valueType)) { continue; diff --git a/src/tools/wasm-split/instrumenter.cpp b/src/tools/wasm-split/instrumenter.cpp index 085715ce246..92861a8729a 100644 --- a/src/tools/wasm-split/instrumenter.cpp +++ b/src/tools/wasm-split/instrumenter.cpp @@ -151,7 +151,8 @@ void Instrumenter::instrumentFuncs() { builder.makeConstPtr(0, Type::i32), builder.makeConst(uint32_t(1)), Type::i32, - memoryName), + memoryName, + MemoryOrder::SeqCst), func->body, func->body->type); ++funcIdx; diff --git a/src/wasm-builder.h b/src/wasm-builder.h index 6878e0dff7b..104b8385ed9 100644 --- a/src/wasm-builder.h +++ b/src/wasm-builder.h @@ -451,9 +451,13 @@ class Builder { Expression* ptr, Expression* value, Type type, - Name memory) { + Name memory, + MemoryOrder order) { + assert(order != MemoryOrder::Unordered && + "Atomic stores can't be unordered"); + Store* store = makeStore(bytes, offset, bytes, ptr, value, type, memory); - store->order = MemoryOrder::SeqCst; + store->order = order; return store; } AtomicRMW* makeAtomicRMW(AtomicRMWOp op, diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index a3845b385c6..bbc21afb083 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -158,7 +158,8 @@ class IRBuilder : public UnifiedExpressionVisitor> { unsigned bytes, Address offset, unsigned align, Type type, Name mem); Result<> makeAtomicLoad( unsigned bytes, Address offset, Type type, Name mem, MemoryOrder order); - Result<> makeAtomicStore(unsigned bytes, Address offset, Type type, Name mem); + Result<> makeAtomicStore( + unsigned bytes, Address offset, Type type, Name mem, MemoryOrder order); Result<> makeAtomicRMW( AtomicRMWOp op, unsigned bytes, Address offset, Type type, Name mem); Result<> diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 9a5d03c65f0..ec769caee2c 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3657,31 +3657,38 @@ Result<> WasmBinaryReader::readInst() { } case BinaryConsts::I32AtomicStore8: { auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); - return builder.makeAtomicStore(1, offset, Type::i32, mem); + return builder.makeAtomicStore( + 1, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I32AtomicStore16: { auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); - return builder.makeAtomicStore(2, offset, Type::i32, mem); + return builder.makeAtomicStore( + 2, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I32AtomicStore: { auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); - return builder.makeAtomicStore(4, offset, Type::i32, mem); + return builder.makeAtomicStore( + 4, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I64AtomicStore8: { auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); - return builder.makeAtomicStore(1, offset, Type::i64, mem); + return builder.makeAtomicStore( + 1, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicStore16: { auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); - return builder.makeAtomicStore(2, offset, Type::i64, mem); + return builder.makeAtomicStore( + 2, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicStore32: { auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); - return builder.makeAtomicStore(4, offset, Type::i64, mem); + return builder.makeAtomicStore( + 4, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicStore: { auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); - return builder.makeAtomicStore(8, offset, Type::i64, mem); + return builder.makeAtomicStore( + 8, offset, Type::i64, mem, memoryOrder); } #define RMW(op) \ diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 200a9e0d107..57a2469dce0 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -1492,15 +1492,14 @@ Result<> IRBuilder::makeAtomicLoad( return Ok{}; } -Result<> IRBuilder::makeAtomicStore(unsigned bytes, - Address offset, - Type type, - Name mem) { +Result<> IRBuilder::makeAtomicStore( + unsigned bytes, Address offset, Type type, Name mem, MemoryOrder order) { Store curr; curr.memory = mem; curr.valueType = type; CHECK_ERR(visitStore(&curr)); - push(builder.makeAtomicStore(bytes, offset, curr.ptr, curr.value, type, mem)); + push(builder.makeAtomicStore( + bytes, offset, curr.ptr, curr.value, type, mem, order)); return Ok{}; } diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 27884708ba1..4e79976579f 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -1147,6 +1147,12 @@ void FunctionValidator::visitStore(Store* curr) { curr, "Atomic store should be i32 or i64"); } + if (curr->order == MemoryOrder::AcqRel) { + shouldBeTrue(getModule()->features.hasRelaxedAtomics(), + curr, + "Acquire/release operations require relaxed atomics " + "[--enable-relaxed-atomics]"); + } if (curr->valueType == Type::v128) { shouldBeTrue(getModule()->features.hasSIMD(), curr, diff --git a/test/lit/basic/relaxed-atomics.wast b/test/lit/basic/relaxed-atomics.wast index a6a759f1029..0c26d26398e 100644 --- a/test/lit/basic/relaxed-atomics.wast +++ b/test/lit/basic/relaxed-atomics.wast @@ -5,36 +5,56 @@ ;; RTRIP: (memory $0 23 256 shared) (memory $0 23 256 shared) - ;; RTRIP: (func $acqrel (type $0) (result i32) - ;; RTRIP-NEXT: (i32.atomic.load acqrel + ;; RTRIP: (func $acqrel (type $0) + ;; RTRIP-NEXT: (i32.atomic.store acqrel ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (drop + ;; RTRIP-NEXT: (i32.atomic.load acqrel + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) ;; RTRIP-NEXT: ) ;; RTRIP-NEXT: ) - (func $acqrel (result i32) - (i32.atomic.load acqrel - (i32.const 1) - ) + (func $acqrel + (i32.atomic.store acqrel (i32.const 1) (i32.const 1)) + (drop + (i32.atomic.load acqrel + (i32.const 1) + )) ) ;; Optional seqcst ordering is dropped in text output. - ;; RTRIP: (func $seqcst (type $0) (result i32) + ;; RTRIP: (func $seqcst (type $0) + ;; RTRIP-NEXT: (i32.atomic.store + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (i32.atomic.store + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) ;; RTRIP-NEXT: (drop ;; RTRIP-NEXT: (i32.atomic.load ;; RTRIP-NEXT: (i32.const 1) ;; RTRIP-NEXT: ) ;; RTRIP-NEXT: ) - ;; RTRIP-NEXT: (i32.atomic.load - ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: (drop + ;; RTRIP-NEXT: (i32.atomic.load + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) ;; RTRIP-NEXT: ) ;; RTRIP-NEXT: ) - (func $seqcst (result i32) - ;; seqcst may be omitted for atomic loads, it's the default + (func $seqcst + (i32.atomic.store seqcst (i32.const 1) (i32.const 1)) + (i32.atomic.store 0 seqcst (i32.const 1) (i32.const 1)) (drop (i32.atomic.load seqcst (i32.const 1) )) ;; allows memory index before memory ordering immediate - (i32.atomic.load 0 seqcst + (drop + (i32.atomic.load 0 seqcst (i32.const 1) - ) + )) ) ) 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 c58cf7e5223..9f43f1aee48 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd.wast @@ -152,7 +152,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 100) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_SC ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 100) @@ -2502,7 +2502,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -2537,13 +2537,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -2578,7 +2578,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -2625,7 +2625,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -2669,13 +2669,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -2719,7 +2719,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -2816,7 +2816,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (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 @@ -2860,13 +2860,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store +;; 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_4 (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 @@ -2910,13 +2910,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store +;; 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_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -2951,13 +2951,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -2992,7 +2992,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3039,7 +3039,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3083,13 +3083,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_2 (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 @@ -3133,7 +3133,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3230,7 +3230,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -3274,13 +3274,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -3324,7 +3324,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3471,7 +3471,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -3515,13 +3515,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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 @@ -3565,7 +3565,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: ) @@ -9488,7 +9488,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -9523,13 +9523,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -9564,7 +9564,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -9611,7 +9611,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -9655,13 +9655,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -9705,7 +9705,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -9802,7 +9802,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (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 @@ -9846,13 +9846,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store +;; 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_4 (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 @@ -9896,13 +9896,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store +;; 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_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -9937,13 +9937,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -9978,7 +9978,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10025,7 +10025,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -10069,13 +10069,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_2 (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 @@ -10119,7 +10119,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10216,7 +10216,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -10260,13 +10260,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -10310,7 +10310,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10457,7 +10457,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -10501,13 +10501,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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 @@ -10551,7 +10551,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 7e1616dce80..bc471fe67d3 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast @@ -152,7 +152,7 @@ ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i32.const 100) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_SC ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i32.const 100) @@ -2562,7 +2562,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -2597,13 +2597,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -2638,7 +2638,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -2685,7 +2685,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -2731,13 +2731,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -2783,7 +2783,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -2882,7 +2882,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -2928,13 +2928,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store +;; 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_4 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -2980,13 +2980,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store +;; 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_A (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3021,13 +3021,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; 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_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3062,7 +3062,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3109,7 +3109,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3155,13 +3155,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3207,7 +3207,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3306,7 +3306,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -3352,13 +3352,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -3404,7 +3404,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3555,7 +3555,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -3601,13 +3601,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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 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 @@ -3653,7 +3653,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: ) @@ -9734,7 +9734,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -9769,13 +9769,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -9810,7 +9810,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -9857,7 +9857,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -9903,13 +9903,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -9955,7 +9955,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10054,7 +10054,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -10100,13 +10100,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store +;; 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_4 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -10152,13 +10152,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store +;; 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_A (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -10193,13 +10193,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; 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_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -10234,7 +10234,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10281,7 +10281,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -10327,13 +10327,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -10379,7 +10379,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10478,7 +10478,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -10524,13 +10524,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -10576,7 +10576,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10727,7 +10727,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -10773,13 +10773,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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 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 @@ -10825,7 +10825,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_enable-relaxed-atomics.wast b/test/lit/passes/safe-heap_enable-threads_enable-simd64_enable-relaxed-atomics.wast index e045629a7b1..cc04ae60be9 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 @@ -152,7 +152,7 @@ ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i32.const 100) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_SC ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: (i32.const 100) @@ -3160,7 +3160,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -3195,13 +3195,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -3236,7 +3236,48 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; 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: ) @@ -3283,7 +3324,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -3329,13 +3370,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -3381,13 +3422,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; 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_4_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -3405,7 +3446,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) @@ -3422,13 +3463,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: (i32.atomic.store16 ;; 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_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 @@ -3463,24 +3515,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: (i32.store align=2 +;; 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_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -3520,13 +3561,13 @@ ;; 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: (i32.atomic.store +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3584,7 +3625,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3602,7 +3643,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) @@ -3619,13 +3660,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; 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 acqrel ;; 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_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 @@ -3643,7 +3695,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) @@ -3660,13 +3712,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 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_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3684,7 +3747,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3701,13 +3764,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3725,7 +3788,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3742,24 +3805,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.atomic.store16 +;; 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_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3777,7 +3829,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3794,24 +3846,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.store16 +;; 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_4_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3829,7 +3870,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) @@ -3846,13 +3887,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3870,7 +3911,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) @@ -3898,13 +3939,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3922,7 +3963,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) @@ -3944,19 +3985,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.atomic.store32 +;; 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_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3974,7 +4015,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) @@ -3996,19 +4037,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.atomic.store16 ;; 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_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 @@ -4026,7 +4067,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4043,13 +4084,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store 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_8_2 (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 @@ -4067,7 +4108,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4095,13 +4136,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; 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_8_4 (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 @@ -4119,7 +4160,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4147,13 +4188,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -4171,7 +4212,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4193,19 +4234,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; 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: (i64.atomic.store +;; 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_8_8 (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 @@ -4223,7 +4264,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4245,19 +4286,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; 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: (i64.store +;; CHECK-NEXT: (i64.atomic.store32 ;; 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: (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 @@ -4275,7 +4316,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) @@ -4292,13 +4333,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 +;; 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_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; 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 @@ -4316,7 +4357,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) @@ -4344,13 +4385,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; 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_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) +;; 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 @@ -4368,7 +4409,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) @@ -4396,13 +4437,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; 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_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -4437,13 +4478,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.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 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_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -4483,19 +4535,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: (f64.store align=2 +;; 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_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -4535,19 +4587,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: (f64.store align=4 +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -4565,7 +4617,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4582,10 +4634,300 @@ ;; 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: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) @@ -10879,9 +11221,224 @@ ;; 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_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_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 $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 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 $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_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) @@ -10890,21 +11447,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 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -10917,20 +11474,21 @@ ;; 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 15) +;; 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.store16 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK: (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 @@ -10948,7 +11506,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -10965,13 +11523,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.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: (i32.atomic.store16 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_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 @@ -10989,7 +11558,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -11006,13 +11575,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.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: (i32.atomic.store16 ;; 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_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 @@ -11030,7 +11610,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 $foo) @@ -11047,13 +11627,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 +;; 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_2_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -11071,7 +11651,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 $foo) @@ -11099,13 +11679,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2_2 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -11123,7 +11703,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 $foo) @@ -11145,19 +11725,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: (i32.store16 +;; 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_1 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -11192,13 +11772,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store 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_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 @@ -11238,19 +11829,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: (i32.store align=2 +;; CHECK-NEXT: (i32.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -11268,7 +11859,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -11285,24 +11876,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.atomic.store +;; 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_4 (param $0 i64) (param $1 i64) (param $2 i32) +;; 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 @@ -11320,7 +11900,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -11337,24 +11917,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.atomic.store8 acqrel ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (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 @@ -11395,7 +11964,7 @@ ;; 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_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 @@ -11413,7 +11982,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -11430,13 +11999,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; 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_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -11471,13 +12040,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 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_A (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -11523,13 +12103,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -11575,7 +12155,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -11674,7 +12254,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -11720,13 +12300,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -11772,7 +12352,59 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; 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_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 $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -11923,7 +12555,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -11969,13 +12601,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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 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 @@ -12021,7 +12653,59 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; 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_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 $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) 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 e2f93adaad4..b3da4b8d74b 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 @@ -152,7 +152,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 100) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_SC ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 100) @@ -3084,7 +3084,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3119,13 +3119,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3160,7 +3160,48 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; 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: ) @@ -3207,7 +3248,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3251,13 +3292,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3301,13 +3342,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; 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_4_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3325,7 +3366,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) @@ -3342,13 +3383,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: (i32.atomic.store16 ;; 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_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 @@ -3383,22 +3433,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: (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_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3436,13 +3477,13 @@ ;; 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.atomic.store +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3498,7 +3539,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3516,7 +3557,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) @@ -3533,13 +3574,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.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.atomic.store acqrel ;; 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_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 @@ -3557,7 +3607,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) @@ -3574,13 +3624,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 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_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3598,7 +3657,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) @@ -3615,13 +3674,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3639,7 +3698,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) @@ -3656,22 +3715,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.atomic.store16 +;; 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_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3689,7 +3739,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) @@ -3706,22 +3756,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.store16 +;; 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_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3739,7 +3780,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) @@ -3756,13 +3797,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3780,7 +3821,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) @@ -3806,13 +3847,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3830,7 +3871,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) @@ -3850,19 +3891,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.atomic.store32 +;; 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_i64_4_4 (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 @@ -3880,7 +3921,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) @@ -3900,19 +3941,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.atomic.store16 ;; 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_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 @@ -3930,7 +3971,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3947,13 +3988,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store 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_8_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 @@ -3971,7 +4012,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3997,13 +4038,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; 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_8_4 (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 @@ -4021,7 +4062,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4047,13 +4088,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -4071,7 +4112,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4091,19 +4132,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; 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: (i64.atomic.store +;; 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_8_8 (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 @@ -4121,7 +4162,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4141,19 +4182,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; 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: (i64.store +;; CHECK-NEXT: (i64.atomic.store32 ;; 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: (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 @@ -4171,7 +4212,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) @@ -4188,13 +4229,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 +;; 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_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -4212,7 +4253,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) @@ -4238,13 +4279,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; 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_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -4262,7 +4303,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) @@ -4288,13 +4329,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; 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_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -4329,13 +4370,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=1 +;; 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_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -4373,19 +4423,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: (f64.store align=2 +;; 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_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -4423,19 +4473,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: (f64.store align=4 +;; CHECK-NEXT: (i64.atomic.store ;; 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: (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 @@ -4453,7 +4503,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4470,22 +4520,13 @@ ;; 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: (f32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (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 @@ -4503,7 +4544,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4520,9 +4561,300 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -10579,7 +10911,228 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-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: ) @@ -10589,23 +11142,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.store16 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_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) @@ -10614,21 +11159,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: ) @@ -10640,19 +11185,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.store16 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK: (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 @@ -10670,7 +11216,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) @@ -10687,13 +11233,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.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: (i32.atomic.store16 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_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 @@ -10711,7 +11266,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) @@ -10728,13 +11283,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 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -10752,7 +11316,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) @@ -10769,13 +11333,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 +;; 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_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -10793,7 +11357,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) @@ -10819,13 +11383,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2_2 (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 @@ -10843,7 +11407,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) @@ -10863,19 +11427,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: (i32.store16 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -10910,13 +11474,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store 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_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 @@ -10954,19 +11527,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: (i32.store align=2 +;; CHECK-NEXT: (i32.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (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 @@ -10984,7 +11557,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) @@ -11001,22 +11574,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.atomic.store +;; 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_4 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -11034,7 +11598,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) @@ -11051,22 +11615,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.atomic.store8 acqrel ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -11107,7 +11662,7 @@ ;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -11125,7 +11680,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) @@ -11142,13 +11697,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -11183,13 +11738,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 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_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -11233,13 +11797,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_i64_2_2 (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 @@ -11283,7 +11847,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -11380,7 +11944,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -11424,13 +11988,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -11474,7 +12038,57 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; 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_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: ) @@ -11621,7 +12235,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -11665,13 +12279,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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_AR (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -11715,7 +12329,57 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; 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_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: ) 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 5035c5f2662..656c3f05a3e 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 @@ -152,7 +152,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 100) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_SC ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 100) @@ -2502,7 +2502,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -2537,13 +2537,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -2578,7 +2578,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -2625,7 +2625,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -2669,13 +2669,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -2719,7 +2719,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -2816,7 +2816,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (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 @@ -2860,13 +2860,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store +;; 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_4 (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 @@ -2910,13 +2910,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store +;; 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_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -2951,13 +2951,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -2992,7 +2992,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3039,7 +3039,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3083,13 +3083,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_2 (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 @@ -3133,7 +3133,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3230,7 +3230,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -3274,13 +3274,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -3324,7 +3324,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3471,7 +3471,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -3515,13 +3515,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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 @@ -3565,7 +3565,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: ) @@ -9488,7 +9488,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -9523,13 +9523,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -9564,7 +9564,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -9611,7 +9611,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -9655,13 +9655,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -9705,7 +9705,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -9802,7 +9802,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (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 @@ -9846,13 +9846,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store +;; 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_4 (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 @@ -9896,13 +9896,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store +;; 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_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -9937,13 +9937,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -9978,7 +9978,7 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10025,7 +10025,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -10069,13 +10069,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_2 (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 @@ -10119,7 +10119,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10216,7 +10216,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -10260,13 +10260,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -10310,7 +10310,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -10457,7 +10457,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -10501,13 +10501,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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 @@ -10551,7 +10551,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 b51e1ac01d4..d1e1f6ec32d 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 @@ -152,7 +152,7 @@ ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 100) ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_SC ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: (i32.const 100) @@ -3084,7 +3084,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3119,13 +3119,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3160,7 +3160,48 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 +;; 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: ) @@ -3207,7 +3248,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3251,13 +3292,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3301,13 +3342,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 +;; 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_4_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3325,7 +3366,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) @@ -3342,13 +3383,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: (i32.atomic.store16 ;; 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_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 @@ -3383,22 +3433,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: (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_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -3436,13 +3477,13 @@ ;; 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.atomic.store +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -3498,7 +3539,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3516,7 +3557,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) @@ -3533,13 +3574,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.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.atomic.store acqrel ;; 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_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 @@ -3557,7 +3607,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) @@ -3574,13 +3624,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 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_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3598,7 +3657,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) @@ -3615,13 +3674,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3639,7 +3698,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) @@ -3656,22 +3715,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.atomic.store16 +;; 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_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3689,7 +3739,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) @@ -3706,22 +3756,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.store16 +;; 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_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3739,7 +3780,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) @@ -3756,13 +3797,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3780,7 +3821,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) @@ -3806,13 +3847,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3830,7 +3871,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) @@ -3850,19 +3891,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.atomic.store32 +;; 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_i64_4_4 (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 @@ -3880,7 +3921,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) @@ -3900,19 +3941,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.atomic.store16 ;; 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_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 @@ -3930,7 +3971,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3947,13 +3988,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store 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_8_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 @@ -3971,7 +4012,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3997,13 +4038,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; 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_8_4 (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 @@ -4021,7 +4062,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4047,13 +4088,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -4071,7 +4112,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4091,19 +4132,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; 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: (i64.atomic.store +;; 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_8_8 (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 @@ -4121,7 +4162,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4141,19 +4182,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; 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: (i64.store +;; CHECK-NEXT: (i64.atomic.store32 ;; 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: (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 @@ -4171,7 +4212,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) @@ -4188,13 +4229,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 +;; 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_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -4212,7 +4253,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) @@ -4238,13 +4279,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; 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_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -4262,7 +4303,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) @@ -4288,13 +4329,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; 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_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -4329,13 +4370,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=1 +;; 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_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -4373,19 +4423,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: (f64.store align=2 +;; 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_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -4423,19 +4473,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: (f64.store align=4 +;; CHECK-NEXT: (i64.atomic.store ;; 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: (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 @@ -4453,7 +4503,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4470,22 +4520,13 @@ ;; 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: (f32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (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 @@ -4503,7 +4544,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4520,9 +4561,300 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -10579,7 +10911,228 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_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 $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 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 $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -10589,23 +11142,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.store16 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_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) @@ -10614,21 +11159,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 $foo) ;; 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: ) @@ -10640,19 +11185,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.store16 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK: (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 @@ -10670,7 +11216,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 $foo) @@ -10687,13 +11233,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.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: (i32.atomic.store16 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_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 @@ -10711,7 +11266,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 $foo) @@ -10728,13 +11283,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 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -10752,7 +11316,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 $foo) @@ -10769,13 +11333,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 +;; 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_2_A (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -10793,7 +11357,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 $foo) @@ -10819,13 +11383,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 +;; 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_2_2 (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 @@ -10843,7 +11407,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 $foo) @@ -10863,19 +11427,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: (i32.store16 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -10910,13 +11474,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.store 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_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 @@ -10954,19 +11527,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: (i32.store align=2 +;; CHECK-NEXT: (i32.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (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 @@ -10984,7 +11557,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 $foo) @@ -11001,22 +11574,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.atomic.store +;; 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_4 (param $0 i32) (param $1 i32) (param $2 i32) +;; 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 @@ -11034,7 +11598,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 $foo) @@ -11051,22 +11615,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.atomic.store8 acqrel ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -11107,7 +11662,7 @@ ;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -11125,7 +11680,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 $foo) @@ -11142,13 +11697,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -11183,13 +11738,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 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_A (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -11233,13 +11797,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; 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_i64_2_2 (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 @@ -11283,7 +11847,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -11380,7 +11944,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (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 @@ -11424,13 +11988,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4 (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 @@ -11474,7 +12038,57 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; 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_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.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) @@ -11621,7 +12235,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (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 @@ -11665,13 +12279,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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_AR (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -11715,7 +12329,57 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; 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_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.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) diff --git a/test/spec/relaxed-atomics.wast b/test/spec/relaxed-atomics.wast index d76a2f62b00..1527fbcae2a 100644 --- a/test/spec/relaxed-atomics.wast +++ b/test/spec/relaxed-atomics.wast @@ -2,11 +2,13 @@ (memory $0 23 256 shared) (func $acqrel (result i32) + (i32.atomic.store acqrel (i32.const 0) (i32.const 0)) (i32.atomic.load acqrel (i32.const 1) ) ) (func $seqcst (result i32) + (i32.atomic.store 0 seqcst (i32.const 0) (i32.const 0)) ;; seqcst may be omitted for atomic loads, it's the default (drop (i32.atomic.load seqcst (i32.const 1) @@ -30,6 +32,55 @@ "Memory ordering can only be provided for atomic loads." ) +;; Parses acquire-release immediate +;; (module +;; (memory $0 23 256 shared) +;; (func $acqrel +;; (i32.atomic.store (i32.const 0) (i32.const 0)) +;; ) +;; ) +(module binary + "\00asm\01\00\00\00" + "\01\04\01\60\00\00\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0d\01" ;; code section + "\0b\00" ;; func $acqrel + "\41\00\41\00" ;; (i32.const 0) (i32.const 0) + "\fe\17" ;; i32.atomic.store + "\22" ;; 2 | (1<<5): Alignment of 2 (32-bit store), with bit 5 set indicating that then next byte is a memory ordering + "\01" ;; acqrel ordering + "\00" ;; offset + "\0b" ;; end +) + +;; Parses optional seq-cst immediate +(module binary + "\00asm\01\00\00\00" + "\01\04\01\60\00\00\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0d\01" ;; code section + "\0b\00" ;; func $seqcst + "\41\00\41\00" ;; (i32.const 0) (i32.const 0) + "\fe\17" ;; i32.atomic.store + "\22" ;; 2 | (1<<5): Alignment of 2 (32-bit store), with bit 5 set indicating that then next byte is a memory ordering + "\00" ;; seqcst ordering + "\00" ;; offset + "\0b" ;; end +) + +;; Parses optional seq-cst immediate with memory idx +(module binary + "\00asm\01\00\00\00" + "\01\04\01\60\00\00\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0e\01" ;; code section + "\0c\00" ;; func $seqcst + "\41\00\41\00" ;; (i32.const 0) (i32.const 0) + "\fe\17" ;; i32.atomic.store + "\62" ;; 2 | (1<<5): Alignment of 2 (32-bit store), with bit 5 set indicating that then next byte is a memory ordering + "\00" ;; memory index + "\00" ;; seqcst ordering + "\00" ;; offset + "\0b" ;; end +) + ;; Parses acquire-release immediate ;; Equivalent to ;; (module