diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 146a9089f1f..7f04231a2c9 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -1351,7 +1351,8 @@ BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module, offset, (Expression*)ptr, Type(type), - getMemoryName(module, memoryName))); + getMemoryName(module, memoryName), + MemoryOrder::SeqCst)); } BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, uint32_t bytes, diff --git a/src/parser/contexts.h b/src/parser/contexts.h index 474a49eaf38..df1e16ad3fb 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -555,7 +555,8 @@ struct NullInstrParserCtx { int, bool, MemoryIdxT*, - MemargT) { + MemargT, + MemoryOrder) { return Ok{}; } Result<> makeStore(Index, @@ -2235,12 +2236,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.makeAtomicLoad(bytes, memarg.offset, type, *m)); + return withLoc( + pos, irBuilder.makeAtomicLoad(bytes, memarg.offset, type, *m, order)); } return withLoc(pos, irBuilder.makeLoad( diff --git a/src/parser/parsers.h b/src/parser/parsers.h index a8f1495097d..bfea96f968d 100644 --- a/src/parser/parsers.h +++ b/src/parser/parsers.h @@ -49,6 +49,7 @@ template Result memtype(Ctx&); template Result memtypeContinued(Ctx&, Type addressType); template Result memorder(Ctx&); +template MaybeResult maybeMemOrder(Ctx&); template Result tabletype(Ctx&); template Result tabletypeContinued(Ctx&, Type addressType); @@ -860,6 +861,18 @@ template Result memorder(Ctx& ctx) { return MemoryOrder::SeqCst; } +// memorder ::= 'seqcst' | 'acqrel' +template MaybeResult maybeMemOrder(Ctx& ctx) { + if (ctx.in.takeKeyword("seqcst"sv)) { + return MemoryOrder::SeqCst; + } + if (ctx.in.takeKeyword("acqrel"sv)) { + return MemoryOrder::AcqRel; + } + + return {}; +} + // tabletype ::= (limits32 | 'i32' limits32 | 'i64' limit64) reftype template Result tabletype(Ctx& ctx) { Type addressType = Type::i32; @@ -1737,12 +1750,32 @@ Result<> makeLoad(Ctx& ctx, bool signed_, int bytes, bool isAtomic) { + auto mem = maybeMemidx(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`. + auto maybeOrder = maybeMemOrder(ctx); + CHECK_ERR(maybeOrder); + + if (maybeOrder && !isAtomic) { + return Err{"Memory ordering can only be provided for atomic loads."}; + } + auto arg = memarg(ctx, bytes); CHECK_ERR(arg); - return ctx.makeLoad( - pos, annotations, type, signed_, bytes, isAtomic, mem.getPtr(), *arg); + return ctx.makeLoad(pos, + annotations, + type, + signed_, + 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 1cd4734e604..96b5c84edab 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -574,6 +574,7 @@ struct PrintExpressionContents } restoreNormalColor(o); printMemoryName(curr->memory, o, wasm); + printMemoryOrder(curr->order); if (curr->offset) { o << " offset=" << curr->offset; } @@ -2323,6 +2324,7 @@ struct PrintExpressionContents o << index; } } + void printMemoryOrder(MemoryOrder order) { switch (order) { // Unordered should have a different base instruction, so there is nothing @@ -2332,10 +2334,11 @@ struct PrintExpressionContents case MemoryOrder::SeqCst: break; case MemoryOrder::AcqRel: - o << "acqrel "; + o << " acqrel"; break; } } + void visitStructGet(StructGet* curr) { auto heapType = curr->ref->type.getHeapType(); const auto& field = heapType.getStruct().fields[curr->index]; @@ -2345,25 +2348,27 @@ struct PrintExpressionContents } if (field.type == Type::i32 && field.packedType != Field::not_packed) { if (curr->signed_) { - printMedium(o, ".get_s "); + printMedium(o, ".get_s"); } else { - printMedium(o, ".get_u "); + printMedium(o, ".get_u"); } } else { - printMedium(o, ".get "); + printMedium(o, ".get"); } printMemoryOrder(curr->order); + o << ' '; printHeapTypeName(heapType); o << ' '; printFieldName(heapType, curr->index); } void visitStructSet(StructSet* curr) { if (curr->order == MemoryOrder::Unordered) { - printMedium(o, "struct.set "); + printMedium(o, "struct.set"); } else { - printMedium(o, "struct.atomic.set "); + printMedium(o, "struct.atomic.set"); } printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); o << ' '; @@ -2374,9 +2379,9 @@ struct PrintExpressionContents o << "struct.atomic.rmw."; printAtomicRMWOp(curr->op); restoreNormalColor(o); - o << ' '; printMemoryOrder(curr->order); printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); o << ' '; @@ -2384,10 +2389,11 @@ struct PrintExpressionContents } void visitStructCmpxchg(StructCmpxchg* curr) { prepareColor(o); - o << "struct.atomic.rmw.cmpxchg "; + o << "struct.atomic.rmw.cmpxchg"; restoreNormalColor(o); printMemoryOrder(curr->order); printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); o << ' '; @@ -2430,23 +2436,25 @@ struct PrintExpressionContents } if (element.type == Type::i32 && element.packedType != Field::not_packed) { if (curr->signed_) { - printMedium(o, ".get_s "); + printMedium(o, ".get_s"); } else { - printMedium(o, ".get_u "); + printMedium(o, ".get_u"); } } else { - printMedium(o, ".get "); + printMedium(o, ".get"); } printMemoryOrder(curr->order); + o << ' '; printHeapTypeName(curr->ref->type.getHeapType()); } void visitArraySet(ArraySet* curr) { if (curr->order == MemoryOrder::Unordered) { - printMedium(o, "array.set "); + printMedium(o, "array.set"); } else { - printMedium(o, "array.atomic.set "); + printMedium(o, "array.atomic.set"); } printMemoryOrder(curr->order); + o << ' '; printHeapTypeName(curr->ref->type.getHeapType()); } void visitArrayLen(ArrayLen* curr) { printMedium(o, "array.len"); } @@ -2477,18 +2485,19 @@ struct PrintExpressionContents o << "array.atomic.rmw."; printAtomicRMWOp(curr->op); restoreNormalColor(o); - o << ' '; printMemoryOrder(curr->order); printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); } void visitArrayCmpxchg(ArrayCmpxchg* curr) { prepareColor(o); - o << "array.atomic.rmw.cmpxchg "; + o << "array.atomic.rmw.cmpxchg"; restoreNormalColor(o); printMemoryOrder(curr->order); printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); } diff --git a/src/passes/SafeHeap.cpp b/src/passes/SafeHeap.cpp index 124f8a383bc..5d84fcc403a 100644 --- a/src/passes/SafeHeap.cpp +++ b/src/passes/SafeHeap.cpp @@ -26,6 +26,7 @@ #include "ir/import-utils.h" #include "ir/load-utils.h" #include "pass.h" +#include "support/string.h" #include "wasm-builder.h" #include "wasm.h" @@ -37,18 +38,28 @@ static const Name SEGFAULT_IMPORT("segfault"); static const Name ALIGNFAULT_IMPORT("alignfault"); static Name getLoadName(Load* curr) { - std::string ret = "SAFE_HEAP_LOAD_"; - ret += curr->type.toString(); - ret += "_" + std::to_string(curr->bytes) + "_"; + std::vector parts{curr->type.toString(), + std::to_string(curr->bytes)}; if (LoadUtils::isSignRelevant(curr) && !curr->signed_) { - ret += "U_"; + parts.push_back("U"); } - if (curr->isAtomic()) { - ret += "A"; - } else { - ret += std::to_string(curr->align); + + 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"); + break; + } } - return ret; + + return "SAFE_HEAP_LOAD_" + String::join(parts, "_"); } static Name getStoreName(Store* curr) { @@ -232,10 +243,11 @@ struct SafeHeap : public Pass { if (align > bytes) { continue; } - for (auto isAtomic : {true, false}) { - load.order = - isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered; - if (isAtomic && + for (auto memoryOrder : {MemoryOrder::Unordered, + MemoryOrder::AcqRel, + MemoryOrder::SeqCst}) { + load.order = memoryOrder; + if (load.isAtomic() && !isPossibleAtomicOperation( align, bytes, module->memories[0]->shared, type)) { continue; diff --git a/src/support/string.h b/src/support/string.h index 56a7a81ab80..5d9da0e0cf0 100644 --- a/src/support/string.h +++ b/src/support/string.h @@ -58,6 +58,23 @@ class Split : public std::vector { } }; +template>> +std::string join(const std::vector& strs, std::string_view sep) { + if (strs.empty()) { + return ""; + } + + std::string ret = std::string(strs[0]); + for (size_t i = 1; i < strs.size(); i++) { + ret.append(sep); + ret.append(strs[i]); + } + + return ret; +} + // Handles bracketing in a list initially split by ",", but the list may // contain nested ","s. For example, // void foo(int, double) diff --git a/src/tools/wasm-split/instrumenter.cpp b/src/tools/wasm-split/instrumenter.cpp index 93971ed941b..085715ce246 100644 --- a/src/tools/wasm-split/instrumenter.cpp +++ b/src/tools/wasm-split/instrumenter.cpp @@ -287,8 +287,12 @@ void Instrumenter::addProfileExport(size_t numFuncs) { getAddr(), builder.makeBinary( MulInt32, getFuncIdx(), builder.makeConst(uint32_t(4)))), - builder.makeAtomicLoad( - 1, 0, getFuncIdx(), Type::i32, loadMemoryName), + builder.makeAtomicLoad(1, + 0, + getFuncIdx(), + Type::i32, + loadMemoryName, + MemoryOrder::SeqCst), Type::i32, wasm->memories[0]->name), builder.makeLocalSet( diff --git a/src/wasm-binary.h b/src/wasm-binary.h index f7a20190e5a..78a0a6e2434 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -358,6 +358,9 @@ enum BrOnCastFlag { constexpr uint32_t ExactImport = 1 << 5; +constexpr uint32_t HasMemoryOrderMask = 1 << 5; +constexpr uint32_t HasMemoryIndexMask = 1 << 6; + enum EncodedType { // value types i32 = -0x1, // 0x7f @@ -1728,7 +1731,10 @@ class WasmBinaryReader { size_t inlineHintsLen = 0; void readInlineHints(size_t payloadLen); - Index readMemoryAccess(Address& alignment, Address& offset); + std::tuple + readMemoryAccess(bool isAtomic, bool isRMW); + std::tuple getAtomicMemarg(); + std::tuple getRMWMemarg(); std::tuple getMemarg(); MemoryOrder getMemoryOrder(bool isRMW = false); diff --git a/src/wasm-builder.h b/src/wasm-builder.h index fb273b32568..6878e0dff7b 100644 --- a/src/wasm-builder.h +++ b/src/wasm-builder.h @@ -384,10 +384,17 @@ class Builder { ret->finalize(); return ret; } - Load* makeAtomicLoad( - unsigned bytes, Address offset, Expression* ptr, Type type, Name memory) { + Load* makeAtomicLoad(unsigned bytes, + Address offset, + Expression* ptr, + Type type, + Name memory, + MemoryOrder order) { + assert(order != MemoryOrder::Unordered && + "Atomic loads can't be unordered"); + Load* load = makeLoad(bytes, false, offset, bytes, ptr, type, memory); - load->order = MemoryOrder::SeqCst; + load->order = order; return load; } AtomicWait* makeAtomicWait(Expression* ptr, diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index e8bed5bc4fb..a3845b385c6 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -156,7 +156,8 @@ class IRBuilder : public UnifiedExpressionVisitor> { Name mem); Result<> makeStore( unsigned bytes, Address offset, unsigned align, Type type, Name mem); - Result<> makeAtomicLoad(unsigned bytes, Address offset, 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<> makeAtomicRMW( AtomicRMWOp op, unsigned bytes, Address offset, Type type, Name mem); diff --git a/src/wasm-stack.h b/src/wasm-stack.h index 41118d1391e..961d2f5ab60 100644 --- a/src/wasm-stack.h +++ b/src/wasm-stack.h @@ -129,7 +129,9 @@ class BinaryInstWriter : public OverriddenVisitor { void emitMemoryAccess(size_t alignment, size_t bytes, uint64_t offset, - Name memory); + Name memory, + MemoryOrder order, + bool isRMW); int32_t getBreakIndex(Name name); WasmBinaryWriter& parent; diff --git a/src/wasm.h b/src/wasm.h index 57b41a5d1a7..67c268e9588 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -996,7 +996,7 @@ class Load : public SpecificExpression { Address align; Expression* ptr; Name memory; - MemoryOrder order; + MemoryOrder order = MemoryOrder::Unordered; bool isAtomic() const { return order != MemoryOrder::Unordered; } diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 556fc535e32..d24f7da423f 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -1331,9 +1331,10 @@ static void writeBase64VLQ(std::ostream& out, int32_t n) { } // more VLG digit will follow -- add continuation bit (0x20), // base64 codes 'g'..'z', '0'..'9', '+', '/' - out << char(digit < 20 - ? 'g' + digit - : digit < 30 ? '0' + digit - 20 : digit == 30 ? '+' : '/'); + out << char(digit < 20 ? 'g' + digit + : digit < 30 ? '0' + digit - 20 + : digit == 30 ? '+' + : '/'); } } @@ -3625,89 +3626,89 @@ Result<> WasmBinaryReader::readInst() { switch (op) { case BinaryConsts::I32AtomicLoad8U: { // TODO: pass align through for validation. - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(1, offset, Type::i32, mem); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); + return builder.makeAtomicLoad(1, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I32AtomicLoad16U: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(2, offset, Type::i32, mem); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); + return builder.makeAtomicLoad(2, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I32AtomicLoad: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(4, offset, Type::i32, mem); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); + return builder.makeAtomicLoad(4, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad8U: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(1, offset, Type::i64, mem); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); + return builder.makeAtomicLoad(1, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad16U: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(2, offset, Type::i64, mem); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); + return builder.makeAtomicLoad(2, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad32U: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(4, offset, Type::i64, mem); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); + return builder.makeAtomicLoad(4, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(8, offset, Type::i64, mem); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); + return builder.makeAtomicLoad(8, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I32AtomicStore8: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(1, offset, Type::i32, mem); } case BinaryConsts::I32AtomicStore16: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(2, offset, Type::i32, mem); } case BinaryConsts::I32AtomicStore: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(4, offset, Type::i32, mem); } case BinaryConsts::I64AtomicStore8: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(1, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore16: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(2, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore32: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(4, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(8, offset, Type::i64, mem); } #define RMW(op) \ case BinaryConsts::I32AtomicRMW##op: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 4, offset, Type::i32, mem); \ } \ case BinaryConsts::I32AtomicRMW##op##8U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 1, offset, Type::i32, mem); \ } \ case BinaryConsts::I32AtomicRMW##op##16U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 2, offset, Type::i32, mem); \ } \ case BinaryConsts::I64AtomicRMW##op: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 8, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##8U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 1, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##16U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 2, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##32U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 4, offset, Type::i64, mem); \ } @@ -3719,43 +3720,43 @@ Result<> WasmBinaryReader::readInst() { RMW(Xchg); case BinaryConsts::I32AtomicCmpxchg: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(4, offset, Type::i32, mem); } case BinaryConsts::I32AtomicCmpxchg8U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(1, offset, Type::i32, mem); } case BinaryConsts::I32AtomicCmpxchg16U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(2, offset, Type::i32, mem); } case BinaryConsts::I64AtomicCmpxchg: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(8, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg8U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(1, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg16U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(2, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg32U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(4, offset, Type::i64, mem); } case BinaryConsts::I32AtomicWait: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicWait(Type::i32, offset, mem); } case BinaryConsts::I64AtomicWait: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicWait(Type::i64, offset, mem); } case BinaryConsts::AtomicNotify: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicNotify(offset, mem); } case BinaryConsts::AtomicFence: @@ -5462,39 +5463,66 @@ void WasmBinaryReader::readInlineHints(size_t payloadLen) { }); } -Index WasmBinaryReader::readMemoryAccess(Address& alignment, Address& offset) { +std::tuple +WasmBinaryReader::readMemoryAccess(bool isAtomic, bool isRMW) { auto rawAlignment = getU32LEB(); - bool hasMemIdx = false; Index memIdx = 0; - // Check bit 6 in the alignment to know whether a memory index is present per: - // https://github.com/WebAssembly/multi-memory/blob/main/proposals/multi-memory/Overview.md - if (rawAlignment & (1 << (6))) { - hasMemIdx = true; + + bool hasMemoryOrder = rawAlignment & BinaryConsts::HasMemoryOrderMask; + if (hasMemoryOrder && !isAtomic) { + throwError("Memory order may only be set for atomic instructions."); + } + + if (hasMemoryOrder) { // Clear the bit before we parse alignment - rawAlignment = rawAlignment & ~(1 << 6); + rawAlignment = rawAlignment & ~BinaryConsts::HasMemoryOrderMask; + } + + bool hasMemIdx = rawAlignment & BinaryConsts::HasMemoryIndexMask; + if (hasMemIdx) { + // Clear the bit before we parse alignment + rawAlignment = rawAlignment & ~BinaryConsts::HasMemoryIndexMask; } if (rawAlignment > 8) { throwError("Alignment must be of a reasonable size"); } - alignment = Bits::pow2(rawAlignment); + Address alignment = Bits::pow2(rawAlignment); + MemoryOrder memoryOrder = + isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered; if (hasMemIdx) { memIdx = getU32LEB(); } + if (hasMemoryOrder) { + memoryOrder = getMemoryOrder(isRMW); + } if (memIdx >= wasm.memories.size()) { throwError("Memory index out of range while reading memory alignment."); } auto* memory = wasm.memories[memIdx].get(); - offset = memory->addressType == Type::i32 ? getU32LEB() : getU64LEB(); + Address offset = memory->addressType == Type::i32 ? getU32LEB() : getU64LEB(); + + return {alignment, offset, memIdx, memoryOrder}; +} + +std::tuple +WasmBinaryReader::getAtomicMemarg() { + auto [alignment, offset, memIdx, memoryOrder] = + readMemoryAccess(/*isAtomic=*/true, /*isRMW=*/false); + return {getMemoryName(memIdx), alignment, offset, memoryOrder}; +} - return memIdx; +std::tuple +WasmBinaryReader::getRMWMemarg() { + auto [alignment, offset, memIdx, memoryOrder] = + readMemoryAccess(/*isAtomic=*/true, /*isRMW=*/true); + return {getMemoryName(memIdx), alignment, offset, memoryOrder}; } -// TODO: make this the only version std::tuple WasmBinaryReader::getMemarg() { - Address alignment, offset; - auto memIdx = readMemoryAccess(alignment, offset); + auto [alignment, offset, memIdx, _] = + readMemoryAccess(/*isAtomic=*/false, /*isRMW=*/false); return {getMemoryName(memIdx), alignment, offset}; } diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 74ba7ee1fe4..200a9e0d107 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -1483,12 +1483,12 @@ Result<> IRBuilder::makeStore( return Ok{}; } -Result<> -IRBuilder::makeAtomicLoad(unsigned bytes, Address offset, Type type, Name mem) { +Result<> IRBuilder::makeAtomicLoad( + unsigned bytes, Address offset, Type type, Name mem, MemoryOrder order) { Load curr; curr.memory = mem; CHECK_ERR(visitLoad(&curr)); - push(builder.makeAtomicLoad(bytes, offset, curr.ptr, type, mem)); + push(builder.makeAtomicLoad(bytes, offset, curr.ptr, type, mem, order)); return Ok{}; } diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 45a97fab3b7..ce2d6c737fd 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -361,7 +361,12 @@ void BinaryInstWriter::visitLoad(Load* curr) { WASM_UNREACHABLE("unexpected type"); } } - emitMemoryAccess(curr->align, curr->bytes, curr->offset, curr->memory); + emitMemoryAccess(curr->align, + curr->bytes, + curr->offset, + curr->memory, + curr->order, + /*isRMW=*/false); } void BinaryInstWriter::visitStore(Store* curr) { @@ -469,7 +474,12 @@ void BinaryInstWriter::visitStore(Store* curr) { WASM_UNREACHABLE("unexpected type"); } } - emitMemoryAccess(curr->align, curr->bytes, curr->offset, curr->memory); + emitMemoryAccess(curr->align, + curr->bytes, + curr->offset, + curr->memory, + curr->order, + /*isRMW=*/false); } void BinaryInstWriter::visitAtomicRMW(AtomicRMW* curr) { @@ -526,9 +536,12 @@ void BinaryInstWriter::visitAtomicRMW(AtomicRMW* curr) { default: WASM_UNREACHABLE("unexpected op"); } -#undef CASE_FOR_OP - - emitMemoryAccess(curr->bytes, curr->bytes, curr->offset, curr->memory); + emitMemoryAccess(curr->bytes, + curr->bytes, + curr->offset, + curr->memory, + MemoryOrder::SeqCst, + /*isRMW=*/true); } void BinaryInstWriter::visitAtomicCmpxchg(AtomicCmpxchg* curr) { @@ -570,7 +583,12 @@ void BinaryInstWriter::visitAtomicCmpxchg(AtomicCmpxchg* curr) { default: WASM_UNREACHABLE("unexpected type"); } - emitMemoryAccess(curr->bytes, curr->bytes, curr->offset, curr->memory); + emitMemoryAccess(curr->bytes, + curr->bytes, + curr->offset, + curr->memory, + MemoryOrder::SeqCst, + /*isRMW=*/true); } void BinaryInstWriter::visitAtomicWait(AtomicWait* curr) { @@ -578,12 +596,14 @@ void BinaryInstWriter::visitAtomicWait(AtomicWait* curr) { switch (curr->expectedType.getBasic()) { case Type::i32: { o << int8_t(BinaryConsts::I32AtomicWait); - emitMemoryAccess(4, 4, curr->offset, curr->memory); + emitMemoryAccess( + 4, 4, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false); break; } case Type::i64: { o << int8_t(BinaryConsts::I64AtomicWait); - emitMemoryAccess(8, 8, curr->offset, curr->memory); + emitMemoryAccess( + 8, 8, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false); break; } default: @@ -593,7 +613,8 @@ void BinaryInstWriter::visitAtomicWait(AtomicWait* curr) { void BinaryInstWriter::visitAtomicNotify(AtomicNotify* curr) { o << int8_t(BinaryConsts::AtomicPrefix) << int8_t(BinaryConsts::AtomicNotify); - emitMemoryAccess(4, 4, curr->offset, curr->memory); + emitMemoryAccess( + 4, 4, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false); } void BinaryInstWriter::visitAtomicFence(AtomicFence* curr) { @@ -800,8 +821,12 @@ void BinaryInstWriter::visitSIMDLoad(SIMDLoad* curr) { break; } assert(curr->align); - emitMemoryAccess( - curr->align, /*(unused) bytes=*/0, curr->offset, curr->memory); + emitMemoryAccess(curr->align, + /*(unused) bytes=*/0, + curr->offset, + curr->memory, + MemoryOrder::Unordered, + /*isRMW=*/false); } void BinaryInstWriter::visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) { @@ -833,8 +858,12 @@ void BinaryInstWriter::visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) { break; } assert(curr->align); - emitMemoryAccess( - curr->align, /*(unused) bytes=*/0, curr->offset, curr->memory); + emitMemoryAccess(curr->align, + /*(unused) bytes=*/0, + curr->offset, + curr->memory, + MemoryOrder::Unordered, + /*isRMW=*/false); o << curr->index; } @@ -3204,18 +3233,36 @@ InsertOrderedMap BinaryInstWriter::countScratchLocals() { void BinaryInstWriter::emitMemoryAccess(size_t alignment, size_t bytes, uint64_t offset, - Name memory) { + Name memory, + MemoryOrder order, + bool isRMW) { uint32_t alignmentBits = Bits::log2(alignment ? alignment : bytes); uint32_t memoryIdx = parent.getMemoryIndex(memory); + + bool shouldWriteMemoryOrder = false; + switch (order) { + // On atomic memory accesses, the ordering is assumed to be SeqCst if not + // specified. Omit it here for a smaller binary size. + case MemoryOrder::Unordered: + case MemoryOrder::SeqCst: + break; + case MemoryOrder::AcqRel: { + shouldWriteMemoryOrder = true; + alignmentBits |= BinaryConsts::HasMemoryOrderMask; + break; + } + } + if (memoryIdx > 0) { - // Set bit 6 in the alignment to indicate a memory index is present per: - // https://github.com/WebAssembly/multi-memory/blob/main/proposals/multi-memory/Overview.md - alignmentBits = alignmentBits | 1 << 6; + alignmentBits |= BinaryConsts::HasMemoryIndexMask; } o << U32LEB(alignmentBits); if (memoryIdx > 0) { o << U32LEB(memoryIdx); } + if (shouldWriteMemoryOrder) { + parent.writeMemoryOrder(order, isRMW); + } bool memory64 = parent.getModule()->getMemory(memory)->is64(); if (memory64) { diff --git a/test/lit/basic/relaxed-atomics.wast b/test/lit/basic/relaxed-atomics.wast new file mode 100644 index 00000000000..a6a759f1029 --- /dev/null +++ b/test/lit/basic/relaxed-atomics.wast @@ -0,0 +1,40 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. +;; RUN: wasm-opt -all %s --roundtrip -S -o - | filecheck %s --check-prefix=RTRIP + +(module + ;; 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-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: ) + (func $acqrel (result i32) + (i32.atomic.load acqrel + (i32.const 1) + ) + ) + + ;; Optional seqcst ordering is dropped in text output. + ;; RTRIP: (func $seqcst (type $0) (result i32) + ;; 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: ) + ;; RTRIP-NEXT: ) + (func $seqcst (result i32) + ;; seqcst may be omitted for atomic loads, it's the default + (drop (i32.atomic.load seqcst + (i32.const 1) + )) + ;; allows memory index before memory ordering immediate + (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 6ba85e772b1..e5cf26c8cd1 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd.wast @@ -45,7 +45,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_SC ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -242,7 +242,7 @@ ) ) ;; not shared -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -277,18 +277,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -323,12 +317,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -363,8 +363,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -408,7 +414,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -426,7 +432,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -443,12 +449,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -466,7 +472,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -483,27 +489,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -538,21 +529,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -587,12 +569,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -636,12 +627,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -685,12 +682,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -708,7 +711,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -725,12 +728,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -748,7 +751,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -774,12 +777,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -797,7 +800,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -817,18 +820,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -846,7 +849,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -866,18 +869,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -895,7 +898,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -912,18 +915,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -941,7 +938,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -958,12 +955,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -981,7 +987,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -998,12 +1004,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1021,7 +1036,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1038,12 +1053,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1061,7 +1085,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1078,12 +1102,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1101,7 +1134,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1118,27 +1151,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1156,7 +1174,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1173,21 +1191,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1205,7 +1220,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1222,12 +1237,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1245,7 +1266,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1262,21 +1283,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1294,7 +1306,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1311,21 +1323,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1343,7 +1386,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1360,12 +1403,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1383,7 +1426,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1409,12 +1452,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1432,7 +1475,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1452,7 +1495,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) @@ -1460,16 +1503,16 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.shr_s ;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1487,7 +1530,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1507,18 +1550,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1536,7 +1585,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1553,12 +1602,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1576,7 +1625,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1602,12 +1651,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1625,7 +1674,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1645,18 +1694,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1674,7 +1723,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1694,18 +1743,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1723,7 +1772,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1740,12 +1789,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1763,7 +1812,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1789,12 +1838,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1812,7 +1861,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1838,12 +1887,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1861,7 +1910,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1881,18 +1930,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1910,7 +1965,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1930,18 +1985,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1976,12 +2037,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2025,12 +2086,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2074,12 +2135,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2097,7 +2158,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2114,12 +2175,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2137,7 +2207,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2157,18 +2227,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2203,21 +2273,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2255,18 +2316,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2284,7 +2345,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2301,12 +2362,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2324,7 +2394,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2344,18 +2414,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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: (v128.load align=2 +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2373,7 +2443,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2393,18 +2463,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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: (v128.load align=4 +;; CHECK-NEXT: (i64.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2422,7 +2492,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2448,12 +2518,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (i64.atomic.load ;; 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: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2471,7 +2541,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2488,23 +2558,14 @@ ;; 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: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2513,21 +2574,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2537,15 +2598,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2554,21 +2623,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2578,15 +2647,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2595,21 +2672,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2619,15 +2696,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2636,21 +2712,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2662,22 +2738,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2686,21 +2761,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2712,22 +2787,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2736,21 +2810,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2760,15 +2834,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2777,21 +2859,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2801,24 +2883,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2827,21 +2899,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2853,22 +2925,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2877,21 +2948,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2903,22 +2974,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2927,21 +2997,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2951,15 +3021,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; 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_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; 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) @@ -2968,21 +3046,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2992,13 +3070,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 -;; CHECK-NEXT: (local.get $3) +;; 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_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3016,7 +3102,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) @@ -3033,13 +3119,95 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.atomic.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_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3083,13 +3251,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -3133,13 +3301,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -3174,13 +3342,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3224,13 +3392,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; 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_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3274,13 +3442,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3324,13 +3492,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; 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_1_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3348,7 +3516,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3365,13 +3533,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (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 @@ -3389,7 +3557,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3406,22 +3574,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.store align=2 +;; CHECK-NEXT: (i64.store8 ;; 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_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 @@ -3439,7 +3598,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3456,22 +3615,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; 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_8_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3489,7 +3639,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3509,19 +3659,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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_8 (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 @@ -3539,7 +3689,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3559,19 +3709,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store16 ;; 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_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 @@ -3606,13 +3756,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -3656,13 +3806,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3706,13 +3856,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -3730,7 +3880,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) @@ -3747,13 +3897,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -3788,22 +3947,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: (f64.store align=2 +;; CHECK-NEXT: (i64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -3841,19 +3991,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: (f64.store align=4 +;; 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_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -3891,19 +4041,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: (f64.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_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3921,7 +4071,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3938,13 +4088,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.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.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (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 @@ -3962,7 +4121,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3982,19 +4141,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: (v128.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -4012,7 +4171,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) @@ -4029,22 +4188,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: (v128.store align=4 +;; 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_8 (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 @@ -4062,7 +4212,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) @@ -4082,19 +4232,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; 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_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -4112,7 +4262,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) @@ -4132,67 +4282,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - (memory 100 100) - ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - - ;; CHECK: (type $1 (func (param i32 i32 i64))) - - ;; CHECK: (type $2 (func (param i32 i32) (result i32))) - - ;; CHECK: (type $3 (func (param i32 i32 i32))) - - ;; CHECK: (type $4 (func (param i32 i32) (result v128))) - - ;; CHECK: (type $5 (func (param i32 i32 v128))) - - ;; CHECK: (type $6 (func (param i32 i32) (result f64))) - - ;; CHECK: (type $7 (func (param i32 i32 f64))) - - ;; CHECK: (type $8 (func)) - - ;; CHECK: (type $9 (func (param i32 i32) (result f32))) - - ;; CHECK: (type $10 (func (param i32 i32 f32))) - - ;; CHECK: (type $11 (func (result i32))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - - ;; CHECK: (import "env" "segfault" (func $segfault)) - - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - - ;; CHECK: (memory $0 100 100) - ;; CHECK: (func $loads - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $loads - (drop (i32.load (i32.const 1))) - ) -) -;; pre-existing -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4201,21 +4305,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 1) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4225,14 +4329,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4241,21 +4346,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 1) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4265,14 +4370,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; 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_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; 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) @@ -4281,21 +4396,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4305,14 +4420,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s 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: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4321,21 +4446,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4347,21 +4472,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4370,21 +4496,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4394,14 +4520,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4410,21 +4537,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4436,21 +4563,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4459,21 +4587,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 4) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4483,14 +4611,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4499,21 +4637,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 4) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4525,21 +4663,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4548,21 +4687,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 4) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4574,21 +4713,68 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +(module + (memory 100 100) + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 + ;; CHECK: (type $1 (func (param i32 i32 i64))) + + ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i32.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4621,12 +4807,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (i32.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4661,12 +4847,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4701,12 +4887,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4750,12 +4936,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4790,12 +4976,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4839,12 +5025,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4879,12 +5065,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4928,12 +5114,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4977,12 +5163,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5000,7 +5186,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5017,12 +5203,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5040,7 +5226,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5057,21 +5243,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5089,7 +5306,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5109,18 +5326,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5138,7 +5355,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5155,12 +5372,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5178,7 +5395,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5204,12 +5421,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5227,7 +5444,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5247,18 +5504,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5276,7 +5533,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5296,18 +5553,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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.load +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5342,12 +5599,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5391,12 +5648,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5440,12 +5697,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5480,12 +5737,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5529,12 +5786,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5578,12 +5835,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5627,12 +5884,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5650,7 +5907,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5667,12 +5924,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5690,7 +5947,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5716,12 +5973,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5739,7 +5996,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5765,12 +6022,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5788,7 +6045,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5808,18 +6105,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (f64.load align=2 ;; 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: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5837,7 +6134,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5857,20 +6154,20 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f64.load align=4 ;; 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: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5879,21 +6176,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5903,15 +6200,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5920,21 +6225,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5944,15 +6249,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5961,21 +6265,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5987,22 +6291,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6011,21 +6314,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6035,15 +6338,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6052,21 +6363,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6078,22 +6389,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; 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: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (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) @@ -6102,21 +6412,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6128,20 +6438,19 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; 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: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load ;; 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_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 @@ -6176,13 +6485,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -6217,13 +6526,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6267,13 +6576,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -6308,13 +6617,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6358,13 +6667,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; 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_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6408,13 +6717,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; 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_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 @@ -6432,7 +6741,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6449,13 +6758,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store 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_8_2 (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 @@ -6473,7 +6782,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6490,22 +6799,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.store align=2 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (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 @@ -6523,7 +6823,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6543,19 +6843,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.store align=4 +;; CHECK-NEXT: (i64.store16 ;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6573,7 +6873,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) @@ -6590,22 +6890,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: (i64.store +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -6640,13 +6931,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -6684,19 +6984,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: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 ;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6714,7 +7014,48 @@ ;; 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) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6734,19 +7075,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: (f32.store +;; 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_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -6781,13 +7122,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (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 @@ -6825,19 +7175,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.store ;; 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_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 @@ -6855,7 +7205,48 @@ ;; 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) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6875,19 +7266,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: (f64.store align=4 +;; 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_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -6905,7 +7296,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) @@ -6925,19 +7316,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: (f64.store +;; CHECK-NEXT: (f32.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: (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 @@ -6955,7 +7346,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6972,13 +7363,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; 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_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -6996,7 +7387,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7022,13 +7413,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; 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_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -7046,7 +7437,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7072,13 +7463,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; 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_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -7096,7 +7487,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7122,13 +7513,54 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; 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_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7139,21 +7571,667 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $2 (func (param i32 i32 i64))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (memory $0 100 100 shared) + (memory $0 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $actions + (drop (i32.load (i32.const 1))) + (i32.store (i32.const 1) (i32.const 100)) + ) +) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -7165,70 +8243,25 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - - ;; CHECK: (type $1 (func (param i32 i32) (result i32))) - - ;; CHECK: (type $2 (func (param i32 i32 i64))) - ;; CHECK: (type $3 (func (param i32 i32 i32))) - - ;; CHECK: (type $4 (func (param i32 i32) (result v128))) - - ;; CHECK: (type $5 (func (param i32 i32 v128))) - - ;; CHECK: (type $6 (func (param i32 i32) (result f64))) - - ;; CHECK: (type $7 (func (param i32 i32 f64))) - - ;; CHECK: (type $FUNCSIG$v (func)) - (type $FUNCSIG$v (func)) - ;; CHECK: (type $9 (func (param i32 i32) (result f32))) - - ;; CHECK: (type $10 (func (param i32 i32 f32))) - - ;; CHECK: (type $11 (func (result i32))) - - ;; CHECK: (import "env" "segfault" (func $segfault)) - (import "env" "segfault" (func $segfault)) - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - (import "env" "alignfault" (func $alignfault)) - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - - ;; CHECK: (memory $0 100 100 shared) - (memory $0 100 100 shared) - ;; CHECK: (func $actions - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (i32.const 100) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $actions - (drop (i32.load (i32.const 1))) - (i32.store (i32.const 1) (i32.const 100)) - ) -) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7246,7 +8279,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7263,18 +8296,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7292,7 +8319,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7309,12 +8336,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7332,7 +8368,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7349,12 +8385,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7372,7 +8417,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7389,12 +8434,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7412,7 +8466,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7429,12 +8483,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7452,7 +8506,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7478,18 +8532,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7507,7 +8555,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7527,18 +8575,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7556,7 +8604,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7573,12 +8621,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7596,7 +8653,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7616,18 +8673,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7645,7 +8702,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7662,21 +8719,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7694,7 +8742,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7711,12 +8759,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7734,7 +8788,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7751,21 +8805,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7783,7 +8834,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7800,21 +8851,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7832,7 +8914,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7849,21 +8931,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7881,7 +8954,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7898,18 +8971,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7927,7 +8994,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7944,12 +9011,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7967,7 +9043,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7984,12 +9060,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8007,7 +9098,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -8024,12 +9115,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8064,12 +9170,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8113,18 +9219,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8168,12 +9268,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8208,12 +9308,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8231,7 +9340,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -8248,21 +9357,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8280,7 +9380,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -8306,12 +9406,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8346,12 +9446,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8389,18 +9498,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8455,7 +9570,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8490,21 +9605,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8539,12 +9645,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8582,18 +9697,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8637,12 +9752,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8686,7 +9801,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -8829,7 +9944,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8873,12 +9988,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8922,7 +10037,56 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.atomic.load acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) 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 890887abd06..f4179d56cf3 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast @@ -45,7 +45,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_SC ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) @@ -242,7 +242,7 @@ ) ) ;; not shared -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -277,18 +277,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -323,12 +317,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -363,8 +363,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -408,7 +414,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -426,7 +432,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -443,12 +449,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -466,7 +472,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -483,29 +489,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -540,23 +529,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -591,12 +569,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -642,12 +631,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -693,12 +688,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -716,7 +717,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -733,12 +734,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -756,7 +757,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -784,12 +785,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -807,7 +808,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -829,18 +830,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -858,7 +859,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -880,18 +881,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -909,7 +910,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -926,18 +927,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -955,7 +950,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -972,12 +967,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -995,7 +1001,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1012,12 +1018,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1035,7 +1052,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1052,12 +1069,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1075,7 +1103,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1092,12 +1120,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1115,7 +1154,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1132,29 +1171,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1172,7 +1194,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1189,23 +1211,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1223,7 +1240,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1240,12 +1257,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1263,7 +1286,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1280,23 +1303,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1314,7 +1326,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1331,23 +1343,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq ;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1365,7 +1406,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1382,12 +1423,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1405,7 +1446,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1433,12 +1474,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1456,7 +1497,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1478,7 +1519,7 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) @@ -1486,16 +1527,16 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.shr_s ;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1513,7 +1554,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1535,18 +1576,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1564,7 +1611,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1581,12 +1628,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1604,7 +1651,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1632,12 +1679,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1655,7 +1702,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1677,18 +1724,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1706,7 +1753,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1728,18 +1775,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1757,7 +1804,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1774,12 +1821,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1797,7 +1844,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1825,12 +1872,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1848,7 +1895,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1876,12 +1923,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1899,7 +1946,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1921,18 +1968,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1950,7 +2003,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1972,18 +2025,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2018,12 +2077,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2069,12 +2128,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2120,12 +2179,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2143,7 +2202,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2160,12 +2219,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2183,7 +2253,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2205,18 +2275,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2251,23 +2321,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2307,18 +2366,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2336,7 +2395,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2353,12 +2412,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2376,7 +2446,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2398,18 +2468,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; 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: (v128.load align=2 +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2427,7 +2497,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2449,18 +2519,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; 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: (v128.load align=4 +;; CHECK-NEXT: (i64.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2478,7 +2548,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2506,12 +2576,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2529,7 +2599,47 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2551,20 +2661,20 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; 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: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2573,21 +2683,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2597,15 +2707,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2614,21 +2734,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2638,15 +2758,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2655,21 +2774,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2679,15 +2798,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2696,21 +2825,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2723,23 +2852,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2748,21 +2876,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2775,23 +2903,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2800,21 +2927,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2824,15 +2951,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2841,21 +2967,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2868,7 +2994,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -2876,15 +3002,14 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2893,21 +3018,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2920,7 +3045,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) @@ -2928,15 +3053,14 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2945,21 +3069,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2972,23 +3096,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (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) @@ -2997,15 +3120,66 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) -;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) @@ -3021,13 +3195,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (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 @@ -3062,13 +3236,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (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 @@ -3103,13 +3277,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3155,13 +3329,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (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 @@ -3207,13 +3381,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (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 @@ -3248,13 +3422,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3300,13 +3474,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; 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_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3352,13 +3526,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -3404,13 +3578,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; 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_1_A (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3428,7 +3602,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3445,13 +3619,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (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 @@ -3469,7 +3643,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3486,24 +3660,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.store align=2 +;; CHECK-NEXT: (i64.store8 ;; 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_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 @@ -3521,7 +3684,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3538,24 +3701,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: (i64.store align=4 +;; 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_8_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3573,7 +3725,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3595,19 +3747,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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_8 (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 @@ -3625,7 +3777,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3647,19 +3799,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store16 ;; 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_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 @@ -3694,13 +3846,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; 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 @@ -3746,13 +3898,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3798,13 +3950,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -3822,7 +3974,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) @@ -3839,13 +3991,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -3880,24 +4043,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: (f64.store align=2 +;; CHECK-NEXT: (i64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -3937,19 +4089,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: (f64.store align=4 +;; 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_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -3989,19 +4141,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: (f64.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_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -4019,7 +4171,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4036,13 +4188,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.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.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (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 @@ -4060,7 +4223,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4082,19 +4245,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: (v128.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; 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 @@ -4112,7 +4275,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4129,24 +4292,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: (v128.store align=4 +;; 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_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; 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 @@ -4164,7 +4316,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4186,19 +4338,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; 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_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; 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 @@ -4216,7 +4368,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4238,67 +4390,21 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - (memory i64 100 100) - ;; CHECK: (type $0 (func (param i64 i64) (result i64))) - - ;; CHECK: (type $1 (func (param i64 i64 i64))) - - ;; CHECK: (type $2 (func (param i64 i64) (result i32))) - - ;; CHECK: (type $3 (func (param i64 i64 i32))) - - ;; CHECK: (type $4 (func (param i64 i64) (result v128))) - - ;; CHECK: (type $5 (func (param i64 i64 v128))) - - ;; CHECK: (type $6 (func (param i64 i64) (result f64))) - - ;; CHECK: (type $7 (func (param i64 i64 f64))) - - ;; CHECK: (type $8 (func)) - - ;; CHECK: (type $9 (func (param i64 i64) (result f32))) - - ;; CHECK: (type $10 (func (param i64 i64 f32))) - - ;; CHECK: (type $11 (func (result i64))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) - - ;; CHECK: (import "env" "segfault" (func $segfault)) - - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - - ;; CHECK: (memory $0 i64 100 100) - ;; CHECK: (func $loads - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i64.const 1) - ;; CHECK-NEXT: (i64.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $loads - (drop (i32.load (i64.const 1))) - ) -) -;; pre-existing -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4307,21 +4413,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 1) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4331,14 +4437,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4347,21 +4454,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 1) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4371,14 +4478,26 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; 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_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; 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) @@ -4387,21 +4506,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4411,14 +4530,26 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s 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: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4427,21 +4558,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4454,22 +4585,23 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4478,21 +4610,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 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4502,14 +4634,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4518,21 +4651,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 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4545,7 +4678,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -4553,14 +4686,15 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4569,21 +4703,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 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4593,14 +4727,26 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load 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: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4609,21 +4755,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 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4636,22 +4782,23 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4660,21 +4807,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 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4687,24 +4834,71 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +(module + (memory i64 100 100) + ;; CHECK: (type $0 (func (param i64 i64) (result i64))) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 -;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $0) + ;; CHECK: (type $1 (func (param i64 i64 i64))) + + ;; CHECK: (type $2 (func (param i64 i64) (result i32))) + + ;; CHECK: (type $3 (func (param i64 i64 i32))) + + ;; CHECK: (type $4 (func (param i64 i64) (result v128))) + + ;; CHECK: (type $5 (func (param i64 i64 v128))) + + ;; CHECK: (type $6 (func (param i64 i64) (result f64))) + + ;; CHECK: (type $7 (func (param i64 i64 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i64 i64) (result f32))) + + ;; CHECK: (type $10 (func (param i64 i64 f32))) + + ;; CHECK: (type $11 (func (result i64))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 i64 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i64.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4735,12 +4929,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (i32.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4775,12 +4969,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4815,12 +5009,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4866,12 +5060,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4906,12 +5100,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4957,12 +5151,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4997,12 +5191,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5048,12 +5242,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5099,12 +5293,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5122,7 +5316,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5139,12 +5333,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5162,7 +5356,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5179,23 +5373,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq ;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5213,7 +5436,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5235,18 +5458,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5264,7 +5487,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5281,12 +5504,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5304,7 +5527,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5332,12 +5555,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5355,7 +5578,47 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5377,18 +5640,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5406,7 +5669,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5428,18 +5691,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5474,12 +5737,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5525,12 +5788,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5576,12 +5839,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5616,12 +5879,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5667,12 +5930,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5718,12 +5981,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5769,12 +6032,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5792,7 +6055,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5809,12 +6072,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5832,7 +6095,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5860,12 +6123,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5883,7 +6146,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5911,12 +6174,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5934,7 +6197,47 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5956,18 +6259,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5985,7 +6288,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6007,20 +6310,20 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6029,21 +6332,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6053,15 +6356,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6070,21 +6383,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6094,15 +6407,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6111,21 +6423,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6138,7 +6450,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -6146,15 +6458,14 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6163,21 +6474,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6187,15 +6498,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6204,21 +6525,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6231,23 +6552,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_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) @@ -6256,21 +6576,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6283,21 +6603,20 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load ;; 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_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 @@ -6332,13 +6651,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (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 @@ -6373,13 +6692,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -6425,13 +6744,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (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 @@ -6466,13 +6785,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -6518,13 +6837,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; 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_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; 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 @@ -6570,13 +6889,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; 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_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 @@ -6594,7 +6913,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6611,13 +6930,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store 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_8_2 (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 @@ -6635,7 +6954,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6652,24 +6971,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.store align=2 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (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 @@ -6687,7 +6995,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6709,19 +7017,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.store align=4 +;; CHECK-NEXT: (i64.store16 ;; 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_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6739,7 +7047,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) @@ -6756,24 +7064,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 7) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) +;; 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 @@ -6808,13 +7105,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 ;; 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_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 @@ -6854,19 +7162,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: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 ;; 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_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6884,7 +7192,48 @@ ;; 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) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6906,19 +7255,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: (f32.store +;; 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_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -6953,13 +7302,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (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 @@ -6999,19 +7359,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.store ;; 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_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 @@ -7029,7 +7389,48 @@ ;; 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) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7051,19 +7452,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: (f64.store align=4 +;; 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_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; 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 @@ -7081,7 +7482,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) @@ -7103,19 +7504,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: (f64.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (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 @@ -7133,7 +7534,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7150,13 +7551,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; 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_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; 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 @@ -7174,7 +7575,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7202,13 +7603,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; 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_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; 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 @@ -7226,7 +7627,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7254,13 +7655,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; 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_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; 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 @@ -7278,7 +7679,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7306,13 +7707,54 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; 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_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7352,52 +7794,208 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; 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.store +;; CHECK-NEXT: (v128.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - ;; CHECK: (type $0 (func (param i64 i64) (result i64))) - ;; CHECK: (type $1 (func (param i64 i64) (result i32))) - - ;; CHECK: (type $2 (func (param i64 i64 i64))) - - ;; CHECK: (type $3 (func (param i64 i64 i32))) - - ;; CHECK: (type $4 (func (param i64 i64) (result v128))) - - ;; CHECK: (type $5 (func (param i64 i64 v128))) - - ;; CHECK: (type $6 (func (param i64 i64) (result f64))) - - ;; CHECK: (type $7 (func (param i64 i64 f64))) - - ;; CHECK: (type $FUNCSIG$v (func)) - (type $FUNCSIG$v (func)) - ;; CHECK: (type $9 (func (param i64 i64) (result f32))) - - ;; CHECK: (type $10 (func (param i64 i64 f32))) - - ;; CHECK: (type $11 (func (result i64))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) - ;; CHECK: (import "env" "segfault" (func $segfault)) - (import "env" "segfault" (func $segfault)) - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - (import "env" "alignfault" (func $alignfault)) - ;; CHECK: (memory $0 i64 100 100 shared) - (memory $0 i64 100 100 shared) - ;; CHECK: (func $actions - ;; CHECK-NEXT: (drop +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i64 i64) (result i64))) + + ;; CHECK: (type $1 (func (param i64 i64) (result i32))) + + ;; CHECK: (type $2 (func (param i64 i64 i64))) + + ;; CHECK: (type $3 (func (param i64 i64 i32))) + + ;; CHECK: (type $4 (func (param i64 i64) (result v128))) + + ;; CHECK: (type $5 (func (param i64 i64 v128))) + + ;; CHECK: (type $6 (func (param i64 i64) (result f64))) + + ;; CHECK: (type $7 (func (param i64 i64 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i64 i64) (result f32))) + + ;; CHECK: (type $10 (func (param i64 i64 f32))) + + ;; CHECK: (type $11 (func (result i64))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) + (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (memory $0 i64 100 100 shared) + (memory $0 i64 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (i64.const 0) @@ -7414,7 +8012,407 @@ (i32.store (i64.const 1) (i32.const 100)) ) ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7432,7 +8430,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7449,18 +8447,29 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.shr_s ;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7478,7 +8487,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7495,12 +8504,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7518,7 +8527,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7535,12 +8544,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7558,7 +8578,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7575,12 +8595,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7615,12 +8646,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7638,7 +8680,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7655,29 +8697,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7695,7 +8720,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7723,12 +8748,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7746,7 +8771,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7763,12 +8788,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7786,7 +8822,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7808,18 +8844,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7837,7 +8873,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7859,18 +8895,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7888,7 +8924,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7905,12 +8941,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7928,7 +8964,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7945,23 +8981,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7979,7 +9010,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7996,23 +9027,58 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq ;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $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: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8030,7 +9096,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8047,23 +9113,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq ;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $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: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8081,7 +9176,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8098,18 +9193,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8127,7 +9216,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8144,12 +9233,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8167,7 +9267,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8184,12 +9284,29 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8207,7 +9324,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8224,12 +9341,29 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8264,12 +9398,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8315,18 +9449,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8372,12 +9500,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8412,12 +9540,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8435,7 +9574,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8452,23 +9591,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8486,7 +9614,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8514,12 +9642,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8554,12 +9682,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8599,18 +9738,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8667,7 +9812,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8702,23 +9847,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8753,12 +9887,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8798,18 +9943,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8855,12 +10000,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8906,7 +10051,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -9053,7 +10198,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -9099,12 +10244,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -9150,7 +10295,58 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.atomic.load acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) 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 f66e9bad90e..7aa9bf29e0d 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 @@ -45,7 +45,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_SC ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -242,7 +242,7 @@ ) ) ;; not shared -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -277,18 +277,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -323,12 +317,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -363,8 +363,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -408,7 +414,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -426,7 +432,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -443,12 +449,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -466,7 +472,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -483,27 +489,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -538,21 +529,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -587,12 +569,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -636,12 +627,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -685,12 +682,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -708,7 +711,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -725,12 +728,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -748,7 +751,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -774,12 +777,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -797,7 +800,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -817,18 +820,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -846,7 +849,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -866,18 +869,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -895,7 +898,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -912,18 +915,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -941,7 +938,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -958,12 +955,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -981,7 +987,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -998,12 +1004,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1021,7 +1036,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1038,12 +1053,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1061,7 +1085,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1078,12 +1102,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1101,7 +1134,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1118,27 +1151,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1156,7 +1174,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1173,21 +1191,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1205,7 +1220,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1222,12 +1237,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1245,7 +1266,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1262,21 +1283,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1294,7 +1306,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1311,21 +1323,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1343,7 +1386,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1360,12 +1403,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1383,7 +1426,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1409,12 +1452,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1432,7 +1475,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1452,7 +1495,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) @@ -1460,16 +1503,16 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.shr_s ;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1487,7 +1530,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1507,18 +1550,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1536,7 +1585,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1553,12 +1602,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1576,7 +1625,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1602,12 +1651,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1625,7 +1674,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1645,18 +1694,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1674,7 +1723,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1694,18 +1743,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1723,7 +1772,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1740,12 +1789,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1763,7 +1812,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1789,12 +1838,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1812,7 +1861,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1838,12 +1887,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1861,7 +1910,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1881,18 +1930,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1910,7 +1965,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1930,18 +1985,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1976,12 +2037,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2025,12 +2086,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2074,12 +2135,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2097,7 +2158,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2114,12 +2175,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2137,7 +2207,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2157,18 +2227,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2203,21 +2273,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2255,18 +2316,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2284,7 +2345,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2301,12 +2362,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2324,7 +2394,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2344,18 +2414,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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: (v128.load align=2 +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2373,7 +2443,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2393,18 +2463,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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: (v128.load align=4 +;; CHECK-NEXT: (i64.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2422,7 +2492,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2448,12 +2518,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (i64.atomic.load ;; 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: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2471,7 +2541,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2488,23 +2558,14 @@ ;; 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: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2513,21 +2574,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2537,15 +2598,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2554,21 +2623,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2578,15 +2647,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2595,21 +2672,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2619,15 +2696,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2636,21 +2712,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2662,22 +2738,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2686,21 +2761,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2712,22 +2787,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2736,21 +2810,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2760,15 +2834,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2777,21 +2859,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2801,24 +2883,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2827,21 +2899,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2853,22 +2925,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2877,21 +2948,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2903,22 +2974,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2927,21 +2997,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2951,15 +3021,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; 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_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; 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) @@ -2968,21 +3046,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2992,13 +3070,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 -;; CHECK-NEXT: (local.get $3) +;; 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_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3016,7 +3102,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) @@ -3033,13 +3119,95 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.atomic.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_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3083,13 +3251,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -3133,13 +3301,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -3174,13 +3342,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3224,13 +3392,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; 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_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3274,13 +3442,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; 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_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -3324,13 +3492,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; 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_1_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3348,7 +3516,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3365,13 +3533,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (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 @@ -3389,7 +3557,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3406,22 +3574,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.store align=2 +;; CHECK-NEXT: (i64.store8 ;; 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_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 @@ -3439,7 +3598,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3456,22 +3615,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; 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_8_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3489,7 +3639,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3509,19 +3659,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; 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_8 (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 @@ -3539,7 +3689,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3559,19 +3709,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store16 ;; 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_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 @@ -3606,13 +3756,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -3656,13 +3806,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3706,13 +3856,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.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_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -3730,7 +3880,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) @@ -3747,13 +3897,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -3788,22 +3947,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: (f64.store align=2 +;; CHECK-NEXT: (i64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -3841,19 +3991,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: (f64.store align=4 +;; 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_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -3891,19 +4041,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: (f64.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_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3921,7 +4071,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3938,13 +4088,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.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.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (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 @@ -3962,7 +4121,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3982,19 +4141,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: (v128.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -4012,7 +4171,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) @@ -4029,22 +4188,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: (v128.store align=4 +;; 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_8 (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 @@ -4062,7 +4212,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) @@ -4082,19 +4232,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; 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_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -4112,7 +4262,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) @@ -4132,67 +4282,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - (memory 100 100) - ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - - ;; CHECK: (type $1 (func (param i32 i32 i64))) - - ;; CHECK: (type $2 (func (param i32 i32) (result i32))) - - ;; CHECK: (type $3 (func (param i32 i32 i32))) - - ;; CHECK: (type $4 (func (param i32 i32) (result v128))) - - ;; CHECK: (type $5 (func (param i32 i32 v128))) - - ;; CHECK: (type $6 (func (param i32 i32) (result f64))) - - ;; CHECK: (type $7 (func (param i32 i32 f64))) - - ;; CHECK: (type $8 (func)) - - ;; CHECK: (type $9 (func (param i32 i32) (result f32))) - - ;; CHECK: (type $10 (func (param i32 i32 f32))) - - ;; CHECK: (type $11 (func (result i32))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - - ;; CHECK: (import "env" "segfault" (func $segfault)) - - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - - ;; CHECK: (memory $0 100 100) - ;; CHECK: (func $loads - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $loads - (drop (i32.load (i32.const 1))) - ) -) -;; pre-existing -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4201,21 +4305,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 1) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4225,14 +4329,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4241,21 +4346,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 1) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4265,14 +4370,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; 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_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; 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) @@ -4281,21 +4396,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4305,14 +4420,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s 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: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4321,21 +4446,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4347,21 +4472,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (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) @@ -4370,21 +4496,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4394,14 +4520,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4410,21 +4537,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 2) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4436,21 +4563,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4459,21 +4587,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 4) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4483,14 +4611,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4499,21 +4637,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 4) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4525,21 +4663,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4548,21 +4687,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 4) +;; 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 $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4574,21 +4713,68 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +(module + (memory 100 100) + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 + ;; CHECK: (type $1 (func (param i32 i32 i64))) + + ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i32.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4621,12 +4807,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (i32.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4661,12 +4847,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4701,12 +4887,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4750,12 +4936,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4790,12 +4976,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4839,12 +5025,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4879,12 +5065,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4928,12 +5114,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4977,12 +5163,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5000,7 +5186,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5017,12 +5203,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5040,7 +5226,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5057,21 +5243,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5089,7 +5306,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5109,18 +5326,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5138,7 +5355,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5155,12 +5372,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5178,7 +5395,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5204,12 +5421,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5227,7 +5444,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5247,18 +5504,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5276,7 +5533,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5296,18 +5553,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; 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.load +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5342,12 +5599,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5391,12 +5648,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5440,12 +5697,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5480,12 +5737,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5529,12 +5786,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5578,12 +5835,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5627,12 +5884,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5650,7 +5907,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5667,12 +5924,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5690,7 +5947,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5716,12 +5973,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5739,7 +5996,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5765,12 +6022,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5788,7 +6045,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5808,18 +6105,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (f64.load align=2 ;; 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: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5837,7 +6134,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5857,20 +6154,20 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f64.load align=4 ;; 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: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5879,21 +6176,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5903,15 +6200,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5920,21 +6225,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5944,15 +6249,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5961,21 +6265,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 2) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5987,22 +6291,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6011,21 +6314,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6035,15 +6338,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6052,21 +6363,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6078,22 +6389,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; 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: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (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) @@ -6102,21 +6412,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; 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 $3) -;; CHECK-NEXT: (i32.const 4) +;; 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 $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6128,20 +6438,19 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; 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: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load ;; 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_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 @@ -6176,13 +6485,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -6217,13 +6526,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6267,13 +6576,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (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 @@ -6308,13 +6617,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 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_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6358,13 +6667,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; 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_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; 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 @@ -6408,13 +6717,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; 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_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 @@ -6432,7 +6741,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6449,13 +6758,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store 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_8_2 (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 @@ -6473,7 +6782,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6490,22 +6799,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.store align=2 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (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 @@ -6523,7 +6823,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6543,19 +6843,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.store align=4 +;; CHECK-NEXT: (i64.store16 ;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6573,7 +6873,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) @@ -6590,22 +6890,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: (i64.store +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -6640,13 +6931,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; 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 @@ -6684,19 +6984,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: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 ;; 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_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6714,7 +7014,48 @@ ;; 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) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6734,19 +7075,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: (f32.store +;; 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_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -6781,13 +7122,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 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (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 @@ -6825,19 +7175,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.store ;; 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_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 @@ -6855,7 +7205,48 @@ ;; 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) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6875,19 +7266,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: (f64.store align=4 +;; 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_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; 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 @@ -6905,7 +7296,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) @@ -6925,19 +7316,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: (f64.store +;; CHECK-NEXT: (f32.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: (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 @@ -6955,7 +7346,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6972,13 +7363,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; 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_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -6996,7 +7387,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7022,13 +7413,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; 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_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -7046,7 +7437,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7072,13 +7463,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; 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_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; 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 @@ -7096,7 +7487,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7122,13 +7513,54 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; 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_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7139,21 +7571,667 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $2 (func (param i32 i32 i64))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) + (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (memory $0 100 100 shared) + (memory $0 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $actions + (drop (i32.load (i32.const 1))) + (i32.store (i32.const 1) (i32.const 100)) + ) +) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.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 $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load -;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -7165,70 +8243,25 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - - ;; CHECK: (type $1 (func (param i32 i32) (result i32))) - - ;; CHECK: (type $2 (func (param i32 i32 i64))) - ;; CHECK: (type $3 (func (param i32 i32 i32))) - - ;; CHECK: (type $4 (func (param i32 i32) (result v128))) - - ;; CHECK: (type $5 (func (param i32 i32 v128))) - - ;; CHECK: (type $6 (func (param i32 i32) (result f64))) - - ;; CHECK: (type $7 (func (param i32 i32 f64))) - - ;; CHECK: (type $FUNCSIG$v (func)) - (type $FUNCSIG$v (func)) - ;; CHECK: (type $9 (func (param i32 i32) (result f32))) - - ;; CHECK: (type $10 (func (param i32 i32 f32))) - - ;; CHECK: (type $11 (func (result i32))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) - ;; CHECK: (import "env" "segfault" (func $segfault)) - (import "env" "segfault" (func $segfault)) - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - (import "env" "alignfault" (func $alignfault)) - ;; CHECK: (memory $0 100 100 shared) - (memory $0 100 100 shared) - ;; CHECK: (func $actions - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (i32.const 100) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $actions - (drop (i32.load (i32.const 1))) - (i32.store (i32.const 1) (i32.const 100)) - ) -) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7246,7 +8279,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7263,18 +8296,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7292,7 +8319,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7309,12 +8336,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7332,7 +8368,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7349,12 +8385,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7372,7 +8417,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7389,12 +8434,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7412,7 +8466,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7429,12 +8483,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7452,7 +8506,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7478,18 +8532,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7507,7 +8555,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7527,18 +8575,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7556,7 +8604,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7573,12 +8621,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7596,7 +8653,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7616,18 +8673,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7645,7 +8702,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7662,21 +8719,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7694,7 +8742,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7711,12 +8759,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7734,7 +8788,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7751,21 +8805,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7783,7 +8834,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7800,21 +8851,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7832,7 +8914,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7849,21 +8931,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7881,7 +8954,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7898,18 +8971,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7927,7 +8994,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7944,12 +9011,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7967,7 +9043,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7984,12 +9060,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8007,7 +9098,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -8024,12 +9115,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8064,12 +9170,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8113,18 +9219,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8168,12 +9268,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8208,12 +9308,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8231,7 +9340,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -8248,21 +9357,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8280,7 +9380,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -8306,12 +9406,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8346,12 +9446,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8389,18 +9498,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8455,7 +9570,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8490,21 +9605,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8539,12 +9645,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8582,18 +9697,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8637,12 +9752,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8686,7 +9801,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -8829,7 +9944,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8873,12 +9988,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8922,7 +10037,56 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.atomic.load acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/spec/relaxed-atomics.wast b/test/spec/relaxed-atomics.wast new file mode 100644 index 00000000000..d76a2f62b00 --- /dev/null +++ b/test/spec/relaxed-atomics.wast @@ -0,0 +1,96 @@ +(module + (memory $0 23 256 shared) + + (func $acqrel (result i32) + (i32.atomic.load acqrel + (i32.const 1) + ) + ) + (func $seqcst (result i32) + ;; seqcst may be omitted for atomic loads, it's the default + (drop (i32.atomic.load seqcst + (i32.const 1) + )) + ;; allows memory index before memory ordering immediate + (i32.atomic.load 0 seqcst + (i32.const 1) + ) + ) +) + +(assert_malformed + (module quote + "(memory $0 23 256 shared)" + "(func $acqrel (result i32)" + " (i32.load acqrel" + " (i32.const 1)" + " ) " + ") " + ) + "Memory ordering can only be provided for atomic loads." +) + +;; Parses acquire-release immediate +;; Equivalent to +;; (module +;; (memory $0 23 256 shared) +;; (func $load (result i32) +;; (i32.atomic.load acqrel +;; (i32.const 1) +;; ) +;; ) +;; ) +(module binary + "\00asm\01\00\00\00" ;; header + version + "\01\05\01\60\00\01\7f\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0b\01" ;; code section + ;; func $load body + "\09\00" ;; size + decl count + "\41\01" ;; i32.const 1 + "\fe\10" ;; i32.atomic.load + "\22" ;; 2 | (1<<5): Alignment of 2 (32-bit load), with bit 5 set indicating that the next byte is a memory ordering + "\01" ;; acqrel ordering + "\00" ;; offset + "\0b" ;; end +) + +;; parses acquire-release immediate after memory index +(module binary + "\00asm\01\00\00\00" ;; header + version + "\01\05\01\60\00\01\7f\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0c\01" ;; code section + ;; func $load body + "\0a\00" ;; size + decl count + "\41\01" ;; i32.const 1 + "\fe\10" ;; i32.atomic.load + "\62" ;; 2 | (1<<5) | (1<<6): Alignment of 2 (32-bit load), with bit 5 set indicating that the next byte is a memory ordering + "\00" ;; memory index + "\01" ;; acqrel ordering + "\00" ;; offset + "\0b" ;; end +) + +;; Parses optional seqcst memory ordering for atomic loads +;; This isn't covered by round-trip tests because we omit it by default. +;; Equivalent to +;; (module +;; (memory $0 23 256 shared) +;; (func $load (result i32) +;; (i32.atomic.load seqcst +;; (i32.const 1) +;; ) +;; ) +;; ) +(module binary + "\00asm\01\00\00\00" ;; header + version + "\01\05\01\60\00\01\7f\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0b\01" ;; code section + ;; func $load body + "\09\00" ;; size + decl count + "\41\01" ;; i32.const 1 + "\fe\10" ;; i32.atomic.load + "\22" ;; 2 | (1<<5): Alignment of 2 (32-bit load), with bit 5 set indicating that the next byte is a memory ordering + "\00" ;; seqcst ordering + "\00" ;; offset + "\0b" ;; end +)