diff options
author | Alon Zakai <azakai@google.com> | 2023-10-17 09:31:14 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-17 09:31:14 -0700 |
commit | b816ac563de6b1c53087796335fce593a96f569a (patch) | |
tree | a1369d4c609e6b2f6a0c0ca3dfa14bb43bc93445 | |
parent | ede148eaa505d3681abd67b0b4d7de1b82ec05ff (diff) | |
download | binaryen-b816ac563de6b1c53087796335fce593a96f569a.tar.gz binaryen-b816ac563de6b1c53087796335fce593a96f569a.tar.bz2 binaryen-b816ac563de6b1c53087796335fce593a96f569a.zip |
Fuzzer: Move logic for adding a new local on demand to local.get (#6008)
Previously makeTrappingRefUse would add a local on demand if one was
missing for the type, and add a tee for it. This PR moves that logic to
makeLocalGet so that we get those benefits any time we want to emit a
local.get of a local type that does not exist (including from
makeTrappingRefUse which calls makeLocalGet).
-rw-r--r-- | src/tools/fuzzing/fuzzing.cpp | 51 | ||||
-rw-r--r-- | test/lit/fuzz-lattices.test | 1388 | ||||
-rw-r--r-- | test/passes/fuzz_metrics_noprint.bin.txt | 54 | ||||
-rw-r--r-- | test/passes/translate-to-fuzz_all-features_metrics_noprint.txt | 76 |
4 files changed, 104 insertions, 1465 deletions
diff --git a/src/tools/fuzzing/fuzzing.cpp b/src/tools/fuzzing/fuzzing.cpp index 2e7755848..2e4d460f7 100644 --- a/src/tools/fuzzing/fuzzing.cpp +++ b/src/tools/fuzzing/fuzzing.cpp @@ -1622,10 +1622,38 @@ Expression* TranslateToFuzzReader::makeCallRef(Type type) { Expression* TranslateToFuzzReader::makeLocalGet(Type type) { auto& locals = funcContext->typeLocals[type]; - if (locals.empty()) { + if (!locals.empty()) { + return builder.makeLocalGet(pick(locals), type); + } + // No existing local. When we want something trivial, just give up and emit a + // constant. + if (trivialNesting) { return makeConst(type); } - return builder.makeLocalGet(pick(locals), type); + + // Otherwise, we have 3 cases: a const, as above (we do this randomly some of + // the time), or emit a local.get of a new local, or emit a local.tee of a new + // local. + auto choice = upTo(3); + if (choice == 0) { + return makeConst(type); + } + // Otherwise, add a new local. If the type is not non-nullable then we may + // just emit a get for it (which, as this is a brand-new local, will read the + // default value, unless we are in a loop; for that reason for a non- + // nullable local we prefer a tee later down.). + auto index = builder.addVar(funcContext->func, type); + LocalSet* tee = nullptr; + if (choice == 1 || type.isNonNullable()) { + // Create the tee here before adding the local to typeLocals (or else we + // might end up using it prematurely inside the make() call). + tee = builder.makeLocalTee(index, make(type), type); + } + funcContext->typeLocals[type].push_back(index); + if (tee) { + return tee; + } + return builder.makeLocalGet(index, type); } Expression* TranslateToFuzzReader::makeLocalSet(Type type) { @@ -2475,8 +2503,8 @@ Expression* TranslateToFuzzReader::makeTrappingRefUse(HeapType type) { if (percent < 70 || !funcContext) { return make(nonNull); } - // With significant probability, try to use an existing value. it is better to - // have patterns like this: + // With significant probability, try to use an existing value, that is, to + // get a value using local.get, as it is better to have patterns like this: // // (local.set $ref (struct.new $.. // (struct.get (local.get $ref)) @@ -2488,17 +2516,10 @@ Expression* TranslateToFuzzReader::makeTrappingRefUse(HeapType type) { // // By using local values more, we get more coverage of interesting sequences // of reads and writes to the same objects. - auto& typeLocals = funcContext->typeLocals[nonNull]; - if (!typeLocals.empty()) { - return builder.makeLocalGet(pick(typeLocals), nonNull); - } - // Add a new local and tee it, so later operations can use it. - auto index = builder.addVar(funcContext->func, nonNull); - // Note we must create the child ref here before adding the local to - // typeLocals (or else we might end up using it prematurely). - auto* tee = builder.makeLocalTee(index, make(nonNull), nonNull); - funcContext->typeLocals[nonNull].push_back(index); - return tee; + // + // Note that makeLocalGet will add a local if necessary, and even tee that + // value so it is usable later as well. + return makeLocalGet(nonNull); } Expression* TranslateToFuzzReader::buildUnary(const UnaryArgs& args) { diff --git a/test/lit/fuzz-lattices.test b/test/lit/fuzz-lattices.test deleted file mode 100644 index 3d9b62e6c..000000000 --- a/test/lit/fuzz-lattices.test +++ /dev/null @@ -1,1388 +0,0 @@ -;; RUN: wasm-fuzz-lattices -v --seed=0 | filecheck %s - -;; CHECK: Running with seed 0 -;; CHECK-NEXT: Generated test module: -;; CHECK-NEXT: (module -;; CHECK-NEXT: (type $0 (func)) -;; CHECK-NEXT: (type $1 (func (result i32))) -;; CHECK-NEXT: (type $2 (func (result i64))) -;; CHECK-NEXT: (type $3 (func (param i32))) -;; CHECK-NEXT: (type $4 (func (param i64))) -;; CHECK-NEXT: (type $5 (func (param f32))) -;; CHECK-NEXT: (type $6 (func (param f64))) -;; CHECK-NEXT: (type $7 (func (param i32) (result f32))) -;; CHECK-NEXT: (type $8 (func (param i32 f32 f64 f32) (result i32))) -;; CHECK-NEXT: (import "fuzzing-support" "log-i32" (func $log-i32 (param i32))) -;; CHECK-NEXT: (import "fuzzing-support" "log-i64" (func $log-i64 (param i64))) -;; CHECK-NEXT: (import "fuzzing-support" "log-f32" (func $log-f32 (param f32))) -;; CHECK-NEXT: (import "fuzzing-support" "log-f64" (func $log-f64 (param f64))) -;; CHECK-NEXT: (global $global$ i64 (i64.const -13)) -;; CHECK-NEXT: (global $global$_1 i64 (i64.const -281474976710655)) -;; CHECK-NEXT: (global $global$_2 (mut i32) (i32.const 32767)) -;; CHECK-NEXT: (global $global$_3 i64 (i64.const 65534)) -;; CHECK-NEXT: (global $global$_4 f32 (f32.const -0.484000027179718)) -;; CHECK-NEXT: (global $global$_5 (mut f32) (f32.const 3402823466385288598117041e14)) -;; CHECK-NEXT: (global $global$_6 (mut f64) (f64.const 392913192)) -;; CHECK-NEXT: (global $global$_7 i32 (i32.const -1)) -;; CHECK-NEXT: (global $global$_8 i32 (i32.const -7151)) -;; CHECK-NEXT: (global $global$_9 f64 (f64.const 64257)) -;; CHECK-NEXT: (global $global$_10 i32 (i32.const -511)) -;; CHECK-NEXT: (global $global$_11 (mut i32) (i32.const -2)) -;; CHECK-NEXT: (global $global$_12 (mut i32) (i32.const -101)) -;; CHECK-NEXT: (global $global$_13 (mut f64) (f64.const -17592186044415.012)) -;; CHECK-NEXT: (global $global$_14 i32 (i32.const 1)) -;; CHECK-NEXT: (global $hangLimit (mut i32) (i32.const 100)) -;; CHECK-NEXT: (memory $0 16 17) -;; CHECK-NEXT: (data $0 (i32.const 0) "\00\00 ") -;; CHECK-NEXT: (table $fuzzing_table 0 funcref) -;; CHECK-NEXT: (elem $elem$ (i32.const 0)) -;; CHECK-NEXT: (export "func" (func $func)) -;; CHECK-NEXT: (export "func_invoker" (func $func_invoker)) -;; CHECK-NEXT: (export "func_6" (func $func_6)) -;; CHECK-NEXT: (export "func_6_invoker" (func $func_6_invoker)) -;; CHECK-NEXT: (export "func_8_invoker" (func $func_8_invoker)) -;; CHECK-NEXT: (export "func_10_invoker" (func $func_10_invoker)) -;; CHECK-NEXT: (export "hashMemory" (func $hashMemory)) -;; CHECK-NEXT: (export "memory" (memory $0)) -;; CHECK-NEXT: (func $func (param $0 i32) (result f32) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.sub -;; CHECK-NEXT: (f32.load offset=4 align=1 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.const -26294) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (loop $label$12 (result f32) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$13 (result f32) -;; CHECK-NEXT: (block $label$14 -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (f64.ge -;; CHECK-NEXT: (loop $label$15 (result f64) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block (result f64) -;; CHECK-NEXT: (block $label$16 -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$15 -;; CHECK-NEXT: (select -;; CHECK-NEXT: (i32.const -4) -;; CHECK-NEXT: (block $label$18 (result i32) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (if (result i32) -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (global.get $global$_14) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.get $global$_6) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.const -nan:0xfffffffffff9b) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$14 -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (i32.const -112) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (if (result f32) -;; CHECK-NEXT: (loop $label$24 (result i32) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block (result i32) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$24 -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$25 (result i32) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (block $label$26 -;; CHECK-NEXT: (call $log-f32 -;; CHECK-NEXT: (br_if $label$13 -;; CHECK-NEXT: (f32.const -18446744073709551615) -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (loop $label$27 (result i32) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block (result i32) -;; CHECK-NEXT: (block $label$28 -;; CHECK-NEXT: (call $log-f64 -;; CHECK-NEXT: (if (result f64) -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (i32.const 7) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.const -64) -;; CHECK-NEXT: (f64.const -nan:0xfffffffffff91) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i64 -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.const -128) -;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (i64.const -15324) -;; CHECK-NEXT: (select -;; CHECK-NEXT: (i64.load16_s offset=4 align=1 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.load offset=4 align=2 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (block $label$89 (result i32) -;; CHECK-NEXT: (f64.store offset=22 align=1 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.const -72) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.get $global$_6) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$89 -;; CHECK-NEXT: (br_if $label$89 -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (i32.const 23873) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.get $global$_14) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 5) -;; CHECK-NEXT: (if (result i32) -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (loop $label$74 -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$75 -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$76 -;; CHECK-NEXT: (return -;; CHECK-NEXT: (f32.const -nan:0x7fff9f) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$77 (result i32) -;; CHECK-NEXT: (nop) -;; CHECK-NEXT: (global.set $global$_6 -;; CHECK-NEXT: (f64.const -3402823466385288598117041e14) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.get $global$_10) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$78 (result i32) -;; CHECK-NEXT: (f32.store offset=22 align=1 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.load offset=22 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (if -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (loop $label$79 (result i32) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$80 (result i32) -;; CHECK-NEXT: (call $log-f64 -;; CHECK-NEXT: (loop $label$81 -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$82 -;; CHECK-NEXT: (br_if $label$81 -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (return -;; CHECK-NEXT: (f32.const 14) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$83 -;; CHECK-NEXT: (loop $label$84 -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (block $label$85 -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (block $label$86 -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$87 -;; CHECK-NEXT: (call $log-i64 -;; CHECK-NEXT: (i64.const 12616) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (return -;; CHECK-NEXT: (f32.const 166) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (i32.load8_u offset=4 -;; CHECK-NEXT: (if (result i32) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const -2147483647) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$84 -;; CHECK-NEXT: (i32.const -1048575) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (return -;; CHECK-NEXT: (f32.const 4294967296) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$88 -;; CHECK-NEXT: (return -;; CHECK-NEXT: (f32.const 64541) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.convert_i32_u -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$27 -;; CHECK-NEXT: (global.get $global$_2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (i32.load8_s offset=4 -;; CHECK-NEXT: (i32.const -91) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 offset=22 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.gt_u -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (i32.load offset=2 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (if (result i32) -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (return -;; CHECK-NEXT: (f32.const -nan:0x7fffd5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.get $global$_11) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$29 (result f32) -;; CHECK-NEXT: (call $log-f32 -;; CHECK-NEXT: (call $func -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.const 13) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$30 -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (i32.trunc_f64_s -;; CHECK-NEXT: (f64.reinterpret_i64 -;; CHECK-NEXT: (i64.const -2049) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br $label$12) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_invoker -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (drop -;; CHECK-NEXT: (call $func -;; CHECK-NEXT: (i32.const 2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_6 -;; CHECK-NEXT: (local $0 f64) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$0 -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (i32.const 4) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (nop) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_6_invoker -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (call $func_6) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_8 (result i32) -;; CHECK-NEXT: (local $0 i64) -;; CHECK-NEXT: (local $1 f32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local $4 f32) -;; CHECK-NEXT: (local $5 i64) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$0 (result i32) -;; CHECK-NEXT: (local.set $3 -;; CHECK-NEXT: (loop $label$1 (result i64) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block (result i64) -;; CHECK-NEXT: (block $label$2 -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$1 -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (i32.reinterpret_f32 -;; CHECK-NEXT: (f32.const -nan:0x7fc223) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.trunc_f32_u -;; CHECK-NEXT: (global.get $global$_4) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.get $global$_14) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_8_invoker -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (drop -;; CHECK-NEXT: (call $func_8) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_10 (result i64) -;; CHECK-NEXT: (local $0 f64) -;; CHECK-NEXT: (local $1 f64) -;; CHECK-NEXT: (local $2 f64) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$0 (result i64) -;; CHECK-NEXT: (nop) -;; CHECK-NEXT: (nop) -;; CHECK-NEXT: (i64.load32_s offset=22 -;; CHECK-NEXT: (global.get $global$_7) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_10_invoker -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (drop -;; CHECK-NEXT: (call $func_10) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (drop -;; CHECK-NEXT: (call $func_10) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (call $hashMemory) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (drop -;; CHECK-NEXT: (call $func_10) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (drop -;; CHECK-NEXT: (call $func_10) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_12 (result i64) -;; CHECK-NEXT: (local $0 i64) -;; CHECK-NEXT: (local $1 f64) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local $3 f32) -;; CHECK-NEXT: (local $4 i64) -;; CHECK-NEXT: (local $5 i64) -;; CHECK-NEXT: (local $6 i64) -;; CHECK-NEXT: (local $7 i64) -;; CHECK-NEXT: (local $8 i32) -;; CHECK-NEXT: (local $9 i32) -;; CHECK-NEXT: (local $10 f32) -;; CHECK-NEXT: (local $11 i64) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$1 -;; CHECK-NEXT: (drop -;; CHECK-NEXT: (i32.load16_s offset=22 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $9) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (return -;; CHECK-NEXT: (i64.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $func_13 (param $0 i32) (param $1 f32) (param $2 f64) (param $3 f32) (result i32) -;; CHECK-NEXT: (local $4 i32) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$0 (result i32) -;; CHECK-NEXT: (loop $label$1 -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (block $label$2 -;; CHECK-NEXT: (global.set $global$_13 -;; CHECK-NEXT: (f64.load offset=3 -;; CHECK-NEXT: (br_if $label$0 -;; CHECK-NEXT: (i32.load offset=22 align=1 -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=3 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.load offset=22 align=1 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.trunc_f32_s -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $2 -;; CHECK-NEXT: (f64.nearest -;; CHECK-NEXT: (f64.const -3402823466385288598117041e14) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$1 -;; CHECK-NEXT: (i32.le_u -;; CHECK-NEXT: (select -;; CHECK-NEXT: (block $label$32 -;; CHECK-NEXT: (loop $label$33 -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (call $log-i32 -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (br_if $label$33 -;; CHECK-NEXT: (local.tee $0 -;; CHECK-NEXT: (global.get $global$_11) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $global$_13 -;; CHECK-NEXT: (f64.nearest -;; CHECK-NEXT: (f64.const -3402823466385288598117041e14) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (return -;; CHECK-NEXT: (i32.const 2147483646) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load offset=4 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (i64.load32_s offset=4 align=2 -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (call $func_8) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (loop $label$14 -;; CHECK-NEXT: (block -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.eqz -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.const 100) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (unreachable) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (global.set $hangLimit -;; CHECK-NEXT: (i32.sub -;; CHECK-NEXT: (global.get $hangLimit) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (block $label$15 -;; CHECK-NEXT: (local.set $1 -;; CHECK-NEXT: (local.get $1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (return -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $4) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $4) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $2 -;; CHECK-NEXT: (f64.const -nan:0xfffffffffffb2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (return -;; CHECK-NEXT: (i32.const -1217019) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (func $hashMemory (result i32) -;; CHECK-NEXT: (local $0 i32) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.const 5381) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=1 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=2 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=3 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=4 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=5 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=6 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=7 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=8 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=9 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=10 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=11 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=12 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=13 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=14 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.set $0 -;; CHECK-NEXT: (i32.xor -;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: (i32.const 5) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u offset=15 -;; CHECK-NEXT: (i32.const 0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (local.get $0) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 4234964801256893051 -;; CHECK-NEXT: Generated FiniteIntPowersetLattice elements: -;; CHECK-NEXT: 1, -;; CHECK-NEXT: 1, -;; CHECK-NEXT: 0 -;; CHECK-NEXT: for func to test LivenessTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 4577570485573586799 -;; CHECK-NEXT: Generated FinitePowersetLattice<LocalSet*> elements: -;; CHECK-NEXT: , -;; CHECK-NEXT: , -;; CHECK-NEXT: -;; CHECK-NEXT: for func_invoker to test ReachingDefinitionsTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 8191301589003135276 -;; CHECK-NEXT: Generated FinitePowersetLattice<LocalSet*> elements: -;; CHECK-NEXT: 0, -;; CHECK-NEXT: 0, -;; CHECK-NEXT: 1 -;; CHECK-NEXT: for func_6 to test ReachingDefinitionsTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 8068299453651594774 -;; CHECK-NEXT: Generated FinitePowersetLattice<LocalSet*> elements: -;; CHECK-NEXT: , -;; CHECK-NEXT: , -;; CHECK-NEXT: -;; CHECK-NEXT: for func_6_invoker to test ReachingDefinitionsTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 5852178751023674337 -;; CHECK-NEXT: Generated StackLattice<FiniteIntPowersetLattice> elements: -;; CHECK-NEXT: 010010 -;; CHECK-NEXT: 000110 -;; CHECK-NEXT: 000010 -;; CHECK-NEXT: 111100 -;; CHECK-NEXT: 111001 -;; CHECK-NEXT: , -;; CHECK-NEXT: 110111 -;; CHECK-NEXT: 001000 -;; CHECK-NEXT: 100000 -;; CHECK-NEXT: 010010 -;; CHECK-NEXT: 011110 -;; CHECK-NEXT: 101111 -;; CHECK-NEXT: 000001 -;; CHECK-NEXT: 011011 -;; CHECK-NEXT: , -;; CHECK-NEXT: 111011 -;; CHECK-NEXT: 010111 -;; CHECK-NEXT: 111011 -;; CHECK-NEXT: 011001 -;; CHECK-NEXT: 001000 -;; CHECK-NEXT: 001110 -;; CHECK-NEXT: 101001 -;; CHECK-NEXT: 010100 -;; CHECK-NEXT: 111111 -;; CHECK-NEXT: -;; CHECK-NEXT: for func_8 to test LivenessTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 13832862600605363478 -;; CHECK-NEXT: Generated StackLattice<FiniteIntPowersetLattice> elements: -;; CHECK-NEXT: , -;; CHECK-NEXT: , -;; CHECK-NEXT: -;; CHECK-NEXT: for func_8_invoker to test LivenessTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 7970088265179676333 -;; CHECK-NEXT: Generated FiniteIntPowersetLattice elements: -;; CHECK-NEXT: 110, -;; CHECK-NEXT: 001, -;; CHECK-NEXT: 000 -;; CHECK-NEXT: for func_10 to test LivenessTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 14582942952639200251 -;; CHECK-NEXT: Generated FiniteIntPowersetLattice elements: -;; CHECK-NEXT: , -;; CHECK-NEXT: , -;; CHECK-NEXT: -;; CHECK-NEXT: for func_10_invoker to test LivenessTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 16331556144677973625 -;; CHECK-NEXT: Generated StackLattice<FiniteIntPowersetLattice> elements: -;; CHECK-NEXT: 111011111001 -;; CHECK-NEXT: 111101000101 -;; CHECK-NEXT: 010000101000 -;; CHECK-NEXT: 001010000110 -;; CHECK-NEXT: 010100100001 -;; CHECK-NEXT: 111101100101 -;; CHECK-NEXT: 111110001001 -;; CHECK-NEXT: 100110000100 -;; CHECK-NEXT: 000111111001 -;; CHECK-NEXT: , -;; CHECK-NEXT: 111100110101 -;; CHECK-NEXT: 100010111101 -;; CHECK-NEXT: 010100011110 -;; CHECK-NEXT: 000011001000 -;; CHECK-NEXT: 010000100101 -;; CHECK-NEXT: 010010101010 -;; CHECK-NEXT: 110101110000 -;; CHECK-NEXT: 010110000100 -;; CHECK-NEXT: 111101011111 -;; CHECK-NEXT: 010101001111 -;; CHECK-NEXT: 111000110111 -;; CHECK-NEXT: , -;; CHECK-NEXT: 110000010011 -;; CHECK-NEXT: 010000001001 -;; CHECK-NEXT: 001111100000 -;; CHECK-NEXT: 011010110101 -;; CHECK-NEXT: 011110111110 -;; CHECK-NEXT: 001111010001 -;; CHECK-NEXT: 100100001010 -;; CHECK-NEXT: 010010100001 -;; CHECK-NEXT: 010101001000 -;; CHECK-NEXT: 011111011001 -;; CHECK-NEXT: 001111100010 -;; CHECK-NEXT: 100111000001 -;; CHECK-NEXT: 001011010100 -;; CHECK-NEXT: 101001010010 -;; CHECK-NEXT: -;; CHECK-NEXT: for func_12 to test LivenessTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 6783688792201211800 -;; CHECK-NEXT: Generated StackLattice<FiniteIntPowersetLattice> elements: -;; CHECK-NEXT: 00100 -;; CHECK-NEXT: 11100 -;; CHECK-NEXT: 00110 -;; CHECK-NEXT: 10110 -;; CHECK-NEXT: 01001 -;; CHECK-NEXT: 00110 -;; CHECK-NEXT: 10110 -;; CHECK-NEXT: 11100 -;; CHECK-NEXT: 00101 -;; CHECK-NEXT: 01001 -;; CHECK-NEXT: 01000 -;; CHECK-NEXT: 00101 -;; CHECK-NEXT: , -;; CHECK-NEXT: 11010 -;; CHECK-NEXT: 11001 -;; CHECK-NEXT: 00101 -;; CHECK-NEXT: 10010 -;; CHECK-NEXT: 00101 -;; CHECK-NEXT: 00111 -;; CHECK-NEXT: 00000 -;; CHECK-NEXT: 10111 -;; CHECK-NEXT: , -;; CHECK-NEXT: 11010 -;; CHECK-NEXT: 11100 -;; CHECK-NEXT: 10001 -;; CHECK-NEXT: 11011 -;; CHECK-NEXT: 01001 -;; CHECK-NEXT: 11011 -;; CHECK-NEXT: 00101 -;; CHECK-NEXT: -;; CHECK-NEXT: for func_13 to test LivenessTransferFunction. -;; CHECK-NEXT: -;; CHECK-NEXT: Using lattice element seed 15457352654905208821 -;; CHECK-NEXT: Generated FiniteIntPowersetLattice elements: -;; CHECK-NEXT: 1, -;; CHECK-NEXT: 0, -;; CHECK-NEXT: 1 -;; CHECK-NEXT: for hashMemory to test LivenessTransferFunction. -;; CHECK-NEXT: diff --git a/test/passes/fuzz_metrics_noprint.bin.txt b/test/passes/fuzz_metrics_noprint.bin.txt index 3b42464b2..703c2aeb4 100644 --- a/test/passes/fuzz_metrics_noprint.bin.txt +++ b/test/passes/fuzz_metrics_noprint.bin.txt @@ -1,34 +1,34 @@ total - [exports] : 42 - [funcs] : 62 + [exports] : 29 + [funcs] : 39 [globals] : 9 [imports] : 4 [memories] : 1 [memory-data] : 2 - [table-data] : 18 + [table-data] : 6 [tables] : 1 [tags] : 0 - [total] : 8712 - [vars] : 175 - Binary : 633 - Block : 1393 - Break : 282 - Call : 282 - CallIndirect : 77 - Const : 1517 - Drop : 76 - GlobalGet : 675 - GlobalSet : 528 - If : 472 - Load : 157 - LocalGet : 631 - LocalSet : 475 - Loop : 192 - Nop : 155 - RefFunc : 18 - Return : 116 - Select : 91 - Store : 66 - Switch : 6 - Unary : 609 - Unreachable : 261 + [total] : 5494 + [vars] : 119 + Binary : 400 + Block : 892 + Break : 210 + Call : 232 + CallIndirect : 12 + Const : 898 + Drop : 49 + GlobalGet : 421 + GlobalSet : 333 + If : 289 + Load : 113 + LocalGet : 434 + LocalSet : 306 + Loop : 118 + Nop : 85 + RefFunc : 6 + Return : 62 + Select : 52 + Store : 45 + Switch : 1 + Unary : 380 + Unreachable : 156 diff --git a/test/passes/translate-to-fuzz_all-features_metrics_noprint.txt b/test/passes/translate-to-fuzz_all-features_metrics_noprint.txt index 2c4396485..8d88600ed 100644 --- a/test/passes/translate-to-fuzz_all-features_metrics_noprint.txt +++ b/test/passes/translate-to-fuzz_all-features_metrics_noprint.txt @@ -1,47 +1,53 @@ total - [exports] : 7 - [funcs] : 12 + [exports] : 4 + [funcs] : 6 [globals] : 1 [imports] : 5 [memories] : 1 [memory-data] : 20 - [table-data] : 3 + [table-data] : 0 [tables] : 1 [tags] : 2 - [total] : 575 - [vars] : 17 - ArrayLen : 1 - ArrayNew : 4 - ArrayNewFixed : 1 - AtomicCmpxchg : 1 - Binary : 75 - Block : 68 - Break : 6 - Call : 15 + [total] : 630 + [vars] : 23 + ArrayGet : 1 + ArrayLen : 2 + ArrayNew : 8 + ArrayNewFixed : 3 + ArraySet : 1 + AtomicNotify : 1 + Binary : 81 + Block : 66 + Break : 12 + Call : 22 CallRef : 1 - Const : 148 - Drop : 4 - GlobalGet : 28 - GlobalSet : 28 + Const : 132 + Drop : 6 + GlobalGet : 20 + GlobalSet : 20 I31Get : 1 - If : 24 - Load : 20 - LocalGet : 33 - LocalSet : 22 - Loop : 4 - MemoryFill : 2 - Nop : 7 - RefFunc : 6 + If : 23 + Load : 23 + LocalGet : 70 + LocalSet : 41 + Loop : 5 + Nop : 12 + RefAs : 4 + RefCast : 1 + RefEq : 2 + RefFunc : 1 RefI31 : 3 - RefIsNull : 1 - RefNull : 7 - RefTest : 1 + RefNull : 6 Return : 7 SIMDExtract : 1 - Select : 2 - Store : 2 - StructNew : 7 - StructSet : 1 - TupleMake : 3 - Unary : 24 - Unreachable : 17 + SIMDTernary : 1 + Select : 4 + Store : 3 + StructGet : 1 + StructNew : 9 + StructSet : 2 + Try : 2 + TupleExtract : 1 + TupleMake : 2 + Unary : 19 + Unreachable : 10 |